diff --git a/JitsiConferenceEvents.js b/JitsiConferenceEvents.js index 04406355a..825f0596d 100644 --- a/JitsiConferenceEvents.js +++ b/JitsiConferenceEvents.js @@ -87,7 +87,7 @@ var JitsiConferenceEvents = { /** * Indicates that start muted settings changed. */ - START_MUTED: "conference.start_muted", + START_MUTED_POLICY_CHANGED: "conference.start_muted_policy_changed", /** * Indicates that DTMF support changed. */ diff --git a/lib-jitsi-meet.js b/lib-jitsi-meet.js index ec69dd060..56d6b4f01 100644 --- a/lib-jitsi-meet.js +++ b/lib-jitsi-meet.js @@ -1026,7 +1026,7 @@ var JitsiConferenceEvents = { /** * Indicates that start muted settings changed. */ - START_MUTED: "conference.start_muted", + START_MUTED_POLICY_CHANGED: "conference.start_muted_policy_changed", /** * Indicates that DTMF support changed. */ diff --git a/lib-jitsi-meet.min.js b/lib-jitsi-meet.min.js index cf6bfa6df..80d434d9b 100644 --- a/lib-jitsi-meet.min.js +++ b/lib-jitsi-meet.min.js @@ -1,5 +1,5 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JitsiMeetJS=f()}})(function(){var define,module,exports;return 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;oquery>feature[var="urn:xmpp:jingle:dtmf:0"]').length>0;this.updateDTMFSupport()}.bind(this))};JitsiConference.prototype.onMemberLeft=function(jid){var id=Strophe.getResourceFromJid(jid);if(id==="focus"||this.myUserId()===id){return}var participant=this.participants[id];delete this.participants[id];this.eventEmitter.emit(JitsiConferenceEvents.USER_LEFT,id,participant)};JitsiConference.prototype.onUserRoleChanged=function(jid,role){var id=Strophe.getResourceFromJid(jid);var participant=this.getParticipantById(id);if(!participant){return}participant._role=role;this.eventEmitter.emit(JitsiConferenceEvents.USER_ROLE_CHANGED,id,role)};JitsiConference.prototype.onDisplayNameChanged=function(jid,displayName){var id=Strophe.getResourceFromJid(jid);var participant=this.getParticipantById(id);if(!participant){return}participant._displayName=displayName;this.eventEmitter.emit(JitsiConferenceEvents.DISPLAY_NAME_CHANGED,id,displayName)};JitsiConference.prototype.onTrackAdded=function(track){var id=track.getParticipantId();var participant=this.getParticipantById(id);if(!participant){return}participant._tracks.push(track);var emitter=this.eventEmitter;track.addEventListener(JitsiTrackEvents.TRACK_STOPPED,function(){var pos=participant._tracks.indexOf(track);if(pos>-1){participant._tracks.splice(pos,1)}emitter.emit(JitsiConferenceEvents.TRACK_REMOVED,track)});track.addEventListener(JitsiTrackEvents.TRACK_MUTE_CHANGED,function(){emitter.emit(JitsiConferenceEvents.TRACK_MUTE_CHANGED,track)});track.addEventListener(JitsiTrackEvents.TRACK_AUDIO_LEVEL_CHANGED,function(audioLevel){emitter.emit(JitsiConferenceEvents.TRACK_AUDIO_LEVEL_CHANGED,id,audioLevel)});this.eventEmitter.emit(JitsiConferenceEvents.TRACK_ADDED,track)};JitsiConference.prototype.updateDTMFSupport=function(){var somebodySupportsDTMF=false;var participants=this.getParticipants();for(var i=0;i-1)self._dataChannels=self._dataChannels.splice(idx,1)};this._dataChannels.push(dataChannel)};DataChannels.prototype.handleSelectedEndpointEvent=function(userResource){this._onXXXEndpointChanged("selected",userResource)};DataChannels.prototype.handlePinnedEndpointEvent=function(userResource){this._onXXXEndpointChanged("pinnned",userResource)};DataChannels.prototype._onXXXEndpointChanged=function(xxx,userResource){var head=xxx.charAt(0);var tail=xxx.substring(1);var lower=head.toLowerCase()+tail;var upper=head.toUpperCase()+tail;console.log(lower+" endpoint changed: ",userResource);this._some(function(dataChannel){if(dataChannel.readyState=="open"){console.log("sending "+lower+" endpoint changed notification to the bridge: ",userResource);var jsonObject={};jsonObject.colibriClass=upper+"EndpointChangedEvent";jsonObject[lower+"Endpoint"]=userResource?userResource:null;dataChannel.send(JSON.stringify(jsonObject));return true}})};DataChannels.prototype._some=function(callback,thisArg){var dataChannels=this._dataChannels;if(dataChannels&&dataChannels.length!==0){if(thisArg)return dataChannels.some(callback,thisArg);else return dataChannels.some(callback)}else{return false}};module.exports=DataChannels}).call(this,"/modules/RTC/DataChannels.js")},{"../../service/RTC/RTCEvents":80,"jitsi-meet-logger":48}],13:[function(require,module,exports){ -var JitsiTrack=require("./JitsiTrack");var RTCBrowserType=require("./RTCBrowserType");var JitsiTrackEvents=require("../../JitsiTrackEvents");var RTCUtils=require("./RTCUtils");function JitsiLocalTrack(stream,videoType,resolution){this.videoType=videoType;this.dontFireRemoveEvent=false;this.resolution=resolution;this.startMuted=false;var self=this;JitsiTrack.call(this,null,stream,function(){if(!this.dontFireRemoveEvent)this.eventEmitter.emit(JitsiTrackEvents.TRACK_STOPPED);this.dontFireRemoveEvent=false}.bind(this))}JitsiLocalTrack.prototype=Object.create(JitsiTrack.prototype);JitsiLocalTrack.prototype.constructor=JitsiLocalTrack;JitsiLocalTrack.prototype._setMute=function(mute){if(this.isMuted()===mute){return}if(!this.rtc){this.startMuted=mute;return}var isAudio=this.type===JitsiTrack.AUDIO;this.dontFireRemoveEvent=false;if(window.location.protocol!="https:"||isAudio||this.videoType==="desktop"||RTCBrowserType.isFirefox()){var tracks=this._getTracks();for(var idx=0;idx0?JitsiTrack.VIDEO:JitsiTrack.AUDIO;if(this.type=="audio"){this._getTracks=function(){return this.stream.getAudioTracks()}.bind(this)}else{this._getTracks=function(){return this.stream.getVideoTracks()}.bind(this)}if(RTCBrowserType.isFirefox()&&this.stream){implementOnEndedHandling(this)}if(stream)addMediaStreamInactiveHandler(stream,streamInactiveHandler)}JitsiTrack.VIDEO="video";JitsiTrack.AUDIO="audio";JitsiTrack.prototype.getType=function(){return this.type};JitsiTrack.prototype.isAudioTrack=function(){return this.getType()===JitsiTrack.AUDIO};JitsiTrack.prototype.isVideoTrack=function(){return this.getType()===JitsiTrack.VIDEO};JitsiTrack.prototype.getOriginalStream=function(){return this.stream};JitsiTrack.prototype.mute=function(){this._setMute(true)};JitsiTrack.prototype.unmute=function(){this._setMute(false)};JitsiTrack.prototype.attach=function(container){if(this.stream)require("./RTCUtils").attachMediaStream(container,this.stream);this.containers.push(container)};JitsiTrack.prototype.detach=function(container){for(var i=0;ivideo").remove()}}if(container)$(container).find(">video").remove()};JitsiTrack.prototype.stop=function(){};JitsiTrack.prototype.isScreenSharing=function(){};JitsiTrack.prototype._getId=function(){var tracks=this.stream.getTracks();if(!tracks||tracks.length===0)return null;return tracks[0].id};JitsiTrack.prototype.getId=function(){return RTC.getStreamID(this.stream)};JitsiTrack.prototype.isActive=function(){if(typeof this.stream.active!=="undefined")return this.stream.active;else return true};JitsiTrack.prototype.on=function(eventId,handler){if(this.eventEmitter)this.eventEmitter.on(eventId,handler)};JitsiTrack.prototype.off=function(eventId,handler){if(this.eventEmitter)this.eventEmitter.removeListener(eventId,handler)};JitsiTrack.prototype.addEventListener=JitsiTrack.prototype.on;JitsiTrack.prototype.removeEventListener=JitsiTrack.prototype.off;JitsiTrack.prototype.setAudioLevel=function(audioLevel){if(this.audioLevel!==audioLevel){this.eventEmitter.emit(JitsiTrackEvents.TRACK_AUDIO_LEVEL_CHANGED,audioLevel);this.audioLevel=audioLevel}};module.exports=JitsiTrack},{"../../JitsiTrackEvents":10,"./RTCBrowserType":17,"./RTCUtils":18,events:44}],16:[function(require,module,exports){var EventEmitter=require("events");var RTCBrowserType=require("./RTCBrowserType");var RTCUtils=require("./RTCUtils.js");var JitsiTrack=require("./JitsiTrack");var JitsiLocalTrack=require("./JitsiLocalTrack.js");var DataChannels=require("./DataChannels");var JitsiRemoteTrack=require("./JitsiRemoteTrack.js");var DesktopSharingEventTypes=require("../../service/desktopsharing/DesktopSharingEventTypes");var MediaStreamType=require("../../service/RTC/MediaStreamTypes");var RTCEvents=require("../../service/RTC/RTCEvents.js");function createLocalTracks(streams){var newStreams=[];for(var i=0;i-1){this.localStreams.splice(pos,1)}};RTC.prototype.createRemoteStream=function(data,sid,thessrc){var remoteStream=new JitsiRemoteTrack(this,data,sid,thessrc);if(!data.peerjid)return;var jid=Strophe.getResourceFromJid(data.peerjid);if(!this.remoteStreams[jid]){this.remoteStreams[jid]={}}this.remoteStreams[jid][remoteStream.type]=remoteStream;return remoteStream};RTC.getPCConstraints=function(){return RTCUtils.pc_constraints};RTC.attachMediaStream=function(elSelector,stream){RTCUtils.attachMediaStream(elSelector,stream)};RTC.getStreamID=function(stream){return RTCUtils.getStreamID(stream)};RTC.getVideoSrc=function(element){return RTCUtils.getVideoSrc(element)};RTC.isDeviceListAvailable=function(){return RTCUtils.isDeviceListAvailable()};RTC.isDeviceChangeAvailable=function(){return RTCUtils.isDeviceChangeAvailable()};RTC.enumerateDevices=function(callback){RTCUtils.enumerateDevices(callback)};RTC.setVideoSrc=function(element,src){RTCUtils.setVideoSrc(element,src)};RTC.stopMediaStream=function(mediaStream){RTCUtils.stopMediaStream(mediaStream)};RTC.isDesktopSharingEnabled=function(){return RTCUtils.isDesktopSharingEnabled()};RTC.prototype.getVideoElementName=function(){return RTCBrowserType.isTemasysPluginUsed()?"object":"video"};RTC.prototype.dispose=function(){};RTC.prototype.switchVideoStreams=function(newStream){this.localVideo.stream=newStream;this.localStreams=[];if(this.localAudio.getOriginalStream()!=newStream)this.localStreams.push(this.localAudio);this.localStreams.push(this.localVideo)};RTC.prototype.setAudioLevel=function(jid,audioLevel){if(!jid)return;var resource=Strophe.getResourceFromJid(jid);if(this.remoteStreams[resource]&&this.remoteStreams[resource][JitsiTrack.AUDIO])this.remoteStreams[resource][JitsiTrack.AUDIO].setAudioLevel(audioLevel)};module.exports=RTC},{"../../service/RTC/MediaStreamTypes":79,"../../service/RTC/RTCEvents.js":80,"../../service/desktopsharing/DesktopSharingEventTypes":84,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,events:44}],17:[function(require,module,exports){var currentBrowser;var browserVersion;var isAndroid;var RTCBrowserType={RTC_BROWSER_CHROME:"rtc_browser.chrome",RTC_BROWSER_OPERA:"rtc_browser.opera",RTC_BROWSER_FIREFOX:"rtc_browser.firefox",RTC_BROWSER_IEXPLORER:"rtc_browser.iexplorer",RTC_BROWSER_SAFARI:"rtc_browser.safari",getBrowserType:function(){return currentBrowser},isChrome:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_CHROME},isOpera:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_OPERA},isFirefox:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_FIREFOX},isIExplorer:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_IEXPLORER},isSafari:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_SAFARI},isTemasysPluginUsed:function(){return RTCBrowserType.isIExplorer()||RTCBrowserType.isSafari()},getFirefoxVersion:function(){return RTCBrowserType.isFirefox()?browserVersion:null},getChromeVersion:function(){return RTCBrowserType.isChrome()?browserVersion:null},usesPlanB:function(){return RTCBrowserType.isChrome()||RTCBrowserType.isOpera()||RTCBrowserType.isTemasysPluginUsed()},usesUnifiedPlan:function(){return RTCBrowserType.isFirefox()},isAndroid:function(){return isAndroid}};function detectChrome(){if(navigator.webkitGetUserMedia){currentBrowser=RTCBrowserType.RTC_BROWSER_CHROME;var userAgent=navigator.userAgent.toLowerCase();var ver=parseInt(userAgent.match(/chrome\/(\d+)\./)[1],10);console.log("This appears to be Chrome, ver: "+ver);return ver}return null}function detectOpera(){var userAgent=navigator.userAgent;if(userAgent.match(/Opera|OPR/)){currentBrowser=RTCBrowserType.RTC_BROWSER_OPERA;var version=userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2];console.info("This appears to be Opera, ver: "+version);return version}return null}function detectFirefox(){if(navigator.mozGetUserMedia){currentBrowser=RTCBrowserType.RTC_BROWSER_FIREFOX;var version=parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1],10);console.log("This appears to be Firefox, ver: "+version);return version}return null}function detectSafari(){if(/^((?!chrome).)*safari/i.test(navigator.userAgent)){currentBrowser=RTCBrowserType.RTC_BROWSER_SAFARI;console.info("This appears to be Safari");return 1}return null}function detectIE(){var version;var ua=window.navigator.userAgent;var msie=ua.indexOf("MSIE ");if(msie>0){version=parseInt(ua.substring(msie+5,ua.indexOf(".",msie)),10)}var trident=ua.indexOf("Trident/");if(!version&&trident>0){var rv=ua.indexOf("rv:");version=parseInt(ua.substring(rv+3,ua.indexOf(".",rv)),10)}var edge=ua.indexOf("Edge/");if(!version&&edge>0){version=parseInt(ua.substring(edge+5,ua.indexOf(".",edge)),10)}if(version){currentBrowser=RTCBrowserType.RTC_BROWSER_IEXPLORER;console.info("This appears to be IExplorer, ver: "+version)}return version}function detectBrowser(){var version;var detectors=[detectOpera,detectChrome,detectFirefox,detectIE,detectSafari];for(var i=0;i=0){constraints.video={mandatory:{},optional:[]};if(options.cameraDeviceId){constraints.video.optional.push({sourceId:options.cameraDeviceId})}constraints.video.optional.push({googLeakyBucket:true});setResolutionConstraints(constraints,options.resolution)}if(um.indexOf("audio")>=0){if(!RTCBrowserType.isFirefox()){constraints.audio={mandatory:{},optional:[]};if(options.micDeviceId){constraints.audio.optional.push({sourceId:options.micDeviceId})}constraints.audio.optional.push({googEchoCancellation:true},{googAutoGainControl:true},{googNoiseSupression:true},{googHighpassFilter:true},{googNoisesuppression2:true},{googEchoCancellation2:true},{googAutoGainControl2:true})}else{if(options.micDeviceId){constraints.audio={mandatory:{},optional:[{sourceId:options.micDeviceId}]}}else{constraints.audio=true}}}if(um.indexOf("screen")>=0){if(RTCBrowserType.isChrome()){constraints.video={mandatory:{chromeMediaSource:"screen",googLeakyBucket:true,maxWidth:window.screen.width,maxHeight:window.screen.height,maxFrameRate:3},optional:[]}}else if(RTCBrowserType.isTemasysPluginUsed()){constraints.video={optional:[{sourceId:AdapterJS.WebRTCPlugin.plugin.screensharingKey}]}}else if(RTCBrowserType.isFirefox()){constraints.video={mozMediaSource:"window",mediaSource:"window"}}else{logger.error("'screen' WebRTC media source is supported only in Chrome"+" and with Temasys plugin")}}if(um.indexOf("desktop")>=0){constraints.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:options.desktopStream,googLeakyBucket:true,maxWidth:window.screen.width,maxHeight:window.screen.height,maxFrameRate:3},optional:[]}}if(options.bandwidth){if(!constraints.video){constraints.video={mandatory:{},optional:[]}}constraints.video.optional.push({bandwidth:options.bandwidth})}if(options.fps){if(!constraints.video){constraints.video={mandatory:{},optional:[]}}constraints.video.mandatory.minFrameRate=options.fps}if(RTCBrowserType.isFirefox()&&options.firefox_fake_device){constraints.fake=true}return constraints}function setAvailableDevices(um,available){if(um.indexOf("video")!=-1){devices.video=available}if(um.indexOf("audio")!=-1){devices.audio=available}eventEmitter.emit(RTCEvents.AVAILABLE_DEVICES_CHANGED,devices)}function onReady(options,GUM){rtcReady=true;eventEmitter.emit(RTCEvents.RTC_READY,true);screenObtainer.init(eventEmitter,options,GUM)}function maybeApply(fn,args){if(fn){fn.apply(null,args||[])}}var getUserMediaStatus={initialized:false,callbacks:[]};function wrapGetUserMedia(getUserMedia){return function(constraints,successCallback,errorCallback){getUserMedia(constraints,function(stream){maybeApply(successCallback,[stream]);if(!getUserMediaStatus.initialized){getUserMediaStatus.initialized=true;getUserMediaStatus.callbacks.forEach(function(callback){callback()});getUserMediaStatus.callbacks.length=0}},function(error){maybeApply(errorCallback,[error])})}}function createAutoDeviceInfo(kind){return{facing:null,label:"Auto",kind:kind,deviceId:"",groupId:null}}function afterUserMediaInitialized(callback){if(getUserMediaStatus.initialized){callback()}else{getUserMediaStatus.callbacks.push(callback)}}function wrapEnumerateDevices(enumerateDevices){return function(callback){afterUserMediaInitialized(function(){enumerateDevices().then(function(devices){devices.unshift(createAutoDeviceInfo("audioinput"),createAutoDeviceInfo("videoinput"));callback(devices)},function(err){console.error("cannot enumerate devices: ",err);callback([createAutoDeviceInfo("audioInput"),createAutoDeviceInfo("videoinput")])})})}}function enumerateDevicesThroughMediaStreamTrack(callback){MediaStreamTrack.getSources(function(sources){var devices=sources.map(function(source){var kind=(source.kind||"").toLowerCase();return{facing:source.facing||null,label:source.label,kind:kind?kind+"input":null,deviceId:source.id,groupId:source.groupId||null}});devices.unshift(createAutoDeviceInfo("audioinput"),createAutoDeviceInfo("videoinput"));callback(devices)})}function obtainDevices(options){if(!options.devices||options.devices.length===0){return options.successCallback(options.streams||{})}var device=options.devices.splice(0,1);var devices=[];devices.push(device);options.deviceGUM[device](function(stream){options.streams=options.streams||{};options.streams[device]=stream;obtainDevices(options)},function(error){Object.keys(options.streams).forEach(function(device){RTCUtils.stopMediaStream(options.streams[device])});logger.error("failed to obtain "+device+" stream - stop",error);options.errorCallback(JitsiTrackErrors.parseError(error,devices))})}function handleLocalStream(streams,resolution){var audioStream,videoStream,desktopStream,res=[];if(window.webkitMediaStream){var audioVideo=streams.audioVideo;if(audioVideo){var audioTracks=audioVideo.getAudioTracks();if(audioTracks.length){audioStream=new webkitMediaStream;for(var i=0;i= 40.");reject(new Error("Firefox version too old: "+FFversion+". Required >= 40."));return}this.peerconnection=mozRTCPeerConnection;this.getUserMedia=wrapGetUserMedia(navigator.mozGetUserMedia.bind(navigator));this.enumerateDevices=wrapEnumerateDevices(navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices));this.pc_constraints={};this.attachMediaStream=function(element,stream){if(!element[0])return;element[0].mozSrcObject=stream;element[0].play()};this.getStreamID=function(stream){var id=stream.id;if(!id){var tracks=stream.getVideoTracks();if(!tracks||tracks.length===0){tracks=stream.getAudioTracks()}id=tracks[0].id}return SDPUtil.filter_special_chars(id)};this.getVideoSrc=function(element){if(!element)return null;return element.mozSrcObject};this.setVideoSrc=function(element,src){if(element)element.mozSrcObject=src};RTCSessionDescription=mozRTCSessionDescription;RTCIceCandidate=mozRTCIceCandidate}else if(RTCBrowserType.isChrome()||RTCBrowserType.isOpera()){this.peerconnection=webkitRTCPeerConnection;var getUserMedia=navigator.webkitGetUserMedia.bind(navigator);if(navigator.mediaDevices){this.getUserMedia=wrapGetUserMedia(getUserMedia);this.enumerateDevices=wrapEnumerateDevices(navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices))}else{this.getUserMedia=getUserMedia;this.enumerateDevices=enumerateDevicesThroughMediaStreamTrack}this.attachMediaStream=function(element,stream){if(!stream.jitsiObjectURL){stream.jitsiObjectURL=webkitURL.createObjectURL(stream)}element.attr("src",stream.jitsiObjectURL)};this.getStreamID=function(stream){return SDPUtil.filter_special_chars(stream.id)};this.getVideoSrc=function(element){if(!element)return null;return element.getAttribute("src")};this.setVideoSrc=function(element,src){if(element)element.setAttribute("src",src)};this.pc_constraints={optional:[{DtlsSrtpKeyAgreement:"true"}]};if(options.useIPv6){this.pc_constraints.optional.push({googIPv6:true})}if(RTCBrowserType.isAndroid()){this.pc_constraints={}}if(!webkitMediaStream.prototype.getVideoTracks){webkitMediaStream.prototype.getVideoTracks=function(){return this.videoTracks}}if(!webkitMediaStream.prototype.getAudioTracks){webkitMediaStream.prototype.getAudioTracks=function(){return this.audioTracks}}}else if(RTCBrowserType.isTemasysPluginUsed()){var self=this;AdapterJS.webRTCReady(function(isPlugin){self.peerconnection=RTCPeerConnection;self.getUserMedia=window.getUserMedia;self.enumerateDevices=enumerateDevicesThroughMediaStreamTrack;self.attachMediaStream=function(elSel,stream){if(stream.id==="dummyAudio"||stream.id==="dummyVideo"){return}attachMediaStream(elSel[0],stream)};self.getStreamID=function(stream){var id=SDPUtil.filter_special_chars(stream.label);return id};self.getVideoSrc=function(element){if(!element){logger.warn("Attempt to get video SRC of null element");return null}var children=element.children;for(var i=0;i!==children.length;++i){if(children[i].name==="streamId"){return children[i].value}}return null};self.setVideoSrc=function(element,src){if(!src){logger.warn("Not attaching video stream, 'src' is null");return}AdapterJS.WebRTCPlugin.WaitForPluginReady();var stream=AdapterJS.WebRTCPlugin.plugin.getStreamWithId(AdapterJS.WebRTCPlugin.pageId,src);attachMediaStream(element,stream)};onReady(options,self.getUserMediaWithConstraints);resolve()})}else{try{logger.error("Browser does not appear to be WebRTC-capable")}catch(e){}reject("Browser does not appear to be WebRTC-capable");return}if(!RTCBrowserType.isTemasysPluginUsed()){onReady(options,this.getUserMediaWithConstraints);resolve()}}.bind(this))},getUserMediaWithConstraints:function(um,success_callback,failure_callback,options){options=options||{};var resolution=options.resolution;var constraints=getConstraints(um,options);logger.info("Get media constraints",constraints);try{this.getUserMedia(constraints,function(stream){logger.log("onUserMediaSuccess");setAvailableDevices(um,true);success_callback(stream)},function(error){setAvailableDevices(um,false);logger.warn("Failed to get access to local media. Error ",error,constraints);if(failure_callback){failure_callback(error,resolution)}})}catch(e){logger.error("GUM failed: ",e);if(failure_callback){failure_callback(e)}}},obtainAudioAndVideoPermissions:function(options){var self=this;options=options||{};return new Promise(function(resolve,reject){var successCallback=function(stream){resolve(handleLocalStream(stream,options.resolution))};options.devices=options.devices||["audio","video"];if(!screenObtainer.isSupported()&&options.devices.indexOf("desktop")!==-1){reject(new Error("Desktop sharing is not supported!"))}if(RTCBrowserType.isFirefox()||RTCBrowserType.isTemasysPluginUsed()){var GUM=function(device,s,e){this.getUserMediaWithConstraints(device,s,e,options)};var deviceGUM={audio:GUM.bind(self,["audio"]),video:GUM.bind(self,["video"])};if(screenObtainer.isSupported()){deviceGUM["desktop"]=screenObtainer.obtainStream.bind(screenObtainer)}obtainDevices({devices:options.devices,streams:[],successCallback:successCallback,errorCallback:reject,deviceGUM:deviceGUM})}else{var hasDesktop=options.devices.indexOf("desktop")>-1;if(hasDesktop){options.devices.splice(options.devices.indexOf("desktop"),1)}options.resolution=options.resolution||"360";if(options.devices.length){this.getUserMediaWithConstraints(options.devices,function(stream){if(options.devices.indexOf("audio")!==-1&&!stream.getAudioTracks().length||options.devices.indexOf("video")!==-1&&!stream.getVideoTracks().length){self.stopMediaStream(stream);reject(JitsiTrackErrors.parseError(new Error("Unable to get the audio and "+"video tracks."),options.devices));return}if(hasDesktop){screenObtainer.obtainStream(function(desktopStream){successCallback({audioVideo:stream,desktopStream:desktopStream})},function(error){self.stopMediaStream(stream);reject(JitsiTrackErrors.parseError(error,options.devices))})}else{successCallback({audioVideo:stream})}},function(error){reject(JitsiTrackErrors.parseError(error,options.devices))},options)}else if(hasDesktop){screenObtainer.obtainStream(function(stream){successCallback({desktopStream:stream})},function(error){reject(JitsiTrackErrors.parseError(error,["desktop"]))})}}}.bind(this))},addListener:function(eventType,listener){eventEmitter.on(eventType,listener)},removeListener:function(eventType,listener){eventEmitter.removeListener(eventType,listener)},getDeviceAvailability:function(){return devices},isRTCReady:function(){return rtcReady},isDeviceListAvailable:function(){var isEnumerateDevicesAvailable=navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices;if(isEnumerateDevicesAvailable){return true}return MediaStreamTrack&&MediaStreamTrack.getSources?true:false},isDeviceChangeAvailable:function(){if(RTCBrowserType.isChrome()||RTCBrowserType.isOpera()||RTCBrowserType.isTemasysPluginUsed())return true;return false},stopMediaStream:function(mediaStream){mediaStream.getTracks().forEach(function(track){if(track.stop){track.stop()}});if(mediaStream.stop){mediaStream.stop()}if(mediaStream.jitsiObjectURL){webkitURL.revokeObjectURL(mediaStream.jitsiObjectURL)}},isDesktopSharingEnabled:function(){return screenObtainer.isSupported()}};module.exports=RTCUtils}).call(this,"/modules/RTC/RTCUtils.js")},{"../../JitsiTrackErrors":9,"../../service/RTC/RTCEvents":80,"../../service/RTC/Resolutions":81,"../xmpp/SDPUtil":32,"./RTCBrowserType":17,"./ScreenObtainer":19,"./adapter.screenshare":20,events:44,"jitsi-meet-logger":48}],19:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var RTCBrowserType=require("./RTCBrowserType");var AdapterJS=require("./adapter.screenshare");var DesktopSharingEventTypes=require("../../service/desktopsharing/DesktopSharingEventTypes");var chromeExtInstalled=false;var chromeExtUpdateRequired=false;var firefoxExtInstalled=null;var reDetectFirefoxExtension=false;var GUM=null;var ScreenObtainer={eventEmitter:null,obtainStream:null,init:function(eventEmitter,options,gum){this.eventEmitter=eventEmitter;var obtainDesktopStream=null;this.options=options=options||{};GUM=gum;if(RTCBrowserType.isFirefox())initFirefoxExtensionDetection(options);var chromeMethod=options.desktopSharingChromeMethod||options.desktopSharing;if(RTCBrowserType.isTemasysPluginUsed()){if(!AdapterJS.WebRTCPlugin.plugin.HasScreensharingFeature){logger.info("Screensharing not supported by this plugin "+"version")}else if(!AdapterJS.WebRTCPlugin.plugin.isScreensharingAvailable){logger.info("Screensharing not available with Temasys plugin on"+" this site")}else{obtainDesktopStream=obtainWebRTCScreen;logger.info("Using Temasys plugin for desktop sharing")}}else if(RTCBrowserType.isChrome()){if(chromeMethod=="ext"){if(RTCBrowserType.getChromeVersion()>=34){obtainDesktopStream=this.obtainScreenFromExtension; +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.JitsiMeetJS=f()}})(function(){var define,module,exports;return 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;oquery>feature[var="urn:xmpp:jingle:dtmf:0"]').length>0;this.updateDTMFSupport()}.bind(this))};JitsiConference.prototype.onMemberLeft=function(jid){var id=Strophe.getResourceFromJid(jid);if(id==="focus"||this.myUserId()===id){return}var participant=this.participants[id];delete this.participants[id];this.eventEmitter.emit(JitsiConferenceEvents.USER_LEFT,id,participant)};JitsiConference.prototype.onUserRoleChanged=function(jid,role){var id=Strophe.getResourceFromJid(jid);var participant=this.getParticipantById(id);if(!participant){return}participant._role=role;this.eventEmitter.emit(JitsiConferenceEvents.USER_ROLE_CHANGED,id,role)};JitsiConference.prototype.onDisplayNameChanged=function(jid,displayName){var id=Strophe.getResourceFromJid(jid);var participant=this.getParticipantById(id);if(!participant){return}participant._displayName=displayName;this.eventEmitter.emit(JitsiConferenceEvents.DISPLAY_NAME_CHANGED,id,displayName)};JitsiConference.prototype.onTrackAdded=function(track){var id=track.getParticipantId();var participant=this.getParticipantById(id);if(!participant){return}participant._tracks.push(track);var emitter=this.eventEmitter;track.addEventListener(JitsiTrackEvents.TRACK_STOPPED,function(){var pos=participant._tracks.indexOf(track);if(pos>-1){participant._tracks.splice(pos,1)}emitter.emit(JitsiConferenceEvents.TRACK_REMOVED,track)});track.addEventListener(JitsiTrackEvents.TRACK_MUTE_CHANGED,function(){emitter.emit(JitsiConferenceEvents.TRACK_MUTE_CHANGED,track)});track.addEventListener(JitsiTrackEvents.TRACK_AUDIO_LEVEL_CHANGED,function(audioLevel){emitter.emit(JitsiConferenceEvents.TRACK_AUDIO_LEVEL_CHANGED,id,audioLevel)});this.eventEmitter.emit(JitsiConferenceEvents.TRACK_ADDED,track)};JitsiConference.prototype.updateDTMFSupport=function(){var somebodySupportsDTMF=false;var participants=this.getParticipants();for(var i=0;i-1)self._dataChannels=self._dataChannels.splice(idx,1)};this._dataChannels.push(dataChannel)};DataChannels.prototype.handleSelectedEndpointEvent=function(userResource){this._onXXXEndpointChanged("selected",userResource)};DataChannels.prototype.handlePinnedEndpointEvent=function(userResource){this._onXXXEndpointChanged("pinnned",userResource)};DataChannels.prototype._onXXXEndpointChanged=function(xxx,userResource){var head=xxx.charAt(0);var tail=xxx.substring(1);var lower=head.toLowerCase()+tail;var upper=head.toUpperCase()+tail;console.log(lower+" endpoint changed: ",userResource);this._some(function(dataChannel){if(dataChannel.readyState=="open"){console.log("sending "+lower+" endpoint changed notification to the bridge: ",userResource);var jsonObject={};jsonObject.colibriClass=upper+"EndpointChangedEvent";jsonObject[lower+"Endpoint"]=userResource?userResource:null;dataChannel.send(JSON.stringify(jsonObject));return true}})};DataChannels.prototype._some=function(callback,thisArg){var dataChannels=this._dataChannels;if(dataChannels&&dataChannels.length!==0){if(thisArg)return dataChannels.some(callback,thisArg);else return dataChannels.some(callback)}else{return false}};module.exports=DataChannels}).call(this,"/modules/RTC/DataChannels.js")},{"../../service/RTC/RTCEvents":80,"jitsi-meet-logger":48 +}],13:[function(require,module,exports){var JitsiTrack=require("./JitsiTrack");var RTCBrowserType=require("./RTCBrowserType");var JitsiTrackEvents=require("../../JitsiTrackEvents");var RTCUtils=require("./RTCUtils");function JitsiLocalTrack(stream,videoType,resolution){this.videoType=videoType;this.dontFireRemoveEvent=false;this.resolution=resolution;this.startMuted=false;var self=this;JitsiTrack.call(this,null,stream,function(){if(!this.dontFireRemoveEvent)this.eventEmitter.emit(JitsiTrackEvents.TRACK_STOPPED);this.dontFireRemoveEvent=false}.bind(this))}JitsiLocalTrack.prototype=Object.create(JitsiTrack.prototype);JitsiLocalTrack.prototype.constructor=JitsiLocalTrack;JitsiLocalTrack.prototype._setMute=function(mute){if(this.isMuted()===mute){return}if(!this.rtc){this.startMuted=mute;return}var isAudio=this.type===JitsiTrack.AUDIO;this.dontFireRemoveEvent=false;if(window.location.protocol!="https:"||isAudio||this.videoType==="desktop"||RTCBrowserType.isFirefox()){var tracks=this._getTracks();for(var idx=0;idx0?JitsiTrack.VIDEO:JitsiTrack.AUDIO;if(this.type=="audio"){this._getTracks=function(){return this.stream.getAudioTracks()}.bind(this)}else{this._getTracks=function(){return this.stream.getVideoTracks()}.bind(this)}if(RTCBrowserType.isFirefox()&&this.stream){implementOnEndedHandling(this)}if(stream)addMediaStreamInactiveHandler(stream,streamInactiveHandler)}JitsiTrack.VIDEO="video";JitsiTrack.AUDIO="audio";JitsiTrack.prototype.getType=function(){return this.type};JitsiTrack.prototype.isAudioTrack=function(){return this.getType()===JitsiTrack.AUDIO};JitsiTrack.prototype.isVideoTrack=function(){return this.getType()===JitsiTrack.VIDEO};JitsiTrack.prototype.getOriginalStream=function(){return this.stream};JitsiTrack.prototype.mute=function(){this._setMute(true)};JitsiTrack.prototype.unmute=function(){this._setMute(false)};JitsiTrack.prototype.attach=function(container){if(this.stream)require("./RTCUtils").attachMediaStream(container,this.stream);this.containers.push(container)};JitsiTrack.prototype.detach=function(container){for(var i=0;ivideo").remove()}}if(container)$(container).find(">video").remove()};JitsiTrack.prototype.stop=function(){};JitsiTrack.prototype.isScreenSharing=function(){};JitsiTrack.prototype._getId=function(){var tracks=this.stream.getTracks();if(!tracks||tracks.length===0)return null;return tracks[0].id};JitsiTrack.prototype.getId=function(){return RTC.getStreamID(this.stream)};JitsiTrack.prototype.isActive=function(){if(typeof this.stream.active!=="undefined")return this.stream.active;else return true};JitsiTrack.prototype.on=function(eventId,handler){if(this.eventEmitter)this.eventEmitter.on(eventId,handler)};JitsiTrack.prototype.off=function(eventId,handler){if(this.eventEmitter)this.eventEmitter.removeListener(eventId,handler)};JitsiTrack.prototype.addEventListener=JitsiTrack.prototype.on;JitsiTrack.prototype.removeEventListener=JitsiTrack.prototype.off;JitsiTrack.prototype.setAudioLevel=function(audioLevel){if(this.audioLevel!==audioLevel){this.eventEmitter.emit(JitsiTrackEvents.TRACK_AUDIO_LEVEL_CHANGED,audioLevel);this.audioLevel=audioLevel}};module.exports=JitsiTrack},{"../../JitsiTrackEvents":10,"./RTCBrowserType":17,"./RTCUtils":18,events:44}],16:[function(require,module,exports){var EventEmitter=require("events");var RTCBrowserType=require("./RTCBrowserType");var RTCUtils=require("./RTCUtils.js");var JitsiTrack=require("./JitsiTrack");var JitsiLocalTrack=require("./JitsiLocalTrack.js");var DataChannels=require("./DataChannels");var JitsiRemoteTrack=require("./JitsiRemoteTrack.js");var DesktopSharingEventTypes=require("../../service/desktopsharing/DesktopSharingEventTypes");var MediaStreamType=require("../../service/RTC/MediaStreamTypes");var RTCEvents=require("../../service/RTC/RTCEvents.js");function createLocalTracks(streams){var newStreams=[];for(var i=0;i-1){this.localStreams.splice(pos,1)}};RTC.prototype.createRemoteStream=function(data,sid,thessrc){var remoteStream=new JitsiRemoteTrack(this,data,sid,thessrc);if(!data.peerjid)return;var jid=Strophe.getResourceFromJid(data.peerjid);if(!this.remoteStreams[jid]){this.remoteStreams[jid]={}}this.remoteStreams[jid][remoteStream.type]=remoteStream;return remoteStream};RTC.getPCConstraints=function(){return RTCUtils.pc_constraints};RTC.attachMediaStream=function(elSelector,stream){RTCUtils.attachMediaStream(elSelector,stream)};RTC.getStreamID=function(stream){return RTCUtils.getStreamID(stream)};RTC.getVideoSrc=function(element){return RTCUtils.getVideoSrc(element)};RTC.isDeviceListAvailable=function(){return RTCUtils.isDeviceListAvailable()};RTC.isDeviceChangeAvailable=function(){return RTCUtils.isDeviceChangeAvailable()};RTC.enumerateDevices=function(callback){RTCUtils.enumerateDevices(callback)};RTC.setVideoSrc=function(element,src){RTCUtils.setVideoSrc(element,src)};RTC.stopMediaStream=function(mediaStream){RTCUtils.stopMediaStream(mediaStream)};RTC.isDesktopSharingEnabled=function(){return RTCUtils.isDesktopSharingEnabled()};RTC.prototype.getVideoElementName=function(){return RTCBrowserType.isTemasysPluginUsed()?"object":"video"};RTC.prototype.dispose=function(){};RTC.prototype.switchVideoStreams=function(newStream){this.localVideo.stream=newStream;this.localStreams=[];if(this.localAudio.getOriginalStream()!=newStream)this.localStreams.push(this.localAudio);this.localStreams.push(this.localVideo)};RTC.prototype.setAudioLevel=function(jid,audioLevel){if(!jid)return;var resource=Strophe.getResourceFromJid(jid);if(this.remoteStreams[resource]&&this.remoteStreams[resource][JitsiTrack.AUDIO])this.remoteStreams[resource][JitsiTrack.AUDIO].setAudioLevel(audioLevel)};module.exports=RTC},{"../../service/RTC/MediaStreamTypes":79,"../../service/RTC/RTCEvents.js":80,"../../service/desktopsharing/DesktopSharingEventTypes":84,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,events:44}],17:[function(require,module,exports){var currentBrowser;var browserVersion;var isAndroid;var RTCBrowserType={RTC_BROWSER_CHROME:"rtc_browser.chrome",RTC_BROWSER_OPERA:"rtc_browser.opera",RTC_BROWSER_FIREFOX:"rtc_browser.firefox",RTC_BROWSER_IEXPLORER:"rtc_browser.iexplorer",RTC_BROWSER_SAFARI:"rtc_browser.safari",getBrowserType:function(){return currentBrowser},isChrome:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_CHROME},isOpera:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_OPERA},isFirefox:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_FIREFOX},isIExplorer:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_IEXPLORER},isSafari:function(){return currentBrowser===RTCBrowserType.RTC_BROWSER_SAFARI},isTemasysPluginUsed:function(){return RTCBrowserType.isIExplorer()||RTCBrowserType.isSafari()},getFirefoxVersion:function(){return RTCBrowserType.isFirefox()?browserVersion:null},getChromeVersion:function(){return RTCBrowserType.isChrome()?browserVersion:null},usesPlanB:function(){return RTCBrowserType.isChrome()||RTCBrowserType.isOpera()||RTCBrowserType.isTemasysPluginUsed()},usesUnifiedPlan:function(){return RTCBrowserType.isFirefox()},isAndroid:function(){return isAndroid}};function detectChrome(){if(navigator.webkitGetUserMedia){currentBrowser=RTCBrowserType.RTC_BROWSER_CHROME;var userAgent=navigator.userAgent.toLowerCase();var ver=parseInt(userAgent.match(/chrome\/(\d+)\./)[1],10);console.log("This appears to be Chrome, ver: "+ver);return ver}return null}function detectOpera(){var userAgent=navigator.userAgent;if(userAgent.match(/Opera|OPR/)){currentBrowser=RTCBrowserType.RTC_BROWSER_OPERA;var version=userAgent.match(/(Opera|OPR) ?\/?(\d+)\.?/)[2];console.info("This appears to be Opera, ver: "+version);return version}return null}function detectFirefox(){if(navigator.mozGetUserMedia){currentBrowser=RTCBrowserType.RTC_BROWSER_FIREFOX;var version=parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1],10);console.log("This appears to be Firefox, ver: "+version);return version}return null}function detectSafari(){if(/^((?!chrome).)*safari/i.test(navigator.userAgent)){currentBrowser=RTCBrowserType.RTC_BROWSER_SAFARI;console.info("This appears to be Safari");return 1}return null}function detectIE(){var version;var ua=window.navigator.userAgent;var msie=ua.indexOf("MSIE ");if(msie>0){version=parseInt(ua.substring(msie+5,ua.indexOf(".",msie)),10)}var trident=ua.indexOf("Trident/");if(!version&&trident>0){var rv=ua.indexOf("rv:");version=parseInt(ua.substring(rv+3,ua.indexOf(".",rv)),10)}var edge=ua.indexOf("Edge/");if(!version&&edge>0){version=parseInt(ua.substring(edge+5,ua.indexOf(".",edge)),10)}if(version){currentBrowser=RTCBrowserType.RTC_BROWSER_IEXPLORER;console.info("This appears to be IExplorer, ver: "+version)}return version}function detectBrowser(){var version;var detectors=[detectOpera,detectChrome,detectFirefox,detectIE,detectSafari];for(var i=0;i=0){constraints.video={mandatory:{},optional:[]};if(options.cameraDeviceId){constraints.video.optional.push({sourceId:options.cameraDeviceId})}constraints.video.optional.push({googLeakyBucket:true});setResolutionConstraints(constraints,options.resolution)}if(um.indexOf("audio")>=0){if(!RTCBrowserType.isFirefox()){constraints.audio={mandatory:{},optional:[]};if(options.micDeviceId){constraints.audio.optional.push({sourceId:options.micDeviceId})}constraints.audio.optional.push({googEchoCancellation:true},{googAutoGainControl:true},{googNoiseSupression:true},{googHighpassFilter:true},{googNoisesuppression2:true},{googEchoCancellation2:true},{googAutoGainControl2:true})}else{if(options.micDeviceId){constraints.audio={mandatory:{},optional:[{sourceId:options.micDeviceId}]}}else{constraints.audio=true}}}if(um.indexOf("screen")>=0){if(RTCBrowserType.isChrome()){constraints.video={mandatory:{chromeMediaSource:"screen",googLeakyBucket:true,maxWidth:window.screen.width,maxHeight:window.screen.height,maxFrameRate:3},optional:[]}}else if(RTCBrowserType.isTemasysPluginUsed()){constraints.video={optional:[{sourceId:AdapterJS.WebRTCPlugin.plugin.screensharingKey}]}}else if(RTCBrowserType.isFirefox()){constraints.video={mozMediaSource:"window",mediaSource:"window"}}else{logger.error("'screen' WebRTC media source is supported only in Chrome"+" and with Temasys plugin")}}if(um.indexOf("desktop")>=0){constraints.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:options.desktopStream,googLeakyBucket:true,maxWidth:window.screen.width,maxHeight:window.screen.height,maxFrameRate:3},optional:[]}}if(options.bandwidth){if(!constraints.video){constraints.video={mandatory:{},optional:[]}}constraints.video.optional.push({bandwidth:options.bandwidth})}if(options.fps){if(!constraints.video){constraints.video={mandatory:{},optional:[]}}constraints.video.mandatory.minFrameRate=options.fps}if(RTCBrowserType.isFirefox()&&options.firefox_fake_device){constraints.fake=true}return constraints}function setAvailableDevices(um,available){if(um.indexOf("video")!=-1){devices.video=available}if(um.indexOf("audio")!=-1){devices.audio=available}eventEmitter.emit(RTCEvents.AVAILABLE_DEVICES_CHANGED,devices)}function onReady(options,GUM){rtcReady=true;eventEmitter.emit(RTCEvents.RTC_READY,true);screenObtainer.init(eventEmitter,options,GUM)}function maybeApply(fn,args){if(fn){fn.apply(null,args||[])}}var getUserMediaStatus={initialized:false,callbacks:[]};function wrapGetUserMedia(getUserMedia){return function(constraints,successCallback,errorCallback){getUserMedia(constraints,function(stream){maybeApply(successCallback,[stream]);if(!getUserMediaStatus.initialized){getUserMediaStatus.initialized=true;getUserMediaStatus.callbacks.forEach(function(callback){callback()});getUserMediaStatus.callbacks.length=0}},function(error){maybeApply(errorCallback,[error])})}}function createAutoDeviceInfo(kind){return{facing:null,label:"Auto",kind:kind,deviceId:"",groupId:null}}function afterUserMediaInitialized(callback){if(getUserMediaStatus.initialized){callback()}else{getUserMediaStatus.callbacks.push(callback)}}function wrapEnumerateDevices(enumerateDevices){return function(callback){afterUserMediaInitialized(function(){enumerateDevices().then(function(devices){devices.unshift(createAutoDeviceInfo("audioinput"),createAutoDeviceInfo("videoinput"));callback(devices)},function(err){console.error("cannot enumerate devices: ",err);callback([createAutoDeviceInfo("audioInput"),createAutoDeviceInfo("videoinput")])})})}}function enumerateDevicesThroughMediaStreamTrack(callback){MediaStreamTrack.getSources(function(sources){var devices=sources.map(function(source){var kind=(source.kind||"").toLowerCase();return{facing:source.facing||null,label:source.label,kind:kind?kind+"input":null,deviceId:source.id,groupId:source.groupId||null}});devices.unshift(createAutoDeviceInfo("audioinput"),createAutoDeviceInfo("videoinput"));callback(devices)})}function obtainDevices(options){if(!options.devices||options.devices.length===0){return options.successCallback(options.streams||{})}var device=options.devices.splice(0,1);var devices=[];devices.push(device);options.deviceGUM[device](function(stream){options.streams=options.streams||{};options.streams[device]=stream;obtainDevices(options)},function(error){Object.keys(options.streams).forEach(function(device){RTCUtils.stopMediaStream(options.streams[device])});logger.error("failed to obtain "+device+" stream - stop",error);options.errorCallback(JitsiTrackErrors.parseError(error,devices))})}function handleLocalStream(streams,resolution){var audioStream,videoStream,desktopStream,res=[];if(window.webkitMediaStream){var audioVideo=streams.audioVideo;if(audioVideo){var audioTracks=audioVideo.getAudioTracks();if(audioTracks.length){audioStream=new webkitMediaStream;for(var i=0;i= 40.");reject(new Error("Firefox version too old: "+FFversion+". Required >= 40."));return}this.peerconnection=mozRTCPeerConnection;this.getUserMedia=wrapGetUserMedia(navigator.mozGetUserMedia.bind(navigator));this.enumerateDevices=wrapEnumerateDevices(navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices));this.pc_constraints={};this.attachMediaStream=function(element,stream){if(!element[0])return;element[0].mozSrcObject=stream;element[0].play()};this.getStreamID=function(stream){var id=stream.id;if(!id){var tracks=stream.getVideoTracks();if(!tracks||tracks.length===0){tracks=stream.getAudioTracks()}id=tracks[0].id}return SDPUtil.filter_special_chars(id)};this.getVideoSrc=function(element){if(!element)return null;return element.mozSrcObject};this.setVideoSrc=function(element,src){if(element)element.mozSrcObject=src};RTCSessionDescription=mozRTCSessionDescription;RTCIceCandidate=mozRTCIceCandidate}else if(RTCBrowserType.isChrome()||RTCBrowserType.isOpera()){this.peerconnection=webkitRTCPeerConnection;var getUserMedia=navigator.webkitGetUserMedia.bind(navigator);if(navigator.mediaDevices){this.getUserMedia=wrapGetUserMedia(getUserMedia);this.enumerateDevices=wrapEnumerateDevices(navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices))}else{this.getUserMedia=getUserMedia;this.enumerateDevices=enumerateDevicesThroughMediaStreamTrack}this.attachMediaStream=function(element,stream){if(!stream.jitsiObjectURL){stream.jitsiObjectURL=webkitURL.createObjectURL(stream)}element.attr("src",stream.jitsiObjectURL)};this.getStreamID=function(stream){return SDPUtil.filter_special_chars(stream.id)};this.getVideoSrc=function(element){if(!element)return null;return element.getAttribute("src")};this.setVideoSrc=function(element,src){if(element)element.setAttribute("src",src)};this.pc_constraints={optional:[{DtlsSrtpKeyAgreement:"true"}]};if(options.useIPv6){this.pc_constraints.optional.push({googIPv6:true})}if(RTCBrowserType.isAndroid()){this.pc_constraints={}}if(!webkitMediaStream.prototype.getVideoTracks){webkitMediaStream.prototype.getVideoTracks=function(){return this.videoTracks}}if(!webkitMediaStream.prototype.getAudioTracks){webkitMediaStream.prototype.getAudioTracks=function(){return this.audioTracks}}}else if(RTCBrowserType.isTemasysPluginUsed()){var self=this;AdapterJS.webRTCReady(function(isPlugin){self.peerconnection=RTCPeerConnection;self.getUserMedia=window.getUserMedia;self.enumerateDevices=enumerateDevicesThroughMediaStreamTrack;self.attachMediaStream=function(elSel,stream){if(stream.id==="dummyAudio"||stream.id==="dummyVideo"){return}attachMediaStream(elSel[0],stream)};self.getStreamID=function(stream){var id=SDPUtil.filter_special_chars(stream.label);return id};self.getVideoSrc=function(element){if(!element){logger.warn("Attempt to get video SRC of null element");return null}var children=element.children;for(var i=0;i!==children.length;++i){if(children[i].name==="streamId"){return children[i].value}}return null};self.setVideoSrc=function(element,src){if(!src){logger.warn("Not attaching video stream, 'src' is null");return}AdapterJS.WebRTCPlugin.WaitForPluginReady();var stream=AdapterJS.WebRTCPlugin.plugin.getStreamWithId(AdapterJS.WebRTCPlugin.pageId,src);attachMediaStream(element,stream)};onReady(options,self.getUserMediaWithConstraints);resolve()})}else{try{logger.error("Browser does not appear to be WebRTC-capable")}catch(e){}reject("Browser does not appear to be WebRTC-capable");return}if(!RTCBrowserType.isTemasysPluginUsed()){onReady(options,this.getUserMediaWithConstraints);resolve()}}.bind(this))},getUserMediaWithConstraints:function(um,success_callback,failure_callback,options){options=options||{};var resolution=options.resolution;var constraints=getConstraints(um,options);logger.info("Get media constraints",constraints);try{this.getUserMedia(constraints,function(stream){logger.log("onUserMediaSuccess");setAvailableDevices(um,true);success_callback(stream)},function(error){setAvailableDevices(um,false);logger.warn("Failed to get access to local media. Error ",error,constraints);if(failure_callback){failure_callback(error,resolution)}})}catch(e){logger.error("GUM failed: ",e);if(failure_callback){failure_callback(e)}}},obtainAudioAndVideoPermissions:function(options){var self=this;options=options||{};return new Promise(function(resolve,reject){var successCallback=function(stream){resolve(handleLocalStream(stream,options.resolution))};options.devices=options.devices||["audio","video"];if(!screenObtainer.isSupported()&&options.devices.indexOf("desktop")!==-1){reject(new Error("Desktop sharing is not supported!"))}if(RTCBrowserType.isFirefox()||RTCBrowserType.isTemasysPluginUsed()){var GUM=function(device,s,e){this.getUserMediaWithConstraints(device,s,e,options)};var deviceGUM={audio:GUM.bind(self,["audio"]),video:GUM.bind(self,["video"])};if(screenObtainer.isSupported()){deviceGUM["desktop"]=screenObtainer.obtainStream.bind(screenObtainer)}obtainDevices({devices:options.devices,streams:[],successCallback:successCallback,errorCallback:reject,deviceGUM:deviceGUM})}else{var hasDesktop=options.devices.indexOf("desktop")>-1;if(hasDesktop){options.devices.splice(options.devices.indexOf("desktop"),1)}options.resolution=options.resolution||"360";if(options.devices.length){this.getUserMediaWithConstraints(options.devices,function(stream){if(options.devices.indexOf("audio")!==-1&&!stream.getAudioTracks().length||options.devices.indexOf("video")!==-1&&!stream.getVideoTracks().length){self.stopMediaStream(stream);reject(JitsiTrackErrors.parseError(new Error("Unable to get the audio and "+"video tracks."),options.devices));return}if(hasDesktop){screenObtainer.obtainStream(function(desktopStream){successCallback({audioVideo:stream,desktopStream:desktopStream})},function(error){self.stopMediaStream(stream);reject(JitsiTrackErrors.parseError(error,options.devices))})}else{successCallback({audioVideo:stream})}},function(error){reject(JitsiTrackErrors.parseError(error,options.devices))},options)}else if(hasDesktop){screenObtainer.obtainStream(function(stream){successCallback({desktopStream:stream})},function(error){reject(JitsiTrackErrors.parseError(error,["desktop"]))})}}}.bind(this))},addListener:function(eventType,listener){eventEmitter.on(eventType,listener)},removeListener:function(eventType,listener){eventEmitter.removeListener(eventType,listener)},getDeviceAvailability:function(){return devices},isRTCReady:function(){return rtcReady},isDeviceListAvailable:function(){var isEnumerateDevicesAvailable=navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices;if(isEnumerateDevicesAvailable){return true}return MediaStreamTrack&&MediaStreamTrack.getSources?true:false},isDeviceChangeAvailable:function(){if(RTCBrowserType.isChrome()||RTCBrowserType.isOpera()||RTCBrowserType.isTemasysPluginUsed())return true;return false},stopMediaStream:function(mediaStream){mediaStream.getTracks().forEach(function(track){if(track.stop){track.stop()}});if(mediaStream.stop){mediaStream.stop()}if(mediaStream.jitsiObjectURL){webkitURL.revokeObjectURL(mediaStream.jitsiObjectURL)}},isDesktopSharingEnabled:function(){return screenObtainer.isSupported()}};module.exports=RTCUtils}).call(this,"/modules/RTC/RTCUtils.js")},{"../../JitsiTrackErrors":9,"../../service/RTC/RTCEvents":80,"../../service/RTC/Resolutions":81,"../xmpp/SDPUtil":32,"./RTCBrowserType":17,"./ScreenObtainer":19,"./adapter.screenshare":20,events:44,"jitsi-meet-logger":48}],19:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var RTCBrowserType=require("./RTCBrowserType");var AdapterJS=require("./adapter.screenshare");var DesktopSharingEventTypes=require("../../service/desktopsharing/DesktopSharingEventTypes");var chromeExtInstalled=false;var chromeExtUpdateRequired=false;var firefoxExtInstalled=null;var reDetectFirefoxExtension=false;var GUM=null;var ScreenObtainer={eventEmitter:null,obtainStream:null,init:function(eventEmitter,options,gum){this.eventEmitter=eventEmitter;var obtainDesktopStream=null;this.options=options=options||{};GUM=gum;if(RTCBrowserType.isFirefox())initFirefoxExtensionDetection(options);var chromeMethod=options.desktopSharingChromeMethod||options.desktopSharing;if(RTCBrowserType.isTemasysPluginUsed()){if(!AdapterJS.WebRTCPlugin.plugin.HasScreensharingFeature){logger.info("Screensharing not supported by this plugin "+"version")}else if(!AdapterJS.WebRTCPlugin.plugin.isScreensharingAvailable){logger.info("Screensharing not available with Temasys plugin on"+" this site")}else{obtainDesktopStream=obtainWebRTCScreen;logger.info("Using Temasys plugin for desktop sharing")}}else if(RTCBrowserType.isChrome()){if(chromeMethod=="ext"){if(RTCBrowserType.getChromeVersion()>=34){obtainDesktopStream=this.obtainScreenFromExtension; logger.info("Using Chrome extension for desktop sharing");initChromeExtension(options)}else{logger.info("Chrome extension not supported until ver 34")}}else if(chromeMethod=="webrtc"){obtainDesktopStream=obtainWebRTCScreen;logger.info("Using Chrome WebRTC for desktop sharing")}}else if(RTCBrowserType.isFirefox()){if(options.desktopSharingFirefoxDisabled){obtainDesktopStream=null}else if(window.location.protocol==="http:"){logger.log("Screen sharing is not supported over HTTP. "+"Use of HTTPS is required.");obtainDesktopStream=null}else{obtainDesktopStream=this.obtainScreenOnFirefox}}if(!obtainDesktopStream){logger.info("Desktop sharing disabled")}this.obtainStream=obtainDesktopStream},isSupported:function(){return!!this.obtainStream},obtainScreenOnFirefox:function(callback,errorCallback){var self=this;var extensionRequired=false;if(this.options.desktopSharingFirefoxMaxVersionExtRequired===-1||this.options.desktopSharingFirefoxMaxVersionExtRequired>=0&&RTCBrowserType.getFirefoxVersion()<=this.options.desktopSharingFirefoxMaxVersionExtRequired){extensionRequired=true;logger.log("Jidesha extension required on firefox version "+RTCBrowserType.getFirefoxVersion())}if(!extensionRequired||firefoxExtInstalled===true){obtainWebRTCScreen(callback,errorCallback);return}if(reDetectFirefoxExtension){reDetectFirefoxExtension=false;initFirefoxExtensionDetection(this.options)}if(firefoxExtInstalled===null){window.setTimeout(function(){if(firefoxExtInstalled===null)firefoxExtInstalled=false;self.obtainScreenOnFirefox(callback,errorCallback)},300);logger.log("Waiting for detection of jidesha on firefox to "+"finish.");return}firefoxExtInstalled=null;reDetectFirefoxExtension=true;this.eventEmitter.emit(DesktopSharingEventTypes.FIREFOX_EXTENSION_NEEDED,this.options.desktopSharingFirefoxExtensionURL);errorCallback("Firefox extension required.")},obtainScreenFromExtension:function(streamCallback,failCallback){if(chromeExtInstalled){doGetStreamFromExtension(this.options,streamCallback,failCallback)}else{if(chromeExtUpdateRequired){alert("Jitsi Desktop Streamer requires update. "+"Changes will take effect after next Chrome restart.")}chrome.webstore.install(getWebStoreInstallUrl(this.options),function(arg){logger.log("Extension installed successfully",arg);chromeExtInstalled=true;window.setTimeout(function(){doGetStreamFromExtension(this.options,streamCallback,failCallback)},500)},function(arg){logger.log("Failed to install the extension",arg);failCallback(arg)})}}};function obtainWebRTCScreen(streamCallback,failCallback){GUM(["screen"],streamCallback,failCallback)}function getWebStoreInstallUrl(options){return"https://chrome.google.com/webstore/detail/"+(options.desktopSharingChromeExtId||options.chromeExtensionId)}function isUpdateRequired(minVersion,extVersion){try{var s1=minVersion.split(".");var s2=extVersion.split(".");var len=Math.max(s1.length,s2.length);for(var i=0;in2}}return false}catch(e){logger.error("Failed to parse extension version",e);return true}}function checkChromeExtInstalled(callback,options){if(!chrome||!chrome.runtime){callback(false,false);return}chrome.runtime.sendMessage(options.desktopSharingChromeExtId||options.chromeExtensionId,{getVersion:true},function(response){if(!response||!response.version){logger.warn("Extension not installed?: ",chrome.runtime.lastError);callback(false,false);return}var extVersion=response.version;logger.log("Extension version is: "+extVersion);var updateRequired=isUpdateRequired(options.desktopSharingChromeMinExtVersion||options.minChromeExtVersion,extVersion);callback(!updateRequired,updateRequired)})}function doGetStreamFromExtension(options,streamCallback,failCallback){chrome.runtime.sendMessage(options.desktopSharingChromeExtId||options.chromeExtensionId,{getStream:true,sources:options.desktopSharingChromeSources||options.desktopSharingSources},function(response){if(!response){failCallback(chrome.runtime.lastError);return}logger.log("Response from extension: "+response);if(response.streamId){GUM(["desktop"],function(stream){streamCallback(stream)},failCallback,{desktopStream:response.streamId})}else{failCallback("Extension failed to get the stream")}})}function initInlineInstalls(options){$("link[rel=chrome-webstore-item]").attr("href",getWebStoreInstallUrl(options))}function initChromeExtension(options){initInlineInstalls(options);checkChromeExtInstalled(function(installed,updateRequired){chromeExtInstalled=installed;chromeExtUpdateRequired=updateRequired;logger.info("Chrome extension installed: "+chromeExtInstalled+" updateRequired: "+chromeExtUpdateRequired)},options)}function initFirefoxExtensionDetection(options){if(options.desktopSharingFirefoxDisabled){return}if(firefoxExtInstalled===false||firefoxExtInstalled===true)return;if(!options.desktopSharingFirefoxExtId){firefoxExtInstalled=false;return}var img=document.createElement("img");img.onload=function(){logger.log("Detected firefox screen sharing extension.");firefoxExtInstalled=true};img.onerror=function(){logger.log("Detected lack of firefox screen sharing extension.");firefoxExtInstalled=false};var src="chrome://"+options.desktopSharingFirefoxExtId.replace("@",".")+"/content/"+document.location.hostname+".png";img.setAttribute("src",src)}module.exports=ScreenObtainer}).call(this,"/modules/RTC/ScreenObtainer.js")},{"../../service/desktopsharing/DesktopSharingEventTypes":84,"./RTCBrowserType":17,"./adapter.screenshare":20,"jitsi-meet-logger":48}],20:[function(require,module,exports){(function(__filename){var console=require("jitsi-meet-logger").getLogger(__filename);var AdapterJS=AdapterJS||{};if(typeof exports!=="undefined"){module.exports=AdapterJS}AdapterJS.options=AdapterJS.options||{};AdapterJS.VERSION="0.12.3";AdapterJS.onwebrtcready=AdapterJS.onwebrtcready||function(isUsingPlugin){};AdapterJS.webRTCReady=function(callback){if(typeof callback!=="function"){throw new Error("Callback provided is not a function")}if(true===AdapterJS.onwebrtcreadyDone){callback(null!==AdapterJS.WebRTCPlugin.plugin)}else{AdapterJS.onwebrtcready=callback}};AdapterJS.WebRTCPlugin=AdapterJS.WebRTCPlugin||{};AdapterJS.WebRTCPlugin.pluginInfo={prefix:"Tem",plugName:"TemWebRTCPlugin",pluginId:"plugin0",type:"application/x-temwebrtcplugin",onload:"__TemWebRTCReady0",portalLink:"http://skylink.io/plugin/",downloadLink:null,companyName:"Temasys"};if(!!navigator.platform.match(/^Mac/i)){AdapterJS.WebRTCPlugin.pluginInfo.downloadLink="http://bit.ly/1n77hco"}else if(!!navigator.platform.match(/^Win/i)){AdapterJS.WebRTCPlugin.pluginInfo.downloadLink="http://bit.ly/1kkS4FN"}AdapterJS.WebRTCPlugin.TAGS={NONE:"none",AUDIO:"audio",VIDEO:"video"};AdapterJS.WebRTCPlugin.pageId=Math.random().toString(36).slice(2);AdapterJS.WebRTCPlugin.plugin=null;AdapterJS.WebRTCPlugin.setLogLevel=null;AdapterJS.WebRTCPlugin.defineWebRTCInterface=null;AdapterJS.WebRTCPlugin.isPluginInstalled=null;AdapterJS.WebRTCPlugin.pluginInjectionInterval=null;AdapterJS.WebRTCPlugin.injectPlugin=null;AdapterJS.WebRTCPlugin.PLUGIN_STATES={NONE:0,INITIALIZING:1,INJECTING:2,INJECTED:3,READY:4};AdapterJS.WebRTCPlugin.pluginState=AdapterJS.WebRTCPlugin.PLUGIN_STATES.NONE;AdapterJS.onwebrtcreadyDone=false;AdapterJS.WebRTCPlugin.PLUGIN_LOG_LEVELS={NONE:"NONE",ERROR:"ERROR",WARNING:"WARNING",INFO:"INFO",VERBOSE:"VERBOSE",SENSITIVE:"SENSITIVE"};AdapterJS.WebRTCPlugin.WaitForPluginReady=null;AdapterJS.WebRTCPlugin.callWhenPluginReady=null;__TemWebRTCReady0=function(){if(document.readyState==="complete"){AdapterJS.WebRTCPlugin.pluginState=AdapterJS.WebRTCPlugin.PLUGIN_STATES.READY;AdapterJS.maybeThroughWebRTCReady()}else{AdapterJS.WebRTCPlugin.documentReadyInterval=setInterval(function(){if(document.readyState==="complete"){clearInterval(AdapterJS.WebRTCPlugin.documentReadyInterval);AdapterJS.WebRTCPlugin.pluginState=AdapterJS.WebRTCPlugin.PLUGIN_STATES.READY;AdapterJS.maybeThroughWebRTCReady()}},100)}};AdapterJS.maybeThroughWebRTCReady=function(){if(!AdapterJS.onwebrtcreadyDone){AdapterJS.onwebrtcreadyDone=true;if(typeof AdapterJS.onwebrtcready==="function"){AdapterJS.onwebrtcready(AdapterJS.WebRTCPlugin.plugin!==null)}}};AdapterJS.TEXT={PLUGIN:{REQUIRE_INSTALLATION:"This website requires you to install a WebRTC-enabling plugin "+"to work on this browser.",NOT_SUPPORTED:"Your browser does not support WebRTC.",BUTTON:"Install Now"},REFRESH:{REQUIRE_REFRESH:"Please refresh page",BUTTON:"Refresh Page"}};AdapterJS._iceConnectionStates={starting:"starting",checking:"checking",connected:"connected",completed:"connected",done:"completed",disconnected:"disconnected",failed:"failed",closed:"closed"};AdapterJS._iceConnectionFiredStates=[];AdapterJS.isDefined=null;AdapterJS.parseWebrtcDetectedBrowser=function(){var hasMatch,checkMatch=navigator.userAgent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i)||[];if(/trident/i.test(checkMatch[1])){hasMatch=/\brv[ :]+(\d+)/g.exec(navigator.userAgent)||[];webrtcDetectedBrowser="IE";webrtcDetectedVersion=parseInt(hasMatch[1]||"0",10)}else if(checkMatch[1]==="Chrome"){hasMatch=navigator.userAgent.match(/\bOPR\/(\d+)/);if(hasMatch!==null){webrtcDetectedBrowser="opera";webrtcDetectedVersion=parseInt(hasMatch[1],10)}}if(navigator.userAgent.indexOf("Safari")){if(typeof InstallTrigger!=="undefined"){webrtcDetectedBrowser="firefox"}else if(false||!!document.documentMode){webrtcDetectedBrowser="IE"}else if(Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor")>0){webrtcDetectedBrowser="safari"}else if(!!window.opera||navigator.userAgent.indexOf(" OPR/")>=0){webrtcDetectedBrowser="opera"}else if(!!window.chrome){webrtcDetectedBrowser="chrome"}}if(!webrtcDetectedBrowser){webrtcDetectedVersion=checkMatch[1]}if(!webrtcDetectedVersion){try{checkMatch=checkMatch[2]?[checkMatch[1],checkMatch[2]]:[navigator.appName,navigator.appVersion,"-?"];if((hasMatch=navigator.userAgent.match(/version\/(\d+)/i))!==null){checkMatch.splice(1,1,hasMatch[1])}webrtcDetectedVersion=parseInt(checkMatch[1],10)}catch(error){}}};AdapterJS.maybeFixConfiguration=function(pcConfig){if(pcConfig===null){return}for(var i=0;i'+text+"");if(buttonText&&buttonLink){c.document.write('');c.document.close();AdapterJS.addEvent(c.document.getElementById("okay"),"click",function(e){if(!!displayRefreshBar){AdapterJS.renderNotificationBar(AdapterJS.TEXT.EXTENSION?AdapterJS.TEXT.EXTENSION.REQUIRE_REFRESH:AdapterJS.TEXT.REFRESH.REQUIRE_REFRESH,AdapterJS.TEXT.REFRESH.BUTTON,"javascript:location.reload()")}window.open(buttonLink,!!openNewTab?"_blank":"_top");e.preventDefault();try{event.cancelBubble=true}catch(error){}var pluginInstallInterval=setInterval(function(){if(!isIE){navigator.plugins.refresh(false)}AdapterJS.WebRTCPlugin.isPluginInstalled(AdapterJS.WebRTCPlugin.pluginInfo.prefix,AdapterJS.WebRTCPlugin.pluginInfo.plugName,function(){clearInterval(pluginInstallInterval);AdapterJS.WebRTCPlugin.defineWebRTCInterface()},function(){})},500)});AdapterJS.addEvent(c.document.getElementById("cancel"),"click",function(e){w.document.body.removeChild(i)})}else{c.document.close()}setTimeout(function(){if(typeof i.style.webkitTransform==="string"){i.style.webkitTransform="translateY(40px)"}else if(typeof i.style.transform==="string"){i.style.transform="translateY(40px)"}else{i.style.top="0px"}},300)};webrtcDetectedType=null;webrtcDetectedDCSupport=null;checkMediaDataChannelSettings=function(peerBrowserAgent,peerBrowserVersion,callback,constraints){if(typeof callback!=="function"){return}var beOfferer=true;var isLocalFirefox=webrtcDetectedBrowser==="firefox";var isLocalFirefoxInterop=webrtcDetectedType==="moz"&&webrtcDetectedVersion>30;var isPeerFirefox=peerBrowserAgent==="firefox";var isPeerFirefoxInterop=peerBrowserAgent==="firefox"&&(peerBrowserVersion?peerBrowserVersion>30:false);if(isLocalFirefox&&isPeerFirefox||isLocalFirefoxInterop){try{delete constraints.mandatory.MozDontOfferDataChannel}catch(error){console.error("Failed deleting MozDontOfferDataChannel");console.error(error)}}else if(isLocalFirefox&&!isPeerFirefox){constraints.mandatory.MozDontOfferDataChannel=true}if(!isLocalFirefox){for(var prop in constraints.mandatory){if(constraints.mandatory.hasOwnProperty(prop)){if(prop.indexOf("Moz")!==-1){delete constraints.mandatory[prop]}}}}if(isLocalFirefox&&!isPeerFirefox&&!isLocalFirefoxInterop){beOfferer=false}callback(beOfferer,constraints)};checkIceConnectionState=function(peerId,iceConnectionState,callback){if(typeof callback!=="function"){console.warn("No callback specified in checkIceConnectionState. Aborted.");return}peerId=peerId?peerId:"peer";if(!AdapterJS._iceConnectionFiredStates[peerId]||iceConnectionState===AdapterJS._iceConnectionStates.disconnected||iceConnectionState===AdapterJS._iceConnectionStates.failed||iceConnectionState===AdapterJS._iceConnectionStates.closed){AdapterJS._iceConnectionFiredStates[peerId]=[]}iceConnectionState=AdapterJS._iceConnectionStates[iceConnectionState];if(AdapterJS._iceConnectionFiredStates[peerId].indexOf(iceConnectionState)<0){AdapterJS._iceConnectionFiredStates[peerId].push(iceConnectionState);if(iceConnectionState===AdapterJS._iceConnectionStates.connected){setTimeout(function(){AdapterJS._iceConnectionFiredStates[peerId].push(AdapterJS._iceConnectionStates.done);callback(AdapterJS._iceConnectionStates.done)},1e3)}callback(iceConnectionState)}return};createIceServer=null;createIceServers=null;RTCPeerConnection=null;RTCSessionDescription=typeof RTCSessionDescription==="function"?RTCSessionDescription:null;RTCIceCandidate=typeof RTCIceCandidate==="function"?RTCIceCandidate:null;getUserMedia=null;attachMediaStream=null;reattachMediaStream=null;webrtcDetectedBrowser=null;webrtcDetectedVersion=null;if(navigator.mozGetUserMedia){webrtcDetectedBrowser="firefox";webrtcDetectedVersion=parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1],10);webrtcDetectedType="moz";webrtcDetectedDCSupport="SCTP";RTCPeerConnection=function(pcConfig,pcConstraints){AdapterJS.maybeFixConfiguration(pcConfig);return new mozRTCPeerConnection(pcConfig,pcConstraints)};RTCSessionDescription=mozRTCSessionDescription;window.RTCSessionDescription=RTCSessionDescription;RTCIceCandidate=mozRTCIceCandidate;window.RTCIceCandidate=RTCIceCandidate;window.getUserMedia=navigator.mozGetUserMedia.bind(navigator);navigator.getUserMedia=window.getUserMedia;MediaStreamTrack.getSources=function(successCb){setTimeout(function(){var infos=[{kind:"audio",id:"default",label:"",facing:""},{kind:"video",id:"default",label:"",facing:""}];successCb(infos)},0)};createIceServer=function(url,username,password){var iceServer=null;var url_parts=url.split(":");if(url_parts[0].indexOf("stun")===0){iceServer={url:url}}else if(url_parts[0].indexOf("turn")===0){if(webrtcDetectedVersion<27){var turn_url_parts=url.split("?");if(turn_url_parts.length===1||turn_url_parts[1].indexOf("transport=udp")===0){iceServer={url:turn_url_parts[0],credential:password,username:username}}}else{iceServer={url:url,credential:password,username:username}}}return iceServer};createIceServers=function(urls,username,password){var iceServers=[];for(var i=0;i=31||webrtcDetectedBrowser==="opera"&&webrtcDetectedVersion>=20){webrtcDetectedDCSupport="SCTP"}else if(webrtcDetectedBrowser==="chrome"&&webrtcDetectedVersion<30&&webrtcDetectedVersion>24){webrtcDetectedDCSupport="RTP"}else{webrtcDetectedDCSupport=""}createIceServer=function(url,username,password){var iceServer=null;var url_parts=url.split(":");if(url_parts[0].indexOf("stun")===0){iceServer={url:url}}else if(url_parts[0].indexOf("turn")===0){iceServer={url:url,credential:password,username:username}}return iceServer};createIceServers=function(urls,username,password){var iceServers=[];if(webrtcDetectedVersion>=34){iceServers={urls:urls,credential:password,username:username}}else{for(var i=0;i'+' '+' '+' '+''+''+(AdapterJS.options.getAllCams?'':"")+"";while(AdapterJS.WebRTCPlugin.plugin.firstChild){frag.appendChild(AdapterJS.WebRTCPlugin.plugin.firstChild)}document.body.appendChild(frag);AdapterJS.WebRTCPlugin.plugin=document.getElementById(AdapterJS.WebRTCPlugin.pluginInfo.pluginId)}else{AdapterJS.WebRTCPlugin.plugin=document.createElement("object");AdapterJS.WebRTCPlugin.plugin.id=AdapterJS.WebRTCPlugin.pluginInfo.pluginId;if(isIE){AdapterJS.WebRTCPlugin.plugin.width="1px";AdapterJS.WebRTCPlugin.plugin.height="1px"}else{AdapterJS.WebRTCPlugin.plugin.width="0px";AdapterJS.WebRTCPlugin.plugin.height="0px"}AdapterJS.WebRTCPlugin.plugin.type=AdapterJS.WebRTCPlugin.pluginInfo.type;AdapterJS.WebRTCPlugin.plugin.innerHTML=''+''+' '+(AdapterJS.options.getAllCams?'':"")+''+'';document.body.appendChild(AdapterJS.WebRTCPlugin.plugin)}AdapterJS.WebRTCPlugin.pluginState=AdapterJS.WebRTCPlugin.PLUGIN_STATES.INJECTED};AdapterJS.WebRTCPlugin.isPluginInstalled=function(comName,plugName,installedCb,notInstalledCb){if(!isIE){var pluginArray=navigator.plugins;for(var i=0;i=0){installedCb();return}}notInstalledCb()}else{try{var axo=new ActiveXObject(comName+"."+plugName)}catch(e){notInstalledCb();return}installedCb()}};AdapterJS.WebRTCPlugin.defineWebRTCInterface=function(){if(AdapterJS.WebRTCPlugin.pluginState===AdapterJS.WebRTCPlugin.PLUGIN_STATES.READY){console.error("AdapterJS - WebRTC interface has already been defined");return}AdapterJS.WebRTCPlugin.pluginState=AdapterJS.WebRTCPlugin.PLUGIN_STATES.INITIALIZING;AdapterJS.isDefined=function(variable){return variable!==null&&variable!==undefined};createIceServer=function(url,username,password){var iceServer=null;var url_parts=url.split(":");if(url_parts[0].indexOf("stun")===0){iceServer={url:url,hasCredentials:false}}else if(url_parts[0].indexOf("turn")===0){iceServer={url:url,hasCredentials:true,credential:password,username:username}}return iceServer};createIceServers=function(urls,username,password){var iceServers=[];for(var i=0;i'+' '+' '+' '+' '+' '+"";while(temp.firstChild){frag.appendChild(temp.firstChild)}var height="";var width="";if(element.clientWidth||element.clientHeight){width=element.clientWidth;height=element.clientHeight}else if(element.width||element.height){width=element.width;height=element.height}element.parentNode.insertBefore(frag,element);frag=document.getElementById(elementId);frag.width=width;frag.height=height;element.parentNode.removeChild(element)}else{var children=element.children;for(var i=0;i!==children.length;++i){if(children[i].name==="streamId"){children[i].value=streamId;break}}element.setStreamId(streamId)}var newElement=document.getElementById(elementId);AdapterJS.forwardEventHandlers(newElement,element,Object.getPrototypeOf(element));return newElement};reattachMediaStream=function(to,from){var stream=null;var children=from.children;for(var i=0;i!==children.length;++i){if(children[i].name==="streamId"){AdapterJS.WebRTCPlugin.WaitForPluginReady();stream=AdapterJS.WebRTCPlugin.plugin.getStreamWithId(AdapterJS.WebRTCPlugin.pageId,children[i].value);break}}if(stream!==null){return attachMediaStream(to,stream)}else{console.log("Could not find the stream associated with this element")}};AdapterJS.forwardEventHandlers=function(destElem,srcElem,prototype){properties=Object.getOwnPropertyNames(prototype);for(prop in properties){propName=properties[prop];if(typeof propName.slice==="function"){if(propName.slice(0,2)=="on"&&srcElem[propName]!=null){if(isIE){destElem.attachEvent(propName,srcElem[propName])}else{destElem.addEventListener(propName.slice(2),srcElem[propName],false)}}else{}}}var subPrototype=Object.getPrototypeOf(prototype);if(subPrototype!=null){AdapterJS.forwardEventHandlers(destElem,srcElem,subPrototype)}};RTCIceCandidate=function(candidate){if(!candidate.sdpMid){candidate.sdpMid=""}AdapterJS.WebRTCPlugin.WaitForPluginReady();return AdapterJS.WebRTCPlugin.plugin.ConstructIceCandidate(candidate.sdpMid,candidate.sdpMLineIndex,candidate.candidate)};AdapterJS.addEvent(document,"readystatechange",AdapterJS.WebRTCPlugin.injectPlugin);AdapterJS.WebRTCPlugin.injectPlugin()};AdapterJS.WebRTCPlugin.pluginNeededButNotInstalledCb=AdapterJS.WebRTCPlugin.pluginNeededButNotInstalledCb||function(){AdapterJS.addEvent(document,"readystatechange",AdapterJS.WebRTCPlugin.pluginNeededButNotInstalledCbPriv);AdapterJS.WebRTCPlugin.pluginNeededButNotInstalledCbPriv()};AdapterJS.WebRTCPlugin.pluginNeededButNotInstalledCbPriv=function(){if(AdapterJS.options.hidePluginInstallPrompt){return}var downloadLink=AdapterJS.WebRTCPlugin.pluginInfo.downloadLink;if(downloadLink){var popupString;if(AdapterJS.WebRTCPlugin.pluginInfo.portalLink){popupString="This website requires you to install the "+' '+AdapterJS.WebRTCPlugin.pluginInfo.companyName+" WebRTC Plugin"+" to work on this browser."}else{popupString=AdapterJS.TEXT.PLUGIN.REQUIRE_INSTALLATION}AdapterJS.renderNotificationBar(popupString,AdapterJS.TEXT.PLUGIN.BUTTON,downloadLink)}else{AdapterJS.renderNotificationBar(AdapterJS.TEXT.PLUGIN.NOT_SUPPORTED)}};AdapterJS.WebRTCPlugin.isPluginInstalled(AdapterJS.WebRTCPlugin.pluginInfo.prefix,AdapterJS.WebRTCPlugin.pluginInfo.plugName,AdapterJS.WebRTCPlugin.defineWebRTCInterface,AdapterJS.WebRTCPlugin.pluginNeededButNotInstalledCb)}}).call(this,"/modules/RTC/adapter.screenshare.js")},{"jitsi-meet-logger":48}],21:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);function supportsLocalStorage(){try{return"localStorage"in window&&window.localStorage!==null}catch(e){logger.log("localstorage is not supported");return false}}function generateUniqueId(){function _p8(){return(Math.random().toString(16)+"000000000").substr(2,8)}return _p8()+_p8()+_p8()+_p8()}function Settings(conferenceID){this.displayName="";this.userId;this.confSettings=null;this.conferenceID=conferenceID;if(supportsLocalStorage()){if(!window.localStorage.getItem(conferenceID))this.confSettings={};else this.confSettings=JSON.parse(window.localStorage.getItem(conferenceID));if(!this.confSettings.jitsiMeetId){this.confSettings.jitsiMeetId=generateUniqueId();logger.log("generated id",this.confSettings.jitsiMeetId);this.save()}this.userId=this.confSettings.jitsiMeetId||"";this.displayName=this.confSettings.displayname||""}else{logger.log("local storage is not supported");this.userId=generateUniqueId()}}Settings.prototype.save=function(){if(!supportsLocalStorage())window.localStorage.setItem(this.conferenceID,JSON.stringify(this.confSettings))};Settings.prototype.setDisplayName=function(newDisplayName){this.displayName=newDisplayName;if(this.confSettings!=null)this.confSettings.displayname=displayName; this.save();return this.displayName},Settings.prototype.getSettings=function(){return{displayName:this.displayName,uid:this.userId}},module.exports=Settings}).call(this,"/modules/settings/Settings.js")},{"jitsi-meet-logger":48}],22:[function(require,module,exports){var RTCBrowserType=require("../RTC/RTCBrowserType");var WEBAUDIO_ANALYZER_FFT_SIZE=2048;var WEBAUDIO_ANALYZER_SMOOTING_TIME=.8;function timeDomainDataToAudioLevel(samples){var maxVolume=0;var length=samples.length;for(var i=0;i.2){value=lastLevel-.2}else if(diff<-.4){value=lastLevel+.4}else{value=newLevel}return parseFloat(value.toFixed(3))}function LocalStatsCollector(stream,interval,callback){window.AudioContext=window.AudioContext||window.webkitAudioContext;this.stream=stream;this.intervalId=null;this.intervalMilis=interval;this.audioLevel=0;this.callback=callback}LocalStatsCollector.prototype.start=function(){if(!window.AudioContext||RTCBrowserType.isTemasysPluginUsed())return;var context=new AudioContext;var analyser=context.createAnalyser();analyser.smoothingTimeConstant=WEBAUDIO_ANALYZER_SMOOTING_TIME;analyser.fftSize=WEBAUDIO_ANALYZER_FFT_SIZE;var source=context.createMediaStreamSource(this.stream);source.connect(analyser);var self=this;this.intervalId=setInterval(function(){var array=new Uint8Array(analyser.frequencyBinCount);analyser.getByteTimeDomainData(array);var audioLevel=timeDomainDataToAudioLevel(array);if(audioLevel!=self.audioLevel){self.audioLevel=animateLevel(audioLevel,self.audioLevel);self.callback(self.audioLevel)}},this.intervalMilis)};LocalStatsCollector.prototype.stop=function(){if(this.intervalId){clearInterval(this.intervalId);this.intervalId=null}};module.exports=LocalStatsCollector},{"../RTC/RTCBrowserType":17}],23:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var RTCBrowserType=require("../RTC/RTCBrowserType");var StatisticsEvents=require("../../service/statistics/Events");var browserSupported=RTCBrowserType.isChrome()||RTCBrowserType.isOpera();var keyMap={};keyMap[RTCBrowserType.RTC_BROWSER_FIREFOX]={ssrc:"ssrc",packetsReceived:"packetsReceived",packetsLost:"packetsLost",packetsSent:"packetsSent",bytesReceived:"bytesReceived",bytesSent:"bytesSent"};keyMap[RTCBrowserType.RTC_BROWSER_CHROME]={receiveBandwidth:"googAvailableReceiveBandwidth",sendBandwidth:"googAvailableSendBandwidth",remoteAddress:"googRemoteAddress",transportType:"googTransportType",localAddress:"googLocalAddress",activeConnection:"googActiveConnection",ssrc:"ssrc",packetsReceived:"packetsReceived",packetsSent:"packetsSent",packetsLost:"packetsLost",bytesReceived:"bytesReceived",bytesSent:"bytesSent",googFrameHeightReceived:"googFrameHeightReceived",googFrameWidthReceived:"googFrameWidthReceived",googFrameHeightSent:"googFrameHeightSent",googFrameWidthSent:"googFrameWidthSent",audioInputLevel:"audioInputLevel",audioOutputLevel:"audioOutputLevel"};keyMap[RTCBrowserType.RTC_BROWSER_OPERA]=keyMap[RTCBrowserType.RTC_BROWSER_CHROME];function calculatePacketLoss(lostPackets,totalPackets){if(!totalPackets||totalPackets<=0||!lostPackets||lostPackets<=0)return 0;return Math.round(lostPackets/totalPackets*100)}function getStatValue(item,name){var browserType=RTCBrowserType.getBrowserType();if(!keyMap[browserType][name])throw"The property isn't supported!";var key=keyMap[browserType][name];return RTCBrowserType.isChrome()||RTCBrowserType.isOpera()?item.stat(key):item[key]}function formatAudioLevel(audioLevel){return Math.min(Math.max(audioLevel,0),1)}function acceptStat(reportId,reportType,statName){if(reportType=="googCandidatePair"&&statName=="googChannelId")return false;if(reportType=="ssrc"){if(statName=="googTrackId"||statName=="transportId"||statName=="ssrc")return false}return true}function acceptReport(id,type){if(id.substring(0,15)=="googCertificate"||id.substring(0,9)=="googTrack"||id.substring(0,20)=="googLibjingleSession")return false;if(type=="googComponent")return false;return true}function PeerStats(){this.ssrc2Loss={};this.ssrc2AudioLevel={};this.ssrc2bitrate={};this.ssrc2resolution={}}PeerStats.prototype.setSsrcLoss=function(lossRate){this.ssrc2Loss=lossRate};PeerStats.prototype.setSsrcResolution=function(resolution){if(resolution===null&&this.ssrc2resolution[ssrc]){delete this.ssrc2resolution[ssrc]}else if(resolution!==null)this.ssrc2resolution[ssrc]=resolution};PeerStats.prototype.setSsrcBitrate=function(ssrc,bitrate){if(this.ssrc2bitrate[ssrc]){this.ssrc2bitrate[ssrc].download+=bitrate.download;this.ssrc2bitrate[ssrc].upload+=bitrate.upload}else{this.ssrc2bitrate[ssrc]=bitrate}};PeerStats.prototype.setSsrcAudioLevel=function(ssrc,audioLevel){this.ssrc2AudioLevel[ssrc]=formatAudioLevel(audioLevel)};function ConferenceStats(){this.bandwidth={};this.bitrate={};this.packetLoss=null;this.transport=[]}function StatsCollector(peerconnection,audioLevelsInterval,statsInterval,eventEmitter,config){this.peerconnection=peerconnection;this.baselineAudioLevelsReport=null;this.currentAudioLevelsReport=null;this.currentStatsReport=null;this.baselineStatsReport=null;this.audioLevelsIntervalId=null;this.eventEmitter=eventEmitter;this.config=config||{};this.conferenceStats=new ConferenceStats;this.GATHER_INTERVAL=15e3;this.LOG_INTERVAL=6e4;this.gatherStatsIntervalId=null;this.logStatsIntervalId=null;this.statsToBeLogged={timestamps:[],stats:{}};this.audioLevelsIntervalMilis=audioLevelsInterval;this.statsIntervalId=null;this.statsIntervalMilis=statsInterval;this.ssrc2stats={}}module.exports=StatsCollector;StatsCollector.prototype.stop=function(){if(this.audioLevelsIntervalId){clearInterval(this.audioLevelsIntervalId);this.audioLevelsIntervalId=null}if(this.statsIntervalId){clearInterval(this.statsIntervalId);this.statsIntervalId=null}if(this.logStatsIntervalId){clearInterval(this.logStatsIntervalId);this.logStatsIntervalId=null}if(this.gatherStatsIntervalId){clearInterval(this.gatherStatsIntervalId);this.gatherStatsIntervalId=null}};StatsCollector.prototype.errorCallback=function(error){logger.error("Get stats error",error);this.stop()};StatsCollector.prototype.start=function(){var self=this;this.audioLevelsIntervalId=setInterval(function(){self.peerconnection.getStats(function(report){var results=null;if(!report||!report.result||typeof report.result!="function"){results=report}else{results=report.result()}self.currentAudioLevelsReport=results;self.processAudioLevelReport();self.baselineAudioLevelsReport=self.currentAudioLevelsReport},self.errorCallback)},self.audioLevelsIntervalMilis)};StatsCollector.prototype.addStatsToBeLogged=function(reports){var self=this;var num_records=this.statsToBeLogged.timestamps.length;this.statsToBeLogged.timestamps.push((new Date).getTime());reports.map(function(report){if(!acceptReport(report.id,report.type))return;var stat=self.statsToBeLogged.stats[report.id];if(!stat){stat=self.statsToBeLogged.stats[report.id]={}}stat.type=report.type;report.names().map(function(name){if(!acceptStat(report.id,report.type,name))return;var values=stat[name];if(!values){values=stat[name]=[]}while(values.lengthquery>x[xmlns="jabber:x:data"]'+'>field[var="muc#roomconfig_whois"]').length){logger.error("non-anonymous rooms not supported");return}var formSubmit=$iq({to:this.roomjid,type:"set"}).c("query",{xmlns:"http://jabber.org/protocol/muc#owner"});formSubmit.c("x",{xmlns:"jabber:x:data",type:"submit"});formSubmit.c("field",{"var":"FORM_TYPE"}).c("value").t("http://jabber.org/protocol/muc#roomconfig").up().up();formSubmit.c("field",{"var":"muc#roomconfig_whois"}).c("value").t("anyone").up().up();self.connection.sendIQ(formSubmit)},function(error){logger.error("Error getting room configuration form")})};ChatRoom.prototype.onPresence=function(pres){var from=pres.getAttribute("from");var member={};member.show=$(pres).find(">show").text();member.status=$(pres).find(">status").text();var tmp=$(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]>item');member.affiliation=tmp.attr("affiliation");member.role=tmp.attr("role");member.jid=tmp.attr("jid");member.isFocus=false;if(member.jid&&member.jid.indexOf(this.moderator.getFocusUserJid()+"/")===0){member.isFocus=true}$(pres).find(">x").remove();var nodes=[];parser.packet2JSON(pres,nodes);this.lastPresences[from]=nodes;var jibri=null;for(var i=0;i0){this.eventEmitter.emit(XMPPEvents.DISPLAY_NAME_CHANGED,from,displayName)}}break;case"bridgeIsDown":if(!this.bridgeIsDown){this.bridgeIsDown=true;this.eventEmitter.emit(XMPPEvents.BRIDGE_DOWN)}break;case"jibri-recording-status":var jibri=node;break;case"call-control":var att=node.attributes;if(!att)break;this.phoneNumber=att.phone||null;this.phonePin=att.pin||null;this.eventEmitter.emit(XMPPEvents.PHONE_NUMBER_CHANGED);break;default:this.processNode(node,from)}}if(!member.isFocus)this.eventEmitter.emit(XMPPEvents.USER_ID_CHANGED,from,member.id);if(member.status){this.eventEmitter.emit(XMPPEvents.PRESENCE_STATUS,from,member)}if(jibri){this.lastJibri=jibri;if(this.recording)this.recording.handleJibriPresence(jibri)}};ChatRoom.prototype.processNode=function(node,from){if(this.presHandlers[node.tagName])this.presHandlers[node.tagName](node,Strophe.getResourceFromJid(from))};ChatRoom.prototype.sendMessage=function(body,nickname){var msg=$msg({to:this.roomjid,type:"groupchat"});msg.c("body",body).up();if(nickname){msg.c("nick",{xmlns:"http://jabber.org/protocol/nick"}).t(nickname).up().up()}this.connection.send(msg);this.eventEmitter.emit(XMPPEvents.SENDING_CHAT_MESSAGE,body)};ChatRoom.prototype.setSubject=function(subject){var msg=$msg({to:this.roomjid,type:"groupchat"});msg.c("subject",subject);this.connection.send(msg);logger.log("topic changed to "+subject)};ChatRoom.prototype.onParticipantLeft=function(jid){delete this.lastPresences[jid];this.eventEmitter.emit(XMPPEvents.MUC_MEMBER_LEFT,jid);this.moderator.onMucMemberLeft(jid)};ChatRoom.prototype.onPresenceUnavailable=function(pres,from){if($(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]'+">destroy").length){var reason;var reasonSelect=$(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]'+">destroy>reason");if(reasonSelect.length){reason=reasonSelect.text()}this.xmpp.leaveRoom(this.roomjid);this.eventEmitter.emit(XMPPEvents.MUC_DESTROYED,reason);delete this.connection.emuc.rooms[Strophe.getBareJidFromJid(from)];return true}if(!$(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]>status[code="110"]').length){delete this.members[from];this.onParticipantLeft(from)}else if(Object.keys(this.members).length>1){for(var i in this.members){var member=this.members[i];delete this.members[i];this.onParticipantLeft(member)}}if($(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]>status[code="307"]').length){if(this.myroomjid===from){this.xmpp.leaveRoom(this.roomjid);this.eventEmitter.emit(XMPPEvents.KICKED)}}};ChatRoom.prototype.onMessage=function(msg,from){var nick=$(msg).find('>nick[xmlns="http://jabber.org/protocol/nick"]').text()||Strophe.getResourceFromJid(from);var txt=$(msg).find(">body").text();var type=msg.getAttribute("type");if(type=="error"){this.eventEmitter.emit(XMPPEvents.CHAT_ERROR_RECEIVED,$(msg).find(">text").text(),txt);return true}var subject=$(msg).find(">subject");if(subject.length){var subjectText=subject.text();if(subjectText||subjectText===""){this.eventEmitter.emit(XMPPEvents.SUBJECT_CHANGED,subjectText);logger.log("Subject is changed to "+subjectText)}}var stamp=$(msg).find(">delay").attr("stamp");if(!stamp){stamp=$(msg).find('>[xmlns="jabber:x:delay"]').attr("stamp");if(stamp){var dateParts=stamp.match(/(\d{4})(\d{2})(\d{2}T\d{2}:\d{2}:\d{2})/);stamp=dateParts[1]+"-"+dateParts[2]+"-"+dateParts[3]+"Z"}}if(txt){logger.log("chat",nick,txt);this.eventEmitter.emit(XMPPEvents.MESSAGE_RECEIVED,from,nick,txt,this.myroomjid,stamp)}};ChatRoom.prototype.onPresenceError=function(pres,from){if($(pres).find('>error[type="auth"]>not-authorized[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]').length){logger.log("on password required",from);this.eventEmitter.emit(XMPPEvents.PASSWORD_REQUIRED)}else if($(pres).find('>error[type="cancel"]>not-allowed[xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"]').length){var toDomain=Strophe.getDomainFromJid(pres.getAttribute("to"));if(toDomain===this.xmpp.options.hosts.anonymousdomain){this.eventEmitter.emit(XMPPEvents.ROOM_JOIN_ERROR,pres)}else{logger.warn("onPresError ",pres);this.eventEmitter.emit(XMPPEvents.ROOM_CONNECT_ERROR,pres)}}else{logger.warn("onPresError ",pres);this.eventEmitter.emit(XMPPEvents.ROOM_CONNECT_ERROR,pres)}};ChatRoom.prototype.kick=function(jid){var kickIQ=$iq({to:this.roomjid,type:"set"}).c("query",{xmlns:"http://jabber.org/protocol/muc#admin"}).c("item",{nick:Strophe.getResourceFromJid(jid),role:"none"}).c("reason").t("You have been kicked.").up().up().up();this.connection.sendIQ(kickIQ,function(result){logger.log("Kick participant with jid: ",jid,result)},function(error){logger.log("Kick participant error: ",error)})};ChatRoom.prototype.lockRoom=function(key,onSuccess,onError,onNotSupported){var ob=this;this.connection.sendIQ($iq({to:this.roomjid,type:"get"}).c("query",{xmlns:"http://jabber.org/protocol/muc#owner"}),function(res){if($(res).find('>query>x[xmlns="jabber:x:data"]>field[var="muc#roomconfig_roomsecret"]').length){var formsubmit=$iq({to:ob.roomjid,type:"set"}).c("query",{xmlns:"http://jabber.org/protocol/muc#owner"});formsubmit.c("x",{xmlns:"jabber:x:data",type:"submit"});formsubmit.c("field",{"var":"FORM_TYPE"}).c("value").t("http://jabber.org/protocol/muc#roomconfig").up().up();formsubmit.c("field",{"var":"muc#roomconfig_roomsecret"}).c("value").t(key).up().up();formsubmit.c("field",{"var":"muc#roomconfig_whois"}).c("value").t("anyone").up().up();ob.connection.sendIQ(formsubmit,onSuccess,onError)}else{onNotSupported()}},onError)};ChatRoom.prototype.addToPresence=function(key,values){values.tagName=key;this.presMap["nodes"].push(values)};ChatRoom.prototype.removeFromPresence=function(key){for(var i=0;i0&&videomuted[0]&&videomuted[0]["value"]==="true"?true:false;data.audiomuted=audiomuted.length>0&&audiomuted[0]&&audiomuted[0]["value"]==="true"?true:false}this.eventEmitter.emit(XMPPEvents.REMOTE_STREAM_RECEIVED,data,sid,thessrc)};ChatRoom.prototype.getJidBySSRC=function(ssrc){if(!this.session)return null;return this.session.getSsrcOwner(ssrc)};ChatRoom.prototype.isRecordingSupported=function(){if(this.recording)return this.recording.isSupported();return false};ChatRoom.prototype.getRecordingState=function(){if(this.recording)return this.recording.getState();return"off"};ChatRoom.prototype.getRecordingURL=function(){if(this.recording)return this.recording.getURL();return null};ChatRoom.prototype.toggleRecording=function(options,statusChangeHandler){if(this.recording)return this.recording.toggleRecording(options,statusChangeHandler);return statusChangeHandler("error",new Error("The conference is not created yet!"))};ChatRoom.prototype.isSIPCallingSupported=function(){if(this.moderator)return this.moderator.isSipGatewayEnabled(); return false};ChatRoom.prototype.dial=function(number){return this.connection.rayo.dial(number,"fromnumber",Strophe.getNodeFromJid(this.myroomjid),this.password,this.focusMucJid)};ChatRoom.prototype.hangup=function(){return this.connection.rayo.hangup()};ChatRoom.prototype.getPhoneNumber=function(){return this.phoneNumber};ChatRoom.prototype.getPhonePin=function(){return this.phonePin};ChatRoom.prototype.getConnectionState=function(){if(!this.session)return null;return this.session.getIceConnectionState()};ChatRoom.prototype.muteParticipant=function(jid,mute){logger.info("set mute",mute);var iqToFocus=$iq({to:this.focusMucJid,type:"set"}).c("mute",{xmlns:"http://jitsi.org/jitmeet/audio",jid:jid}).t(mute.toString()).up();this.connection.sendIQ(iqToFocus,function(result){logger.log("set mute",result)},function(error){logger.log("set mute error",error)})};ChatRoom.prototype.onMute=function(iq){var from=iq.getAttribute("from");if(from!==this.focusMucJid){logger.warn("Ignored mute from non focus peer");return false}var mute=$(iq).find("mute");if(mute.length){var doMuteAudio=mute.text()==="true";this.eventEmitter.emit(XMPPEvents.AUDIO_MUTED_BY_FOCUS,doMuteAudio)}return true};module.exports=ChatRoom}).call(this,"/modules/xmpp/ChatRoom.js")},{"../../service/xmpp/XMPPEvents":87,"./moderator":34,"./recording":35,events:44,"jitsi-meet-logger":48}],27:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);function JingleSession(me,sid,connection,service,eventEmitter){this.me=me;this.sid=sid;this.connection=connection;this.service=service;this.eventEmitter=eventEmitter;this.usedrip=true;this.drip_container=[];this.media_constraints=null;this.ice_config={};this.room=null}JingleSession.prototype.initialize=function(peerjid,isInitiator,media_constraints,ice_config){this.media_constraints=media_constraints;this.ice_config=ice_config;if(this.state!==null){logger.error("attempt to initiate on session "+this.sid+"in state "+this.state);return}this.state="pending";this.initiator=isInitiator?this.me:peerjid;this.responder=!isInitiator?this.me:peerjid;this.peerjid=peerjid;this.doInitialize()};JingleSession.prototype.doInitialize=function(){};JingleSession.prototype.addIceCandidates=function(contents){};JingleSession.prototype.addSources=function(contents){};JingleSession.prototype.removeSources=function(contents){};JingleSession.prototype.terminate=function(){};JingleSession.prototype.sendTerminate=function(reason,text){};JingleSession.prototype.setOffer=function(jingle){};JingleSession.prototype.setAnswer=function(jingle){};module.exports=JingleSession}).call(this,"/modules/xmpp/JingleSession.js")},{"jitsi-meet-logger":48}],28:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var JingleSession=require("./JingleSession");var TraceablePeerConnection=require("./TraceablePeerConnection");var SDPDiffer=require("./SDPDiffer");var SDPUtil=require("./SDPUtil");var SDP=require("./SDP");var async=require("async");var transform=require("sdp-transform");var XMPPEvents=require("../../service/xmpp/XMPPEvents");var RTCBrowserType=require("../RTC/RTCBrowserType");var SSRCReplacement=require("./LocalSSRCReplacement");var RTC=require("../RTC/RTC");function JingleSessionPC(me,sid,connection,service){JingleSession.call(this,me,sid,connection,service);this.initiator=null;this.responder=null;this.peerjid=null;this.state=null;this.localSDP=null;this.remoteSDP=null;this.relayedStreams=[];this.usetrickle=true;this.usepranswer=false;this.hadstuncandidate=false;this.hadturncandidate=false;this.lasticecandidate=false;this.statsinterval=null;this.reason=null;this.addssrc=[];this.removessrc=[];this.pendingop=null;this.switchstreams=false;this.addingStreams=false;this.wait=true;this.localStreamsSSRC={};this.ssrcOwners={};this.ssrcVideoTypes={};this.webrtcIceUdpDisable=!!this.service.options.webrtcIceUdpDisable;this.webrtcIceTcpDisable=!!this.service.options.webrtcIceTcpDisable;this.videoMuteByUser=false;this.modifySourcesQueue=async.queue(this._modifySources.bind(this),1);this.modifySourcesQueue.pause()}JingleSessionPC.prototype=JingleSession.prototype;JingleSessionPC.prototype.constructor=JingleSessionPC;JingleSessionPC.prototype.setOffer=function(offer){this.setRemoteDescription(offer,"offer")};JingleSessionPC.prototype.setAnswer=function(answer){this.setRemoteDescription(answer,"answer")};JingleSessionPC.prototype.updateModifySourcesQueue=function(){var signalingState=this.peerconnection.signalingState;var iceConnectionState=this.peerconnection.iceConnectionState;if(signalingState==="stable"&&iceConnectionState==="connected"){this.modifySourcesQueue.resume()}else{this.modifySourcesQueue.pause()}};JingleSessionPC.prototype.doInitialize=function(){var self=this;this.hadstuncandidate=false;this.hadturncandidate=false;this.lasticecandidate=false;this.isreconnect=false;this.wasstable=false;this.peerconnection=new TraceablePeerConnection(this.connection.jingle.ice_config,RTC.getPCConstraints(),this);this.peerconnection.onicecandidate=function(event){var protocol;if(event&&event.candidate){protocol=typeof event.candidate.protocol==="string"?event.candidate.protocol.toLowerCase():"";if(self.webrtcIceTcpDisable&&protocol=="tcp"||self.webrtcIceUdpDisable&&protocol=="udp"){return}}self.sendIceCandidate(event.candidate)};this.peerconnection.onaddstream=function(event){if(event.stream.id!=="default"){logger.log("REMOTE STREAM ADDED: ",event.stream,event.stream.id);self.remoteStreamAdded(event)}else{logger.log("RECVONLY REMOTE STREAM IGNORED: "+event.stream+" - "+event.stream.id)}};this.peerconnection.onremovestream=function(event){$(document).trigger("remotestreamremoved.jingle",[event,self.sid])};this.peerconnection.onsignalingstatechange=function(event){if(!(self&&self.peerconnection))return;if(self.peerconnection.signalingState==="stable"){self.wasstable=true}self.updateModifySourcesQueue()};this.peerconnection.oniceconnectionstatechange=function(event){if(!(self&&self.peerconnection))return;logger.log("(TIME) ICE "+self.peerconnection.iceConnectionState+": ",window.performance.now());self.updateModifySourcesQueue();switch(self.peerconnection.iceConnectionState){case"connected":if(self.peerconnection.signalingState==="stable"&&self.isreconnect)self.room.eventEmitter.emit(XMPPEvents.CONNECTION_RESTORED);self.isreconnect=false;break;case"disconnected":self.isreconnect=true;if(self.wasstable)self.room.eventEmitter.emit(XMPPEvents.CONNECTION_INTERRUPTED);break;case"failed":self.room.eventEmitter.emit(XMPPEvents.CONFERENCE_SETUP_FAILED);break}onIceConnectionStateChange(self.sid,self)};this.peerconnection.onnegotiationneeded=function(event){self.room.eventEmitter.emit(XMPPEvents.PEERCONNECTION_READY,self)};this.relayedStreams.forEach(function(stream){self.peerconnection.addStream(stream)})};function onIceConnectionStateChange(sid,session){switch(session.peerconnection.iceConnectionState){case"checking":session.timeChecking=(new Date).getTime();session.firstconnect=true;break;case"completed":case"connected":if(session.firstconnect){session.firstconnect=false;var metadata={};metadata.setupTime=(new Date).getTime()-session.timeChecking;session.peerconnection.getStats(function(res){if(res&&res.result){res.result().forEach(function(report){if(report.type=="googCandidatePair"&&report.stat("googActiveConnection")=="true"){metadata.localCandidateType=report.stat("googLocalCandidateType");metadata.remoteCandidateType=report.stat("googRemoteCandidateType");metadata.candidatePair=report.stat("googLocalCandidateType")+";"+report.stat("googRemoteCandidateType");if(report.stat("googRemoteAddress").indexOf("[")===0){metadata.ipv6=true}}})}})}break}}JingleSessionPC.prototype.accept=function(){this.state="active";var pranswer=this.peerconnection.localDescription;if(!pranswer||pranswer.type!="pranswer"){return}logger.log("going from pranswer to answer");if(this.usetrickle){var lines=SDPUtil.find_lines(pranswer.sdp,"a=candidate:");for(var i=0;i0){var ice=SDPUtil.iceparams(this.localSDP.media[mid],this.localSDP.session);ice.xmlns="urn:xmpp:jingle:transports:ice-udp:1";cand.c("content",{creator:this.initiator==this.me?"initiator":"responder",name:cands[0].sdpMid?cands[0].sdpMid:mline.media}).c("transport",ice);for(var i=0;isource[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]');ssrcs.each(function(){var ssrc=this.getAttribute("ssrc");$(this).find('>ssrc-info[xmlns="http://jitsi.org/jitmeet"]').each(function(){var owner=this.getAttribute("owner");self.ssrcOwners[ssrc]=owner})})})};JingleSessionPC.prototype.getLocalSSRC=function(mediaType){return this.localStreamsSSRC[mediaType]};JingleSessionPC.prototype.getSsrcOwner=function(ssrc){return this.ssrcOwners[ssrc]};JingleSessionPC.prototype.setRemoteDescription=function(elem,desctype){this.remoteSDP=new SDP("");if(self.webrtcIceTcpDisable){this.remoteSDP.removeTcpCandidates=true}if(self.webrtcIceUdpDisable){this.remoteSDP.removeUdpCandidates=true}this.remoteSDP.fromJingle(elem);this.readSsrcInfo($(elem).find(">content"));if(this.peerconnection.remoteDescription){logger.log("setRemoteDescription when remote description is not null, should be pranswer",this.peerconnection.remoteDescription);if(this.peerconnection.remoteDescription.type=="pranswer"){var pranswer=new SDP(this.peerconnection.remoteDescription.sdp);for(var i=0;ifingerprint");if(tmp.length){self.remoteSDP.media[i]+="a=fingerprint:"+tmp.attr("hash")+" "+tmp.text()+"\r\n"}else{logger.log("no dtls fingerprint (webrtc issue #1718?)");self.remoteSDP.media[i]+="a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:BAADBAADBAADBAADBAADBAADBAADBAADBAADBAAD\r\n"}break}}}});this.remoteSDP.raw=this.remoteSDP.session+this.remoteSDP.media.join("");var iscomplete=this.remoteSDP.media.filter(function(mediapart){return SDPUtil.find_line(mediapart,"a=ice-ufrag:")}).length==this.remoteSDP.media.length;if(iscomplete){logger.log("setting pranswer");try{this.peerconnection.setRemoteDescription(new RTCSessionDescription({type:"pranswer",sdp:this.remoteSDP.raw}),function(){},function(e){logger.log("setRemoteDescription pranswer failed",e.toString())})}catch(e){logger.error("setting pranswer failed",e)}}else{}}elem.each(function(){var idx=-1;var i;for(i=0;icandidate").each(function(){var line,candidate;var protocol=this.getAttribute("protocol");protocol=typeof protocol==="string"?protocol.toLowerCase():"";if(self.webrtcIceTcpDisable&&protocol=="tcp"||self.webrtcIceUdpDisable&&protocol=="udp"){return}line=SDPUtil.candidateFromJingle(this);candidate=new RTCIceCandidate({sdpMLineIndex:idx,sdpMid:name,candidate:line});try{self.peerconnection.addIceCandidate(candidate)}catch(e){logger.error("addIceCandidate failed",e.toString(),line)}})})};JingleSessionPC.prototype.sendAnswer=function(provisional){var self=this;this.peerconnection.createAnswer(function(sdp){self.createdAnswer(sdp,provisional)},function(e){logger.error("createAnswer failed",e);self.room.eventEmitter.emit(XMPPEvents.CONFERENCE_SETUP_FAILED)},this.media_constraints)};JingleSessionPC.prototype.createdAnswer=function(sdp,provisional){var self=this;this.localSDP=new SDP(sdp.sdp);this.usepranswer=provisional===true;if(this.usetrickle){if(this.usepranswer){sdp.type="pranswer";for(var i=0;isource").map(function(){return this.getAttribute("ssrc")}).get();if(ssrcs.length){lines+="a=ssrc-group:"+semantics+" "+ssrcs.join(" ")+"\r\n"}});var tmp=$(content).find('source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]');tmp.each(function(){var ssrc=$(this).attr("ssrc");if(mySdp.containsSSRC(ssrc)){logger.warn("Got add stream request for my own ssrc: "+ssrc);return}if(sdp.containsSSRC(ssrc)){logger.warn("Source-add request for existing SSRC: "+ssrc);return}$(this).find(">parameter").each(function(){lines+="a=ssrc:"+ssrc+" "+$(this).attr("name");if($(this).attr("value")&&$(this).attr("value").length)lines+=":"+$(this).attr("value");lines+="\r\n"})});sdp.media.forEach(function(media,idx){if(!SDPUtil.find_line(media,"a=mid:"+name))return;sdp.media[idx]+=lines;if(!self.addssrc[idx])self.addssrc[idx]="";self.addssrc[idx]+=lines});sdp.raw=sdp.session+sdp.media.join("")});this.modifySourcesQueue.push(function(){logger.log("modify sources done");var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",mySdp,newSdp);self.notifyMySSRCUpdate(mySdp,newSdp)})};JingleSessionPC.prototype.removeSource=function(elem){var self=this;if(!this.peerconnection.localDescription){logger.warn("removeSource - localDescription not ready yet");setTimeout(function(){self.removeSource(elem)},200);return}logger.log("removessrc",(new Date).getTime());logger.log("ice",this.peerconnection.iceConnectionState);var sdp=new SDP(this.peerconnection.remoteDescription.sdp);var mySdp=new SDP(this.peerconnection.localDescription.sdp);$(elem).each(function(idx,content){var name=$(content).attr("name");var lines="";$(content).find('ssrc-group[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]').each(function(){var semantics=this.getAttribute("semantics");var ssrcs=$(this).find(">source").map(function(){return this.getAttribute("ssrc")}).get();if(ssrcs.length){lines+="a=ssrc-group:"+semantics+" "+ssrcs.join(" ")+"\r\n"}});var tmp=$(content).find('source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]');tmp.each(function(){var ssrc=$(this).attr("ssrc");if(mySdp.containsSSRC(ssrc)){logger.error("Got remove stream request for my own ssrc: "+ssrc);return}$(this).find(">parameter").each(function(){lines+="a=ssrc:"+ssrc+" "+$(this).attr("name");if($(this).attr("value")&&$(this).attr("value").length)lines+=":"+$(this).attr("value");lines+="\r\n"})});sdp.media.forEach(function(media,idx){if(!SDPUtil.find_line(media,"a=mid:"+name))return;sdp.media[idx]+=lines;if(!self.removessrc[idx])self.removessrc[idx]="";self.removessrc[idx]+=lines});sdp.raw=sdp.session+sdp.media.join("")});this.modifySourcesQueue.push(function(){logger.log("modify sources done");var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",mySdp,newSdp);self.notifyMySSRCUpdate(mySdp,newSdp)})};JingleSessionPC.prototype._modifySources=function(successCallback,queueCallback){var self=this;if(this.peerconnection.signalingState=="closed")return;if(!(this.addssrc.length||this.removessrc.length||this.pendingop!==null||this.switchstreams||this.addingStreams)){this.setLocalDescription();if(successCallback){successCallback()}queueCallback();return}this.switchstreams=false;this.addingStreams=false;var sdp=new SDP(this.peerconnection.remoteDescription.sdp);this.addssrc.forEach(function(lines,idx){sdp.media[idx]+=lines});this.addssrc=[];this.removessrc.forEach(function(lines,idx){lines=lines.split("\r\n");lines.pop();lines.forEach(function(line){sdp.media[idx]=sdp.media[idx].replace(line+"\r\n","")})});this.removessrc=[];sdp.raw=sdp.session+sdp.media.join("");this.peerconnection.setRemoteDescription(new RTCSessionDescription({type:"offer",sdp:sdp.raw}),function(){if(self.signalingState=="closed"){logger.error("createAnswer attempt on closed state");queueCallback("createAnswer attempt on closed state");return}self.peerconnection.createAnswer(function(modifiedAnswer){if(self.pendingop!==null){var sdp=new SDP(modifiedAnswer.sdp);if(sdp.media.length>1){switch(self.pendingop){case"mute":sdp.media[1]=sdp.media[1].replace("a=sendrecv","a=recvonly");break;case"unmute":sdp.media[1]=sdp.media[1].replace("a=recvonly","a=sendrecv");break}sdp.raw=sdp.session+sdp.media.join("");modifiedAnswer.sdp=sdp.raw}self.pendingop=null}self.peerconnection.setLocalDescription(modifiedAnswer,function(){self.setLocalDescription();if(successCallback){successCallback()}queueCallback()},function(error){logger.error("modified setLocalDescription failed",error);queueCallback(error)})},function(error){logger.error("modified answer failed",error);queueCallback(error)})},function(error){logger.error("modify failed",error);queueCallback(error)})};JingleSessionPC.prototype.switchStreams=function(newStream,oldStream,successCallback,isAudio){var self=this;var sender,newTrack;var senderKind=isAudio?"audio":"video";var oldSdp=null;if(self.peerconnection){if(self.peerconnection.localDescription){oldSdp=new SDP(self.peerconnection.localDescription.sdp)}if(RTCBrowserType.getBrowserType()===RTCBrowserType.RTC_BROWSER_FIREFOX){self.peerconnection.peerconnection.getSenders().some(function(s){if(s.track&&s.track.kind===senderKind){sender=s;return true}});if(sender){newTrack=isAudio?newStream.getAudioTracks()[0]:newStream.getVideoTracks()[0];sender.replaceTrack(newTrack).then(function(){console.log("Replaced a track, isAudio="+isAudio)}).catch(function(err){console.log("Failed to replace a track: "+err)})}else{console.log("Cannot switch tracks: no RTPSender.")}}else{self.peerconnection.removeStream(oldStream,true);if(newStream){self.peerconnection.addStream(newStream)}}}if(!oldSdp){successCallback();return}self.switchstreams=true;self.modifySourcesQueue.push(function(){logger.log("modify sources done");successCallback();var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",oldSdp,newSdp);self.notifyMySSRCUpdate(oldSdp,newSdp)})};JingleSessionPC.prototype.addStream=function(stream,callback){var self=this;var oldSdp=null;if(this.peerconnection){if(this.peerconnection.localDescription){oldSdp=new SDP(this.peerconnection.localDescription.sdp)}if(stream)this.peerconnection.addStream(stream)}if(!oldSdp||!this.peerconnection){callback();return}this.addingStreams=true;this.modifySourcesQueue.push(function(){logger.log("modify sources done");callback();var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",oldSdp,newSdp);self.notifyMySSRCUpdate(oldSdp,newSdp)})};JingleSessionPC.prototype.removeStream=function(stream,callback){var self=this;var oldSdp=null;if(this.peerconnection){if(this.peerconnection.localDescription){oldSdp=new SDP(this.peerconnection.localDescription.sdp)}if(stream)this.peerconnection.removeStream(stream)}if(!oldSdp||!this.peerconnection){callback();return}this.addingStreams=true;this.modifySourcesQueue.push(function(){logger.log("modify sources done");callback();var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",oldSdp,newSdp);self.notifyMySSRCUpdate(oldSdp,newSdp)})};JingleSessionPC.prototype.notifyMySSRCUpdate=function(old_sdp,new_sdp){if(!(this.peerconnection.signalingState=="stable"&&this.peerconnection.iceConnectionState=="connected")){logger.log("Too early to send updates");return}sdpDiffer=new SDPDiffer(new_sdp,old_sdp);var remove=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"source-remove",initiator:this.initiator,sid:this.sid});var removed=sdpDiffer.toJingle(remove);if(removed)remove=SSRCReplacement.processSourceRemove(remove);if(removed&&remove){logger.info("Sending source-remove",remove);this.connection.sendIQ(remove,function(res){logger.info("got remove result",res)},function(err){logger.error("got remove error",err)})}else{logger.log("removal not necessary")}var sdpDiffer=new SDPDiffer(old_sdp,new_sdp);var add=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"source-add",initiator:this.initiator,sid:this.sid});var added=sdpDiffer.toJingle(add);if(added)add=SSRCReplacement.processSourceAdd(add);if(added&&add){logger.info("Sending source-add",add);this.connection.sendIQ(add,function(res){logger.info("got add result",res)},function(err){logger.error("got add error",err)})}else{logger.log("addition not necessary");