(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],2:[function(require,module,exports){"use strict";var normalice=require("normalice");var freeice=module.exports=function(opts){var servers={stun:(opts||{}).stun||require("./stun.json"),turn:(opts||{}).turn||require("./turn.json")};var stunCount=(opts||{}).stunCount||2;var turnCount=(opts||{}).turnCount||0;var selected;function getServers(type,count){var out=[];var input=[].concat(servers[type]);var idx;while(input.length&&out.lengthmaxVolume&&fftBins[i]<0){maxVolume=fftBins[i]}}return maxVolume}var audioContextType;if(typeof window!=="undefined"){audioContextType=window.AudioContext||window.webkitAudioContext}var audioContext=null;module.exports=function(stream,options){var harker=new WildEmitter;if(!audioContextType)return harker;var options=options||{},smoothing=options.smoothing||.1,interval=options.interval||50,threshold=options.threshold,play=options.play,history=options.history||10,running=true;if(!audioContext){audioContext=new audioContextType}var sourceNode,fftBins,analyser;analyser=audioContext.createAnalyser();analyser.fftSize=512;analyser.smoothingTimeConstant=smoothing;fftBins=new Float32Array(analyser.frequencyBinCount);if(stream.jquery)stream=stream[0];if(stream instanceof HTMLAudioElement||stream instanceof HTMLVideoElement){sourceNode=audioContext.createMediaElementSource(stream);if(typeof play==="undefined")play=true;threshold=threshold||-50}else{sourceNode=audioContext.createMediaStreamSource(stream);threshold=threshold||-50}sourceNode.connect(analyser);if(play)analyser.connect(audioContext.destination);harker.speaking=false;harker.setThreshold=function(t){threshold=t};harker.setInterval=function(i){interval=i};harker.stop=function(){running=false;harker.emit("volume_change",-100,threshold);if(harker.speaking){harker.speaking=false;harker.emit("stopped_speaking")}analyser.disconnect();sourceNode.disconnect()};harker.speakingHistory=[];for(var i=0;ithreshold&&!harker.speaking){for(var i=harker.speakingHistory.length-3;i=2){harker.speaking=true;harker.emit("speaking")}}else if(currentVolumethreshold));looper()},interval)};looper();return harker}},{wildemitter:37}],6:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],7:[function(require,module,exports){(function(isNode){var Public=function(clone){return merge(clone===true,false,arguments)},publicName="merge";Public.recursive=function(clone){return merge(clone===true,true,arguments)};Public.clone=function(input){var output=input,type=typeOf(input),index,size;if(type==="array"){output=[];size=input.length;for(index=0;index1){url=parts[1];parts=parts[0].split(":");output.username=parts[0];output.credential=(input||{}).credential||parts[1]||""}output.url=protocol+url;output.urls=[output.url];return output}},{}],9:[function(require,module,exports){var process=module.exports={};var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function"){cachedSetTimeout=setTimeout}else{cachedSetTimeout=defaultSetTimout}}catch(e){cachedSetTimeout=defaultSetTimout}try{if(typeof clearTimeout==="function"){cachedClearTimeout=clearTimeout}else{cachedClearTimeout=defaultClearTimeout}}catch(e){cachedClearTimeout=defaultClearTimeout}})();function runTimeout(fun){if(cachedSetTimeout===setTimeout){return setTimeout(fun,0)}if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){cachedSetTimeout=setTimeout;return setTimeout(fun,0)}try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout){return clearTimeout(marker)}if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){cachedClearTimeout=clearTimeout;return clearTimeout(marker)}try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}var queue=[];var draining=false;var currentQueue;var queueIndex=-1;function cleanUpNextTick(){if(!draining||!currentQueue){return}draining=false;if(currentQueue.length){queue=currentQueue.concat(queue)}else{queueIndex=-1}if(queue.length){drainQueue()}}function drainQueue(){if(draining){return}var timeout=runTimeout(cleanUpNextTick);draining=true;var len=queue.length;while(len){currentQueue=queue;queue=[];while(++queueIndex1){for(var i=1;i=14393&&url.indexOf("?transport=udp")===-1});delete server.url;server.urls=isString?urls[0]:urls;return!!urls.length}})}function getCommonCapabilities(localCapabilities,remoteCapabilities){var commonCapabilities={codecs:[],headerExtensions:[],fecMechanisms:[]};var findCodecByPayloadType=function(pt,codecs){pt=parseInt(pt,10);for(var i=0;i0;i--){this._iceGatherers.push(new window.RTCIceGatherer({iceServers:config.iceServers,gatherPolicy:config.iceTransportPolicy}))}}else{config.iceCandidatePoolSize=0}this._config=config;this.transceivers=[];this._sdpSessionId=SDPUtils.generateSessionId();this._sdpSessionVersion=0;this._dtlsRole=undefined;this._isClosed=false};RTCPeerConnection.prototype.onicecandidate=null;RTCPeerConnection.prototype.onaddstream=null;RTCPeerConnection.prototype.ontrack=null;RTCPeerConnection.prototype.onremovestream=null;RTCPeerConnection.prototype.onsignalingstatechange=null;RTCPeerConnection.prototype.oniceconnectionstatechange=null;RTCPeerConnection.prototype.onconnectionstatechange=null;RTCPeerConnection.prototype.onicegatheringstatechange=null;RTCPeerConnection.prototype.onnegotiationneeded=null;RTCPeerConnection.prototype.ondatachannel=null;RTCPeerConnection.prototype._dispatchEvent=function(name,event){if(this._isClosed){return}this.dispatchEvent(event);if(typeof this["on"+name]==="function"){this["on"+name](event)}};RTCPeerConnection.prototype._emitGatheringStateChange=function(){var event=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",event)};RTCPeerConnection.prototype.getConfiguration=function(){return this._config};RTCPeerConnection.prototype.getLocalStreams=function(){return this.localStreams};RTCPeerConnection.prototype.getRemoteStreams=function(){return this.remoteStreams};RTCPeerConnection.prototype._createTransceiver=function(kind,doNotAdd){var hasBundleTransport=this.transceivers.length>0;var transceiver={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:kind,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:true};if(this.usingBundle&&hasBundleTransport){transceiver.iceTransport=this.transceivers[0].iceTransport;transceiver.dtlsTransport=this.transceivers[0].dtlsTransport}else{var transports=this._createIceAndDtlsTransports();transceiver.iceTransport=transports.iceTransport;transceiver.dtlsTransport=transports.dtlsTransport}if(!doNotAdd){this.transceivers.push(transceiver)}return transceiver};RTCPeerConnection.prototype.addTrack=function(track,stream){if(this._isClosed){throw makeError("InvalidStateError","Attempted to call addTrack on a closed peerconnection.")}var alreadyExists=this.transceivers.find(function(s){return s.track===track});if(alreadyExists){throw makeError("InvalidAccessError","Track already exists.")}var transceiver;for(var i=0;i=15025){stream.getTracks().forEach(function(track){pc.addTrack(track,stream)})}else{var clonedStream=stream.clone();stream.getTracks().forEach(function(track,idx){var clonedTrack=clonedStream.getTracks()[idx];track.addEventListener("enabled",function(event){clonedTrack.enabled=event.enabled})});clonedStream.getTracks().forEach(function(track){pc.addTrack(track,clonedStream)})}};RTCPeerConnection.prototype.removeTrack=function(sender){if(this._isClosed){throw makeError("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.")}if(!(sender instanceof window.RTCRtpSender)){throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack "+"does not implement interface RTCRtpSender.")}var transceiver=this.transceivers.find(function(t){return t.rtpSender===sender});if(!transceiver){throw makeError("InvalidAccessError","Sender was not created by this connection.")}var stream=transceiver.stream;transceiver.rtpSender.stop();transceiver.rtpSender=null;transceiver.track=null;transceiver.stream=null;var localStreams=this.transceivers.map(function(t){return t.stream});if(localStreams.indexOf(stream)===-1&&this.localStreams.indexOf(stream)>-1){this.localStreams.splice(this.localStreams.indexOf(stream),1)}this._maybeFireNegotiationNeeded()};RTCPeerConnection.prototype.removeStream=function(stream){var pc=this;stream.getTracks().forEach(function(track){var sender=pc.getSenders().find(function(s){return s.track===track});if(sender){pc.removeTrack(sender)}})};RTCPeerConnection.prototype.getSenders=function(){return this.transceivers.filter(function(transceiver){return!!transceiver.rtpSender}).map(function(transceiver){return transceiver.rtpSender})};RTCPeerConnection.prototype.getReceivers=function(){return this.transceivers.filter(function(transceiver){return!!transceiver.rtpReceiver}).map(function(transceiver){return transceiver.rtpReceiver})};RTCPeerConnection.prototype._createIceGatherer=function(sdpMLineIndex,usingBundle){var pc=this;if(usingBundle&&sdpMLineIndex>0){return this.transceivers[0].iceGatherer}else if(this._iceGatherers.length){return this._iceGatherers.shift()}var iceGatherer=new window.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});Object.defineProperty(iceGatherer,"state",{value:"new",writable:true});this.transceivers[sdpMLineIndex].bufferedCandidateEvents=[];this.transceivers[sdpMLineIndex].bufferCandidates=function(event){var end=!event.candidate||Object.keys(event.candidate).length===0;iceGatherer.state=end?"completed":"gathering";if(pc.transceivers[sdpMLineIndex].bufferedCandidateEvents!==null){pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event)}};iceGatherer.addEventListener("localcandidate",this.transceivers[sdpMLineIndex].bufferCandidates);return iceGatherer};RTCPeerConnection.prototype._gather=function(mid,sdpMLineIndex){var pc=this;var iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;if(iceGatherer.onlocalcandidate){return}var bufferedCandidateEvents=this.transceivers[sdpMLineIndex].bufferedCandidateEvents;this.transceivers[sdpMLineIndex].bufferedCandidateEvents=null;iceGatherer.removeEventListener("localcandidate",this.transceivers[sdpMLineIndex].bufferCandidates);iceGatherer.onlocalcandidate=function(evt){if(pc.usingBundle&&sdpMLineIndex>0){return}var event=new Event("icecandidate");event.candidate={sdpMid:mid,sdpMLineIndex:sdpMLineIndex};var cand=evt.candidate;var end=!cand||Object.keys(cand).length===0;if(end){if(iceGatherer.state==="new"||iceGatherer.state==="gathering"){iceGatherer.state="completed"}}else{if(iceGatherer.state==="new"){iceGatherer.state="gathering"}cand.component=1;var serializedCandidate=SDPUtils.writeCandidate(cand);event.candidate=Object.assign(event.candidate,SDPUtils.parseCandidate(serializedCandidate));event.candidate.candidate=serializedCandidate}var sections=SDPUtils.getMediaSections(pc.localDescription.sdp);if(!end){sections[event.candidate.sdpMLineIndex]+="a="+event.candidate.candidate+"\r\n"}else{sections[event.candidate.sdpMLineIndex]+="a=end-of-candidates\r\n"}pc.localDescription.sdp=SDPUtils.getDescription(pc.localDescription.sdp)+sections.join("");var complete=pc.transceivers.every(function(transceiver){return transceiver.iceGatherer&&transceiver.iceGatherer.state==="completed"});if(pc.iceGatheringState!=="gathering"){pc.iceGatheringState="gathering";pc._emitGatheringStateChange()}if(!end){pc._dispatchEvent("icecandidate",event)}if(complete){pc._dispatchEvent("icecandidate",new Event("icecandidate"));pc.iceGatheringState="complete";pc._emitGatheringStateChange()}};window.setTimeout(function(){bufferedCandidateEvents.forEach(function(e){iceGatherer.onlocalcandidate(e)})},0)};RTCPeerConnection.prototype._createIceAndDtlsTransports=function(){var pc=this;var iceTransport=new window.RTCIceTransport(null);iceTransport.onicestatechange=function(){pc._updateIceConnectionState();pc._updateConnectionState()};var dtlsTransport=new window.RTCDtlsTransport(iceTransport);dtlsTransport.ondtlsstatechange=function(){pc._updateConnectionState()};dtlsTransport.onerror=function(){Object.defineProperty(dtlsTransport,"state",{value:"failed",writable:true});pc._updateConnectionState()};return{iceTransport:iceTransport,dtlsTransport:dtlsTransport}};RTCPeerConnection.prototype._disposeIceAndDtlsTransports=function(sdpMLineIndex){var iceGatherer=this.transceivers[sdpMLineIndex].iceGatherer;if(iceGatherer){delete iceGatherer.onlocalcandidate;delete this.transceivers[sdpMLineIndex].iceGatherer}var iceTransport=this.transceivers[sdpMLineIndex].iceTransport;if(iceTransport){delete iceTransport.onicestatechange;delete this.transceivers[sdpMLineIndex].iceTransport}var dtlsTransport=this.transceivers[sdpMLineIndex].dtlsTransport;if(dtlsTransport){delete dtlsTransport.ondtlsstatechange;delete dtlsTransport.onerror;delete this.transceivers[sdpMLineIndex].dtlsTransport}};RTCPeerConnection.prototype._transceive=function(transceiver,send,recv){var params=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);if(send&&transceiver.rtpSender){params.encodings=transceiver.sendEncodingParameters;params.rtcp={cname:SDPUtils.localCName,compound:transceiver.rtcpParameters.compound};if(transceiver.recvEncodingParameters.length){params.rtcp.ssrc=transceiver.recvEncodingParameters[0].ssrc}transceiver.rtpSender.send(params)}if(recv&&transceiver.rtpReceiver&¶ms.codecs.length>0){if(transceiver.kind==="video"&&transceiver.recvEncodingParameters&&edgeVersion<15019){transceiver.recvEncodingParameters.forEach(function(p){delete p.rtx})}if(transceiver.recvEncodingParameters.length){params.encodings=transceiver.recvEncodingParameters}else{params.encodings=[{}]}params.rtcp={compound:transceiver.rtcpParameters.compound};if(transceiver.rtcpParameters.cname){params.rtcp.cname=transceiver.rtcpParameters.cname}if(transceiver.sendEncodingParameters.length){params.rtcp.ssrc=transceiver.sendEncodingParameters[0].ssrc}transceiver.rtpReceiver.receive(params)}};RTCPeerConnection.prototype.setLocalDescription=function(description){var pc=this;if(["offer","answer"].indexOf(description.type)===-1){return Promise.reject(makeError("TypeError",'Unsupported type "'+description.type+'"'))}if(!isActionAllowedInSignalingState("setLocalDescription",description.type,pc.signalingState)||pc._isClosed){return Promise.reject(makeError("InvalidStateError","Can not set local "+description.type+" in state "+pc.signalingState))}var sections;var sessionpart;if(description.type==="offer"){sections=SDPUtils.splitSections(description.sdp);sessionpart=sections.shift();sections.forEach(function(mediaSection,sdpMLineIndex){var caps=SDPUtils.parseRtpParameters(mediaSection);pc.transceivers[sdpMLineIndex].localCapabilities=caps});pc.transceivers.forEach(function(transceiver,sdpMLineIndex){pc._gather(transceiver.mid,sdpMLineIndex)})}else if(description.type==="answer"){sections=SDPUtils.splitSections(pc.remoteDescription.sdp);sessionpart=sections.shift();var isIceLite=SDPUtils.matchPrefix(sessionpart,"a=ice-lite").length>0;sections.forEach(function(mediaSection,sdpMLineIndex){var transceiver=pc.transceivers[sdpMLineIndex];var iceGatherer=transceiver.iceGatherer;var iceTransport=transceiver.iceTransport;var dtlsTransport=transceiver.dtlsTransport;var localCapabilities=transceiver.localCapabilities;var remoteCapabilities=transceiver.remoteCapabilities;var rejected=SDPUtils.isRejected(mediaSection)&&SDPUtils.matchPrefix(mediaSection,"a=bundle-only").length===0;if(!rejected&&!transceiver.rejected){var remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart);var remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart);if(isIceLite){remoteDtlsParameters.role="server"}if(!pc.usingBundle||sdpMLineIndex===0){pc._gather(transceiver.mid,sdpMLineIndex);if(iceTransport.state==="new"){iceTransport.start(iceGatherer,remoteIceParameters,isIceLite?"controlling":"controlled")}if(dtlsTransport.state==="new"){dtlsTransport.start(remoteDtlsParameters)}}var params=getCommonCapabilities(localCapabilities,remoteCapabilities);pc._transceive(transceiver,params.codecs.length>0,false)}})}pc.localDescription={type:description.type,sdp:description.sdp};if(description.type==="offer"){pc._updateSignalingState("have-local-offer")}else{pc._updateSignalingState("stable")}return Promise.resolve()};RTCPeerConnection.prototype.setRemoteDescription=function(description){var pc=this;if(["offer","answer"].indexOf(description.type)===-1){return Promise.reject(makeError("TypeError",'Unsupported type "'+description.type+'"'))}if(!isActionAllowedInSignalingState("setRemoteDescription",description.type,pc.signalingState)||pc._isClosed){return Promise.reject(makeError("InvalidStateError","Can not set remote "+description.type+" in state "+pc.signalingState))}var streams={};pc.remoteStreams.forEach(function(stream){streams[stream.id]=stream});var receiverList=[];var sections=SDPUtils.splitSections(description.sdp);var sessionpart=sections.shift();var isIceLite=SDPUtils.matchPrefix(sessionpart,"a=ice-lite").length>0;var usingBundle=SDPUtils.matchPrefix(sessionpart,"a=group:BUNDLE ").length>0;pc.usingBundle=usingBundle;var iceOptions=SDPUtils.matchPrefix(sessionpart,"a=ice-options:")[0];if(iceOptions){pc.canTrickleIceCandidates=iceOptions.substr(14).split(" ").indexOf("trickle")>=0}else{pc.canTrickleIceCandidates=false}sections.forEach(function(mediaSection,sdpMLineIndex){var lines=SDPUtils.splitLines(mediaSection);var kind=SDPUtils.getKind(mediaSection);var rejected=SDPUtils.isRejected(mediaSection)&&SDPUtils.matchPrefix(mediaSection,"a=bundle-only").length===0;var protocol=lines[0].substr(2).split(" ")[2];var direction=SDPUtils.getDirection(mediaSection,sessionpart);var remoteMsid=SDPUtils.parseMsid(mediaSection);var mid=SDPUtils.getMid(mediaSection)||SDPUtils.generateIdentifier();if(kind==="application"&&protocol==="DTLS/SCTP"||rejected){pc.transceivers[sdpMLineIndex]={mid:mid,kind:kind,rejected:true};return}if(!rejected&&pc.transceivers[sdpMLineIndex]&&pc.transceivers[sdpMLineIndex].rejected){pc.transceivers[sdpMLineIndex]=pc._createTransceiver(kind,true)}var transceiver;var iceGatherer;var iceTransport;var dtlsTransport;var rtpReceiver;var sendEncodingParameters;var recvEncodingParameters;var localCapabilities;var track;var remoteCapabilities=SDPUtils.parseRtpParameters(mediaSection);var remoteIceParameters;var remoteDtlsParameters;if(!rejected){remoteIceParameters=SDPUtils.getIceParameters(mediaSection,sessionpart);remoteDtlsParameters=SDPUtils.getDtlsParameters(mediaSection,sessionpart);remoteDtlsParameters.role="client"}recvEncodingParameters=SDPUtils.parseRtpEncodingParameters(mediaSection);var rtcpParameters=SDPUtils.parseRtcpParameters(mediaSection);var isComplete=SDPUtils.matchPrefix(mediaSection,"a=end-of-candidates",sessionpart).length>0;var cands=SDPUtils.matchPrefix(mediaSection,"a=candidate:").map(function(cand){return SDPUtils.parseCandidate(cand)}).filter(function(cand){return cand.component===1});if((description.type==="offer"||description.type==="answer")&&!rejected&&usingBundle&&sdpMLineIndex>0&&pc.transceivers[sdpMLineIndex]){pc._disposeIceAndDtlsTransports(sdpMLineIndex);pc.transceivers[sdpMLineIndex].iceGatherer=pc.transceivers[0].iceGatherer;pc.transceivers[sdpMLineIndex].iceTransport=pc.transceivers[0].iceTransport;pc.transceivers[sdpMLineIndex].dtlsTransport=pc.transceivers[0].dtlsTransport;if(pc.transceivers[sdpMLineIndex].rtpSender){pc.transceivers[sdpMLineIndex].rtpSender.setTransport(pc.transceivers[0].dtlsTransport)}if(pc.transceivers[sdpMLineIndex].rtpReceiver){pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(pc.transceivers[0].dtlsTransport)}}if(description.type==="offer"&&!rejected){transceiver=pc.transceivers[sdpMLineIndex]||pc._createTransceiver(kind);transceiver.mid=mid;if(!transceiver.iceGatherer){transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,usingBundle)}if(cands.length&&transceiver.iceTransport.state==="new"){if(isComplete&&(!usingBundle||sdpMLineIndex===0)){transceiver.iceTransport.setRemoteCandidates(cands)}else{cands.forEach(function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate)})}}localCapabilities=window.RTCRtpReceiver.getCapabilities(kind);if(edgeVersion<15019){localCapabilities.codecs=localCapabilities.codecs.filter(function(codec){return codec.name!=="rtx"})}sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:(2*sdpMLineIndex+2)*1001}];var isNewTrack=false;if(direction==="sendrecv"||direction==="sendonly"){isNewTrack=!transceiver.rtpReceiver;rtpReceiver=transceiver.rtpReceiver||new window.RTCRtpReceiver(transceiver.dtlsTransport,kind);if(isNewTrack){var stream;track=rtpReceiver.track;if(remoteMsid&&remoteMsid.stream==="-"){}else if(remoteMsid){if(!streams[remoteMsid.stream]){streams[remoteMsid.stream]=new window.MediaStream;Object.defineProperty(streams[remoteMsid.stream],"id",{get:function(){return remoteMsid.stream}})}Object.defineProperty(track,"id",{get:function(){return remoteMsid.track}});stream=streams[remoteMsid.stream]}else{if(!streams.default){streams.default=new window.MediaStream}stream=streams.default}if(stream){addTrackToStreamAndFireEvent(track,stream);transceiver.associatedRemoteMediaStreams.push(stream)}receiverList.push([track,rtpReceiver,stream])}}else if(transceiver.rtpReceiver&&transceiver.rtpReceiver.track){transceiver.associatedRemoteMediaStreams.forEach(function(s){var nativeTrack=s.getTracks().find(function(t){return t.id===transceiver.rtpReceiver.track.id});if(nativeTrack){removeTrackFromStreamAndFireEvent(nativeTrack,s)}});transceiver.associatedRemoteMediaStreams=[]}transceiver.localCapabilities=localCapabilities;transceiver.remoteCapabilities=remoteCapabilities;transceiver.rtpReceiver=rtpReceiver;transceiver.rtcpParameters=rtcpParameters;transceiver.sendEncodingParameters=sendEncodingParameters;transceiver.recvEncodingParameters=recvEncodingParameters;pc._transceive(pc.transceivers[sdpMLineIndex],false,isNewTrack)}else if(description.type==="answer"&&!rejected){transceiver=pc.transceivers[sdpMLineIndex];iceGatherer=transceiver.iceGatherer;iceTransport=transceiver.iceTransport;dtlsTransport=transceiver.dtlsTransport;rtpReceiver=transceiver.rtpReceiver;sendEncodingParameters=transceiver.sendEncodingParameters;localCapabilities=transceiver.localCapabilities;pc.transceivers[sdpMLineIndex].recvEncodingParameters=recvEncodingParameters;pc.transceivers[sdpMLineIndex].remoteCapabilities=remoteCapabilities;pc.transceivers[sdpMLineIndex].rtcpParameters=rtcpParameters;if(cands.length&&iceTransport.state==="new"){if((isIceLite||isComplete)&&(!usingBundle||sdpMLineIndex===0)){iceTransport.setRemoteCandidates(cands)}else{cands.forEach(function(candidate){maybeAddCandidate(transceiver.iceTransport,candidate)})}}if(!usingBundle||sdpMLineIndex===0){if(iceTransport.state==="new"){iceTransport.start(iceGatherer,remoteIceParameters,"controlling")}if(dtlsTransport.state==="new"){dtlsTransport.start(remoteDtlsParameters)}}pc._transceive(transceiver,direction==="sendrecv"||direction==="recvonly",direction==="sendrecv"||direction==="sendonly");if(rtpReceiver&&(direction==="sendrecv"||direction==="sendonly")){track=rtpReceiver.track;if(remoteMsid){if(!streams[remoteMsid.stream]){streams[remoteMsid.stream]=new window.MediaStream}addTrackToStreamAndFireEvent(track,streams[remoteMsid.stream]);receiverList.push([track,rtpReceiver,streams[remoteMsid.stream]])}else{if(!streams.default){streams.default=new window.MediaStream}addTrackToStreamAndFireEvent(track,streams.default);receiverList.push([track,rtpReceiver,streams.default])}}else{delete transceiver.rtpReceiver}}});if(pc._dtlsRole===undefined){pc._dtlsRole=description.type==="offer"?"active":"passive"}pc.remoteDescription={type:description.type,sdp:description.sdp};if(description.type==="offer"){pc._updateSignalingState("have-remote-offer")}else{pc._updateSignalingState("stable")}Object.keys(streams).forEach(function(sid){var stream=streams[sid];if(stream.getTracks().length){if(pc.remoteStreams.indexOf(stream)===-1){pc.remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream;window.setTimeout(function(){pc._dispatchEvent("addstream",event)})}receiverList.forEach(function(item){var track=item[0];var receiver=item[1];if(stream.id!==item[2].id){return}fireAddTrack(pc,track,receiver,[stream])})}});receiverList.forEach(function(item){if(item[2]){return}fireAddTrack(pc,item[0],item[1],[])});window.setTimeout(function(){if(!(pc&&pc.transceivers)){return}pc.transceivers.forEach(function(transceiver){if(transceiver.iceTransport&&transceiver.iceTransport.state==="new"&&transceiver.iceTransport.getRemoteCandidates().length>0){console.warn("Timeout for addRemoteCandidate. Consider sending "+"an end-of-candidates notification");transceiver.iceTransport.addRemoteCandidate({})}})},4e3);return Promise.resolve()};RTCPeerConnection.prototype.close=function(){this.transceivers.forEach(function(transceiver){if(transceiver.iceTransport){transceiver.iceTransport.stop()}if(transceiver.dtlsTransport){transceiver.dtlsTransport.stop()}if(transceiver.rtpSender){transceiver.rtpSender.stop()}if(transceiver.rtpReceiver){transceiver.rtpReceiver.stop()}});this._isClosed=true;this._updateSignalingState("closed")};RTCPeerConnection.prototype._updateSignalingState=function(newState){this.signalingState=newState;var event=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",event)};RTCPeerConnection.prototype._maybeFireNegotiationNeeded=function(){var pc=this;if(this.signalingState!=="stable"||this.needNegotiation===true){return}this.needNegotiation=true;window.setTimeout(function(){if(pc.needNegotiation){pc.needNegotiation=false;var event=new Event("negotiationneeded");pc._dispatchEvent("negotiationneeded",event)}},0)};RTCPeerConnection.prototype._updateIceConnectionState=function(){var newState;var states={new:0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};this.transceivers.forEach(function(transceiver){states[transceiver.iceTransport.state]++});newState="new";if(states.failed>0){newState="failed"}else if(states.checking>0){newState="checking"}else if(states.disconnected>0){newState="disconnected"}else if(states.new>0){newState="new"}else if(states.connected>0){newState="connected"}else if(states.completed>0){newState="completed"}if(newState!==this.iceConnectionState){this.iceConnectionState=newState;var event=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",event)}};RTCPeerConnection.prototype._updateConnectionState=function(){var newState;var states={new:0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};this.transceivers.forEach(function(transceiver){states[transceiver.iceTransport.state]++;states[transceiver.dtlsTransport.state]++});states.connected+=states.completed;newState="new";if(states.failed>0){newState="failed"}else if(states.connecting>0){newState="connecting"}else if(states.disconnected>0){newState="disconnected"}else if(states.new>0){newState="new"}else if(states.connected>0){newState="connected"}if(newState!==this.connectionState){this.connectionState=newState;var event=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",event)}};RTCPeerConnection.prototype.createOffer=function(){var pc=this;if(pc._isClosed){return Promise.reject(makeError("InvalidStateError","Can not call createOffer after close"))}var numAudioTracks=pc.transceivers.filter(function(t){return t.kind==="audio"}).length;var numVideoTracks=pc.transceivers.filter(function(t){return t.kind==="video"}).length;var offerOptions=arguments[0];if(offerOptions){if(offerOptions.mandatory||offerOptions.optional){throw new TypeError("Legacy mandatory/optional constraints not supported.")}if(offerOptions.offerToReceiveAudio!==undefined){if(offerOptions.offerToReceiveAudio===true){numAudioTracks=1}else if(offerOptions.offerToReceiveAudio===false){numAudioTracks=0}else{numAudioTracks=offerOptions.offerToReceiveAudio}}if(offerOptions.offerToReceiveVideo!==undefined){if(offerOptions.offerToReceiveVideo===true){numVideoTracks=1}else if(offerOptions.offerToReceiveVideo===false){numVideoTracks=0}else{numVideoTracks=offerOptions.offerToReceiveVideo}}}pc.transceivers.forEach(function(transceiver){if(transceiver.kind==="audio"){numAudioTracks--;if(numAudioTracks<0){transceiver.wantReceive=false}}else if(transceiver.kind==="video"){numVideoTracks--;if(numVideoTracks<0){transceiver.wantReceive=false}}});while(numAudioTracks>0||numVideoTracks>0){if(numAudioTracks>0){pc._createTransceiver("audio");numAudioTracks--}if(numVideoTracks>0){pc._createTransceiver("video");numVideoTracks--}}var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);pc.transceivers.forEach(function(transceiver,sdpMLineIndex){var track=transceiver.track;var kind=transceiver.kind;var mid=transceiver.mid||SDPUtils.generateIdentifier();transceiver.mid=mid;if(!transceiver.iceGatherer){transceiver.iceGatherer=pc._createIceGatherer(sdpMLineIndex,pc.usingBundle)}var localCapabilities=window.RTCRtpSender.getCapabilities(kind);if(edgeVersion<15019){localCapabilities.codecs=localCapabilities.codecs.filter(function(codec){return codec.name!=="rtx"})}localCapabilities.codecs.forEach(function(codec){if(codec.name==="H264"&&codec.parameters["level-asymmetry-allowed"]===undefined){codec.parameters["level-asymmetry-allowed"]="1"}if(transceiver.remoteCapabilities&&transceiver.remoteCapabilities.codecs){transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec){if(codec.name.toLowerCase()===remoteCodec.name.toLowerCase()&&codec.clockRate===remoteCodec.clockRate){codec.preferredPayloadType=remoteCodec.payloadType}})}});localCapabilities.headerExtensions.forEach(function(hdrExt){var remoteExtensions=transceiver.remoteCapabilities&&transceiver.remoteCapabilities.headerExtensions||[];remoteExtensions.forEach(function(rHdrExt){if(hdrExt.uri===rHdrExt.uri){hdrExt.id=rHdrExt.id}})});var sendEncodingParameters=transceiver.sendEncodingParameters||[{ssrc:(2*sdpMLineIndex+1)*1001}];if(track){if(edgeVersion>=15019&&kind==="video"&&!sendEncodingParameters[0].rtx){sendEncodingParameters[0].rtx={ssrc:sendEncodingParameters[0].ssrc+1}}}if(transceiver.wantReceive){transceiver.rtpReceiver=new window.RTCRtpReceiver(transceiver.dtlsTransport,kind)}transceiver.localCapabilities=localCapabilities;transceiver.sendEncodingParameters=sendEncodingParameters});if(pc._config.bundlePolicy!=="max-compat"){sdp+="a=group:BUNDLE "+pc.transceivers.map(function(t){return t.mid}).join(" ")+"\r\n"}sdp+="a=ice-options:trickle\r\n";pc.transceivers.forEach(function(transceiver,sdpMLineIndex){sdp+=writeMediaSection(transceiver,transceiver.localCapabilities,"offer",transceiver.stream,pc._dtlsRole);sdp+="a=rtcp-rsize\r\n";if(transceiver.iceGatherer&&pc.iceGatheringState!=="new"&&(sdpMLineIndex===0||!pc.usingBundle)){transceiver.iceGatherer.getLocalCandidates().forEach(function(cand){cand.component=1;sdp+="a="+SDPUtils.writeCandidate(cand)+"\r\n"});if(transceiver.iceGatherer.state==="completed"){sdp+="a=end-of-candidates\r\n"}}});var desc=new window.RTCSessionDescription({type:"offer",sdp:sdp});return Promise.resolve(desc)};RTCPeerConnection.prototype.createAnswer=function(){var pc=this;if(pc._isClosed){return Promise.reject(makeError("InvalidStateError","Can not call createAnswer after close"))}if(!(pc.signalingState==="have-remote-offer"||pc.signalingState==="have-local-pranswer")){return Promise.reject(makeError("InvalidStateError","Can not call createAnswer in signalingState "+pc.signalingState))}var sdp=SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,pc._sdpSessionVersion++);if(pc.usingBundle){sdp+="a=group:BUNDLE "+pc.transceivers.map(function(t){return t.mid}).join(" ")+"\r\n"}var mediaSectionsInOffer=SDPUtils.getMediaSections(pc.remoteDescription.sdp).length;pc.transceivers.forEach(function(transceiver,sdpMLineIndex){if(sdpMLineIndex+1>mediaSectionsInOffer){return}if(transceiver.rejected){if(transceiver.kind==="application"){sdp+="m=application 0 DTLS/SCTP 5000\r\n"}else if(transceiver.kind==="audio"){sdp+="m=audio 0 UDP/TLS/RTP/SAVPF 0\r\n"+"a=rtpmap:0 PCMU/8000\r\n"}else if(transceiver.kind==="video"){sdp+="m=video 0 UDP/TLS/RTP/SAVPF 120\r\n"+"a=rtpmap:120 VP8/90000\r\n"}sdp+="c=IN IP4 0.0.0.0\r\n"+"a=inactive\r\n"+"a=mid:"+transceiver.mid+"\r\n";return}if(transceiver.stream){var localTrack;if(transceiver.kind==="audio"){localTrack=transceiver.stream.getAudioTracks()[0]}else if(transceiver.kind==="video"){localTrack=transceiver.stream.getVideoTracks()[0]}if(localTrack){if(edgeVersion>=15019&&transceiver.kind==="video"&&!transceiver.sendEncodingParameters[0].rtx){transceiver.sendEncodingParameters[0].rtx={ssrc:transceiver.sendEncodingParameters[0].ssrc+1}}}}var commonCapabilities=getCommonCapabilities(transceiver.localCapabilities,transceiver.remoteCapabilities);var hasRtx=commonCapabilities.codecs.filter(function(c){return c.name.toLowerCase()==="rtx"}).length;if(!hasRtx&&transceiver.sendEncodingParameters[0].rtx){delete transceiver.sendEncodingParameters[0].rtx}sdp+=writeMediaSection(transceiver,commonCapabilities,"answer",transceiver.stream,pc._dtlsRole);if(transceiver.rtcpParameters&&transceiver.rtcpParameters.reducedSize){sdp+="a=rtcp-rsize\r\n"}});var desc=new window.RTCSessionDescription({type:"answer",sdp:sdp});return Promise.resolve(desc)};RTCPeerConnection.prototype.addIceCandidate=function(candidate){var pc=this;var sections;if(candidate&&!(candidate.sdpMLineIndex!==undefined||candidate.sdpMid)){return Promise.reject(new TypeError("sdpMLineIndex or sdpMid required"))}return new Promise(function(resolve,reject){if(!pc.remoteDescription){return reject(makeError("InvalidStateError","Can not add ICE candidate without a remote description"))}else if(!candidate||candidate.candidate===""){for(var j=0;j0?SDPUtils.parseCandidate(candidate.candidate):{};if(cand.protocol==="tcp"&&(cand.port===0||cand.port===9)){return resolve()}if(cand.component&&cand.component!==1){return resolve()}if(sdpMLineIndex===0||sdpMLineIndex>0&&transceiver.iceTransport!==pc.transceivers[0].iceTransport){if(!maybeAddCandidate(transceiver.iceTransport,cand)){return reject(makeError("OperationError","Can not add ICE candidate"))}}var candidateString=candidate.candidate.trim();if(candidateString.indexOf("a=")===0){candidateString=candidateString.substr(2)}sections=SDPUtils.getMediaSections(pc.remoteDescription.sdp);sections[sdpMLineIndex]+="a="+(cand.type?candidateString:"end-of-candidates")+"\r\n";pc.remoteDescription.sdp=sections.join("")}else{return reject(makeError("OperationError","Can not add ICE candidate"))}}resolve()})};RTCPeerConnection.prototype.getStats=function(){var promises=[];this.transceivers.forEach(function(transceiver){["rtpSender","rtpReceiver","iceGatherer","iceTransport","dtlsTransport"].forEach(function(method){if(transceiver[method]){promises.push(transceiver[method].getStats())}})});var fixStatsType=function(stat){return{inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[stat.type]||stat.type};return new Promise(function(resolve){var results=new Map;Promise.all(promises).then(function(res){res.forEach(function(result){Object.keys(result).forEach(function(id){result[id].type=fixStatsType(result[id]);results.set(id,result[id])})});resolve(results)})})};var methods=["createOffer","createAnswer"];methods.forEach(function(method){var nativeMethod=RTCPeerConnection.prototype[method];RTCPeerConnection.prototype[method]=function(){var args=arguments;if(typeof args[0]==="function"||typeof args[1]==="function"){return nativeMethod.apply(this,[arguments[2]]).then(function(description){if(typeof args[0]==="function"){args[0].apply(null,[description])}},function(error){if(typeof args[1]==="function"){args[1].apply(null,[error])}})}return nativeMethod.apply(this,arguments)}});methods=["setLocalDescription","setRemoteDescription","addIceCandidate"];methods.forEach(function(method){var nativeMethod=RTCPeerConnection.prototype[method];RTCPeerConnection.prototype[method]=function(){var args=arguments;if(typeof args[1]==="function"||typeof args[2]==="function"){return nativeMethod.apply(this,arguments).then(function(){if(typeof args[1]==="function"){args[1].apply(null)}},function(error){if(typeof args[2]==="function"){args[2].apply(null,[error])}})}return nativeMethod.apply(this,arguments)}});["getStats"].forEach(function(method){var nativeMethod=RTCPeerConnection.prototype[method];RTCPeerConnection.prototype[method]=function(){var args=arguments;if(typeof args[1]==="function"){return nativeMethod.apply(this,arguments).then(function(){if(typeof args[1]==="function"){args[1].apply(null)}})}return nativeMethod.apply(this,arguments)}});return RTCPeerConnection}},{sdp:19}],11:[function(require,module,exports){var grammar=module.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w\/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(o){return o.encoding?"rtpmap:%d %s/%s/%s":o.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(o){return o.address!=null?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%d trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(o){return o.subtype!=null?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:([\w_\/]*) (\S*)(?: (\S*))?/,names:["value","uri","config"],format:function(o){return o.config!=null?"extmap:%s %s %s":"extmap:%s %s"}},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(o){return o.sessionConfig!=null?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%s"},{name:"ptime",reg:/^ptime:(\d*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation"],format:function(o){var str="candidate:%s %d %s %d %s %d typ %s";str+=o.raddr!=null?" raddr %s rport %d":"%v%v";str+=o.tcptype!=null?" tcptype %s":"%v";if(o.generation!=null){str+=" generation %d"}return str}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_]*):(.*)/,names:["id","attribute","value"],format:"ssrc:%d %s:%s"},{push:"ssrcGroups",reg:/^ssrc-group:(\w*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{push:"invalid",names:["value"]}]};Object.keys(grammar).forEach(function(key){var objs=grammar[key];objs.forEach(function(obj){if(!obj.reg){obj.reg=/(.*)/}if(!obj.format){obj.format="%s"}})})},{}],12:[function(require,module,exports){var parser=require("./parser");var writer=require("./writer");exports.write=writer;exports.parse=parser.parse;exports.parseFmtpConfig=parser.parseFmtpConfig;exports.parsePayloads=parser.parsePayloads;exports.parseRemoteCandidates=parser.parseRemoteCandidates},{"./parser":13,"./writer":14}],13:[function(require,module,exports){var toIntIfInt=function(v){return String(Number(v))===v?Number(v):v};var attachProperties=function(match,location,names,rawName){if(rawName&&!names){location[rawName]=toIntIfInt(match[1])}else{for(var i=0;i=len){return x}var arg=args[i];i+=1;switch(x){case"%%":return"%";case"%s":return String(arg);case"%d":return Number(arg);case"%v":return""}})};var makeLine=function(type,obj,location){var str=obj.format instanceof Function?obj.format(obj.push?location:location[obj.name]):obj.format;var args=[type+"="+str];if(obj.names){for(var i=0;i3||!session.media.every(function(m){return["video","audio","data"].indexOf(m.mid)!==-1})){console.warn("This description does not look like Plan B.");return desc}var mids=[];session.media.forEach(function(m){mids.push(m.mid)});var hasBundle=false;if(typeof session.groups!=="undefined"&&Array.isArray(session.groups)){hasBundle=session.groups.every(function(g){return g.type!=="BUNDLE"||arrayEquals.apply(g.mids.sort(),[mids.sort()])})}if(!hasBundle){var mustBeBundle=false;session.media.forEach(function(m){if(m.direction!=="inactive"){mustBeBundle=true}});if(mustBeBundle){throw new Error("Cannot convert to Unified Plan because m-lines that"+" are not bundled were found.")}}var type;if(desc.type==="answer"){type="offer"}else if(desc.type==="offer"){type="answer"}else{throw new Error("Type '"+desc.type+"' not supported.")}var cached;if(typeof this.cache[type]!=="undefined"){cached=transform.parse(this.cache[type])}var recvonlySsrcs={audio:{},video:{}};var mid2ul={};var bIdx=0;var uIdx=0;var sources2ul={};var candidates;var iceUfrag;var icePwd;var fingerprint;var payloads={};var rtcpFb={};var rtp={};session.media.forEach(function(bLine){if((typeof bLine.rtcpMux!=="string"||bLine.rtcpMux!=="rtcp-mux")&&bLine.direction!=="inactive"){throw new Error("Cannot convert to Unified Plan because m-lines "+"without the rtcp-mux attribute were found.")}if(bLine.type==="application"){mid2ul[bLine.mid]=bLine;return}var sources=bLine.sources;var ssrcGroups=bLine.ssrcGroups;var port=bLine.port;if(typeof bLine.candidates!="undefined"){if(typeof candidates!="undefined"){candidates=candidates.concat(bLine.candidates)}else{candidates=bLine.candidates}}if(typeof iceUfrag!="undefined"&&typeof bLine.iceUfrag!="undefined"&&iceUfrag!=bLine.iceUfrag){throw new Error("Only BUNDLE supported, iceUfrag must be the same for all m-lines.\n"+"\tLast iceUfrag: "+iceUfrag+"\n"+"\tNew iceUfrag: "+bLine.iceUfrag)}if(typeof bLine.iceUfrag!="undefined"){iceUfrag=bLine.iceUfrag}if(typeof icePwd!="undefined"&&typeof bLine.icePwd!="undefined"&&icePwd!=bLine.icePwd){throw new Error("Only BUNDLE supported, icePwd must be the same for all m-lines.\n"+"\tLast icePwd: "+icePwd+"\n"+"\tNew icePwd: "+bLine.icePwd)}if(typeof bLine.icePwd!="undefined"){icePwd=bLine.icePwd}if(typeof fingerprint!="undefined"&&typeof bLine.fingerprint!="undefined"&&(fingerprint.type!=bLine.fingerprint.type||fingerprint.hash!=bLine.fingerprint.hash)){throw new Error("Only BUNDLE supported, fingerprint must be the same for all m-lines.\n"+"\tLast fingerprint: "+JSON.stringify(fingerprint)+"\n"+"\tNew fingerprint: "+JSON.stringify(bLine.fingerprint))}if(typeof bLine.fingerprint!="undefined"){fingerprint=bLine.fingerprint}payloads[bLine.type]=bLine.payloads;rtcpFb[bLine.type]=bLine.rtcpFb;rtp[bLine.type]=bLine.rtp;var ssrc2group={};if(typeof ssrcGroups!=="undefined"&&Array.isArray(ssrcGroups)){ssrcGroups.forEach(function(ssrcGroup){if(typeof ssrcGroup.ssrcs!=="undefined"&&Array.isArray(ssrcGroup.ssrcs)){ssrcGroup.ssrcs.forEach(function(ssrc){if(typeof ssrc2group[ssrc]==="undefined"){ssrc2group[ssrc]=[]}ssrc2group[ssrc].push(ssrcGroup)})}})}var ssrc2ml={};if(typeof sources==="object"){delete bLine.sources;delete bLine.ssrcGroups;delete bLine.candidates;delete bLine.iceUfrag;delete bLine.icePwd;delete bLine.fingerprint;delete bLine.port;delete bLine.mid;Object.keys(sources).forEach(function(ssrc){var uLine;if(desc.type==="offer"){if(!sources[ssrc].msid){recvonlySsrcs[bLine.type][ssrc]=sources[ssrc];return}}if(typeof ssrc2group[ssrc]!=="undefined"&&Array.isArray(ssrc2group[ssrc])){ssrc2group[ssrc].some(function(ssrcGroup){return ssrcGroup.ssrcs.some(function(related){if(typeof ssrc2ml[related]==="object"){uLine=ssrc2ml[related];return true}})})}if(typeof uLine==="object"){uLine.sources[ssrc]=sources[ssrc];delete sources[ssrc].msid}else{uLine=Object.create(bLine);ssrc2ml[ssrc]=uLine;if(typeof sources[ssrc].msid!=="undefined"){uLine.msid=sources[ssrc].msid;delete sources[ssrc].msid}uLine.sources={};uLine.sources[ssrc]=sources[ssrc];uLine.ssrcGroups=ssrc2group[ssrc];if(typeof cached!=="undefined"&&typeof cached.media!=="undefined"&&Array.isArray(cached.media)){cached.media.forEach(function(m){if(typeof m.sources==="object"){Object.keys(m.sources).forEach(function(s){if(s===ssrc){uLine.mid=m.mid}})}})}if(typeof uLine.mid==="undefined"){uLine.mid=[bLine.type,"-",ssrc].join("")}uLine.candidates=candidates;uLine.iceUfrag=iceUfrag;uLine.icePwd=icePwd;uLine.fingerprint=fingerprint;uLine.port=port;mid2ul[uLine.mid]=uLine;sources2ul[uIdx]=uLine.sources;self.cache.mlU2BMap[uIdx]=bIdx;if(typeof self.cache.mlB2UMap[bIdx]==="undefined"){self.cache.mlB2UMap[bIdx]=uIdx}uIdx++}})}else{var uLine=bLine;uLine.candidates=candidates;uLine.iceUfrag=iceUfrag;uLine.icePwd=icePwd;uLine.fingerprint=fingerprint;uLine.port=port;mid2ul[uLine.mid]=uLine;self.cache.mlU2BMap[uIdx]=bIdx;if(typeof self.cache.mlB2UMap[bIdx]==="undefined"){self.cache.mlB2UMap[bIdx]=uIdx}}bIdx++});session.media=[];mids=[];if(desc.type==="answer"){for(var i=0;i0){idx=self.getFirstSendingIndexFromAnswer(type);if(idx===null){for(var i=0;iidx){var mLine=session.media[idx];Object.keys(recvonlySsrcs[type]).forEach(function(ssrc){if(mLine.sources&&mLine.sources[ssrc]){console.warn("Replacing an existing SSRC.")}if(!mLine.sources){mLine.sources={}}mLine.sources[ssrc]=recvonlySsrcs[type][ssrc]})}});if(typeof session.groups!=="undefined"){session.groups.some(function(group){if(group.type==="BUNDLE"){group.mids=mids.join(" ");return true}})}session.msidSemantic={semantic:"WMS",token:"*"};var resStr=transform.write(session);this.cache[desc.type]=resStr;return new RTCSessionDescription({type:desc.type,sdp:resStr})}},{"./array-equals":15,"./transform":18}],18:[function(require,module,exports){var transform=require("sdp-transform");exports.write=function(session,opts){if(typeof session!=="undefined"&&typeof session.media!=="undefined"&&Array.isArray(session.media)){session.media.forEach(function(mLine){if(typeof mLine.sources!=="undefined"&&Object.keys(mLine.sources).length!==0){mLine.ssrcs=[];Object.keys(mLine.sources).forEach(function(ssrc){var source=mLine.sources[ssrc];Object.keys(source).forEach(function(attribute){mLine.ssrcs.push({id:ssrc,attribute:attribute,value:source[attribute]})})});delete mLine.sources}if(typeof mLine.ssrcGroups!=="undefined"&&Array.isArray(mLine.ssrcGroups)){mLine.ssrcGroups.forEach(function(ssrcGroup){if(typeof ssrcGroup.ssrcs!=="undefined"&&Array.isArray(ssrcGroup.ssrcs)){ssrcGroup.ssrcs=ssrcGroup.ssrcs.join(" ")}})}})}if(typeof session!=="undefined"&&typeof session.groups!=="undefined"&&Array.isArray(session.groups)){session.groups.forEach(function(g){if(typeof g.mids!=="undefined"&&Array.isArray(g.mids)){g.mids=g.mids.join(" ")}})}return transform.write(session,opts)};exports.parse=function(sdp){var session=transform.parse(sdp);if(typeof session!=="undefined"&&typeof session.media!=="undefined"&&Array.isArray(session.media)){session.media.forEach(function(mLine){if(typeof mLine.ssrcs!=="undefined"&&Array.isArray(mLine.ssrcs)){mLine.sources={};mLine.ssrcs.forEach(function(ssrc){if(!mLine.sources[ssrc.id])mLine.sources[ssrc.id]={};mLine.sources[ssrc.id][ssrc.attribute]=ssrc.value});delete mLine.ssrcs}if(typeof mLine.ssrcGroups!=="undefined"&&Array.isArray(mLine.ssrcGroups)){mLine.ssrcGroups.forEach(function(ssrcGroup){if(typeof ssrcGroup.ssrcs==="string"){ssrcGroup.ssrcs=ssrcGroup.ssrcs.split(" ")}})}})}if(typeof session!=="undefined"&&typeof session.groups!=="undefined"&&Array.isArray(session.groups)){session.groups.forEach(function(g){if(typeof g.mids==="string"){g.mids=g.mids.split(" ")}})}return session}},{"sdp-transform":12}],19:[function(require,module,exports){"use strict";var SDPUtils={};SDPUtils.generateIdentifier=function(){return Math.random().toString(36).substr(2,10)};SDPUtils.localCName=SDPUtils.generateIdentifier();SDPUtils.splitLines=function(blob){return blob.trim().split("\n").map(function(line){return line.trim()})};SDPUtils.splitSections=function(blob){var parts=blob.split("\nm=");return parts.map(function(part,index){return(index>0?"m="+part:part).trim()+"\r\n"})};SDPUtils.getDescription=function(blob){var sections=SDPUtils.splitSections(blob);return sections&§ions[0]};SDPUtils.getMediaSections=function(blob){var sections=SDPUtils.splitSections(blob);sections.shift();return sections};SDPUtils.matchPrefix=function(blob,prefix){return SDPUtils.splitLines(blob).filter(function(line){return line.indexOf(prefix)===0})};SDPUtils.parseCandidate=function(line){var parts;if(line.indexOf("a=candidate:")===0){parts=line.substring(12).split(" ")}else{parts=line.substring(10).split(" ")}var candidate={foundation:parts[0],component:parseInt(parts[1],10),protocol:parts[2].toLowerCase(),priority:parseInt(parts[3],10),ip:parts[4],port:parseInt(parts[5],10),type:parts[7]};for(var i=8;i0?parts[0].split("/")[1]:"sendrecv",uri:parts[1]}};SDPUtils.writeExtmap=function(headerExtension){return"a=extmap:"+(headerExtension.id||headerExtension.preferredId)+(headerExtension.direction&&headerExtension.direction!=="sendrecv"?"/"+headerExtension.direction:"")+" "+headerExtension.uri+"\r\n"};SDPUtils.parseFmtp=function(line){var parsed={};var kv;var parts=line.substr(line.indexOf(" ")+1).split(";");for(var j=0;j-1){parts.attribute=line.substr(sp+1,colon-sp-1);parts.value=line.substr(colon+1)}else{parts.attribute=line.substr(sp+1)}return parts};SDPUtils.getMid=function(mediaSection){var mid=SDPUtils.matchPrefix(mediaSection,"a=mid:")[0];if(mid){return mid.substr(6)}};SDPUtils.parseFingerprint=function(line){var parts=line.substr(14).split(" ");return{algorithm:parts[0].toLowerCase(),value:parts[1]}};SDPUtils.getDtlsParameters=function(mediaSection,sessionpart){var lines=SDPUtils.matchPrefix(mediaSection+sessionpart,"a=fingerprint:");return{role:"auto",fingerprints:lines.map(SDPUtils.parseFingerprint)}};SDPUtils.writeDtlsParameters=function(params,setupType){var sdp="a=setup:"+setupType+"\r\n";params.fingerprints.forEach(function(fp){sdp+="a=fingerprint:"+fp.algorithm+" "+fp.value+"\r\n"});return sdp};SDPUtils.getIceParameters=function(mediaSection,sessionpart){var lines=SDPUtils.splitLines(mediaSection);lines=lines.concat(SDPUtils.splitLines(sessionpart));var iceParameters={usernameFragment:lines.filter(function(line){return line.indexOf("a=ice-ufrag:")===0})[0].substr(12),password:lines.filter(function(line){return line.indexOf("a=ice-pwd:")===0})[0].substr(10)};return iceParameters};SDPUtils.writeIceParameters=function(params){return"a=ice-ufrag:"+params.usernameFragment+"\r\n"+"a=ice-pwd:"+params.password+"\r\n"};SDPUtils.parseRtpParameters=function(mediaSection){var description={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]};var lines=SDPUtils.splitLines(mediaSection);var mline=lines[0].split(" ");for(var i=3;i0?"9":"0";sdp+=" UDP/TLS/RTP/SAVPF ";sdp+=caps.codecs.map(function(codec){if(codec.preferredPayloadType!==undefined){return codec.preferredPayloadType}return codec.payloadType}).join(" ")+"\r\n";sdp+="c=IN IP4 0.0.0.0\r\n";sdp+="a=rtcp:9 IN IP4 0.0.0.0\r\n";caps.codecs.forEach(function(codec){sdp+=SDPUtils.writeRtpMap(codec);sdp+=SDPUtils.writeFmtp(codec);sdp+=SDPUtils.writeRtcpFb(codec)});var maxptime=0;caps.codecs.forEach(function(codec){if(codec.maxptime>maxptime){maxptime=codec.maxptime}});if(maxptime>0){sdp+="a=maxptime:"+maxptime+"\r\n"}sdp+="a=rtcp-mux\r\n";caps.headerExtensions.forEach(function(extension){sdp+=SDPUtils.writeExtmap(extension)});return sdp};SDPUtils.parseRtpEncodingParameters=function(mediaSection){var encodingParameters=[];var description=SDPUtils.parseRtpParameters(mediaSection);var hasRed=description.fecMechanisms.indexOf("RED")!==-1;var hasUlpfec=description.fecMechanisms.indexOf("ULPFEC")!==-1;var ssrcs=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map(function(line){return SDPUtils.parseSsrcMedia(line)}).filter(function(parts){return parts.attribute==="cname"});var primarySsrc=ssrcs.length>0&&ssrcs[0].ssrc;var secondarySsrc;var flows=SDPUtils.matchPrefix(mediaSection,"a=ssrc-group:FID").map(function(line){var parts=line.split(" ");parts.shift();return parts.map(function(part){return parseInt(part,10)})});if(flows.length>0&&flows[0].length>1&&flows[0][0]===primarySsrc){secondarySsrc=flows[0][1]}description.codecs.forEach(function(codec){if(codec.name.toUpperCase()==="RTX"&&codec.parameters.apt){var encParam={ssrc:primarySsrc,codecPayloadType:parseInt(codec.parameters.apt,10),rtx:{ssrc:secondarySsrc}};encodingParameters.push(encParam);if(hasRed){encParam=JSON.parse(JSON.stringify(encParam));encParam.fec={ssrc:secondarySsrc,mechanism:hasUlpfec?"red+ulpfec":"red"};encodingParameters.push(encParam)}}});if(encodingParameters.length===0&&primarySsrc){encodingParameters.push({ssrc:primarySsrc})}var bandwidth=SDPUtils.matchPrefix(mediaSection,"b=");if(bandwidth.length){if(bandwidth[0].indexOf("b=TIAS:")===0){bandwidth=parseInt(bandwidth[0].substr(7),10)}else if(bandwidth[0].indexOf("b=AS:")===0){bandwidth=parseInt(bandwidth[0].substr(5),10)*1e3*.95-50*40*8}else{bandwidth=undefined}encodingParameters.forEach(function(params){params.maxBitrate=bandwidth})}return encodingParameters};SDPUtils.parseRtcpParameters=function(mediaSection){var rtcpParameters={};var cname;var remoteSsrc=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map(function(line){return SDPUtils.parseSsrcMedia(line)}).filter(function(obj){return obj.attribute==="cname"})[0];if(remoteSsrc){rtcpParameters.cname=remoteSsrc.value;rtcpParameters.ssrc=remoteSsrc.ssrc}var rsize=SDPUtils.matchPrefix(mediaSection,"a=rtcp-rsize");rtcpParameters.reducedSize=rsize.length>0;rtcpParameters.compound=rsize.length===0;var mux=SDPUtils.matchPrefix(mediaSection,"a=rtcp-mux");rtcpParameters.mux=mux.length>0;return rtcpParameters};SDPUtils.parseMsid=function(mediaSection){var parts;var spec=SDPUtils.matchPrefix(mediaSection,"a=msid:");if(spec.length===1){parts=spec[0].substr(7).split(" ");return{stream:parts[0],track:parts[1]}}var planB=SDPUtils.matchPrefix(mediaSection,"a=ssrc:").map(function(line){return SDPUtils.parseSsrcMedia(line)}).filter(function(parts){return parts.attribute==="msid"});if(planB.length>0){parts=planB[0].value.split(" ");return{stream:parts[0],track:parts[1]}}};SDPUtils.generateSessionId=function(){return Math.random().toString().substr(2,21)};SDPUtils.writeSessionBoilerplate=function(sessId,sessVer){var sessionId;var version=sessVer!==undefined?sessVer:2;if(sessId){sessionId=sessId}else{sessionId=SDPUtils.generateSessionId()}return"v=0\r\n"+"o=thisisadapterortc "+sessionId+" "+version+" IN IP4 127.0.0.1\r\n"+"s=-\r\n"+"t=0 0\r\n"};SDPUtils.writeMediaSection=function(transceiver,caps,type,stream){var sdp=SDPUtils.writeRtpDescription(transceiver.kind,caps);sdp+=SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters());sdp+=SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(),type==="offer"?"actpass":"active");sdp+="a=mid:"+transceiver.mid+"\r\n";if(transceiver.direction){sdp+="a="+transceiver.direction+"\r\n"}else if(transceiver.rtpSender&&transceiver.rtpReceiver){sdp+="a=sendrecv\r\n"}else if(transceiver.rtpSender){sdp+="a=sendonly\r\n"}else if(transceiver.rtpReceiver){sdp+="a=recvonly\r\n"}else{sdp+="a=inactive\r\n"}if(transceiver.rtpSender){var msid="msid:"+stream.id+" "+transceiver.rtpSender.track.id+"\r\n";sdp+="a="+msid;sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" "+msid;if(transceiver.sendEncodingParameters[0].rtx){sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" "+msid;sdp+="a=ssrc-group:FID "+transceiver.sendEncodingParameters[0].ssrc+" "+transceiver.sendEncodingParameters[0].rtx.ssrc+"\r\n"}}sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].ssrc+" cname:"+SDPUtils.localCName+"\r\n";if(transceiver.rtpSender&&transceiver.sendEncodingParameters[0].rtx){sdp+="a=ssrc:"+transceiver.sendEncodingParameters[0].rtx.ssrc+" cname:"+SDPUtils.localCName+"\r\n"}return sdp};SDPUtils.getDirection=function(mediaSection,sessionpart){var lines=SDPUtils.splitLines(mediaSection);for(var i=0;i0){if(q.length==2){if(typeof q[1]==FUNC_TYPE){this[q[0]]=q[1].call(this,match)}else{this[q[0]]=q[1]}}else if(q.length==3){if(typeof q[1]===FUNC_TYPE&&!(q[1].exec&&q[1].test)){this[q[0]]=match?q[1].call(this,match,q[2]):undefined}else{this[q[0]]=match?match.replace(q[1],q[2]):undefined}}else if(q.length==4){this[q[0]]=match?q[3].call(this,match.replace(q[1],q[2])):undefined}}else{this[q]=match?match:undefined}}}}i+=2}},str:function(str,map){for(var i in map){if(typeof map[i]===OBJ_TYPE&&map[i].length>0){for(var j=0;j>>((i&3)<<3)&255}return rnds}}module.exports=rng}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],24:[function(require,module,exports){var rng=require("./lib/rng");var bytesToUuid=require("./lib/bytesToUuid");var _seedBytes=rng();var _nodeId=[_seedBytes[0]|1,_seedBytes[1],_seedBytes[2],_seedBytes[3],_seedBytes[4],_seedBytes[5]];var _clockseq=(_seedBytes[6]<<8|_seedBytes[7])&16383;var _lastMSecs=0,_lastNSecs=0;function v1(options,buf,offset){var i=buf&&offset||0;var b=buf||[];options=options||{};var clockseq=options.clockseq!==undefined?options.clockseq:_clockseq;var msecs=options.msecs!==undefined?options.msecs:(new Date).getTime();var nsecs=options.nsecs!==undefined?options.nsecs:_lastNSecs+1;var dt=msecs-_lastMSecs+(nsecs-_lastNSecs)/1e4;if(dt<0&&options.clockseq===undefined){clockseq=clockseq+1&16383}if((dt<0||msecs>_lastMSecs)&&options.nsecs===undefined){nsecs=0}if(nsecs>=1e4){throw new Error("uuid.v1(): Can't create more than 10M uuids/sec")}_lastMSecs=msecs;_lastNSecs=nsecs;_clockseq=clockseq;msecs+=122192928e5;var tl=((msecs&268435455)*1e4+nsecs)%4294967296;b[i++]=tl>>>24&255;b[i++]=tl>>>16&255;b[i++]=tl>>>8&255;b[i++]=tl&255;var tmh=msecs/4294967296*1e4&268435455;b[i++]=tmh>>>8&255;b[i++]=tmh&255;b[i++]=tmh>>>24&15|16;b[i++]=tmh>>>16&255;b[i++]=clockseq>>>8|128;b[i++]=clockseq&255;var node=options.node||_nodeId;for(var n=0;n<6;++n){b[i+n]=node[n]}return buf?buf:bytesToUuid(b)}module.exports=v1},{"./lib/bytesToUuid":22,"./lib/rng":23}],25:[function(require,module,exports){var rng=require("./lib/rng");var bytesToUuid=require("./lib/bytesToUuid");function v4(options,buf,offset){var i=buf&&offset||0;if(typeof options=="string"){buf=options=="binary"?new Array(16):null;options=null}options=options||{};var rnds=options.random||(options.rng||rng)();rnds[6]=rnds[6]&15|64;rnds[8]=rnds[8]&63|128;if(buf){for(var ii=0;ii<16;++ii){buf[i+ii]=rnds[ii]}}return buf||bytesToUuid(rnds)}module.exports=v4},{"./lib/bytesToUuid":22,"./lib/rng":23}],26:[function(require,module,exports){(function(global){"use strict";var adapterFactory=require("./adapter_factory.js");module.exports=adapterFactory({window:global.window})}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./adapter_factory.js":27}],27:[function(require,module,exports){"use strict";var utils=require("./utils");module.exports=function(dependencies,opts){var window=dependencies&&dependencies.window;var options={shimChrome:true,shimFirefox:true,shimEdge:true,shimSafari:true};for(var key in opts){if(hasOwnProperty.call(opts,key)){options[key]=opts[key]}}var logging=utils.log;var browserDetails=utils.detectBrowser(window);var chromeShim=require("./chrome/chrome_shim")||null;var edgeShim=require("./edge/edge_shim")||null;var firefoxShim=require("./firefox/firefox_shim")||null;var safariShim=require("./safari/safari_shim")||null;var commonShim=require("./common_shim")||null;var adapter={browserDetails:browserDetails,commonShim:commonShim,extractVersion:utils.extractVersion,disableLog:utils.disableLog,disableWarnings:utils.disableWarnings};switch(browserDetails.browser){case"chrome":if(!chromeShim||!chromeShim.shimPeerConnection||!options.shimChrome){logging("Chrome shim is not included in this adapter release.");return adapter}logging("adapter.js shimming chrome.");adapter.browserShim=chromeShim;commonShim.shimCreateObjectURL(window);chromeShim.shimGetUserMedia(window);chromeShim.shimMediaStream(window);chromeShim.shimSourceObject(window);chromeShim.shimPeerConnection(window);chromeShim.shimOnTrack(window);chromeShim.shimAddTrackRemoveTrack(window);chromeShim.shimGetSendersWithDtmf(window);commonShim.shimRTCIceCandidate(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);break;case"firefox":if(!firefoxShim||!firefoxShim.shimPeerConnection||!options.shimFirefox){logging("Firefox shim is not included in this adapter release.");return adapter}logging("adapter.js shimming firefox.");adapter.browserShim=firefoxShim;commonShim.shimCreateObjectURL(window);firefoxShim.shimGetUserMedia(window);firefoxShim.shimSourceObject(window);firefoxShim.shimPeerConnection(window);firefoxShim.shimOnTrack(window);firefoxShim.shimRemoveStream(window);commonShim.shimRTCIceCandidate(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);break;case"edge":if(!edgeShim||!edgeShim.shimPeerConnection||!options.shimEdge){logging("MS edge shim is not included in this adapter release.");return adapter}logging("adapter.js shimming edge.");adapter.browserShim=edgeShim;commonShim.shimCreateObjectURL(window);edgeShim.shimGetUserMedia(window);edgeShim.shimPeerConnection(window);edgeShim.shimReplaceTrack(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);break;case"safari":if(!safariShim||!options.shimSafari){logging("Safari shim is not included in this adapter release.");return adapter}logging("adapter.js shimming safari.");adapter.browserShim=safariShim;commonShim.shimCreateObjectURL(window);safariShim.shimRTCIceServerUrls(window);safariShim.shimCallbacksAPI(window);safariShim.shimLocalStreamsAPI(window);safariShim.shimRemoteStreamsAPI(window);safariShim.shimTrackEventTransceiver(window);safariShim.shimGetUserMedia(window);safariShim.shimCreateOfferLegacy(window);commonShim.shimRTCIceCandidate(window);commonShim.shimMaxMessageSize(window);commonShim.shimSendThrowTypeError(window);break;default:logging("Unsupported browser!");break}return adapter}},{"./chrome/chrome_shim":28,"./common_shim":30,"./edge/edge_shim":31,"./firefox/firefox_shim":33,"./safari/safari_shim":35,"./utils":36}],28:[function(require,module,exports){"use strict";var utils=require("../utils.js");var logging=utils.log;module.exports={shimGetUserMedia:require("./getusermedia"),shimMediaStream:function(window){window.MediaStream=window.MediaStream||window.webkitMediaStream},shimOnTrack:function(window){if(typeof window==="object"&&window.RTCPeerConnection&&!("ontrack"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(f){if(this._ontrack){this.removeEventListener("track",this._ontrack)}this.addEventListener("track",this._ontrack=f)}});var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var pc=this;if(!pc._ontrackpoly){pc._ontrackpoly=function(e){e.stream.addEventListener("addtrack",function(te){var receiver;if(window.RTCPeerConnection.prototype.getReceivers){receiver=pc.getReceivers().find(function(r){return r.track&&r.track.id===te.track.id})}else{receiver={track:te.track}}var event=new Event("track");event.track=te.track;event.receiver=receiver;event.transceiver={receiver:receiver};event.streams=[e.stream];pc.dispatchEvent(event)});e.stream.getTracks().forEach(function(track){var receiver;if(window.RTCPeerConnection.prototype.getReceivers){receiver=pc.getReceivers().find(function(r){return r.track&&r.track.id===track.id})}else{receiver={track:track}}var event=new Event("track");event.track=track;event.receiver=receiver;event.transceiver={receiver:receiver};event.streams=[e.stream];pc.dispatchEvent(event)})};pc.addEventListener("addstream",pc._ontrackpoly)}return origSetRemoteDescription.apply(pc,arguments)}}else if(!("RTCRtpTransceiver"in window)){utils.wrapPeerConnectionEvent(window,"track",function(e){if(!e.transceiver){e.transceiver={receiver:e.receiver}}return e})}},shimGetSendersWithDtmf:function(window){if(typeof window==="object"&&window.RTCPeerConnection&&!("getSenders"in window.RTCPeerConnection.prototype)&&"createDTMFSender"in window.RTCPeerConnection.prototype){var shimSenderWithDtmf=function(pc,track){return{track:track,get dtmf(){if(this._dtmf===undefined){if(track.kind==="audio"){this._dtmf=pc.createDTMFSender(track)}else{this._dtmf=null}}return this._dtmf},_pc:pc}};if(!window.RTCPeerConnection.prototype.getSenders){window.RTCPeerConnection.prototype.getSenders=function(){this._senders=this._senders||[];return this._senders.slice()};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){var pc=this;var sender=origAddTrack.apply(pc,arguments);if(!sender){sender=shimSenderWithDtmf(pc,track);pc._senders.push(sender)}return sender};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){var pc=this;origRemoveTrack.apply(pc,arguments);var idx=pc._senders.indexOf(sender);if(idx!==-1){pc._senders.splice(idx,1)}}}var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var pc=this;pc._senders=pc._senders||[];origAddStream.apply(pc,[stream]);stream.getTracks().forEach(function(track){pc._senders.push(shimSenderWithDtmf(pc,track))})};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){var pc=this;pc._senders=pc._senders||[];origRemoveStream.apply(pc,[stream]);stream.getTracks().forEach(function(track){var sender=pc._senders.find(function(s){return s.track===track});if(sender){pc._senders.splice(pc._senders.indexOf(sender),1)}})}}else if(typeof window==="object"&&window.RTCPeerConnection&&"getSenders"in window.RTCPeerConnection.prototype&&"createDTMFSender"in window.RTCPeerConnection.prototype&&window.RTCRtpSender&&!("dtmf"in window.RTCRtpSender.prototype)){var origGetSenders=window.RTCPeerConnection.prototype.getSenders;window.RTCPeerConnection.prototype.getSenders=function(){var pc=this;var senders=origGetSenders.apply(pc,[]);senders.forEach(function(sender){sender._pc=pc});return senders};Object.defineProperty(window.RTCRtpSender.prototype,"dtmf",{get:function(){if(this._dtmf===undefined){if(this.track.kind==="audio"){this._dtmf=this._pc.createDTMFSender(this.track)}else{this._dtmf=null}}return this._dtmf}})}},shimSourceObject:function(window){var URL=window&&window.URL;if(typeof window==="object"){if(window.HTMLMediaElement&&!("srcObject"in window.HTMLMediaElement.prototype)){Object.defineProperty(window.HTMLMediaElement.prototype,"srcObject",{get:function(){return this._srcObject},set:function(stream){var self=this;this._srcObject=stream;if(this.src){URL.revokeObjectURL(this.src)}if(!stream){this.src="";return undefined}this.src=URL.createObjectURL(stream);stream.addEventListener("addtrack",function(){if(self.src){URL.revokeObjectURL(self.src)}self.src=URL.createObjectURL(stream)});stream.addEventListener("removetrack",function(){if(self.src){URL.revokeObjectURL(self.src)}self.src=URL.createObjectURL(stream)})}})}}},shimAddTrackRemoveTrackWithNative:function(window){window.RTCPeerConnection.prototype.getLocalStreams=function(){var pc=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{};return Object.keys(this._shimmedLocalStreams).map(function(streamId){return pc._shimmedLocalStreams[streamId][0]})};var origAddTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addTrack=function(track,stream){if(!stream){return origAddTrack.apply(this,arguments)}this._shimmedLocalStreams=this._shimmedLocalStreams||{};var sender=origAddTrack.apply(this,arguments);if(!this._shimmedLocalStreams[stream.id]){this._shimmedLocalStreams[stream.id]=[stream,sender]}else if(this._shimmedLocalStreams[stream.id].indexOf(sender)===-1){this._shimmedLocalStreams[stream.id].push(sender)}return sender};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var pc=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{};stream.getTracks().forEach(function(track){var alreadyExists=pc.getSenders().find(function(s){return s.track===track});if(alreadyExists){throw new DOMException("Track already exists.","InvalidAccessError")}});var existingSenders=pc.getSenders();origAddStream.apply(this,arguments);var newSenders=pc.getSenders().filter(function(newSender){return existingSenders.indexOf(newSender)===-1});this._shimmedLocalStreams[stream.id]=[stream].concat(newSenders)};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){this._shimmedLocalStreams=this._shimmedLocalStreams||{};delete this._shimmedLocalStreams[stream.id];return origRemoveStream.apply(this,arguments)};var origRemoveTrack=window.RTCPeerConnection.prototype.removeTrack;window.RTCPeerConnection.prototype.removeTrack=function(sender){var pc=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{};if(sender){Object.keys(this._shimmedLocalStreams).forEach(function(streamId){var idx=pc._shimmedLocalStreams[streamId].indexOf(sender);if(idx!==-1){pc._shimmedLocalStreams[streamId].splice(idx,1)}if(pc._shimmedLocalStreams[streamId].length===1){delete pc._shimmedLocalStreams[streamId]}})}return origRemoveTrack.apply(this,arguments)}},shimAddTrackRemoveTrack:function(window){var browserDetails=utils.detectBrowser(window);if(window.RTCPeerConnection.prototype.addTrack&&browserDetails.version>=65){return this.shimAddTrackRemoveTrackWithNative(window)}var origGetLocalStreams=window.RTCPeerConnection.prototype.getLocalStreams;window.RTCPeerConnection.prototype.getLocalStreams=function(){var pc=this;var nativeStreams=origGetLocalStreams.apply(this);pc._reverseStreams=pc._reverseStreams||{};return nativeStreams.map(function(stream){return pc._reverseStreams[stream.id]})};var origAddStream=window.RTCPeerConnection.prototype.addStream;window.RTCPeerConnection.prototype.addStream=function(stream){var pc=this;pc._streams=pc._streams||{};pc._reverseStreams=pc._reverseStreams||{};stream.getTracks().forEach(function(track){var alreadyExists=pc.getSenders().find(function(s){return s.track===track});if(alreadyExists){throw new DOMException("Track already exists.","InvalidAccessError")}});if(!pc._reverseStreams[stream.id]){var newStream=new window.MediaStream(stream.getTracks());pc._streams[stream.id]=newStream;pc._reverseStreams[newStream.id]=stream;stream=newStream}origAddStream.apply(pc,[stream])};var origRemoveStream=window.RTCPeerConnection.prototype.removeStream;window.RTCPeerConnection.prototype.removeStream=function(stream){var pc=this;pc._streams=pc._streams||{};pc._reverseStreams=pc._reverseStreams||{};origRemoveStream.apply(pc,[pc._streams[stream.id]||stream]);delete pc._reverseStreams[pc._streams[stream.id]?pc._streams[stream.id].id:stream.id];delete pc._streams[stream.id]};window.RTCPeerConnection.prototype.addTrack=function(track,stream){var pc=this;if(pc.signalingState==="closed"){throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError")}var streams=[].slice.call(arguments,1);if(streams.length!==1||!streams[0].getTracks().find(function(t){return t===track})){throw new DOMException("The adapter.js addTrack polyfill only supports a single "+" stream which is associated with the specified track.","NotSupportedError")}var alreadyExists=pc.getSenders().find(function(s){return s.track===track});if(alreadyExists){throw new DOMException("Track already exists.","InvalidAccessError")}pc._streams=pc._streams||{};pc._reverseStreams=pc._reverseStreams||{};var oldStream=pc._streams[stream.id];if(oldStream){oldStream.addTrack(track);Promise.resolve().then(function(){pc.dispatchEvent(new Event("negotiationneeded"))})}else{var newStream=new window.MediaStream([track]);pc._streams[stream.id]=newStream;pc._reverseStreams[newStream.id]=stream;pc.addStream(newStream)}return pc.getSenders().find(function(s){return s.track===track})};function replaceInternalStreamId(pc,description){var sdp=description.sdp;Object.keys(pc._reverseStreams||[]).forEach(function(internalId){var externalStream=pc._reverseStreams[internalId];var internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(internalStream.id,"g"),externalStream.id)});return new RTCSessionDescription({type:description.type,sdp:sdp})}function replaceExternalStreamId(pc,description){var sdp=description.sdp;Object.keys(pc._reverseStreams||[]).forEach(function(internalId){var externalStream=pc._reverseStreams[internalId];var internalStream=pc._streams[externalStream.id];sdp=sdp.replace(new RegExp(externalStream.id,"g"),internalStream.id)});return new RTCSessionDescription({type:description.type,sdp:sdp})}["createOffer","createAnswer"].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){var pc=this;var args=arguments;var isLegacyCall=arguments.length&&typeof arguments[0]==="function";if(isLegacyCall){return nativeMethod.apply(pc,[function(description){var desc=replaceInternalStreamId(pc,description);args[0].apply(null,[desc])},function(err){if(args[1]){args[1].apply(null,err)}},arguments[2]])}return nativeMethod.apply(pc,arguments).then(function(description){return replaceInternalStreamId(pc,description)})}});var origSetLocalDescription=window.RTCPeerConnection.prototype.setLocalDescription;window.RTCPeerConnection.prototype.setLocalDescription=function(){var pc=this;if(!arguments.length||!arguments[0].type){return origSetLocalDescription.apply(pc,arguments)}arguments[0]=replaceExternalStreamId(pc,arguments[0]);return origSetLocalDescription.apply(pc,arguments)};var origLocalDescription=Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(window.RTCPeerConnection.prototype,"localDescription",{get:function(){var pc=this;var description=origLocalDescription.get.apply(this);if(description.type===""){return description}return replaceInternalStreamId(pc,description)}});window.RTCPeerConnection.prototype.removeTrack=function(sender){var pc=this;if(pc.signalingState==="closed"){throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError")}if(!sender._pc){throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack "+"does not implement interface RTCRtpSender.","TypeError")}var isLocal=sender._pc===pc;if(!isLocal){throw new DOMException("Sender was not created by this connection.","InvalidAccessError")}pc._streams=pc._streams||{};var stream;Object.keys(pc._streams).forEach(function(streamid){var hasTrack=pc._streams[streamid].getTracks().find(function(track){return sender.track===track});if(hasTrack){stream=pc._streams[streamid]}});if(stream){if(stream.getTracks().length===1){pc.removeStream(pc._reverseStreams[stream.id])}else{stream.removeTrack(sender.track)}pc.dispatchEvent(new Event("negotiationneeded"))}}},shimPeerConnection:function(window){var browserDetails=utils.detectBrowser(window);if(!window.RTCPeerConnection&&window.webkitRTCPeerConnection){window.RTCPeerConnection=function(pcConfig,pcConstraints){logging("PeerConnection");if(pcConfig&&pcConfig.iceTransportPolicy){pcConfig.iceTransports=pcConfig.iceTransportPolicy}return new window.webkitRTCPeerConnection(pcConfig,pcConstraints)};window.RTCPeerConnection.prototype=window.webkitRTCPeerConnection.prototype;if(window.webkitRTCPeerConnection.generateCertificate){Object.defineProperty(window.RTCPeerConnection,"generateCertificate",{get:function(){return window.webkitRTCPeerConnection.generateCertificate}})}}else{var OrigPeerConnection=window.RTCPeerConnection;window.RTCPeerConnection=function(pcConfig,pcConstraints){if(pcConfig&&pcConfig.iceServers){var newIceServers=[];for(var i=0;i0&&typeof selector==="function"){return origGetStats.apply(this,arguments)}if(origGetStats.length===0&&(arguments.length===0||typeof arguments[0]!=="function")){return origGetStats.apply(this,[])}var fixChromeStats_=function(response){var standardReport={};var reports=response.result();reports.forEach(function(report){var standardStats={id:report.id,timestamp:report.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[report.type]||report.type};report.names().forEach(function(name){standardStats[name]=report.stat(name)});standardReport[standardStats.id]=standardStats});return standardReport};var makeMapStats=function(stats){return new Map(Object.keys(stats).map(function(key){return[key,stats[key]]}))};if(arguments.length>=2){var successCallbackWrapper_=function(response){args[1](makeMapStats(fixChromeStats_(response)))};return origGetStats.apply(this,[successCallbackWrapper_,arguments[0]])}return new Promise(function(resolve,reject){origGetStats.apply(pc,[function(response){resolve(makeMapStats(fixChromeStats_(response)))},reject])}).then(successCallback,errorCallback)};if(browserDetails.version<51){["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){var args=arguments;var pc=this;var promise=new Promise(function(resolve,reject){nativeMethod.apply(pc,[args[0],resolve,reject])});if(args.length<2){return promise}return promise.then(function(){args[1].apply(null,[])},function(err){if(args.length>=3){args[2].apply(null,[err])}})}})}if(browserDetails.version<52){["createOffer","createAnswer"].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){var pc=this;if(arguments.length<1||arguments.length===1&&typeof arguments[0]==="object"){var opts=arguments.length===1?arguments[0]:undefined;return new Promise(function(resolve,reject){nativeMethod.apply(pc,[resolve,reject,opts])})}return nativeMethod.apply(this,arguments)}})}["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(method){var nativeMethod=window.RTCPeerConnection.prototype[method];window.RTCPeerConnection.prototype[method]=function(){arguments[0]=new(method==="addIceCandidate"?window.RTCIceCandidate:window.RTCSessionDescription)(arguments[0]);return nativeMethod.apply(this,arguments)}});var nativeAddIceCandidate=window.RTCPeerConnection.prototype.addIceCandidate;window.RTCPeerConnection.prototype.addIceCandidate=function(){if(!arguments[0]){if(arguments[1]){arguments[1].apply(null)}return Promise.resolve()}return nativeAddIceCandidate.apply(this,arguments)}}}},{"../utils.js":36,"./getusermedia":29}],29:[function(require,module,exports){"use strict";var utils=require("../utils.js");var logging=utils.log;module.exports=function(window){var browserDetails=utils.detectBrowser(window);var navigator=window&&window.navigator;var constraintsToChrome_=function(c){if(typeof c!=="object"||c.mandatory||c.optional){return c}var cc={};Object.keys(c).forEach(function(key){if(key==="require"||key==="advanced"||key==="mediaSource"){return}var r=typeof c[key]==="object"?c[key]:{ideal:c[key]};if(r.exact!==undefined&&typeof r.exact==="number"){r.min=r.max=r.exact}var oldname_=function(prefix,name){if(prefix){return prefix+name.charAt(0).toUpperCase()+name.slice(1)}return name==="deviceId"?"sourceId":name};if(r.ideal!==undefined){cc.optional=cc.optional||[];var oc={};if(typeof r.ideal==="number"){oc[oldname_("min",key)]=r.ideal;cc.optional.push(oc);oc={};oc[oldname_("max",key)]=r.ideal;cc.optional.push(oc)}else{oc[oldname_("",key)]=r.ideal;cc.optional.push(oc)}}if(r.exact!==undefined&&typeof r.exact!=="number"){cc.mandatory=cc.mandatory||{};cc.mandatory[oldname_("",key)]=r.exact}else{["min","max"].forEach(function(mix){if(r[mix]!==undefined){cc.mandatory=cc.mandatory||{};cc.mandatory[oldname_(mix,key)]=r[mix]}})}});if(c.advanced){cc.optional=(cc.optional||[]).concat(c.advanced)}return cc};var shimConstraints_=function(constraints,func){if(browserDetails.version>=61){return func(constraints)}constraints=JSON.parse(JSON.stringify(constraints));if(constraints&&typeof constraints.audio==="object"){var remap=function(obj,a,b){if(a in obj&&!(b in obj)){obj[b]=obj[a];delete obj[a]}};constraints=JSON.parse(JSON.stringify(constraints));remap(constraints.audio,"autoGainControl","googAutoGainControl");remap(constraints.audio,"noiseSuppression","googNoiseSuppression");constraints.audio=constraintsToChrome_(constraints.audio)}if(constraints&&typeof constraints.video==="object"){var face=constraints.video.facingMode;face=face&&(typeof face==="object"?face:{ideal:face});var getSupportedFacingModeLies=browserDetails.version<66;if(face&&(face.exact==="user"||face.exact==="environment"||face.ideal==="user"||face.ideal==="environment")&&!(navigator.mediaDevices.getSupportedConstraints&&navigator.mediaDevices.getSupportedConstraints().facingMode&&!getSupportedFacingModeLies)){delete constraints.video.facingMode;var matches;if(face.exact==="environment"||face.ideal==="environment"){matches=["back","rear"]}else if(face.exact==="user"||face.ideal==="user"){matches=["front"]}if(matches){return navigator.mediaDevices.enumerateDevices().then(function(devices){devices=devices.filter(function(d){return d.kind==="videoinput"});var dev=devices.find(function(d){return matches.some(function(match){return d.label.toLowerCase().indexOf(match)!==-1})});if(!dev&&devices.length&&matches.indexOf("back")!==-1){dev=devices[devices.length-1]}if(dev){constraints.video.deviceId=face.exact?{exact:dev.deviceId}:{ideal:dev.deviceId}}constraints.video=constraintsToChrome_(constraints.video);logging("chrome: "+JSON.stringify(constraints));return func(constraints)})}}constraints.video=constraintsToChrome_(constraints.video)}logging("chrome: "+JSON.stringify(constraints));return func(constraints)};var shimError_=function(e){return{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.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};var getUserMedia_=function(constraints,onSuccess,onError){shimConstraints_(constraints,function(c){navigator.webkitGetUserMedia(c,onSuccess,function(e){if(onError){onError(shimError_(e))}})})};navigator.getUserMedia=getUserMedia_;var getUserMediaPromise_=function(constraints){return new Promise(function(resolve,reject){navigator.getUserMedia(constraints,resolve,reject)})};if(!navigator.mediaDevices){navigator.mediaDevices={getUserMedia:getUserMediaPromise_,enumerateDevices:function(){return new Promise(function(resolve){var kinds={audio:"audioinput",video:"videoinput"};return window.MediaStreamTrack.getSources(function(devices){resolve(devices.map(function(device){return{label:device.label,kind:kinds[device.kind],deviceId:device.id,groupId:""}}))})})},getSupportedConstraints:function(){return{deviceId:true,echoCancellation:true,facingMode:true,frameRate:true,height:true,width:true}}}}if(!navigator.mediaDevices.getUserMedia){navigator.mediaDevices.getUserMedia=function(constraints){return getUserMediaPromise_(constraints)}}else{var origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(cs){return shimConstraints_(cs,function(c){return origGetUserMedia(c).then(function(stream){if(c.audio&&!stream.getAudioTracks().length||c.video&&!stream.getVideoTracks().length){stream.getTracks().forEach(function(track){track.stop()});throw new DOMException("","NotFoundError")}return stream},function(e){return Promise.reject(shimError_(e))})})}}if(typeof navigator.mediaDevices.addEventListener==="undefined"){navigator.mediaDevices.addEventListener=function(){logging("Dummy mediaDevices.addEventListener called.")}}if(typeof navigator.mediaDevices.removeEventListener==="undefined"){navigator.mediaDevices.removeEventListener=function(){logging("Dummy mediaDevices.removeEventListener called.")}}}},{"../utils.js":36}],30:[function(require,module,exports){"use strict";var SDPUtils=require("sdp");var utils=require("./utils");module.exports={shimRTCIceCandidate:function(window){if(!window.RTCIceCandidate||window.RTCIceCandidate&&"foundation"in window.RTCIceCandidate.prototype){return}var NativeRTCIceCandidate=window.RTCIceCandidate;window.RTCIceCandidate=function(args){if(typeof args==="object"&&args.candidate&&args.candidate.indexOf("a=")===0){args=JSON.parse(JSON.stringify(args));args.candidate=args.candidate.substr(2)}if(args.candidate&&args.candidate.length){var nativeCandidate=new NativeRTCIceCandidate(args);var parsedCandidate=SDPUtils.parseCandidate(args.candidate);var augmentedCandidate=Object.assign(nativeCandidate,parsedCandidate);augmentedCandidate.toJSON=function(){return{candidate:augmentedCandidate.candidate,sdpMid:augmentedCandidate.sdpMid,sdpMLineIndex:augmentedCandidate.sdpMLineIndex,usernameFragment:augmentedCandidate.usernameFragment}};return augmentedCandidate}return new NativeRTCIceCandidate(args)};window.RTCIceCandidate.prototype=NativeRTCIceCandidate.prototype;utils.wrapPeerConnectionEvent(window,"icecandidate",function(e){if(e.candidate){Object.defineProperty(e,"candidate",{value:new window.RTCIceCandidate(e.candidate),writable:"false"})}return e})},shimCreateObjectURL:function(window){var URL=window&&window.URL;if(!(typeof window==="object"&&window.HTMLMediaElement&&"srcObject"in window.HTMLMediaElement.prototype&&URL.createObjectURL&&URL.revokeObjectURL)){return undefined}var nativeCreateObjectURL=URL.createObjectURL.bind(URL);var nativeRevokeObjectURL=URL.revokeObjectURL.bind(URL);var streams=new Map,newId=0;URL.createObjectURL=function(stream){if("getTracks"in stream){var url="polyblob:"+ ++newId;streams.set(url,stream);utils.deprecated("URL.createObjectURL(stream)","elem.srcObject = stream");return url}return nativeCreateObjectURL(stream)};URL.revokeObjectURL=function(url){nativeRevokeObjectURL(url);streams.delete(url)};var dsc=Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,"src");Object.defineProperty(window.HTMLMediaElement.prototype,"src",{get:function(){return dsc.get.apply(this)},set:function(url){this.srcObject=streams.get(url)||null;return dsc.set.apply(this,[url])}});var nativeSetAttribute=window.HTMLMediaElement.prototype.setAttribute;window.HTMLMediaElement.prototype.setAttribute=function(){if(arguments.length===2&&(""+arguments[0]).toLowerCase()==="src"){this.srcObject=streams.get(arguments[1])||null}return nativeSetAttribute.apply(this,arguments)}},shimMaxMessageSize:function(window){if(window.RTCSctpTransport||!window.RTCPeerConnection){return}var browserDetails=utils.detectBrowser(window);if(!("sctp"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"sctp",{get:function(){return typeof this._sctp==="undefined"?null:this._sctp}})}var sctpInDescription=function(description){var sections=SDPUtils.splitSections(description.sdp);sections.shift();return sections.some(function(mediaSection){var mLine=SDPUtils.parseMLine(mediaSection);return mLine&&mLine.kind==="application"&&mLine.protocol.indexOf("SCTP")!==-1})};var getRemoteFirefoxVersion=function(description){var match=description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(match===null||match.length<2){return-1}var version=parseInt(match[1],10);return version!==version?-1:version};var getCanSendMaxMessageSize=function(remoteIsFirefox){var canSendMaxMessageSize=65536;if(browserDetails.browser==="firefox"){if(browserDetails.version<57){if(remoteIsFirefox===-1){canSendMaxMessageSize=16384}else{canSendMaxMessageSize=2147483637}}else{canSendMaxMessageSize=browserDetails.version===57?65535:65536}}return canSendMaxMessageSize};var getMaxMessageSize=function(description,remoteIsFirefox){var maxMessageSize=65536;if(browserDetails.browser==="firefox"&&browserDetails.version===57){maxMessageSize=65535}var match=SDPUtils.matchPrefix(description.sdp,"a=max-message-size:");if(match.length>0){maxMessageSize=parseInt(match[0].substr(19),10)}else if(browserDetails.browser==="firefox"&&remoteIsFirefox!==-1){maxMessageSize=2147483637}return maxMessageSize};var origSetRemoteDescription=window.RTCPeerConnection.prototype.setRemoteDescription;window.RTCPeerConnection.prototype.setRemoteDescription=function(){var pc=this;pc._sctp=null;if(sctpInDescription(arguments[0])){var isFirefox=getRemoteFirefoxVersion(arguments[0]);var canSendMMS=getCanSendMaxMessageSize(isFirefox);var remoteMMS=getMaxMessageSize(arguments[0],isFirefox);var maxMessageSize;if(canSendMMS===0&&remoteMMS===0){maxMessageSize=Number.POSITIVE_INFINITY}else if(canSendMMS===0||remoteMMS===0){maxMessageSize=Math.max(canSendMMS,remoteMMS)}else{maxMessageSize=Math.min(canSendMMS,remoteMMS)}var sctp={};Object.defineProperty(sctp,"maxMessageSize",{get:function(){return maxMessageSize}});pc._sctp=sctp}return origSetRemoteDescription.apply(pc,arguments)}},shimSendThrowTypeError:function(window){if(!window.RTCPeerConnection){return}var origCreateDataChannel=window.RTCPeerConnection.prototype.createDataChannel;window.RTCPeerConnection.prototype.createDataChannel=function(){var pc=this;var dataChannel=origCreateDataChannel.apply(pc,arguments);var origDataChannelSend=dataChannel.send;dataChannel.send=function(){var dc=this;var data=arguments[0];var length=data.length||data.size||data.byteLength;if(length>pc.sctp.maxMessageSize){throw new DOMException("Message too large (can send a maximum of "+pc.sctp.maxMessageSize+" bytes)","TypeError")}return origDataChannelSend.apply(dc,arguments)};return dataChannel}}}},{"./utils":36,sdp:19}],31:[function(require,module,exports){"use strict";var utils=require("../utils");var shimRTCPeerConnection=require("rtcpeerconnection-shim");module.exports={shimGetUserMedia:require("./getusermedia"),shimPeerConnection:function(window){var browserDetails=utils.detectBrowser(window);if(window.RTCIceGatherer){if(!window.RTCIceCandidate){window.RTCIceCandidate=function(args){return args}}if(!window.RTCSessionDescription){window.RTCSessionDescription=function(args){return args}}if(browserDetails.version<15025){var origMSTEnabled=Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype,"enabled");Object.defineProperty(window.MediaStreamTrack.prototype,"enabled",{set:function(value){origMSTEnabled.set.call(this,value);var ev=new Event("enabled");ev.enabled=value;this.dispatchEvent(ev)}})}}if(window.RTCRtpSender&&!("dtmf"in window.RTCRtpSender.prototype)){Object.defineProperty(window.RTCRtpSender.prototype,"dtmf",{get:function(){if(this._dtmf===undefined){if(this.track.kind==="audio"){this._dtmf=new window.RTCDtmfSender(this)}else if(this.track.kind==="video"){this._dtmf=null}}return this._dtmf}})}if(window.RTCDtmfSender&&!window.RTCDTMFSender){window.RTCDTMFSender=window.RTCDtmfSender}window.RTCPeerConnection=shimRTCPeerConnection(window,browserDetails.version)},shimReplaceTrack:function(window){if(window.RTCRtpSender&&!("replaceTrack"in window.RTCRtpSender.prototype)){window.RTCRtpSender.prototype.replaceTrack=window.RTCRtpSender.prototype.setTrack}}}},{"../utils":36,"./getusermedia":32,"rtcpeerconnection-shim":10}],32:[function(require,module,exports){"use strict";module.exports=function(window){var navigator=window&&window.navigator;var shimError_=function(e){return{name:{PermissionDeniedError:"NotAllowedError"}[e.name]||e.name,message:e.message,constraint:e.constraint,toString:function(){return this.name}}};var origGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(c){return origGetUserMedia(c).catch(function(e){return Promise.reject(shimError_(e))})}}},{}],33:[function(require,module,exports){"use strict";var utils=require("../utils");module.exports={shimGetUserMedia:require("./getusermedia"),shimOnTrack:function(window){if(typeof window==="object"&&window.RTCPeerConnection&&!("ontrack"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(f){if(this._ontrack){this.removeEventListener("track",this._ontrack);this.removeEventListener("addstream",this._ontrackpoly)}this.addEventListener("track",this._ontrack=f);this.addEventListener("addstream",this._ontrackpoly=function(e){e.stream.getTracks().forEach(function(track){var event=new Event("track");event.track=track;event.receiver={track:track};event.transceiver={receiver:event.receiver};event.streams=[e.stream];this.dispatchEvent(event)}.bind(this))}.bind(this))}})}if(typeof window==="object"&&window.RTCTrackEvent&&"receiver"in window.RTCTrackEvent.prototype&&!("transceiver"in window.RTCTrackEvent.prototype)){Object.defineProperty(window.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})}},shimSourceObject:function(window){if(typeof window==="object"){if(window.HTMLMediaElement&&!("srcObject"in window.HTMLMediaElement.prototype)){Object.defineProperty(window.HTMLMediaElement.prototype,"srcObject",{get:function(){return this.mozSrcObject},set:function(stream){this.mozSrcObject=stream}})}}},shimPeerConnection:function(window){var browserDetails=utils.detectBrowser(window);if(typeof window!=="object"||!(window.RTCPeerConnection||window.mozRTCPeerConnection)){return}if(!window.RTCPeerConnection){window.RTCPeerConnection=function(pcConfig,pcConstraints){if(browserDetails.version<38){if(pcConfig&&pcConfig.iceServers){var newIceServers=[];for(var i=0;i55&&"autoGainControl"in navigator.mediaDevices.getSupportedConstraints())){var remap=function(obj,a,b){if(a in obj&&!(b in obj)){obj[b]=obj[a];delete obj[a]}};var nativeGetUserMedia=navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);navigator.mediaDevices.getUserMedia=function(c){if(typeof c==="object"&&typeof c.audio==="object"){c=JSON.parse(JSON.stringify(c));remap(c.audio,"autoGainControl","mozAutoGainControl");remap(c.audio,"noiseSuppression","mozNoiseSuppression")}return nativeGetUserMedia(c)};if(MediaStreamTrack&&MediaStreamTrack.prototype.getSettings){var nativeGetSettings=MediaStreamTrack.prototype.getSettings;MediaStreamTrack.prototype.getSettings=function(){var obj=nativeGetSettings.apply(this,arguments);remap(obj,"mozAutoGainControl","autoGainControl");remap(obj,"mozNoiseSuppression","noiseSuppression");return obj}}if(MediaStreamTrack&&MediaStreamTrack.prototype.applyConstraints){var nativeApplyConstraints=MediaStreamTrack.prototype.applyConstraints;MediaStreamTrack.prototype.applyConstraints=function(c){if(this.kind==="audio"&&typeof c==="object"){c=JSON.parse(JSON.stringify(c));remap(c,"autoGainControl","mozAutoGainControl");remap(c,"noiseSuppression","mozNoiseSuppression")}return nativeApplyConstraints.apply(this,[c])}}}navigator.getUserMedia=function(constraints,onSuccess,onError){if(browserDetails.version<44){return getUserMedia_(constraints,onSuccess,onError)}utils.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia");navigator.mediaDevices.getUserMedia(constraints).then(onSuccess,onError)}}},{"../utils":36}],35:[function(require,module,exports){"use strict";var utils=require("../utils");module.exports={shimLocalStreamsAPI:function(window){if(typeof window!=="object"||!window.RTCPeerConnection){return}if(!("getLocalStreams"in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.getLocalStreams=function(){if(!this._localStreams){this._localStreams=[]}return this._localStreams}}if(!("getStreamById"in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.getStreamById=function(id){var result=null;if(this._localStreams){this._localStreams.forEach(function(stream){if(stream.id===id){result=stream}})}if(this._remoteStreams){this._remoteStreams.forEach(function(stream){if(stream.id===id){result=stream}})}return result}}if(!("addStream"in window.RTCPeerConnection.prototype)){var _addTrack=window.RTCPeerConnection.prototype.addTrack;window.RTCPeerConnection.prototype.addStream=function(stream){if(!this._localStreams){this._localStreams=[]}if(this._localStreams.indexOf(stream)===-1){this._localStreams.push(stream)}var pc=this;stream.getTracks().forEach(function(track){_addTrack.call(pc,track,stream)})};window.RTCPeerConnection.prototype.addTrack=function(track,stream){if(stream){if(!this._localStreams){this._localStreams=[stream]}else if(this._localStreams.indexOf(stream)===-1){this._localStreams.push(stream)}}return _addTrack.call(this,track,stream)}}if(!("removeStream"in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.removeStream=function(stream){if(!this._localStreams){this._localStreams=[]}var index=this._localStreams.indexOf(stream);if(index===-1){return}this._localStreams.splice(index,1);var pc=this;var tracks=stream.getTracks();this.getSenders().forEach(function(sender){if(tracks.indexOf(sender.track)!==-1){pc.removeTrack(sender)}})}}},shimRemoteStreamsAPI:function(window){if(typeof window!=="object"||!window.RTCPeerConnection){return}if(!("getRemoteStreams"in window.RTCPeerConnection.prototype)){window.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}}if(!("onaddstream"in window.RTCPeerConnection.prototype)){Object.defineProperty(window.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(f){var pc=this;if(this._onaddstream){this.removeEventListener("addstream",this._onaddstream);this.removeEventListener("track",this._onaddstreampoly)}this.addEventListener("addstream",this._onaddstream=f);this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach(function(stream){if(!pc._remoteStreams){pc._remoteStreams=[]}if(pc._remoteStreams.indexOf(stream)>=0){return}pc._remoteStreams.push(stream);var event=new Event("addstream");event.stream=stream;pc.dispatchEvent(event)})})}})}},shimCallbacksAPI:function(window){if(typeof window!=="object"||!window.RTCPeerConnection){return}var prototype=window.RTCPeerConnection.prototype;var createOffer=prototype.createOffer;var createAnswer=prototype.createAnswer;var setLocalDescription=prototype.setLocalDescription;var setRemoteDescription=prototype.setRemoteDescription;var addIceCandidate=prototype.addIceCandidate;prototype.createOffer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0];var promise=createOffer.apply(this,[options]);if(!failureCallback){return promise}promise.then(successCallback,failureCallback);return Promise.resolve()};prototype.createAnswer=function(successCallback,failureCallback){var options=arguments.length>=2?arguments[2]:arguments[0];var promise=createAnswer.apply(this,[options]);if(!failureCallback){return promise}promise.then(successCallback,failureCallback);return Promise.resolve()};var withCallback=function(description,successCallback,failureCallback){var promise=setLocalDescription.apply(this,[description]);if(!failureCallback){return promise}promise.then(successCallback,failureCallback);return Promise.resolve()};prototype.setLocalDescription=withCallback;withCallback=function(description,successCallback,failureCallback){var promise=setRemoteDescription.apply(this,[description]);if(!failureCallback){return promise}promise.then(successCallback,failureCallback);return Promise.resolve()};prototype.setRemoteDescription=withCallback;withCallback=function(candidate,successCallback,failureCallback){var promise=addIceCandidate.apply(this,[candidate]);if(!failureCallback){return promise}promise.then(successCallback,failureCallback);return Promise.resolve()};prototype.addIceCandidate=withCallback},shimGetUserMedia:function(window){var navigator=window&&window.navigator;if(!navigator.getUserMedia){if(navigator.webkitGetUserMedia){navigator.getUserMedia=navigator.webkitGetUserMedia.bind(navigator)}else if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){navigator.getUserMedia=function(constraints,cb,errcb){navigator.mediaDevices.getUserMedia(constraints).then(cb,errcb)}.bind(navigator)}}},shimRTCIceServerUrls:function(window){var OrigPeerConnection=window.RTCPeerConnection;window.RTCPeerConnection=function(pcConfig,pcConstraints){if(pcConfig&&pcConfig.iceServers){var newIceServers=[];for(var i=0;i=pos&&parseInt(match[pos],10)}function wrapPeerConnectionEvent(window,eventNameToWrap,wrapper){if(!window.RTCPeerConnection){return}var proto=window.RTCPeerConnection.prototype;var nativeAddEventListener=proto.addEventListener;proto.addEventListener=function(nativeEventName,cb){if(nativeEventName!==eventNameToWrap){return nativeAddEventListener.apply(this,arguments)}var wrappedCallback=function(e){cb(wrapper(e))};this._eventMap=this._eventMap||{};this._eventMap[cb]=wrappedCallback;return nativeAddEventListener.apply(this,[nativeEventName,wrappedCallback])};var nativeRemoveEventListener=proto.removeEventListener;proto.removeEventListener=function(nativeEventName,cb){if(nativeEventName!==eventNameToWrap||!this._eventMap||!this._eventMap[cb]){return nativeRemoveEventListener.apply(this,arguments)}var unwrappedCb=this._eventMap[cb];delete this._eventMap[cb];return nativeRemoveEventListener.apply(this,[nativeEventName,unwrappedCb])};Object.defineProperty(proto,"on"+eventNameToWrap,{get:function(){return this["_on"+eventNameToWrap]},set:function(cb){if(this["_on"+eventNameToWrap]){this.removeEventListener(eventNameToWrap,this["_on"+eventNameToWrap]);delete this["_on"+eventNameToWrap]}if(cb){this.addEventListener(eventNameToWrap,this["_on"+eventNameToWrap]=cb)}}})}module.exports={extractVersion:extractVersion,wrapPeerConnectionEvent:wrapPeerConnectionEvent,disableLog:function(bool){if(typeof bool!=="boolean"){return new Error("Argument type: "+typeof bool+". Please use a boolean.")}logDisabled_=bool;return bool?"adapter.js logging disabled":"adapter.js logging enabled"},disableWarnings:function(bool){if(typeof bool!=="boolean"){return new Error("Argument type: "+typeof bool+". Please use a boolean.")}deprecationWarnings_=!bool;return"adapter.js deprecation warnings "+(bool?"disabled":"enabled")},log:function(){if(typeof window==="object"){if(logDisabled_){return}if(typeof console!=="undefined"&&typeof console.log==="function"){console.log.apply(console,arguments)}}},deprecated:function(oldMethod,newMethod){if(!deprecationWarnings_){return}console.warn(oldMethod+" is deprecated, please use "+newMethod+" instead.")},detectBrowser:function(window){var navigator=window&&window.navigator;var result={};result.browser=null;result.version=null;if(typeof window==="undefined"||!window.navigator){result.browser="Not a browser.";return result}if(navigator.mozGetUserMedia){result.browser="firefox";result.version=extractVersion(navigator.userAgent,/Firefox\/(\d+)\./,1)}else if(navigator.webkitGetUserMedia){result.browser="chrome";result.version=extractVersion(navigator.userAgent,/Chrom(e|ium)\/(\d+)\./,2)}else if(navigator.mediaDevices&&navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)){result.browser="edge";result.version=extractVersion(navigator.userAgent,/Edge\/(\d+).(\d+)$/,2)}else if(window.RTCPeerConnection&&navigator.userAgent.match(/AppleWebKit\/(\d+)\./)){result.browser="safari";result.version=extractVersion(navigator.userAgent,/AppleWebKit\/(\d+)\./,1)}else{result.browser="Not a supported browser.";return result}return result}}},{}],37:[function(require,module,exports){module.exports=WildEmitter;function WildEmitter(){}WildEmitter.mixin=function(constructor){var prototype=constructor.prototype||constructor;prototype.isWildEmitter=true;prototype.on=function(event,groupName,fn){this.callbacks=this.callbacks||{};var hasGroup=arguments.length===3,group=hasGroup?arguments[1]:undefined,func=hasGroup?arguments[2]:arguments[1];func._groupName=group;(this.callbacks[event]=this.callbacks[event]||[]).push(func);return this};prototype.once=function(event,groupName,fn){var self=this,hasGroup=arguments.length===3,group=hasGroup?arguments[1]:undefined,func=hasGroup?arguments[2]:arguments[1];function on(){self.off(event,on);func.apply(this,arguments)}this.on(event,group,on);return this};prototype.releaseGroup=function(groupName){this.callbacks=this.callbacks||{};var item,i,len,handlers;for(item in this.callbacks){handlers=this.callbacks[item];for(i=0,len=handlers.length;i=0;var isFirefox=typeof window.InstallTrigger!=="undefined";var isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);var isChrome=!!window.chrome&&!isOpera;var isIE=typeof document!=="undefined"&&!!document.documentMode&&!isEdge;function getBrowserInfo(){var nVer=navigator.appVersion;var nAgt=navigator.userAgent;var browserName=navigator.appName;var fullVersion=""+parseFloat(navigator.appVersion);var majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix;if(isOpera){browserName="Opera";try{fullVersion=navigator.userAgent.split("OPR/")[1].split(" ")[0];majorVersion=fullVersion.split(".")[0]}catch(e){fullVersion="0.0.0.0";majorVersion=0}}else if(isIE){verOffset=nAgt.indexOf("rv:");if(verOffset>0){fullVersion=nAgt.substring(verOffset+3)}else{verOffset=nAgt.indexOf("MSIE");fullVersion=nAgt.substring(verOffset+5)}browserName="IE"}else if(isChrome){verOffset=nAgt.indexOf("Chrome");browserName="Chrome";fullVersion=nAgt.substring(verOffset+7)}else if(isSafari){verOffset=nAgt.indexOf("Safari");browserName="Safari";fullVersion=nAgt.substring(verOffset+7);if((verOffset=nAgt.indexOf("Version"))!==-1){fullVersion=nAgt.substring(verOffset+8)}if(navigator.userAgent.indexOf("Version/")!==-1){fullVersion=navigator.userAgent.split("Version/")[1].split(" ")[0]}}else if(isFirefox){verOffset=nAgt.indexOf("Firefox");browserName="Firefox";fullVersion=nAgt.substring(verOffset+8)}else if((nameOffset=nAgt.lastIndexOf(" ")+1)<(verOffset=nAgt.lastIndexOf("/"))){browserName=nAgt.substring(nameOffset,verOffset);fullVersion=nAgt.substring(verOffset+1);if(browserName.toLowerCase()===browserName.toUpperCase()){browserName=navigator.appName}}if(isEdge){browserName="Edge";fullVersion=navigator.userAgent.split("Edge/")[1]}if((ix=fullVersion.search(/[; \)]/))!==-1){fullVersion=fullVersion.substring(0,ix)}majorVersion=parseInt(""+fullVersion,10);if(isNaN(majorVersion)){fullVersion=""+parseFloat(navigator.appVersion);majorVersion=parseInt(navigator.appVersion,10)}return{fullVersion:fullVersion,version:majorVersion,name:browserName,isPrivateBrowsing:false}}function retry(isDone,next){var currentTrial=0,maxRetry=50,interval=10,isTimeout=false;var id=window.setInterval(function(){if(isDone()){window.clearInterval(id);next(isTimeout)}if(currentTrial++>maxRetry){window.clearInterval(id);isTimeout=true;next(isTimeout)}},10)}function isIE10OrLater(userAgent){var ua=userAgent.toLowerCase();if(ua.indexOf("msie")===0&&ua.indexOf("trident")===0){return false}var match=/(?:msie|rv:)\s?([\d\.]+)/.exec(ua);if(match&&parseInt(match[1],10)>=10){return true}return false}function detectPrivateMode(callback){var isPrivate;try{if(window.webkitRequestFileSystem){window.webkitRequestFileSystem(window.TEMPORARY,1,function(){isPrivate=false},function(e){isPrivate=true})}else if(window.indexedDB&&/Firefox/.test(window.navigator.userAgent)){var db;try{db=window.indexedDB.open("test");db.onerror=function(){return true}}catch(e){isPrivate=true}if(typeof isPrivate==="undefined"){retry(function isDone(){return db.readyState==="done"?true:false},function next(isTimeout){if(!isTimeout){isPrivate=db.result?false:true}})}}else if(isIE10OrLater(window.navigator.userAgent)){isPrivate=false;try{if(!window.indexedDB){isPrivate=true}}catch(e){isPrivate=true}}else if(window.localStorage&&/Safari/.test(window.navigator.userAgent)){try{window.localStorage.setItem("test",1)}catch(e){isPrivate=true}if(typeof isPrivate==="undefined"){isPrivate=false;window.localStorage.removeItem("test")}}}catch(e){isPrivate=false}retry(function isDone(){return typeof isPrivate!=="undefined"?true:false},function next(isTimeout){callback(isPrivate)})}var isMobile={Android:function(){return navigator.userAgent.match(/Android/i)},BlackBerry:function(){return navigator.userAgent.match(/BlackBerry|BB10/i)},iOS:function(){return navigator.userAgent.match(/iPhone|iPad|iPod/i)},Opera:function(){return navigator.userAgent.match(/Opera Mini/i)},Windows:function(){return navigator.userAgent.match(/IEMobile/i)},any:function(){return isMobile.Android()||isMobile.BlackBerry()||isMobile.iOS()||isMobile.Opera()||isMobile.Windows()},getOsName:function(){var osName="Unknown OS";if(isMobile.Android()){osName="Android"}if(isMobile.BlackBerry()){osName="BlackBerry"}if(isMobile.iOS()){osName="iOS"}if(isMobile.Opera()){osName="Opera Mini"}if(isMobile.Windows()){osName="Windows"}return osName}};function detectDesktopOS(){var unknown="-";var nVer=navigator.appVersion;var nAgt=navigator.userAgent;var os=unknown;var clientStrings=[{s:"Windows 10",r:/(Windows 10.0|Windows NT 10.0)/},{s:"Windows 8.1",r:/(Windows 8.1|Windows NT 6.3)/},{s:"Windows 8",r:/(Windows 8|Windows NT 6.2)/},{s:"Windows 7",r:/(Windows 7|Windows NT 6.1)/},{s:"Windows Vista",r:/Windows NT 6.0/},{s:"Windows Server 2003",r:/Windows NT 5.2/},{s:"Windows XP",r:/(Windows NT 5.1|Windows XP)/},{s:"Windows 2000",r:/(Windows NT 5.0|Windows 2000)/},{s:"Windows ME",r:/(Win 9x 4.90|Windows ME)/},{s:"Windows 98",r:/(Windows 98|Win98)/},{s:"Windows 95",r:/(Windows 95|Win95|Windows_95)/},{s:"Windows NT 4.0",r:/(Windows NT 4.0|WinNT4.0|WinNT|Windows NT)/},{s:"Windows CE",r:/Windows CE/},{s:"Windows 3.11",r:/Win16/},{s:"Android",r:/Android/},{s:"Open BSD",r:/OpenBSD/},{s:"Sun OS",r:/SunOS/},{s:"Linux",r:/(Linux|X11)/},{s:"iOS",r:/(iPhone|iPad|iPod)/},{s:"Mac OS X",r:/Mac OS X/},{s:"Mac OS",r:/(MacPPC|MacIntel|Mac_PowerPC|Macintosh)/},{s:"QNX",r:/QNX/},{s:"UNIX",r:/UNIX/},{s:"BeOS",r:/BeOS/},{s:"OS/2",r:/OS\/2/},{s:"Search Bot",r:/(nuhk|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask Jeeves\/Teoma|ia_archiver)/}];for(var i=0,cs;cs=clientStrings[i];i++){if(cs.r.test(nAgt)){os=cs.s;break}}var osVersion=unknown;if(/Windows/.test(os)){if(/Windows (.*)/.test(os)){osVersion=/Windows (.*)/.exec(os)[1]}os="Windows"}switch(os){case"Mac OS X":if(/Mac OS X (10[\.\_\d]+)/.test(nAgt)){osVersion=/Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1]}break;case"Android":if(/Android ([\.\_\d]+)/.test(nAgt)){osVersion=/Android ([\.\_\d]+)/.exec(nAgt)[1]}break;case"iOS":if(/OS (\d+)_(\d+)_?(\d+)?/.test(nAgt)){osVersion=/OS (\d+)_(\d+)_?(\d+)?/.exec(nVer);osVersion=osVersion[1]+"."+osVersion[2]+"."+(osVersion[3]|0)}break}return{osName:os,osVersion:osVersion}}var osName="Unknown OS";var osVersion="Unknown OS Version";function getAndroidVersion(ua){ua=(ua||navigator.userAgent).toLowerCase();var match=ua.match(/android\s([0-9\.]*)/);return match?match[1]:false}var osInfo=detectDesktopOS();if(osInfo&&osInfo.osName&&osInfo.osName!="-"){osName=osInfo.osName;osVersion=osInfo.osVersion}else if(isMobile.any()){osName=isMobile.getOsName();if(osName=="Android"){osVersion=getAndroidVersion()}}var isNodejs=typeof process==="object"&&typeof process.versions==="object"&&process.versions.node;if(osName==="Unknown OS"&&isNodejs){osName="Nodejs";osVersion=process.versions.node.toString().replace("v","")}var isCanvasSupportsStreamCapturing=false;var isVideoSupportsStreamCapturing=false;["captureStream","mozCaptureStream","webkitCaptureStream"].forEach(function(item){if(typeof document==="undefined"||typeof document.createElement!=="function"){return}if(!isCanvasSupportsStreamCapturing&&item in document.createElement("canvas")){isCanvasSupportsStreamCapturing=true}if(!isVideoSupportsStreamCapturing&&item in document.createElement("video")){isVideoSupportsStreamCapturing=true}});function DetectLocalIPAddress(callback,stream){if(!DetectRTC.isWebRTCSupported){return}getIPs(function(ip){if(ip.match(/^(192\.168\.|169\.254\.|10\.|172\.(1[6-9]|2\d|3[01]))/)){callback("Local: "+ip)}else{callback("Public: "+ip)}},stream)}function getIPs(callback,stream){if(typeof document==="undefined"||typeof document.getElementById!=="function"){return}var ipDuplicates={};var RTCPeerConnection=window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection;if(!RTCPeerConnection){var iframe=document.getElementById("iframe");if(!iframe){return}var win=iframe.contentWindow;RTCPeerConnection=win.RTCPeerConnection||win.mozRTCPeerConnection||win.webkitRTCPeerConnection}if(!RTCPeerConnection){return}var peerConfig=null;if(DetectRTC.browser==="Chrome"&&DetectRTC.browser.version<58){peerConfig={optional:[{RtpDataChannels:true}]}}var servers={iceServers:[{urls:"stun:stun.l.google.com:19302"}]};var pc=new RTCPeerConnection(servers,peerConfig);if(stream){if(pc.addStream){pc.addStream(stream)}else if(pc.addTrack&&stream.getTracks()[0]){pc.addTrack(stream.getTracks()[0],stream)}}function handleCandidate(candidate){var ipRegex=/([0-9]{1,3}(\.[0-9]{1,3}){3})/;var match=ipRegex.exec(candidate);if(!match){return}var ipAddress=match[1];if(ipDuplicates[ipAddress]===undefined){callback(ipAddress)}ipDuplicates[ipAddress]=true}pc.onicecandidate=function(ice){if(ice.candidate){handleCandidate(ice.candidate.candidate)}};if(!stream){try{pc.createDataChannel("sctp",{})}catch(e){}}if(DetectRTC.isPromisesSupported){pc.createOffer().then(function(result){pc.setLocalDescription(result).then(afterCreateOffer)})}else{pc.createOffer(function(result){pc.setLocalDescription(result,afterCreateOffer,function(){})},function(){})}function afterCreateOffer(){var lines=pc.localDescription.sdp.split("\n");lines.forEach(function(line){if(line.indexOf("a=candidate:")===0){handleCandidate(line)}})}}var MediaDevices=[];var audioInputDevices=[];var audioOutputDevices=[];var videoInputDevices=[];if(navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices){navigator.enumerateDevices=function(callback){var enumerateDevices=navigator.mediaDevices.enumerateDevices();if(enumerateDevices&&enumerateDevices.then){navigator.mediaDevices.enumerateDevices().then(callback).catch(function(){callback([])})}else{callback([])}}}var canEnumerate=false;if(typeof MediaStreamTrack!=="undefined"&&"getSources"in MediaStreamTrack){canEnumerate=true}else if(navigator.mediaDevices&&!!navigator.mediaDevices.enumerateDevices){canEnumerate=true}var hasMicrophone=false;var hasSpeakers=false;var hasWebcam=false;var isWebsiteHasMicrophonePermissions=false;var isWebsiteHasWebcamPermissions=false;function checkDeviceSupport(callback){if(!canEnumerate){if(callback){callback()}return}if(!navigator.enumerateDevices&&window.MediaStreamTrack&&window.MediaStreamTrack.getSources){navigator.enumerateDevices=window.MediaStreamTrack.getSources.bind(window.MediaStreamTrack)}if(!navigator.enumerateDevices&&navigator.enumerateDevices){navigator.enumerateDevices=navigator.enumerateDevices.bind(navigator)}if(!navigator.enumerateDevices){if(callback){callback()}return}MediaDevices=[];audioInputDevices=[];audioOutputDevices=[];videoInputDevices=[];hasMicrophone=false;hasSpeakers=false;hasWebcam=false;isWebsiteHasMicrophonePermissions=false;isWebsiteHasWebcamPermissions=false;var alreadyUsedDevices={};navigator.enumerateDevices(function(devices){devices.forEach(function(_device){var device={};for(var d in _device){try{if(typeof _device[d]!=="function"){device[d]=_device[d]}}catch(e){}}if(alreadyUsedDevices[device.deviceId+device.label+device.kind]){return}if(device.kind==="audio"){device.kind="audioinput"}if(device.kind==="video"){device.kind="videoinput"}if(!device.deviceId){device.deviceId=device.id}if(!device.id){device.id=device.deviceId}if(!device.label){device.isCustomLabel=true;if(device.kind==="videoinput"){device.label="Camera "+(videoInputDevices.length+1)}else if(device.kind==="audioinput"){device.label="Microphone "+(audioInputDevices.length+1)}else if(device.kind==="audiooutput"){device.label="Speaker "+(audioOutputDevices.length+1)}else{device.label="Please invoke getUserMedia once."}if(typeof DetectRTC!=="undefined"&&DetectRTC.browser.isChrome&&DetectRTC.browser.version>=46&&!/^(https:|chrome-extension:)$/g.test(location.protocol||"")){if(typeof document!=="undefined"&&typeof document.domain==="string"&&document.domain.search&&document.domain.search(/localhost|127.0./g)===-1){device.label="HTTPs is required to get label of this "+device.kind+" device."}}}else{if(device.kind==="videoinput"&&!isWebsiteHasWebcamPermissions){isWebsiteHasWebcamPermissions=true}if(device.kind==="audioinput"&&!isWebsiteHasMicrophonePermissions){isWebsiteHasMicrophonePermissions=true}}if(device.kind==="audioinput"){hasMicrophone=true;if(audioInputDevices.indexOf(device)===-1){audioInputDevices.push(device)}}if(device.kind==="audiooutput"){hasSpeakers=true;if(audioOutputDevices.indexOf(device)===-1){audioOutputDevices.push(device)}}if(device.kind==="videoinput"){hasWebcam=true;if(videoInputDevices.indexOf(device)===-1){videoInputDevices.push(device)}}MediaDevices.push(device);alreadyUsedDevices[device.deviceId+device.label+device.kind]=device});if(typeof DetectRTC!=="undefined"){DetectRTC.MediaDevices=MediaDevices;DetectRTC.hasMicrophone=hasMicrophone;DetectRTC.hasSpeakers=hasSpeakers;DetectRTC.hasWebcam=hasWebcam;DetectRTC.isWebsiteHasWebcamPermissions=isWebsiteHasWebcamPermissions;DetectRTC.isWebsiteHasMicrophonePermissions=isWebsiteHasMicrophonePermissions;DetectRTC.audioInputDevices=audioInputDevices;DetectRTC.audioOutputDevices=audioOutputDevices;DetectRTC.videoInputDevices=videoInputDevices}if(callback){callback()}})}var DetectRTC=window.DetectRTC||{};DetectRTC.browser=getBrowserInfo();detectPrivateMode(function(isPrivateBrowsing){DetectRTC.browser.isPrivateBrowsing=!!isPrivateBrowsing});DetectRTC.browser["is"+DetectRTC.browser.name]=true;DetectRTC.osName=osName;DetectRTC.osVersion=osVersion;var isNodeWebkit=typeof process==="object"&&typeof process.versions==="object"&&process.versions["node-webkit"];var isWebRTCSupported=false;["RTCPeerConnection","webkitRTCPeerConnection","mozRTCPeerConnection","RTCIceGatherer"].forEach(function(item){if(isWebRTCSupported){return}if(item in window){isWebRTCSupported=true}});DetectRTC.isWebRTCSupported=isWebRTCSupported;DetectRTC.isORTCSupported=typeof RTCIceGatherer!=="undefined";var webAudio={isSupported:false,isCreateMediaStreamSourceSupported:false};["AudioContext","webkitAudioContext","mozAudioContext","msAudioContext"].forEach(function(item){if(webAudio.isSupported){return}if(item in window){webAudio.isSupported=true;if(window[item]&&"createMediaStreamSource"in window[item].prototype){webAudio.isCreateMediaStreamSourceSupported=true}}});DetectRTC.isAudioContextSupported=webAudio.isSupported;DetectRTC.isCreateMediaStreamSourceSupported=webAudio.isCreateMediaStreamSourceSupported;var isRtpDataChannelsSupported=false;if(DetectRTC.browser.isChrome&&DetectRTC.browser.version>31){isRtpDataChannelsSupported=true}DetectRTC.isRtpDataChannelsSupported=isRtpDataChannelsSupported;var isSCTPSupportd=false;if(DetectRTC.browser.isFirefox&&DetectRTC.browser.version>28){isSCTPSupportd=true}else if(DetectRTC.browser.isChrome&&DetectRTC.browser.version>25){isSCTPSupportd=true}else if(DetectRTC.browser.isOpera&&DetectRTC.browser.version>=11){isSCTPSupportd=true}DetectRTC.isSctpDataChannelsSupported=isSCTPSupportd;DetectRTC.isMobileDevice=isMobileDevice;var isGetUserMediaSupported=false;if(navigator.getUserMedia){isGetUserMediaSupported=true}else if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){isGetUserMediaSupported=true}if(DetectRTC.browser.isChrome&&DetectRTC.browser.version>=46&&!/^(https:|chrome-extension:)$/g.test(location.protocol||"")){if(typeof document!=="undefined"&&typeof document.domain==="string"&&document.domain.search&&document.domain.search(/localhost|127.0./g)===-1){isGetUserMediaSupported="Requires HTTPs"}}if(DetectRTC.osName==="Nodejs"){isGetUserMediaSupported=false}DetectRTC.isGetUserMediaSupported=isGetUserMediaSupported;var displayResolution="";if(screen.width){var width=screen.width?screen.width:"";var height=screen.height?screen.height:"";displayResolution+=""+width+" x "+height}DetectRTC.displayResolution=displayResolution;function getAspectRatio(w,h){function gcd(a,b){return b==0?a:gcd(b,a%b)}var r=gcd(w,h);return w/r/(h/r)}DetectRTC.displayAspectRatio=getAspectRatio(screen.width,screen.height).toFixed(2);DetectRTC.isCanvasSupportsStreamCapturing=isCanvasSupportsStreamCapturing;DetectRTC.isVideoSupportsStreamCapturing=isVideoSupportsStreamCapturing;if(DetectRTC.browser.name=="Chrome"&&DetectRTC.browser.version>=53){if(!DetectRTC.isCanvasSupportsStreamCapturing){DetectRTC.isCanvasSupportsStreamCapturing="Requires chrome flag: enable-experimental-web-platform-features"}if(!DetectRTC.isVideoSupportsStreamCapturing){DetectRTC.isVideoSupportsStreamCapturing="Requires chrome flag: enable-experimental-web-platform-features"}}DetectRTC.DetectLocalIPAddress=DetectLocalIPAddress;DetectRTC.isWebSocketsSupported="WebSocket"in window&&2===window.WebSocket.CLOSING;DetectRTC.isWebSocketsBlocked=!DetectRTC.isWebSocketsSupported;if(DetectRTC.osName==="Nodejs"){DetectRTC.isWebSocketsSupported=true;DetectRTC.isWebSocketsBlocked=false}DetectRTC.checkWebSocketsSupport=function(callback){callback=callback||function(){};try{var starttime;var websocket=new WebSocket("wss://echo.websocket.org:443/");websocket.onopen=function(){DetectRTC.isWebSocketsBlocked=false;starttime=(new Date).getTime();websocket.send("ping")};websocket.onmessage=function(){DetectRTC.WebsocketLatency=(new Date).getTime()-starttime+"ms";callback();websocket.close();websocket=null};websocket.onerror=function(){DetectRTC.isWebSocketsBlocked=true;callback()}}catch(e){DetectRTC.isWebSocketsBlocked=true;callback()}};DetectRTC.load=function(callback){callback=callback||function(){};checkDeviceSupport(callback)};if(typeof checkDeviceSupport==="function"){}if(typeof MediaDevices!=="undefined"){DetectRTC.MediaDevices=MediaDevices}else{DetectRTC.MediaDevices=[]}DetectRTC.hasMicrophone=hasMicrophone;DetectRTC.hasSpeakers=hasSpeakers;DetectRTC.hasWebcam=hasWebcam;DetectRTC.isWebsiteHasWebcamPermissions=isWebsiteHasWebcamPermissions;DetectRTC.isWebsiteHasMicrophonePermissions=isWebsiteHasMicrophonePermissions;DetectRTC.audioInputDevices=audioInputDevices;DetectRTC.audioOutputDevices=audioOutputDevices;DetectRTC.videoInputDevices=videoInputDevices;var isSetSinkIdSupported=false;if(typeof document!=="undefined"&&typeof document.createElement==="function"&&"setSinkId"in document.createElement("video")){isSetSinkIdSupported=true}DetectRTC.isSetSinkIdSupported=isSetSinkIdSupported;var isRTPSenderReplaceTracksSupported=false;if(DetectRTC.browser.isFirefox&&typeof mozRTCPeerConnection!=="undefined"){if("getSenders"in mozRTCPeerConnection.prototype){isRTPSenderReplaceTracksSupported=true}}else if(DetectRTC.browser.isChrome&&typeof webkitRTCPeerConnection!=="undefined"){if("getSenders"in webkitRTCPeerConnection.prototype){isRTPSenderReplaceTracksSupported=true}}DetectRTC.isRTPSenderReplaceTracksSupported=isRTPSenderReplaceTracksSupported;var isRemoteStreamProcessingSupported=false;if(DetectRTC.browser.isFirefox&&DetectRTC.browser.version>38){isRemoteStreamProcessingSupported=true}DetectRTC.isRemoteStreamProcessingSupported=isRemoteStreamProcessingSupported;var isApplyConstraintsSupported=false;if(typeof MediaStreamTrack!=="undefined"&&"applyConstraints"in MediaStreamTrack.prototype){isApplyConstraintsSupported=true}DetectRTC.isApplyConstraintsSupported=isApplyConstraintsSupported;var isMultiMonitorScreenCapturingSupported=false;if(DetectRTC.browser.isFirefox&&DetectRTC.browser.version>=43){isMultiMonitorScreenCapturingSupported=true}DetectRTC.isMultiMonitorScreenCapturingSupported=isMultiMonitorScreenCapturingSupported;DetectRTC.isPromisesSupported=!!("Promise"in window);if(typeof DetectRTC==="undefined"){window.DetectRTC={}}var MediaStream=window.MediaStream;if(typeof MediaStream==="undefined"&&typeof webkitMediaStream!=="undefined"){MediaStream=webkitMediaStream}if(typeof MediaStream!=="undefined"){DetectRTC.MediaStream=Object.keys(MediaStream.prototype)}else DetectRTC.MediaStream=false;if(typeof MediaStreamTrack!=="undefined"){DetectRTC.MediaStreamTrack=Object.keys(MediaStreamTrack.prototype)}else DetectRTC.MediaStreamTrack=false;var RTCPeerConnection=window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection;if(typeof RTCPeerConnection!=="undefined"){DetectRTC.RTCPeerConnection=Object.keys(RTCPeerConnection.prototype)}else DetectRTC.RTCPeerConnection=false;window.DetectRTC=DetectRTC;if(typeof module!=="undefined"){module.exports=DetectRTC}if(typeof define==="function"&&define.amd){define("DetectRTC",[],function(){return DetectRTC})}})()}).call(this,require("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{_process:9}],40:[function(require,module,exports){function Mapper(){var sources={};this.forEach=function(callback){for(var key in sources){var source=sources[key];for(var key2 in source)callback(source[key2])}};this.get=function(id,source){var ids=sources[source];if(ids==undefined)return undefined;return ids[id]};this.remove=function(id,source){var ids=sources[source];if(ids==undefined)return;delete ids[id];for(var i in ids){return false}delete sources[source]};this.set=function(value,id,source){if(value==undefined)return this.remove(id,source);var ids=sources[source];if(ids==undefined)sources[source]=ids={};ids[id]=value}}Mapper.prototype.pop=function(id,source){var value=this.get(id,source);if(value==undefined)return undefined;this.remove(id,source);return value};module.exports=Mapper},{}],41:[function(require,module,exports){var JsonRpcClient=require("./jsonrpcclient");exports.JsonRpcClient=JsonRpcClient},{"./jsonrpcclient":42}],42:[function(require,module,exports){var RpcBuilder=require("../");var WebSocketWithReconnection=require("./transports/webSocketWithReconnection");Date.now=Date.now||function(){return+new Date};var PING_INTERVAL=5e3;var RECONNECTING="RECONNECTING";var CONNECTED="CONNECTED";var DISCONNECTED="DISCONNECTED";var Logger=console;function JsonRpcClient(configuration){var self=this;var wsConfig=configuration.ws;var notReconnectIfNumLessThan=-1;var pingNextNum=0;var enabledPings=true;var pingPongStarted=false;var pingInterval;var status=DISCONNECTED;var onreconnecting=wsConfig.onreconnecting;var onreconnected=wsConfig.onreconnected;var onconnected=wsConfig.onconnected;var onerror=wsConfig.onerror;configuration.rpc.pull=function(params,request){request.reply(null,"push")};wsConfig.onreconnecting=function(){Logger.debug("--------- ONRECONNECTING -----------");if(status===RECONNECTING){Logger.error("Websocket already in RECONNECTING state when receiving a new ONRECONNECTING message. Ignoring it");return}status=RECONNECTING;if(onreconnecting){onreconnecting()}};wsConfig.onreconnected=function(){Logger.debug("--------- ONRECONNECTED -----------");if(status===CONNECTED){Logger.error("Websocket already in CONNECTED state when receiving a new ONRECONNECTED message. Ignoring it");return}status=CONNECTED;enabledPings=true;updateNotReconnectIfLessThan();usePing();if(onreconnected){onreconnected()}};wsConfig.onconnected=function(){Logger.debug("--------- ONCONNECTED -----------");if(status===CONNECTED){Logger.error("Websocket already in CONNECTED state when receiving a new ONCONNECTED message. Ignoring it");return}status=CONNECTED;enabledPings=true;usePing();if(onconnected){onconnected()}};wsConfig.onerror=function(error){Logger.debug("--------- ONERROR -----------");status=DISCONNECTED;if(onerror){onerror(error)}};var ws=new WebSocketWithReconnection(wsConfig);Logger.debug("Connecting websocket to URI: "+wsConfig.uri);var rpcBuilderOptions={request_timeout:configuration.rpc.requestTimeout,ping_request_timeout:configuration.rpc.heartbeatRequestTimeout};var rpc=new RpcBuilder(RpcBuilder.packers.JsonRPC,rpcBuilderOptions,ws,function(request){Logger.debug("Received request: "+JSON.stringify(request));try{var func=configuration.rpc[request.method];if(func===undefined){Logger.error("Method "+request.method+" not registered in client")}else{func(request.params,request)}}catch(err){Logger.error("Exception processing request: "+JSON.stringify(request));Logger.error(err)}});this.send=function(method,params,callback){if(method!=="ping"){Logger.debug("Request: method:"+method+" params:"+JSON.stringify(params))}var requestTime=Date.now();rpc.encode(method,params,function(error,result){if(error){try{Logger.error("ERROR:"+error.message+" in Request: method:"+method+" params:"+JSON.stringify(params)+" request:"+error.request);if(error.data){Logger.error("ERROR DATA:"+JSON.stringify(error.data))}}catch(e){}error.requestTime=requestTime}if(callback){if(result!=undefined&&result.value!=="pong"){Logger.debug("Response: "+JSON.stringify(result))}callback(error,result)}})};function updateNotReconnectIfLessThan(){Logger.debug("notReconnectIfNumLessThan = "+pingNextNum+" (old="+notReconnectIfNumLessThan+")");notReconnectIfNumLessThan=pingNextNum}function sendPing(){if(enabledPings){var params=null;if(pingNextNum==0||pingNextNum==notReconnectIfNumLessThan){params={interval:configuration.heartbeat||PING_INTERVAL}}pingNextNum++;self.send("ping",params,function(pingNum){return function(error,result){if(error){Logger.debug("Error in ping request #"+pingNum+" ("+error.message+")");if(pingNum>notReconnectIfNumLessThan){enabledPings=false;updateNotReconnectIfLessThan();Logger.debug("Server did not respond to ping message #"+pingNum+". Reconnecting... ");ws.reconnectWs()}}}}(pingNextNum))}else{Logger.debug("Trying to send ping, but ping is not enabled")}}function usePing(){if(!pingPongStarted){Logger.debug("Starting ping (if configured)");pingPongStarted=true;if(configuration.heartbeat!=undefined){pingInterval=setInterval(sendPing,configuration.heartbeat);sendPing()}}}this.close=function(){Logger.debug("Closing jsonRpcClient explicitly by client");if(pingInterval!=undefined){Logger.debug("Clearing ping interval");clearInterval(pingInterval)}pingPongStarted=false;enabledPings=false;if(configuration.sendCloseMessage){Logger.debug("Sending close message");this.send("closeSession",null,function(error,result){if(error){Logger.error("Error sending close message: "+JSON.stringify(error))}ws.close()})}else{ws.close()}};this.forceClose=function(millis){ws.forceClose(millis)};this.reconnect=function(){ws.reconnectWs()}}module.exports=JsonRpcClient},{"../":45,"./transports/webSocketWithReconnection":44}],43:[function(require,module,exports){var WebSocketWithReconnection=require("./webSocketWithReconnection");exports.WebSocketWithReconnection=WebSocketWithReconnection},{"./webSocketWithReconnection":44}],44:[function(require,module,exports){(function(global){"use strict";var BrowserWebSocket=global.WebSocket||global.MozWebSocket;var Logger=console;var MAX_RETRIES=2e3;var RETRY_TIME_MS=3e3;var CONNECTING=0;var OPEN=1;var CLOSING=2;var CLOSED=3;function WebSocketWithReconnection(config){var closing=false;var registerMessageHandler;var wsUri=config.uri;var useSockJS=config.useSockJS;var reconnecting=false;var forcingDisconnection=false;var ws;if(useSockJS){ws=new SockJS(wsUri)}else{ws=new WebSocket(wsUri)}ws.onopen=function(){logConnected(ws,wsUri);if(config.onconnected){config.onconnected()}};ws.onerror=function(error){Logger.error("Could not connect to "+wsUri+" (invoking onerror if defined)",error);if(config.onerror){config.onerror(error)}};function logConnected(ws,wsUri){try{Logger.debug("WebSocket connected to "+wsUri)}catch(e){Logger.error(e)}}var reconnectionOnClose=function(){if(ws.readyState===CLOSED){if(closing){Logger.debug("Connection closed by user")}else{Logger.debug("Connection closed unexpectecly. Reconnecting...");reconnectToSameUri(MAX_RETRIES,1)}}else{Logger.debug("Close callback from previous websocket. Ignoring it")}};ws.onclose=reconnectionOnClose;function reconnectToSameUri(maxRetries,numRetries){Logger.debug("reconnectToSameUri (attempt #"+numRetries+", max="+maxRetries+")");if(numRetries===1){if(reconnecting){Logger.warn("Trying to reconnectToNewUri when reconnecting... Ignoring this reconnection.");return}else{reconnecting=true}if(config.onreconnecting){config.onreconnecting()}}if(forcingDisconnection){reconnectToNewUri(maxRetries,numRetries,wsUri)}else{if(config.newWsUriOnReconnection){config.newWsUriOnReconnection(function(error,newWsUri){if(error){Logger.debug(error);setTimeout(function(){reconnectToSameUri(maxRetries,numRetries+1)},RETRY_TIME_MS)}else{reconnectToNewUri(maxRetries,numRetries,newWsUri)}})}else{reconnectToNewUri(maxRetries,numRetries,wsUri)}}}function reconnectToNewUri(maxRetries,numRetries,reconnectWsUri){Logger.debug("Reconnection attempt #"+numRetries);ws.close();wsUri=reconnectWsUri||wsUri;var newWs;if(useSockJS){newWs=new SockJS(wsUri)}else{newWs=new WebSocket(wsUri)}newWs.onopen=function(){Logger.debug("Reconnected after "+numRetries+" attempts...");logConnected(newWs,wsUri);reconnecting=false;registerMessageHandler();if(config.onreconnected()){config.onreconnected()}newWs.onclose=reconnectionOnClose};var onErrorOrClose=function(error){Logger.warn("Reconnection error: ",error);if(numRetries===maxRetries){if(config.ondisconnect){config.ondisconnect()}}else{setTimeout(function(){reconnectToSameUri(maxRetries,numRetries+1)},RETRY_TIME_MS)}};newWs.onerror=onErrorOrClose;ws=newWs}this.close=function(){closing=true;ws.close()};this.forceClose=function(millis){Logger.debug("Testing: Force WebSocket close");if(millis){Logger.debug("Testing: Change wsUri for "+millis+" millis to simulate net failure");var goodWsUri=wsUri;wsUri="wss://21.234.12.34.4:443/";forcingDisconnection=true;setTimeout(function(){Logger.debug("Testing: Recover good wsUri "+goodWsUri);wsUri=goodWsUri;forcingDisconnection=false},millis)}ws.close()};this.reconnectWs=function(){Logger.debug("reconnectWs");reconnectToSameUri(MAX_RETRIES,1,wsUri)};this.send=function(message){ws.send(message)};this.addEventListener=function(type,callback){registerMessageHandler=function(){ws.addEventListener(type,callback)};registerMessageHandler()}}module.exports=WebSocketWithReconnection}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],45:[function(require,module,exports){var defineProperty_IE8=false;if(Object.defineProperty){try{Object.defineProperty({},"x",{})}catch(e){defineProperty_IE8=true}}if(!Function.prototype.bind){Function.prototype.bind=function(oThis){if(typeof this!=="function"){throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")}var aArgs=Array.prototype.slice.call(arguments,1),fToBind=this,fNOP=function(){},fBound=function(){return fToBind.apply(this instanceof fNOP&&oThis?this:oThis,aArgs.concat(Array.prototype.slice.call(arguments)))};fNOP.prototype=this.prototype;fBound.prototype=new fNOP;return fBound}}var EventEmitter=require("events").EventEmitter;var inherits=require("inherits");var packers=require("./packers");var Mapper=require("./Mapper");var BASE_TIMEOUT=5e3;function unifyResponseMethods(responseMethods){if(!responseMethods)return{};for(var key in responseMethods){var value=responseMethods[key];if(typeof value=="string")responseMethods[key]={response:value}}return responseMethods}function unifyTransport(transport){if(!transport)return;if(transport instanceof Function)return{send:transport};if(transport.send instanceof Function)return transport;if(transport.postMessage instanceof Function){transport.send=transport.postMessage;return transport}if(transport.write instanceof Function){transport.send=transport.write;return transport}if(transport.onmessage!==undefined)return;if(transport.pause instanceof Function)return;throw new SyntaxError("Transport is not a function nor a valid object")}function RpcNotification(method,params){if(defineProperty_IE8){this.method=method;this.params=params}else{Object.defineProperty(this,"method",{value:method,enumerable:true});Object.defineProperty(this,"params",{value:params,enumerable:true})}}function RpcBuilder(packer,options,transport,onRequest){var self=this;if(!packer)throw new SyntaxError("Packer is not defined");if(!packer.pack||!packer.unpack)throw new SyntaxError("Packer is invalid");var responseMethods=unifyResponseMethods(packer.responseMethods);if(options instanceof Function){if(transport!=undefined)throw new SyntaxError("There can't be parameters after onRequest");onRequest=options;transport=undefined;options=undefined}if(options&&options.send instanceof Function){if(transport&&!(transport instanceof Function))throw new SyntaxError("Only a function can be after transport");onRequest=transport;transport=options;options=undefined}if(transport instanceof Function){if(onRequest!=undefined)throw new SyntaxError("There can't be parameters after onRequest");onRequest=transport;transport=undefined}if(transport&&transport.send instanceof Function)if(onRequest&&!(onRequest instanceof Function))throw new SyntaxError("Only a function can be after transport");options=options||{};EventEmitter.call(this);if(onRequest)this.on("request",onRequest);if(defineProperty_IE8)this.peerID=options.peerID;else Object.defineProperty(this,"peerID",{value:options.peerID});var max_retries=options.max_retries||0;function transportMessage(event){self.decode(event.data||event)}this.getTransport=function(){return transport};this.setTransport=function(value){if(transport){if(transport.removeEventListener)transport.removeEventListener("message",transportMessage);else if(transport.removeListener)transport.removeListener("data",transportMessage)}if(value){if(value.addEventListener)value.addEventListener("message",transportMessage);else if(value.addListener)value.addListener("data",transportMessage)}transport=unifyTransport(value)};if(!defineProperty_IE8)Object.defineProperty(this,"transport",{get:this.getTransport.bind(this),set:this.setTransport.bind(this)});this.setTransport(transport);var request_timeout=options.request_timeout||BASE_TIMEOUT;var ping_request_timeout=options.ping_request_timeout||request_timeout;var response_timeout=options.response_timeout||BASE_TIMEOUT;var duplicates_timeout=options.duplicates_timeout||BASE_TIMEOUT;var requestID=0;var requests=new Mapper;var responses=new Mapper;var processedResponses=new Mapper;var message2Key={};function storeResponse(message,id,dest){var response={message:message,timeout:setTimeout(function(){responses.remove(id,dest)},response_timeout)};responses.set(response,id,dest)}function storeProcessedResponse(ack,from){var timeout=setTimeout(function(){processedResponses.remove(ack,from)},duplicates_timeout);processedResponses.set(timeout,ack,from)}function RpcRequest(method,params,id,from,transport){RpcNotification.call(this,method,params);this.getTransport=function(){return transport};this.setTransport=function(value){transport=unifyTransport(value)};if(!defineProperty_IE8)Object.defineProperty(this,"transport",{get:this.getTransport.bind(this),set:this.setTransport.bind(this)});var response=responses.get(id,from);if(!(transport||self.getTransport())){if(defineProperty_IE8)this.duplicated=Boolean(response);else Object.defineProperty(this,"duplicated",{value:Boolean(response)})}var responseMethod=responseMethods[method];this.pack=packer.pack.bind(packer,this,id);this.reply=function(error,result,transport){if(error instanceof Function||error&&error.send instanceof Function){if(result!=undefined)throw new SyntaxError("There can't be parameters after callback");transport=error;result=null;error=undefined}else if(result instanceof Function||result&&result.send instanceof Function){if(transport!=undefined)throw new SyntaxError("There can't be parameters after callback");transport=result;result=null}transport=unifyTransport(transport);if(response)clearTimeout(response.timeout);if(from!=undefined){if(error)error.dest=from;if(result)result.dest=from}var message;if(error||result!=undefined){if(self.peerID!=undefined){if(error)error.from=self.peerID;else result.from=self.peerID}if(responseMethod){if(responseMethod.error==undefined&&error)message={error:error};else{var method=error?responseMethod.error:responseMethod.response;message={method:method,params:error||result}}}else message={error:error,result:result};message=packer.pack(message,id)}else if(response)message=response.message;else message=packer.pack({result:null},id);storeResponse(message,id,from);transport=transport||this.getTransport()||self.getTransport();if(transport)return transport.send(message);return message}}inherits(RpcRequest,RpcNotification);function cancel(message){var key=message2Key[message];if(!key)return;delete message2Key[message];var request=requests.pop(key.id,key.dest);if(!request)return;clearTimeout(request.timeout);storeProcessedResponse(key.id,key.dest)}this.cancel=function(message){if(message)return cancel(message);for(var message in message2Key)cancel(message)};this.close=function(){var transport=this.getTransport();if(transport&&transport.close)transport.close();this.cancel();processedResponses.forEach(clearTimeout);responses.forEach(function(response){clearTimeout(response.timeout)})};this.encode=function(method,params,dest,transport,callback){if(params instanceof Function){if(dest!=undefined)throw new SyntaxError("There can't be parameters after callback");callback=params;transport=undefined;dest=undefined;params=undefined}else if(dest instanceof Function){if(transport!=undefined)throw new SyntaxError("There can't be parameters after callback");callback=dest;transport=undefined;dest=undefined}else if(transport instanceof Function){if(callback!=undefined)throw new SyntaxError("There can't be parameters after callback");callback=transport;transport=undefined}if(self.peerID!=undefined){params=params||{};params.from=self.peerID}if(dest!=undefined){params=params||{};params.dest=dest}var message={method:method,params:params};if(callback){var id=requestID++;var retried=0;message=packer.pack(message,id);function dispatchCallback(error,result){self.cancel(message);callback(error,result)}var request={message:message,callback:dispatchCallback,responseMethods:responseMethods[method]||{}};var encode_transport=unifyTransport(transport);function sendRequest(transport){var rt=method==="ping"?ping_request_timeout:request_timeout;request.timeout=setTimeout(timeout,rt*Math.pow(2,retried++));message2Key[message]={id:id,dest:dest};requests.set(request,id,dest);transport=transport||encode_transport||self.getTransport();if(transport)return transport.send(message);return message}function retry(transport){transport=unifyTransport(transport);console.warn(retried+" retry for request message:",message);var timeout=processedResponses.pop(id,dest);clearTimeout(timeout);return sendRequest(transport)}function timeout(){if(retried0){return sdp.slice(0,n)}else{return sdp}}function getSimulcastInfo(videoStream){var videoTracks=videoStream.getVideoTracks();if(!videoTracks.length){logger.warn("No video tracks available in the video stream");return""}var lines=["a=x-google-flag:conference","a=ssrc-group:SIM 1 2 3","a=ssrc:1 cname:localVideo","a=ssrc:1 msid:"+videoStream.id+" "+videoTracks[0].id,"a=ssrc:1 mslabel:"+videoStream.id,"a=ssrc:1 label:"+videoTracks[0].id,"a=ssrc:2 cname:localVideo","a=ssrc:2 msid:"+videoStream.id+" "+videoTracks[0].id,"a=ssrc:2 mslabel:"+videoStream.id,"a=ssrc:2 label:"+videoTracks[0].id,"a=ssrc:3 cname:localVideo","a=ssrc:3 msid:"+videoStream.id+" "+videoTracks[0].id,"a=ssrc:3 mslabel:"+videoStream.id,"a=ssrc:3 label:"+videoTracks[0].id];lines.push("");return lines.join("\n")}function WebRtcPeer(mode,options,callback){if(!(this instanceof WebRtcPeer)){return new WebRtcPeer(mode,options,callback)}WebRtcPeer.super_.call(this);if(options instanceof Function){callback=options;options=undefined}options=options||{};callback=(callback||noop).bind(this);var self=this;var localVideo=options.localVideo;var remoteVideo=options.remoteVideo;var videoStream=options.videoStream;var audioStream=options.audioStream;var mediaConstraints=options.mediaConstraints;var connectionConstraints=options.connectionConstraints;var pc=options.peerConnection;var sendSource=options.sendSource||"webcam";var dataChannelConfig=options.dataChannelConfig;var useDataChannels=options.dataChannels||false;var dataChannel;var guid=uuid.v4();var configuration=recursive({iceServers:freeice()},options.configuration);var onicecandidate=options.onicecandidate;if(onicecandidate)this.on("icecandidate",onicecandidate);var oncandidategatheringdone=options.oncandidategatheringdone;if(oncandidategatheringdone){this.on("candidategatheringdone",oncandidategatheringdone)}var simulcast=options.simulcast;var multistream=options.multistream;var interop=new sdpTranslator.Interop;var candidatesQueueOut=[];var candidategatheringdone=false;Object.defineProperties(this,{peerConnection:{get:function(){return pc}},id:{value:options.id||guid,writable:false},remoteVideo:{get:function(){return remoteVideo}},localVideo:{get:function(){return localVideo}},dataChannel:{get:function(){return dataChannel}},currentFrame:{get:function(){if(!remoteVideo)return;if(remoteVideo.readyStateUnifiedPlan",dumpSDP(localDescription))}callback(null,localDescription.sdp,self.processAnswer.bind(self))}).catch(callback)};this.getLocalSessionDescriptor=function(){return pc.localDescription};this.getRemoteSessionDescriptor=function(){return pc.remoteDescription};function setRemoteVideo(){if(remoteVideo){remoteVideo.pause();var stream=pc.getRemoteStreams()[0];remoteVideo.srcObject=stream;logger.debug("Remote stream:",stream);remoteVideo.load()}}this.showLocalVideo=function(){localVideo.srcObject=videoStream;localVideo.muted=true};this.send=function(data){if(dataChannel&&dataChannel.readyState==="open"){dataChannel.send(data)}else{logger.warn("Trying to send data over a non-existing or closed data channel")}};this.processAnswer=function(sdpAnswer,callback){callback=(callback||noop).bind(this);var answer=new RTCSessionDescription({type:"answer",sdp:sdpAnswer});if(multistream&&usePlanB){var planBAnswer=interop.toPlanB(answer);logger.debug("asnwer::planB",dumpSDP(planBAnswer));answer=planBAnswer}logger.debug("SDP answer received, setting remote description");if(pc.signalingState==="closed"){return callback("PeerConnection is closed")}pc.setRemoteDescription(answer,function(){setRemoteVideo();callback()},callback)};this.processOffer=function(sdpOffer,callback){callback=callback.bind(this);var offer=new RTCSessionDescription({type:"offer",sdp:sdpOffer});if(multistream&&usePlanB){var planBOffer=interop.toPlanB(offer);logger.debug("offer::planB",dumpSDP(planBOffer));offer=planBOffer}logger.debug("SDP offer received, setting remote description");if(pc.signalingState==="closed"){return callback("PeerConnection is closed")}pc.setRemoteDescription(offer).then(function(){return setRemoteVideo()}).then(function(){return pc.createAnswer()}).then(function(answer){answer=mangleSdpToAddSimulcast(answer);logger.debug("Created SDP answer");return pc.setLocalDescription(answer)}).then(function(){var localDescription=pc.localDescription;if(multistream&&usePlanB){localDescription=interop.toUnifiedPlan(localDescription);logger.debug("answer::origPlanB->UnifiedPlan",dumpSDP(localDescription))}logger.debug("Local description set",localDescription.sdp);callback(null,localDescription.sdp)}).catch(callback)};function mangleSdpToAddSimulcast(answer){if(simulcast){if(browser.name==="Chrome"||browser.name==="Chromium"){logger.debug("Adding multicast info");answer=new RTCSessionDescription({type:answer.type,sdp:removeFIDFromOffer(answer.sdp)+getSimulcastInfo(videoStream)})}else{logger.warn("Simulcast is only available in Chrome browser.")}}return answer}function start(){if(pc.signalingState==="closed"){callback('The peer connection object is in "closed" state. This is most likely due to an invocation of the dispose method before accepting in the dialogue')}if(videoStream&&localVideo){self.showLocalVideo()}if(videoStream){pc.addStream(videoStream)}if(audioStream){pc.addStream(audioStream)}var browser=parser.getBrowser();if(mode==="sendonly"&&(browser.name==="Chrome"||browser.name==="Chromium")&&browser.major===39){mode="sendrecv"}callback()}if(mode!=="recvonly"&&!videoStream&&!audioStream){function getMedia(constraints){if(constraints===undefined){constraints=MEDIA_CONSTRAINTS}navigator.mediaDevices.getUserMedia(constraints).then(function(stream){videoStream=stream;start()}).catch(callback)}if(sendSource==="webcam"){getMedia(mediaConstraints)}else{getScreenConstraints(sendSource,function(error,constraints_){if(error)return callback(error);constraints=[mediaConstraints];constraints.unshift(constraints_);getMedia(recursive.apply(undefined,constraints))},guid)}}else{setTimeout(start,0)}this.on("_dispose",function(){if(localVideo){localVideo.pause();localVideo.srcObject=null;localVideo.load();localVideo.muted=false}if(remoteVideo){remoteVideo.pause();remoteVideo.srcObject=null;remoteVideo.load()}self.removeAllListeners();if(window.cancelChooseDesktopMedia!==undefined){window.cancelChooseDesktopMedia(guid)}})}inherits(WebRtcPeer,EventEmitter);function createEnableDescriptor(type){var method="get"+type+"Tracks";return{enumerable:true,get:function(){if(!this.peerConnection)return;var streams=this.peerConnection.getLocalStreams();if(!streams.length)return;for(var i=0,stream;stream=streams[i];i++){var tracks=stream[method]();for(var j=0,track;track=tracks[j];j++)if(!track.enabled)return false}return true},set:function(value){function trackSetEnable(track){track.enabled=value}this.peerConnection.getLocalStreams().forEach(function(stream){stream[method]().forEach(trackSetEnable)})}}}Object.defineProperties(WebRtcPeer.prototype,{enabled:{enumerable:true,get:function(){return this.audioEnabled&&this.videoEnabled},set:function(value){this.audioEnabled=this.videoEnabled=value}},audioEnabled:createEnableDescriptor("Audio"),videoEnabled:createEnableDescriptor("Video")});WebRtcPeer.prototype.getLocalStream=function(index){if(this.peerConnection){return this.peerConnection.getLocalStreams()[index||0]}};WebRtcPeer.prototype.getRemoteStream=function(index){if(this.peerConnection){return this.peerConnection.getRemoteStreams()[index||0]}};WebRtcPeer.prototype.dispose=function(){logger.debug("Disposing WebRtcPeer");var pc=this.peerConnection;var dc=this.dataChannel;try{if(dc){if(dc.signalingState==="closed")return;dc.close()}if(pc){if(pc.signalingState==="closed")return;pc.getLocalStreams().forEach(streamStop);pc.close()}}catch(err){logger.warn("Exception disposing webrtc peer "+err)}this.emit("_dispose")};function WebRtcPeerRecvonly(options,callback){if(!(this instanceof WebRtcPeerRecvonly)){return new WebRtcPeerRecvonly(options,callback)}WebRtcPeerRecvonly.super_.call(this,"recvonly",options,callback)}inherits(WebRtcPeerRecvonly,WebRtcPeer);function WebRtcPeerSendonly(options,callback){if(!(this instanceof WebRtcPeerSendonly)){return new WebRtcPeerSendonly(options,callback)}WebRtcPeerSendonly.super_.call(this,"sendonly",options,callback)}inherits(WebRtcPeerSendonly,WebRtcPeer);function WebRtcPeerSendrecv(options,callback){if(!(this instanceof WebRtcPeerSendrecv)){return new WebRtcPeerSendrecv(options,callback)}WebRtcPeerSendrecv.super_.call(this,"sendrecv",options,callback)}inherits(WebRtcPeerSendrecv,WebRtcPeer);function harkUtils(stream,options){return hark(stream,options)}exports.bufferizeCandidates=bufferizeCandidates;exports.WebRtcPeerRecvonly=WebRtcPeerRecvonly;exports.WebRtcPeerSendonly=WebRtcPeerSendonly;exports.WebRtcPeerSendrecv=WebRtcPeerSendrecv;exports.hark=harkUtils},{events:1,freeice:2,hark:5,inherits:6,merge:7,"sdp-translator":16,"ua-parser-js":20,uuid:21}],50:[function(require,module,exports){var WebRtcPeer=require("./WebRtcPeer");exports.WebRtcPeer=WebRtcPeer},{"./WebRtcPeer":49}],51:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var OpenVidu_1=require("./OpenVidu");if(window){window["OpenVidu"]=OpenVidu_1.OpenVidu}},{"./OpenVidu":52}],52:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var OpenViduInternal_1=require("../OpenViduInternal/OpenViduInternal");var Session_1=require("./Session");var Publisher_1=require("./Publisher");var OpenViduError_1=require("../OpenViduInternal/OpenViduError");var LocalRecorder_1=require("../OpenViduInternal/LocalRecorder");var adapter=require("webrtc-adapter");var screenSharingAuto=require("../ScreenSharing/Screen-Capturing-Auto.js");var DetectRTC=require("../KurentoUtils/DetectRTC");if(window){window["adapter"]=adapter}var OpenVidu=function(){function OpenVidu(){this.openVidu=new OpenViduInternal_1.OpenViduInternal;console.info("'OpenVidu' initialized")}OpenVidu.prototype.initSession=function(param1,param2){if(typeof param2=="string"){return new Session_1.Session(this.openVidu.initSession(param2),this)}else{return new Session_1.Session(this.openVidu.initSession(param1),this)}};OpenVidu.prototype.initPublisher=function(parentId,cameraOptions,callback){var publisher;if(cameraOptions!=null){cameraOptions.audio=cameraOptions.audio!=null?cameraOptions.audio:true;cameraOptions.video=cameraOptions.video!=null?cameraOptions.video:true;if(!cameraOptions.screen){var cameraOptionsAux={sendAudio:cameraOptions.audio!=null?cameraOptions.audio:true,sendVideo:cameraOptions.video!=null?cameraOptions.video:true,activeAudio:cameraOptions.audioActive!=null?cameraOptions.audioActive:true,activeVideo:cameraOptions.videoActive!=null?cameraOptions.videoActive:true,dataChannel:true,mediaConstraints:this.openVidu.generateMediaConstraints(cameraOptions)};cameraOptions=cameraOptionsAux;publisher=new Publisher_1.Publisher(this.openVidu.initPublisherTagged(parentId,cameraOptions,true,callback),parentId,false);console.info("'Publisher' initialized");return publisher}else{publisher=new Publisher_1.Publisher(this.openVidu.initPublisherScreen(parentId,true,callback),parentId,true);if(DetectRTC.browser.name==="Firefox"&&DetectRTC.browser.version>=52){screenSharingAuto.getScreenId(function(error,sourceId,screenConstraints){cameraOptions={sendAudio:cameraOptions.audio,sendVideo:cameraOptions.video,activeAudio:cameraOptions.audioActive!=null?cameraOptions.audioActive:true,activeVideo:cameraOptions.videoActive!=null?cameraOptions.videoActive:true,dataChannel:true,mediaConstraints:{video:screenConstraints.video,audio:false}};publisher.stream.configureScreenOptions(cameraOptions);console.info("'Publisher' initialized");publisher.stream.ee.emitEvent("can-request-screen")});return publisher}else if(DetectRTC.browser.name==="Chrome"){screenSharingAuto.getScreenId(function(error,sourceId,screenConstraints){if(error==="not-installed"){var error_1=new OpenViduError_1.OpenViduError("SCREEN_EXTENSION_NOT_INSTALLED","https://chrome.google.com/webstore/detail/screen-capturing/ajhifddimkapgcifgcodmmfdlknahffk");console.error(error_1);if(callback)callback(error_1);return}else if(error==="permission-denied"){var error_2=new OpenViduError_1.OpenViduError("SCREEN_CAPTURE_DENIED","You must allow access to one window of your desktop");console.error(error_2);if(callback)callback(error_2);return}cameraOptions={sendAudio:cameraOptions.audio!=null?cameraOptions.audio:true,sendVideo:cameraOptions.video!=null?cameraOptions.video:true,activeAudio:cameraOptions.audioActive!=null?cameraOptions.audioActive:true,activeVideo:cameraOptions.videoActive!=null?cameraOptions.videoActive:true,dataChannel:true,mediaConstraints:{video:screenConstraints.video,audio:false}};publisher.stream.configureScreenOptions(cameraOptions);publisher.stream.ee.emitEvent("can-request-screen")},function(error){console.error("getScreenId error",error);return});console.info("'Publisher' initialized");return publisher}else{console.error("Screen sharing not supported on "+DetectRTC.browser.name);if(!!callback)callback(new OpenViduError_1.OpenViduError("SCREEN_SHARING_NOT_SUPPORTED","Screen sharing not supported on "+DetectRTC.browser.name+" "+DetectRTC.browser.version))}}}else{cameraOptions={sendAudio:true,sendVideo:true,activeAudio:true,activeVideo:true,dataChannel:true,mediaConstraints:{audio:true,video:{width:{ideal:1280}}}};publisher=new Publisher_1.Publisher(this.openVidu.initPublisherTagged(parentId,cameraOptions,true,callback),parentId,false);console.info("'Publisher' initialized");return publisher}};OpenVidu.prototype.reinitPublisher=function(publisher){if(publisher.stream.typeOfVideo!=="SCREEN"){publisher=new Publisher_1.Publisher(this.openVidu.initPublisherTagged(publisher.stream.getParentId(),publisher.stream.outboundOptions,false),publisher.stream.getParentId(),false);console.info("'Publisher' initialized");return publisher}else{publisher=new Publisher_1.Publisher(this.openVidu.initPublisherScreen(publisher.stream.getParentId(),false),publisher.stream.getParentId(),true);if(DetectRTC.browser.name==="Firefox"&&DetectRTC.browser.version>=52){screenSharingAuto.getScreenId(function(error,sourceId,screenConstraints){publisher.stream.outboundOptions.mediaConstraints.video=screenConstraints.video;publisher.stream.configureScreenOptions(publisher.stream.outboundOptions);console.info("'Publisher' initialized");publisher.stream.ee.emitEvent("can-request-screen")});return publisher}else if(DetectRTC.browser.name==="Chrome"){screenSharingAuto.getScreenId(function(error,sourceId,screenConstraints){if(error==="not-installed"){var error_3=new OpenViduError_1.OpenViduError("SCREEN_EXTENSION_NOT_INSTALLED","https://chrome.google.com/webstore/detail/screen-capturing/ajhifddimkapgcifgcodmmfdlknahffk");console.error(error_3);return}else if(error==="permission-denied"){var error_4=new OpenViduError_1.OpenViduError("SCREEN_CAPTURE_DENIED","You must allow access to one window of your desktop");console.error(error_4);return}publisher.stream.outboundOptions.mediaConstraints.video=screenConstraints.video;publisher.stream.configureScreenOptions(publisher.stream.outboundOptions);publisher.stream.ee.emitEvent("can-request-screen")},function(error){console.error("getScreenId error",error);return});console.info("'Publisher' initialized");return publisher}else{console.error("Screen sharing not supported on "+DetectRTC.browser.name)}}};OpenVidu.prototype.checkSystemRequirements=function(){var defaultWebRTCSupport=DetectRTC.isWebRTCSupported;var browser=DetectRTC.browser.name;var version=DetectRTC.browser.version;if(browser!=="Chrome"&&browser!=="Firefox"&&browser!=="Opera"&&browser!=="Safari"){return 0}else{return defaultWebRTCSupport?1:0}};OpenVidu.prototype.getDevices=function(callback){navigator.mediaDevices.enumerateDevices().then(function(deviceInfos){callback(null,deviceInfos)}).catch(function(error){console.error("Error getting devices",error);callback(error,null)})};OpenVidu.prototype.enableProdMode=function(){console.log=function(){};console.debug=function(){};console.info=function(){};console.warn=function(){}};OpenVidu.prototype.initLocalRecorder=function(stream){return new LocalRecorder_1.LocalRecorder(stream)};return OpenVidu}();exports.OpenVidu=OpenVidu},{"../KurentoUtils/DetectRTC":39,"../OpenViduInternal/LocalRecorder":57,"../OpenViduInternal/OpenViduError":58,"../OpenViduInternal/OpenViduInternal":59,"../ScreenSharing/Screen-Capturing-Auto.js":63,"./Publisher":53,"./Session":54,"webrtc-adapter":26}],53:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var EventEmitter=require("wolfy87-eventemitter");var Publisher=function(){function Publisher(stream,parentId,isScreenRequested){var _this=this;this.ee=new EventEmitter;this.accessAllowed=false;this.isScreenRequested=false;this.stream=stream;this.isScreenRequested=isScreenRequested;this.ee.addListener("stream-destroyed-default",function(event){var s=event.stream;s.addOnceEventListener("video-removed",function(){_this.ee.emitEvent("videoElementDestroyed")});s.removeVideo()});if(document.getElementById(parentId)!=null){this.element=document.getElementById(parentId)}}Publisher.prototype.publishAudio=function(value){this.stream.getWebRtcPeer().audioEnabled=value};Publisher.prototype.publishVideo=function(value){this.stream.getWebRtcPeer().videoEnabled=value};Publisher.prototype.destroy=function(){if(!!this.session)this.session.unpublish(this);this.stream.dispose();this.stream.removeVideo(this.element);return this};Publisher.prototype.subscribeToRemote=function(){this.stream.subscribeToMyRemote()};Publisher.prototype.on=function(eventName,callback){var _this=this;this.ee.addListener(eventName,function(event){if(event){console.info("Event '"+eventName+"' triggered by 'Publisher'",event)}else{console.info("Event '"+eventName+"' triggered by 'Publisher'")}callback(event)});if(eventName=="streamCreated"){if(this.stream.isPublisherPublished){this.ee.emitEvent("streamCreated",[{stream:this.stream}])}else{this.stream.addEventListener("stream-created-by-publisher",function(){_this.ee.emitEvent("streamCreated",[{stream:_this.stream}])})}}if(eventName=="videoElementCreated"){if(this.stream.isVideoELementCreated){this.ee.emitEvent("videoElementCreated",[{element:this.stream.getVideoElement()}])}else{this.stream.addEventListener("video-element-created-by-stream",function(element){_this.id=element.id;_this.ee.emitEvent("videoElementCreated",[{element:element.element}])})}}if(eventName=="videoPlaying"){var video=this.stream.getVideoElement();if(!this.stream.displayMyRemote()&&video&&video.currentTime>0&&video.paused==false&&video.ended==false&&video.readyState==4){this.ee.emitEvent("videoPlaying",[{element:this.stream.getVideoElement()}])}else{this.stream.addEventListener("video-is-playing",function(element){_this.ee.emitEvent("videoPlaying",[{element:element.element}])})}}if(eventName=="remoteVideoPlaying"){var video=this.stream.getVideoElement();if(this.stream.displayMyRemote()&&video&&video.currentTime>0&&video.paused==false&&video.ended==false&&video.readyState==4){this.ee.emitEvent("remoteVideoPlaying",[{element:this.stream.getVideoElement()}])}else{this.stream.addEventListener("remote-video-is-playing",function(element){_this.ee.emitEvent("remoteVideoPlaying",[{element:element.element}])})}}if(eventName=="accessAllowed"){if(this.stream.accessIsAllowed){this.ee.emitEvent("accessAllowed")}else{this.stream.addEventListener("access-allowed-by-publisher",function(){_this.ee.emitEvent("accessAllowed")})}}if(eventName=="accessDenied"){if(this.stream.accessIsDenied){this.ee.emitEvent("accessDenied")}else{this.stream.addEventListener("access-denied-by-publisher",function(){_this.ee.emitEvent("accessDenied")})}}};return Publisher}();exports.Publisher=Publisher},{"wolfy87-eventemitter":38}],54:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var OpenViduError_1=require("../OpenViduInternal/OpenViduError");var Subscriber_1=require("./Subscriber");var EventEmitter=require("wolfy87-eventemitter");var DetectRTC=require("../KurentoUtils/DetectRTC");var Session=function(){function Session(session,openVidu){var _this=this;this.session=session;this.openVidu=openVidu;this.ee=new EventEmitter;this.sessionId=session.getSessionId();this.session.addEventListener("stream-destroyed-default",function(event){event.stream.removeVideo()});this.session.addEventListener("session-disconnected-default",function(){var s;for(var streamId in _this.session.getRemoteStreams()){_this.session.getRemoteStreams()[streamId].removeVideo()}if(_this.connection&&Object.keys(_this.connection.getStreams()).length>0){for(var streamId in _this.connection.getStreams()){_this.connection.getStreams()[streamId].removeVideo()}}});this.session.addEventListener("update-connection-object",function(event){_this.connection=event.connection})}Session.prototype.connect=function(param1,param2,param3){if(param3){if(this.openVidu.checkSystemRequirements()){this.session.configure({sessionId:this.session.getSessionId(),participantId:param1,metadata:this.session.stringClientMetadata(param2),subscribeToStreams:false});this.session.connect(param1,param3)}else{param3(new OpenViduError_1.OpenViduError("BROWSER_NOT_SUPPORTED","Browser "+DetectRTC.browser.name+" "+DetectRTC.browser.version+" is not supported in OpenVidu"))}}else{if(this.openVidu.checkSystemRequirements()){this.session.configure({sessionId:this.session.getSessionId(),participantId:param1,metadata:"",subscribeToStreams:false});this.session.connect(param1,param2)}else{param2(new OpenViduError_1.OpenViduError("BROWSER_NOT_SUPPORTED","Browser "+DetectRTC.browser.name+" "+DetectRTC.browser.version+" is not supported in OpenVidu"))}}};Session.prototype.disconnect=function(){var _this=this;this.openVidu.openVidu.close(false);this.session.emitEvent("sessionDisconnected",[{preventDefault:function(){_this.session.removeEvent("session-disconnected-default")}}]);this.session.emitEvent("session-disconnected-default",[{}])};Session.prototype.publish=function(publisher){var _this=this;if(!publisher.stream.isPublisherPublished){if(publisher.isScreenRequested){if(!publisher.stream.isScreenRequestedReady){publisher.stream.addOnceEventListener("screen-ready",function(){_this.streamPublish(publisher)})}else{this.streamPublish(publisher)}}else{this.streamPublish(publisher)}}else{publisher=this.openVidu.reinitPublisher(publisher);if(publisher.isScreenRequested&&!publisher.stream.isScreenRequestedReady){publisher.stream.addOnceEventListener("screen-ready",function(){_this.streamPublish(publisher)})}else{this.streamPublish(publisher)}}};Session.prototype.streamPublish=function(publisher){publisher.session=this;this.connection.addStream(publisher.stream);publisher.stream.publish()};Session.prototype.unpublish=function(publisher){this.session.unpublish(publisher)};Session.prototype.on=function(eventName,callback){this.session.addEventListener(eventName,function(event){if(event){console.info("Event '"+eventName+"' triggered by 'Session'",event)}else{console.info("Event '"+eventName+"' triggered by 'Session'")}callback(event)})};Session.prototype.once=function(eventName,callback){this.session.addOnceEventListener(eventName,function(event){callback(event)})};Session.prototype.off=function(eventName,eventHandler){this.session.removeListener(eventName,eventHandler)};Session.prototype.subscribe=function(param1,param2,param3){this.session.subscribe(param1);var subscriber=new Subscriber_1.Subscriber(param1,param2);param1.playOnlyVideo(param2,null);return subscriber};Session.prototype.unsubscribe=function(subscriber){this.session.unsubscribe(subscriber.stream);subscriber.stream.removeVideo()};Session.prototype.signal=function(signal,completionHandler){var signalMessage={};if(signal.to&&signal.to.length>0){var connectionIds=[];for(var i=0;i0&&video.paused==false&&video.ended==false&&video.readyState==4){this.ee.emitEvent("videoPlaying",[{element:this.stream.getVideoElement()}])}else{this.stream.addOnceEventListener("video-is-playing",function(element){_this.ee.emitEvent("videoPlaying",[{element:element.element}])})}}};return Subscriber}();exports.Subscriber=Subscriber},{"wolfy87-eventemitter":38}],56:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var Stream_1=require("./Stream");var Connection=function(){function Connection(openVidu,local,room,options){this.openVidu=openVidu;this.local=local;this.room=room;this.options=options;this.streams={};console.info("'Connection' created ("+(local?"local":"remote")+")"+(local?"":", with 'connectionId' ["+(options?options.id:"")+"] "));if(options&&!local){this.connectionId=options.id;if(options.metadata){this.data=options.metadata}if(options.streams){this.initRemoteStreams(options)}}}Connection.prototype.addStream=function(stream){stream.connection=this;this.streams[stream.streamId]=stream};Connection.prototype.removeStream=function(key){delete this.streams[key];delete this.inboundStreamsOpts};Connection.prototype.setOptions=function(options){this.options=options};Connection.prototype.getStreams=function(){return this.streams};Connection.prototype.dispose=function(){for(var key in this.streams){this.streams[key].dispose()}};Connection.prototype.sendIceCandidate=function(candidate){console.debug(this.local?"Local":"Remote","candidate for",this.connectionId,JSON.stringify(candidate));this.openVidu.sendRequest("onIceCandidate",{endpointName:this.connectionId,candidate:candidate.candidate,sdpMid:candidate.sdpMid,sdpMLineIndex:candidate.sdpMLineIndex},function(error,response){if(error){console.error("Error sending ICE candidate: "+JSON.stringify(error))}})};Connection.prototype.initRemoteStreams=function(options){var opts;for(var _i=0,_a=options.streams;_i<_a.length;_i++){opts=_a[_i];var streamOptions={id:opts.id,connection:this,recvAudio:opts.audioActive==null?true:opts.audioActive,recvVideo:opts.videoActive==null?true:opts.videoActive,typeOfVideo:opts.typeOfVideo};var stream=new Stream_1.Stream(this.openVidu,false,this.room,streamOptions);this.addStream(stream);this.inboundStreamsOpts=streamOptions}console.info("Remote 'Connection' with 'connectionId' ["+this.connectionId+"] is now configured for receiving Streams with options: ",this.inboundStreamsOpts)};return Connection}();exports.Connection=Connection},{"./Stream":61}],57:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var LocalRecoderState;(function(LocalRecoderState){LocalRecoderState["READY"]="READY";LocalRecoderState["RECORDING"]="RECORDING";LocalRecoderState["PAUSED"]="PAUSED";LocalRecoderState["FINISHED"]="FINISHED"})(LocalRecoderState=exports.LocalRecoderState||(exports.LocalRecoderState={}));var LocalRecorder=function(){function LocalRecorder(stream){this.chunks=[];this.count=0;this.stream=stream;this.connectionId=!!this.stream.connection?this.stream.connection.connectionId:"default-connection";this.id=this.stream.streamId+"_"+this.connectionId+"_localrecord";this.state="READY"}LocalRecorder.prototype.record=function(){var _this=this;if(typeof MediaRecorder==="undefined"){console.error("MediaRecorder not supported on your browser. See compatibility in https://caniuse.com/#search=MediaRecorder");throw Error("MediaRecorder not supported on your browser. See compatibility in https://caniuse.com/#search=MediaRecorder")}if(this.state!=="READY"){throw Error("'LocalRecord.record()' needs 'LocalRecord.state' to be 'READY' (current value: '"+this.state+"'). Call 'LocalRecorder.clean()' or init a new LocalRecorder before")}console.log("Starting local recording of stream '"+this.stream.streamId+"' of connection '"+this.connectionId+"'");if(typeof MediaRecorder.isTypeSupported=="function"){var options=void 0;if(MediaRecorder.isTypeSupported("video/webm;codecs=vp9")){options={mimeType:"video/webm;codecs=vp9"}}else if(MediaRecorder.isTypeSupported("video/webm;codecs=h264")){options={mimeType:"video/webm;codecs=h264"}}else if(MediaRecorder.isTypeSupported("video/webm;codecs=vp8")){options={mimeType:"video/webm;codecs=vp8"}}console.log("Using mimeType "+options.mimeType);this.mediaRecorder=new MediaRecorder(this.stream.getMediaStream(),options)}else{console.warn("isTypeSupported is not supported, using default codecs for browser");this.mediaRecorder=new MediaRecorder(this.stream.getMediaStream())}this.mediaRecorder.start(10);this.mediaRecorder.ondataavailable=function(e){_this.chunks.push(e.data)};this.mediaRecorder.onerror=function(e){console.error("MediaRecorder error: ",e)};this.mediaRecorder.onstart=function(){console.log("MediaRecorder started (state="+_this.mediaRecorder.state+")")};this.mediaRecorder.onstop=function(){_this.onStopDefault()};this.mediaRecorder.onpause=function(){console.log("MediaRecorder paused (state="+_this.mediaRecorder.state+")")};this.mediaRecorder.onresume=function(){console.log("MediaRecorder resumed (state="+_this.mediaRecorder.state+")")};this.mediaRecorder.onwarning=function(e){console.log("MediaRecorder warning: "+e)};this.state="RECORDING"};LocalRecorder.prototype.stop=function(){var _this=this;return new Promise(function(resolve,reject){try{if(_this.state==="READY"||_this.state==="FINISHED"){throw Error("'LocalRecord.stop()' needs 'LocalRecord.state' to be 'RECORDING' or 'PAUSED' (current value: '"+_this.state+"'). Call 'LocalRecorder.start()' before")}_this.mediaRecorder.onstop=function(){_this.onStopDefault();resolve()}}catch(e){reject(e)}try{_this.mediaRecorder.stop()}catch(e){reject(e)}})};LocalRecorder.prototype.pause=function(){if(this.state!=="RECORDING"){throw Error("'LocalRecord.pause()' needs 'LocalRecord.state' to be 'RECORDING' (current value: '"+this.state+"'). Call 'LocalRecorder.start()' or 'LocalRecorder.resume()' before")}this.mediaRecorder.pause();this.state="PAUSED"};LocalRecorder.prototype.resume=function(){if(this.state!=="PAUSED"){throw Error("'LocalRecord.resume()' needs 'LocalRecord.state' to be 'PAUSED' (current value: '"+this.state+"'). Call 'LocalRecorder.pause()' before")}this.mediaRecorder.resume();this.state="RECORDING"};LocalRecorder.prototype.preview=function(parentElement){if(this.state!=="FINISHED"){throw Error("'LocalRecord.preview()' needs 'LocalRecord.state' to be 'FINISHED' (current value: '"+this.state+"'). Call 'LocalRecorder.stop()' before")}this.videoPreview=document.createElement("video");this.videoPreview.id=this.id;this.videoPreview.autoplay=true;if(typeof parentElement==="string"){this.htmlParentElementId=parentElement;var parentElementDom=document.getElementById(parentElement);if(parentElementDom){this.videoPreview=parentElementDom.appendChild(this.videoPreview)}}else{this.htmlParentElementId=parentElement.id;this.videoPreview=parentElement.appendChild(this.videoPreview)}this.videoPreview.src=this.videoPreviewSrc;return this.videoPreview};LocalRecorder.prototype.clean=function(){var _this=this;var f=function(){delete _this.blob;_this.chunks=[];_this.count=0;delete _this.mediaRecorder;_this.state="READY"};if(this.state==="RECORDING"||this.state==="PAUSED"){this.stop().then(function(){return f()}).catch(function(){return f()})}else{f()}};LocalRecorder.prototype.download=function(){if(this.state!=="FINISHED"){throw Error("'LocalRecord.download()' needs 'LocalRecord.state' to be 'FINISHED' (current value: '"+this.state+"'). Call 'LocalRecorder.stop()' before")}else{var a=document.createElement("a");a.style.display="none";document.body.appendChild(a);var url=window.URL.createObjectURL(this.blob);a.href=url;a.download=this.id+".webm";a.click();window.URL.revokeObjectURL(url);document.body.removeChild(a)}};LocalRecorder.prototype.getBlob=function(){if(this.state!=="FINISHED"){throw Error("Call 'LocalRecord.stop()' before getting Blob file")}else{return this.blob}};LocalRecorder.prototype.uploadAsBinary=function(endpoint,headers){var _this=this;return new Promise(function(resolve,reject){if(_this.state!=="FINISHED"){reject(Error("'LocalRecord.uploadAsBinary()' needs 'LocalRecord.state' to be 'FINISHED' (current value: '"+_this.state+"'). Call 'LocalRecorder.stop()' before"))}else{var http_1=new XMLHttpRequest;http_1.open("POST",endpoint,true);if(typeof headers==="object"){for(var _i=0,_a=Object.keys(headers);_i<_a.length;_i++){var key=_a[_i];http_1.setRequestHeader(key,headers[key])}}http_1.onreadystatechange=function(){if(http_1.readyState===4){if(http_1.status.toString().charAt(0)==="2"){resolve(http_1.responseText)}else{reject(Error("Upload error: "+http_1.status))}}};http_1.send(_this.blob)}})};LocalRecorder.prototype.uploadAsMultipartfile=function(endpoint,headers){var _this=this;return new Promise(function(resolve,reject){if(_this.state!=="FINISHED"){reject(Error("'LocalRecord.uploadAsMultipartfile()' needs 'LocalRecord.state' to be 'FINISHED' (current value: '"+_this.state+"'). Call 'LocalRecorder.stop()' before"))}else{var http_2=new XMLHttpRequest;http_2.open("POST",endpoint,true);if(typeof headers==="object"){for(var _i=0,_a=Object.keys(headers);_i<_a.length;_i++){var key=_a[_i];http_2.setRequestHeader(key,headers[key])}}var sendable=new FormData;sendable.append("file",_this.blob,_this.id+".webm");http_2.onreadystatechange=function(){if(http_2.readyState===4){if(http_2.status.toString().charAt(0)==="2"){resolve(http_2.responseText)}else{reject(Error("Upload error: "+http_2.status))}}};http_2.send(sendable)}})};LocalRecorder.prototype.onStopDefault=function(){console.log("MediaRecorder stopped (state="+this.mediaRecorder.state+")");this.blob=new Blob(this.chunks,{type:"video/webm"});this.chunks=[];this.videoPreviewSrc=window.URL.createObjectURL(this.blob);this.state="FINISHED"};return LocalRecorder}();exports.LocalRecorder=LocalRecorder},{}],58:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var OpenViduErrorName;(function(OpenViduErrorName){OpenViduErrorName["BROWSER_NOT_SUPPORTED"]="BROWSER_NOT_SUPPORTED";OpenViduErrorName["CAMERA_ACCESS_DENIED"]="CAMERA_ACCESS_DENIED";OpenViduErrorName["MICROPHONE_ACCESS_DENIED"]="MICROPHONE_ACCESS_DENIED";OpenViduErrorName["SCREEN_CAPTURE_DENIED"]="SCREEN_CAPTURE_DENIED";OpenViduErrorName["NO_VIDEO_DEVICE"]="NO_VIDEO_DEVICE";OpenViduErrorName["NO_INPUT_DEVICE"]="NO_INPUT_DEVICE";OpenViduErrorName["SCREEN_SHARING_NOT_SUPPORTED"]="SCREEN_SHARING_NOT_SUPPORTED";OpenViduErrorName["SCREEN_EXTENSION_NOT_INSTALLED"]="SCREEN_EXTENSION_NOT_INSTALLED";OpenViduErrorName["GENERIC_ERROR"]="GENERIC_ERROR"})(OpenViduErrorName=exports.OpenViduErrorName||(exports.OpenViduErrorName={}));var OpenViduError=function(){function OpenViduError(name,message){this.name=name;this.message=message}return OpenViduError}();exports.OpenViduError=OpenViduError},{}],59:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var SessionInternal_1=require("./SessionInternal");var OpenViduError_1=require("./OpenViduError");var Stream_1=require("./Stream");var RpcBuilder=require("../KurentoUtils/kurento-jsonrpc");var OpenViduInternal=function(){function OpenViduInternal(){this.recorder=false}OpenViduInternal.prototype.initSession=function(sessionId){console.info("'Session' initialized with 'sessionId' ["+sessionId+"]");this.session=new SessionInternal_1.SessionInternal(this,sessionId);return this.session};OpenViduInternal.prototype.initPublisherTagged=function(parentId,cameraOptions,newStream,callback){var _this=this;if(newStream){if(cameraOptions==null){cameraOptions={sendAudio:true,sendVideo:true,activeAudio:true,activeVideo:true,dataChannel:true,mediaConstraints:{audio:true,video:{width:{ideal:1280}}}}}this.localStream=new Stream_1.Stream(this,true,this.session,cameraOptions)}this.localStream.requestCameraAccess(function(error,localStream){if(error){console.error(error);if(callback){callback(error)}_this.localStream.ee.emitEvent("access-denied-by-publisher")}else{_this.localStream.setVideoElement(_this.cameraReady(localStream,parentId));if(callback){callback(undefined)}}});return this.localStream};OpenViduInternal.prototype.initPublisherScreen=function(parentId,newStream,callback){var _this=this;if(newStream){this.localStream=new Stream_1.Stream(this,true,this.session,"screen-options")}this.localStream.addOnceEventListener("can-request-screen",function(){_this.localStream.requestCameraAccess(function(error,localStream){if(error){_this.localStream.ee.emitEvent("access-denied-by-publisher");var errorName="SCREEN_CAPTURE_DENIED";var errorMessage="You must allow access to one window of your desktop";var e=new OpenViduError_1.OpenViduError(errorName,errorMessage);console.error(e);if(callback){callback(e)}}else{_this.localStream.setVideoElement(_this.cameraReady(localStream,parentId));if(_this.localStream.getSendAudio()){navigator.mediaDevices.getUserMedia({audio:true,video:false}).then(function(userStream){_this.localStream.getMediaStream().addTrack(userStream.getAudioTracks()[0]);if(userStream.getAudioTracks()[0]!=null){userStream.getAudioTracks()[0].enabled=_this.localStream.outboundOptions.activeAudio}_this.localStream.isScreenRequestedReady=true;_this.localStream.ee.emitEvent("screen-ready");if(callback){callback(undefined)}}).catch(function(error){_this.localStream.ee.emitEvent("access-denied-by-publisher");console.error("Error accessing the microphone",error);if(callback){var errorName="MICROPHONE_ACCESS_DENIED";var errorMessage=error.toString();callback(new OpenViduError_1.OpenViduError(errorName,errorMessage))}})}else{_this.localStream.isScreenRequestedReady=true;_this.localStream.ee.emitEvent("screen-ready");if(callback){callback(undefined)}}}})});return this.localStream};OpenViduInternal.prototype.cameraReady=function(localStream,parentId){this.localStream=localStream;var videoElement=this.localStream.playOnlyVideo(parentId,null);this.localStream.emitStreamReadyEvent();return videoElement};OpenViduInternal.prototype.getLocalStream=function(){return this.localStream};OpenViduInternal.prototype.getWsUri=function(){return this.wsUri};OpenViduInternal.prototype.setWsUri=function(wsUri){this.wsUri=wsUri};OpenViduInternal.prototype.getSecret=function(){return this.secret};OpenViduInternal.prototype.setSecret=function(secret){this.secret=secret};OpenViduInternal.prototype.getRecorder=function(){return this.recorder};OpenViduInternal.prototype.setRecorder=function(recorder){this.recorder=recorder};OpenViduInternal.prototype.getOpenViduServerURL=function(){return"https://"+this.wsUri.split("wss://")[1].split("/room")[0]};OpenViduInternal.prototype.getRoom=function(){return this.session};OpenViduInternal.prototype.connect=function(callback){this.callback=callback;this.initJsonRpcClient(this.wsUri)};OpenViduInternal.prototype.initJsonRpcClient=function(wsUri){var config={heartbeat:3e3,sendCloseMessage:false,ws:{uri:wsUri,useSockJS:false,onconnected:this.connectCallback.bind(this),ondisconnect:this.disconnectCallback.bind(this),onreconnecting:this.reconnectingCallback.bind(this),onreconnected:this.reconnectedCallback.bind(this)},rpc:{requestTimeout:15e3,participantJoined:this.onParticipantJoined.bind(this),participantPublished:this.onParticipantPublished.bind(this),participantUnpublished:this.onParticipantUnpublished.bind(this),participantLeft:this.onParticipantLeft.bind(this),participantEvicted:this.onParticipantEvicted.bind(this),sendMessage:this.onNewMessage.bind(this),iceCandidate:this.iceCandidateEvent.bind(this),mediaError:this.onMediaError.bind(this)}};this.jsonRpcClient=new RpcBuilder.clients.JsonRpcClient(config)};OpenViduInternal.prototype.connectCallback=function(error){if(error){this.callback(error)}else{this.callback(null)}};OpenViduInternal.prototype.isRoomAvailable=function(){if(this.session!==undefined&&this.session instanceof SessionInternal_1.SessionInternal){return true}else{console.warn("Session instance not found");return false}};OpenViduInternal.prototype.disconnectCallback=function(){console.warn("Websocket connection lost");if(this.isRoomAvailable()){this.session.onLostConnection()}else{alert("Connection error. Please reload page.")}};OpenViduInternal.prototype.reconnectingCallback=function(){console.warn("Websocket connection lost (reconnecting)");if(this.isRoomAvailable()){this.session.onLostConnection()}else{alert("Connection error. Please reload page.")}};OpenViduInternal.prototype.reconnectedCallback=function(){console.warn("Websocket reconnected")};OpenViduInternal.prototype.onParticipantJoined=function(params){if(this.isRoomAvailable()){this.session.onParticipantJoined(params)}};OpenViduInternal.prototype.onParticipantPublished=function(params){if(this.isRoomAvailable()){this.session.onParticipantPublished(params)}};OpenViduInternal.prototype.onParticipantUnpublished=function(params){if(this.isRoomAvailable()){this.session.onParticipantUnpublished(params)}};OpenViduInternal.prototype.onParticipantLeft=function(params){if(this.isRoomAvailable()){this.session.onParticipantLeft(params)}};OpenViduInternal.prototype.onParticipantEvicted=function(params){if(this.isRoomAvailable()){this.session.onParticipantEvicted(params)}};OpenViduInternal.prototype.onNewMessage=function(params){if(this.isRoomAvailable()){this.session.onNewMessage(params)}};OpenViduInternal.prototype.iceCandidateEvent=function(params){if(this.isRoomAvailable()){this.session.recvIceCandidate(params)}};OpenViduInternal.prototype.onRoomClosed=function(params){if(this.isRoomAvailable()){this.session.onRoomClosed(params)}};OpenViduInternal.prototype.onMediaError=function(params){if(this.isRoomAvailable()){this.session.onMediaError(params)}};OpenViduInternal.prototype.setRpcParams=function(params){this.rpcParams=params};OpenViduInternal.prototype.sendRequest=function(method,params,callback){if(params&¶ms instanceof Function){callback=params;params=undefined}params=params||{};if(this.rpcParams&&this.rpcParams!==null&&this.rpcParams!==undefined){for(var index in this.rpcParams){if(this.rpcParams.hasOwnProperty(index)){params[index]=this.rpcParams[index];console.debug("RPC param added to request {"+index+": "+this.rpcParams[index]+"}")}}}console.debug('Sending request: {method:"'+method+'", params: '+JSON.stringify(params)+"}");this.jsonRpcClient.send(method,params,callback)};OpenViduInternal.prototype.close=function(forced){if(this.isRoomAvailable()){this.session.leave(forced,this.jsonRpcClient)}};OpenViduInternal.prototype.disconnectParticipant=function(stream){if(this.isRoomAvailable()){this.session.disconnect(stream)}};OpenViduInternal.prototype.sendMessage=function(message){this.sendRequest("sendMessage",{message:message},function(error,response){if(error){console.error(error)}})};OpenViduInternal.prototype.generateMediaConstraints=function(cameraOptions){var mediaConstraints={audio:cameraOptions.audio,video:{}};if(!cameraOptions.video){mediaConstraints.video=false}else{var w=void 0,h=void 0;switch(cameraOptions.quality){case"LOW":w=320;h=240;break;case"MEDIUM":w=640;h=480;break;case"HIGH":w=1280;h=720;break;default:w=640;h=480}mediaConstraints.video["width"]={exact:w};mediaConstraints.video["height"]={exact:h}}return mediaConstraints};return OpenViduInternal}();exports.OpenViduInternal=OpenViduInternal},{"../KurentoUtils/kurento-jsonrpc":45,"./OpenViduError":58,"./SessionInternal":60,"./Stream":61}],60:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var Connection_1=require("./Connection");var EventEmitter=require("wolfy87-eventemitter");var SECRET_PARAM="?secret=";var RECORDER_PARAM="&recorder=";var SessionInternal=function(){function SessionInternal(openVidu,sessionId){this.openVidu=openVidu;this.ee=new EventEmitter;this.remoteStreams={};this.participants={};this.publishersSpeaking=[];this.connected=false;this.sessionId=this.getUrlWithoutSecret(sessionId);this.localParticipant=new Connection_1.Connection(this.openVidu,true,this);if(!this.openVidu.getWsUri()&&!!sessionId){this.processOpenViduUrl(sessionId)}}SessionInternal.prototype.processOpenViduUrl=function(url){var secret=this.getSecretFromUrl(url);var recorder=this.getRecorderFromUrl(url);if(!(secret==null)){this.openVidu.setSecret(secret)}if(!(recorder==null)){this.openVidu.setRecorder(recorder)}this.openVidu.setWsUri(this.getFinalUrl(url))};SessionInternal.prototype.getSecretFromUrl=function(url){var secret="";if(url.indexOf(SECRET_PARAM)!==-1){var endOfSecret=url.lastIndexOf(RECORDER_PARAM);if(endOfSecret!==-1){secret=url.substring(url.lastIndexOf(SECRET_PARAM)+SECRET_PARAM.length,endOfSecret)}else{secret=url.substring(url.lastIndexOf(SECRET_PARAM)+SECRET_PARAM.length,url.length)}}return secret};SessionInternal.prototype.getRecorderFromUrl=function(url){var recorder="";if(url.indexOf(RECORDER_PARAM)!==-1){recorder=url.substring(url.lastIndexOf(RECORDER_PARAM)+RECORDER_PARAM.length,url.length)}return new Boolean(recorder).valueOf()};SessionInternal.prototype.getUrlWithoutSecret=function(url){if(!url){console.error("sessionId is not defined")}if(url.indexOf(SECRET_PARAM)!==-1){url=url.substring(0,url.lastIndexOf(SECRET_PARAM))}return url};SessionInternal.prototype.getFinalUrl=function(url){url=this.getUrlWithoutSecret(url).substring(0,url.lastIndexOf("/"))+"/room";if(url.indexOf(".ngrok.io")!==-1){url=url.replace("ws://","wss://");var regex=/\.ngrok\.io:\d+/;url=url.replace(regex,".ngrok.io")}else if(url.indexOf("localhost")!==-1||url.indexOf("127.0.0.1")!=-1){}return url};SessionInternal.prototype.connect=function(token,callback){var _this=this;this.openVidu.connect(function(error){if(error){callback("ERROR CONNECTING TO OPENVIDU")}else{if(!token){token=_this.randomToken()}var joinParams={token:token,session:_this.sessionId,metadata:_this.options.metadata,secret:_this.openVidu.getSecret(),recorder:_this.openVidu.getRecorder(),dataChannels:false};if(_this.localParticipant){if(Object.keys(_this.localParticipant.getStreams()).some(function(streamId){return _this.remoteStreams[streamId].isDataChannelEnabled()})){joinParams.dataChannels=true}}_this.openVidu.sendRequest("joinRoom",joinParams,function(error,response){if(error){callback(error)}else{_this.connected=true;var exParticipants=response.value;_this.localParticipant.connectionId=response.id;_this.participants[response.id]=_this.localParticipant;var roomEvent={participants:new Array,streams:new Array};var length_1=exParticipants.length;for(var i=0;i=16){userName=userName.substring(0,16)+"..."}name.appendChild(document.createTextNode(userName));name.id="name-"+this.streamId;name.className="name";name.title=this.streamId;this.showSpinner(thumbnailId);return this.playOnlyVideo(container,thumbnailId)};Stream.prototype.getParticipant=function(){return this.connection};Stream.prototype.requestCameraAccess=function(callback){var _this=this;var constraints=this.outboundOptions.mediaConstraints;this.userMediaHasVideo(function(hasVideo){if(!hasVideo){if(_this.outboundOptions.sendVideo){callback(new OpenViduError_1.OpenViduError("NO_VIDEO_DEVICE","You have requested camera access but there is no video input device available. Trying to connect with an audio input device only"),_this)}if(!_this.outboundOptions.sendAudio){callback(new OpenViduError_1.OpenViduError("NO_INPUT_DEVICE","You must init Publisher object with audio or video streams enabled"),undefined)}else{constraints.video=false;_this.outboundOptions.sendVideo=false;_this.requestCameraAccesAux(constraints,callback)}}else{_this.requestCameraAccesAux(constraints,callback)}})};Stream.prototype.requestCameraAccesAux=function(constraints,callback){var _this=this;console.log(constraints);navigator.mediaDevices.getUserMedia(constraints).then(function(userStream){_this.cameraAccessSuccess(userStream,callback)}).catch(function(error){_this.accessIsDenied=true;_this.accessIsAllowed=false;var errorName;var errorMessage=error.toString();if(!_this.isScreenRequested){errorName=_this.outboundOptions.sendVideo?"CAMERA_ACCESS_DENIED":"MICROPHONE_ACCESS_DENIED"}else{errorName="SCREEN_CAPTURE_DENIED"}callback(new OpenViduError_1.OpenViduError(errorName,errorMessage),undefined)})};Stream.prototype.cameraAccessSuccess=function(userStream,callback){this.accessIsAllowed=true;this.accessIsDenied=false;this.ee.emitEvent("access-allowed-by-publisher");if(userStream.getAudioTracks()[0]!=null){userStream.getAudioTracks()[0].enabled=this.outboundOptions.activeAudio}if(userStream.getVideoTracks()[0]!=null){userStream.getVideoTracks()[0].enabled=this.outboundOptions.activeVideo}this.mediaStream=userStream;this.ee.emitEvent("mediastream-updated");callback(undefined,this)};Stream.prototype.userMediaHasVideo=function(callback){if(this.isScreenRequested){callback(true);return}else{navigator.mediaDevices.enumerateDevices().then(function(mediaDevices){var videoInput=mediaDevices.filter(function(deviceInfo){return deviceInfo.kind==="videoinput"})[0];callback(videoInput!=null)})}};Stream.prototype.publishVideoCallback=function(error,sdpOfferParam,wp){var _this=this;if(error){return console.error("(publish) SDP offer error: "+JSON.stringify(error))}console.debug("Sending SDP offer to publish as "+this.streamId,sdpOfferParam);this.openVidu.sendRequest("publishVideo",{sdpOffer:sdpOfferParam,doLoopback:this.displayMyRemote()||false,audioActive:this.outboundOptions.sendAudio,videoActive:this.outboundOptions.sendVideo,typeOfVideo:this.outboundOptions.sendVideo?this.isScreenRequested?"SCREEN":"CAMERA":""},function(error,response){if(error){console.error("Error on publishVideo: "+JSON.stringify(error))}else{_this.processSdpAnswer(response.sdpAnswer);console.info("'Publisher' succesfully published to session")}})};Stream.prototype.startVideoCallback=function(error,sdpOfferParam,wp){var _this=this;if(error){return console.error("(subscribe) SDP offer error: "+JSON.stringify(error))}console.debug("Sending SDP offer to subscribe to "+this.streamId,sdpOfferParam);this.openVidu.sendRequest("receiveVideoFrom",{sender:this.streamId,sdpOffer:sdpOfferParam},function(error,response){if(error){console.error("Error on recvVideoFrom: "+JSON.stringify(error))}else{_this.processSdpAnswer(response.sdpAnswer)}})};Stream.prototype.initWebRtcPeer=function(sdpOfferCallback){var _this=this;if(this.local){var userMediaConstraints={audio:this.outboundOptions.sendAudio,video:this.outboundOptions.sendVideo};var options={videoStream:this.mediaStream,mediaConstraints:userMediaConstraints,onicecandidate:this.connection.sendIceCandidate.bind(this.connection)};if(this.outboundOptions.dataChannel){options.dataChannelConfig={id:this.getChannelName(),onopen:this.onDataChannelOpen,onclose:this.onDataChannelClosed};options.dataChannels=true}if(this.displayMyRemote()){this.wp=kurentoUtils.WebRtcPeer.WebRtcPeerSendrecv(options,function(error){if(error){return console.error(error)}_this.wp.generateOffer(sdpOfferCallback.bind(_this))})}else{this.wp=kurentoUtils.WebRtcPeer.WebRtcPeerSendonly(options,function(error){if(error){return console.error(error)}_this.wp.generateOffer(sdpOfferCallback.bind(_this))})}this.isPublisherPublished=true;this.ee.emitEvent("stream-created-by-publisher")}else{var offerConstraints={audio:this.inboundOptions.recvAudio,video:this.inboundOptions.recvVideo};console.debug("'Session.subscribe(Stream)' called. Constraints of generate SDP offer",offerConstraints);var options={onicecandidate:this.connection.sendIceCandidate.bind(this.connection),mediaConstraints:offerConstraints};this.wp=kurentoUtils.WebRtcPeer.WebRtcPeerRecvonly(options,function(error){if(error){return console.error(error)}_this.wp.generateOffer(sdpOfferCallback.bind(_this))})}console.debug("Waiting for SDP offer to be generated ("+(this.local?"local":"remote")+" 'Stream': "+this.streamId+")")};Stream.prototype.publish=function(){var _this=this;if(this.isReadyToPublish){this.initWebRtcPeer(this.publishVideoCallback)}else{this.ee.once("stream-ready",function(streamEvent){_this.publish()})}};Stream.prototype.subscribe=function(){this.initWebRtcPeer(this.startVideoCallback)};Stream.prototype.processSdpAnswer=function(sdpAnswer){var _this=this;var answer=new RTCSessionDescription({type:"answer",sdp:sdpAnswer});console.debug(this.streamId+": set peer connection with recvd SDP answer",sdpAnswer);var participantId=this.streamId;var pc=this.wp.peerConnection;pc.setRemoteDescription(answer,function(){if(!_this.local||_this.displayMyRemote()){_this.mediaStream=pc.getRemoteStreams()[0];console.debug("Peer remote stream",_this.mediaStream);if(_this.mediaStream!=undefined){_this.ee.emitEvent("mediastream-updated");if(_this.mediaStream.getAudioTracks()[0]!=null){_this.speechEvent=kurentoUtils.WebRtcPeer.hark(_this.mediaStream,{threshold:_this.room.thresholdSpeaker});_this.speechEvent.on("speaking",function(){_this.room.emitEvent("publisherStartSpeaking",[{connection:_this.connection,streamId:_this.streamId}])});_this.speechEvent.on("stopped_speaking",function(){_this.room.emitEvent("publisherStopSpeaking",[{connection:_this.connection,streamId:_this.streamId}])})}}if(!!_this.video){_this.video.oncanplay=function(){if(_this.local&&_this.displayMyRemote()){console.info("Your own remote 'Stream' with id ["+_this.streamId+"] video is now playing");_this.ee.emitEvent("remote-video-is-playing",[{element:_this.video}])}else if(!_this.local&&!_this.displayMyRemote()){console.info("Remote 'Stream' with id ["+_this.streamId+"] video is now playing");_this.ee.emitEvent("video-is-playing",[{element:_this.video}])}}}_this.room.emitEvent("stream-subscribed",[{stream:_this}])}_this.initWebRtcStats()},function(error){console.error(_this.streamId+": Error setting SDP to the peer connection: "+JSON.stringify(error))})};Stream.prototype.unpublish=function(){if(this.wp){this.wp.dispose()}else{if(this.mediaStream){this.mediaStream.getAudioTracks().forEach(function(track){track.stop&&track.stop()});this.mediaStream.getVideoTracks().forEach(function(track){track.stop&&track.stop()})}}if(this.speechEvent){this.speechEvent.stop()}console.info(this.streamId+": Stream '"+this.streamId+"' unpublished")};Stream.prototype.dispose=function(){function disposeElement(element){if(element&&element.parentNode){element.parentNode.removeChild(element)}}disposeElement("progress-"+this.streamId);if(this.wp){this.wp.dispose()}else{if(this.mediaStream){this.mediaStream.getAudioTracks().forEach(function(track){track.stop&&track.stop()});this.mediaStream.getVideoTracks().forEach(function(track){track.stop&&track.stop()})}}if(this.speechEvent){this.speechEvent.stop()}this.stopWebRtcStats();console.info((this.local?"Local ":"Remote ")+"'Stream' with id ["+this.streamId+"]' has been succesfully disposed")};Stream.prototype.configureScreenOptions=function(options){this.outboundOptions=options;this.streamId="SCREEN"};Stream.prototype.initWebRtcStats=function(){this.webRtcStats=new WebRtcStats_1.WebRtcStats(this);this.webRtcStats.initWebRtcStats()};Stream.prototype.stopWebRtcStats=function(){if(this.webRtcStats!=null&&this.webRtcStats.isEnabled()){this.webRtcStats.stopWebRtcStats()}};return Stream}();exports.Stream=Stream},{"../KurentoUtils/kurento-utils-js":50,"./OpenViduError":58,"./WebRtcStats":62,"webrtc-adapter":26,"wolfy87-eventemitter":38}],62:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var DetectRTC=require("../KurentoUtils/DetectRTC");var WebRtcStats=function(){function WebRtcStats(stream){this.stream=stream;this.webRtcStatsEnabled=false;this.statsInterval=1;this.stats={inbound:{audio:{bytesReceived:0,packetsReceived:0,packetsLost:0},video:{bytesReceived:0,packetsReceived:0,packetsLost:0,framesDecoded:0,nackCount:0}},outbound:{audio:{bytesSent:0,packetsSent:0},video:{bytesSent:0,packetsSent:0,framesEncoded:0,nackCount:0}}}}WebRtcStats.prototype.isEnabled=function(){return this.webRtcStatsEnabled};WebRtcStats.prototype.initWebRtcStats=function(){var _this=this;var elastestInstrumentation=localStorage.getItem("elastest-instrumentation");if(elastestInstrumentation){console.warn("WebRtc stats enabled for stream "+this.stream.streamId+" of connection "+this.stream.connection.connectionId);this.webRtcStatsEnabled=true;var instrumentation_1=JSON.parse(elastestInstrumentation);this.statsInterval=instrumentation_1.webrtc.interval;console.warn("localStorage item: "+JSON.stringify(instrumentation_1));this.webRtcStatsIntervalId=setInterval(function(){_this.sendStatsToHttpEndpoint(instrumentation_1)},this.statsInterval*1e3);return}console.debug("WebRtc stats not enabled")};WebRtcStats.prototype.stopWebRtcStats=function(){if(this.webRtcStatsEnabled){clearInterval(this.webRtcStatsIntervalId);console.warn("WebRtc stats stopped for disposed stream "+this.stream.streamId+" of connection "+this.stream.connection.connectionId)}};WebRtcStats.prototype.sendStatsToHttpEndpoint=function(instrumentation){var _this=this;var sendPost=function(json){var http=new XMLHttpRequest;var url=instrumentation.webrtc.httpEndpoint;http.open("POST",url,true);http.setRequestHeader("Content-type","application/json");http.onreadystatechange=function(){if(http.readyState==4&&http.status==200){console.log("WebRtc stats succesfully sent to "+url+" for stream "+_this.stream.streamId+" of connection "+_this.stream.connection.connectionId)}};http.send(json)};var f=function(stats){if(DetectRTC.browser.name==="Firefox"){stats.forEach(function(stat){var json={};if(stat.type==="inbound-rtp"&&(stat.nackCount!=null&&stat.isRemote===false&&stat.id.startsWith("inbound")&&stat.remoteId.startsWith("inbound"))){var metricId="webrtc_inbound_"+stat.mediaType+"_"+stat.ssrc;var jitter=stat.jitter*1e3;var metrics={bytesReceived:(stat.bytesReceived-_this.stats.inbound[stat.mediaType].bytesReceived)/_this.statsInterval,jitter:jitter,packetsReceived:(stat.packetsReceived-_this.stats.inbound[stat.mediaType].packetsReceived)/_this.statsInterval,packetsLost:(stat.packetsLost-_this.stats.inbound[stat.mediaType].packetsLost)/_this.statsInterval};var units={bytesReceived:"bytes",jitter:"ms",packetsReceived:"packets",packetsLost:"packets"};if(stat.mediaType==="video"){metrics["framesDecoded"]=(stat.framesDecoded-_this.stats.inbound.video.framesDecoded)/_this.statsInterval;metrics["nackCount"]=(stat.nackCount-_this.stats.inbound.video.nackCount)/_this.statsInterval;units["framesDecoded"]="frames";units["nackCount"]="packets";_this.stats.inbound.video.framesDecoded=stat.framesDecoded;_this.stats.inbound.video.nackCount=stat.nackCount}_this.stats.inbound[stat.mediaType].bytesReceived=stat.bytesReceived;_this.stats.inbound[stat.mediaType].packetsReceived=stat.packetsReceived;_this.stats.inbound[stat.mediaType].packetsLost=stat.packetsLost;json={"@timestamp":new Date(stat.timestamp).toISOString(),exec:instrumentation.exec,component:instrumentation.component,stream:"webRtc",type:metricId,stream_type:"composed_metrics",units:units};json[metricId]=metrics;sendPost(JSON.stringify(json))}else if(stat.type==="outbound-rtp"&&(stat.isRemote===false&&stat.id.toLowerCase().includes("outbound"))){var metricId="webrtc_outbound_"+stat.mediaType+"_"+stat.ssrc;var metrics={bytesSent:(stat.bytesSent-_this.stats.outbound[stat.mediaType].bytesSent)/_this.statsInterval,packetsSent:(stat.packetsSent-_this.stats.outbound[stat.mediaType].packetsSent)/_this.statsInterval};var units={bytesSent:"bytes",packetsSent:"packets"};if(stat.mediaType==="video"){metrics["framesEncoded"]=(stat.framesEncoded-_this.stats.outbound.video.framesEncoded)/_this.statsInterval;units["framesEncoded"]="frames";_this.stats.outbound.video.framesEncoded=stat.framesEncoded}_this.stats.outbound[stat.mediaType].bytesSent=stat.bytesSent;_this.stats.outbound[stat.mediaType].packetsSent=stat.packetsSent;json={"@timestamp":new Date(stat.timestamp).toISOString(),exec:instrumentation.exec,component:instrumentation.component,stream:"webRtc",type:metricId,stream_type:"composed_metrics",units:units};json[metricId]=metrics;sendPost(JSON.stringify(json))}})}else if(DetectRTC.browser.name==="Chrome"){for(var _i=0,_a=Object.keys(stats);_i<_a.length;_i++){var key=_a[_i];var stat=stats[key];if(stat.type==="ssrc"){var json={};if("bytesReceived"in stat&&(stat.mediaType==="audio"&&"audioOutputLevel"in stat||stat.mediaType==="video"&&"qpSum"in stat)){var metricId="webrtc_inbound_"+stat.mediaType+"_"+stat.ssrc;var metrics={bytesReceived:(stat.bytesReceived-_this.stats.inbound[stat.mediaType].bytesReceived)/_this.statsInterval,jitter:stat.googJitterBufferMs,packetsReceived:(stat.packetsReceived-_this.stats.inbound[stat.mediaType].packetsReceived)/_this.statsInterval,packetsLost:(stat.packetsLost-_this.stats.inbound[stat.mediaType].packetsLost)/_this.statsInterval};var units={bytesReceived:"bytes",jitter:"ms",packetsReceived:"packets",packetsLost:"packets"};if(stat.mediaType==="video"){metrics["framesDecoded"]=(stat.framesDecoded-_this.stats.inbound.video.framesDecoded)/_this.statsInterval;metrics["nackCount"]=(stat.googNacksSent-_this.stats.inbound.video.nackCount)/_this.statsInterval;units["framesDecoded"]="frames";units["nackCount"]="packets";_this.stats.inbound.video.framesDecoded=stat.framesDecoded;_this.stats.inbound.video.nackCount=stat.googNacksSent}_this.stats.inbound[stat.mediaType].bytesReceived=stat.bytesReceived;_this.stats.inbound[stat.mediaType].packetsReceived=stat.packetsReceived;_this.stats.inbound[stat.mediaType].packetsLost=stat.packetsLost;json={"@timestamp":new Date(stat.timestamp).toISOString(),exec:instrumentation.exec,component:instrumentation.component,stream:"webRtc",type:metricId,stream_type:"composed_metrics",units:units};json[metricId]=metrics;sendPost(JSON.stringify(json))}else if("bytesSent"in stat){var metricId="webrtc_outbound_"+stat.mediaType+"_"+stat.ssrc;var metrics={bytesSent:(stat.bytesSent-_this.stats.outbound[stat.mediaType].bytesSent)/_this.statsInterval,packetsSent:(stat.packetsSent-_this.stats.outbound[stat.mediaType].packetsSent)/_this.statsInterval};var units={bytesSent:"bytes",packetsSent:"packets"};if(stat.mediaType==="video"){metrics["framesEncoded"]=(stat.framesEncoded-_this.stats.outbound.video.framesEncoded)/_this.statsInterval;units["framesEncoded"]="frames";_this.stats.outbound.video.framesEncoded=stat.framesEncoded}_this.stats.outbound[stat.mediaType].bytesSent=stat.bytesSent;_this.stats.outbound[stat.mediaType].packetsSent=stat.packetsSent;json={"@timestamp":new Date(stat.timestamp).toISOString(),exec:instrumentation.exec,component:instrumentation.component,stream:"webRtc",type:metricId,stream_type:"composed_metrics",units:units};json[metricId]=metrics;sendPost(JSON.stringify(json))}}}}};this.getStatsAgnostic(this.stream.getRTCPeerConnection(),null,f,function(error){console.log(error)})};WebRtcStats.prototype.standardizeReport=function(response){if(DetectRTC.browser.name==="Firefox"){return response}var standardReport={};response.result().forEach(function(report){var standardStats={id:report.id,timestamp:report.timestamp,type:report.type};report.names().forEach(function(name){standardStats[name]=report.stat(name)});standardReport[standardStats.id]=standardStats});return standardReport};WebRtcStats.prototype.getStatsAgnostic=function(pc,selector,successCb,failureCb){var _this=this;if(DetectRTC.browser.name==="Firefox"){return pc.getStats(selector,function(response){var report=_this.standardizeReport(response);successCb(report)},failureCb)}else if(DetectRTC.browser.name==="Chrome"){return pc.getStats(function(response){var report=_this.standardizeReport(response);successCb(report)},selector,failureCb)}};return WebRtcStats}();exports.WebRtcStats=WebRtcStats},{"../KurentoUtils/DetectRTC":39}],63:[function(require,module,exports){window.getScreenId=function(callback){if(!!navigator.mozGetUserMedia){callback(null,"firefox",{video:{mozMediaSource:"window",mediaSource:"window"}});return}window.addEventListener("message",onIFrameCallback);function onIFrameCallback(event){if(!event.data)return;if(event.data.chromeMediaSourceId){if(event.data.chromeMediaSourceId==="PermissionDeniedError"){callback("permission-denied")}else callback(null,event.data.chromeMediaSourceId,getScreenConstraints(null,event.data.chromeMediaSourceId))}if(event.data.chromeExtensionStatus){callback(event.data.chromeExtensionStatus,null,getScreenConstraints(event.data.chromeExtensionStatus))}window.removeEventListener("message",onIFrameCallback)}setTimeout(postGetSourceIdMessage,100)};function getScreenConstraints(error,sourceId){var screen_constraints={audio:false,video:{mandatory:{chromeMediaSource:error?"screen":"desktop",maxWidth:window.screen.width>1920?window.screen.width:1920,maxHeight:window.screen.height>1080?window.screen.height:1080},optional:[]}};if(sourceId){screen_constraints.video.mandatory.chromeMediaSourceId=sourceId}return screen_constraints}function postGetSourceIdMessage(){if(!iframe){loadIFrame(postGetSourceIdMessage);return}if(!iframe.isLoaded){setTimeout(postGetSourceIdMessage,100);return}iframe.contentWindow.postMessage({captureSourceId:true},"*")}var iframe;window.getScreenConstraints=function(callback){loadIFrame(function(){getScreenId(function(error,sourceId,screen_constraints){callback(error,screen_constraints.video)})})};function loadIFrame(loadCallback){if(iframe){loadCallback();return}iframe=document.createElement("iframe");iframe.onload=function(){iframe.isLoaded=true;loadCallback()};iframe.src="https://www.webrtc-experiment.com/getSourceId/";iframe.style.display="none";(document.body||document.documentElement).appendChild(iframe)}window.getChromeExtensionStatus=function(callback){if(!!navigator.mozGetUserMedia){callback("installed-enabled");return}window.addEventListener("message",onIFrameCallback);function onIFrameCallback(event){if(!event.data)return;if(event.data.chromeExtensionStatus){callback(event.data.chromeExtensionStatus)}window.removeEventListener("message",onIFrameCallback)}setTimeout(postGetChromeExtensionStatusMessage,100)};function postGetChromeExtensionStatusMessage(){if(!iframe){loadIFrame(postGetChromeExtensionStatusMessage);return}if(!iframe.isLoaded){setTimeout(postGetChromeExtensionStatusMessage,100);return}iframe.contentWindow.postMessage({getChromeExtensionStatus:true},"*")}exports.getScreenId=getScreenId;exports.getChromeExtensionStatus=getChromeExtensionStatus},{}]},{},[51]);