@hzkj/voicenine 1.1.8 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # HANZI VOICENINE
2
2
 
3
- ## VERSION 1.1.8
3
+ ## VERSION 1.2.1
4
4
 
5
5
  ## 引入
6
6
 
package/lib/main.js CHANGED
@@ -1 +1 @@
1
- const e={LOGIN:"LOGIN",LOGOUT:"LOGOUT",READY:"READY",NOT_READY:"NOT_READY",WORK_NOT_READY:"WORK_NOT_READY",AFTER:"AFTER",OUT_CALL:"OUT_CALL",OUT_CALLER_RING:"OUT_CALLER_RING",OUT_CALLED_RING:"OUT_CALLED_RING",PLAY_AGENT_ID:"PLAY_AGENT_ID",TALKING:"TALKING",MUTE_TALKING:"MUTE_TALKING",HOLD_TALKING:"HOLD_TALKING",INNER_CALL_RING:"INNER_CALL_RING",INNER_CALL_TALKING:"INNER_CALL_TALKING",INBOUND_RING:"INBOUND_RING",TRANSFER:"TRANSFER",TRANSFERED_RING:"TRANSFERED_RING",TRANSFER_OUT_RING:"TRANSFER_OUT_RING",TRANSFERED_TALKING:"TRANSFERED_TALKING",CONSULT:"CONSULT",CONSULT_RING:"CONSULT_RING",CONSULT_OUT_RING:"CONSULT_OUT_RING",CONSULT_IVR:"CONSULT_IVR",CONSULT_TALKING:"CONSULT_TALKING",CONSULTED_TALKING:"CONSULTED_TALKING",CONFERENCE_TALKING:"CONFERENCE_TALKING"},t={ready:"READY",busy:"NOT_READY",busy_work:"WORK_NOT_READY",login:"LOGIN",logout:"LOGOUT",call:"MAKE_CALL",hangup:"HANGUP_CALL",answer:"ANSWER",hold:"HOLD",hold_cancel:"HOLD_CANCEL",mute:"MUTE",mute_cancel:"MUTE_CANCEL",transfer:"TRANSFER",transfer_cancel:"TRANSFER_CANCEL",consult:"CONSULT",consult_party:"CONSULT_PARTY",consult_transfer:"CONSULT_TRANSFER",consult_cancel:"CONSULT_CANCEL",consult_stop:"CONSULT_STOP",conference_remove:"CONFERENCE_REMOVE",followdata:"UPDATE_FOLLOWDATA"},n={[e.LOGIN]:"已登录",[e.LOGOUT]:"已退出",[e.READY]:"空闲",[e.NOT_READY]:"忙碌",[e.WORK_NOT_READY]:"自定义忙碌",[e.AFTER]:"话后",[e.OUT_CALL]:"外呼中",[e.OUT_CALLER_RING]:"外呼主叫振铃",[e.OUT_CALLED_RING]:"外呼被叫振铃",[e.PLAY_AGENT_ID]:"播放坐席工号",[e.TALKING]:"通话中",[e.MUTE_TALKING]:"静音中",[e.HOLD_TALKING]:"保持中",[e.INNER_CALL_RING]:"内呼来电振铃",[e.INNER_CALL_TALKING]:"内呼通话中",[e.INBOUND_RING]:"来电振铃",[e.TRANSFER]:"转接中",[e.TRANSFERED_RING]:"转接来电振铃",[e.TRANSFER_OUT_RING]:"转接外呼振铃",[e.TRANSFERED_TALKING]:"转接来电通话中",[e.CONSULT]:"咨询中",[e.CONSULT_RING]:"咨询来电振铃",[e.CONSULT_OUT_RING]:"咨询外呼振铃",[e.CONSULT_IVR]:"咨询IVR",[e.CONSULT_TALKING]:"咨询通话中",[e.CONSULTED_TALKING]:"来电咨询中",[e.CONFERENCE_TALKING]:"多方通话"},r={[e.LOGIN]:[t.call],[e.LOGOUT]:[],[e.READY]:[t.call],[e.NOT_READY]:[t.call],[e.WORK_NOT_READY]:[t.call],[e.AFTER]:[t.call],[e.OUT_CALL]:[t.hangup],[e.OUT_CALLER_RING]:[t.answer,t.hangup],[e.OUT_CALLED_RING]:[t.hangup],[e.PLAY_AGENT_ID]:[t.hangup],[e.TALKING]:[t.hangup,t.hold,t.mute,t.transfer,t.consult],[e.MUTE_TALKING]:[t.mute_cancel],[e.HOLD_TALKING]:[t.hold_cancel],[e.INNER_CALL_RING]:[t.hangup,t.answer],[e.INNER_CALL_TALKING]:[t.hangup,t.mute],[e.INBOUND_RING]:[t.hangup,t.answer],[e.TRANSFER]:[t.transfer_cancel],[e.TRANSFERED_RING]:[t.hangup,t.answer],[e.TRANSFER_OUT_RING]:[t.transfer_cancel],[e.TRANSFERED_TALKING]:[t.hangup,t.mute,t.transfer,t.consult],[e.CONSULT]:[t.consult_cancel],[e.CONSULT_RING]:[t.hangup,t.answer],[e.CONSULT_OUT_RING]:[t.consult_cancel],[e.CONSULT_IVR]:[t.hangup,t.consult_cancel],[e.CONSULT_TALKING]:[t.hangup,t.mute,t.consult_party,t.consult_transfer],[e.CONSULTED_TALKING]:[t.hangup,t.mute],[e.CONFERENCE_TALKING]:[t.hangup,t.mute,t.consult]};!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).adapter=e()}((function(){return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(i)return i(a,!0);throw(c=new Error("Cannot find module '"+a+"'")).code="MODULE_NOT_FOUND",c}c=n[a]={exports:{}},t[a][0].call(c.exports,(function(e){return o(t[a][1][e]||e)}),c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){e=(0,e("./adapter_factory.js").adapterFactory)({window:"undefined"==typeof window?void 0:window}),t.exports=e},{"./adapter_factory.js":2}],2:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.adapterFactory=function(){var e=(0<arguments.length&&void 0!==arguments[0]?arguments[0]:{}).window,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimSafari:!0},n=r.log,d=r.detectBrowser(e),l={browserDetails:d,commonShim:s,extractVersion:r.extractVersion,disableLog:r.disableLog,disableWarnings:r.disableWarnings,sdp:c};switch(d.browser){case"chrome":if(!o||!o.shimPeerConnection||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),l;if(null===d.version)return n("Chrome shim can not determine version, not shimming."),l;n("adapter.js shimming chrome."),l.browserShim=o,s.shimAddIceCandidateNullOrEmpty(e,d),s.shimParameterlessSetLocalDescription(e,d),o.shimGetUserMedia(e,d),o.shimMediaStream(e,d),o.shimPeerConnection(e,d),o.shimOnTrack(e,d),o.shimAddTrackRemoveTrack(e,d),o.shimGetSendersWithDtmf(e,d),o.shimGetStats(e,d),o.shimSenderReceiverGetStats(e,d),o.fixNegotiationNeeded(e,d),s.shimRTCIceCandidate(e,d),s.shimConnectionState(e,d),s.shimMaxMessageSize(e,d),s.shimSendThrowTypeError(e,d),s.removeExtmapAllowMixed(e,d);break;case"firefox":if(!i||!i.shimPeerConnection||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),l;n("adapter.js shimming firefox."),l.browserShim=i,s.shimAddIceCandidateNullOrEmpty(e,d),s.shimParameterlessSetLocalDescription(e,d),i.shimGetUserMedia(e,d),i.shimPeerConnection(e,d),i.shimOnTrack(e,d),i.shimRemoveStream(e,d),i.shimSenderGetStats(e,d),i.shimReceiverGetStats(e,d),i.shimRTCDataChannel(e,d),i.shimAddTransceiver(e,d),i.shimGetParameters(e,d),i.shimCreateOffer(e,d),i.shimCreateAnswer(e,d),s.shimRTCIceCandidate(e,d),s.shimConnectionState(e,d),s.shimMaxMessageSize(e,d),s.shimSendThrowTypeError(e,d);break;case"safari":if(!a||!t.shimSafari)return n("Safari shim is not included in this adapter release."),l;n("adapter.js shimming safari."),l.browserShim=a,s.shimAddIceCandidateNullOrEmpty(e,d),s.shimParameterlessSetLocalDescription(e,d),a.shimRTCIceServerUrls(e,d),a.shimCreateOfferLegacy(e,d),a.shimCallbacksAPI(e,d),a.shimLocalStreamsAPI(e,d),a.shimRemoteStreamsAPI(e,d),a.shimTrackEventTransceiver(e,d),a.shimGetUserMedia(e,d),a.shimAudioContext(e,d),s.shimRTCIceCandidate(e,d),s.shimMaxMessageSize(e,d),s.shimSendThrowTypeError(e,d),s.removeExtmapAllowMixed(e,d);break;default:n("Unsupported browser!")}return l};var r=d(e("./utils")),o=d(e("./chrome/chrome_shim")),i=d(e("./firefox/firefox_shim")),a=d(e("./safari/safari_shim")),s=d(e("./common_shim")),c=d(e("sdp"));function d(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}},{"./chrome/chrome_shim":3,"./common_shim":6,"./firefox/firefox_shim":7,"./safari/safari_shim":10,"./utils":11,sdp:12}],3:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=n.shimGetUserMedia=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=e("./getusermedia");Object.defineProperty(n,"shimGetUserMedia",{enumerable:!0,get:function(){return o.shimGetUserMedia}});var i=e("./getdisplaymedia");Object.defineProperty(n,"shimGetDisplayMedia",{enumerable:!0,get:function(){return i.shimGetDisplayMedia}}),n.shimMediaStream=function(e){e.MediaStream=e.MediaStream||e.webkitMediaStream},n.shimOnTrack=function(e){var t;"object"!==(void 0===e?"undefined":r(e))||!e.RTCPeerConnection||"ontrack"in e.RTCPeerConnection.prototype?a.wrapPeerConnectionEvent(e,"track",(function(e){return e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e})):(Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0}),t=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(){var n=this;return this._ontrackpoly||(this._ontrackpoly=function(t){t.stream.addEventListener("addtrack",(function(r){var o=e.RTCPeerConnection.prototype.getReceivers?n.getReceivers().find((function(e){return e.track&&e.track.id===r.track.id})):{track:r.track},i=new Event("track");i.track=r.track,i.receiver=o,i.transceiver={receiver:o},i.streams=[t.stream],n.dispatchEvent(i)})),t.stream.getTracks().forEach((function(r){var o=e.RTCPeerConnection.prototype.getReceivers?n.getReceivers().find((function(e){return e.track&&e.track.id===r.id})):{track:r},i=new Event("track");i.track=r,i.receiver=o,i.transceiver={receiver:o},i.streams=[t.stream],n.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)})},n.shimGetSendersWithDtmf=function(e){var t,n,o,i,a,s;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype?(t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}},e.RTCPeerConnection.prototype.getSenders||(e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()},n=e.RTCPeerConnection.prototype.addTrack,e.RTCPeerConnection.prototype.addTrack=function(e,r){var o=n.apply(this,arguments);return o||(o=t(this,e),this._senders.push(o)),o},o=e.RTCPeerConnection.prototype.removeTrack,e.RTCPeerConnection.prototype.removeTrack=function(e){o.apply(this,arguments),-1!==(e=this._senders.indexOf(e))&&this._senders.splice(e,1)}),i=e.RTCPeerConnection.prototype.addStream,e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._senders=this._senders||[],i.apply(this,[e]),e.getTracks().forEach((function(e){n._senders.push(t(n,e))}))},a=e.RTCPeerConnection.prototype.removeStream,e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;this._senders=this._senders||[],a.apply(this,[e]),e.getTracks().forEach((function(e){var n=t._senders.find((function(t){return t.track===e}));n&&t._senders.splice(t._senders.indexOf(n),1)}))}):"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)&&(s=e.RTCPeerConnection.prototype.getSenders,e.RTCPeerConnection.prototype.getSenders=function(){var e=this,t=s.apply(this,[]);return t.forEach((function(t){return t._pc=e})),t},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}}))},n.shimGetStats=function(e){var t;e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype.getStats,e.RTCPeerConnection.prototype.getStats=function(){var e=this,n=(o=Array.prototype.slice.call(arguments))[0],r=o[1],o=o[2];if(0<arguments.length&&"function"==typeof n)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof n))return t.apply(this,[]);var i=function(e){var t={};return e.result().forEach((function(e){var n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((function(t){n[t]=e.stat(t)})),t[n.id]=n})),t},a=function(e){return new Map(Object.keys(e).map((function(t){return[t,e[t]]})))};return 2<=arguments.length?t.apply(this,[function(e){r(a(i(e)))},n]):new Promise((function(n,r){t.apply(e,[function(e){n(a(i(e)))},r])})).then(r,o)})},n.shimSenderReceiverGetStats=function(e){var t,n,o,i;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver&&("getStats"in e.RTCRtpSender.prototype||((t=e.RTCPeerConnection.prototype.getSenders)&&(e.RTCPeerConnection.prototype.getSenders=function(){var e=this,n=t.apply(this,[]);return n.forEach((function(t){return t._pc=e})),n}),(n=e.RTCPeerConnection.prototype.addTrack)&&(e.RTCPeerConnection.prototype.addTrack=function(){var e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){var e=this;return this._pc.getStats().then((function(t){return a.filterStats(t,e.track,!0)}))}),"getStats"in e.RTCRtpReceiver.prototype||((o=e.RTCPeerConnection.prototype.getReceivers)&&(e.RTCPeerConnection.prototype.getReceivers=function(){var e=this,t=o.apply(this,[]);return t.forEach((function(t){return t._pc=e})),t}),a.wrapPeerConnectionEvent(e,"track",(function(e){return e.receiver._pc=e.srcElement,e})),e.RTCRtpReceiver.prototype.getStats=function(){var e=this;return this._pc.getStats().then((function(t){return a.filterStats(t,e.track,!1)}))}),"getStats"in e.RTCRtpSender.prototype&&"getStats"in e.RTCRtpReceiver.prototype&&(i=e.RTCPeerConnection.prototype.getStats,e.RTCPeerConnection.prototype.getStats=function(){if(0<arguments.length&&arguments[0]instanceof e.MediaStreamTrack){var t=arguments[0],n=void 0,r=void 0,o=void 0;return this.getSenders().forEach((function(e){e.track===t&&(n?o=!0:n=e)})),this.getReceivers().forEach((function(e){return e.track===t&&(r?o=!0:r=e),e.track===t})),o||n&&r?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):n?n.getStats():r?r.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return i.apply(this,arguments)}))},n.shimAddTrackRemoveTrackWithNative=c,n.shimAddTrackRemoveTrack=function(e,t){if(e.RTCPeerConnection){if(e.RTCPeerConnection.prototype.addTrack&&65<=t.version)return c(e);var n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){var e=this,t=n.apply(this);return this._reverseStreams=this._reverseStreams||{},t.map((function(t){return e._reverseStreams[t.id]}))};var r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){var n,o=this;this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((function(e){if(o.getSenders().find((function(t){return t.track===e})))throw new DOMException("Track already exists.","InvalidAccessError")})),this._reverseStreams[t.id]||(n=new e.MediaStream(t.getTracks()),this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n),r.apply(this,[t])};var o=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},o.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[(this._streams[e.id]||e).id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){var r=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");var o=[].slice.call(arguments,1);if(1!==o.length||!o[0].getTracks().find((function(e){return e===t})))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((function(e){return e.track===t})))throw new DOMException("Track already exists.","InvalidAccessError");return this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},(o=this._streams[n.id])?(o.addTrack(t),Promise.resolve().then((function(){r.dispatchEvent(new Event("negotiationneeded"))}))):(o=new e.MediaStream([t]),this._streams[n.id]=o,this._reverseStreams[o.id]=n,this.addStream(o)),this.getSenders().find((function(e){return e.track===t}))},["createOffer","createAnswer"].forEach((function(t){var n=e.RTCPeerConnection.prototype[t],r=s({},t,(function(){var e=this,t=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[function(n){n=d(e,n),t[0].apply(null,[n])},function(e){t[1]&&t[1].apply(null,e)},arguments[2]]):n.apply(this,arguments).then((function(t){return d(e,t)}))}));e.RTCPeerConnection.prototype[t]=r[t]}));var i=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type&&(arguments[0]=(e=this,n=(t=arguments[0]).sdp,Object.keys(e._reverseStreams||[]).forEach((function(t){var r=e._reverseStreams[t];t=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),t.id)})),new RTCSessionDescription({type:t.type,sdp:n}))),i.apply(this,arguments);var e,t,n};var a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get:function(){var e=a.get.apply(this);return""===e.type?e:d(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){var t=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(e._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};var n=void 0;Object.keys(this._streams).forEach((function(r){t._streams[r].getTracks().find((function(t){return e.track===t}))&&(n=t._streams[r])})),n&&(1===n.getTracks().length?this.removeStream(this._reverseStreams[n.id]):n.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function d(e,t){var n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((function(t){var r=e._reverseStreams[t];t=e._streams[r.id];n=n.replace(new RegExp(t.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}},n.shimPeerConnection=function(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){var n=e.RTCPeerConnection.prototype[t],r=s({},t,(function(){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}));e.RTCPeerConnection.prototype[t]=r[t]}))},n.fixNegotiationNeeded=function(e,t){a.wrapPeerConnectionEvent(e,"negotiationneeded",(function(e){var n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))};var a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils.js"));function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){var e=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((function(t){return e._shimmedLocalStreams[t][0]}))};var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};var r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};var n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){var t=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((function(e){if(t.getSenders().find((function(t){return t.track===e})))throw new DOMException("Track already exists.","InvalidAccessError")}));var r=this.getSenders();n.apply(this,arguments);var o=this.getSenders().filter((function(e){return-1===r.indexOf(e)}));this._shimmedLocalStreams[e.id]=[e].concat(o)};var r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};var o=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){var t=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((function(n){var r=t._shimmedLocalStreams[n].indexOf(e);-1!==r&&t._shimmedLocalStreams[n].splice(r,1),1===t._shimmedLocalStreams[n].length&&delete t._shimmedLocalStreams[n]})),o.apply(this,arguments)}}},{"../utils.js":11,"./getdisplaymedia":4,"./getusermedia":5}],4:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((function(t){var r=n.video&&n.video.width,o=n.video&&n.video.height,i=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:i||3}},r&&(n.video.mandatory.maxWidth=r),o&&(n.video.mandatory.maxHeight=o),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}},{}],5:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimGetUserMedia=function(e,t){var n,i,a,s,c=e&&e.navigator;c.mediaDevices&&(n=function(e){if("object"!==(void 0===e?"undefined":r(e))||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach((function(n){var o,i,a;"require"!==n&&"advanced"!==n&&"mediaSource"!==n&&(void 0!==(o="object"===r(e[n])?e[n]:{ideal:e[n]}).exact&&"number"==typeof o.exact&&(o.min=o.max=o.exact),i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t},void 0!==o.ideal&&(t.optional=t.optional||[],a={},"number"==typeof o.ideal?(a[i("min",n)]=o.ideal,t.optional.push(a),(a={})[i("max",n)]=o.ideal):a[i("",n)]=o.ideal,t.optional.push(a)),void 0!==o.exact&&"number"!=typeof o.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=o.exact):["min","max"].forEach((function(e){void 0!==o[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=o[e])})))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(61<=t.version)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===r(e.audio)&&((s=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])})((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),s(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=n(e.audio)),e&&"object"===r(e.video)){var a=(a=e.video.facingMode)&&("object"===(void 0===a?"undefined":r(a))?a:{ideal:a}),s=t.version<66;if(a&&("user"===a.exact||"environment"===a.exact||"user"===a.ideal||"environment"===a.ideal)&&(!c.mediaDevices.getSupportedConstraints||!c.mediaDevices.getSupportedConstraints().facingMode||s)){delete e.video.facingMode;var d=void 0;if("environment"===a.exact||"environment"===a.ideal?d=["back","rear"]:"user"!==a.exact&&"user"!==a.ideal||(d=["front"]),d)return c.mediaDevices.enumerateDevices().then((function(t){var r=(t=t.filter((function(e){return"videoinput"===e.kind}))).find((function(e){return d.some((function(t){return e.label.toLowerCase().includes(t)}))}));return(r=!r&&t.length&&d.includes("back")?t[t.length-1]:r)&&(e.video.deviceId=a.exact?{exact:r.deviceId}:{ideal:r.deviceId}),e.video=n(e.video),o("chrome: "+JSON.stringify(e)),i(e)}))}e.video=n(e.video)}return o("chrome: "+JSON.stringify(e)),i(e)},a=function(e){return 64<=t.version?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}},c.getUserMedia=function(e,t,n){i(e,(function(e){c.webkitGetUserMedia(e,t,(function(e){n&&n(a(e))}))}))}.bind(c),c.mediaDevices.getUserMedia&&(s=c.mediaDevices.getUserMedia.bind(c.mediaDevices),c.mediaDevices.getUserMedia=function(e){return i(e,(function(e){return s(e).then((function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length)throw t.getTracks().forEach((function(e){e.stop()})),new DOMException("","NotFoundError");return t}),(function(e){return Promise.reject(a(e))}))}))}))};var o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils.js")).log},{"../utils.js":11}],6:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimRTCIceCandidate=function(e){var t;!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype||(t=e.RTCIceCandidate,e.RTCIceCandidate=function(e){if("object"===(void 0===e?"undefined":r(e))&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substr(2)),e.candidate&&e.candidate.length){var n=new t(e),o=i.default.parseCandidate(e.candidate),a=Object.assign(n,o);return a.toJSON=function(){return{candidate:a.candidate,sdpMid:a.sdpMid,sdpMLineIndex:a.sdpMLineIndex,usernameFragment:a.usernameFragment}},a}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,a.wrapPeerConnectionEvent(e,"icecandidate",(function(t){return t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t})))},n.shimMaxMessageSize=function(e,t){var n;e.RTCPeerConnection&&("sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp}}),n=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(){var e,r,o,a;return this._sctp=null,"chrome"===t.browser&&76<=t.version&&"plan-b"===this.getConfiguration().sdpSemantics&&Object.defineProperty(this,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0}),function(e){return!(!e||!e.sdp)&&((e=i.default.splitSections(e.sdp)).shift(),e.some((function(e){return(e=i.default.parseMLine(e))&&"application"===e.kind&&-1!==e.protocol.indexOf("SCTP")})))}(arguments[0])&&(r=function(e){return null===(e=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/))||e.length<2||(e=parseInt(e[1],10))!=e?-1:e}(arguments[0]),o=r,a=65536,a=a="firefox"===t.browser?t.version<57?-1===o?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637:a,r=function(e,n){var r=65536;return"firefox"===t.browser&&57===t.version&&(r=65535),0<(e=i.default.matchPrefix(e.sdp,"a=max-message-size:")).length?r=parseInt(e[0].substr(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],r),void 0,e=0===a&&0===r?Number.POSITIVE_INFINITY:0===a||0===r?Math.max(a,r):Math.min(a,r),r={},Object.defineProperty(r,"maxMessageSize",{get:function(){return e}}),this._sctp=r),n.apply(this,arguments)})},n.shimSendThrowTypeError=function(e){var t;function n(e,t){var n=e.send;e.send=function(){var r=(r=arguments[0]).length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&r>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}e.RTCPeerConnection&&"createDataChannel"in e.RTCPeerConnection.prototype&&(t=e.RTCPeerConnection.prototype.createDataChannel,e.RTCPeerConnection.prototype.createDataChannel=function(){var e=t.apply(this,arguments);return n(e,this),e},a.wrapPeerConnectionEvent(e,"datachannel",(function(e){return n(e.channel,e.target),e})))},n.shimConnectionState=function(e){var t;!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype||(t=e.RTCPeerConnection.prototype,Object.defineProperty(t,"connectionState",{get:function(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get:function(){return this._onconnectionstatechange||null},set:function(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((function(e){var n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=function(e){var t,n=e.target;return n._lastConnectionState!==n.connectionState&&(n._lastConnectionState=n.connectionState,t=new Event("connectionstatechange",e),n.dispatchEvent(t)),e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}})))},n.removeExtmapAllowMixed=function(e,t){var n;e.RTCPeerConnection&&("chrome"===t.browser&&71<=t.version||"safari"===t.browser&&605<=t.version||(n=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(t){var r;return t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")&&(r=t.sdp.split("\n").filter((function(e){return"a=extmap-allow-mixed"!==e.trim()})).join("\n"),e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:r}):t.sdp=r),n.apply(this,arguments)}))},n.shimAddIceCandidateNullOrEmpty=function(e,t){var n;e.RTCPeerConnection&&e.RTCPeerConnection.prototype&&(n=e.RTCPeerConnection.prototype.addIceCandidate)&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})},n.shimParameterlessSetLocalDescription=function(e,t){var n;e.RTCPeerConnection&&e.RTCPeerConnection.prototype&&(n=e.RTCPeerConnection.prototype.setLocalDescription)&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){var e=this,t=arguments[0]||{};if("object"!==(void 0===t?"undefined":r(t))||t.type&&t.sdp)return n.apply(this,arguments);if(!(t={type:t.type,sdp:t.sdp}).type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":t.type="offer";break;default:t.type="answer"}return t.sdp||"offer"!==t.type&&"answer"!==t.type?n.apply(this,[t]):("offer"===t.type?this.createOffer:this.createAnswer).apply(this).then((function(t){return n.apply(e,[t])}))})};var o,i=(o=e("sdp"))&&o.__esModule?o:{default:o},a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("./utils"))},{"./utils":11,sdp:12}],7:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=n.shimGetUserMedia=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=e("./getusermedia");Object.defineProperty(n,"shimGetUserMedia",{enumerable:!0,get:function(){return o.shimGetUserMedia}});var i=e("./getdisplaymedia");Object.defineProperty(n,"shimGetDisplayMedia",{enumerable:!0,get:function(){return i.shimGetDisplayMedia}}),n.shimOnTrack=function(e){"object"===(void 0===e?"undefined":r(e))&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},n.shimPeerConnection=function(e,t){var n,o;"object"===(void 0===e?"undefined":r(e))&&(e.RTCPeerConnection||e.mozRTCPeerConnection)&&(!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){var n=e.RTCPeerConnection.prototype[t],r=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},t,(function(){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}));e.RTCPeerConnection.prototype[t]=r[t]})),n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},o=e.RTCPeerConnection.prototype.getStats,e.RTCPeerConnection.prototype.getStats=function(){var e=(i=Array.prototype.slice.call(arguments))[0],r=i[1],i=i[2];return o.apply(this,[e||null]).then((function(e){if(t.version<53&&!r)try{e.forEach((function(e){e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach((function(t,r){e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(r,i)})},n.shimSenderGetStats=function(e){var t,n;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&e.RTCRtpSender&&(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype||((t=e.RTCPeerConnection.prototype.getSenders)&&(e.RTCPeerConnection.prototype.getSenders=function(){var e=this,n=t.apply(this,[]);return n.forEach((function(t){return t._pc=e})),n}),(n=e.RTCPeerConnection.prototype.addTrack)&&(e.RTCPeerConnection.prototype.addTrack=function(){var e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}))},n.shimReceiverGetStats=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&e.RTCRtpSender&&(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype||((t=e.RTCPeerConnection.prototype.getReceivers)&&(e.RTCPeerConnection.prototype.getReceivers=function(){var e=this,n=t.apply(this,[]);return n.forEach((function(t){return t._pc=e})),n}),a.wrapPeerConnectionEvent(e,"track",(function(e){return e.receiver._pc=e.srcElement,e})),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}))},n.shimRemoveStream=function(e){!e.RTCPeerConnection||"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;a.deprecated("removeStream","removeTrack"),this.getSenders().forEach((function(n){n.track&&e.getTracks().includes(n.track)&&t.removeTrack(n)}))})},n.shimRTCDataChannel=function(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)},n.shimAddTransceiver=function(e){var t;"object"!==(void 0===e?"undefined":r(e))||!e.RTCPeerConnection||(t=e.RTCPeerConnection.prototype.addTransceiver)&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];var e=arguments[1],n=e&&"sendEncodings"in e;n&&e.sendEncodings.forEach((function(e){if("rid"in e&&!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in e&&!(1<=parseFloat(e.scaleResolutionDownBy)))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(0<=parseFloat(e.maxFramerate)))throw new RangeError("max_framerate must be >= 0.0")}));var r,o=t.apply(this,arguments);return n&&("encodings"in(n=(r=o.sender).getParameters())&&(1!==n.encodings.length||0!==Object.keys(n.encodings[0]).length)||(n.encodings=e.sendEncodings,r.sendEncodings=e.sendEncodings,this.setParametersPromises.push(r.setParameters(n).then((function(){delete r.sendEncodings})).catch((function(){delete r.sendEncodings}))))),o})},n.shimGetParameters=function(e){var t;"object"!==(void 0===e?"undefined":r(e))||!e.RTCRtpSender||(t=e.RTCRtpSender.prototype.getParameters)&&(e.RTCRtpSender.prototype.getParameters=function(){var e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})},n.shimCreateOffer=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype.createOffer,e.RTCPeerConnection.prototype.createOffer=function(){var e=this,n=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return t.apply(e,n)})).finally((function(){e.setParametersPromises=[]})):t.apply(this,arguments)})},n.shimCreateAnswer=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype.createAnswer,e.RTCPeerConnection.prototype.createAnswer=function(){var e=this,n=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return t.apply(e,n)})).finally((function(){e.setParametersPromises=[]})):t.apply(this,arguments)})};var a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils"))},{"../utils":11,"./getdisplaymedia":8,"./getusermedia":9}],8:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){return n&&n.video?(!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)):((n=new DOMException("getDisplayMedia without video constraints is undefined")).name="NotFoundError",n.code=8,Promise.reject(n))})}},{}],9:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimGetUserMedia=function(e,t){var n,i,a,s,c=e&&e.navigator;e=e&&e.MediaStreamTrack;c.getUserMedia=function(e,t,n){o.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),c.mediaDevices.getUserMedia(e).then(t,n)},55<t.version&&"autoGainControl"in c.mediaDevices.getSupportedConstraints()||(n=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},i=c.mediaDevices.getUserMedia.bind(c.mediaDevices),c.mediaDevices.getUserMedia=function(e){return"object"===(void 0===e?"undefined":r(e))&&"object"===r(e.audio)&&(e=JSON.parse(JSON.stringify(e)),n(e.audio,"autoGainControl","mozAutoGainControl"),n(e.audio,"noiseSuppression","mozNoiseSuppression")),i(e)},e&&e.prototype.getSettings&&(a=e.prototype.getSettings,e.prototype.getSettings=function(){var e=a.apply(this,arguments);return n(e,"mozAutoGainControl","autoGainControl"),n(e,"mozNoiseSuppression","noiseSuppression"),e}),e&&e.prototype.applyConstraints&&(s=e.prototype.applyConstraints,e.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===(void 0===e?"undefined":r(e))&&(e=JSON.parse(JSON.stringify(e)),n(e,"autoGainControl","mozAutoGainControl"),n(e,"noiseSuppression","mozNoiseSuppression")),s.apply(this,[e])}))};var o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils"))},{"../utils":11}],10:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimLocalStreamsAPI=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),"addStream"in e.RTCPeerConnection.prototype||(t=e.RTCPeerConnection.prototype.addTrack,e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((function(r){return t.call(n,r,e)})),e.getVideoTracks().forEach((function(r){return t.call(n,r,e)}))},e.RTCPeerConnection.prototype.addTrack=function(e){for(var n=this,r=arguments.length,o=Array(1<r?r-1:0),i=1;i<r;i++)o[i-1]=arguments[i];return o&&o.forEach((function(e){n._localStreams?n._localStreams.includes(e)||n._localStreams.push(e):n._localStreams=[e]})),t.apply(this,arguments)}),"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;this._localStreams||(this._localStreams=[]);var n,r=this._localStreams.indexOf(e);-1!==r&&(this._localStreams.splice(r,1),n=e.getTracks(),this.getSenders().forEach((function(e){n.includes(e.track)&&t.removeTrack(e)})))}))},n.shimRemoteStreamsAPI=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams||[]}),"onaddstream"in e.RTCPeerConnection.prototype||(Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(e){var t=this;this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach((function(e){var n;t._remoteStreams||(t._remoteStreams=[]),t._remoteStreams.includes(e)||(t._remoteStreams.push(e),(n=new Event("addstream")).stream=e,t.dispatchEvent(n))}))})}}),t=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(){var e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((function(t){var n;e._remoteStreams||(e._remoteStreams=[]),0<=e._remoteStreams.indexOf(t)||(e._remoteStreams.push(t),(n=new Event("addstream")).stream=t,e.dispatchEvent(n))}))}),t.apply(e,arguments)}))},n.shimCallbacksAPI=function(e){var t,n,o,i,a,s;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype,n=t.createOffer,o=t.createAnswer,i=t.setLocalDescription,a=t.setRemoteDescription,s=t.addIceCandidate,t.createOffer=function(e,t){var r=n.apply(this,[2<=arguments.length?arguments[2]:e]);return t?(r.then(e,t),Promise.resolve()):r},t.createAnswer=function(e,t){var n=o.apply(this,[2<=arguments.length?arguments[2]:e]);return t?(n.then(e,t),Promise.resolve()):n},e=function(e,t,n){return e=i.apply(this,[e]),n?(e.then(t,n),Promise.resolve()):e},t.setLocalDescription=e,e=function(e,t,n){return e=a.apply(this,[e]),n?(e.then(t,n),Promise.resolve()):e},t.setRemoteDescription=e,e=function(e,t,n){return e=s.apply(this,[e]),n?(e.then(t,n),Promise.resolve()):e},t.addIceCandidate=e)},n.shimGetUserMedia=function(e){var t,n=e&&e.navigator;n.mediaDevices&&n.mediaDevices.getUserMedia&&(e=n.mediaDevices,t=e.getUserMedia.bind(e),n.mediaDevices.getUserMedia=function(e){return t(i(e))}),!n.getUserMedia&&n.mediaDevices&&n.mediaDevices.getUserMedia&&(n.getUserMedia=function(e,t,r){n.mediaDevices.getUserMedia(e).then(t,r)}.bind(n))},n.shimConstraints=i,n.shimRTCIceServerUrls=function(e){var t;e.RTCPeerConnection&&(t=e.RTCPeerConnection,e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){for(var r=[],i=0;i<e.iceServers.length;i++){var a=e.iceServers[i];!a.hasOwnProperty("urls")&&a.hasOwnProperty("url")?(o.deprecated("RTCIceServer.url","RTCIceServer.urls"),(a=JSON.parse(JSON.stringify(a))).urls=a.url,delete a.url,r.push(a)):r.push(e.iceServers[i])}e.iceServers=r}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:function(){return t.generateCertificate}}))},n.shimTrackEventTransceiver=function(e){"object"===(void 0===e?"undefined":r(e))&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},n.shimCreateOfferLegacy=function(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){var n;return e&&(void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio),n=this.getTransceivers().find((function(e){return"audio"===e.receiver.track.kind})),!1===e.offerToReceiveAudio&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveAudio||n||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo),n=this.getTransceivers().find((function(e){return"video"===e.receiver.track.kind})),!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})),t.apply(this,arguments)}},n.shimAudioContext=function(e){"object"!==(void 0===e?"undefined":r(e))||e.AudioContext||(e.AudioContext=e.webkitAudioContext)};var o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils"));function i(e){return e&&void 0!==e.video?Object.assign({},e,{video:o.compactObject(e.video)}):e}},{"../utils":11}],11:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.extractVersion=a,n.wrapPeerConnectionEvent=function(e,t,n){var r,o;e.RTCPeerConnection&&(e=e.RTCPeerConnection.prototype,r=e.addEventListener,e.addEventListener=function(e,o){if(e!==t)return r.apply(this,arguments);function i(e){(e=n(e))&&(o.handleEvent?o.handleEvent(e):o(e))}return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(o,i),r.apply(this,[e,i])},o=e.removeEventListener,e.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);var r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(e,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0}))},n.disableLog=function(e){return"boolean"==typeof e?(o=e)?"adapter.js logging disabled":"adapter.js logging enabled":new Error("Argument type: "+(void 0===e?"undefined":r(e))+". Please use a boolean.")},n.disableWarnings=function(e){return"boolean"==typeof e?(i=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled")):new Error("Argument type: "+(void 0===e?"undefined":r(e))+". Please use a boolean.")},n.log=function(){"object"===("undefined"==typeof window?"undefined":r(window))&&(o||"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments))},n.deprecated=function(e,t){i&&console.warn(e+" is deprecated, please use "+t+" instead.")},n.detectBrowser=function(e){var t={browser:null,version:null};if(void 0===e||!e.navigator)return t.browser="Not a browser.",t;var n=e.navigator;if(n.mozGetUserMedia)t.browser="firefox",t.version=a(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection&&!e.RTCIceGatherer)t.browser="chrome",t.version=a(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=a(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t},n.compactObject=function e(t){return s(t)?Object.keys(t).reduce((function(n,r){var o=(i=s(t[r]))?e(t[r]):t[r],i=i&&!Object.keys(o).length;return void 0===o||i?n:Object.assign(n,function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},r,o))}),{}):t},n.walkStats=c,n.filterStats=function(e,t,n){var r=n?"outbound-rtp":"inbound-rtp",o=new Map;if(null===t)return o;var i=[];return e.forEach((function(e){"track"===e.type&&e.trackIdentifier===t.id&&i.push(e)})),i.forEach((function(t){e.forEach((function(n){n.type===r&&n.trackId===t.id&&c(e,n,o)}))})),o};var o=!0,i=!0;function a(e,t,n){return(t=e.match(t))&&t.length>=n&&parseInt(t[n],10)}function s(e){return"[object Object]"===Object.prototype.toString.call(e)}function c(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((function(r){r.endsWith("Id")?c(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((function(t){c(e,e.get(t),n)}))})))}},{}],12:[function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o={generateIdentifier:function(){return Math.random().toString(36).substr(2,10)}};o.localCName=o.generateIdentifier(),o.splitLines=function(e){return e.trim().split("\n").map((function(e){return e.trim()}))},o.splitSections=function(e){return e.split("\nm=").map((function(e,t){return(0<t?"m="+e:e).trim()+"\r\n"}))},o.getDescription=function(e){return(e=o.splitSections(e))&&e[0]},o.getMediaSections=function(e){return(e=o.splitSections(e)).shift(),e},o.matchPrefix=function(e,t){return o.splitLines(e).filter((function(e){return 0===e.indexOf(t)}))},o.parseCandidate=function(e){for(var t=void 0,n={foundation:(t=(0===e.indexOf("a=candidate:")?e.substring(12):e.substring(10)).split(" "))[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]},r=8;r<t.length;r+=2)switch(t[r]){case"raddr":n.relatedAddress=t[r+1];break;case"rport":n.relatedPort=parseInt(t[r+1],10);break;case"tcptype":n.tcpType=t[r+1];break;case"ufrag":n.ufrag=t[r+1],n.usernameFragment=t[r+1];break;default:void 0===n[t[r]]&&(n[t[r]]=t[r+1])}return n},o.writeCandidate=function(e){var t=[];t.push(e.foundation);var n=e.component;return"rtp"===n?t.push(1):"rtcp"===n?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port),n=e.type,t.push("typ"),t.push(n),"host"!==n&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},o.parseIceOptions=function(e){return e.substr(14).split(" ")},o.parseRtpMap=function(e){var t=e.substr(9).split(" ");e={payloadType:parseInt(t.shift(),10)},t=t[0].split("/");return e.name=t[0],e.clockRate=parseInt(t[1],10),e.channels=3===t.length?parseInt(t[2],10):1,e.numChannels=e.channels,e},o.writeRtpMap=function(e){var t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);var n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==n?"/"+n:"")+"\r\n"},o.parseExtmap=function(e){return e=e.substr(9).split(" "),{id:parseInt(e[0],10),direction:0<e[0].indexOf("/")?e[0].split("/")[1]:"sendrecv",uri:e[1]}},o.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+"\r\n"},o.parseFmtp=function(e){for(var t={},n=void 0,r=e.substr(e.indexOf(" ")+1).split(";"),o=0;o<r.length;o++)t[(n=r[o].trim().split("="))[0].trim()]=n[1];return t},o.writeFmtp=function(e){var t,n="",r=e.payloadType;return void 0!==e.preferredPayloadType&&(r=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length&&(t=[],Object.keys(e.parameters).forEach((function(n){void 0!==e.parameters[n]?t.push(n+"="+e.parameters[n]):t.push(n)})),n+="a=fmtp:"+r+" "+t.join(";")+"\r\n"),n},o.parseRtcpFb=function(e){return{type:(e=e.substr(e.indexOf(" ")+1).split(" ")).shift(),parameter:e.join(" ")}},o.writeRtcpFb=function(e){var t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((function(e){t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},o.parseSsrcMedia=function(e){var t=e.indexOf(" "),n={ssrc:parseInt(e.substr(7,t-7),10)},r=e.indexOf(":",t);return-1<r?(n.attribute=e.substr(t+1,r-t-1),n.value=e.substr(r+1)):n.attribute=e.substr(t+1),n},o.parseSsrcGroup=function(e){return{semantics:(e=e.substr(13).split(" ")).shift(),ssrcs:e.map((function(e){return parseInt(e,10)}))}},o.getMid=function(e){if(e=o.matchPrefix(e,"a=mid:")[0])return e.substr(6)},o.parseFingerprint=function(e){return{algorithm:(e=e.substr(14).split(" "))[0].toLowerCase(),value:e[1].toUpperCase()}},o.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:o.matchPrefix(e+t,"a=fingerprint:").map(o.parseFingerprint)}},o.writeDtlsParameters=function(e,t){var n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((function(e){n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},o.parseCryptoLine=function(e){return e=e.substr(9).split(" "),{tag:parseInt(e[0],10),cryptoSuite:e[1],keyParams:e[2],sessionParams:e.slice(3)}},o.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"===r(e.keyParams)?o.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},o.parseCryptoKeyParams=function(e){return 0!==e.indexOf("inline:")?null:{keyMethod:"inline",keySalt:(e=e.substr(7).split("|"))[0],lifeTime:e[1],mkiValue:e[2]?e[2].split(":")[0]:void 0,mkiLength:e[2]?e[2].split(":")[1]:void 0}},o.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},o.getCryptoParameters=function(e,t){return o.matchPrefix(e+t,"a=crypto:").map(o.parseCryptoLine)},o.getIceParameters=function(e,t){var n=o.matchPrefix(e+t,"a=ice-ufrag:")[0];t=o.matchPrefix(e+t,"a=ice-pwd:")[0];return n&&t?{usernameFragment:n.substr(12),password:t.substr(10)}:null},o.writeIceParameters=function(e){var t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},o.parseRtpParameters=function(e){for(var t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},n=o.splitLines(e)[0].split(" "),r=3;r<n.length;r++){var i=n[r];if(s=o.matchPrefix(e,"a=rtpmap:"+i+" ")[0]){var a=o.parseRtpMap(s),s=o.matchPrefix(e,"a=fmtp:"+i+" ");switch(a.parameters=s.length?o.parseFmtp(s[0]):{},a.rtcpFeedback=o.matchPrefix(e,"a=rtcp-fb:"+i+" ").map(o.parseRtcpFb),t.codecs.push(a),a.name.toUpperCase()){case"RED":case"ULPFEC":t.fecMechanisms.push(a.name.toUpperCase())}}}return o.matchPrefix(e,"a=extmap:").forEach((function(e){t.headerExtensions.push(o.parseExtmap(e))})),t},o.writeRtpDescription=function(e,t){var n="";n+="m="+e+" ",n+=0<t.codecs.length?"9":"0",n+=" UDP/TLS/RTP/SAVPF ",n+=t.codecs.map((function(e){return void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType})).join(" ")+"\r\n",n+="c=IN IP4 0.0.0.0\r\n",n+="a=rtcp:9 IN IP4 0.0.0.0\r\n",t.codecs.forEach((function(e){n+=o.writeRtpMap(e),n+=o.writeFmtp(e),n+=o.writeRtcpFb(e)}));var r=0;return t.codecs.forEach((function(e){e.maxptime>r&&(r=e.maxptime)})),0<r&&(n+="a=maxptime:"+r+"\r\n"),t.headerExtensions&&t.headerExtensions.forEach((function(e){n+=o.writeExtmap(e)})),n},o.parseRtpEncodingParameters=function(e){var t=[],n=o.parseRtpParameters(e),r=-1!==n.fecMechanisms.indexOf("RED"),i=-1!==n.fecMechanisms.indexOf("ULPFEC"),a=0<(c=o.matchPrefix(e,"a=ssrc:").map((function(e){return o.parseSsrcMedia(e)})).filter((function(e){return"cname"===e.attribute}))).length&&c[0].ssrc,s=void 0,c=o.matchPrefix(e,"a=ssrc-group:FID").map((function(e){return e.substr(17).split(" ").map((function(e){return parseInt(e,10)}))}));0<c.length&&1<c[0].length&&c[0][0]===a&&(s=c[0][1]),n.codecs.forEach((function(e){"RTX"===e.name.toUpperCase()&&e.parameters.apt&&(e={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)},a&&s&&(e.rtx={ssrc:s}),t.push(e),r&&((e=JSON.parse(JSON.stringify(e))).fec={ssrc:a,mechanism:i?"red+ulpfec":"red"},t.push(e)))})),0===t.length&&a&&t.push({ssrc:a});var d=o.matchPrefix(e,"b=");return d.length&&(d=0===d[0].indexOf("b=TIAS:")?parseInt(d[0].substr(7),10):0===d[0].indexOf("b=AS:")?1e3*parseInt(d[0].substr(5),10)*.95-16e3:void 0,t.forEach((function(e){e.maxBitrate=d}))),t},o.parseRtcpParameters=function(e){var t={},n=o.matchPrefix(e,"a=ssrc:").map((function(e){return o.parseSsrcMedia(e)})).filter((function(e){return"cname"===e.attribute}))[0];return n&&(t.cname=n.value,t.ssrc=n.ssrc),n=o.matchPrefix(e,"a=rtcp-rsize"),t.reducedSize=0<n.length,t.compound=0===n.length,e=o.matchPrefix(e,"a=rtcp-mux"),t.mux=0<e.length,t},o.writeRtcpParameters=function(e){var t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},o.parseMsid=function(e){var t=void 0,n=o.matchPrefix(e,"a=msid:");return 1===n.length?{stream:(t=n[0].substr(7).split(" "))[0],track:t[1]}:0<(e=o.matchPrefix(e,"a=ssrc:").map((function(e){return o.parseSsrcMedia(e)})).filter((function(e){return"msid"===e.attribute}))).length?{stream:(t=e[0].value.split(" "))[0],track:t[1]}:void 0},o.parseSctpDescription=function(e){var t=o.parseMLine(e),n=o.matchPrefix(e,"a=max-message-size:"),r=void 0;return 0<n.length&&(r=parseInt(n[0].substr(19),10)),isNaN(r)&&(r=65536),0<(n=o.matchPrefix(e,"a=sctp-port:")).length?{port:parseInt(n[0].substr(12),10),protocol:t.fmt,maxMessageSize:r}:0<(e=o.matchPrefix(e,"a=sctpmap:")).length?(e=e[0].substr(10).split(" "),{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:r}):void 0},o.writeSctpDescription=function(e,t){var n=[];n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"];return void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},o.generateSessionId=function(){return Math.random().toString().substr(2,21)},o.writeSessionBoilerplate=function(e,t,n){return t=void 0!==t?t:2,"v=0\r\no="+(n||"thisisadapterortc")+" "+(e||o.generateSessionId())+" "+t+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},o.getDirection=function(e,t){for(var n=o.splitLines(e),r=0;r<n.length;r++)switch(n[r]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return n[r].substr(2)}return t?o.getDirection(t):"sendrecv"},o.getKind=function(e){return o.splitLines(e)[0].split(" ")[0].substr(2)},o.isRejected=function(e){return"0"===e.split(" ",2)[1]},o.parseMLine=function(e){return{kind:(e=o.splitLines(e)[0].substr(2).split(" "))[0],port:parseInt(e[1],10),protocol:e[2],fmt:e.slice(3).join(" ")}},o.parseOLine=function(e){return{username:(e=o.matchPrefix(e,"o=")[0].substr(2).split(" "))[0],sessionId:e[1],sessionVersion:parseInt(e[2],10),netType:e[3],addressType:e[4],address:e[5]}},o.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;for(var t=o.splitLines(e),n=0;n<t.length;n++)if(t[n].length<2||"="!==t[n].charAt(1))return!1;return!0},"object"===(void 0===t?"undefined":r(t))&&(t.exports=o)},{}]},{},[1])(1)})),i.sessions={},i.isExtensionEnabled=function(){if(navigator.mediaDevices&&navigator.mediaDevices.getDisplayMedia)return!0;if(window.navigator.userAgent.match("Chrome")){let e=parseInt(window.navigator.userAgent.match(/Chrome\/(.*) /)[1],10),t=33;return window.navigator.userAgent.match("Linux")&&(t=35),e>=26&&e<=t||i.extension.isInstalled()}return!0};var o={extensionId:"hapfgfdkleiggjjpfpenajgdnfckjpaj",isInstalled:function(){return null!==document.querySelector("#janus-extension-installed")},getScreen:function(e){let t=window.setTimeout((function(){let t=new Error("NavigatorUserMediaError");return t.name='The required Chrome extension is not installed: click <a href="#">here</a> to install it. (NOTE: this will need you to refresh the page)',e(t)}),1e3);this.cache[t]=e,window.postMessage({type:"janusGetScreen",id:t},"*")},init:function(){let e={};this.cache=e,window.addEventListener("message",(function(t){if(t.origin==window.location.origin)if("janusGotScreen"==t.data.type&&e[t.data.id]){let n=e[t.data.id];if(delete e[t.data.id],""===t.data.sourceId){let e=new Error("NavigatorUserMediaError");e.name="You cancelled the request for permission, giving up...",n(e)}else n(null,t.data.sourceId)}else"janusGetScreenPending"==t.data.type&&(console.log("clearing ",t.data.id),window.clearTimeout(t.data.id))}))}};function i(e){if((e=e||{}).success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,e.destroyed="function"==typeof e.destroyed?e.destroyed:i.noop,!i.initDone)return e.error("Library not initialized"),{};if(!i.isWebrtcSupported())return e.error("WebRTC not supported by this browser"),{};if(i.log("Library initialized: "+i.initDone),!e.server)return e.error("Invalid server url"),{};let t=!1,n=null,r={},o=null,a=null,s=0,c=e.server;i.isArray(c)?(i.log("Multiple servers provided ("+c.length+"), will use the first that works"),c=null,a=e.server,i.debug(a)):0===c.indexOf("ws")?(t=!0,i.log("Using WebSockets to contact Janus: "+c)):(t=!1,i.log("Using REST API to contact Janus: "+c));let d=e.iceServers||[{urls:"stun:stun.l.google.com:19302"}],l=e.iceTransportPolicy,u=e.bundlePolicy,p=!1;void 0!==e.withCredentials&&null!==e.withCredentials&&(p=!0===e.withCredentials);let f=10;void 0!==e.max_poll_events&&null!==e.max_poll_events&&(f=e.max_poll_events),f<1&&(f=1);let m=null;void 0!==e.token&&null!==e.token&&(m=e.token);let h=null;void 0!==e.apisecret&&null!==e.apisecret&&(h=e.apisecret),this.destroyOnUnload=!0,void 0!==e.destroyOnUnload&&null!==e.destroyOnUnload&&(this.destroyOnUnload=!0===e.destroyOnUnload);let g=1e4;void 0!==e.keepAlivePeriod&&null!==e.keepAlivePeriod&&(g=e.keepAlivePeriod),isNaN(g)&&(g=1e4);let v=6e4;function y(e){let t={high:9e5,medium:3e5,low:1e5};return null!=e&&(e.high&&(t.high=e.high),e.medium&&(t.medium=e.medium),e.low&&(t.low=e.low)),t}void 0!==e.longPollTimeout&&null!==e.longPollTimeout&&(v=e.longPollTimeout),isNaN(v)&&(v=6e4);let b=!1,C=null,S={},T=this,w=0,R={};function k(){if(null==C)return;if(i.debug("Long poll..."),!b)return void i.warn("Is the server down? (connected=false)");let t=c+"/"+C+"?rid="+(new Date).getTime();f&&(t=t+"&maxev="+f),m&&(t=t+"&token="+encodeURIComponent(m)),h&&(t=t+"&apisecret="+encodeURIComponent(h)),i.httpAPICall(t,{verb:"GET",withCredentials:p,success:P,timeout:v,error:function(t,n){if(i.error(t+":",n),w++,w>3)return b=!1,void e.error("Lost connection to the server (is it down?)");k()}})}function P(e,r){if(w=0,t||null==C||!0===r||k(),t||!i.isArray(e))if("keepalive"!==e.janus)if("server_info"!==e.janus)if("ack"!==e.janus)if("success"!==e.janus)if("trickle"===e.janus){const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");let r=e.candidate;i.debug("Got a trickled candidate on session "+C),i.debug(r);let o=n.webrtcStuff;o.pc&&o.remoteSdp?(i.debug("Adding remote candidate:",r),r&&!0!==r.completed?o.pc.addIceCandidate(r):o.pc.addIceCandidate(i.endOfCandidates)):(i.debug("We didn't do setRemoteDescription (trickle got here before the offer?), caching candidate"),o.candidates||(o.candidates=[]),o.candidates.push(r),i.debug(o.candidates))}else{if("webrtcup"===e.janus){i.debug("Got a webrtcup event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];return n?void n.webrtcState(!0):void i.debug("This handle is not attached to this session")}if("hangup"===e.janus){i.debug("Got a hangup event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");n.webrtcState(!1,e.reason),n.hangup()}else if("detached"===e.janus){i.debug("Got a detached event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return;n.ondetached(),n.detach()}else if("media"===e.janus){i.debug("Got a media event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");n.mediaState(e.type,e.receiving,e.mid)}else if("slowlink"===e.janus){i.debug("Got a slowlink event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");n.slowLink(e.uplink,e.lost,e.mid)}else{if("error"===e.janus){i.error("Ooops: "+e.error.code+" "+e.error.reason),i.debug(e);let t=e.transaction;if(t){let n=R[t];n&&n(e),delete R[t]}return}if("event"===e.janus){i.debug("Got a plugin event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");let n=e.plugindata;if(!n)return void i.warn("Missing plugindata...");i.debug(" -- Event is coming from "+t+" ("+n.plugin+")");let r=n.data;i.debug(r);const o=S[t];if(!o)return void i.warn("This handle is not attached to this session");let a=e.jsep;a&&(i.debug("Handling SDP as well..."),i.debug(a));let s=o.onmessage;s?(i.debug("Notifying application..."),s(r,a)):i.debug("No provided notification callback")}else{if("timeout"===e.janus){i.error("Timeout on session "+C),i.debug(e),t&&n.close(3504,"Gateway timeout");const r=e.sender;if(!r)return void i.warn("Missing sender...");return void S[r].webrtcTimeout(e)}i.warn("Unknown message/event '"+e.janus+"' on session "+C),i.debug(e)}}}else{i.debug("Got a success on session "+C),i.debug(e);const t=e.transaction;if(t){const n=R[t];n&&n(e),delete R[t]}}else{i.debug("Got an ack on session "+C),i.debug(e);const t=e.transaction;if(t){const n=R[t];n&&n(e),delete R[t]}}else{i.debug("Got info on the Janus instance"),i.debug(e);const t=e.transaction;if(t){const n=R[t];n&&n(e),delete R[t]}}else i.vdebug("Got a keepalive on session "+C);else for(let t=0;t<e.length;t++)P(e[t],!0)}function _(){if(!c||!t||!b)return;o=setTimeout(_,g);let e={janus:"keepalive",session_id:C,transaction:i.randomString(12)};m&&(e.token=m),h&&(e.apisecret=h),n.send(JSON.stringify(e))}function I(d){let l=i.randomString(12),u={janus:"create",transaction:l};if(d.reconnect&&(b=!1,u.janus="claim",u.session_id=C,n&&(n.onopen=null,n.onerror=null,n.onclose=null,o&&(clearTimeout(o),o=null))),m&&(u.token=m),h&&(u.apisecret=h),!c&&i.isArray(a)&&(c=a[s],0===c.indexOf("ws")?(t=!0,i.log("Server #"+(s+1)+": trying WebSockets to contact Janus ("+c+")")):(t=!1,i.log("Server #"+(s+1)+": trying REST API to contact Janus ("+c+")"))),t){n=i.newWebSocket(c,"janus-protocol"),r={error:function(){if(i.error("Error connecting to the Janus WebSockets server... "+c),i.isArray(a)&&!d.reconnect)return s++,s===a.length?void d.error("Error connecting to any of the provided Janus servers: Is the server down?"):(c=null,void setTimeout((function(){I(d)}),200));d.error("Error connecting to the Janus WebSockets server: Is the server down?")},open:function(){R[l]=function(e){if(i.debug(e),"success"!==e.janus)return i.error("Ooops: "+e.error.code+" "+e.error.reason),void d.error(e.error.reason);o=setTimeout(_,g),b=!0,C=e.session_id?e.session_id:e.data.id,d.reconnect?i.log("Claimed session: "+C):i.log("Created session: "+C),i.sessions[C]=T,d.success()},n.send(JSON.stringify(u))},message:function(e){P(JSON.parse(e.data))},close:function(){c&&b&&(b=!1,e.error("Lost connection to the server (is it down?)"))}};for(let e in r)n.addEventListener(e,r[e])}else i.httpAPICall(c,{verb:"POST",withCredentials:p,body:u,success:function(e){if(i.debug(e),"success"!==e.janus)return i.error("Ooops: "+e.error.code+" "+e.error.reason),void d.error(e.error.reason);b=!0,C=e.session_id?e.session_id:e.data.id,d.reconnect?i.log("Claimed session: "+C):i.log("Created session: "+C),i.sessions[C]=T,k(),d.success()},error:function(e,t){if(i.error(e+":",t),i.isArray(a)&&!d.reconnect)return s++,s===a.length?void d.error("Error connecting to any of the provided Janus servers: Is the server down?"):(c=null,void setTimeout((function(){I(d)}),200));""===t?d.error(e+": Is the server down?"):t&&t.error?d.error(e+": "+t.error.message):d.error(e+": "+t)}})}function E(e,r){if((r=r||{}).success="function"==typeof r.success?r.success:i.noop,r.error="function"==typeof r.error?r.error:i.noop,!b)return i.warn("Is the server down? (connected=false)"),void r.error("Is the server down? (connected=false)");let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),void r.error("Invalid handle");let a=r.message,s=r.jsep,d=i.randomString(12),l={janus:"message",body:a,transaction:d};if(o.token&&(l.token=o.token),h&&(l.apisecret=h),s&&(l.jsep={type:s.type,sdp:s.sdp},s.e2ee&&(l.jsep.e2ee=!0),"hml"!==s.rid_order&&"lmh"!==s.rid_order||(l.jsep.rid_order=s.rid_order),s.force_relay&&(l.jsep.force_relay=!0)),i.debug("Sending message to plugin (handle="+e+"):"),i.debug(l),t)return l.session_id=C,l.handle_id=e,R[d]=function(e){if(i.debug("Message sent!"),i.debug(e),"success"===e.janus){let t=e.plugindata;if(!t)return i.warn("Request succeeded, but missing plugindata..."),void r.success();i.log("Synchronous transaction successful ("+t.plugin+")");let n=t.data;return i.debug(n),void r.success(n)}"ack"===e.janus?r.success():e.error?(i.error("Ooops: "+e.error.code+" "+e.error.reason),r.error(e.error.code+" "+e.error.reason)):(i.error("Unknown error"),r.error("Unknown error"))},void n.send(JSON.stringify(l));i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:l,success:function(e){if(i.debug("Message sent!"),i.debug(e),"success"===e.janus){let t=e.plugindata;if(!t)return i.warn("Request succeeded, but missing plugindata..."),void r.success();i.log("Synchronous transaction successful ("+t.plugin+")");let n=t.data;return i.debug(n),void r.success(n)}"ack"===e.janus?r.success():e.error?(i.error("Ooops: "+e.error.code+" "+e.error.reason),r.error(e.error.code+" "+e.error.reason)):(i.error("Unknown error"),r.error("Unknown error"))},error:function(e,t){i.error(e+":",t),r.error(e+": "+t)}})}function A(e,r){if(!b)return void i.warn("Is the server down? (connected=false)");let o=S[e];if(!o||!o.webrtcStuff)return void i.warn("Invalid handle");let a={janus:"trickle",candidate:r,transaction:i.randomString(12)};if(o.token&&(a.token=o.token),h&&(a.apisecret=h),i.vdebug("Sending trickle candidate (handle="+e+"):"),i.vdebug(a),t)return a.session_id=C,a.handle_id=e,void n.send(JSON.stringify(a));i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:a,success:function(e){i.vdebug("Candidate sent!"),i.vdebug(e),"ack"===e.janus||i.error("Ooops: "+e.error.code+" "+e.error.reason)},error:function(e,t){i.error(e+":",t)}})}function O(e,t,n,r,o){let a=S[e];if(!a||!a.webrtcStuff)return void i.warn("Invalid handle");let s=a.webrtcStuff;if(!s.pc)return void i.warn("Invalid PeerConnection");let c=function(e){i.log("Received state change on data channel:",e);let t=e.target.label,n=e.target.protocol,r=s.dataChannel[t]?s.dataChannel[t].readyState:"null";if(i.log("State change on <"+t+"> data channel: "+r),"open"===r){if(s.dataChannel[t].pending&&s.dataChannel[t].pending.length>0){i.log("Sending pending messages on <"+t+">:",s.dataChannel[t].pending.length);for(let e of s.dataChannel[t].pending)i.log("Sending data on data channel <"+t+">"),i.debug(e),s.dataChannel[t].send(e);s.dataChannel[t].pending=[]}a.ondataopen(t,n)}};if(r)s.dataChannel[t]=r;else{let e=s.dataChannelOptions;n&&(e.protocol=n),s.dataChannel[t]=s.pc.createDataChannel(t,e)}s.dataChannel[t].onmessage=function(e){i.log("Received message on data channel:",e);let t=e.target.label;a.ondata(e.data,t)},s.dataChannel[t].onopen=c,s.dataChannel[t].onclose=c,s.dataChannel[t].onerror=function(e){i.error("Got error on data channel:",e)},s.dataChannel[t].pending=[],o&&s.dataChannel[t].pending.push(o)}function D(e,t){(t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop;let n=S[e];if(!n||!n.webrtcStuff)return i.warn("Invalid handle"),void t.error("Invalid handle");let r=n.webrtcStuff,o=t.text||t.data;if(!o)return i.warn("Invalid data"),void t.error("Invalid data");let a=t.label?t.label:i.dataChanDefaultLabel;return r.dataChannel[a]?"open"!==r.dataChannel[a].readyState?(r.dataChannel[a].pending.push(o),void t.success()):(i.log("Sending data on data channel <"+a+">"),i.debug(o),r.dataChannel[a].send(o),void t.success()):(O(e,a,t.protocol,!1,o,t.protocol),void t.success())}function N(e,t){(t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop;let n=S[e];if(!n||!n.webrtcStuff)return i.warn("Invalid handle"),void t.error("Invalid handle");let r=n.webrtcStuff;if(!r.dtmfSender){if(r.pc){let e=r.pc.getSenders().find((function(e){return e.track&&"audio"===e.track.kind}));if(!e)return i.warn("Invalid DTMF configuration (no audio track)"),void t.error("Invalid DTMF configuration (no audio track)");r.dtmfSender=e.dtmf,r.dtmfSender&&(i.log("Created DTMF Sender"),r.dtmfSender.ontonechange=function(e){i.debug("Sent DTMF tone: "+e.tone)})}if(!r.dtmfSender)return i.warn("Invalid DTMF configuration"),void t.error("Invalid DTMF configuration")}let o=t.dtmf;if(!o)return i.warn("Invalid DTMF parameters"),void t.error("Invalid DTMF parameters");let a=o.tones;if(!a)return i.warn("Invalid DTMF string"),void t.error("Invalid DTMF string");let s="number"==typeof o.duration?o.duration:500,c="number"==typeof o.gap?o.gap:50;i.debug("Sending DTMF string "+a+" (duration "+s+"ms, gap "+c+"ms)"),r.dtmfSender.insertDTMF(a,s,c),t.success()}function L(e,r){(r=r||{}).success="function"==typeof r.success?r.success:i.noop,r.error="function"==typeof r.error?r.error:i.noop;let o=!0===r.noRequest;i.log("Destroying handle "+e+" (only-locally="+o+")"),Y(e);let a=S[e];if(!a||a.detached)return delete S[e],void r.success();if(a.detached=!0,o)return delete S[e],void r.success();if(!b)return i.warn("Is the server down? (connected=false)"),void r.error("Is the server down? (connected=false)");let s={janus:"detach",transaction:i.randomString(12)};if(a.token&&(s.token=a.token),h&&(s.apisecret=h),t)return s.session_id=C,s.handle_id=e,n.send(JSON.stringify(s)),delete S[e],void r.success();i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:s,success:function(t){i.log("Destroyed handle:"),i.debug(t),"success"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),delete S[e],r.success()},error:function(t,n){i.error(t+":",n),delete S[e],r.success()}})}function M(e,t){let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;if(r.pc)return;let o={iceServers:d,iceTransportPolicy:l,bundlePolicy:u,sdpSemantics:"unified-plan"},a=!1;if(t.tracks)for(let e of t.tracks)if(e.transforms&&(e.transforms.sender||e.transforms.receiver)){a=!0;break}RTCRtpSender&&(RTCRtpSender.prototype.createEncodedStreams||RTCRtpSender.prototype.createEncodedAudioStreams&&RTCRtpSender.prototype.createEncodedVideoStreams)&&a&&(r.insertableStreams=!0,o.forceEncodedAudioInsertableStreams=!0,o.forceEncodedVideoInsertableStreams=!0,o.encodedInsertableStreams=!0),i.log("Creating PeerConnection"),r.pc=new RTCPeerConnection(o),i.debug(r.pc),r.pc.getStats&&(r.volume={},r.bitrate.value="0 kbits/sec"),i.log("Preparing local SDP and gathering candidates (trickle="+r.trickle+")"),r.pc.oniceconnectionstatechange=function(){r.pc&&n.iceState(r.pc.iceConnectionState)},r.pc.onicecandidate=function(n){if(!n.candidate||n.candidate.candidate&&n.candidate.candidate.indexOf("endOfCandidates")>0)i.log("End of candidates."),r.iceDone=!0,!0===r.trickle?A(e,{completed:!0}):function(e,t){t=t||{},t.success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop;let n=S[e];if(!n||!n.webrtcStuff)return void i.warn("Invalid handle, not sending anything");let r=n.webrtcStuff;if(i.log("Sending offer/answer SDP..."),!r.mySdp)return void i.warn("Local SDP instance is invalid, not sending anything...");r.mySdp={type:r.pc.localDescription.type,sdp:r.pc.localDescription.sdp},!1===r.trickle&&(r.mySdp.trickle=!1);i.debug(t),r.sdpSent=!0,t.success(r.mySdp)}(e,t);else{let t={candidate:n.candidate.candidate,sdpMid:n.candidate.sdpMid,sdpMLineIndex:n.candidate.sdpMLineIndex};!0===r.trickle&&A(e,t)}},r.pc.ontrack=function(e){if(i.log("Handling Remote Track",e),!e.streams)return;if(!e.track)return;let t=e.transceiver?e.transceiver.mid:e.track.id;try{n.onremotetrack(e.track,t,!0)}catch(e){i.error(e)}if(e.track.onended)return;let o=null;i.log("Adding onended callback to track:",e.track),e.track.onended=function(e){i.log("Remote track removed:",e),clearTimeout(o);let t=r.pc.getTransceivers().find((t=>t.receiver.track===e.target)),a=t?t.mid:e.target.id;try{n.onremotetrack(e.target,a,!1)}catch(e){i.error(e)}},e.track.onmute=function(e){i.log("Remote track muted:",e),o||(o=setTimeout((function(){i.log("Removing remote track");let t=r.pc.getTransceivers().find((t=>t.receiver.track===e.target)),a=t?t.mid:e.target.id;try{n.onremotetrack(e.target,a,!1)}catch(e){i.error(e)}o=null}),2520))},e.track.onunmute=function(e){if(i.log("Remote track flowing again:",e),null!=o)clearTimeout(o),o=null;else try{let t=r.pc.getTransceivers().find((t=>t.receiver.track===e.target)),o=t?t.mid:e.target.id;n.onremotetrack(e.target,o,!0)}catch(e){i.error(e)}}}}async function x(e,t,n){(n=n||{}).success="function"==typeof n.success?n.success:i.noop,n.error="function"==typeof n.error?n.error:q;let r=n.jsep;if(t&&r)return i.error("Provided a JSEP to a createOffer"),void n.error("Provided a JSEP to a createOffer");if(!(t||r&&r.type&&r.sdp))return i.error("A valid JSEP is required for createAnswer"),void n.error("A valid JSEP is required for createAnswer");if(n.media&&!n.tracks){if(n.tracks=i.mediaToTracks(n.media),!0===n.simulcast||!0===n.simulcast2||n.svc)for(let e of n.tracks)if("video"===e.type){!0===n.simulcast||!0===n.simulcast2?e.simulcast=!0:n.svc&&(e.svc=n.svc);break}i.warn("Deprecated media object passed, use tracks instead. Automatically translated to:",n.tracks)}if(n.tracks&&!Array.isArray(n.tracks))return i.error("Tracks must be an array"),void n.error("Tracks must be an array");let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),void n.error("Invalid handle");let a=o.webrtcStuff;var s;a.trickle=(s=n.trickle,i.debug("isTrickleEnabled:",s),!1!==s);try{if(M(e,n),t&&await U(e,n),r){if(await a.pc.setRemoteDescription(r),i.log("Remote description accepted!"),a.remoteSdp=r.sdp,a.candidates&&a.candidates.length>0){for(let e=0;e<a.candidates.length;e++){let t=a.candidates[e];i.debug("Adding remote candidate:",t),t&&!0!==t.completed?a.pc.addIceCandidate(t):a.pc.addIceCandidate(i.endOfCandidates)}a.candidates=[]}await U(e,n);let t=await async function(e,t){t=t||{},t.customizeSdp="function"==typeof t.customizeSdp?t.customizeSdp:i.noop;let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;i.log("Creating answer (iceDone="+r.iceDone+")");let o=await r.pc.createAnswer();i.debug(o);let a={type:"answer",sdp:o.sdp};if(t.customizeSdp(a),o.sdp=a.sdp,i.log("Setting local description"),r.mySdp={type:"answer",sdp:o.sdp},await r.pc.setLocalDescription(o),!r.iceDone&&!r.trickle)return i.log("Waiting for all candidates..."),null;r.insertableStreams&&(o.e2ee=!0);return o}(e,n);n.success(t)}else{let t=await async function(e,t){t=t||{},t.customizeSdp="function"==typeof t.customizeSdp?t.customizeSdp:i.noop;let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;i.log("Creating offer (iceDone="+r.iceDone+")");let o={},a=!0===t.iceRestart;a&&(o.iceRestart=!0);i.debug(o);let s=await r.pc.createOffer(o);i.debug(s);let c={type:"offer",sdp:s.sdp};if(t.customizeSdp(c),s.sdp=c.sdp,i.log("Setting local description"),r.mySdp={type:"offer",sdp:s.sdp},await r.pc.setLocalDescription(s),r.mediaConstraints=o,!r.iceDone&&!r.trickle)return i.log("Waiting for all candidates..."),null;r.insertableStreams&&(s.e2ee=!0);return s}(e,n);n.success(t)}}catch(e){i.error(e),n.error(e)}}function j(e,t){(t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:q,t.customizeSdp="function"==typeof t.customizeSdp?t.customizeSdp:i.noop;let n=t.jsep,r=S[e];if(!r||!r.webrtcStuff)return i.warn("Invalid handle"),void t.error("Invalid handle");let o=r.webrtcStuff;if(n){if(!o.pc)return i.warn("Wait, no PeerConnection?? if this is an answer, use createAnswer and not handleRemoteJsep"),void t.error("No PeerConnection: if this is an answer, use createAnswer and not handleRemoteJsep");t.customizeSdp(n),o.pc.setRemoteDescription(n).then((function(){if(i.log("Remote description accepted!"),o.remoteSdp=n.sdp,o.candidates&&o.candidates.length>0){for(let e=0;e<o.candidates.length;e++){let t=o.candidates[e];i.debug("Adding remote candidate:",t),t&&!0!==t.completed?o.pc.addIceCandidate(t):o.pc.addIceCandidate(i.endOfCandidates)}o.candidates=[]}t.success()}),t.error)}else t.error("Invalid JSEP")}async function G(e,t){if((t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop,t.tracks&&!Array.isArray(t.tracks))return i.error("Tracks must be an array"),void t.error("Tracks must be an array");for(let e of t.tracks)(e.add||!e.replace&&!e.remove)&&(e.replace=!0);try{await U(e,t),t.success()}catch(e){i.error(e),t.error(e)}}async function U(e,t){let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle, not sending anything"),"Invalid handle";let r=n.webrtcStuff;if(!r.pc)throw i.warn("Invalid PeerConnection"),"Invalid PeerConnection";let o=t.tracks;if(!o||!Array.isArray(o)||0===o.length)return;let a=!1,s={};for(let e of o){if(delete e.gumGroup,!e.type||!["audio","video"].includes(e.type))continue;if(!e.capture||e.capture instanceof MediaStreamTrack)continue;let t=e.group?e.group:"default";s[t]||(s[t]={}),s[t][e.type]||(e.gumGroup=t,s[t][e.type]=e)}let c=Object.keys(s);for(let e of c){let t=s[e];t.audio&&t.video||(t.audio&&delete t.audio.gumGroup,t.video&&delete t.video.gumGroup,delete s[e])}let d=!!t.jsep;for(let t of o){if(!t.type){i.warn("Missing track type:",t);continue}if("data"===t.type){if(r.pc.ondatachannel){i.warn("Data channel exists already, not creating another one");continue}i.log("Creating default data channel"),O(e,i.dataChanDefaultLabel,null,!1),r.pc.ondatachannel=function(t){i.log("Data channel created by Janus:",t),O(e,t.channel.label,t.channel.protocol,t.channel)};continue}if(void 0===t.add&&null===t.add&&void 0===t.remove&&null===t.remove&&void 0===t.replace&&null===t.replace&&(t.add=!0),t.add&&t.remove||t.add&&t.remove&&t.replace){i.warn("Conflicting actions for track, ignoring:",t);continue}t.add&&t.replace?(i.warn("Both add and replace provided, falling back to replace:",t),delete t.add):t.remove&&t.replace&&(i.warn("Both remove and replace provided, falling back to remove:",t),delete t.replace);let o=t.type;"screen"===t.type&&(o="video");let c=null,l=null;if(c=t.mid?r.pc.getTransceivers().find((e=>e.mid===t.mid&&e.receiver.track.kind===o)):r.pc.getTransceivers().find((e=>e.receiver.track.kind===o)),t.replace||t.remove){if(!c){i.warn("Couldn't find a transceiver for track:",t);continue}if(!c.sender){i.warn("No sender in the transceiver for track:",t);continue}l=c.sender}if(d&&!c&&(c=r.pc.getTransceivers().find((e=>e.receiver.track.kind===o)),!c)){i.warn("Couldn't find a transceiver for track:",t);continue}let u=null,p=null;if(t.remove)i.log("Removing track from PeerConnection",t),p=l.track?l.track.id:null,await l.replaceTrack(null);else if(t.capture){if(t.gumGroup&&s[t.gumGroup]&&s[t.gumGroup].stream){let e=s[t.gumGroup].stream;u="audio"===t.type?e.getAudioTracks()[0]:e.getVideoTracks()[0],delete s[t.gumGroup].stream,delete s[t.gumGroup],delete t.gumGroup}else if(t.capture instanceof MediaStreamTrack)u=t.capture;else{a||(a=!0,n.consentDialog(!0));let e=i.trackConstraints(t),r=null;if("audio"===t.type||"video"===t.type){if(t.gumGroup){let n="audio"===t.type?"video":"audio";if(s[t.gumGroup]&&s[t.gumGroup][n]){let r=s[t.gumGroup][n],o=i.trackConstraints(r);e[n]=o[n]}}r=await navigator.mediaDevices.getUserMedia(e),t.gumGroup&&e.audio&&e.video&&(s[t.gumGroup].stream=r,delete t.gumGroup)}else r=await navigator.mediaDevices.getDisplayMedia(e);u="audio"===t.type?r.getAudioTracks()[0]:r.getVideoTracks()[0]}if(t.replace){await l.replaceTrack(u);let e="sendrecv";!1!==t.recv&&"inactive"!==c.direction&&"sendonly"!==c.direction||(e="sendonly"),c.setDirection?c.setDirection(e):c.direction=e}else{if(r.myStream||(r.myStream=new MediaStream),"audio"===o||!t.simulcast&&!t.svc)l=r.pc.addTrack(u,r.myStream),c=r.pc.getTransceivers().find((e=>e.sender===l));else if(t.simulcast){if("firefox"!==i.webRTCAdapter.browserDetails.browser){i.log("Enabling rid-based simulcasting:",u);let e=y(t.simulcastMaxBitrates);c=r.pc.addTransceiver(u,{direction:"sendrecv",streams:[r.myStream],sendEncodings:t.sendEncodings||[{rid:"h",active:!0,maxBitrate:e.high},{rid:"m",active:!0,maxBitrate:e.medium,scaleResolutionDownBy:2},{rid:"l",active:!0,maxBitrate:e.low,scaleResolutionDownBy:4}]})}else if(i.log("Enabling Simulcasting for Firefox (RID)"),c=r.pc.addTransceiver(u,{direction:"sendrecv",streams:[r.myStream]}),l=c?c.sender:null,l){let e=l.getParameters();e||(e={});let n=y(t.simulcastMaxBitrates);e.encodings=t.sendEncodings||[{rid:"h",active:!0,maxBitrate:n.high},{rid:"m",active:!0,maxBitrate:n.medium,scaleResolutionDownBy:2},{rid:"l",active:!0,maxBitrate:n.low,scaleResolutionDownBy:4}],l.setParameters(e)}}else i.log("Enabling SVC ("+t.svc+"):",u),c=r.pc.addTransceiver(u,{direction:"sendrecv",streams:[r.myStream],sendEncodings:[{scalabilityMode:t.svc}]});if(l||(l=c?c.sender:null),t.codec)if("firefox"===i.webRTCAdapter.browserDetails.browser)i.warn("setCodecPreferences not supported in Firefox, ignoring codec for track:",t);else if("string"!=typeof t.codec)i.warn("Invalid codec value, ignoring for track:",t);else{let e=o+"/"+t.codec.toLowerCase(),n=RTCRtpReceiver.getCapabilities(o).codecs.filter((function(t){return t.mimeType.toLowerCase()===e}));if(n&&0!==n.length){if(c)try{c.setCodecPreferences(n)}catch(e){i.warn("Failed enforcing codec for this "+o+" track:",e)}}else i.warn("Codec not supported in this browser for this track, ignoring:",t)}if(t.bitrate)if(t.simulcast||t.svc)i.warn("Ignoring bitrate for simulcast/SVC track, use sendEncodings for that");else if(isNaN(t.bitrate)||t.bitrate<0)i.warn("Ignoring invalid bitrate for track:",t);else if(l){let e=l.getParameters();e&&e.encodings&&0!==e.encodings.length?(e.encodings[0].maxBitrate=t.bitrate,await l.setParameters(e)):i.warn("No encodings in the sender parameters, ignoring bitrate for track:",t)}if("video"===o&&t.framerate)if(t.simulcast||t.svc)i.warn("Ignoring framerate for simulcast/SVC track, use sendEncodings for that");else if(isNaN(t.framerate)||t.framerate<0)i.warn("Ignoring invalid framerate for track:",t);else if(l){let e=l.getParameters();e&&e.encodings&&0!==e.encodings.length?(e.encodings[0].maxFramerate=t.framerate,await l.setParameters(e)):i.warn("No encodings in the sender parameters, ignoring framerate for track:",t)}if(t.transforms){if(l&&t.transforms.sender){let e=null;RTCRtpSender.prototype.createEncodedStreams?e=l.createEncodedStreams():(RTCRtpSender.prototype.createAudioEncodedStreams||RTCRtpSender.prototype.createEncodedVideoStreams)&&("audio"===o?e=l.createEncodedAudioStreams():"video"===o&&(e=l.createEncodedVideoStreams())),e&&(console.log("Insertable Streams sender transform:",e),e.readableStream&&e.writableStream?e.readableStream.pipeThrough(t.transforms.sender).pipeTo(e.writableStream):e.readable&&e.writable&&e.readable.pipeThrough(t.transforms.sender).pipeTo(e.writable))}if(c&&c.receiver&&t.transforms.receiver){let e=null;RTCRtpReceiver.prototype.createEncodedStreams?e=c.receiver.createEncodedStreams():(RTCRtpReceiver.prototype.createAudioEncodedStreams||RTCRtpReceiver.prototype.createEncodedVideoStreams)&&("audio"===o?e=c.receiver.createEncodedAudioStreams():"video"===o&&(e=c.receiver.createEncodedVideoStreams())),e&&(console.log("Insertable Streams receiver transform:",e),e.readableStream&&e.writableStream?e.readableStream.pipeThrough(t.transforms.receiver).pipeTo(e.writableStream):e.readable&&e.writable&&e.readable.pipeThrough(t.transforms.receiver).pipeTo(e.writable))}}}u&&!0===t.dontStop&&(u.dontStop=!0)}if(p&&r.myStream){let e=null;if("audio"===o&&r.myStream.getAudioTracks()&&r.myStream.getAudioTracks().length)for(let t of r.myStream.getAudioTracks())t.id===p&&(e=t,i.log("Removing audio track:",e));else if("video"===o&&r.myStream.getVideoTracks()&&r.myStream.getVideoTracks().length)for(let t of r.myStream.getVideoTracks())t.id===p&&(e=t,i.log("Removing video track:",e));if(e){try{r.myStream.removeTrack(e),n.onlocaltrack(e,!1)}catch(e){i.error(e)}if(!0!==e.dontStop)try{e.stop()}catch(e){}}}if(u){r.myStream.addTrack(u),u.onended=function(e){i.log("Local track removed:",e);try{n.onlocaltrack(e.target,!1)}catch(e){i.error(e)}};try{n.onlocaltrack(u,!0)}catch(e){i.error(e)}}if(c){let e=c.direction,n=null,r=u&&c.sender.track,o=!1!==t.recv&&c.receiver.track;r&&o?n="sendrecv":r&&!o?n="sendonly":!r&&o?n="recvonly":r||o||(n="inactive"),n&&n!==e&&(i.warn("Changing direction of transceiver to "+n+" (was "+e+")",t),c.setDirection?c.setDirection(n):c.direction=n)}}a&&n.consentDialog(!1)}function F(e){let t=S[e];if(!t||!t.webrtcStuff)return i.warn("Invalid handle"),null;let n=t.webrtcStuff;if(!n.pc)return i.warn("Invalid PeerConnection"),null;let r=[],o=n.pc.getTransceivers();for(let e of o){let t=null;e.sender&&e.sender.track&&(t={mid:e.mid},t.type=e.sender.track.kind,t.id=e.sender.track.id,t.label=e.sender.track.label),t&&r.push(t)}return r}function V(e){let t=S[e];if(!t||!t.webrtcStuff)return i.warn("Invalid handle"),null;let n=t.webrtcStuff;if(!n.pc)return i.warn("Invalid PeerConnection"),null;let r=[],o=n.pc.getTransceivers();for(let e of o){let t=null;e.receiver&&e.receiver.track&&(t={mid:e.mid},t.type=e.receiver.track.kind,t.id=e.receiver.track.id,t.label=e.receiver.track.label),t&&r.push(t)}return r}function J(e,t,n,r){r="function"==typeof r?r:i.noop;let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),void r(0);let a=n?"remote":"local",s=o.webrtcStuff;if(s.volume[a]||(s.volume[a]={value:0}),!s.pc.getStats||"chrome"!==i.webRTCAdapter.browserDetails.browser&&"safari"!==i.webRTCAdapter.browserDetails.browser)return i.warn("Getting the "+a+" volume unsupported by browser"),void r(0);{let e=s.pc;if(t){let o=s.pc.getTransceivers().find((e=>e.mid===t&&"audio"===e.receiver.track.kind));if(!o)return i.warn("No audio transceiver with mid "+t),void r(0);if(n&&!o.receiver)return i.warn("Remote transceiver track unavailable"),void r(0);if(!n&&!o.sender)return i.warn("Local transceiver track unavailable"),void r(0);e=n?o.receiver:o.sender}return e.getStats().then((function(e){e.forEach((function(e){e&&"audio"===e.kind&&(n&&!e.remoteSource||!n&&"media-source"!==e.type||r(e.audioLevel?e.audioLevel:0))}))})),s.volume[a].value}}function K(e,t,n){let r=S[e];if(!r||!r.webrtcStuff)return i.warn("Invalid handle"),!0;let o=r.webrtcStuff;if(!o.pc)return i.warn("Invalid PeerConnection"),!0;if(!o.myStream)return i.warn("Invalid local MediaStream"),!0;if(n){if(!o.myStream.getVideoTracks()||0===o.myStream.getVideoTracks().length)return i.warn("No video track"),!0;if(t){let e=o.pc.getTransceivers().find((e=>e.mid===t&&"video"===e.receiver.track.kind));return e?e.sender&&e.sender.track?!e.sender.track.enabled:(i.warn("No video sender with mid "+t),!0):(i.warn("No video transceiver with mid "+t),!0)}return!o.myStream.getVideoTracks()[0].enabled}if(!o.myStream.getAudioTracks()||0===o.myStream.getAudioTracks().length)return i.warn("No audio track"),!0;if(t){let e=o.pc.getTransceivers().find((e=>e.mid===t&&"audio"===e.receiver.track.kind));return e?e.sender&&e.sender.track?!e.sender.track.enabled:(i.warn("No audio sender with mid "+t),!0):(i.warn("No audio transceiver with mid "+t),!0)}return!o.myStream.getAudioTracks()[0].enabled}function W(e,t,n,r){let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),!1;let a=o.webrtcStuff;if(!a.pc)return i.warn("Invalid PeerConnection"),!1;if(!a.myStream)return i.warn("Invalid local MediaStream"),!1;if(n){if(!a.myStream.getVideoTracks()||0===a.myStream.getVideoTracks().length)return i.warn("No video track"),!1;if(t){let e=a.pc.getTransceivers().find((e=>e.mid===t&&"video"===e.receiver.track.kind));if(!e)return i.warn("No video transceiver with mid "+t),!1;if(!e.sender||!e.sender.track)return i.warn("No video sender with mid "+t),!1;e.sender.track.enabled=!r}else for(const e of a.myStream.getVideoTracks())e.enabled=!r}else{if(!a.myStream.getAudioTracks()||0===a.myStream.getAudioTracks().length)return i.warn("No audio track"),!1;if(t){let e=a.pc.getTransceivers().find((e=>e.mid===t&&"audio"===e.receiver.track.kind));if(!e)return i.warn("No audio transceiver with mid "+t),!1;if(!e.sender||!e.sender.track)return i.warn("No audio sender with mid "+t),!1;e.sender.track.enabled=!r}else for(const e of a.myStream.getAudioTracks())e.enabled=!r}return!0}function z(e,t){let n=S[e];if(!n||!n.webrtcStuff)return i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;if(!r.pc)return"Invalid PeerConnection";if(r.pc.getStats){let e=r.pc,n=t||"default";if(t){let n=r.pc.getTransceivers().find((e=>e.mid===t&&"video"===e.receiver.track.kind));if(!n)return i.warn("No video transceiver with mid "+t),"No video transceiver with mid "+t;if(!n.receiver)return i.warn("No video receiver with mid "+t),"No video receiver with mid "+t;e=n.receiver}return r.bitrate[n]||(r.bitrate[n]={timer:null,bsnow:null,bsbefore:null,tsnow:null,tsbefore:null,value:"0 kbits/sec"}),r.bitrate[n].timer?r.bitrate[n].value:(i.log("Starting bitrate timer"+(t?" for mid "+t:"")+" (via getStats)"),r.bitrate[n].timer=setInterval((function(){e.getStats().then((function(e){e.forEach((function(e){if(!e)return;let t=!1;if(("video"===e.mediaType||e.id.toLowerCase().indexOf("video")>-1)&&"inbound-rtp"===e.type&&e.id.indexOf("rtcp")<0?t=!0:"ssrc"!=e.type||!e.bytesReceived||"VP8"!==e.googCodecName&&""!==e.googCodecName||(t=!0),t)if(r.bitrate[n].bsnow=e.bytesReceived,r.bitrate[n].tsnow=e.timestamp,null===r.bitrate[n].bsbefore||null===r.bitrate[n].tsbefore)r.bitrate[n].bsbefore=r.bitrate[n].bsnow,r.bitrate[n].tsbefore=r.bitrate[n].tsnow;else{let e=r.bitrate[n].tsnow-r.bitrate[n].tsbefore;"safari"===i.webRTCAdapter.browserDetails.browser&&(e/=1e3);let t=Math.round(8*(r.bitrate[n].bsnow-r.bitrate[n].bsbefore)/e);"safari"===i.webRTCAdapter.browserDetails.browser&&(t=parseInt(t/1e3)),r.bitrate[n].value=t+" kbits/sec",r.bitrate[n].bsbefore=r.bitrate[n].bsnow,r.bitrate[n].tsbefore=r.bitrate[n].tsnow}}))}))}),1e3),"0 kbits/sec")}return i.warn("Getting the video bitrate unsupported by browser"),"Feature unsupported by browser"}function B(e,t,n){let r=S[e];if(!r||!r.webrtcStuff)return void i.warn("Invalid handle");let o=r.webrtcStuff;if(!o.pc)return void i.warn("Invalid PeerConnection");let a=o.pc.getTransceivers().find((e=>e.mid===t));if(!a)return void i.warn("No transceiver with mid",t);if(!a.sender)return void i.warn("No sender for transceiver with mid",t);let s=a.sender.getParameters();s&&s.encodings&&0!==s.encodings.length?s.encodings.length>1?i.warn("Ignoring bitrate for simulcast track, use sendEncodings for that"):isNaN(n)||n<0?i.warn("Invalid bitrate (must be a positive integer)"):(s.encodings[0].maxBitrate=n,a.sender.setParameters(s)):i.warn("No parameters encodings")}function q(e){i.error("WebRTC error:",e)}function Y(e,r){i.log("Cleaning WebRTC stuff");let o=S[e];if(!o)return;let a=o.webrtcStuff;if(a){if(!0===r){let r={janus:"hangup",transaction:i.randomString(12)};o.token&&(r.token=o.token),h&&(r.apisecret=h),i.debug("Sending hangup request (handle="+e+"):"),i.debug(r),t?(r.session_id=C,r.handle_id=e,n.send(JSON.stringify(r))):i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:r})}a.volume&&(a.volume.local&&a.volume.local.timer&&clearInterval(a.volume.local.timer),a.volume.remote&&a.volume.remote.timer&&clearInterval(a.volume.remote.timer));for(let e in a.bitrate)a.bitrate[e].timer&&clearInterval(a.bitrate[e].timer);a.bitrate={},!a.streamExternal&&a.myStream&&(i.log("Stopping local stream tracks"),i.stopAllTracks(a.myStream)),a.streamExternal=!1,a.myStream=null;try{a.pc.close()}catch(e){}a.pc=null,a.candidates=null,a.mySdp=null,a.remoteSdp=null,a.iceDone=!1,a.dataChannel={},a.dtmfSender=null,a.insertableStreams=!1}o.oncleanup()}I(e),i.getServer=function(){return c},i.isConnected=function(){return b},i.reconnect=function(e){(e=e||{}).success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,e.reconnect=!0,I(e)},i.getSessionId=function(){return C},i.getInfo=function(e){!function(e){if(e=e||{},e.success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,i.log("Getting info on Janus instance"),!b)return i.warn("Is the server down? (connected=false)"),void e.error("Is the server down? (connected=false)");let r=i.randomString(12),o={janus:"info",transaction:r};m&&(o.token=m);h&&(o.apisecret=h);if(t)return R[r]=function(t){i.log("Server info:"),i.debug(t),"server_info"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),e.success(t)},void n.send(JSON.stringify(o));i.httpAPICall(c,{verb:"POST",withCredentials:p,body:o,success:function(t){i.log("Server info:"),i.debug(t),"server_info"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),e.success(t)},error:function(t,n){i.error(t+":",n),""===n?e.error(t+": Is the server down?"):e.error(t+": "+n)}})}(e)},i.destroy=function(a){!function(a){a=a||{},a.success="function"==typeof a.success?a.success:i.noop,a.error="function"==typeof a.error?a.error:i.noop;let s=!0===a.unload,d=!0;void 0!==a.notifyDestroyed&&null!==a.notifyDestroyed&&(d=!0===a.notifyDestroyed);let l=!0===a.cleanupHandles;if(i.log("Destroying session "+C+" (unload="+s+")"),!C)return i.warn("No session to destroy"),a.success(),void(d&&e.destroyed());if(l)for(let e in S)L(e,{noRequest:!0});if(!b)return i.warn("Is the server down? (connected=false)"),C=null,void a.success();let u={janus:"destroy",transaction:i.randomString(12)};m&&(u.token=m);h&&(u.apisecret=h);if(s)return t?(n.onclose=null,n.close(),n=null):navigator.sendBeacon(c+"/"+C,JSON.stringify(u)),i.log("Destroyed session:"),C=null,b=!1,a.success(),void(d&&e.destroyed());if(t){u.session_id=C;let t=function(){for(let e in r)n.removeEventListener(e,r[e]);n.removeEventListener("message",i),n.removeEventListener("error",s),o&&clearTimeout(o),n.close()},i=function(n){let r=JSON.parse(n.data);r.session_id==u.session_id&&r.transaction==u.transaction&&(t(),a.success(),d&&e.destroyed())},s=function(){t(),a.error("Failed to destroy the server: Is the server down?"),d&&e.destroyed()};return n.addEventListener("message",i),n.addEventListener("error",s),void(1===n.readyState?n.send(JSON.stringify(u)):s())}i.httpAPICall(c+"/"+C,{verb:"POST",withCredentials:p,body:u,success:function(t){i.log("Destroyed session:"),i.debug(t),C=null,b=!1,"success"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),a.success(),d&&e.destroyed()},error:function(t,n){i.error(t+":",n),C=null,b=!1,a.success(),d&&e.destroyed()}})}(a)},i.attach=function(e){!function(e){if(e=e||{},e.success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,e.dataChannelOptions=e.dataChannelOptions||{ordered:!0},e.consentDialog="function"==typeof e.consentDialog?e.consentDialog:i.noop,e.webrtcTimeout="function"==typeof e.webrtcTimeout?e.webrtcTimeout:i.noop,e.iceState="function"==typeof e.iceState?e.iceState:i.noop,e.mediaState="function"==typeof e.mediaState?e.mediaState:i.noop,e.webrtcState="function"==typeof e.webrtcState?e.webrtcState:i.noop,e.slowLink="function"==typeof e.slowLink?e.slowLink:i.noop,e.onmessage="function"==typeof e.onmessage?e.onmessage:i.noop,e.onlocaltrack="function"==typeof e.onlocaltrack?e.onlocaltrack:i.noop,e.onremotetrack="function"==typeof e.onremotetrack?e.onremotetrack:i.noop,e.ondata="function"==typeof e.ondata?e.ondata:i.noop,e.ondataopen="function"==typeof e.ondataopen?e.ondataopen:i.noop,e.oncleanup="function"==typeof e.oncleanup?e.oncleanup:i.noop,e.ondetached="function"==typeof e.ondetached?e.ondetached:i.noop,!b)return i.warn("Is the server down? (connected=false)"),void e.error("Is the server down? (connected=false)");let r=e.plugin;if(!r)return i.error("Invalid plugin"),void e.error("Invalid plugin");let o=e.opaqueId,a=e.loopIndex,s=e.token?e.token:m,d=i.randomString(12),l={janus:"attach",plugin:r,opaque_id:o,loop_index:a,transaction:d};s&&(l.token=s);h&&(l.apisecret=h);if(t)return R[d]=function(t){if(i.debug(t),"success"!==t.janus)return i.error("Ooops: "+t.error.code+" "+t.error.reason),void e.error("Ooops: "+t.error.code+" "+t.error.reason);let n=t.data.id;i.log("Created handle: "+n);let o={session:T,plugin:r,id:n,token:s,detached:!1,webrtcStuff:{started:!1,myStream:null,streamExternal:!1,mySdp:null,mediaConstraints:null,pc:null,dataChannelOptions:e.dataChannelOptions,dataChannel:{},dtmfSender:null,trickle:!0,iceDone:!1,bitrate:{}},getId:function(){return n},getPlugin:function(){return r},getVolume:function(e,t){return J(n,e,!0,t)},getRemoteVolume:function(e,t){return J(n,e,!0,t)},getLocalVolume:function(e,t){return J(n,e,!1,t)},isAudioMuted:function(e){return K(n,e,!1)},muteAudio:function(e){return W(n,e,!1,!0)},unmuteAudio:function(e){return W(n,e,!1,!1)},isVideoMuted:function(e){return K(n,e,!0)},muteVideo:function(e){return W(n,e,!0,!0)},unmuteVideo:function(e){return W(n,e,!0,!1)},getBitrate:function(e){return z(n,e)},setMaxBitrate:function(e,t){return B(n,e,t)},send:function(e){E(n,e)},data:function(e){D(n,e)},dtmf:function(e){N(n,e)},consentDialog:e.consentDialog,webrtcTimeout:e.webrtcTimeout,iceState:e.iceState,mediaState:e.mediaState,webrtcState:e.webrtcState,slowLink:e.slowLink,onmessage:e.onmessage,createOffer:function(e){x(n,!0,e)},createAnswer:function(e){x(n,!1,e)},handleRemoteJsep:function(e){j(n,e)},replaceTracks:function(e){G(n,e)},getLocalTracks:function(){return F(n)},getRemoteTracks:function(){return V(n)},onlocaltrack:e.onlocaltrack,onremotetrack:e.onremotetrack,ondata:e.ondata,ondataopen:e.ondataopen,oncleanup:e.oncleanup,ondetached:e.ondetached,hangup:function(e){Y(n,!0===e)},detach:function(e){L(n,e)}};S[n]=o,e.success(o)},l.session_id=C,void n.send(JSON.stringify(l));i.httpAPICall(c+"/"+C,{verb:"POST",withCredentials:p,body:l,success:function(t){if(i.debug(t),"success"!==t.janus)return i.error("Ooops: "+t.error.code+" "+t.error.reason),void e.error("Ooops: "+t.error.code+" "+t.error.reason);let n=t.data.id;i.log("Created handle: "+n);let o={session:T,plugin:r,id:n,token:s,detached:!1,webrtcStuff:{started:!1,myStream:null,streamExternal:!1,mySdp:null,mediaConstraints:null,pc:null,dataChannelOptions:e.dataChannelOptions,dataChannel:{},dtmfSender:null,trickle:!0,iceDone:!1,bitrate:{}},getId:function(){return n},getPlugin:function(){return r},getVolume:function(e,t){return J(n,e,!0,t)},getRemoteVolume:function(e,t){return J(n,e,!0,t)},getLocalVolume:function(e,t){return J(n,e,!1,t)},isAudioMuted:function(e){return K(n,e,!1)},muteAudio:function(e){return W(n,e,!1,!0)},unmuteAudio:function(e){return W(n,e,!1,!1)},isVideoMuted:function(e){return K(n,e,!0)},muteVideo:function(e){return W(n,e,!0,!0)},unmuteVideo:function(e){return W(n,e,!0,!1)},getBitrate:function(e){return z(n,e)},setMaxBitrate:function(e,t){return B(n,e,t)},send:function(e){E(n,e)},data:function(e){D(n,e)},dtmf:function(e){N(n,e)},consentDialog:e.consentDialog,webrtcTimeout:e.webrtcTimeout,iceState:e.iceState,mediaState:e.mediaState,webrtcState:e.webrtcState,slowLink:e.slowLink,onmessage:e.onmessage,createOffer:function(e){x(n,!0,e)},createAnswer:function(e){x(n,!1,e)},handleRemoteJsep:function(e){j(n,e)},replaceTracks:function(e){G(n,e)},getLocalTracks:function(){return F(n)},getRemoteTracks:function(){return V(n)},onlocaltrack:e.onlocaltrack,onremotetrack:e.onremotetrack,ondata:e.ondata,ondataopen:e.ondataopen,oncleanup:e.oncleanup,ondetached:e.ondetached,hangup:function(e){Y(n,!0===e)},detach:function(e){L(n,e)}};S[n]=o,e.success(o)},error:function(t,n){i.error(t+":",n),""===n?e.error(t+": Is the server down?"):e.error(t+": "+n)}})}(e)}}i.useDefaultDependencies=function(e){let t=e&&e.fetch||fetch,n=e&&e.Promise||Promise,r=e&&e.WebSocket||WebSocket;return{newWebSocket:function(e,t){return new r(e,t)},extension:e&&e.extension||o,isArray:function(e){return Array.isArray(e)},webRTCAdapter:e&&e.adapter||adapter,httpAPICall:function(e,r){let o={method:r.verb,headers:{Accept:"application/json, text/plain, */*"},cache:"no-cache"};"POST"===r.verb&&(o.headers["Content-Type"]="application/json"),void 0!==r.withCredentials&&(o.credentials=!0===r.withCredentials?"include":r.withCredentials?r.withCredentials:"omit"),r.body&&(o.body=JSON.stringify(r.body));let a=t(e,o).catch((function(e){return n.reject({message:"Probably a network error, is the server down?",error:e})}));if(r.timeout){let e=new n((function(e,t){let n=setTimeout((function(){return clearTimeout(n),t({message:"Request timed out",timeout:r.timeout})}),r.timeout)}));a=n.race([a,e])}return a.then((function(e){return e.ok?typeof r.success==typeof i.noop?e.json().then((function(e){try{r.success(e)}catch(e){i.error("Unhandled httpAPICall success callback error",e)}}),(function(t){return n.reject({message:"Failed to parse response body",error:t,response:e})})):void 0:n.reject({message:"API call failed",response:e})})).catch((function(e){typeof r.error==typeof i.noop&&r.error(e.message||"<< internal error >>",e)})),a}}},i.useOldDependencies=function(e){let t=e&&e.jQuery||jQuery,n=e&&e.WebSocket||WebSocket;return{newWebSocket:function(e,t){return new n(e,t)},isArray:function(e){return t.isArray(e)},extension:e&&e.extension||o,webRTCAdapter:e&&e.adapter||adapter,httpAPICall:function(e,n){let r=void 0!==n.body?{contentType:"application/json",data:JSON.stringify(n.body)}:{},o=void 0!==n.withCredentials?{xhrFields:{withCredentials:n.withCredentials}}:{};return t.ajax(t.extend(r,o,{url:e,type:n.verb,cache:!1,dataType:"json",async:n.async,timeout:n.timeout,success:function(e){typeof n.success==typeof i.noop&&n.success(e)},error:function(e,t,r){typeof n.error==typeof i.noop&&n.error(t,r)}}))}}},i.mediaToTracks=function(e){let t=[];if(e){if(!e.keepAudio&&!1!==e.audio&&(void 0===e.audio||e.audio||e.audioSend||e.audioRecv||e.addAudio||e.replaceAudio||e.removeAudio)){let n={type:"audio"};e.removeAudio?n.remove=!0:(e.addAudio?n.add=!0:e.replaceAudio&&(n.replace=!0),!1!==e.audioSend&&(n.capture=e.audio||!0),!1!==e.audioRecv&&(n.recv=!0)),(n.remove||n.capture||n.recv)&&t.push(n)}if(!e.keepVideo&&!1!==e.video&&(void 0===e.video||e.video||e.videoSend||e.videoRecv||e.addVideo||e.replaceVideo||e.removeVideo)){let n={type:"video"};e.removeVideo?n.remove=!0:(e.addVideo?n.add=!0:e.replaceVideo&&(n.replace=!0),!1!==e.videoSend&&(n.capture=e.video||!0,["screen","window","desktop"].includes(n.capture)&&(n.type="screen",n.capture={video:{}},e.screenshareFrameRate&&(n.capture.frameRate=e.screenshareFrameRate),e.screenshareHeight&&(n.capture.height=e.screenshareHeight),e.screenshareWidth&&(n.capture.width=e.screenshareWidth))),!1!==e.videoRecv&&(n.recv=!0)),(n.remove||n.capture||n.recv)&&t.push(n)}e.data&&t.push({type:"data"})}else t.push({type:"audio",capture:!0,recv:!0}),t.push({type:"video",capture:!0,recv:!0});return t},i.trackConstraints=function(e){let t={};if(!e||!e.capture)return t;if("audio"===e.type)t.audio=e.capture;else if("video"===e.type)if((e.simulcast||e.svc)&&!0===e.capture&&(e.capture="hires"),!0===e.capture||"object"==typeof e.capture)t.video=e.capture;else{let n=0,r=0;"lowres"===e.capture?(n=320,r=240):"lowres-16:9"===e.capture?(n=320,r=180):"hires"===e.capture||"hires-16:9"===e.capture||"hdres"===e.capture?(n=1280,r=720):"fhdres"===e.capture?(n=1920,r=1080):"4kres"===e.capture?(n=3840,r=2160):"stdres"===e.capture?(n=640,r=480):"stdres-16:9"===e.capture?(n=640,r=360):(i.log("Default video setting is stdres 4:3"),n=640,r=480),t.video={width:{ideal:n},height:{ideal:r}}}else"screen"===e.type&&(t.video=e.capture);return t},i.noop=function(){},i.dataChanDefaultLabel="JanusDataChannel",i.endOfCandidates=null,i.stopAllTracks=function(e){try{let t=e.getTracks();for(let e of t)i.log(e),e&&!0!==e.dontStop&&e.stop()}catch(e){}},i.init=function(e){if((e=e||{}).callback="function"==typeof e.callback?e.callback:i.noop,i.initDone)e.callback();else{if(void 0===console.log&&(console.log=function(){}),i.trace=i.noop,i.debug=i.noop,i.vdebug=i.noop,i.log=i.noop,i.warn=i.noop,i.error=i.noop,!0===e.debug||"all"===e.debug)i.trace=console.trace.bind(console),i.debug=console.debug.bind(console),i.vdebug=console.debug.bind(console),i.log=console.log.bind(console),i.warn=console.warn.bind(console),i.error=console.error.bind(console);else if(Array.isArray(e.debug))for(let t of e.debug)switch(t){case"trace":i.trace=console.trace.bind(console);break;case"debug":i.debug=console.debug.bind(console);break;case"vdebug":i.vdebug=console.debug.bind(console);break;case"log":i.log=console.log.bind(console);break;case"warn":i.warn=console.warn.bind(console);break;case"error":i.error=console.error.bind(console);break;default:console.error("Unknown debugging option '"+t+"' (supported: 'trace', 'debug', 'vdebug', 'log', warn', 'error')")}i.log("Initializing library");let t=e.dependencies||i.useDefaultDependencies();i.isArray=t.isArray,i.webRTCAdapter=t.webRTCAdapter,i.httpAPICall=t.httpAPICall,i.newWebSocket=t.newWebSocket,i.extension=t.extension,i.extension.init(),i.listDevices=function(e,t){e="function"==typeof e?e:i.noop,t||(t={audio:!0,video:!0}),i.isGetUserMediaAvailable()?navigator.mediaDevices.getUserMedia(t).then((function(t){navigator.mediaDevices.enumerateDevices().then((function(n){i.debug(n),e(n),i.stopAllTracks(t)}))})).catch((function(t){i.error(t),e([])})):(i.warn("navigator.mediaDevices unavailable"),e([]))},i.attachMediaStream=function(e,t){try{e.srcObject=t}catch(n){try{e.src=URL.createObjectURL(t)}catch(e){i.error("Error attaching stream to element",e)}}},i.reattachMediaStream=function(e,t){try{e.srcObject=t.srcObject}catch(n){try{e.src=t.src}catch(e){i.error("Error reattaching stream to element",e)}}};let n=["iPad","iPhone","iPod"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",r=window["on"+n];if(window.addEventListener(n,(function(){i.log("Closing window");for(let e in i.sessions)i.sessions[e]&&i.sessions[e].destroyOnUnload&&(i.log("Destroying session "+e),i.sessions[e].destroy({unload:!0,notifyDestroyed:!1}));r&&"function"==typeof r&&r()})),i.safariVp8=!1,"safari"===i.webRTCAdapter.browserDetails.browser&&i.webRTCAdapter.browserDetails.version>=605)if(RTCRtpSender&&RTCRtpSender.getCapabilities&&RTCRtpSender.getCapabilities("video")&&RTCRtpSender.getCapabilities("video").codecs&&RTCRtpSender.getCapabilities("video").codecs.length){for(let e of RTCRtpSender.getCapabilities("video").codecs)if(e&&e.mimeType&&"video/vp8"===e.mimeType.toLowerCase()){i.safariVp8=!0;break}i.safariVp8?i.log("This version of Safari supports VP8"):i.warn("This version of Safari does NOT support VP8: if you're using a Technology Preview, try enabling the 'WebRTC VP8 codec' setting in the 'Experimental Features' Develop menu")}else{let e=new RTCPeerConnection({});e.createOffer({offerToReceiveVideo:!0}).then((function(t){i.safariVp8=-1!==t.sdp.indexOf("VP8"),i.safariVp8?i.log("This version of Safari supports VP8"):i.warn("This version of Safari does NOT support VP8: if you're using a Technology Preview, try enabling the 'WebRTC VP8 codec' setting in the 'Experimental Features' Develop menu"),e.close(),e=null}))}i.initDone=!0,e.callback()}},i.isWebrtcSupported=function(){return!!window.RTCPeerConnection},i.isGetUserMediaAvailable=function(){return navigator.mediaDevices&&navigator.mediaDevices.getUserMedia},i.randomString=function(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n="";for(let r=0;r<e;r++){let e=Math.floor(62*Math.random());n+=t.charAt(e)}return n};const a={agentId:"",agentKey:"",companyId:"",agentType:"",token:"",wsServer:"",webrtcServer:"",sipServer:"",agentCode:"",sipPwd:"",groupId:"",groupIds:[]};const s=new class{instance=null;socket=null;janus=null;sipcall=null;stream=null;events={};seat={};status=e.LOGIN;lastStatus=e.LOGIN;reconnectState=null;autoAcceptTimer=null;code=0;msg=null;jsep=null;constructor(){if(this.instance)return this.instance;this.instance=this}_init(e){this.seat={...a,...e},this._initMedia();const t=`${this.seat.wsServer}?token=${this.seat.token}`;this.connectWs(t)}_initMedia(){const e=document.getElementById("mediaContainer");e&&(e.parentNode.removeChild(e),console.log("["+this.datelog()+"] 清理旧的媒体容器"));const t=document.createElement("div");t.id="mediaContainer",t.style.width="0px",t.style.height="0px",t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.zIndex="-1",t.style.visibility="hidden",t.style.overflow="hidden",document.body.appendChild(t);const n=document.createElement("audio");n.id="incomingcallAudio",n.loop=!0,n.src="https://r.hanfatong.com/voicenine/beep.mp3",t.appendChild(n);const r=document.createElement("video");r.id="peerVideo",r.autoplay=!0,t.appendChild(r);const o=document.createElement("video");o.id="remoteVideo",o.autoplay=!0,t.appendChild(o)}_initJanus(){const{webrtcServer:t,sipServer:n}=this.seat;if(!t||!n)return void console.error("WebRTC server or SIP server is not configured.");let r={},o={},a=0,s=!1;i.init({debug:"all",callback:()=>{console.log("["+this.datelog()+"] Janus initialized.");if(!i.isWebrtcSupported())return void console.info("No WebRTC support... ");const n=new i({server:t,success:()=>{i.attach({plugin:"janus.plugin.sip",opaqueId:"voicenine_"+i.randomString(16),success:e=>{console.log("["+this.datelog()+"] SIP plugin attached."),i.log("Plugin attached! ("+e.getPlugin()+", id="+e.getId()+")");const t={request:"register",username:this.seat.agentCode,authuser:this.seat.agentCode,display_name:this.seat.agentCode,secret:this.seat.sipPwd};e.send({message:t}),this.sipcall=e},onmessage:(t,n)=>{i.debug(" ::: Got a message :::",t);const{call_id:r,result:o}=t;if(o?.event){const a=o.event;if(this.msg=null,this.jsep=null,"registration_failed"===a)i.warn("Registration failed: "+o.code+" "+o.reason);else if("registered"===a)i.log("Successfully registered as "+o.username+"!"),s||(s=!0,o.master_id);else if("calling"===a)i.log("Waiting for the peer to answer...");else if("incomingcall"===a){i.log("Incoming call from "+o.username+"!"),this.sipcall.callId=r,this.toggleRing(!0),this.msg=t,this.jsep=n;const a=()=>{2==this.seat.workType||this.status===e.OUT_CALL||this.status===e.OUT_CALLER_RING?(this.autoAcceptTimer&&clearTimeout(this.autoAcceptTimer),this.accept(t,n)):this.status!==e.READY&&this.status!==e.NOT_READY&&this.status!==e.WORK_NOT_READY&&this.status!==e.AFTER||(this.autoAcceptTimer&&clearTimeout(this.autoAcceptTimer),this.autoAcceptTimer=setTimeout((()=>a()),50))};2==this.seat.loginType&&a()}else if("accepting"===a);else if("progress"===a)i.log("There's early media from "+o.username+", wairing for the call!",n),n&&this.sipcall.handleRemoteJsep({jsep:n});else if("accepted"===a)i.log(o.username+" accepted the call!",n),this.toggleRing(!1),n&&this.sipcall.handleRemoteJsep({jsep:n}),this.sipcall.callId=r;else if("updatingcall"===a){i.log("Got re-INVITE");const e=n.sdp.indexOf("m=audio ")>-1,t=n.sdp.indexOf("m=video ")>-1,r=[];e&&!this.sipcall.doAudio&&(this.sipcall.doAudio=!0,r.push({type:"audio",capture:!0,recv:!0})),t&&!this.sipcall.doVideo&&(this.sipcall.doVideo=!0,r.push({type:"video",capture:!0,recv:!0})),this.sipcall.createAnswer({jsep:n,tracks:r,success:n=>{i.debug("Got SDP "+n.type+"! audio="+e+", video="+t+":",n);this.sipcall.send({message:{request:"update"},jsep:n})},error:e=>{i.error("WebRTC error:",e)}})}else if("message"===a){let e=o.displayname?o.displayname:o.sender,t=o.content;console.info("sender = "+e),console.info("content = "+t)}else if("info"===a){let e=o.displayname?o.displayname:o.sender,t=o.content;t=t.replace(new RegExp("<","g"),"&lt"),t=t.replace(new RegExp(">","g"),"&gt"),console.log("["+this.datelog()+"] sender = "+e+", content = "+t)}else"notify"===a||"transfer"===a||"hangup"===a&&(i.log("Call hung up ("+o.code+" "+o.reason+")!"),setTimeout((()=>{this.toggleRing(!1)}),0),setTimeout((()=>{this.sipcall&&this.sipcall.hangup()}),150))}},onlocaltrack:(e,t)=>{i.log("Local track "+(t?"added":"removed")+":",e);const n=e.id.replace(/[{}]/g,"");if(!t){if(this.stream=r[n],this.stream)try{const e=this.stream.getTracks(),t=e.some((e=>"audio"===e.kind&&e.getSettings().deviceId&&e.label.toLowerCase().includes("bluetooth")));setTimeout((()=>{e.forEach((e=>{e&&"ended"!==e.readyState&&("audio"===e.kind?(e.enabled=!1,setTimeout((()=>e.stop()),50)):e.stop())}))}),t?300:100)}catch(e){console.error(e)}return"video"===e.kind&&(a--,0===a&&console.log("No video")),void delete r[n]}if(this.stream=r[n],!this.stream){if("audio"===e.kind);else{a++,this.stream=new MediaStream([e]),r[n]=this.stream,i.log("Created local stream:",this.stream);let t=document.getElementById("remoteVideo");i.attachMediaStream(t,this.stream)}"completed"!==this.sipcall.webrtcStuff.pc.iceConnectionState&&this.sipcall.webrtcStuff.pc.iceConnectionState}},onremotetrack:function(e,t,n){if(i.log("Remote track (mid="+t+") "+(n?"added":"removed")+":",e),n&&"audio"===e.kind){this.stream=new MediaStream([e]),o[t]=this.stream,i.log("Created remote audio stream:",this.stream);let n=document.getElementById("peerVideo");i.attachMediaStream(n,this.stream)}},oncleanup:()=>{i.log(" ::: Got a cleanup notification :::"),setTimeout((()=>{this.sipcall&&(delete this.sipcall.callId,delete this.sipcall.doAudio)}),50),setTimeout((()=>{Object.values(r).forEach((e=>{if(e){e.getTracks().forEach((e=>{"ended"!==e.readyState&&e.stop()}))}}))}),100),setTimeout((()=>{r={},o={},a=0,this.stream=null}),200)},error:e=>{i.error(" -- Error attaching plugin...",e)},consentDialog:function(e){i.debug("Consent dialog should be "+(e?"on":"off")+" now")},webrtcTimeout:function(e){console.log("-=========="+e)},iceState:function(e){i.log("ICE state changed to "+e)},mediaState:function(e,t,n){i.log("janus "+(t?"started":"stopped")+" receiving our "+e+" (mid="+n+")")},webrtcState:function(e){i.log("janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},slowLink:function(e,t,n){i.warn("janus reports problems "+(e?"sending":"receiving")+" packets on mid "+n+" ("+t+" lost packets)")}})},error:function(e){i.error(e)},destroyed:function(){console.info("destroyed===========")}});this.janus=n,window.Janus=i}})}accept(e,t){(0,this.sipcall.createAnswer)({jsep:t,media:{audio:!0,video:!1},success:e=>{this.sipcall.send({message:{request:"accept"},jsep:e})},error:e=>{i.error("WebRTC error:",e);this.sipcall.send({message:{request:"decline",code:480}})}}),this.autoAcceptTimer&&clearTimeout(this.autoAcceptTimer)}echo(e){this.socket?(console.log("["+this.datelog()+"] sent: "+e),this.socket.send(e)):alert("WebSocket connection not established, please connect.")}toggleRing(e){const t=document.getElementById("incomingcallAudio");e?t.play():t.pause()}connectWs(t){if(console.log("["+this.datelog()+"] 连接WebSocket: "+t),!window.WebSocket)return void alert("您的浏览器不支持WebSocket协议!");const n=new WebSocket(t);this.socket=n,n.onmessage=t=>{console.log("["+this.datelog()+"] received: "+t.data);const n=JSON.parse(t.data);this.onmessage(n);let r=n.type;e[r]&&(0===n.code&&(this.lastStatus=this.status,this.status=r,console.log("["+this.datelog()+"] 状态变更: "+this.lastStatus+" -> "+this.status)),this.handleStatusChange(n))};let r=null;n.onopen=()=>{console.log("["+this.datelog()+"] Info: WebSocket connection opened."),this.clearReconectStatus();this.sendAction(e.LOGIN),r=setInterval((()=>{let e={cmd:"ping",agentKey:this.seat.agentKey,sequence:(new Date).getTime()};this.echo(JSON.stringify(e))}),5e3)},n.onclose=e=>{console.log("["+this.datelog()+"] Info: WebSocket connection closed, Code: "+e.code+(""==e.reason?"":", Reason: "+e.reason)),this.reconectInterval&&clearInterval(this.reconectInterval),r&&clearInterval(r);this.trigger("logout",this.code),2===this.seat.loginType&&i.destroy(),[1403,1105,1417].includes(this.code)?console.log("["+this.datelog()+"] 不自动重连"):this.reconectInterval=setInterval((()=>{2===this.seat.loginType&&i.destroy();const e=`${this.seat.wsServer}?token=${this.seat.token}`;this.connectWs(e)}),5e3)}}changeStatus(e){this.echo(`{"cmd":"${e}", "agentKey": "${this.seat.agentKey}", "sequence": ${(new Date).getTime()} }`),this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval)}handleStatusChange(t){const{type:n,message:r,code:o,data:i}=t;if(n===e.LOGIN)2===this.seat.loginType&&0===o&&this._initJanus(),null==this.reconnectState?this.sendAction(i.loginState):this.sendAction(this.reconnectState);else if(n===e.AFTER){2===i.loginType&&0===i.answerTime&&("404"!==i.sipStatus&&"483"!==i.sipStatus||this._initJanus());const t=i.afterInterval||3;this.afterPhoneInterval=setTimeout((()=>{this.status===e.AFTER&&(console.log("["+this.datelog()+"] 话后自动空闲"),this.sendAction(e.READY))}),1e3*t)}else n===e.OUT_CALL||(n===e.READY||n===e.NOT_READY||n===e.WORK_NOT_READY)&&(this.reconnectState=n);this.trigger("state",t),this.trigger(n,t)}sendAction(e,n){let r={cmd:e,agentKey:this.seat.agentKey,sequence:(new Date).getTime()};if(e===t.login)r={...r,loginType:this.seat.loginType,workType:this.seat.workType},this.status&&this.status.includes("TALKING")&&(r.callId=n.callId);else if(e===t.call){this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval);const{telNum:e,display:t="",followData:o}=n||{};r={...r,called:e,display:t,callType:1,followData:o||{}}}else if(e===t.transfer){let{transferValue:e,transferType:t="4"}=n||{};e.includes("@")&&(t="3"),r={...r,transferType:t,transferValue:e}}else if(e===t.consult){const{consultValue:e}=n||{};let t="2";e.includes("@")&&(t="4"),r={...r,callId:n.callId,transferType:t,consultValue:e}}else if(e===t.consult_cancel);else if(e===t.consult_party)r.callId=n.callId;else if(e===t.consult_transfer)r.callId=n.callId;else if(e===t.busy_work){const{busyDesc:e}=n||{};r={...r,busyDesc:e,callId:n.callId}}else if(e===t.ready)this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval);else if(e===t.busy)this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval);else if(e===t.conference_remove){const{deviceId:t,callId:o,conference:i,memberId:a,username:s}=n||{};r={cmd:e,callId:o,deviceId:t,conference:i,memberId:a,username:s}}else{if(e===t.logout){const e=JSON.stringify(r);return this.echo(e),void(2===this.seat.loginType&&this.janus.destroy&&this.janus.destroy())}e===t.followdata&&(r={...r,callId:n.callId,followData:n.followData||{}})}const o=JSON.stringify(r);this.echo(o)}clearReconectStatus(){this.reconectInterval&&clearInterval(this.reconectInterval)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}trigger(e,t){this.events[e]&&this.events[e].forEach((e=>e(t)))}onmessage(e){this.trigger("message",e)}datelog(){var e=new Date,t=e.getFullYear(),n=e.getMonth()+1,r=e.getDate(),o=e.getHours(),i=e.getMinutes(),a=e.getSeconds(),s=e.getMilliseconds();return n<10&&(n="0"+n),r<10&&(r="0"+r),o<10&&(o="0"+o),i<10&&(i="0"+i),a<10&&(a="0"+a),s<10?s+="00":s<100&&(s+="0"),t+"-"+n+"-"+r+" "+o+":"+i+":"+a+"."+s}};class c{instance=null;static _version_="1.1.8";static _enum_={state:e,btn:t,label:n};constructor(){if(this.instance)return this.instance;this.instance=this,this.on("state",(e=>this._stateHandler(e)))}get status(){return s.status}get enum(){return c._enum_}init(e){console.log("["+s.datelog()+"] voice9 init",e),s._init(e)}logout(){s.sendAction(t.logout)}setBusy(){s.sendAction(t.busy)}setReady(){s.sendAction(t.ready)}setWorkNotReady(e){s.sendAction(t.busy_work,{busyDesc:e})}call(e,n={}){s.sendAction(t.call,{telNum:e,...n})}answer(){s.accept(s.msg,s.jsep)}sendDtmf(e,t){const n={cmd:"dtmf",dtmf:e,callId:t,agentKey:s.seat.agentKey,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}hangup(){s.sendAction(t.hangup)}transfer(e,n={}){s.sendAction(t.transfer,{transferValue:e,...n})}consult(e,n={}){s.sendAction(t.consult,{telNum:e,...n})}cancelConsult(){s.sendAction(t.consult_cancel)}stopConsult(){s.sendAction(t.consult_stop)}consultTransfer(e,n={}){s.sendAction(t.consult_transfer,{transferValue:e,...n})}consultParty(){s.sendAction(t.consult_party)}mute(){s.sendAction(t.mute)}muteCancel(){s.sendAction(t.mute_cancel)}hold(){s.sendAction(t.hold)}holdCancel(){s.sendAction(t.hold_cancel)}monitor(e,t){const n={cmd:"MONITOR_CALL",callId:t,agentKey:s.seat.agentKey,monitorAgent:e,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}intercept(){s.sendAction("INTERCEPT_CALL")}barge(e,t){const n={cmd:"BARGE_CALL",callId:t,agentKey:s.seat.agentKey,monitorAgent:e,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}coach(e,t){const n={cmd:"COACH_CALL",callId:t,agentKey:s.seat.agentKey,monitorAgent:e,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}updateFollowData(e,t,n,r,o,i,a,c){const d={cmd:"UPDATE_FOLLOWDATA",followData:e,uuid1:t,uuid2:n,ext1:r,ext2:o,ext3:i,ext4:a,ext5:c,agentKey:s.seat.agentKey,sequence:(new Date).getTime()};s.echo(JSON.stringify(d))}action(e,t){s.sendAction(e,t)}message(e){s.echo(JSON.stringify(e))}on(e,t){s.on(e,t)}off(e,t){if(!s.events[e])return;if(!t)return void(s.events[e]=[]);const n=s.events[e].indexOf(t);n>-1&&s.events[e].splice(n,1)}emit(e,t){s.trigger(e,t)}_stateHandler(t){const{type:n,code:o}=t;if(s.events.btnstate){const e=r[n]||[];s.events.btnstate.forEach((t=>t(e)))}if(s.events.agentstate){let t=n;t===e.LOGIN&&0!==Number(o)&&(t=""),s.events.agentstate.forEach((e=>e(t)))}}}export{c as VoiceNine};
1
+ const e={LOGIN:"LOGIN",LOGOUT:"LOGOUT",READY:"READY",NOT_READY:"NOT_READY",WORK_NOT_READY:"WORK_NOT_READY",AFTER:"AFTER",OUT_CALL:"OUT_CALL",OUT_CALLER_RING:"OUT_CALLER_RING",OUT_CALLED_RING:"OUT_CALLED_RING",PLAY_AGENT_ID:"PLAY_AGENT_ID",TALKING:"TALKING",MUTE_TALKING:"MUTE_TALKING",HOLD_TALKING:"HOLD_TALKING",INNER_CALL_RING:"INNER_CALL_RING",INNER_CALL_TALKING:"INNER_CALL_TALKING",INBOUND_RING:"INBOUND_RING",TRANSFER:"TRANSFER",TRANSFERED_RING:"TRANSFERED_RING",TRANSFER_OUT_RING:"TRANSFER_OUT_RING",TRANSFERED_TALKING:"TRANSFERED_TALKING",CONSULT:"CONSULT",CONSULT_RING:"CONSULT_RING",CONSULT_OUT_RING:"CONSULT_OUT_RING",CONSULT_IVR:"CONSULT_IVR",CONSULT_TALKING:"CONSULT_TALKING",CONSULTED_TALKING:"CONSULTED_TALKING",CONFERENCE_TALKING:"CONFERENCE_TALKING"},t={ready:"READY",busy:"NOT_READY",busy_work:"WORK_NOT_READY",login:"LOGIN",logout:"LOGOUT",call:"MAKE_CALL",hangup:"HANGUP_CALL",answer:"ANSWER",hold:"HOLD",hold_cancel:"HOLD_CANCEL",mute:"MUTE",mute_cancel:"MUTE_CANCEL",transfer:"TRANSFER",transfer_cancel:"TRANSFER_CANCEL",consult:"CONSULT",consult_party:"CONSULT_PARTY",consult_transfer:"CONSULT_TRANSFER",consult_cancel:"CONSULT_CANCEL",consult_stop:"CONSULT_STOP",conference_remove:"CONFERENCE_REMOVE",followdata:"UPDATE_FOLLOWDATA"},n={[e.LOGIN]:"已登录",[e.LOGOUT]:"已退出",[e.READY]:"空闲",[e.NOT_READY]:"忙碌",[e.WORK_NOT_READY]:"自定义忙碌",[e.AFTER]:"话后",[e.OUT_CALL]:"外呼中",[e.OUT_CALLER_RING]:"外呼主叫振铃",[e.OUT_CALLED_RING]:"外呼被叫振铃",[e.PLAY_AGENT_ID]:"播放坐席工号",[e.TALKING]:"通话中",[e.MUTE_TALKING]:"静音中",[e.HOLD_TALKING]:"保持中",[e.INNER_CALL_RING]:"内呼来电振铃",[e.INNER_CALL_TALKING]:"内呼通话中",[e.INBOUND_RING]:"来电振铃",[e.TRANSFER]:"转接中",[e.TRANSFERED_RING]:"转接来电振铃",[e.TRANSFER_OUT_RING]:"转接外呼振铃",[e.TRANSFERED_TALKING]:"转接来电通话中",[e.CONSULT]:"咨询中",[e.CONSULT_RING]:"咨询来电振铃",[e.CONSULT_OUT_RING]:"咨询外呼振铃",[e.CONSULT_IVR]:"咨询IVR",[e.CONSULT_TALKING]:"咨询通话中",[e.CONSULTED_TALKING]:"来电咨询中",[e.CONFERENCE_TALKING]:"多方通话"},r={[e.LOGIN]:[t.call],[e.LOGOUT]:[],[e.READY]:[t.call],[e.NOT_READY]:[t.call],[e.WORK_NOT_READY]:[t.call],[e.AFTER]:[t.call],[e.OUT_CALL]:[t.hangup],[e.OUT_CALLER_RING]:[t.answer,t.hangup],[e.OUT_CALLED_RING]:[t.hangup],[e.PLAY_AGENT_ID]:[t.hangup],[e.TALKING]:[t.hangup,t.hold,t.mute,t.transfer,t.consult],[e.MUTE_TALKING]:[t.mute_cancel],[e.HOLD_TALKING]:[t.hold_cancel],[e.INNER_CALL_RING]:[t.hangup,t.answer],[e.INNER_CALL_TALKING]:[t.hangup,t.mute],[e.INBOUND_RING]:[t.hangup,t.answer],[e.TRANSFER]:[t.transfer_cancel],[e.TRANSFERED_RING]:[t.hangup,t.answer],[e.TRANSFER_OUT_RING]:[t.transfer_cancel],[e.TRANSFERED_TALKING]:[t.hangup,t.mute,t.transfer,t.consult],[e.CONSULT]:[t.consult_cancel],[e.CONSULT_RING]:[t.hangup,t.answer],[e.CONSULT_OUT_RING]:[t.consult_cancel],[e.CONSULT_IVR]:[t.hangup,t.consult_cancel],[e.CONSULT_TALKING]:[t.hangup,t.mute,t.consult_party,t.consult_transfer],[e.CONSULTED_TALKING]:[t.hangup,t.mute],[e.CONFERENCE_TALKING]:[t.hangup,t.mute,t.consult]};!function(e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).adapter=e()}((function(){return function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(i)return i(a,!0);throw(c=new Error("Cannot find module '"+a+"'")).code="MODULE_NOT_FOUND",c}c=n[a]={exports:{}},t[a][0].call(c.exports,(function(e){return o(t[a][1][e]||e)}),c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(e,t,n){e=(0,e("./adapter_factory.js").adapterFactory)({window:"undefined"==typeof window?void 0:window}),t.exports=e},{"./adapter_factory.js":2}],2:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.adapterFactory=function(){var e=(0<arguments.length&&void 0!==arguments[0]?arguments[0]:{}).window,t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimSafari:!0},n=r.log,d=r.detectBrowser(e),l={browserDetails:d,commonShim:s,extractVersion:r.extractVersion,disableLog:r.disableLog,disableWarnings:r.disableWarnings,sdp:c};switch(d.browser){case"chrome":if(!o||!o.shimPeerConnection||!t.shimChrome)return n("Chrome shim is not included in this adapter release."),l;if(null===d.version)return n("Chrome shim can not determine version, not shimming."),l;n("adapter.js shimming chrome."),l.browserShim=o,s.shimAddIceCandidateNullOrEmpty(e,d),s.shimParameterlessSetLocalDescription(e,d),o.shimGetUserMedia(e,d),o.shimMediaStream(e,d),o.shimPeerConnection(e,d),o.shimOnTrack(e,d),o.shimAddTrackRemoveTrack(e,d),o.shimGetSendersWithDtmf(e,d),o.shimGetStats(e,d),o.shimSenderReceiverGetStats(e,d),o.fixNegotiationNeeded(e,d),s.shimRTCIceCandidate(e,d),s.shimConnectionState(e,d),s.shimMaxMessageSize(e,d),s.shimSendThrowTypeError(e,d),s.removeExtmapAllowMixed(e,d);break;case"firefox":if(!i||!i.shimPeerConnection||!t.shimFirefox)return n("Firefox shim is not included in this adapter release."),l;n("adapter.js shimming firefox."),l.browserShim=i,s.shimAddIceCandidateNullOrEmpty(e,d),s.shimParameterlessSetLocalDescription(e,d),i.shimGetUserMedia(e,d),i.shimPeerConnection(e,d),i.shimOnTrack(e,d),i.shimRemoveStream(e,d),i.shimSenderGetStats(e,d),i.shimReceiverGetStats(e,d),i.shimRTCDataChannel(e,d),i.shimAddTransceiver(e,d),i.shimGetParameters(e,d),i.shimCreateOffer(e,d),i.shimCreateAnswer(e,d),s.shimRTCIceCandidate(e,d),s.shimConnectionState(e,d),s.shimMaxMessageSize(e,d),s.shimSendThrowTypeError(e,d);break;case"safari":if(!a||!t.shimSafari)return n("Safari shim is not included in this adapter release."),l;n("adapter.js shimming safari."),l.browserShim=a,s.shimAddIceCandidateNullOrEmpty(e,d),s.shimParameterlessSetLocalDescription(e,d),a.shimRTCIceServerUrls(e,d),a.shimCreateOfferLegacy(e,d),a.shimCallbacksAPI(e,d),a.shimLocalStreamsAPI(e,d),a.shimRemoteStreamsAPI(e,d),a.shimTrackEventTransceiver(e,d),a.shimGetUserMedia(e,d),a.shimAudioContext(e,d),s.shimRTCIceCandidate(e,d),s.shimMaxMessageSize(e,d),s.shimSendThrowTypeError(e,d),s.removeExtmapAllowMixed(e,d);break;default:n("Unsupported browser!")}return l};var r=d(e("./utils")),o=d(e("./chrome/chrome_shim")),i=d(e("./firefox/firefox_shim")),a=d(e("./safari/safari_shim")),s=d(e("./common_shim")),c=d(e("sdp"));function d(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}},{"./chrome/chrome_shim":3,"./common_shim":6,"./firefox/firefox_shim":7,"./safari/safari_shim":10,"./utils":11,sdp:12}],3:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=n.shimGetUserMedia=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=e("./getusermedia");Object.defineProperty(n,"shimGetUserMedia",{enumerable:!0,get:function(){return o.shimGetUserMedia}});var i=e("./getdisplaymedia");Object.defineProperty(n,"shimGetDisplayMedia",{enumerable:!0,get:function(){return i.shimGetDisplayMedia}}),n.shimMediaStream=function(e){e.MediaStream=e.MediaStream||e.webkitMediaStream},n.shimOnTrack=function(e){var t;"object"!==(void 0===e?"undefined":r(e))||!e.RTCPeerConnection||"ontrack"in e.RTCPeerConnection.prototype?a.wrapPeerConnectionEvent(e,"track",(function(e){return e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e})):(Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0}),t=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(){var n=this;return this._ontrackpoly||(this._ontrackpoly=function(t){t.stream.addEventListener("addtrack",(function(r){var o=e.RTCPeerConnection.prototype.getReceivers?n.getReceivers().find((function(e){return e.track&&e.track.id===r.track.id})):{track:r.track},i=new Event("track");i.track=r.track,i.receiver=o,i.transceiver={receiver:o},i.streams=[t.stream],n.dispatchEvent(i)})),t.stream.getTracks().forEach((function(r){var o=e.RTCPeerConnection.prototype.getReceivers?n.getReceivers().find((function(e){return e.track&&e.track.id===r.id})):{track:r},i=new Event("track");i.track=r,i.receiver=o,i.transceiver={receiver:o},i.streams=[t.stream],n.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)})},n.shimGetSendersWithDtmf=function(e){var t,n,o,i,a,s;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype?(t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}},e.RTCPeerConnection.prototype.getSenders||(e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()},n=e.RTCPeerConnection.prototype.addTrack,e.RTCPeerConnection.prototype.addTrack=function(e,r){var o=n.apply(this,arguments);return o||(o=t(this,e),this._senders.push(o)),o},o=e.RTCPeerConnection.prototype.removeTrack,e.RTCPeerConnection.prototype.removeTrack=function(e){o.apply(this,arguments),-1!==(e=this._senders.indexOf(e))&&this._senders.splice(e,1)}),i=e.RTCPeerConnection.prototype.addStream,e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._senders=this._senders||[],i.apply(this,[e]),e.getTracks().forEach((function(e){n._senders.push(t(n,e))}))},a=e.RTCPeerConnection.prototype.removeStream,e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;this._senders=this._senders||[],a.apply(this,[e]),e.getTracks().forEach((function(e){var n=t._senders.find((function(t){return t.track===e}));n&&t._senders.splice(t._senders.indexOf(n),1)}))}):"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)&&(s=e.RTCPeerConnection.prototype.getSenders,e.RTCPeerConnection.prototype.getSenders=function(){var e=this,t=s.apply(this,[]);return t.forEach((function(t){return t._pc=e})),t},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}}))},n.shimGetStats=function(e){var t;e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype.getStats,e.RTCPeerConnection.prototype.getStats=function(){var e=this,n=(o=Array.prototype.slice.call(arguments))[0],r=o[1],o=o[2];if(0<arguments.length&&"function"==typeof n)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof n))return t.apply(this,[]);var i=function(e){var t={};return e.result().forEach((function(e){var n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((function(t){n[t]=e.stat(t)})),t[n.id]=n})),t},a=function(e){return new Map(Object.keys(e).map((function(t){return[t,e[t]]})))};return 2<=arguments.length?t.apply(this,[function(e){r(a(i(e)))},n]):new Promise((function(n,r){t.apply(e,[function(e){n(a(i(e)))},r])})).then(r,o)})},n.shimSenderReceiverGetStats=function(e){var t,n,o,i;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver&&("getStats"in e.RTCRtpSender.prototype||((t=e.RTCPeerConnection.prototype.getSenders)&&(e.RTCPeerConnection.prototype.getSenders=function(){var e=this,n=t.apply(this,[]);return n.forEach((function(t){return t._pc=e})),n}),(n=e.RTCPeerConnection.prototype.addTrack)&&(e.RTCPeerConnection.prototype.addTrack=function(){var e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){var e=this;return this._pc.getStats().then((function(t){return a.filterStats(t,e.track,!0)}))}),"getStats"in e.RTCRtpReceiver.prototype||((o=e.RTCPeerConnection.prototype.getReceivers)&&(e.RTCPeerConnection.prototype.getReceivers=function(){var e=this,t=o.apply(this,[]);return t.forEach((function(t){return t._pc=e})),t}),a.wrapPeerConnectionEvent(e,"track",(function(e){return e.receiver._pc=e.srcElement,e})),e.RTCRtpReceiver.prototype.getStats=function(){var e=this;return this._pc.getStats().then((function(t){return a.filterStats(t,e.track,!1)}))}),"getStats"in e.RTCRtpSender.prototype&&"getStats"in e.RTCRtpReceiver.prototype&&(i=e.RTCPeerConnection.prototype.getStats,e.RTCPeerConnection.prototype.getStats=function(){if(0<arguments.length&&arguments[0]instanceof e.MediaStreamTrack){var t=arguments[0],n=void 0,r=void 0,o=void 0;return this.getSenders().forEach((function(e){e.track===t&&(n?o=!0:n=e)})),this.getReceivers().forEach((function(e){return e.track===t&&(r?o=!0:r=e),e.track===t})),o||n&&r?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):n?n.getStats():r?r.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return i.apply(this,arguments)}))},n.shimAddTrackRemoveTrackWithNative=c,n.shimAddTrackRemoveTrack=function(e,t){if(e.RTCPeerConnection){if(e.RTCPeerConnection.prototype.addTrack&&65<=t.version)return c(e);var n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){var e=this,t=n.apply(this);return this._reverseStreams=this._reverseStreams||{},t.map((function(t){return e._reverseStreams[t.id]}))};var r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){var n,o=this;this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach((function(e){if(o.getSenders().find((function(t){return t.track===e})))throw new DOMException("Track already exists.","InvalidAccessError")})),this._reverseStreams[t.id]||(n=new e.MediaStream(t.getTracks()),this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n),r.apply(this,[t])};var o=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},o.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[(this._streams[e.id]||e).id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){var r=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");var o=[].slice.call(arguments,1);if(1!==o.length||!o[0].getTracks().find((function(e){return e===t})))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find((function(e){return e.track===t})))throw new DOMException("Track already exists.","InvalidAccessError");return this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},(o=this._streams[n.id])?(o.addTrack(t),Promise.resolve().then((function(){r.dispatchEvent(new Event("negotiationneeded"))}))):(o=new e.MediaStream([t]),this._streams[n.id]=o,this._reverseStreams[o.id]=n,this.addStream(o)),this.getSenders().find((function(e){return e.track===t}))},["createOffer","createAnswer"].forEach((function(t){var n=e.RTCPeerConnection.prototype[t],r=s({},t,(function(){var e=this,t=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[function(n){n=d(e,n),t[0].apply(null,[n])},function(e){t[1]&&t[1].apply(null,e)},arguments[2]]):n.apply(this,arguments).then((function(t){return d(e,t)}))}));e.RTCPeerConnection.prototype[t]=r[t]}));var i=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type&&(arguments[0]=(e=this,n=(t=arguments[0]).sdp,Object.keys(e._reverseStreams||[]).forEach((function(t){var r=e._reverseStreams[t];t=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),t.id)})),new RTCSessionDescription({type:t.type,sdp:n}))),i.apply(this,arguments);var e,t,n};var a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get:function(){var e=a.get.apply(this);return""===e.type?e:d(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){var t=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(e._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};var n=void 0;Object.keys(this._streams).forEach((function(r){t._streams[r].getTracks().find((function(t){return e.track===t}))&&(n=t._streams[r])})),n&&(1===n.getTracks().length?this.removeStream(this._reverseStreams[n.id]):n.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function d(e,t){var n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((function(t){var r=e._reverseStreams[t];t=e._streams[r.id];n=n.replace(new RegExp(t.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}},n.shimPeerConnection=function(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){var n=e.RTCPeerConnection.prototype[t],r=s({},t,(function(){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}));e.RTCPeerConnection.prototype[t]=r[t]}))},n.fixNegotiationNeeded=function(e,t){a.wrapPeerConnectionEvent(e,"negotiationneeded",(function(e){var n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))};var a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils.js"));function s(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){var e=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((function(t){return e._shimmedLocalStreams[t][0]}))};var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};var r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};var n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){var t=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach((function(e){if(t.getSenders().find((function(t){return t.track===e})))throw new DOMException("Track already exists.","InvalidAccessError")}));var r=this.getSenders();n.apply(this,arguments);var o=this.getSenders().filter((function(e){return-1===r.indexOf(e)}));this._shimmedLocalStreams[e.id]=[e].concat(o)};var r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};var o=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){var t=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((function(n){var r=t._shimmedLocalStreams[n].indexOf(e);-1!==r&&t._shimmedLocalStreams[n].splice(r,1),1===t._shimmedLocalStreams[n].length&&delete t._shimmedLocalStreams[n]})),o.apply(this,arguments)}}},{"../utils.js":11,"./getdisplaymedia":4,"./getusermedia":5}],4:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((function(t){var r=n.video&&n.video.width,o=n.video&&n.video.height,i=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:i||3}},r&&(n.video.mandatory.maxWidth=r),o&&(n.video.mandatory.maxHeight=o),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}},{}],5:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimGetUserMedia=function(e,t){var n,i,a,s,c=e&&e.navigator;c.mediaDevices&&(n=function(e){if("object"!==(void 0===e?"undefined":r(e))||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach((function(n){var o,i,a;"require"!==n&&"advanced"!==n&&"mediaSource"!==n&&(void 0!==(o="object"===r(e[n])?e[n]:{ideal:e[n]}).exact&&"number"==typeof o.exact&&(o.min=o.max=o.exact),i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t},void 0!==o.ideal&&(t.optional=t.optional||[],a={},"number"==typeof o.ideal?(a[i("min",n)]=o.ideal,t.optional.push(a),(a={})[i("max",n)]=o.ideal):a[i("",n)]=o.ideal,t.optional.push(a)),void 0!==o.exact&&"number"!=typeof o.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=o.exact):["min","max"].forEach((function(e){void 0!==o[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=o[e])})))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(61<=t.version)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===r(e.audio)&&((s=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])})((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),s(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=n(e.audio)),e&&"object"===r(e.video)){var a=(a=e.video.facingMode)&&("object"===(void 0===a?"undefined":r(a))?a:{ideal:a}),s=t.version<66;if(a&&("user"===a.exact||"environment"===a.exact||"user"===a.ideal||"environment"===a.ideal)&&(!c.mediaDevices.getSupportedConstraints||!c.mediaDevices.getSupportedConstraints().facingMode||s)){delete e.video.facingMode;var d=void 0;if("environment"===a.exact||"environment"===a.ideal?d=["back","rear"]:"user"!==a.exact&&"user"!==a.ideal||(d=["front"]),d)return c.mediaDevices.enumerateDevices().then((function(t){var r=(t=t.filter((function(e){return"videoinput"===e.kind}))).find((function(e){return d.some((function(t){return e.label.toLowerCase().includes(t)}))}));return(r=!r&&t.length&&d.includes("back")?t[t.length-1]:r)&&(e.video.deviceId=a.exact?{exact:r.deviceId}:{ideal:r.deviceId}),e.video=n(e.video),o("chrome: "+JSON.stringify(e)),i(e)}))}e.video=n(e.video)}return o("chrome: "+JSON.stringify(e)),i(e)},a=function(e){return 64<=t.version?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}},c.getUserMedia=function(e,t,n){i(e,(function(e){c.webkitGetUserMedia(e,t,(function(e){n&&n(a(e))}))}))}.bind(c),c.mediaDevices.getUserMedia&&(s=c.mediaDevices.getUserMedia.bind(c.mediaDevices),c.mediaDevices.getUserMedia=function(e){return i(e,(function(e){return s(e).then((function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length)throw t.getTracks().forEach((function(e){e.stop()})),new DOMException("","NotFoundError");return t}),(function(e){return Promise.reject(a(e))}))}))}))};var o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils.js")).log},{"../utils.js":11}],6:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimRTCIceCandidate=function(e){var t;!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype||(t=e.RTCIceCandidate,e.RTCIceCandidate=function(e){if("object"===(void 0===e?"undefined":r(e))&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substr(2)),e.candidate&&e.candidate.length){var n=new t(e),o=i.default.parseCandidate(e.candidate),a=Object.assign(n,o);return a.toJSON=function(){return{candidate:a.candidate,sdpMid:a.sdpMid,sdpMLineIndex:a.sdpMLineIndex,usernameFragment:a.usernameFragment}},a}return new t(e)},e.RTCIceCandidate.prototype=t.prototype,a.wrapPeerConnectionEvent(e,"icecandidate",(function(t){return t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t})))},n.shimMaxMessageSize=function(e,t){var n;e.RTCPeerConnection&&("sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp}}),n=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(){var e,r,o,a;return this._sctp=null,"chrome"===t.browser&&76<=t.version&&"plan-b"===this.getConfiguration().sdpSemantics&&Object.defineProperty(this,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0}),function(e){return!(!e||!e.sdp)&&((e=i.default.splitSections(e.sdp)).shift(),e.some((function(e){return(e=i.default.parseMLine(e))&&"application"===e.kind&&-1!==e.protocol.indexOf("SCTP")})))}(arguments[0])&&(r=function(e){return null===(e=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/))||e.length<2||(e=parseInt(e[1],10))!=e?-1:e}(arguments[0]),o=r,a=65536,a=a="firefox"===t.browser?t.version<57?-1===o?16384:2147483637:t.version<60?57===t.version?65535:65536:2147483637:a,r=function(e,n){var r=65536;return"firefox"===t.browser&&57===t.version&&(r=65535),0<(e=i.default.matchPrefix(e.sdp,"a=max-message-size:")).length?r=parseInt(e[0].substr(19),10):"firefox"===t.browser&&-1!==n&&(r=2147483637),r}(arguments[0],r),void 0,e=0===a&&0===r?Number.POSITIVE_INFINITY:0===a||0===r?Math.max(a,r):Math.min(a,r),r={},Object.defineProperty(r,"maxMessageSize",{get:function(){return e}}),this._sctp=r),n.apply(this,arguments)})},n.shimSendThrowTypeError=function(e){var t;function n(e,t){var n=e.send;e.send=function(){var r=(r=arguments[0]).length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&r>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}e.RTCPeerConnection&&"createDataChannel"in e.RTCPeerConnection.prototype&&(t=e.RTCPeerConnection.prototype.createDataChannel,e.RTCPeerConnection.prototype.createDataChannel=function(){var e=t.apply(this,arguments);return n(e,this),e},a.wrapPeerConnectionEvent(e,"datachannel",(function(e){return n(e.channel,e.target),e})))},n.shimConnectionState=function(e){var t;!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype||(t=e.RTCPeerConnection.prototype,Object.defineProperty(t,"connectionState",{get:function(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get:function(){return this._onconnectionstatechange||null},set:function(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach((function(e){var n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=function(e){var t,n=e.target;return n._lastConnectionState!==n.connectionState&&(n._lastConnectionState=n.connectionState,t=new Event("connectionstatechange",e),n.dispatchEvent(t)),e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}})))},n.removeExtmapAllowMixed=function(e,t){var n;e.RTCPeerConnection&&("chrome"===t.browser&&71<=t.version||"safari"===t.browser&&605<=t.version||(n=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(t){var r;return t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")&&(r=t.sdp.split("\n").filter((function(e){return"a=extmap-allow-mixed"!==e.trim()})).join("\n"),e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:r}):t.sdp=r),n.apply(this,arguments)}))},n.shimAddIceCandidateNullOrEmpty=function(e,t){var n;e.RTCPeerConnection&&e.RTCPeerConnection.prototype&&(n=e.RTCPeerConnection.prototype.addIceCandidate)&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})},n.shimParameterlessSetLocalDescription=function(e,t){var n;e.RTCPeerConnection&&e.RTCPeerConnection.prototype&&(n=e.RTCPeerConnection.prototype.setLocalDescription)&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){var e=this,t=arguments[0]||{};if("object"!==(void 0===t?"undefined":r(t))||t.type&&t.sdp)return n.apply(this,arguments);if(!(t={type:t.type,sdp:t.sdp}).type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":t.type="offer";break;default:t.type="answer"}return t.sdp||"offer"!==t.type&&"answer"!==t.type?n.apply(this,[t]):("offer"===t.type?this.createOffer:this.createAnswer).apply(this).then((function(t){return n.apply(e,[t])}))})};var o,i=(o=e("sdp"))&&o.__esModule?o:{default:o},a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("./utils"))},{"./utils":11,sdp:12}],7:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=n.shimGetUserMedia=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=e("./getusermedia");Object.defineProperty(n,"shimGetUserMedia",{enumerable:!0,get:function(){return o.shimGetUserMedia}});var i=e("./getdisplaymedia");Object.defineProperty(n,"shimGetDisplayMedia",{enumerable:!0,get:function(){return i.shimGetDisplayMedia}}),n.shimOnTrack=function(e){"object"===(void 0===e?"undefined":r(e))&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},n.shimPeerConnection=function(e,t){var n,o;"object"===(void 0===e?"undefined":r(e))&&(e.RTCPeerConnection||e.mozRTCPeerConnection)&&(!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){var n=e.RTCPeerConnection.prototype[t],r=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},t,(function(){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}));e.RTCPeerConnection.prototype[t]=r[t]})),n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},o=e.RTCPeerConnection.prototype.getStats,e.RTCPeerConnection.prototype.getStats=function(){var e=(i=Array.prototype.slice.call(arguments))[0],r=i[1],i=i[2];return o.apply(this,[e||null]).then((function(e){if(t.version<53&&!r)try{e.forEach((function(e){e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach((function(t,r){e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(r,i)})},n.shimSenderGetStats=function(e){var t,n;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&e.RTCRtpSender&&(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype||((t=e.RTCPeerConnection.prototype.getSenders)&&(e.RTCPeerConnection.prototype.getSenders=function(){var e=this,n=t.apply(this,[]);return n.forEach((function(t){return t._pc=e})),n}),(n=e.RTCPeerConnection.prototype.addTrack)&&(e.RTCPeerConnection.prototype.addTrack=function(){var e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}))},n.shimReceiverGetStats=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&e.RTCRtpSender&&(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype||((t=e.RTCPeerConnection.prototype.getReceivers)&&(e.RTCPeerConnection.prototype.getReceivers=function(){var e=this,n=t.apply(this,[]);return n.forEach((function(t){return t._pc=e})),n}),a.wrapPeerConnectionEvent(e,"track",(function(e){return e.receiver._pc=e.srcElement,e})),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}))},n.shimRemoveStream=function(e){!e.RTCPeerConnection||"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;a.deprecated("removeStream","removeTrack"),this.getSenders().forEach((function(n){n.track&&e.getTracks().includes(n.track)&&t.removeTrack(n)}))})},n.shimRTCDataChannel=function(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)},n.shimAddTransceiver=function(e){var t;"object"!==(void 0===e?"undefined":r(e))||!e.RTCPeerConnection||(t=e.RTCPeerConnection.prototype.addTransceiver)&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];var e=arguments[1],n=e&&"sendEncodings"in e;n&&e.sendEncodings.forEach((function(e){if("rid"in e&&!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in e&&!(1<=parseFloat(e.scaleResolutionDownBy)))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(0<=parseFloat(e.maxFramerate)))throw new RangeError("max_framerate must be >= 0.0")}));var r,o=t.apply(this,arguments);return n&&("encodings"in(n=(r=o.sender).getParameters())&&(1!==n.encodings.length||0!==Object.keys(n.encodings[0]).length)||(n.encodings=e.sendEncodings,r.sendEncodings=e.sendEncodings,this.setParametersPromises.push(r.setParameters(n).then((function(){delete r.sendEncodings})).catch((function(){delete r.sendEncodings}))))),o})},n.shimGetParameters=function(e){var t;"object"!==(void 0===e?"undefined":r(e))||!e.RTCRtpSender||(t=e.RTCRtpSender.prototype.getParameters)&&(e.RTCRtpSender.prototype.getParameters=function(){var e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})},n.shimCreateOffer=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype.createOffer,e.RTCPeerConnection.prototype.createOffer=function(){var e=this,n=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return t.apply(e,n)})).finally((function(){e.setParametersPromises=[]})):t.apply(this,arguments)})},n.shimCreateAnswer=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype.createAnswer,e.RTCPeerConnection.prototype.createAnswer=function(){var e=this,n=arguments;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then((function(){return t.apply(e,n)})).finally((function(){e.setParametersPromises=[]})):t.apply(this,arguments)})};var a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils"))},{"../utils":11,"./getdisplaymedia":8,"./getusermedia":9}],8:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.shimGetDisplayMedia=function(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){return n&&n.video?(!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)):((n=new DOMException("getDisplayMedia without video constraints is undefined")).name="NotFoundError",n.code=8,Promise.reject(n))})}},{}],9:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimGetUserMedia=function(e,t){var n,i,a,s,c=e&&e.navigator;e=e&&e.MediaStreamTrack;c.getUserMedia=function(e,t,n){o.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),c.mediaDevices.getUserMedia(e).then(t,n)},55<t.version&&"autoGainControl"in c.mediaDevices.getSupportedConstraints()||(n=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},i=c.mediaDevices.getUserMedia.bind(c.mediaDevices),c.mediaDevices.getUserMedia=function(e){return"object"===(void 0===e?"undefined":r(e))&&"object"===r(e.audio)&&(e=JSON.parse(JSON.stringify(e)),n(e.audio,"autoGainControl","mozAutoGainControl"),n(e.audio,"noiseSuppression","mozNoiseSuppression")),i(e)},e&&e.prototype.getSettings&&(a=e.prototype.getSettings,e.prototype.getSettings=function(){var e=a.apply(this,arguments);return n(e,"mozAutoGainControl","autoGainControl"),n(e,"mozNoiseSuppression","noiseSuppression"),e}),e&&e.prototype.applyConstraints&&(s=e.prototype.applyConstraints,e.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===(void 0===e?"undefined":r(e))&&(e=JSON.parse(JSON.stringify(e)),n(e,"autoGainControl","mozAutoGainControl"),n(e,"noiseSuppression","mozNoiseSuppression")),s.apply(this,[e])}))};var o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils"))},{"../utils":11}],10:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.shimLocalStreamsAPI=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),"addStream"in e.RTCPeerConnection.prototype||(t=e.RTCPeerConnection.prototype.addTrack,e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((function(r){return t.call(n,r,e)})),e.getVideoTracks().forEach((function(r){return t.call(n,r,e)}))},e.RTCPeerConnection.prototype.addTrack=function(e){for(var n=this,r=arguments.length,o=Array(1<r?r-1:0),i=1;i<r;i++)o[i-1]=arguments[i];return o&&o.forEach((function(e){n._localStreams?n._localStreams.includes(e)||n._localStreams.push(e):n._localStreams=[e]})),t.apply(this,arguments)}),"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;this._localStreams||(this._localStreams=[]);var n,r=this._localStreams.indexOf(e);-1!==r&&(this._localStreams.splice(r,1),n=e.getTracks(),this.getSenders().forEach((function(e){n.includes(e.track)&&t.removeTrack(e)})))}))},n.shimRemoteStreamsAPI=function(e){var t;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams||[]}),"onaddstream"in e.RTCPeerConnection.prototype||(Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(e){var t=this;this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach((function(e){var n;t._remoteStreams||(t._remoteStreams=[]),t._remoteStreams.includes(e)||(t._remoteStreams.push(e),(n=new Event("addstream")).stream=e,t.dispatchEvent(n))}))})}}),t=e.RTCPeerConnection.prototype.setRemoteDescription,e.RTCPeerConnection.prototype.setRemoteDescription=function(){var e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach((function(t){var n;e._remoteStreams||(e._remoteStreams=[]),0<=e._remoteStreams.indexOf(t)||(e._remoteStreams.push(t),(n=new Event("addstream")).stream=t,e.dispatchEvent(n))}))}),t.apply(e,arguments)}))},n.shimCallbacksAPI=function(e){var t,n,o,i,a,s;"object"===(void 0===e?"undefined":r(e))&&e.RTCPeerConnection&&(t=e.RTCPeerConnection.prototype,n=t.createOffer,o=t.createAnswer,i=t.setLocalDescription,a=t.setRemoteDescription,s=t.addIceCandidate,t.createOffer=function(e,t){var r=n.apply(this,[2<=arguments.length?arguments[2]:e]);return t?(r.then(e,t),Promise.resolve()):r},t.createAnswer=function(e,t){var n=o.apply(this,[2<=arguments.length?arguments[2]:e]);return t?(n.then(e,t),Promise.resolve()):n},e=function(e,t,n){return e=i.apply(this,[e]),n?(e.then(t,n),Promise.resolve()):e},t.setLocalDescription=e,e=function(e,t,n){return e=a.apply(this,[e]),n?(e.then(t,n),Promise.resolve()):e},t.setRemoteDescription=e,e=function(e,t,n){return e=s.apply(this,[e]),n?(e.then(t,n),Promise.resolve()):e},t.addIceCandidate=e)},n.shimGetUserMedia=function(e){var t,n=e&&e.navigator;n.mediaDevices&&n.mediaDevices.getUserMedia&&(e=n.mediaDevices,t=e.getUserMedia.bind(e),n.mediaDevices.getUserMedia=function(e){return t(i(e))}),!n.getUserMedia&&n.mediaDevices&&n.mediaDevices.getUserMedia&&(n.getUserMedia=function(e,t,r){n.mediaDevices.getUserMedia(e).then(t,r)}.bind(n))},n.shimConstraints=i,n.shimRTCIceServerUrls=function(e){var t;e.RTCPeerConnection&&(t=e.RTCPeerConnection,e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){for(var r=[],i=0;i<e.iceServers.length;i++){var a=e.iceServers[i];!a.hasOwnProperty("urls")&&a.hasOwnProperty("url")?(o.deprecated("RTCIceServer.url","RTCIceServer.urls"),(a=JSON.parse(JSON.stringify(a))).urls=a.url,delete a.url,r.push(a)):r.push(e.iceServers[i])}e.iceServers=r}return new t(e,n)},e.RTCPeerConnection.prototype=t.prototype,"generateCertificate"in t&&Object.defineProperty(e.RTCPeerConnection,"generateCertificate",{get:function(){return t.generateCertificate}}))},n.shimTrackEventTransceiver=function(e){"object"===(void 0===e?"undefined":r(e))&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})},n.shimCreateOfferLegacy=function(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){var n;return e&&(void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio),n=this.getTransceivers().find((function(e){return"audio"===e.receiver.track.kind})),!1===e.offerToReceiveAudio&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveAudio||n||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo),n=this.getTransceivers().find((function(e){return"video"===e.receiver.track.kind})),!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})),t.apply(this,arguments)}},n.shimAudioContext=function(e){"object"!==(void 0===e?"undefined":r(e))||e.AudioContext||(e.AudioContext=e.webkitAudioContext)};var o=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("../utils"));function i(e){return e&&void 0!==e.video?Object.assign({},e,{video:o.compactObject(e.video)}):e}},{"../utils":11}],11:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};n.extractVersion=a,n.wrapPeerConnectionEvent=function(e,t,n){var r,o;e.RTCPeerConnection&&(e=e.RTCPeerConnection.prototype,r=e.addEventListener,e.addEventListener=function(e,o){if(e!==t)return r.apply(this,arguments);function i(e){(e=n(e))&&(o.handleEvent?o.handleEvent(e):o(e))}return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(o,i),r.apply(this,[e,i])},o=e.removeEventListener,e.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return o.apply(this,arguments);if(!this._eventMap[t].has(n))return o.apply(this,arguments);var r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,o.apply(this,[e,r])},Object.defineProperty(e,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0}))},n.disableLog=function(e){return"boolean"==typeof e?(o=e)?"adapter.js logging disabled":"adapter.js logging enabled":new Error("Argument type: "+(void 0===e?"undefined":r(e))+". Please use a boolean.")},n.disableWarnings=function(e){return"boolean"==typeof e?(i=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled")):new Error("Argument type: "+(void 0===e?"undefined":r(e))+". Please use a boolean.")},n.log=function(){"object"===("undefined"==typeof window?"undefined":r(window))&&(o||"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments))},n.deprecated=function(e,t){i&&console.warn(e+" is deprecated, please use "+t+" instead.")},n.detectBrowser=function(e){var t={browser:null,version:null};if(void 0===e||!e.navigator)return t.browser="Not a browser.",t;var n=e.navigator;if(n.mozGetUserMedia)t.browser="firefox",t.version=a(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection&&!e.RTCIceGatherer)t.browser="chrome",t.version=a(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=a(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t},n.compactObject=function e(t){return s(t)?Object.keys(t).reduce((function(n,r){var o=(i=s(t[r]))?e(t[r]):t[r],i=i&&!Object.keys(o).length;return void 0===o||i?n:Object.assign(n,function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},r,o))}),{}):t},n.walkStats=c,n.filterStats=function(e,t,n){var r=n?"outbound-rtp":"inbound-rtp",o=new Map;if(null===t)return o;var i=[];return e.forEach((function(e){"track"===e.type&&e.trackIdentifier===t.id&&i.push(e)})),i.forEach((function(t){e.forEach((function(n){n.type===r&&n.trackId===t.id&&c(e,n,o)}))})),o};var o=!0,i=!0;function a(e,t,n){return(t=e.match(t))&&t.length>=n&&parseInt(t[n],10)}function s(e){return"[object Object]"===Object.prototype.toString.call(e)}function c(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((function(r){r.endsWith("Id")?c(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((function(t){c(e,e.get(t),n)}))})))}},{}],12:[function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o={generateIdentifier:function(){return Math.random().toString(36).substr(2,10)}};o.localCName=o.generateIdentifier(),o.splitLines=function(e){return e.trim().split("\n").map((function(e){return e.trim()}))},o.splitSections=function(e){return e.split("\nm=").map((function(e,t){return(0<t?"m="+e:e).trim()+"\r\n"}))},o.getDescription=function(e){return(e=o.splitSections(e))&&e[0]},o.getMediaSections=function(e){return(e=o.splitSections(e)).shift(),e},o.matchPrefix=function(e,t){return o.splitLines(e).filter((function(e){return 0===e.indexOf(t)}))},o.parseCandidate=function(e){for(var t=void 0,n={foundation:(t=(0===e.indexOf("a=candidate:")?e.substring(12):e.substring(10)).split(" "))[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]},r=8;r<t.length;r+=2)switch(t[r]){case"raddr":n.relatedAddress=t[r+1];break;case"rport":n.relatedPort=parseInt(t[r+1],10);break;case"tcptype":n.tcpType=t[r+1];break;case"ufrag":n.ufrag=t[r+1],n.usernameFragment=t[r+1];break;default:void 0===n[t[r]]&&(n[t[r]]=t[r+1])}return n},o.writeCandidate=function(e){var t=[];t.push(e.foundation);var n=e.component;return"rtp"===n?t.push(1):"rtcp"===n?t.push(2):t.push(n),t.push(e.protocol.toUpperCase()),t.push(e.priority),t.push(e.address||e.ip),t.push(e.port),n=e.type,t.push("typ"),t.push(n),"host"!==n&&e.relatedAddress&&e.relatedPort&&(t.push("raddr"),t.push(e.relatedAddress),t.push("rport"),t.push(e.relatedPort)),e.tcpType&&"tcp"===e.protocol.toLowerCase()&&(t.push("tcptype"),t.push(e.tcpType)),(e.usernameFragment||e.ufrag)&&(t.push("ufrag"),t.push(e.usernameFragment||e.ufrag)),"candidate:"+t.join(" ")},o.parseIceOptions=function(e){return e.substr(14).split(" ")},o.parseRtpMap=function(e){var t=e.substr(9).split(" ");e={payloadType:parseInt(t.shift(),10)},t=t[0].split("/");return e.name=t[0],e.clockRate=parseInt(t[1],10),e.channels=3===t.length?parseInt(t[2],10):1,e.numChannels=e.channels,e},o.writeRtpMap=function(e){var t=e.payloadType;void 0!==e.preferredPayloadType&&(t=e.preferredPayloadType);var n=e.channels||e.numChannels||1;return"a=rtpmap:"+t+" "+e.name+"/"+e.clockRate+(1!==n?"/"+n:"")+"\r\n"},o.parseExtmap=function(e){return e=e.substr(9).split(" "),{id:parseInt(e[0],10),direction:0<e[0].indexOf("/")?e[0].split("/")[1]:"sendrecv",uri:e[1]}},o.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+"\r\n"},o.parseFmtp=function(e){for(var t={},n=void 0,r=e.substr(e.indexOf(" ")+1).split(";"),o=0;o<r.length;o++)t[(n=r[o].trim().split("="))[0].trim()]=n[1];return t},o.writeFmtp=function(e){var t,n="",r=e.payloadType;return void 0!==e.preferredPayloadType&&(r=e.preferredPayloadType),e.parameters&&Object.keys(e.parameters).length&&(t=[],Object.keys(e.parameters).forEach((function(n){void 0!==e.parameters[n]?t.push(n+"="+e.parameters[n]):t.push(n)})),n+="a=fmtp:"+r+" "+t.join(";")+"\r\n"),n},o.parseRtcpFb=function(e){return{type:(e=e.substr(e.indexOf(" ")+1).split(" ")).shift(),parameter:e.join(" ")}},o.writeRtcpFb=function(e){var t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((function(e){t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},o.parseSsrcMedia=function(e){var t=e.indexOf(" "),n={ssrc:parseInt(e.substr(7,t-7),10)},r=e.indexOf(":",t);return-1<r?(n.attribute=e.substr(t+1,r-t-1),n.value=e.substr(r+1)):n.attribute=e.substr(t+1),n},o.parseSsrcGroup=function(e){return{semantics:(e=e.substr(13).split(" ")).shift(),ssrcs:e.map((function(e){return parseInt(e,10)}))}},o.getMid=function(e){if(e=o.matchPrefix(e,"a=mid:")[0])return e.substr(6)},o.parseFingerprint=function(e){return{algorithm:(e=e.substr(14).split(" "))[0].toLowerCase(),value:e[1].toUpperCase()}},o.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:o.matchPrefix(e+t,"a=fingerprint:").map(o.parseFingerprint)}},o.writeDtlsParameters=function(e,t){var n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((function(e){n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},o.parseCryptoLine=function(e){return e=e.substr(9).split(" "),{tag:parseInt(e[0],10),cryptoSuite:e[1],keyParams:e[2],sessionParams:e.slice(3)}},o.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"===r(e.keyParams)?o.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},o.parseCryptoKeyParams=function(e){return 0!==e.indexOf("inline:")?null:{keyMethod:"inline",keySalt:(e=e.substr(7).split("|"))[0],lifeTime:e[1],mkiValue:e[2]?e[2].split(":")[0]:void 0,mkiLength:e[2]?e[2].split(":")[1]:void 0}},o.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},o.getCryptoParameters=function(e,t){return o.matchPrefix(e+t,"a=crypto:").map(o.parseCryptoLine)},o.getIceParameters=function(e,t){var n=o.matchPrefix(e+t,"a=ice-ufrag:")[0];t=o.matchPrefix(e+t,"a=ice-pwd:")[0];return n&&t?{usernameFragment:n.substr(12),password:t.substr(10)}:null},o.writeIceParameters=function(e){var t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},o.parseRtpParameters=function(e){for(var t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},n=o.splitLines(e)[0].split(" "),r=3;r<n.length;r++){var i=n[r];if(s=o.matchPrefix(e,"a=rtpmap:"+i+" ")[0]){var a=o.parseRtpMap(s),s=o.matchPrefix(e,"a=fmtp:"+i+" ");switch(a.parameters=s.length?o.parseFmtp(s[0]):{},a.rtcpFeedback=o.matchPrefix(e,"a=rtcp-fb:"+i+" ").map(o.parseRtcpFb),t.codecs.push(a),a.name.toUpperCase()){case"RED":case"ULPFEC":t.fecMechanisms.push(a.name.toUpperCase())}}}return o.matchPrefix(e,"a=extmap:").forEach((function(e){t.headerExtensions.push(o.parseExtmap(e))})),t},o.writeRtpDescription=function(e,t){var n="";n+="m="+e+" ",n+=0<t.codecs.length?"9":"0",n+=" UDP/TLS/RTP/SAVPF ",n+=t.codecs.map((function(e){return void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType})).join(" ")+"\r\n",n+="c=IN IP4 0.0.0.0\r\n",n+="a=rtcp:9 IN IP4 0.0.0.0\r\n",t.codecs.forEach((function(e){n+=o.writeRtpMap(e),n+=o.writeFmtp(e),n+=o.writeRtcpFb(e)}));var r=0;return t.codecs.forEach((function(e){e.maxptime>r&&(r=e.maxptime)})),0<r&&(n+="a=maxptime:"+r+"\r\n"),t.headerExtensions&&t.headerExtensions.forEach((function(e){n+=o.writeExtmap(e)})),n},o.parseRtpEncodingParameters=function(e){var t=[],n=o.parseRtpParameters(e),r=-1!==n.fecMechanisms.indexOf("RED"),i=-1!==n.fecMechanisms.indexOf("ULPFEC"),a=0<(c=o.matchPrefix(e,"a=ssrc:").map((function(e){return o.parseSsrcMedia(e)})).filter((function(e){return"cname"===e.attribute}))).length&&c[0].ssrc,s=void 0,c=o.matchPrefix(e,"a=ssrc-group:FID").map((function(e){return e.substr(17).split(" ").map((function(e){return parseInt(e,10)}))}));0<c.length&&1<c[0].length&&c[0][0]===a&&(s=c[0][1]),n.codecs.forEach((function(e){"RTX"===e.name.toUpperCase()&&e.parameters.apt&&(e={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)},a&&s&&(e.rtx={ssrc:s}),t.push(e),r&&((e=JSON.parse(JSON.stringify(e))).fec={ssrc:a,mechanism:i?"red+ulpfec":"red"},t.push(e)))})),0===t.length&&a&&t.push({ssrc:a});var d=o.matchPrefix(e,"b=");return d.length&&(d=0===d[0].indexOf("b=TIAS:")?parseInt(d[0].substr(7),10):0===d[0].indexOf("b=AS:")?1e3*parseInt(d[0].substr(5),10)*.95-16e3:void 0,t.forEach((function(e){e.maxBitrate=d}))),t},o.parseRtcpParameters=function(e){var t={},n=o.matchPrefix(e,"a=ssrc:").map((function(e){return o.parseSsrcMedia(e)})).filter((function(e){return"cname"===e.attribute}))[0];return n&&(t.cname=n.value,t.ssrc=n.ssrc),n=o.matchPrefix(e,"a=rtcp-rsize"),t.reducedSize=0<n.length,t.compound=0===n.length,e=o.matchPrefix(e,"a=rtcp-mux"),t.mux=0<e.length,t},o.writeRtcpParameters=function(e){var t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},o.parseMsid=function(e){var t=void 0,n=o.matchPrefix(e,"a=msid:");return 1===n.length?{stream:(t=n[0].substr(7).split(" "))[0],track:t[1]}:0<(e=o.matchPrefix(e,"a=ssrc:").map((function(e){return o.parseSsrcMedia(e)})).filter((function(e){return"msid"===e.attribute}))).length?{stream:(t=e[0].value.split(" "))[0],track:t[1]}:void 0},o.parseSctpDescription=function(e){var t=o.parseMLine(e),n=o.matchPrefix(e,"a=max-message-size:"),r=void 0;return 0<n.length&&(r=parseInt(n[0].substr(19),10)),isNaN(r)&&(r=65536),0<(n=o.matchPrefix(e,"a=sctp-port:")).length?{port:parseInt(n[0].substr(12),10),protocol:t.fmt,maxMessageSize:r}:0<(e=o.matchPrefix(e,"a=sctpmap:")).length?(e=e[0].substr(10).split(" "),{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:r}):void 0},o.writeSctpDescription=function(e,t){var n=[];n="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"];return void 0!==t.maxMessageSize&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},o.generateSessionId=function(){return Math.random().toString().substr(2,21)},o.writeSessionBoilerplate=function(e,t,n){return t=void 0!==t?t:2,"v=0\r\no="+(n||"thisisadapterortc")+" "+(e||o.generateSessionId())+" "+t+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},o.getDirection=function(e,t){for(var n=o.splitLines(e),r=0;r<n.length;r++)switch(n[r]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return n[r].substr(2)}return t?o.getDirection(t):"sendrecv"},o.getKind=function(e){return o.splitLines(e)[0].split(" ")[0].substr(2)},o.isRejected=function(e){return"0"===e.split(" ",2)[1]},o.parseMLine=function(e){return{kind:(e=o.splitLines(e)[0].substr(2).split(" "))[0],port:parseInt(e[1],10),protocol:e[2],fmt:e.slice(3).join(" ")}},o.parseOLine=function(e){return{username:(e=o.matchPrefix(e,"o=")[0].substr(2).split(" "))[0],sessionId:e[1],sessionVersion:parseInt(e[2],10),netType:e[3],addressType:e[4],address:e[5]}},o.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;for(var t=o.splitLines(e),n=0;n<t.length;n++)if(t[n].length<2||"="!==t[n].charAt(1))return!1;return!0},"object"===(void 0===t?"undefined":r(t))&&(t.exports=o)},{}]},{},[1])(1)})),i.sessions={},i.isExtensionEnabled=function(){if(navigator.mediaDevices&&navigator.mediaDevices.getDisplayMedia)return!0;if(window.navigator.userAgent.match("Chrome")){let e=parseInt(window.navigator.userAgent.match(/Chrome\/(.*) /)[1],10),t=33;return window.navigator.userAgent.match("Linux")&&(t=35),e>=26&&e<=t||i.extension.isInstalled()}return!0};var o={extensionId:"hapfgfdkleiggjjpfpenajgdnfckjpaj",isInstalled:function(){return null!==document.querySelector("#janus-extension-installed")},getScreen:function(e){let t=window.setTimeout((function(){let t=new Error("NavigatorUserMediaError");return t.name='The required Chrome extension is not installed: click <a href="#">here</a> to install it. (NOTE: this will need you to refresh the page)',e(t)}),1e3);this.cache[t]=e,window.postMessage({type:"janusGetScreen",id:t},"*")},init:function(){let e={};this.cache=e,window.addEventListener("message",(function(t){if(t.origin==window.location.origin)if("janusGotScreen"==t.data.type&&e[t.data.id]){let n=e[t.data.id];if(delete e[t.data.id],""===t.data.sourceId){let e=new Error("NavigatorUserMediaError");e.name="You cancelled the request for permission, giving up...",n(e)}else n(null,t.data.sourceId)}else"janusGetScreenPending"==t.data.type&&(console.log("clearing ",t.data.id),window.clearTimeout(t.data.id))}))}};function i(e){if((e=e||{}).success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,e.destroyed="function"==typeof e.destroyed?e.destroyed:i.noop,!i.initDone)return e.error("Library not initialized"),{};if(!i.isWebrtcSupported())return e.error("WebRTC not supported by this browser"),{};if(i.log("Library initialized: "+i.initDone),!e.server)return e.error("Invalid server url"),{};let t=!1,n=null,r={},o=null,a=null,s=0,c=e.server;i.isArray(c)?(i.log("Multiple servers provided ("+c.length+"), will use the first that works"),c=null,a=e.server,i.debug(a)):0===c.indexOf("ws")?(t=!0,i.log("Using WebSockets to contact Janus: "+c)):(t=!1,i.log("Using REST API to contact Janus: "+c));let d=e.iceServers||[{urls:"stun:stun.l.google.com:19302"}],l=e.iceTransportPolicy,u=e.bundlePolicy,p=!1;void 0!==e.withCredentials&&null!==e.withCredentials&&(p=!0===e.withCredentials);let f=10;void 0!==e.max_poll_events&&null!==e.max_poll_events&&(f=e.max_poll_events),f<1&&(f=1);let m=null;void 0!==e.token&&null!==e.token&&(m=e.token);let h=null;void 0!==e.apisecret&&null!==e.apisecret&&(h=e.apisecret),this.destroyOnUnload=!0,void 0!==e.destroyOnUnload&&null!==e.destroyOnUnload&&(this.destroyOnUnload=!0===e.destroyOnUnload);let g=1e4;void 0!==e.keepAlivePeriod&&null!==e.keepAlivePeriod&&(g=e.keepAlivePeriod),isNaN(g)&&(g=1e4);let v=6e4;function y(e){let t={high:9e5,medium:3e5,low:1e5};return null!=e&&(e.high&&(t.high=e.high),e.medium&&(t.medium=e.medium),e.low&&(t.low=e.low)),t}void 0!==e.longPollTimeout&&null!==e.longPollTimeout&&(v=e.longPollTimeout),isNaN(v)&&(v=6e4);let b=!1,C=null,S={},T=this,w=0,R={};function k(){if(null==C)return;if(i.debug("Long poll..."),!b)return void i.warn("Is the server down? (connected=false)");let t=c+"/"+C+"?rid="+(new Date).getTime();f&&(t=t+"&maxev="+f),m&&(t=t+"&token="+encodeURIComponent(m)),h&&(t=t+"&apisecret="+encodeURIComponent(h)),i.httpAPICall(t,{verb:"GET",withCredentials:p,success:P,timeout:v,error:function(t,n){if(i.error(t+":",n),w++,w>3)return b=!1,void e.error("Lost connection to the server (is it down?)");k()}})}function P(e,r){if(w=0,t||null==C||!0===r||k(),t||!i.isArray(e))if("keepalive"!==e.janus)if("server_info"!==e.janus)if("ack"!==e.janus)if("success"!==e.janus)if("trickle"===e.janus){const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");let r=e.candidate;i.debug("Got a trickled candidate on session "+C),i.debug(r);let o=n.webrtcStuff;o.pc&&o.remoteSdp?(i.debug("Adding remote candidate:",r),r&&!0!==r.completed?o.pc.addIceCandidate(r):o.pc.addIceCandidate(i.endOfCandidates)):(i.debug("We didn't do setRemoteDescription (trickle got here before the offer?), caching candidate"),o.candidates||(o.candidates=[]),o.candidates.push(r),i.debug(o.candidates))}else{if("webrtcup"===e.janus){i.debug("Got a webrtcup event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];return n?void n.webrtcState(!0):void i.debug("This handle is not attached to this session")}if("hangup"===e.janus){i.debug("Got a hangup event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");n.webrtcState(!1,e.reason),n.hangup()}else if("detached"===e.janus){i.debug("Got a detached event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return;n.ondetached(),n.detach()}else if("media"===e.janus){i.debug("Got a media event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");n.mediaState(e.type,e.receiving,e.mid)}else if("slowlink"===e.janus){i.debug("Got a slowlink event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");const n=S[t];if(!n)return void i.debug("This handle is not attached to this session");n.slowLink(e.uplink,e.lost,e.mid)}else{if("error"===e.janus){i.error("Ooops: "+e.error.code+" "+e.error.reason),i.debug(e);let t=e.transaction;if(t){let n=R[t];n&&n(e),delete R[t]}return}if("event"===e.janus){i.debug("Got a plugin event on session "+C),i.debug(e);const t=e.sender;if(!t)return void i.warn("Missing sender...");let n=e.plugindata;if(!n)return void i.warn("Missing plugindata...");i.debug(" -- Event is coming from "+t+" ("+n.plugin+")");let r=n.data;i.debug(r);const o=S[t];if(!o)return void i.warn("This handle is not attached to this session");let a=e.jsep;a&&(i.debug("Handling SDP as well..."),i.debug(a));let s=o.onmessage;s?(i.debug("Notifying application..."),s(r,a)):i.debug("No provided notification callback")}else{if("timeout"===e.janus){i.error("Timeout on session "+C),i.debug(e),t&&n.close(3504,"Gateway timeout");const r=e.sender;if(!r)return void i.warn("Missing sender...");return void S[r].webrtcTimeout(e)}i.warn("Unknown message/event '"+e.janus+"' on session "+C),i.debug(e)}}}else{i.debug("Got a success on session "+C),i.debug(e);const t=e.transaction;if(t){const n=R[t];n&&n(e),delete R[t]}}else{i.debug("Got an ack on session "+C),i.debug(e);const t=e.transaction;if(t){const n=R[t];n&&n(e),delete R[t]}}else{i.debug("Got info on the Janus instance"),i.debug(e);const t=e.transaction;if(t){const n=R[t];n&&n(e),delete R[t]}}else i.vdebug("Got a keepalive on session "+C);else for(let t=0;t<e.length;t++)P(e[t],!0)}function _(){if(!c||!t||!b)return;o=setTimeout(_,g);let e={janus:"keepalive",session_id:C,transaction:i.randomString(12)};m&&(e.token=m),h&&(e.apisecret=h),n.send(JSON.stringify(e))}function I(d){let l=i.randomString(12),u={janus:"create",transaction:l};if(d.reconnect&&(b=!1,u.janus="claim",u.session_id=C,n&&(n.onopen=null,n.onerror=null,n.onclose=null,o&&(clearTimeout(o),o=null))),m&&(u.token=m),h&&(u.apisecret=h),!c&&i.isArray(a)&&(c=a[s],0===c.indexOf("ws")?(t=!0,i.log("Server #"+(s+1)+": trying WebSockets to contact Janus ("+c+")")):(t=!1,i.log("Server #"+(s+1)+": trying REST API to contact Janus ("+c+")"))),t){n=i.newWebSocket(c,"janus-protocol"),r={error:function(){if(i.error("Error connecting to the Janus WebSockets server... "+c),i.isArray(a)&&!d.reconnect)return s++,s===a.length?void d.error("Error connecting to any of the provided Janus servers: Is the server down?"):(c=null,void setTimeout((function(){I(d)}),200));d.error("Error connecting to the Janus WebSockets server: Is the server down?")},open:function(){R[l]=function(e){if(i.debug(e),"success"!==e.janus)return i.error("Ooops: "+e.error.code+" "+e.error.reason),void d.error(e.error.reason);o=setTimeout(_,g),b=!0,C=e.session_id?e.session_id:e.data.id,d.reconnect?i.log("Claimed session: "+C):i.log("Created session: "+C),i.sessions[C]=T,d.success()},n.send(JSON.stringify(u))},message:function(e){P(JSON.parse(e.data))},close:function(){c&&b&&(b=!1,e.error("Lost connection to the server (is it down?)"))}};for(let e in r)n.addEventListener(e,r[e])}else i.httpAPICall(c,{verb:"POST",withCredentials:p,body:u,success:function(e){if(i.debug(e),"success"!==e.janus)return i.error("Ooops: "+e.error.code+" "+e.error.reason),void d.error(e.error.reason);b=!0,C=e.session_id?e.session_id:e.data.id,d.reconnect?i.log("Claimed session: "+C):i.log("Created session: "+C),i.sessions[C]=T,k(),d.success()},error:function(e,t){if(i.error(e+":",t),i.isArray(a)&&!d.reconnect)return s++,s===a.length?void d.error("Error connecting to any of the provided Janus servers: Is the server down?"):(c=null,void setTimeout((function(){I(d)}),200));""===t?d.error(e+": Is the server down?"):t&&t.error?d.error(e+": "+t.error.message):d.error(e+": "+t)}})}function E(e,r){if((r=r||{}).success="function"==typeof r.success?r.success:i.noop,r.error="function"==typeof r.error?r.error:i.noop,!b)return i.warn("Is the server down? (connected=false)"),void r.error("Is the server down? (connected=false)");let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),void r.error("Invalid handle");let a=r.message,s=r.jsep,d=i.randomString(12),l={janus:"message",body:a,transaction:d};if(o.token&&(l.token=o.token),h&&(l.apisecret=h),s&&(l.jsep={type:s.type,sdp:s.sdp},s.e2ee&&(l.jsep.e2ee=!0),"hml"!==s.rid_order&&"lmh"!==s.rid_order||(l.jsep.rid_order=s.rid_order),s.force_relay&&(l.jsep.force_relay=!0)),i.debug("Sending message to plugin (handle="+e+"):"),i.debug(l),t)return l.session_id=C,l.handle_id=e,R[d]=function(e){if(i.debug("Message sent!"),i.debug(e),"success"===e.janus){let t=e.plugindata;if(!t)return i.warn("Request succeeded, but missing plugindata..."),void r.success();i.log("Synchronous transaction successful ("+t.plugin+")");let n=t.data;return i.debug(n),void r.success(n)}"ack"===e.janus?r.success():e.error?(i.error("Ooops: "+e.error.code+" "+e.error.reason),r.error(e.error.code+" "+e.error.reason)):(i.error("Unknown error"),r.error("Unknown error"))},void n.send(JSON.stringify(l));i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:l,success:function(e){if(i.debug("Message sent!"),i.debug(e),"success"===e.janus){let t=e.plugindata;if(!t)return i.warn("Request succeeded, but missing plugindata..."),void r.success();i.log("Synchronous transaction successful ("+t.plugin+")");let n=t.data;return i.debug(n),void r.success(n)}"ack"===e.janus?r.success():e.error?(i.error("Ooops: "+e.error.code+" "+e.error.reason),r.error(e.error.code+" "+e.error.reason)):(i.error("Unknown error"),r.error("Unknown error"))},error:function(e,t){i.error(e+":",t),r.error(e+": "+t)}})}function A(e,r){if(!b)return void i.warn("Is the server down? (connected=false)");let o=S[e];if(!o||!o.webrtcStuff)return void i.warn("Invalid handle");let a={janus:"trickle",candidate:r,transaction:i.randomString(12)};if(o.token&&(a.token=o.token),h&&(a.apisecret=h),i.vdebug("Sending trickle candidate (handle="+e+"):"),i.vdebug(a),t)return a.session_id=C,a.handle_id=e,void n.send(JSON.stringify(a));i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:a,success:function(e){i.vdebug("Candidate sent!"),i.vdebug(e),"ack"===e.janus||i.error("Ooops: "+e.error.code+" "+e.error.reason)},error:function(e,t){i.error(e+":",t)}})}function O(e,t,n,r,o){let a=S[e];if(!a||!a.webrtcStuff)return void i.warn("Invalid handle");let s=a.webrtcStuff;if(!s.pc)return void i.warn("Invalid PeerConnection");let c=function(e){i.log("Received state change on data channel:",e);let t=e.target.label,n=e.target.protocol,r=s.dataChannel[t]?s.dataChannel[t].readyState:"null";if(i.log("State change on <"+t+"> data channel: "+r),"open"===r){if(s.dataChannel[t].pending&&s.dataChannel[t].pending.length>0){i.log("Sending pending messages on <"+t+">:",s.dataChannel[t].pending.length);for(let e of s.dataChannel[t].pending)i.log("Sending data on data channel <"+t+">"),i.debug(e),s.dataChannel[t].send(e);s.dataChannel[t].pending=[]}a.ondataopen(t,n)}};if(r)s.dataChannel[t]=r;else{let e=s.dataChannelOptions;n&&(e.protocol=n),s.dataChannel[t]=s.pc.createDataChannel(t,e)}s.dataChannel[t].onmessage=function(e){i.log("Received message on data channel:",e);let t=e.target.label;a.ondata(e.data,t)},s.dataChannel[t].onopen=c,s.dataChannel[t].onclose=c,s.dataChannel[t].onerror=function(e){i.error("Got error on data channel:",e)},s.dataChannel[t].pending=[],o&&s.dataChannel[t].pending.push(o)}function D(e,t){(t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop;let n=S[e];if(!n||!n.webrtcStuff)return i.warn("Invalid handle"),void t.error("Invalid handle");let r=n.webrtcStuff,o=t.text||t.data;if(!o)return i.warn("Invalid data"),void t.error("Invalid data");let a=t.label?t.label:i.dataChanDefaultLabel;return r.dataChannel[a]?"open"!==r.dataChannel[a].readyState?(r.dataChannel[a].pending.push(o),void t.success()):(i.log("Sending data on data channel <"+a+">"),i.debug(o),r.dataChannel[a].send(o),void t.success()):(O(e,a,t.protocol,!1,o,t.protocol),void t.success())}function N(e,t){(t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop;let n=S[e];if(!n||!n.webrtcStuff)return i.warn("Invalid handle"),void t.error("Invalid handle");let r=n.webrtcStuff;if(!r.dtmfSender){if(r.pc){let e=r.pc.getSenders().find((function(e){return e.track&&"audio"===e.track.kind}));if(!e)return i.warn("Invalid DTMF configuration (no audio track)"),void t.error("Invalid DTMF configuration (no audio track)");r.dtmfSender=e.dtmf,r.dtmfSender&&(i.log("Created DTMF Sender"),r.dtmfSender.ontonechange=function(e){i.debug("Sent DTMF tone: "+e.tone)})}if(!r.dtmfSender)return i.warn("Invalid DTMF configuration"),void t.error("Invalid DTMF configuration")}let o=t.dtmf;if(!o)return i.warn("Invalid DTMF parameters"),void t.error("Invalid DTMF parameters");let a=o.tones;if(!a)return i.warn("Invalid DTMF string"),void t.error("Invalid DTMF string");let s="number"==typeof o.duration?o.duration:500,c="number"==typeof o.gap?o.gap:50;i.debug("Sending DTMF string "+a+" (duration "+s+"ms, gap "+c+"ms)"),r.dtmfSender.insertDTMF(a,s,c),t.success()}function L(e,r){(r=r||{}).success="function"==typeof r.success?r.success:i.noop,r.error="function"==typeof r.error?r.error:i.noop;let o=!0===r.noRequest;i.log("Destroying handle "+e+" (only-locally="+o+")"),Y(e);let a=S[e];if(!a||a.detached)return delete S[e],void r.success();if(a.detached=!0,o)return delete S[e],void r.success();if(!b)return i.warn("Is the server down? (connected=false)"),void r.error("Is the server down? (connected=false)");let s={janus:"detach",transaction:i.randomString(12)};if(a.token&&(s.token=a.token),h&&(s.apisecret=h),t)return s.session_id=C,s.handle_id=e,n.send(JSON.stringify(s)),delete S[e],void r.success();i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:s,success:function(t){i.log("Destroyed handle:"),i.debug(t),"success"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),delete S[e],r.success()},error:function(t,n){i.error(t+":",n),delete S[e],r.success()}})}function M(e,t){let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;if(r.pc)return;let o={iceServers:d,iceTransportPolicy:l,bundlePolicy:u,sdpSemantics:"unified-plan"},a=!1;if(t.tracks)for(let e of t.tracks)if(e.transforms&&(e.transforms.sender||e.transforms.receiver)){a=!0;break}RTCRtpSender&&(RTCRtpSender.prototype.createEncodedStreams||RTCRtpSender.prototype.createEncodedAudioStreams&&RTCRtpSender.prototype.createEncodedVideoStreams)&&a&&(r.insertableStreams=!0,o.forceEncodedAudioInsertableStreams=!0,o.forceEncodedVideoInsertableStreams=!0,o.encodedInsertableStreams=!0),i.log("Creating PeerConnection"),r.pc=new RTCPeerConnection(o),i.debug(r.pc),r.pc.getStats&&(r.volume={},r.bitrate.value="0 kbits/sec"),i.log("Preparing local SDP and gathering candidates (trickle="+r.trickle+")"),r.pc.oniceconnectionstatechange=function(){r.pc&&n.iceState(r.pc.iceConnectionState)},r.pc.onicecandidate=function(n){if(!n.candidate||n.candidate.candidate&&n.candidate.candidate.indexOf("endOfCandidates")>0)i.log("End of candidates."),r.iceDone=!0,!0===r.trickle?A(e,{completed:!0}):function(e,t){t=t||{},t.success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop;let n=S[e];if(!n||!n.webrtcStuff)return void i.warn("Invalid handle, not sending anything");let r=n.webrtcStuff;if(i.log("Sending offer/answer SDP..."),!r.mySdp)return void i.warn("Local SDP instance is invalid, not sending anything...");r.mySdp={type:r.pc.localDescription.type,sdp:r.pc.localDescription.sdp},!1===r.trickle&&(r.mySdp.trickle=!1);i.debug(t),r.sdpSent=!0,t.success(r.mySdp)}(e,t);else{let t={candidate:n.candidate.candidate,sdpMid:n.candidate.sdpMid,sdpMLineIndex:n.candidate.sdpMLineIndex};!0===r.trickle&&A(e,t)}},r.pc.ontrack=function(e){if(i.log("Handling Remote Track",e),!e.streams)return;if(!e.track)return;let t=e.transceiver?e.transceiver.mid:e.track.id;try{n.onremotetrack(e.track,t,!0)}catch(e){i.error(e)}if(e.track.onended)return;let o=null;i.log("Adding onended callback to track:",e.track),e.track.onended=function(e){i.log("Remote track removed:",e),clearTimeout(o);let t=r.pc.getTransceivers().find((t=>t.receiver.track===e.target)),a=t?t.mid:e.target.id;try{n.onremotetrack(e.target,a,!1)}catch(e){i.error(e)}},e.track.onmute=function(e){i.log("Remote track muted:",e),o||(o=setTimeout((function(){i.log("Removing remote track");let t=r.pc.getTransceivers().find((t=>t.receiver.track===e.target)),a=t?t.mid:e.target.id;try{n.onremotetrack(e.target,a,!1)}catch(e){i.error(e)}o=null}),2520))},e.track.onunmute=function(e){if(i.log("Remote track flowing again:",e),null!=o)clearTimeout(o),o=null;else try{let t=r.pc.getTransceivers().find((t=>t.receiver.track===e.target)),o=t?t.mid:e.target.id;n.onremotetrack(e.target,o,!0)}catch(e){i.error(e)}}}}async function x(e,t,n){(n=n||{}).success="function"==typeof n.success?n.success:i.noop,n.error="function"==typeof n.error?n.error:q;let r=n.jsep;if(t&&r)return i.error("Provided a JSEP to a createOffer"),void n.error("Provided a JSEP to a createOffer");if(!(t||r&&r.type&&r.sdp))return i.error("A valid JSEP is required for createAnswer"),void n.error("A valid JSEP is required for createAnswer");if(n.media&&!n.tracks){if(n.tracks=i.mediaToTracks(n.media),!0===n.simulcast||!0===n.simulcast2||n.svc)for(let e of n.tracks)if("video"===e.type){!0===n.simulcast||!0===n.simulcast2?e.simulcast=!0:n.svc&&(e.svc=n.svc);break}i.warn("Deprecated media object passed, use tracks instead. Automatically translated to:",n.tracks)}if(n.tracks&&!Array.isArray(n.tracks))return i.error("Tracks must be an array"),void n.error("Tracks must be an array");let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),void n.error("Invalid handle");let a=o.webrtcStuff;var s;a.trickle=(s=n.trickle,i.debug("isTrickleEnabled:",s),!1!==s);try{if(M(e,n),t&&await U(e,n),r){if(await a.pc.setRemoteDescription(r),i.log("Remote description accepted!"),a.remoteSdp=r.sdp,a.candidates&&a.candidates.length>0){for(let e=0;e<a.candidates.length;e++){let t=a.candidates[e];i.debug("Adding remote candidate:",t),t&&!0!==t.completed?a.pc.addIceCandidate(t):a.pc.addIceCandidate(i.endOfCandidates)}a.candidates=[]}await U(e,n);let t=await async function(e,t){t=t||{},t.customizeSdp="function"==typeof t.customizeSdp?t.customizeSdp:i.noop;let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;i.log("Creating answer (iceDone="+r.iceDone+")");let o=await r.pc.createAnswer();i.debug(o);let a={type:"answer",sdp:o.sdp};if(t.customizeSdp(a),o.sdp=a.sdp,i.log("Setting local description"),r.mySdp={type:"answer",sdp:o.sdp},await r.pc.setLocalDescription(o),!r.iceDone&&!r.trickle)return i.log("Waiting for all candidates..."),null;r.insertableStreams&&(o.e2ee=!0);return o}(e,n);n.success(t)}else{let t=await async function(e,t){t=t||{},t.customizeSdp="function"==typeof t.customizeSdp?t.customizeSdp:i.noop;let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;i.log("Creating offer (iceDone="+r.iceDone+")");let o={},a=!0===t.iceRestart;a&&(o.iceRestart=!0);i.debug(o);let s=await r.pc.createOffer(o);i.debug(s);let c={type:"offer",sdp:s.sdp};if(t.customizeSdp(c),s.sdp=c.sdp,i.log("Setting local description"),r.mySdp={type:"offer",sdp:s.sdp},await r.pc.setLocalDescription(s),r.mediaConstraints=o,!r.iceDone&&!r.trickle)return i.log("Waiting for all candidates..."),null;r.insertableStreams&&(s.e2ee=!0);return s}(e,n);n.success(t)}}catch(e){i.error(e),n.error(e)}}function j(e,t){(t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:q,t.customizeSdp="function"==typeof t.customizeSdp?t.customizeSdp:i.noop;let n=t.jsep,r=S[e];if(!r||!r.webrtcStuff)return i.warn("Invalid handle"),void t.error("Invalid handle");let o=r.webrtcStuff;if(n){if(!o.pc)return i.warn("Wait, no PeerConnection?? if this is an answer, use createAnswer and not handleRemoteJsep"),void t.error("No PeerConnection: if this is an answer, use createAnswer and not handleRemoteJsep");t.customizeSdp(n),o.pc.setRemoteDescription(n).then((function(){if(i.log("Remote description accepted!"),o.remoteSdp=n.sdp,o.candidates&&o.candidates.length>0){for(let e=0;e<o.candidates.length;e++){let t=o.candidates[e];i.debug("Adding remote candidate:",t),t&&!0!==t.completed?o.pc.addIceCandidate(t):o.pc.addIceCandidate(i.endOfCandidates)}o.candidates=[]}t.success()}),t.error)}else t.error("Invalid JSEP")}async function G(e,t){if((t=t||{}).success="function"==typeof t.success?t.success:i.noop,t.error="function"==typeof t.error?t.error:i.noop,t.tracks&&!Array.isArray(t.tracks))return i.error("Tracks must be an array"),void t.error("Tracks must be an array");for(let e of t.tracks)(e.add||!e.replace&&!e.remove)&&(e.replace=!0);try{await U(e,t),t.success()}catch(e){i.error(e),t.error(e)}}async function U(e,t){let n=S[e];if(!n||!n.webrtcStuff)throw i.warn("Invalid handle, not sending anything"),"Invalid handle";let r=n.webrtcStuff;if(!r.pc)throw i.warn("Invalid PeerConnection"),"Invalid PeerConnection";let o=t.tracks;if(!o||!Array.isArray(o)||0===o.length)return;let a=!1,s={};for(let e of o){if(delete e.gumGroup,!e.type||!["audio","video"].includes(e.type))continue;if(!e.capture||e.capture instanceof MediaStreamTrack)continue;let t=e.group?e.group:"default";s[t]||(s[t]={}),s[t][e.type]||(e.gumGroup=t,s[t][e.type]=e)}let c=Object.keys(s);for(let e of c){let t=s[e];t.audio&&t.video||(t.audio&&delete t.audio.gumGroup,t.video&&delete t.video.gumGroup,delete s[e])}let d=!!t.jsep;for(let t of o){if(!t.type){i.warn("Missing track type:",t);continue}if("data"===t.type){if(r.pc.ondatachannel){i.warn("Data channel exists already, not creating another one");continue}i.log("Creating default data channel"),O(e,i.dataChanDefaultLabel,null,!1),r.pc.ondatachannel=function(t){i.log("Data channel created by Janus:",t),O(e,t.channel.label,t.channel.protocol,t.channel)};continue}if(void 0===t.add&&null===t.add&&void 0===t.remove&&null===t.remove&&void 0===t.replace&&null===t.replace&&(t.add=!0),t.add&&t.remove||t.add&&t.remove&&t.replace){i.warn("Conflicting actions for track, ignoring:",t);continue}t.add&&t.replace?(i.warn("Both add and replace provided, falling back to replace:",t),delete t.add):t.remove&&t.replace&&(i.warn("Both remove and replace provided, falling back to remove:",t),delete t.replace);let o=t.type;"screen"===t.type&&(o="video");let c=null,l=null;if(c=t.mid?r.pc.getTransceivers().find((e=>e.mid===t.mid&&e.receiver.track.kind===o)):r.pc.getTransceivers().find((e=>e.receiver.track.kind===o)),t.replace||t.remove){if(!c){i.warn("Couldn't find a transceiver for track:",t);continue}if(!c.sender){i.warn("No sender in the transceiver for track:",t);continue}l=c.sender}if(d&&!c&&(c=r.pc.getTransceivers().find((e=>e.receiver.track.kind===o)),!c)){i.warn("Couldn't find a transceiver for track:",t);continue}let u=null,p=null;if(t.remove)i.log("Removing track from PeerConnection",t),p=l.track?l.track.id:null,await l.replaceTrack(null);else if(t.capture){if(t.gumGroup&&s[t.gumGroup]&&s[t.gumGroup].stream){let e=s[t.gumGroup].stream;u="audio"===t.type?e.getAudioTracks()[0]:e.getVideoTracks()[0],delete s[t.gumGroup].stream,delete s[t.gumGroup],delete t.gumGroup}else if(t.capture instanceof MediaStreamTrack)u=t.capture;else{a||(a=!0,n.consentDialog(!0));let e=i.trackConstraints(t),r=null;if("audio"===t.type||"video"===t.type){if(t.gumGroup){let n="audio"===t.type?"video":"audio";if(s[t.gumGroup]&&s[t.gumGroup][n]){let r=s[t.gumGroup][n],o=i.trackConstraints(r);e[n]=o[n]}}r=await navigator.mediaDevices.getUserMedia(e),t.gumGroup&&e.audio&&e.video&&(s[t.gumGroup].stream=r,delete t.gumGroup)}else r=await navigator.mediaDevices.getDisplayMedia(e);u="audio"===t.type?r.getAudioTracks()[0]:r.getVideoTracks()[0]}if(t.replace){await l.replaceTrack(u);let e="sendrecv";!1!==t.recv&&"inactive"!==c.direction&&"sendonly"!==c.direction||(e="sendonly"),c.setDirection?c.setDirection(e):c.direction=e}else{if(r.myStream||(r.myStream=new MediaStream),"audio"===o||!t.simulcast&&!t.svc)l=r.pc.addTrack(u,r.myStream),c=r.pc.getTransceivers().find((e=>e.sender===l));else if(t.simulcast){if("firefox"!==i.webRTCAdapter.browserDetails.browser){i.log("Enabling rid-based simulcasting:",u);let e=y(t.simulcastMaxBitrates);c=r.pc.addTransceiver(u,{direction:"sendrecv",streams:[r.myStream],sendEncodings:t.sendEncodings||[{rid:"h",active:!0,maxBitrate:e.high},{rid:"m",active:!0,maxBitrate:e.medium,scaleResolutionDownBy:2},{rid:"l",active:!0,maxBitrate:e.low,scaleResolutionDownBy:4}]})}else if(i.log("Enabling Simulcasting for Firefox (RID)"),c=r.pc.addTransceiver(u,{direction:"sendrecv",streams:[r.myStream]}),l=c?c.sender:null,l){let e=l.getParameters();e||(e={});let n=y(t.simulcastMaxBitrates);e.encodings=t.sendEncodings||[{rid:"h",active:!0,maxBitrate:n.high},{rid:"m",active:!0,maxBitrate:n.medium,scaleResolutionDownBy:2},{rid:"l",active:!0,maxBitrate:n.low,scaleResolutionDownBy:4}],l.setParameters(e)}}else i.log("Enabling SVC ("+t.svc+"):",u),c=r.pc.addTransceiver(u,{direction:"sendrecv",streams:[r.myStream],sendEncodings:[{scalabilityMode:t.svc}]});if(l||(l=c?c.sender:null),t.codec)if("firefox"===i.webRTCAdapter.browserDetails.browser)i.warn("setCodecPreferences not supported in Firefox, ignoring codec for track:",t);else if("string"!=typeof t.codec)i.warn("Invalid codec value, ignoring for track:",t);else{let e=o+"/"+t.codec.toLowerCase(),n=RTCRtpReceiver.getCapabilities(o).codecs.filter((function(t){return t.mimeType.toLowerCase()===e}));if(n&&0!==n.length){if(c)try{c.setCodecPreferences(n)}catch(e){i.warn("Failed enforcing codec for this "+o+" track:",e)}}else i.warn("Codec not supported in this browser for this track, ignoring:",t)}if(t.bitrate)if(t.simulcast||t.svc)i.warn("Ignoring bitrate for simulcast/SVC track, use sendEncodings for that");else if(isNaN(t.bitrate)||t.bitrate<0)i.warn("Ignoring invalid bitrate for track:",t);else if(l){let e=l.getParameters();e&&e.encodings&&0!==e.encodings.length?(e.encodings[0].maxBitrate=t.bitrate,await l.setParameters(e)):i.warn("No encodings in the sender parameters, ignoring bitrate for track:",t)}if("video"===o&&t.framerate)if(t.simulcast||t.svc)i.warn("Ignoring framerate for simulcast/SVC track, use sendEncodings for that");else if(isNaN(t.framerate)||t.framerate<0)i.warn("Ignoring invalid framerate for track:",t);else if(l){let e=l.getParameters();e&&e.encodings&&0!==e.encodings.length?(e.encodings[0].maxFramerate=t.framerate,await l.setParameters(e)):i.warn("No encodings in the sender parameters, ignoring framerate for track:",t)}if(t.transforms){if(l&&t.transforms.sender){let e=null;RTCRtpSender.prototype.createEncodedStreams?e=l.createEncodedStreams():(RTCRtpSender.prototype.createAudioEncodedStreams||RTCRtpSender.prototype.createEncodedVideoStreams)&&("audio"===o?e=l.createEncodedAudioStreams():"video"===o&&(e=l.createEncodedVideoStreams())),e&&(console.log("Insertable Streams sender transform:",e),e.readableStream&&e.writableStream?e.readableStream.pipeThrough(t.transforms.sender).pipeTo(e.writableStream):e.readable&&e.writable&&e.readable.pipeThrough(t.transforms.sender).pipeTo(e.writable))}if(c&&c.receiver&&t.transforms.receiver){let e=null;RTCRtpReceiver.prototype.createEncodedStreams?e=c.receiver.createEncodedStreams():(RTCRtpReceiver.prototype.createAudioEncodedStreams||RTCRtpReceiver.prototype.createEncodedVideoStreams)&&("audio"===o?e=c.receiver.createEncodedAudioStreams():"video"===o&&(e=c.receiver.createEncodedVideoStreams())),e&&(console.log("Insertable Streams receiver transform:",e),e.readableStream&&e.writableStream?e.readableStream.pipeThrough(t.transforms.receiver).pipeTo(e.writableStream):e.readable&&e.writable&&e.readable.pipeThrough(t.transforms.receiver).pipeTo(e.writable))}}}u&&!0===t.dontStop&&(u.dontStop=!0)}if(p&&r.myStream){let e=null;if("audio"===o&&r.myStream.getAudioTracks()&&r.myStream.getAudioTracks().length)for(let t of r.myStream.getAudioTracks())t.id===p&&(e=t,i.log("Removing audio track:",e));else if("video"===o&&r.myStream.getVideoTracks()&&r.myStream.getVideoTracks().length)for(let t of r.myStream.getVideoTracks())t.id===p&&(e=t,i.log("Removing video track:",e));if(e){try{r.myStream.removeTrack(e),n.onlocaltrack(e,!1)}catch(e){i.error(e)}if(!0!==e.dontStop)try{e.stop()}catch(e){}}}if(u){r.myStream.addTrack(u),u.onended=function(e){i.log("Local track removed:",e);try{n.onlocaltrack(e.target,!1)}catch(e){i.error(e)}};try{n.onlocaltrack(u,!0)}catch(e){i.error(e)}}if(c){let e=c.direction,n=null,r=u&&c.sender.track,o=!1!==t.recv&&c.receiver.track;r&&o?n="sendrecv":r&&!o?n="sendonly":!r&&o?n="recvonly":r||o||(n="inactive"),n&&n!==e&&(i.warn("Changing direction of transceiver to "+n+" (was "+e+")",t),c.setDirection?c.setDirection(n):c.direction=n)}}a&&n.consentDialog(!1)}function F(e){let t=S[e];if(!t||!t.webrtcStuff)return i.warn("Invalid handle"),null;let n=t.webrtcStuff;if(!n.pc)return i.warn("Invalid PeerConnection"),null;let r=[],o=n.pc.getTransceivers();for(let e of o){let t=null;e.sender&&e.sender.track&&(t={mid:e.mid},t.type=e.sender.track.kind,t.id=e.sender.track.id,t.label=e.sender.track.label),t&&r.push(t)}return r}function V(e){let t=S[e];if(!t||!t.webrtcStuff)return i.warn("Invalid handle"),null;let n=t.webrtcStuff;if(!n.pc)return i.warn("Invalid PeerConnection"),null;let r=[],o=n.pc.getTransceivers();for(let e of o){let t=null;e.receiver&&e.receiver.track&&(t={mid:e.mid},t.type=e.receiver.track.kind,t.id=e.receiver.track.id,t.label=e.receiver.track.label),t&&r.push(t)}return r}function J(e,t,n,r){r="function"==typeof r?r:i.noop;let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),void r(0);let a=n?"remote":"local",s=o.webrtcStuff;if(s.volume[a]||(s.volume[a]={value:0}),!s.pc.getStats||"chrome"!==i.webRTCAdapter.browserDetails.browser&&"safari"!==i.webRTCAdapter.browserDetails.browser)return i.warn("Getting the "+a+" volume unsupported by browser"),void r(0);{let e=s.pc;if(t){let o=s.pc.getTransceivers().find((e=>e.mid===t&&"audio"===e.receiver.track.kind));if(!o)return i.warn("No audio transceiver with mid "+t),void r(0);if(n&&!o.receiver)return i.warn("Remote transceiver track unavailable"),void r(0);if(!n&&!o.sender)return i.warn("Local transceiver track unavailable"),void r(0);e=n?o.receiver:o.sender}return e.getStats().then((function(e){e.forEach((function(e){e&&"audio"===e.kind&&(n&&!e.remoteSource||!n&&"media-source"!==e.type||r(e.audioLevel?e.audioLevel:0))}))})),s.volume[a].value}}function K(e,t,n){let r=S[e];if(!r||!r.webrtcStuff)return i.warn("Invalid handle"),!0;let o=r.webrtcStuff;if(!o.pc)return i.warn("Invalid PeerConnection"),!0;if(!o.myStream)return i.warn("Invalid local MediaStream"),!0;if(n){if(!o.myStream.getVideoTracks()||0===o.myStream.getVideoTracks().length)return i.warn("No video track"),!0;if(t){let e=o.pc.getTransceivers().find((e=>e.mid===t&&"video"===e.receiver.track.kind));return e?e.sender&&e.sender.track?!e.sender.track.enabled:(i.warn("No video sender with mid "+t),!0):(i.warn("No video transceiver with mid "+t),!0)}return!o.myStream.getVideoTracks()[0].enabled}if(!o.myStream.getAudioTracks()||0===o.myStream.getAudioTracks().length)return i.warn("No audio track"),!0;if(t){let e=o.pc.getTransceivers().find((e=>e.mid===t&&"audio"===e.receiver.track.kind));return e?e.sender&&e.sender.track?!e.sender.track.enabled:(i.warn("No audio sender with mid "+t),!0):(i.warn("No audio transceiver with mid "+t),!0)}return!o.myStream.getAudioTracks()[0].enabled}function W(e,t,n,r){let o=S[e];if(!o||!o.webrtcStuff)return i.warn("Invalid handle"),!1;let a=o.webrtcStuff;if(!a.pc)return i.warn("Invalid PeerConnection"),!1;if(!a.myStream)return i.warn("Invalid local MediaStream"),!1;if(n){if(!a.myStream.getVideoTracks()||0===a.myStream.getVideoTracks().length)return i.warn("No video track"),!1;if(t){let e=a.pc.getTransceivers().find((e=>e.mid===t&&"video"===e.receiver.track.kind));if(!e)return i.warn("No video transceiver with mid "+t),!1;if(!e.sender||!e.sender.track)return i.warn("No video sender with mid "+t),!1;e.sender.track.enabled=!r}else for(const e of a.myStream.getVideoTracks())e.enabled=!r}else{if(!a.myStream.getAudioTracks()||0===a.myStream.getAudioTracks().length)return i.warn("No audio track"),!1;if(t){let e=a.pc.getTransceivers().find((e=>e.mid===t&&"audio"===e.receiver.track.kind));if(!e)return i.warn("No audio transceiver with mid "+t),!1;if(!e.sender||!e.sender.track)return i.warn("No audio sender with mid "+t),!1;e.sender.track.enabled=!r}else for(const e of a.myStream.getAudioTracks())e.enabled=!r}return!0}function z(e,t){let n=S[e];if(!n||!n.webrtcStuff)return i.warn("Invalid handle"),"Invalid handle";let r=n.webrtcStuff;if(!r.pc)return"Invalid PeerConnection";if(r.pc.getStats){let e=r.pc,n=t||"default";if(t){let n=r.pc.getTransceivers().find((e=>e.mid===t&&"video"===e.receiver.track.kind));if(!n)return i.warn("No video transceiver with mid "+t),"No video transceiver with mid "+t;if(!n.receiver)return i.warn("No video receiver with mid "+t),"No video receiver with mid "+t;e=n.receiver}return r.bitrate[n]||(r.bitrate[n]={timer:null,bsnow:null,bsbefore:null,tsnow:null,tsbefore:null,value:"0 kbits/sec"}),r.bitrate[n].timer?r.bitrate[n].value:(i.log("Starting bitrate timer"+(t?" for mid "+t:"")+" (via getStats)"),r.bitrate[n].timer=setInterval((function(){e.getStats().then((function(e){e.forEach((function(e){if(!e)return;let t=!1;if(("video"===e.mediaType||e.id.toLowerCase().indexOf("video")>-1)&&"inbound-rtp"===e.type&&e.id.indexOf("rtcp")<0?t=!0:"ssrc"!=e.type||!e.bytesReceived||"VP8"!==e.googCodecName&&""!==e.googCodecName||(t=!0),t)if(r.bitrate[n].bsnow=e.bytesReceived,r.bitrate[n].tsnow=e.timestamp,null===r.bitrate[n].bsbefore||null===r.bitrate[n].tsbefore)r.bitrate[n].bsbefore=r.bitrate[n].bsnow,r.bitrate[n].tsbefore=r.bitrate[n].tsnow;else{let e=r.bitrate[n].tsnow-r.bitrate[n].tsbefore;"safari"===i.webRTCAdapter.browserDetails.browser&&(e/=1e3);let t=Math.round(8*(r.bitrate[n].bsnow-r.bitrate[n].bsbefore)/e);"safari"===i.webRTCAdapter.browserDetails.browser&&(t=parseInt(t/1e3)),r.bitrate[n].value=t+" kbits/sec",r.bitrate[n].bsbefore=r.bitrate[n].bsnow,r.bitrate[n].tsbefore=r.bitrate[n].tsnow}}))}))}),1e3),"0 kbits/sec")}return i.warn("Getting the video bitrate unsupported by browser"),"Feature unsupported by browser"}function B(e,t,n){let r=S[e];if(!r||!r.webrtcStuff)return void i.warn("Invalid handle");let o=r.webrtcStuff;if(!o.pc)return void i.warn("Invalid PeerConnection");let a=o.pc.getTransceivers().find((e=>e.mid===t));if(!a)return void i.warn("No transceiver with mid",t);if(!a.sender)return void i.warn("No sender for transceiver with mid",t);let s=a.sender.getParameters();s&&s.encodings&&0!==s.encodings.length?s.encodings.length>1?i.warn("Ignoring bitrate for simulcast track, use sendEncodings for that"):isNaN(n)||n<0?i.warn("Invalid bitrate (must be a positive integer)"):(s.encodings[0].maxBitrate=n,a.sender.setParameters(s)):i.warn("No parameters encodings")}function q(e){i.error("WebRTC error:",e)}function Y(e,r){i.log("Cleaning WebRTC stuff");let o=S[e];if(!o)return;let a=o.webrtcStuff;if(a){if(!0===r){let r={janus:"hangup",transaction:i.randomString(12)};o.token&&(r.token=o.token),h&&(r.apisecret=h),i.debug("Sending hangup request (handle="+e+"):"),i.debug(r),t?(r.session_id=C,r.handle_id=e,n.send(JSON.stringify(r))):i.httpAPICall(c+"/"+C+"/"+e,{verb:"POST",withCredentials:p,body:r})}a.volume&&(a.volume.local&&a.volume.local.timer&&clearInterval(a.volume.local.timer),a.volume.remote&&a.volume.remote.timer&&clearInterval(a.volume.remote.timer));for(let e in a.bitrate)a.bitrate[e].timer&&clearInterval(a.bitrate[e].timer);a.bitrate={},!a.streamExternal&&a.myStream&&(i.log("Stopping local stream tracks"),i.stopAllTracks(a.myStream)),a.streamExternal=!1,a.myStream=null;try{a.pc.close()}catch(e){}a.pc=null,a.candidates=null,a.mySdp=null,a.remoteSdp=null,a.iceDone=!1,a.dataChannel={},a.dtmfSender=null,a.insertableStreams=!1}o.oncleanup()}I(e),i.getServer=function(){return c},i.isConnected=function(){return b},i.reconnect=function(e){(e=e||{}).success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,e.reconnect=!0,I(e)},i.getSessionId=function(){return C},i.getInfo=function(e){!function(e){if(e=e||{},e.success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,i.log("Getting info on Janus instance"),!b)return i.warn("Is the server down? (connected=false)"),void e.error("Is the server down? (connected=false)");let r=i.randomString(12),o={janus:"info",transaction:r};m&&(o.token=m);h&&(o.apisecret=h);if(t)return R[r]=function(t){i.log("Server info:"),i.debug(t),"server_info"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),e.success(t)},void n.send(JSON.stringify(o));i.httpAPICall(c,{verb:"POST",withCredentials:p,body:o,success:function(t){i.log("Server info:"),i.debug(t),"server_info"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),e.success(t)},error:function(t,n){i.error(t+":",n),""===n?e.error(t+": Is the server down?"):e.error(t+": "+n)}})}(e)},i.destroy=function(a){!function(a){a=a||{},a.success="function"==typeof a.success?a.success:i.noop,a.error="function"==typeof a.error?a.error:i.noop;let s=!0===a.unload,d=!0;void 0!==a.notifyDestroyed&&null!==a.notifyDestroyed&&(d=!0===a.notifyDestroyed);let l=!0===a.cleanupHandles;if(i.log("Destroying session "+C+" (unload="+s+")"),!C)return i.warn("No session to destroy"),a.success(),void(d&&e.destroyed());if(l)for(let e in S)L(e,{noRequest:!0});if(!b)return i.warn("Is the server down? (connected=false)"),C=null,void a.success();let u={janus:"destroy",transaction:i.randomString(12)};m&&(u.token=m);h&&(u.apisecret=h);if(s)return t?(n.onclose=null,n.close(),n=null):navigator.sendBeacon(c+"/"+C,JSON.stringify(u)),i.log("Destroyed session:"),C=null,b=!1,a.success(),void(d&&e.destroyed());if(t){u.session_id=C;let t=function(){for(let e in r)n.removeEventListener(e,r[e]);n.removeEventListener("message",i),n.removeEventListener("error",s),o&&clearTimeout(o),n.close()},i=function(n){let r=JSON.parse(n.data);r.session_id==u.session_id&&r.transaction==u.transaction&&(t(),a.success(),d&&e.destroyed())},s=function(){t(),a.error("Failed to destroy the server: Is the server down?"),d&&e.destroyed()};return n.addEventListener("message",i),n.addEventListener("error",s),void(1===n.readyState?n.send(JSON.stringify(u)):s())}i.httpAPICall(c+"/"+C,{verb:"POST",withCredentials:p,body:u,success:function(t){i.log("Destroyed session:"),i.debug(t),C=null,b=!1,"success"!==t.janus&&i.error("Ooops: "+t.error.code+" "+t.error.reason),a.success(),d&&e.destroyed()},error:function(t,n){i.error(t+":",n),C=null,b=!1,a.success(),d&&e.destroyed()}})}(a)},i.attach=function(e){!function(e){if(e=e||{},e.success="function"==typeof e.success?e.success:i.noop,e.error="function"==typeof e.error?e.error:i.noop,e.dataChannelOptions=e.dataChannelOptions||{ordered:!0},e.consentDialog="function"==typeof e.consentDialog?e.consentDialog:i.noop,e.webrtcTimeout="function"==typeof e.webrtcTimeout?e.webrtcTimeout:i.noop,e.iceState="function"==typeof e.iceState?e.iceState:i.noop,e.mediaState="function"==typeof e.mediaState?e.mediaState:i.noop,e.webrtcState="function"==typeof e.webrtcState?e.webrtcState:i.noop,e.slowLink="function"==typeof e.slowLink?e.slowLink:i.noop,e.onmessage="function"==typeof e.onmessage?e.onmessage:i.noop,e.onlocaltrack="function"==typeof e.onlocaltrack?e.onlocaltrack:i.noop,e.onremotetrack="function"==typeof e.onremotetrack?e.onremotetrack:i.noop,e.ondata="function"==typeof e.ondata?e.ondata:i.noop,e.ondataopen="function"==typeof e.ondataopen?e.ondataopen:i.noop,e.oncleanup="function"==typeof e.oncleanup?e.oncleanup:i.noop,e.ondetached="function"==typeof e.ondetached?e.ondetached:i.noop,!b)return i.warn("Is the server down? (connected=false)"),void e.error("Is the server down? (connected=false)");let r=e.plugin;if(!r)return i.error("Invalid plugin"),void e.error("Invalid plugin");let o=e.opaqueId,a=e.loopIndex,s=e.token?e.token:m,d=i.randomString(12),l={janus:"attach",plugin:r,opaque_id:o,loop_index:a,transaction:d};s&&(l.token=s);h&&(l.apisecret=h);if(t)return R[d]=function(t){if(i.debug(t),"success"!==t.janus)return i.error("Ooops: "+t.error.code+" "+t.error.reason),void e.error("Ooops: "+t.error.code+" "+t.error.reason);let n=t.data.id;i.log("Created handle: "+n);let o={session:T,plugin:r,id:n,token:s,detached:!1,webrtcStuff:{started:!1,myStream:null,streamExternal:!1,mySdp:null,mediaConstraints:null,pc:null,dataChannelOptions:e.dataChannelOptions,dataChannel:{},dtmfSender:null,trickle:!0,iceDone:!1,bitrate:{}},getId:function(){return n},getPlugin:function(){return r},getVolume:function(e,t){return J(n,e,!0,t)},getRemoteVolume:function(e,t){return J(n,e,!0,t)},getLocalVolume:function(e,t){return J(n,e,!1,t)},isAudioMuted:function(e){return K(n,e,!1)},muteAudio:function(e){return W(n,e,!1,!0)},unmuteAudio:function(e){return W(n,e,!1,!1)},isVideoMuted:function(e){return K(n,e,!0)},muteVideo:function(e){return W(n,e,!0,!0)},unmuteVideo:function(e){return W(n,e,!0,!1)},getBitrate:function(e){return z(n,e)},setMaxBitrate:function(e,t){return B(n,e,t)},send:function(e){E(n,e)},data:function(e){D(n,e)},dtmf:function(e){N(n,e)},consentDialog:e.consentDialog,webrtcTimeout:e.webrtcTimeout,iceState:e.iceState,mediaState:e.mediaState,webrtcState:e.webrtcState,slowLink:e.slowLink,onmessage:e.onmessage,createOffer:function(e){x(n,!0,e)},createAnswer:function(e){x(n,!1,e)},handleRemoteJsep:function(e){j(n,e)},replaceTracks:function(e){G(n,e)},getLocalTracks:function(){return F(n)},getRemoteTracks:function(){return V(n)},onlocaltrack:e.onlocaltrack,onremotetrack:e.onremotetrack,ondata:e.ondata,ondataopen:e.ondataopen,oncleanup:e.oncleanup,ondetached:e.ondetached,hangup:function(e){Y(n,!0===e)},detach:function(e){L(n,e)}};S[n]=o,e.success(o)},l.session_id=C,void n.send(JSON.stringify(l));i.httpAPICall(c+"/"+C,{verb:"POST",withCredentials:p,body:l,success:function(t){if(i.debug(t),"success"!==t.janus)return i.error("Ooops: "+t.error.code+" "+t.error.reason),void e.error("Ooops: "+t.error.code+" "+t.error.reason);let n=t.data.id;i.log("Created handle: "+n);let o={session:T,plugin:r,id:n,token:s,detached:!1,webrtcStuff:{started:!1,myStream:null,streamExternal:!1,mySdp:null,mediaConstraints:null,pc:null,dataChannelOptions:e.dataChannelOptions,dataChannel:{},dtmfSender:null,trickle:!0,iceDone:!1,bitrate:{}},getId:function(){return n},getPlugin:function(){return r},getVolume:function(e,t){return J(n,e,!0,t)},getRemoteVolume:function(e,t){return J(n,e,!0,t)},getLocalVolume:function(e,t){return J(n,e,!1,t)},isAudioMuted:function(e){return K(n,e,!1)},muteAudio:function(e){return W(n,e,!1,!0)},unmuteAudio:function(e){return W(n,e,!1,!1)},isVideoMuted:function(e){return K(n,e,!0)},muteVideo:function(e){return W(n,e,!0,!0)},unmuteVideo:function(e){return W(n,e,!0,!1)},getBitrate:function(e){return z(n,e)},setMaxBitrate:function(e,t){return B(n,e,t)},send:function(e){E(n,e)},data:function(e){D(n,e)},dtmf:function(e){N(n,e)},consentDialog:e.consentDialog,webrtcTimeout:e.webrtcTimeout,iceState:e.iceState,mediaState:e.mediaState,webrtcState:e.webrtcState,slowLink:e.slowLink,onmessage:e.onmessage,createOffer:function(e){x(n,!0,e)},createAnswer:function(e){x(n,!1,e)},handleRemoteJsep:function(e){j(n,e)},replaceTracks:function(e){G(n,e)},getLocalTracks:function(){return F(n)},getRemoteTracks:function(){return V(n)},onlocaltrack:e.onlocaltrack,onremotetrack:e.onremotetrack,ondata:e.ondata,ondataopen:e.ondataopen,oncleanup:e.oncleanup,ondetached:e.ondetached,hangup:function(e){Y(n,!0===e)},detach:function(e){L(n,e)}};S[n]=o,e.success(o)},error:function(t,n){i.error(t+":",n),""===n?e.error(t+": Is the server down?"):e.error(t+": "+n)}})}(e)}}i.useDefaultDependencies=function(e){let t=e&&e.fetch||fetch,n=e&&e.Promise||Promise,r=e&&e.WebSocket||WebSocket;return{newWebSocket:function(e,t){return new r(e,t)},extension:e&&e.extension||o,isArray:function(e){return Array.isArray(e)},webRTCAdapter:e&&e.adapter||adapter,httpAPICall:function(e,r){let o={method:r.verb,headers:{Accept:"application/json, text/plain, */*"},cache:"no-cache"};"POST"===r.verb&&(o.headers["Content-Type"]="application/json"),void 0!==r.withCredentials&&(o.credentials=!0===r.withCredentials?"include":r.withCredentials?r.withCredentials:"omit"),r.body&&(o.body=JSON.stringify(r.body));let a=t(e,o).catch((function(e){return n.reject({message:"Probably a network error, is the server down?",error:e})}));if(r.timeout){let e=new n((function(e,t){let n=setTimeout((function(){return clearTimeout(n),t({message:"Request timed out",timeout:r.timeout})}),r.timeout)}));a=n.race([a,e])}return a.then((function(e){return e.ok?typeof r.success==typeof i.noop?e.json().then((function(e){try{r.success(e)}catch(e){i.error("Unhandled httpAPICall success callback error",e)}}),(function(t){return n.reject({message:"Failed to parse response body",error:t,response:e})})):void 0:n.reject({message:"API call failed",response:e})})).catch((function(e){typeof r.error==typeof i.noop&&r.error(e.message||"<< internal error >>",e)})),a}}},i.useOldDependencies=function(e){let t=e&&e.jQuery||jQuery,n=e&&e.WebSocket||WebSocket;return{newWebSocket:function(e,t){return new n(e,t)},isArray:function(e){return t.isArray(e)},extension:e&&e.extension||o,webRTCAdapter:e&&e.adapter||adapter,httpAPICall:function(e,n){let r=void 0!==n.body?{contentType:"application/json",data:JSON.stringify(n.body)}:{},o=void 0!==n.withCredentials?{xhrFields:{withCredentials:n.withCredentials}}:{};return t.ajax(t.extend(r,o,{url:e,type:n.verb,cache:!1,dataType:"json",async:n.async,timeout:n.timeout,success:function(e){typeof n.success==typeof i.noop&&n.success(e)},error:function(e,t,r){typeof n.error==typeof i.noop&&n.error(t,r)}}))}}},i.mediaToTracks=function(e){let t=[];if(e){if(!e.keepAudio&&!1!==e.audio&&(void 0===e.audio||e.audio||e.audioSend||e.audioRecv||e.addAudio||e.replaceAudio||e.removeAudio)){let n={type:"audio"};e.removeAudio?n.remove=!0:(e.addAudio?n.add=!0:e.replaceAudio&&(n.replace=!0),!1!==e.audioSend&&(n.capture=e.audio||!0),!1!==e.audioRecv&&(n.recv=!0)),(n.remove||n.capture||n.recv)&&t.push(n)}if(!e.keepVideo&&!1!==e.video&&(void 0===e.video||e.video||e.videoSend||e.videoRecv||e.addVideo||e.replaceVideo||e.removeVideo)){let n={type:"video"};e.removeVideo?n.remove=!0:(e.addVideo?n.add=!0:e.replaceVideo&&(n.replace=!0),!1!==e.videoSend&&(n.capture=e.video||!0,["screen","window","desktop"].includes(n.capture)&&(n.type="screen",n.capture={video:{}},e.screenshareFrameRate&&(n.capture.frameRate=e.screenshareFrameRate),e.screenshareHeight&&(n.capture.height=e.screenshareHeight),e.screenshareWidth&&(n.capture.width=e.screenshareWidth))),!1!==e.videoRecv&&(n.recv=!0)),(n.remove||n.capture||n.recv)&&t.push(n)}e.data&&t.push({type:"data"})}else t.push({type:"audio",capture:!0,recv:!0}),t.push({type:"video",capture:!0,recv:!0});return t},i.trackConstraints=function(e){let t={};if(!e||!e.capture)return t;if("audio"===e.type)t.audio=e.capture;else if("video"===e.type)if((e.simulcast||e.svc)&&!0===e.capture&&(e.capture="hires"),!0===e.capture||"object"==typeof e.capture)t.video=e.capture;else{let n=0,r=0;"lowres"===e.capture?(n=320,r=240):"lowres-16:9"===e.capture?(n=320,r=180):"hires"===e.capture||"hires-16:9"===e.capture||"hdres"===e.capture?(n=1280,r=720):"fhdres"===e.capture?(n=1920,r=1080):"4kres"===e.capture?(n=3840,r=2160):"stdres"===e.capture?(n=640,r=480):"stdres-16:9"===e.capture?(n=640,r=360):(i.log("Default video setting is stdres 4:3"),n=640,r=480),t.video={width:{ideal:n},height:{ideal:r}}}else"screen"===e.type&&(t.video=e.capture);return t},i.noop=function(){},i.dataChanDefaultLabel="JanusDataChannel",i.endOfCandidates=null,i.stopAllTracks=function(e){try{let t=e.getTracks();for(let e of t)i.log(e),e&&!0!==e.dontStop&&e.stop()}catch(e){}},i.init=function(e){if((e=e||{}).callback="function"==typeof e.callback?e.callback:i.noop,i.initDone)e.callback();else{if(void 0===console.log&&(console.log=function(){}),i.trace=i.noop,i.debug=i.noop,i.vdebug=i.noop,i.log=i.noop,i.warn=i.noop,i.error=i.noop,!0===e.debug||"all"===e.debug)i.trace=console.trace.bind(console),i.debug=console.debug.bind(console),i.vdebug=console.debug.bind(console),i.log=console.log.bind(console),i.warn=console.warn.bind(console),i.error=console.error.bind(console);else if(Array.isArray(e.debug))for(let t of e.debug)switch(t){case"trace":i.trace=console.trace.bind(console);break;case"debug":i.debug=console.debug.bind(console);break;case"vdebug":i.vdebug=console.debug.bind(console);break;case"log":i.log=console.log.bind(console);break;case"warn":i.warn=console.warn.bind(console);break;case"error":i.error=console.error.bind(console);break;default:console.error("Unknown debugging option '"+t+"' (supported: 'trace', 'debug', 'vdebug', 'log', warn', 'error')")}i.log("Initializing library");let t=e.dependencies||i.useDefaultDependencies();i.isArray=t.isArray,i.webRTCAdapter=t.webRTCAdapter,i.httpAPICall=t.httpAPICall,i.newWebSocket=t.newWebSocket,i.extension=t.extension,i.extension.init(),i.listDevices=function(e,t){e="function"==typeof e?e:i.noop,t||(t={audio:!0,video:!0}),i.isGetUserMediaAvailable()?navigator.mediaDevices.getUserMedia(t).then((function(t){navigator.mediaDevices.enumerateDevices().then((function(n){i.debug(n),e(n),i.stopAllTracks(t)}))})).catch((function(t){i.error(t),e([])})):(i.warn("navigator.mediaDevices unavailable"),e([]))},i.attachMediaStream=function(e,t){try{e.srcObject=t}catch(n){try{e.src=URL.createObjectURL(t)}catch(e){i.error("Error attaching stream to element",e)}}},i.reattachMediaStream=function(e,t){try{e.srcObject=t.srcObject}catch(n){try{e.src=t.src}catch(e){i.error("Error reattaching stream to element",e)}}};let n=["iPad","iPhone","iPod"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",r=window["on"+n];if(window.addEventListener(n,(function(){i.log("Closing window");for(let e in i.sessions)i.sessions[e]&&i.sessions[e].destroyOnUnload&&(i.log("Destroying session "+e),i.sessions[e].destroy({unload:!0,notifyDestroyed:!1}));r&&"function"==typeof r&&r()})),i.safariVp8=!1,"safari"===i.webRTCAdapter.browserDetails.browser&&i.webRTCAdapter.browserDetails.version>=605)if(RTCRtpSender&&RTCRtpSender.getCapabilities&&RTCRtpSender.getCapabilities("video")&&RTCRtpSender.getCapabilities("video").codecs&&RTCRtpSender.getCapabilities("video").codecs.length){for(let e of RTCRtpSender.getCapabilities("video").codecs)if(e&&e.mimeType&&"video/vp8"===e.mimeType.toLowerCase()){i.safariVp8=!0;break}i.safariVp8?i.log("This version of Safari supports VP8"):i.warn("This version of Safari does NOT support VP8: if you're using a Technology Preview, try enabling the 'WebRTC VP8 codec' setting in the 'Experimental Features' Develop menu")}else{let e=new RTCPeerConnection({});e.createOffer({offerToReceiveVideo:!0}).then((function(t){i.safariVp8=-1!==t.sdp.indexOf("VP8"),i.safariVp8?i.log("This version of Safari supports VP8"):i.warn("This version of Safari does NOT support VP8: if you're using a Technology Preview, try enabling the 'WebRTC VP8 codec' setting in the 'Experimental Features' Develop menu"),e.close(),e=null}))}i.initDone=!0,e.callback()}},i.isWebrtcSupported=function(){return!!window.RTCPeerConnection},i.isGetUserMediaAvailable=function(){return navigator.mediaDevices&&navigator.mediaDevices.getUserMedia},i.randomString=function(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n="";for(let r=0;r<e;r++){let e=Math.floor(62*Math.random());n+=t.charAt(e)}return n};const a={agentId:"",agentKey:"",companyId:"",agentType:"",token:"",wsServer:"",webrtcServer:"",sipServer:"",agentCode:"",sipPwd:"",groupId:"",groupIds:[]};const s=new class{instance=null;socket=null;janus=null;sipcall=null;stream=null;events={};seat={};status=e.LOGIN;lastStatus=e.LOGIN;reconnectState=null;autoAcceptTimer=null;code=0;msg=null;jsep=null;isHangup=!1;constructor(){if(this.instance)return this.instance;this.instance=this}_init(e){this.seat={...a,...e},this._initMedia();const t=`${this.seat.wsServer}?token=${this.seat.token}`;this.connectWs(t)}_initMedia(){const e=document.getElementById("mediaContainer");e&&(e.parentNode.removeChild(e),console.log("["+this.datelog()+"] 清理旧的媒体容器"));const t=document.createElement("div");t.id="mediaContainer",t.style.width="0px",t.style.height="0px",t.style.position="absolute",t.style.top="0px",t.style.left="0px",t.style.zIndex="-1",t.style.visibility="hidden",t.style.overflow="hidden",document.body.appendChild(t);const n=document.createElement("audio");n.id="incomingcallAudio",n.loop=!0,n.src="https://r.hanfatong.com/voicenine/beep.mp3",t.appendChild(n);const r=document.createElement("audio");r.id="callEndAudio",r.loop=!1,r.src="https://r.hanfatong.com/voicenine/hangup.mp3",t.appendChild(r);const o=document.createElement("video");o.id="peerVideo",o.autoplay=!0,t.appendChild(o);const i=document.createElement("video");i.id="remoteVideo",i.autoplay=!0,t.appendChild(i)}_initJanus(){const{webrtcServer:t,sipServer:n}=this.seat;if(!t||!n)return void console.error("WebRTC server or SIP server is not configured.");let r={},o={},a=0,s=!1;i.init({debug:"all",callback:()=>{console.log("["+this.datelog()+"] Janus initialized.");if(!i.isWebrtcSupported())return void console.info("No WebRTC support... ");const n=new i({server:t,success:()=>{i.attach({plugin:"janus.plugin.sip",opaqueId:"voicenine_"+i.randomString(16),success:e=>{console.log("["+this.datelog()+"] SIP plugin attached."),i.log("Plugin attached! ("+e.getPlugin()+", id="+e.getId()+")");const t={request:"register",username:this.seat.agentCode,authuser:this.seat.agentCode,display_name:this.seat.agentCode,secret:this.seat.sipPwd};e.send({message:t}),this.sipcall=e},onmessage:(t,n)=>{i.debug(" ::: Got a message :::",t);const{call_id:r,result:o}=t;if(o?.event){const a=o.event;if(this.msg=null,this.jsep=null,"registration_failed"===a)i.warn("Registration failed: "+o.code+" "+o.reason);else if("registered"===a)i.log("Successfully registered as "+o.username+"!"),s||(s=!0,o.master_id);else if("calling"===a)i.log("Waiting for the peer to answer...");else if("incomingcall"===a){i.log("Incoming call from "+o.username+"!"),this.sipcall.callId=r,this.toggleRing(!0),this.msg=t,this.jsep=n;const a=()=>{2==this.seat.workType||this.status===e.OUT_CALL||this.status===e.OUT_CALLER_RING?(this.autoAcceptTimer&&clearTimeout(this.autoAcceptTimer),this.accept(t,n)):this.status!==e.READY&&this.status!==e.NOT_READY&&this.status!==e.WORK_NOT_READY&&this.status!==e.AFTER||(this.autoAcceptTimer&&clearTimeout(this.autoAcceptTimer),this.autoAcceptTimer=setTimeout((()=>a()),50))};2==this.seat.loginType&&a()}else if("accepting"===a);else if("progress"===a)i.log("There's early media from "+o.username+", wairing for the call!",n),n&&this.sipcall.handleRemoteJsep({jsep:n});else if("accepted"===a)i.log(o.username+" accepted the call!",n),this.toggleRing(!1),n&&this.sipcall.handleRemoteJsep({jsep:n}),this.sipcall.callId=r;else if("updatingcall"===a){i.log("Got re-INVITE");const e=n.sdp.indexOf("m=audio ")>-1,t=n.sdp.indexOf("m=video ")>-1,r=[];e&&!this.sipcall.doAudio&&(this.sipcall.doAudio=!0,r.push({type:"audio",capture:!0,recv:!0})),t&&!this.sipcall.doVideo&&(this.sipcall.doVideo=!0,r.push({type:"video",capture:!0,recv:!0})),this.sipcall.createAnswer({jsep:n,tracks:r,success:n=>{i.debug("Got SDP "+n.type+"! audio="+e+", video="+t+":",n);this.sipcall.send({message:{request:"update"},jsep:n})},error:e=>{i.error("WebRTC error:",e)}})}else if("message"===a){let e=o.displayname?o.displayname:o.sender,t=o.content;console.info("sender = "+e),console.info("content = "+t)}else if("info"===a){let e=o.displayname?o.displayname:o.sender,t=o.content;t=t.replace(new RegExp("<","g"),"&lt"),t=t.replace(new RegExp(">","g"),"&gt"),console.log("["+this.datelog()+"] sender = "+e+", content = "+t)}else"notify"===a||"transfer"===a||"hangup"===a&&(i.log("Call hung up ("+o.code+" "+o.reason+")!"),setTimeout((()=>{this.toggleRing(!1)}),0),setTimeout((()=>{this.sipcall&&this.sipcall.hangup()}),150))}},onlocaltrack:(e,t)=>{i.log("Local track "+(t?"added":"removed")+":",e);const n=e.id.replace(/[{}]/g,"");if(!t){if(this.stream=r[n],this.stream)try{const e=this.stream.getTracks(),t=e.some((e=>"audio"===e.kind&&e.getSettings().deviceId&&e.label.toLowerCase().includes("bluetooth")));setTimeout((()=>{e.forEach((e=>{e&&"ended"!==e.readyState&&("audio"===e.kind?(e.enabled=!1,setTimeout((()=>e.stop()),50)):e.stop())}))}),t?300:100)}catch(e){console.error(e)}return"video"===e.kind&&(a--,0===a&&console.log("No video")),void delete r[n]}if(this.stream=r[n],!this.stream){if("audio"===e.kind);else{a++,this.stream=new MediaStream([e]),r[n]=this.stream,i.log("Created local stream:",this.stream);let t=document.getElementById("remoteVideo");i.attachMediaStream(t,this.stream)}"completed"!==this.sipcall.webrtcStuff.pc.iceConnectionState&&this.sipcall.webrtcStuff.pc.iceConnectionState}},onremotetrack:function(e,t,n){if(i.log("Remote track (mid="+t+") "+(n?"added":"removed")+":",e),n&&"audio"===e.kind){this.stream=new MediaStream([e]),o[t]=this.stream,i.log("Created remote audio stream:",this.stream);let n=document.getElementById("peerVideo");i.attachMediaStream(n,this.stream)}},oncleanup:()=>{i.log(" ::: Got a cleanup notification :::"),setTimeout((()=>{this.sipcall&&(delete this.sipcall.callId,delete this.sipcall.doAudio)}),50),setTimeout((()=>{Object.values(r).forEach((e=>{if(e){e.getTracks().forEach((e=>{"ended"!==e.readyState&&e.stop()}))}}))}),100),setTimeout((()=>{r={},o={},a=0,this.stream=null}),200)},error:e=>{i.error(" -- Error attaching plugin...",e)},consentDialog:function(e){i.debug("Consent dialog should be "+(e?"on":"off")+" now")},webrtcTimeout:function(e){console.log("-=========="+e)},iceState:function(e){i.log("ICE state changed to "+e)},mediaState:function(e,t,n){i.log("janus "+(t?"started":"stopped")+" receiving our "+e+" (mid="+n+")")},webrtcState:function(e){i.log("janus says our WebRTC PeerConnection is "+(e?"up":"down")+" now")},slowLink:function(e,t,n){i.warn("janus reports problems "+(e?"sending":"receiving")+" packets on mid "+n+" ("+t+" lost packets)")}})},error:function(e){i.error(e)},destroyed:function(){console.info("destroyed===========")}});this.janus=n,window.Janus=i}})}accept(e,t){(0,this.sipcall.createAnswer)({jsep:t,media:{audio:!0,video:!1},success:e=>{this.sipcall.send({message:{request:"accept"},jsep:e})},error:e=>{i.error("WebRTC error:",e);this.sipcall.send({message:{request:"decline",code:480}})}}),this.autoAcceptTimer&&clearTimeout(this.autoAcceptTimer)}echo(e){this.socket?(console.log("["+this.datelog()+"] sent: "+e),this.socket.send(e)):alert("WebSocket connection not established, please connect.")}toggleRing(e){const t=document.getElementById("incomingcallAudio");e?t.play():t.pause()}playEndRing(){document.getElementById("callEndAudio").play()}connectWs(t){if(console.log("["+this.datelog()+"] 连接WebSocket: "+t),!window.WebSocket)return void alert("您的浏览器不支持WebSocket协议!");const n=new WebSocket(t);this.socket=n,n.onmessage=t=>{console.log("["+this.datelog()+"] received: "+t.data);const n=JSON.parse(t.data);this.onmessage(n);let r=n.type;e[r]&&(0===n.code&&(this.lastStatus=this.status,this.status=r,console.log("["+this.datelog()+"] 状态变更: "+this.lastStatus+" -> "+this.status)),this.handleStatusChange(n))};let r=null;n.onopen=()=>{console.log("["+this.datelog()+"] Info: WebSocket connection opened."),this.clearReconectStatus();this.sendAction(e.LOGIN),r=setInterval((()=>{let e={cmd:"ping",agentKey:this.seat.agentKey,sequence:(new Date).getTime()};this.echo(JSON.stringify(e))}),5e3)},n.onclose=e=>{console.log("["+this.datelog()+"] Info: WebSocket connection closed, Code: "+e.code+(""==e.reason?"":", Reason: "+e.reason)),this.reconectInterval&&clearInterval(this.reconectInterval),r&&clearInterval(r);this.trigger("logout",this.code),2===this.seat.loginType&&i.destroy(),[1403,1105,1417].includes(this.code)?console.log("["+this.datelog()+"] 不自动重连"):this.reconectInterval=setInterval((()=>{2===this.seat.loginType&&i.destroy();const e=`${this.seat.wsServer}?token=${this.seat.token}`;this.connectWs(e)}),5e3)}}changeStatus(e){this.echo(`{"cmd":"${e}", "agentKey": "${this.seat.agentKey}", "sequence": ${(new Date).getTime()} }`),this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval)}handleStatusChange(t){const{type:n,message:r,code:o,data:i}=t;if(n===e.LOGIN)2===this.seat.loginType&&0===o&&this._initJanus(),null==this.reconnectState?this.sendAction(i.loginState):this.sendAction(this.reconnectState);else if(n===e.AFTER){this.lastStatus.includes("TALKING")&&(this.isHangup?this.isHangup=!1:this.playEndRing()),2===i.loginType&&0===i.answerTime&&("404"!==i.sipStatus&&"483"!==i.sipStatus||this._initJanus());const t=i.afterInterval||3;this.afterPhoneInterval=setTimeout((()=>{this.status===e.AFTER&&(console.log("["+this.datelog()+"] 话后自动空闲"),this.sendAction(e.READY))}),1e3*t)}else n===e.OUT_CALL||(n===e.READY||n===e.NOT_READY||n===e.WORK_NOT_READY)&&(this.reconnectState=n);this.trigger("state",t),this.trigger(n,t)}sendAction(e,n){let r={cmd:e,agentKey:this.seat.agentKey,sequence:(new Date).getTime()};if(e===t.login)r={...r,loginType:this.seat.loginType,workType:this.seat.workType},this.status&&this.status.includes("TALKING")&&(r.callId=n.callId);else if(e===t.call){this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval);const{telNum:e,display:t="",followData:o}=n||{};r={...r,called:e,display:t,callType:1,followData:o||{}}}else if(e===t.transfer){let{transferValue:e,transferType:t="4"}=n||{};e.includes("@")&&(t="3"),r={...r,transferType:t,transferValue:e}}else if(e===t.consult){const{consultValue:e}=n||{};let t="2";e.includes("@")&&(t="4"),r={...r,callId:n.callId,transferType:t,consultValue:e}}else if(e===t.consult_cancel);else if(e===t.consult_party)r.callId=n.callId;else if(e===t.consult_transfer)r.callId=n.callId;else if(e===t.busy_work){const{busyDesc:e}=n||{};r={...r,busyDesc:e,callId:n.callId}}else if(e===t.ready)this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval);else if(e===t.busy)this.afterPhoneInterval&&window.clearInterval(this.afterPhoneInterval);else if(e===t.conference_remove){const{deviceId:t,callId:o,conference:i,memberId:a,username:s}=n||{};r={cmd:e,callId:o,deviceId:t,conference:i,memberId:a,username:s}}else{if(e===t.logout){const e=JSON.stringify(r);return this.echo(e),void(2===this.seat.loginType&&this.janus.destroy&&this.janus.destroy())}e===t.followdata?r={...r,callId:n.callId,followData:n.followData||{}}:e===t.hangup&&(this.isHangup=!0)}const o=JSON.stringify(r);this.echo(o)}clearReconectStatus(){this.reconectInterval&&clearInterval(this.reconectInterval)}on(e,t){this.events[e]||(this.events[e]=[]),this.events[e].push(t)}trigger(e,t){this.events[e]&&this.events[e].forEach((e=>e(t)))}onmessage(e){this.trigger("message",e)}datelog(){var e=new Date,t=e.getFullYear(),n=e.getMonth()+1,r=e.getDate(),o=e.getHours(),i=e.getMinutes(),a=e.getSeconds(),s=e.getMilliseconds();return n<10&&(n="0"+n),r<10&&(r="0"+r),o<10&&(o="0"+o),i<10&&(i="0"+i),a<10&&(a="0"+a),s<10?s+="00":s<100&&(s+="0"),t+"-"+n+"-"+r+" "+o+":"+i+":"+a+"."+s}};class c{instance=null;static _version_="1.2.1";static _enum_={state:e,btn:t,label:n};constructor(){if(this.instance)return this.instance;this.instance=this,this.on("state",(e=>this._stateHandler(e)))}get status(){return s.status}get enum(){return c._enum_}init(e){console.log("["+s.datelog()+"] voice9 init",e),s._init(e)}logout(){s.sendAction(t.logout)}setBusy(){s.sendAction(t.busy)}setReady(){s.sendAction(t.ready)}setWorkNotReady(e){s.sendAction(t.busy_work,{busyDesc:e})}call(e,n={}){s.sendAction(t.call,{telNum:e,...n})}answer(){s.accept(s.msg,s.jsep)}sendDtmf(e,t){const n={cmd:"dtmf",dtmf:e,callId:t,agentKey:s.seat.agentKey,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}hangup(){s.sendAction(t.hangup)}transfer(e,n={}){s.sendAction(t.transfer,{transferValue:e,...n})}consult(e,n={}){s.sendAction(t.consult,{telNum:e,...n})}cancelConsult(){s.sendAction(t.consult_cancel)}stopConsult(){s.sendAction(t.consult_stop)}consultTransfer(e,n={}){s.sendAction(t.consult_transfer,{transferValue:e,...n})}consultParty(){s.sendAction(t.consult_party)}mute(){s.sendAction(t.mute)}muteCancel(){s.sendAction(t.mute_cancel)}hold(){s.sendAction(t.hold)}holdCancel(){s.sendAction(t.hold_cancel)}monitor(e,t){const n={cmd:"MONITOR_CALL",callId:t,agentKey:s.seat.agentKey,monitorAgent:e,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}intercept(){s.sendAction("INTERCEPT_CALL")}barge(e,t){const n={cmd:"BARGE_CALL",callId:t,agentKey:s.seat.agentKey,monitorAgent:e,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}coach(e,t){const n={cmd:"COACH_CALL",callId:t,agentKey:s.seat.agentKey,monitorAgent:e,sequence:(new Date).getTime()};s.echo(JSON.stringify(n))}updateFollowData(e,t,n,r,o,i,a,c){const d={cmd:"UPDATE_FOLLOWDATA",followData:e,uuid1:t,uuid2:n,ext1:r,ext2:o,ext3:i,ext4:a,ext5:c,agentKey:s.seat.agentKey,sequence:(new Date).getTime()};s.echo(JSON.stringify(d))}action(e,t){s.sendAction(e,t)}message(e){s.echo(JSON.stringify(e))}on(e,t){s.on(e,t)}off(e,t){if(!s.events[e])return;if(!t)return void(s.events[e]=[]);const n=s.events[e].indexOf(t);n>-1&&s.events[e].splice(n,1)}emit(e,t){s.trigger(e,t)}_stateHandler(t){const{type:n,code:o}=t;if(s.events.btnstate){const e=r[n]||[];s.events.btnstate.forEach((t=>t(e)))}if(s.events.agentstate){let t=n;t===e.LOGIN&&0!==Number(o)&&(t=""),s.events.agentstate.forEach((e=>e(t)))}}}export{c as VoiceNine};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzkj/voicenine",
3
- "version": "1.1.8",
3
+ "version": "1.2.1",
4
4
  "description": "js sdk of cloud platform base on janus gateway.",
5
5
  "main": "lib/main.js",
6
6
  "type": "module",