diff --git a/JitsiConference.js b/JitsiConference.js index 57568cd6d..49dc9eed2 100644 --- a/JitsiConference.js +++ b/JitsiConference.js @@ -256,6 +256,16 @@ JitsiConference.prototype.setDisplayName = function(name) { } }; +/** + * Set new subject for this conference. (available only for moderator) + * @param {string} subject new subject + */ +JitsiConference.prototype.setSubject = function (subject) { + if (this.room && this.isModerator()) { + this.room.setSubject(subject); + } +}; + /** * Adds JitsiLocalTrack object to the conference. * @param track the JitsiLocalTrack object. @@ -783,6 +793,10 @@ function setupListeners(conference) { } ); + conference.room.addListener(XMPPEvents.SUBJECT_CHANGED, function (subject) { + conference.eventEmitter.emit(JitsiConferenceEvents.SUBJECT_CHANGED, subject); + }); + conference.room.addListener(XMPPEvents.MUC_JOINED, function () { conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_JOINED); }); diff --git a/JitsiConferenceEvents.js b/JitsiConferenceEvents.js index b80d3f0dd..46490075a 100644 --- a/JitsiConferenceEvents.js +++ b/JitsiConferenceEvents.js @@ -35,6 +35,10 @@ var JitsiConferenceEvents = { * A user has changed it display name */ DISPLAY_NAME_CHANGED: "conference.displayNameChanged", + /** + * Indicates that subject of the conference has changed. + */ + SUBJECT_CHANGED: "conference.subjectChanged", /** * A participant avatar has changed. */ diff --git a/doc/API.md b/doc/API.md index 61ebe963e..745787d4d 100644 --- a/doc/API.md +++ b/doc/API.md @@ -82,6 +82,7 @@ JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.ERROR); - USER_LEFT - a participant left conference. (parameters - id(string), user(JitsiParticipant)) - MESSAGE_RECEIVED - new text message received. (parameters - id(string), text(string), ts(number)) - DISPLAY_NAME_CHANGED - user has changed his display name. (parameters - id(string), displayName(string)) + - SUBJECT_CHANGED - notifies that subject of the conference has changed (parameters - subject(string)) - LAST_N_ENDPOINTS_CHANGED - last n set was changed (parameters - array of ids of users) - IN_LAST_N_CHANGED - passes boolean property that shows whether the local user is included in last n set of any other user or not. (parameters - boolean) - CONFERENCE_JOINED - notifies the local user that he joined the conference successfully. (no parameters) @@ -271,6 +272,11 @@ The object represents a conference. We have the following methods to control the 28. isStartVideoMuted() - check if video is muted on join +29. setSubject(subject) - change subject of the conference + - subject - string new subject + + Note: available only for moderator + JitsiTrack ====== The object represents single track - video or audio. They can be remote tracks ( from the other participants in the call) or local tracks (from the devices of the local participant). diff --git a/lib-jitsi-meet.js b/lib-jitsi-meet.js index 4f6bc1a81..48e8bd583 100644 --- a/lib-jitsi-meet.js +++ b/lib-jitsi-meet.js @@ -258,6 +258,16 @@ JitsiConference.prototype.setDisplayName = function(name) { } }; +/** + * Set new subject for this conference. (available only for moderator) + * @param {string} subject new subject + */ +JitsiConference.prototype.setSubject = function (subject) { + if (this.room && this.isModerator()) { + this.room.setSubject(subject); + } +}; + /** * Adds JitsiLocalTrack object to the conference. * @param track the JitsiLocalTrack object. @@ -785,6 +795,10 @@ function setupListeners(conference) { } ); + conference.room.addListener(XMPPEvents.SUBJECT_CHANGED, function (subject) { + conference.eventEmitter.emit(JitsiConferenceEvents.SUBJECT_CHANGED, subject); + }); + conference.room.addListener(XMPPEvents.MUC_JOINED, function () { conference.eventEmitter.emit(JitsiConferenceEvents.CONFERENCE_JOINED); }); @@ -1001,7 +1015,7 @@ function setupListeners(conference) { module.exports = JitsiConference; }).call(this,"/JitsiConference.js") -},{"./JitsiConferenceErrors":2,"./JitsiConferenceEvents":3,"./JitsiParticipant":8,"./JitsiTrackEvents":10,"./modules/DTMF/JitsiDTMFManager":11,"./modules/RTC/RTC":16,"./modules/settings/Settings":21,"./modules/statistics/statistics":25,"./service/RTC/RTCEvents":132,"./service/authentication/AuthenticationEvents":134,"./service/xmpp/XMPPEvents":138,"events":45,"jitsi-meet-logger":49}],2:[function(require,module,exports){ +},{"./JitsiConferenceErrors":2,"./JitsiConferenceEvents":3,"./JitsiParticipant":8,"./JitsiTrackEvents":10,"./modules/DTMF/JitsiDTMFManager":11,"./modules/RTC/RTC":16,"./modules/settings/Settings":21,"./modules/statistics/statistics":25,"./service/RTC/RTCEvents":136,"./service/authentication/AuthenticationEvents":138,"./service/xmpp/XMPPEvents":142,"events":45,"jitsi-meet-logger":49}],2:[function(require,module,exports){ /** * Enumeration with the errors for the conference. * @type {{string: string}} @@ -1077,6 +1091,10 @@ var JitsiConferenceEvents = { * A user has changed it display name */ DISPLAY_NAME_CHANGED: "conference.displayNameChanged", + /** + * Indicates that subject of the conference has changed. + */ + SUBJECT_CHANGED: "conference.subjectChanged", /** * A participant avatar has changed. */ @@ -1419,7 +1437,7 @@ window.Promise = window.Promise || require("es6-promise").Promise; module.exports = LibJitsiMeet; -},{"./JitsiConferenceErrors":2,"./JitsiConferenceEvents":3,"./JitsiConnection":4,"./JitsiConnectionErrors":5,"./JitsiConnectionEvents":6,"./JitsiTrackErrors":9,"./JitsiTrackEvents":10,"./modules/RTC/RTC":16,"./modules/statistics/statistics":25,"./service/RTC/Resolutions":133,"es6-promise":47,"jitsi-meet-logger":49}],8:[function(require,module,exports){ +},{"./JitsiConferenceErrors":2,"./JitsiConferenceEvents":3,"./JitsiConnection":4,"./JitsiConnectionErrors":5,"./JitsiConnectionEvents":6,"./JitsiTrackErrors":9,"./JitsiTrackEvents":10,"./modules/RTC/RTC":16,"./modules/statistics/statistics":25,"./service/RTC/Resolutions":137,"es6-promise":47,"jitsi-meet-logger":49}],8:[function(require,module,exports){ /* global Strophe */ /** @@ -1867,7 +1885,7 @@ module.exports = DataChannels; }).call(this,"/modules/RTC/DataChannels.js") -},{"../../service/RTC/RTCEvents":132,"jitsi-meet-logger":49}],13:[function(require,module,exports){ +},{"../../service/RTC/RTCEvents":136,"jitsi-meet-logger":49}],13:[function(require,module,exports){ var JitsiTrack = require("./JitsiTrack"); var RTCBrowserType = require("./RTCBrowserType"); var JitsiTrackEvents = require('../../JitsiTrackEvents'); @@ -2644,7 +2662,7 @@ RTC.prototype.setAudioLevel = function (jid, audioLevel) { } module.exports = RTC; -},{"../../service/RTC/MediaStreamTypes":131,"../../service/RTC/RTCEvents.js":132,"../../service/desktopsharing/DesktopSharingEventTypes":135,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,"events":45}],17:[function(require,module,exports){ +},{"../../service/RTC/MediaStreamTypes":135,"../../service/RTC/RTCEvents.js":136,"../../service/desktopsharing/DesktopSharingEventTypes":139,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,"events":45}],17:[function(require,module,exports){ var currentBrowser; @@ -3637,7 +3655,7 @@ var RTCUtils = { module.exports = RTCUtils; }).call(this,"/modules/RTC/RTCUtils.js") -},{"../../JitsiTrackErrors":9,"../../service/RTC/RTCEvents":132,"../../service/RTC/Resolutions":133,"../xmpp/SDPUtil":33,"./RTCBrowserType":17,"./ScreenObtainer":19,"./adapter.screenshare":20,"events":45,"jitsi-meet-logger":49}],19:[function(require,module,exports){ +},{"../../JitsiTrackErrors":9,"../../service/RTC/RTCEvents":136,"../../service/RTC/Resolutions":137,"../xmpp/SDPUtil":33,"./RTCBrowserType":17,"./ScreenObtainer":19,"./adapter.screenshare":20,"events":45,"jitsi-meet-logger":49}],19:[function(require,module,exports){ (function (__filename){ /* global chrome, $, alert */ /* jshint -W003 */ @@ -4053,7 +4071,7 @@ function initFirefoxExtensionDetection(options) { module.exports = ScreenObtainer; }).call(this,"/modules/RTC/ScreenObtainer.js") -},{"../../JitsiTrackErrors":9,"../../service/desktopsharing/DesktopSharingEventTypes":135,"./RTCBrowserType":17,"./adapter.screenshare":20,"jitsi-meet-logger":49}],20:[function(require,module,exports){ +},{"../../JitsiTrackErrors":9,"../../service/desktopsharing/DesktopSharingEventTypes":139,"./RTCBrowserType":17,"./adapter.screenshare":20,"jitsi-meet-logger":49}],20:[function(require,module,exports){ (function (__filename){ /*! adapterjs - v0.12.3 - 2015-11-16 */ var console = require("jitsi-meet-logger").getLogger(__filename); @@ -5587,7 +5605,7 @@ CallStats.sendAddIceCandidateFailed = _try_catch(function (e, pc, cs) { module.exports = CallStats; }).call(this,"/modules/statistics/CallStats.js") -},{"jitsi-meet-logger":49,"jssha":50,"socket.io-client":81}],23:[function(require,module,exports){ +},{"jitsi-meet-logger":49,"jssha":50,"socket.io-client":85}],23:[function(require,module,exports){ /* global config */ /** * Provides statistics for the local stream. @@ -6444,7 +6462,7 @@ StatsCollector.prototype.processAudioLevelReport = function () { }; }).call(this,"/modules/statistics/RTPStatsCollector.js") -},{"../../service/statistics/Events":136,"../RTC/RTCBrowserType":17,"jitsi-meet-logger":49}],25:[function(require,module,exports){ +},{"../../service/statistics/Events":140,"../RTC/RTCBrowserType":17,"jitsi-meet-logger":49}],25:[function(require,module,exports){ /* global require, APP */ var LocalStats = require("./LocalStatsCollector.js"); var RTPStats = require("./RTPStatsCollector.js"); @@ -6728,7 +6746,7 @@ Statistics.LOCAL_JID = require("../../service/statistics/constants").LOCAL_JID; module.exports = Statistics; -},{"../../service/statistics/Events":136,"../../service/statistics/constants":137,"./CallStats":22,"./LocalStatsCollector.js":23,"./RTPStatsCollector.js":24,"events":45}],26:[function(require,module,exports){ +},{"../../service/statistics/Events":140,"../../service/statistics/constants":141,"./CallStats":22,"./LocalStatsCollector.js":23,"./RTPStatsCollector.js":24,"events":45}],26:[function(require,module,exports){ /** /** * @const @@ -7594,7 +7612,6 @@ 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); }; @@ -8048,7 +8065,7 @@ ChatRoom.prototype.onMute = function (iq) { module.exports = ChatRoom; }).call(this,"/modules/xmpp/ChatRoom.js") -},{"../../service/xmpp/XMPPEvents":138,"./moderator":35,"./recording":36,"events":45,"jitsi-meet-logger":49}],29:[function(require,module,exports){ +},{"../../service/xmpp/XMPPEvents":142,"./moderator":35,"./recording":36,"events":45,"jitsi-meet-logger":49}],29:[function(require,module,exports){ (function (__filename){ /* * JingleSession provides an API to manage a single Jingle session. We will @@ -9847,7 +9864,7 @@ JingleSessionPC.prototype.getIceConnectionState = function () { module.exports = JingleSessionPC; }).call(this,"/modules/xmpp/JingleSessionPC.js") -},{"../../service/xmpp/XMPPEvents":138,"../RTC/RTC":16,"../RTC/RTCBrowserType":17,"./JingleSession":29,"./SDP":31,"./SDPDiffer":32,"./SDPUtil":33,"./TraceablePeerConnection":34,"async":44,"jitsi-meet-logger":49,"sdp-transform":78}],31:[function(require,module,exports){ +},{"../../service/xmpp/XMPPEvents":142,"../RTC/RTC":16,"../RTC/RTCBrowserType":17,"./JingleSession":29,"./SDP":31,"./SDPDiffer":32,"./SDPUtil":33,"./TraceablePeerConnection":34,"async":44,"jitsi-meet-logger":49,"sdp-transform":82}],31:[function(require,module,exports){ (function (__filename){ /* jshint -W117 */ @@ -11542,7 +11559,7 @@ TraceablePeerConnection.prototype.getStats = function(callback, errback) { module.exports = TraceablePeerConnection; }).call(this,"/modules/xmpp/TraceablePeerConnection.js") -},{"../../service/xmpp/XMPPEvents":138,"../RTC/RTC":16,"../RTC/RTCBrowserType.js":17,"../util/RandomUtil":26,"jitsi-meet-logger":49,"sdp-interop":68,"sdp-simulcast":75,"sdp-transform":78}],35:[function(require,module,exports){ +},{"../../service/xmpp/XMPPEvents":142,"../RTC/RTC":16,"../RTC/RTCBrowserType.js":17,"../util/RandomUtil":26,"jitsi-meet-logger":49,"sdp-interop":68,"sdp-simulcast":75,"sdp-transform":82}],35:[function(require,module,exports){ (function (__filename){ /* global $, $iq, Promise, Strophe */ @@ -11998,7 +12015,7 @@ Moderator.prototype.logout = function (callback) { module.exports = Moderator; }).call(this,"/modules/xmpp/moderator.js") -},{"../../service/authentication/AuthenticationEvents":134,"../../service/xmpp/XMPPEvents":138,"jitsi-meet-logger":49}],36:[function(require,module,exports){ +},{"../../service/authentication/AuthenticationEvents":138,"../../service/xmpp/XMPPEvents":142,"jitsi-meet-logger":49}],36:[function(require,module,exports){ (function (__filename){ /* global $, $iq, config, connection, focusMucJid, messageHandler, Toolbar, Util, Promise */ @@ -12225,7 +12242,7 @@ Recording.prototype.getURL = function () { module.exports = Recording; }).call(this,"/modules/xmpp/recording.js") -},{"../../service/xmpp/XMPPEvents":138,"jitsi-meet-logger":49}],37:[function(require,module,exports){ +},{"../../service/xmpp/XMPPEvents":142,"jitsi-meet-logger":49}],37:[function(require,module,exports){ (function (__filename){ /* jshint -W117 */ /* a simple MUC connection plugin @@ -12635,7 +12652,7 @@ module.exports = function(XMPP, eventEmitter) { }).call(this,"/modules/xmpp/strophe.jingle.js") -},{"../../service/xmpp/XMPPEvents":138,"../RTC/RTCBrowserType":17,"./JingleSessionPC":30,"jitsi-meet-logger":49}],39:[function(require,module,exports){ +},{"../../service/xmpp/XMPPEvents":142,"../RTC/RTCBrowserType":17,"./JingleSessionPC":30,"jitsi-meet-logger":49}],39:[function(require,module,exports){ /* global Strophe */ module.exports = function () { @@ -12783,7 +12800,7 @@ module.exports = function (XMPP, eventEmitter) { }; }).call(this,"/modules/xmpp/strophe.ping.js") -},{"../../service/xmpp/XMPPEvents":138,"jitsi-meet-logger":49}],41:[function(require,module,exports){ +},{"../../service/xmpp/XMPPEvents":142,"jitsi-meet-logger":49}],41:[function(require,module,exports){ (function (__filename){ /* jshint -W117 */ var logger = require("jitsi-meet-logger").getLogger(__filename); @@ -13261,7 +13278,7 @@ XMPP.prototype.disconnect = function () { module.exports = XMPP; }).call(this,"/modules/xmpp/xmpp.js") -},{"../../JitsiConnectionErrors":5,"../../JitsiConnectionEvents":6,"../../service/RTC/RTCEvents":132,"../../service/xmpp/XMPPEvents":138,"../RTC/RTC":16,"./strophe.emuc":37,"./strophe.jingle":38,"./strophe.logger":39,"./strophe.ping":40,"./strophe.rayo":41,"./strophe.util":42,"events":45,"jitsi-meet-logger":49,"pako":51}],44:[function(require,module,exports){ +},{"../../JitsiConnectionErrors":5,"../../JitsiConnectionEvents":6,"../../service/RTC/RTCEvents":136,"../../service/xmpp/XMPPEvents":142,"../RTC/RTC":16,"./strophe.emuc":37,"./strophe.jingle":38,"./strophe.logger":39,"./strophe.ping":40,"./strophe.rayo":41,"./strophe.util":42,"events":45,"jitsi-meet-logger":49,"pako":51}],44:[function(require,module,exports){ (function (process){ /*! * async @@ -24326,10 +24343,18 @@ arguments[4][73][0].apply(exports,arguments) },{"./grammar":77,"dup":73}],80:[function(require,module,exports){ arguments[4][74][0].apply(exports,arguments) },{"./grammar":77,"dup":74}],81:[function(require,module,exports){ +arguments[4][71][0].apply(exports,arguments) +},{"dup":71}],82:[function(require,module,exports){ +arguments[4][72][0].apply(exports,arguments) +},{"./parser":83,"./writer":84,"dup":72}],83:[function(require,module,exports){ +arguments[4][73][0].apply(exports,arguments) +},{"./grammar":81,"dup":73}],84:[function(require,module,exports){ +arguments[4][74][0].apply(exports,arguments) +},{"./grammar":81,"dup":74}],85:[function(require,module,exports){ module.exports = require('./lib/'); -},{"./lib/":82}],82:[function(require,module,exports){ +},{"./lib/":86}],86:[function(require,module,exports){ /** * Module dependencies. @@ -24418,7 +24443,7 @@ exports.connect = lookup; exports.Manager = require('./manager'); exports.Socket = require('./socket'); -},{"./manager":83,"./socket":85,"./url":86,"debug":90,"socket.io-parser":126}],83:[function(require,module,exports){ +},{"./manager":87,"./socket":89,"./url":90,"debug":94,"socket.io-parser":130}],87:[function(require,module,exports){ /** * Module dependencies. @@ -24923,7 +24948,7 @@ Manager.prototype.onreconnect = function(){ this.emitAll('reconnect', attempt); }; -},{"./on":84,"./socket":85,"./url":86,"backo2":87,"component-bind":88,"component-emitter":89,"debug":90,"engine.io-client":91,"indexof":122,"object-component":123,"socket.io-parser":126}],84:[function(require,module,exports){ +},{"./on":88,"./socket":89,"./url":90,"backo2":91,"component-bind":92,"component-emitter":93,"debug":94,"engine.io-client":95,"indexof":126,"object-component":127,"socket.io-parser":130}],88:[function(require,module,exports){ /** * Module exports. @@ -24949,7 +24974,7 @@ function on(obj, ev, fn) { }; } -},{}],85:[function(require,module,exports){ +},{}],89:[function(require,module,exports){ /** * Module dependencies. @@ -25336,7 +25361,7 @@ Socket.prototype.disconnect = function(){ return this; }; -},{"./on":84,"component-bind":88,"component-emitter":89,"debug":90,"has-binary":120,"socket.io-parser":126,"to-array":130}],86:[function(require,module,exports){ +},{"./on":88,"component-bind":92,"component-emitter":93,"debug":94,"has-binary":124,"socket.io-parser":130,"to-array":134}],90:[function(require,module,exports){ (function (global){ /** @@ -25413,7 +25438,7 @@ function url(uri, loc){ } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"debug":90,"parseuri":124}],87:[function(require,module,exports){ +},{"debug":94,"parseuri":128}],91:[function(require,module,exports){ /** * Expose `Backoff`. @@ -25500,7 +25525,7 @@ Backoff.prototype.setJitter = function(jitter){ }; -},{}],88:[function(require,module,exports){ +},{}],92:[function(require,module,exports){ /** * Slice reference. */ @@ -25525,7 +25550,7 @@ module.exports = function(obj, fn){ } }; -},{}],89:[function(require,module,exports){ +},{}],93:[function(require,module,exports){ /** * Expose `Emitter`. @@ -25691,7 +25716,7 @@ Emitter.prototype.hasListeners = function(event){ return !! this.listeners(event).length; }; -},{}],90:[function(require,module,exports){ +},{}],94:[function(require,module,exports){ /** * Expose `debug()` as the module. @@ -25830,11 +25855,11 @@ try { if (window.localStorage) debug.enable(localStorage.debug); } catch(e){} -},{}],91:[function(require,module,exports){ +},{}],95:[function(require,module,exports){ module.exports = require('./lib/'); -},{"./lib/":92}],92:[function(require,module,exports){ +},{"./lib/":96}],96:[function(require,module,exports){ module.exports = require('./socket'); @@ -25846,7 +25871,7 @@ module.exports = require('./socket'); */ module.exports.parser = require('engine.io-parser'); -},{"./socket":93,"engine.io-parser":105}],93:[function(require,module,exports){ +},{"./socket":97,"engine.io-parser":109}],97:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -26555,7 +26580,7 @@ Socket.prototype.filterUpgrades = function (upgrades) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./transport":94,"./transports":95,"component-emitter":89,"debug":102,"engine.io-parser":105,"indexof":122,"parsejson":116,"parseqs":117,"parseuri":118}],94:[function(require,module,exports){ +},{"./transport":98,"./transports":99,"component-emitter":93,"debug":106,"engine.io-parser":109,"indexof":126,"parsejson":120,"parseqs":121,"parseuri":122}],98:[function(require,module,exports){ /** * Module dependencies. */ @@ -26716,7 +26741,7 @@ Transport.prototype.onClose = function () { this.emit('close'); }; -},{"component-emitter":89,"engine.io-parser":105}],95:[function(require,module,exports){ +},{"component-emitter":93,"engine.io-parser":109}],99:[function(require,module,exports){ (function (global){ /** * Module dependencies @@ -26773,7 +26798,7 @@ function polling(opts){ } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./polling-jsonp":96,"./polling-xhr":97,"./websocket":99,"xmlhttprequest":100}],96:[function(require,module,exports){ +},{"./polling-jsonp":100,"./polling-xhr":101,"./websocket":103,"xmlhttprequest":104}],100:[function(require,module,exports){ (function (global){ /** @@ -27010,7 +27035,7 @@ JSONPPolling.prototype.doWrite = function (data, fn) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./polling":98,"component-inherit":101}],97:[function(require,module,exports){ +},{"./polling":102,"component-inherit":105}],101:[function(require,module,exports){ (function (global){ /** * Module requirements. @@ -27398,7 +27423,7 @@ function unloadHandler() { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./polling":98,"component-emitter":89,"component-inherit":101,"debug":102,"xmlhttprequest":100}],98:[function(require,module,exports){ +},{"./polling":102,"component-emitter":93,"component-inherit":105,"debug":106,"xmlhttprequest":104}],102:[function(require,module,exports){ /** * Module dependencies. */ @@ -27645,7 +27670,7 @@ Polling.prototype.uri = function(){ return schema + '://' + this.hostname + port + this.path + query; }; -},{"../transport":94,"component-inherit":101,"debug":102,"engine.io-parser":105,"parseqs":117,"xmlhttprequest":100}],99:[function(require,module,exports){ +},{"../transport":98,"component-inherit":105,"debug":106,"engine.io-parser":109,"parseqs":121,"xmlhttprequest":104}],103:[function(require,module,exports){ /** * Module dependencies. */ @@ -27885,7 +27910,7 @@ WS.prototype.check = function(){ return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name); }; -},{"../transport":94,"component-inherit":101,"debug":102,"engine.io-parser":105,"parseqs":117,"ws":119}],100:[function(require,module,exports){ +},{"../transport":98,"component-inherit":105,"debug":106,"engine.io-parser":109,"parseqs":121,"ws":123}],104:[function(require,module,exports){ // browser shim for xmlhttprequest module var hasCORS = require('has-cors'); @@ -27923,7 +27948,7 @@ module.exports = function(opts) { } } -},{"has-cors":114}],101:[function(require,module,exports){ +},{"has-cors":118}],105:[function(require,module,exports){ module.exports = function(a, b){ var fn = function(){}; @@ -27931,7 +27956,7 @@ module.exports = function(a, b){ a.prototype = new fn; a.prototype.constructor = a; }; -},{}],102:[function(require,module,exports){ +},{}],106:[function(require,module,exports){ /** * This is the web browser implementation of `debug()`. @@ -28080,7 +28105,7 @@ function load() { exports.enable(load()); -},{"./debug":103}],103:[function(require,module,exports){ +},{"./debug":107}],107:[function(require,module,exports){ /** * This is the common logic for both the Node.js and web browser @@ -28279,7 +28304,7 @@ function coerce(val) { return val; } -},{"ms":104}],104:[function(require,module,exports){ +},{"ms":108}],108:[function(require,module,exports){ /** * Helpers. */ @@ -28392,7 +28417,7 @@ function plural(ms, n, name) { return Math.ceil(ms / n) + ' ' + name + 's'; } -},{}],105:[function(require,module,exports){ +},{}],109:[function(require,module,exports){ (function (global){ /** * Module dependencies. @@ -28990,7 +29015,7 @@ exports.decodePayloadAsBinary = function (data, binaryType, callback) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./keys":106,"after":107,"arraybuffer.slice":108,"base64-arraybuffer":109,"blob":110,"has-binary":111,"utf8":113}],106:[function(require,module,exports){ +},{"./keys":110,"after":111,"arraybuffer.slice":112,"base64-arraybuffer":113,"blob":114,"has-binary":115,"utf8":117}],110:[function(require,module,exports){ /** * Gets the keys for an object. @@ -29011,7 +29036,7 @@ module.exports = Object.keys || function keys (obj){ return arr; }; -},{}],107:[function(require,module,exports){ +},{}],111:[function(require,module,exports){ module.exports = after function after(count, callback, err_cb) { @@ -29041,7 +29066,7 @@ function after(count, callback, err_cb) { function noop() {} -},{}],108:[function(require,module,exports){ +},{}],112:[function(require,module,exports){ /** * An abstraction for slicing an arraybuffer even when * ArrayBuffer.prototype.slice is not supported @@ -29072,7 +29097,7 @@ module.exports = function(arraybuffer, start, end) { return result.buffer; }; -},{}],109:[function(require,module,exports){ +},{}],113:[function(require,module,exports){ /* * base64-arraybuffer * https://github.com/niklasvh/base64-arraybuffer @@ -29133,7 +29158,7 @@ module.exports = function(arraybuffer, start, end) { }; })("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"); -},{}],110:[function(require,module,exports){ +},{}],114:[function(require,module,exports){ (function (global){ /** * Create a blob builder even when vendor prefixes exist @@ -29186,7 +29211,7 @@ module.exports = (function() { })(); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],111:[function(require,module,exports){ +},{}],115:[function(require,module,exports){ (function (global){ /* @@ -29248,12 +29273,12 @@ function hasBinary(data) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"isarray":112}],112:[function(require,module,exports){ +},{"isarray":116}],116:[function(require,module,exports){ module.exports = Array.isArray || function (arr) { return Object.prototype.toString.call(arr) == '[object Array]'; }; -},{}],113:[function(require,module,exports){ +},{}],117:[function(require,module,exports){ (function (global){ /*! http://mths.be/utf8js v2.0.0 by @mathias */ ;(function(root) { @@ -29496,7 +29521,7 @@ module.exports = Array.isArray || function (arr) { }(this)); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],114:[function(require,module,exports){ +},{}],118:[function(require,module,exports){ /** * Module dependencies. @@ -29521,7 +29546,7 @@ try { module.exports = false; } -},{"global":115}],115:[function(require,module,exports){ +},{"global":119}],119:[function(require,module,exports){ /** * Returns `this`. Execute this without a "context" (i.e. without it being @@ -29531,7 +29556,7 @@ try { module.exports = (function () { return this; })(); -},{}],116:[function(require,module,exports){ +},{}],120:[function(require,module,exports){ (function (global){ /** * JSON parse. @@ -29566,7 +29591,7 @@ module.exports = function parsejson(data) { } }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],117:[function(require,module,exports){ +},{}],121:[function(require,module,exports){ /** * Compiles a querystring * Returns string representation of the object @@ -29605,7 +29630,7 @@ exports.decode = function(qs){ return qry; }; -},{}],118:[function(require,module,exports){ +},{}],122:[function(require,module,exports){ /** * Parses an URI * @@ -29646,7 +29671,7 @@ module.exports = function parseuri(str) { return uri; }; -},{}],119:[function(require,module,exports){ +},{}],123:[function(require,module,exports){ /** * Module dependencies. @@ -29691,7 +29716,7 @@ function ws(uri, protocols, opts) { if (WebSocket) ws.prototype = WebSocket.prototype; -},{}],120:[function(require,module,exports){ +},{}],124:[function(require,module,exports){ (function (global){ /* @@ -29753,9 +29778,9 @@ function hasBinary(data) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"isarray":121}],121:[function(require,module,exports){ -arguments[4][112][0].apply(exports,arguments) -},{"dup":112}],122:[function(require,module,exports){ +},{"isarray":125}],125:[function(require,module,exports){ +arguments[4][116][0].apply(exports,arguments) +},{"dup":116}],126:[function(require,module,exports){ var indexOf = [].indexOf; @@ -29766,7 +29791,7 @@ module.exports = function(arr, obj){ } return -1; }; -},{}],123:[function(require,module,exports){ +},{}],127:[function(require,module,exports){ /** * HOP ref. @@ -29851,7 +29876,7 @@ exports.length = function(obj){ exports.isEmpty = function(obj){ return 0 == exports.length(obj); }; -},{}],124:[function(require,module,exports){ +},{}],128:[function(require,module,exports){ /** * Parses an URI * @@ -29878,7 +29903,7 @@ module.exports = function parseuri(str) { return uri; }; -},{}],125:[function(require,module,exports){ +},{}],129:[function(require,module,exports){ (function (global){ /*global Blob,File*/ @@ -30023,7 +30048,7 @@ exports.removeBlobs = function(data, callback) { }; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./is-buffer":127,"isarray":128}],126:[function(require,module,exports){ +},{"./is-buffer":131,"isarray":132}],130:[function(require,module,exports){ /** * Module dependencies. @@ -30425,7 +30450,7 @@ function error(data){ }; } -},{"./binary":125,"./is-buffer":127,"component-emitter":89,"debug":90,"isarray":128,"json3":129}],127:[function(require,module,exports){ +},{"./binary":129,"./is-buffer":131,"component-emitter":93,"debug":94,"isarray":132,"json3":133}],131:[function(require,module,exports){ (function (global){ module.exports = isBuf; @@ -30442,9 +30467,9 @@ function isBuf(obj) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],128:[function(require,module,exports){ -arguments[4][112][0].apply(exports,arguments) -},{"dup":112}],129:[function(require,module,exports){ +},{}],132:[function(require,module,exports){ +arguments[4][116][0].apply(exports,arguments) +},{"dup":116}],133:[function(require,module,exports){ /*! JSON v3.2.6 | http://bestiejs.github.io/json3 | Copyright 2012-2013, Kit Cambridge | http://kit.mit-license.org */ ;(function (window) { // Convenience aliases. @@ -31307,7 +31332,7 @@ arguments[4][112][0].apply(exports,arguments) } }(this)); -},{}],130:[function(require,module,exports){ +},{}],134:[function(require,module,exports){ module.exports = toArray function toArray(list, index) { @@ -31322,14 +31347,14 @@ function toArray(list, index) { return array } -},{}],131:[function(require,module,exports){ +},{}],135:[function(require,module,exports){ var MediaStreamType = { VIDEO_TYPE: "Video", AUDIO_TYPE: "Audio" }; module.exports = MediaStreamType; -},{}],132:[function(require,module,exports){ +},{}],136:[function(require,module,exports){ var RTCEvents = { RTC_READY: "rtc.ready", DATA_CHANNEL_OPEN: "rtc.data_channel_open", @@ -31341,7 +31366,7 @@ var RTCEvents = { }; module.exports = RTCEvents; -},{}],133:[function(require,module,exports){ +},{}],137:[function(require,module,exports){ var Resolutions = { "1080": { width: 1920, @@ -31395,7 +31420,7 @@ var Resolutions = { } }; module.exports = Resolutions; -},{}],134:[function(require,module,exports){ +},{}],138:[function(require,module,exports){ var AuthenticationEvents = { /** * Event callback arguments: @@ -31409,7 +31434,7 @@ var AuthenticationEvents = { }; module.exports = AuthenticationEvents; -},{}],135:[function(require,module,exports){ +},{}],139:[function(require,module,exports){ var DesktopSharingEventTypes = { /** * An event which indicates that the jidesha extension for Firefox is @@ -31420,7 +31445,7 @@ var DesktopSharingEventTypes = { module.exports = DesktopSharingEventTypes; -},{}],136:[function(require,module,exports){ +},{}],140:[function(require,module,exports){ module.exports = { /** * An event carrying connection statistics. @@ -31436,12 +31461,12 @@ module.exports = { STOP: "statistics.stop" }; -},{}],137:[function(require,module,exports){ +},{}],141:[function(require,module,exports){ var Constants = { LOCAL_JID: 'local' }; module.exports = Constants; -},{}],138:[function(require,module,exports){ +},{}],142:[function(require,module,exports){ var XMPPEvents = { // Designates an event indicating that the connection to the XMPP server // failed. diff --git a/lib-jitsi-meet.min.js b/lib-jitsi-meet.min.js index e90965a22..81e5b4526 100644 --- a/lib-jitsi-meet.min.js +++ b/lib-jitsi-meet.min.js @@ -1,16 +1,16 @@ -(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.lastSelectedEndpoint=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":132,"jitsi-meet-logger":49}],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==JitsiTrack.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(){if(this.stream)return RTC.getStreamID(this.stream);else return null};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:45}],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":131,"../../service/RTC/RTCEvents.js":132,"../../service/desktopsharing/DesktopSharingEventTypes":135,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,events:45}],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(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(!RTCBrowserType.isTemasysPluginUsed()&&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":132,"../../service/RTC/Resolutions":133,"../xmpp/SDPUtil":33,"./RTCBrowserType":17,"./ScreenObtainer":19,"./adapter.screenshare":20,events:45,"jitsi-meet-logger":49}],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 JitsiTrackErrors=require("../../JitsiTrackErrors");var chromeExtInstalled=false;var chromeExtUpdateRequired=false;var firefoxExtInstalled=null;var reDetectFirefoxExtension=false;var GUM=null;var ScreenObtainer={obtainStream:null,init:function(options,gum){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;errorCallback({type:"jitsiError",errorObject:JitsiTrackErrors.FIREFOX_EXTENSION_NEEDED})},obtainScreenFromExtension:function(streamCallback,failCallback){var self=this;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(self.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")},{"../../JitsiTrackErrors":9,"../../service/desktopsharing/DesktopSharingEventTypes":135,"./RTCBrowserType":17,"./adapter.screenshare":20,"jitsi-meet-logger":49}],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":49}],21:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var UsernameGenerator=require("../util/UsernameGenerator");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;this.callStatsUserName;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()}if(!this.confSettings.callStatsUserName){this.confSettings.callStatsUserName=UsernameGenerator.generateUsername();logger.log("generated callstats uid",this.confSettings.callStatsUserName);this.save()}this.userId=this.confSettings.jitsiMeetId||"";this.displayName=this.confSettings.displayname||"";this.callStatsUserName=this.confSettings.callStatsUserName||""}else{logger.log("local storage is not supported");this.userId=generateUniqueId();this.callStatsUserName=UsernameGenerator.generateUsername()}}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}};Settings.prototype.getCallStatsUserName=function(){return this.callStatsUserName};module.exports=Settings}).call(this,"/modules/settings/Settings.js")},{"../util/UsernameGenerator":27,"jitsi-meet-logger":49}],22:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var jsSHA=require("jssha");var io=require("socket.io-client");var wrtcFuncNames={createOffer:"createOffer",createAnswer:"createAnswer",setLocalDescription:"setLocalDescription",setRemoteDescription:"setRemoteDescription",addIceCandidate:"addIceCandidate",getUserMedia:"getUserMedia"};var callStats=null;function initCallback(err,msg){logger.log("CallStats Status: err="+err+" msg="+msg)}function _try_catch(f){return function(){try{f.apply(this,arguments)}catch(e){logger.error(e)}}}var CallStats=_try_catch(function(jingleSession,Settings,options){try{if(!callStats){callStats=new callstats($,io,jsSHA)}else{return}this.session=jingleSession;this.peerconnection=jingleSession.peerconnection.peerconnection;this.userID=Settings.getCallStatsUserName();var location=window.location;this.confID=location.hostname+location.pathname;callStats.initialize(options.callStatsID,options.callStatsSecret,this.userID,initCallback);callStats.addNewFabric(this.peerconnection,Strophe.getResourceFromJid(jingleSession.peerjid),callStats.fabricUsage.multiplex,this.confID,this.pcCallback.bind(this))}catch(e){callStats=null;logger.error(e)}if(CallStats.pendingErrors.length){CallStats.pendingErrors.forEach(function(error){CallStats._reportError.call(this,error.type,error.error,error.pc)},this);CallStats.pendingErrors.length=0}});CallStats.pendingErrors=[];CallStats.prototype.pcCallback=_try_catch(function(err,msg){if(!callStats){return}logger.log("Monitoring status: "+err+" msg: "+msg);callStats.sendFabricEvent(this.peerconnection,callStats.fabricEvent.fabricSetup,this.confID)});CallStats.prototype.sendMuteEvent=_try_catch(function(mute,type){if(!callStats){return}var event=null;if(type==="video"){event=mute?callStats.fabricEvent.videoPause:callStats.fabricEvent.videoResume}else{event=mute?callStats.fabricEvent.audioMute:callStats.fabricEvent.audioUnmute}callStats.sendFabricEvent(this.peerconnection,event,this.confID)});CallStats.prototype.sendTerminateEvent=_try_catch(function(){if(!callStats){return}callStats.sendFabricEvent(this.peerconnection,callStats.fabricEvent.fabricTerminated,this.confID)});CallStats.prototype.sendSetupFailedEvent=_try_catch(function(){if(!callStats){return}callStats.sendFabricEvent(this.peerconnection,callStats.fabricEvent.fabricSetupFailed,this.confID)});CallStats.prototype.sendFeedback=_try_catch(function(overallFeedback,detailedFeedback){if(!callStats){return}var feedbackString='{"userID":"'+this.userID+'"'+', "overall":'+overallFeedback+', "comment": "'+detailedFeedback+'"}';var feedbackJSON=JSON.parse(feedbackString);callStats.sendUserFeedback(this.confID,feedbackJSON)});CallStats._reportError=function(type,e,pc){if(callStats){callStats.reportError(pc,this.confID,type,e)}else{CallStats.pendingErrors.push({type:type,error:e,pc:pc})}};CallStats.sendGetUserMediaFailed=_try_catch(function(e,cs){CallStats._reportError.call(cs,wrtcFuncNames.getUserMedia,e,null)});CallStats.sendCreateOfferFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.createOffer,e,pc)});CallStats.sendCreateAnswerFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.createAnswer,e,pc)});CallStats.sendSetLocalDescFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.setLocalDescription,e,pc)});CallStats.sendSetRemoteDescFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.setRemoteDescription,e,pc)});CallStats.sendAddIceCandidateFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.addIceCandidate,e,pc)});module.exports=CallStats}).call(this,"/modules/statistics/CallStats.js")},{"jitsi-meet-logger":49,jssha:50,"socket.io-client":81}],23:[function(require,module,exports){var RTCBrowserType=require("../RTC/RTCBrowserType");var WEBAUDIO_ANALYZER_FFT_SIZE=2048;var WEBAUDIO_ANALYZER_SMOOTING_TIME=.8;window.AudioContext=window.AudioContext||window.webkitAudioContext;var context=null;if(window.AudioContext){context=new AudioContext}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){this.stream=stream;this.intervalId=null;this.intervalMilis=interval;this.audioLevel=0;this.callback=callback}LocalStatsCollector.prototype.start=function(){if(!context||RTCBrowserType.isTemasysPluginUsed())return;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}],24:[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":138,"./moderator":35,"./recording":36,events:45,"jitsi-meet-logger":49}],29:[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":49}],30:[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 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(this.webrtcIceTcpDisable){this.remoteSDP.removeTcpCandidates=true}if(this.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);self.room.eventEmitter.emit(XMPPEvents.ADD_ICE_CANDIDATE_FAILED,err,self.peerconnection)}})})};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(RTCBrowserType.getBrowserType()===RTCBrowserType.RTC_BROWSER_FIREFOX){var sender=null;var track=null;if(stream.getAudioTracks()&&stream.getAudioTracks().length){track=stream.getAudioTracks()[0]}else if(stream.getVideoTracks()&&stream.getVideoTracks().length){track=stream.getVideoTracks()[0]}if(!track){console.log("Cannot switch tracks: no tracks.");return}self.peerconnection.peerconnection.getSenders().some(function(s){if(s.track===track){sender=s;return true}});if(sender){self.peerconnection.peerconnection.removeTrack(sender)}else{console.log("Cannot switch tracks: no RTPSender.")}}else 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){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){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")}};JingleSessionPC.prototype.setVideoMute=function(mute,callback,options){var byUser;if(options){byUser=options.byUser;if(typeof byUser==="undefined"){byUser=true}}else{byUser=true}if(byUser){this.videoMuteByUser=mute}else if(this.videoMuteByUser){return}this.hardMuteVideo(mute);var self=this;var oldSdp=null;if(self.peerconnection){if(self.peerconnection.localDescription){oldSdp=new SDP(self.peerconnection.localDescription.sdp)}}this.modifySourcesQueue.push(function(){logger.log("modify sources done");callback(mute);var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",oldSdp,newSdp);self.notifyMySSRCUpdate(oldSdp,newSdp)})};JingleSessionPC.prototype.hardMuteVideo=function(muted){this.pendingop=muted?"mute":"unmute"};JingleSessionPC.prototype.sendMute=function(muted,content){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c(muted?"mute":"unmute",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"});info.attrs({creator:this.me==this.initiator?"creator":"responder"});if(content){info.attrs({name:content})}this.connection.send(info)};JingleSessionPC.prototype.sendRinging=function(){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c("ringing",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"});this.connection.send(info)};JingleSessionPC.prototype.getStats=function(interval){var self=this;var recv={audio:0,video:0};var lost={audio:0,video:0};var lastrecv={audio:0,video:0};var lastlost={audio:0,video:0};var loss={audio:0,video:0};var delta={audio:0,video:0};this.statsinterval=window.setInterval(function(){if(self&&self.peerconnection&&self.peerconnection.getStats){self.peerconnection.getStats(function(stats){var results=stats.result();for(var i=0;i0?Math.ceil(100*(lost.audio-lastlost.audio)/delta.audio):0;loss.video=delta.video>0?Math.ceil(100*(lost.video-lastlost.video)/delta.video):0;$(document).trigger("packetloss.jingle",[self.sid,loss])})}},interval||3e3);return this.statsinterval};JingleSessionPC.onJingleError=function(session,error){logger.error("Jingle error",error)};JingleSessionPC.onJingleFatalError=function(session,error){this.room.eventEmitter.emit(XMPPEvents.CONFERENCE_SETUP_FAILED);this.room.eventEmitter.emit(XMPPEvents.JINGLE_FATAL_ERROR,session,error)};JingleSessionPC.prototype.setLocalDescription=function(){var self=this;var newssrcs=[];if(!this.peerconnection.localDescription)return;var session=transform.parse(this.peerconnection.localDescription.sdp);var i;session.media.forEach(function(media){if(media.ssrcs&&media.ssrcs.length>0){media.ssrcs.forEach(function(ssrc){if(ssrc.attribute!=="cname"){return}newssrcs.push({ssrc:ssrc.id,type:media.type});self.localStreamsSSRC[media.type]=ssrc.id})}});logger.log("new ssrcs",newssrcs);if(newssrcs.length>0){for(i=0;i0;if(isVideo&&data.peerjid&&this.peerjid===data.peerjid&&data.stream.getVideoTracks().length===0&&RTC.localVideo.getTracks().length>0){window.setTimeout(function(){self.sendKeyframe()},3e3)}};JingleSessionPC.prototype.getIceConnectionState=function(){return this.peerconnection.iceConnectionState};module.exports=JingleSessionPC}).call(this,"/modules/xmpp/JingleSessionPC.js")},{"../../service/xmpp/XMPPEvents":138,"../RTC/RTC":16,"../RTC/RTCBrowserType":17,"./JingleSession":29,"./SDP":31,"./SDPDiffer":32,"./SDPUtil":33,"./TraceablePeerConnection":34,async:44,"jitsi-meet-logger":49,"sdp-transform":78}],31:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var SDPUtil=require("./SDPUtil");function SDP(sdp){this.removeTcpCandidates=false;this.removeUdpCandidates=false;this.media=sdp.split("\r\nm=");for(var i=1;i0){ssrclines.forEach(function(line){var idx=line.indexOf(" ");var linessrc=line.substr(0,idx).substr(7);if(linessrc!=ssrc){elem.up();ssrc=linessrc;elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"})}var kv=line.substr(idx+1);elem.c("parameter");if(kv.indexOf(":")==-1){elem.attrs({name:kv})}else{var k=kv.split(":",2)[0];elem.attrs({name:k});var v=kv.split(":",2)[1];v=SDPUtil.filter_special_chars(v);elem.attrs({value:v})}elem.up()})}else{elem.up();elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"});elem.c("parameter");elem.attrs({name:"cname",value:Math.random().toString(36).substring(7)});elem.up();var msid=null;if(mline.media=="audio"){msid=APP.RTC.localAudio._getId()}else{msid=APP.RTC.localVideo._getId()}if(msid!=null){msid=SDPUtil.filter_special_chars(msid);elem.c("parameter");elem.attrs({name:"msid",value:msid});elem.up();elem.c("parameter");elem.attrs({name:"mslabel",value:msid});elem.up();elem.c("parameter");elem.attrs({name:"label",value:msid});elem.up()}}elem.up();var ssrc_group_lines=SDPUtil.find_lines(this.media[i],"a=ssrc-group:");ssrc_group_lines.forEach(function(line){var idx=line.indexOf(" ");var semantics=line.substr(0,idx).substr(13);var ssrcs=line.substr(14+semantics.length).split(" ");if(ssrcs.length){elem.c("ssrc-group",{semantics:semantics,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"});ssrcs.forEach(function(ssrc){elem.c("source",{ssrc:ssrc}).up()});elem.up()}})}if(SDPUtil.find_line(this.media[i],"a=rtcp-mux")){elem.c("rtcp-mux").up()}this.rtcpFbToJingle(i,elem,"*");if(SDPUtil.find_line(this.media[i],"a=extmap:")){lines=SDPUtil.find_lines(this.media[i],"a=extmap:");for(j=0;j2)elem.attrs({streams:sctpAttrs[2]});elem.up()}}fingerprints=SDPUtil.find_lines(this.media[mediaindex],"a=fingerprint:",this.session);fingerprints.forEach(function(line){tmp=SDPUtil.parse_fingerprint(line);tmp.xmlns="urn:xmpp:jingle:apps:dtls:0";elem.c("fingerprint").t(tmp.fingerprint);delete tmp.fingerprint;line=SDPUtil.find_line(self.media[mediaindex],"a=setup:",self.session);if(line){tmp.setup=line.substr(8)}elem.attrs(tmp);elem.up()});tmp=SDPUtil.iceparams(this.media[mediaindex],this.session);if(tmp){tmp.xmlns="urn:xmpp:jingle:transports:ice-udp:1";elem.attrs(tmp);if(SDPUtil.find_line(this.media[mediaindex],"a=candidate:",this.session)){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=candidate:",this.session);lines.forEach(function(line){var candidate=SDPUtil.candidateToJingle(line);var protocol=candidate&&typeof candidate.protocol==="string"?candidate.protocol.toLowerCase():"";if(self.removeTcpCandidates&&protocol==="tcp"||self.removeUdpCandidates&&protocol==="udp"){return}elem.c("candidate",candidate).up()})}}elem.up()};SDP.prototype.rtcpFbToJingle=function(mediaindex,elem,payloadtype){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=rtcp-fb:"+payloadtype);lines.forEach(function(line){var tmp=SDPUtil.parse_rtcpfb(line);if(tmp.type=="trr-int"){elem.c("rtcp-fb-trr-int",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",value:tmp.params[0]});elem.up()}else{elem.c("rtcp-fb",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",type:tmp.type});if(tmp.params.length>0){elem.attrs({subtype:tmp.params[0]})}elem.up()}})};SDP.prototype.rtcpFbFromJingle=function(elem,payloadtype){var media="";var tmp=elem.find('>rtcp-fb-trr-int[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]');if(tmp.length){media+="a=rtcp-fb:"+"*"+" "+"trr-int"+" ";if(tmp.attr("value")){media+=tmp.attr("value")}else{media+="0"}media+="\r\n"}tmp=elem.find('>rtcp-fb[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]');tmp.each(function(){media+="a=rtcp-fb:"+payloadtype+" "+$(this).attr("type");if($(this).attr("subtype")){media+=" "+$(this).attr("subtype")}media+="\r\n"});return media};SDP.prototype.fromJingle=function(jingle){var self=this;this.raw="v=0\r\n"+"o=- 1923518516 2 IN IP4 0.0.0.0\r\n"+"s=-\r\n"+"t=0 0\r\n";if($(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').length){$(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').each(function(idx,group){ -var contents=$(group).find(">content").map(function(idx,content){return content.getAttribute("name")}).get();if(contents.length>0){self.raw+="a=group:"+(group.getAttribute("semantics")||group.getAttribute("type"))+" "+contents.join(" ")+"\r\n"}})}this.session=this.raw;jingle.find(">content").each(function(){var m=self.jingle2media($(this));self.media.push(m)});this.raw=this.session+this.media.join("")};SDP.prototype.jingle2media=function(content){var media="",desc=content.find("description"),ssrc=desc.attr("ssrc"),self=this,tmp;var sctp=content.find('>transport>sctpmap[xmlns="urn:xmpp:jingle:transports:dtls-sctp:1"]');tmp={media:desc.attr("media")};tmp.port="1";if(content.attr("senders")=="rejected"){tmp.port="0"}if(content.find(">transport>fingerprint").length||desc.find("encryption").length){if(sctp.length)tmp.proto="DTLS/SCTP";else tmp.proto="RTP/SAVPF"}else{tmp.proto="RTP/AVPF"}if(!sctp.length){tmp.fmt=desc.find("payload-type").map(function(){return this.getAttribute("id")}).get();media+=SDPUtil.build_mline(tmp)+"\r\n"}else{media+="m=application 1 DTLS/SCTP "+sctp.attr("number")+"\r\n";media+="a=sctpmap:"+sctp.attr("number")+" "+sctp.attr("protocol");var streamCount=sctp.attr("streams");if(streamCount)media+=" "+streamCount+"\r\n";else media+="\r\n"}media+="c=IN IP4 0.0.0.0\r\n";if(!sctp.length)media+="a=rtcp:1 IN IP4 0.0.0.0\r\n";tmp=content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]');if(tmp.length){if(tmp.attr("ufrag")){media+=SDPUtil.build_iceufrag(tmp.attr("ufrag"))+"\r\n"}if(tmp.attr("pwd")){media+=SDPUtil.build_icepwd(tmp.attr("pwd"))+"\r\n"}tmp.find(">fingerprint").each(function(){media+="a=fingerprint:"+this.getAttribute("hash");media+=" "+$(this).text();media+="\r\n";if(this.getAttribute("setup")){media+="a=setup:"+this.getAttribute("setup")+"\r\n"}})}switch(content.attr("senders")){case"initiator":media+="a=sendonly\r\n";break;case"responder":media+="a=recvonly\r\n";break;case"none":media+="a=inactive\r\n";break;case"both":media+="a=sendrecv\r\n";break}media+="a=mid:"+content.attr("name")+"\r\n";if(desc.find("rtcp-mux").length){media+="a=rtcp-mux\r\n"}if(desc.find("encryption").length){desc.find("encryption>crypto").each(function(){media+="a=crypto:"+this.getAttribute("tag");media+=" "+this.getAttribute("crypto-suite");media+=" "+this.getAttribute("key-params");if(this.getAttribute("session-params")){media+=" "+this.getAttribute("session-params")}media+="\r\n"})}desc.find("payload-type").each(function(){media+=SDPUtil.build_rtpmap(this)+"\r\n";if($(this).find(">parameter").length){media+="a=fmtp:"+this.getAttribute("id")+" ";media+=$(this).find("parameter").map(function(){return(this.getAttribute("name")?this.getAttribute("name")+"=":"")+this.getAttribute("value")}).get().join("; ");media+="\r\n"}media+=self.rtcpFbFromJingle($(this),this.getAttribute("id"))});media+=self.rtcpFbFromJingle(desc,"*");tmp=desc.find('>rtp-hdrext[xmlns="urn:xmpp:jingle:apps:rtp:rtp-hdrext:0"]');tmp.each(function(){media+="a=extmap:"+this.getAttribute("id")+" "+this.getAttribute("uri")+"\r\n"});content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]>candidate').each(function(){var protocol=this.getAttribute("protocol");protocol=typeof protocol==="string"?protocol.toLowerCase():"";if(self.removeTcpCandidates&&protocol==="tcp"||self.removeUdpCandidates&&protocol==="udp"){return}media+=SDPUtil.candidateFromJingle(this)});content.find('description>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){media+="a=ssrc-group:"+semantics+" "+ssrcs.join(" ")+"\r\n"}});tmp=content.find('description>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]');tmp.each(function(){var ssrc=this.getAttribute("ssrc");$(this).find(">parameter").each(function(){var name=this.getAttribute("name");var value=this.getAttribute("value");value=SDPUtil.filter_special_chars(value);media+="a=ssrc:"+ssrc+" "+name;if(value&&value.length)media+=":"+value;media+="\r\n"})});return media};module.exports=SDP}).call(this,"/modules/xmpp/SDP.js")},{"./SDPUtil":33,"jitsi-meet-logger":49}],32:[function(require,module,exports){var SDPUtil=require("./SDPUtil");function SDPDiffer(mySDP,otherSDP){this.mySDP=mySDP;this.otherSDP=otherSDP}SDPDiffer.prototype.getNewMedia=function(){function arrayEquals(array){if(!array)return false;if(this.length!=array.length)return false;for(var i=0,l=this.length;i2?parts[2]:null;return[sctpPort,protocol,streamCount]},build_rtpmap:function(el){var line="a=rtpmap:"+el.getAttribute("id")+" "+el.getAttribute("name")+"/"+el.getAttribute("clockrate");if(el.getAttribute("channels")&&el.getAttribute("channels")!="1"){line+="/"+el.getAttribute("channels")}return line},parse_crypto:function(line){var parts=line.substring(9).split(" "),data={};data.tag=parts.shift();data["crypto-suite"]=parts.shift();data["key-params"]=parts.shift();if(parts.length){data["session-params"]=parts.join(" ")}return data},parse_fingerprint:function(line){var parts=line.substring(14).split(" "),data={};data.hash=parts.shift();data.fingerprint=parts.shift();return data},parse_fmtp:function(line){var parts=line.split(" "),i,key,value,data=[];parts.shift();parts=parts.join(" ").split(";");for(i=0;iself.maxstats){self.stats[id].values.shift();self.stats[id].times.shift()}self.stats[id].endTime=now})}})},1e3)}}var dumpSDP=function(description){if(typeof description==="undefined"||description==null){return""}return"type: "+description.type+"\r\n"+description.sdp};var insertRecvOnlySSRC=function(desc){if(typeof desc!=="object"||desc===null||typeof desc.sdp!=="string"){console.warn("An empty description was passed as an argument.");return desc}var transform=require("sdp-transform");var RandomUtil=require("../util/RandomUtil");var session=transform.parse(desc.sdp);if(!Array.isArray(session.media)){return}var modded=false;session.media.forEach(function(bLine){if(bLine.direction!="recvonly"){return}modded=true;if(!Array.isArray(bLine.ssrcs)||bLine.ssrcs.length===0){var ssrc=RandomUtil.randomInt(1,4294967295);bLine.ssrcs=[{id:ssrc,attribute:"cname",value:["recvonly-",ssrc].join("")}]}});return!modded?desc:new RTCSessionDescription({type:desc.type,sdp:transform.write(session)})};var normalizePlanB=function(desc){if(typeof desc!=="object"||desc===null||typeof desc.sdp!=="string"){logger.warn("An empty description was passed as an argument.");return desc}var transform=require("sdp-transform");var session=transform.parse(desc.sdp);if(typeof session!=="undefined"&&typeof session.media!=="undefined"&&Array.isArray(session.media)){session.media.forEach(function(mLine){var firstSsrcs=[];var newSsrcLines=[];if(typeof mLine.ssrcGroups!=="undefined"&&Array.isArray(mLine.ssrcGroups)){mLine.ssrcGroups.forEach(function(group){if(typeof group.semantics!=="undefined"&&group.semantics==="FID"){if(typeof group.ssrcs!=="undefined"){firstSsrcs.push(Number(group.ssrcs.split(" ")[0]))}}})}if(typeof mLine.ssrcs!=="undefined"&&Array.isArray(mLine.ssrcs)){var i;for(i=0;iconference>property"+"[name='authentication'][value='true']").length>0;logger.info("Authentication enabled: "+authenticationEnabled);this.externalAuthEnabled=$(resultIq).find(">conference>property"+"[name='externalAuth'][value='true']").length>0;console.info("External authentication enabled: "+this.externalAuthEnabled);if(!this.externalAuthEnabled){this.parseSessionId(resultIq)}var authIdentity=$(resultIq).find(">conference").attr("identity");this.eventEmitter.emit(AuthenticationEvents.IDENTITY_UPDATED,authenticationEnabled,authIdentity);if($(resultIq).find(">conference>property"+"[name='sipGatewayEnabled'][value='true']").length){this.sipGatewayEnabled=true}logger.info("Sip gateway enabled: "+this.sipGatewayEnabled)};Moderator.prototype.allocateConferenceFocus=function(callback){this.setFocusUserJid(this.xmppService.options.focusUserJid);var iq=this.createConferenceIq();var self=this;this.connection.sendIQ(iq,function(result){self.parseConfigOptions(result);if("true"===$(result).find("conference").attr("ready")){self.getNextTimeout(true);self.getNextErrorTimeout(true);callback()}else{var waitMs=self.getNextTimeout();logger.info("Waiting for the focus... "+waitMs);self.getNextErrorTimeout(true);window.setTimeout(function(){self.allocateConferenceFocus(callback)},waitMs)}},function(error){var invalidSession=$(error).find(">error>session-invalid").length;if(invalidSession){logger.info("Session expired! - removing");localStorage.removeItem("sessionId")}if($(error).find(">error>graceful-shutdown").length){self.eventEmitter.emit(XMPPEvents.GRACEFUL_SHUTDOWN);return}var reservationErr=$(error).find(">error>reservation-error");if(reservationErr.length){var errorCode=reservationErr.attr("error-code");var errorMsg;if($(error).find(">error>text")){errorMsg=$(error).find(">error>text").text()}self.eventEmitter.emit(XMPPEvents.RESERVATION_ERROR,errorCode,errorMsg); -return}if($(error).find(">error>not-authorized").length){logger.warn("Unauthorized to start the conference",error);var toDomain=Strophe.getDomainFromJid(error.getAttribute("to"));if(toDomain!==this.xmppService.options.hosts.anonymousdomain){self.externalAuthEnabled=true}self.eventEmitter.emit(XMPPEvents.AUTHENTICATION_REQUIRED,function(){self.allocateConferenceFocus(callback)});return}var waitMs=self.getNextErrorTimeout();logger.error("Focus error, retry after "+waitMs,error);var focusComponent=self.getFocusComponent();var retrySec=waitMs/1e3;if(!invalidSession){self.eventEmitter.emit(XMPPEvents.FOCUS_DISCONNECTED,focusComponent,retrySec)}self.getNextTimeout(true);window.setTimeout(function(){self.allocateConferenceFocus(callback)},waitMs)})};Moderator.prototype.authenticate=function(){var self=this;return new Promise(function(resolve,reject){self.connection.sendIQ(self.createConferenceIq(),function(result){self.parseSessionId(result);resolve()},function(error){var code=$(error).find(">error").attr("code");reject(error,code)})})};Moderator.prototype.getLoginUrl=function(urlCallback,failureCallback){var iq=$iq({to:this.getFocusComponent(),type:"get"});iq.c("login-url",{xmlns:"http://jitsi.org/protocol/focus",room:this.roomName,"machine-uid":this.settings.getSettings().uid});this.connection.sendIQ(iq,function(result){var url=$(result).find("login-url").attr("url");url=url=decodeURIComponent(url);if(url){logger.info("Got auth url: "+url);urlCallback(url)}else{logger.error("Failed to get auth url from the focus",result);failureCallback(result)}},function(error){logger.error("Get auth url error",error);failureCallback(error)})};Moderator.prototype.getPopupLoginUrl=function(urlCallback,failureCallback){var iq=$iq({to:this.getFocusComponent(),type:"get"});iq.c("login-url",{xmlns:"http://jitsi.org/protocol/focus",room:this.roomName,"machine-uid":this.settings.getSettings().uid,popup:true});this.connection.sendIQ(iq,function(result){var url=$(result).find("login-url").attr("url");url=url=decodeURIComponent(url);if(url){logger.info("Got POPUP auth url: "+url);urlCallback(url)}else{logger.error("Failed to get POPUP auth url from the focus",result);failureCallback(result)}},function(error){logger.error("Get POPUP auth url error",error);failureCallback(error)})};Moderator.prototype.logout=function(callback){var iq=$iq({to:this.getFocusComponent(),type:"set"});var sessionId=localStorage.getItem("sessionId");if(!sessionId){callback();return}iq.c("logout",{xmlns:"http://jitsi.org/protocol/focus","session-id":sessionId});this.connection.sendIQ(iq,function(result){var logoutUrl=$(result).find("logout").attr("logout-url");if(logoutUrl){logoutUrl=decodeURIComponent(logoutUrl)}logger.info("Log out OK, url: "+logoutUrl,result);localStorage.removeItem("sessionId");callback(logoutUrl)},function(error){logger.error("Logout error",error)})};module.exports=Moderator}).call(this,"/modules/xmpp/moderator.js")},{"../../service/authentication/AuthenticationEvents":134,"../../service/xmpp/XMPPEvents":138,"jitsi-meet-logger":49}],36:[function(require,module,exports){(function(__filename){var XMPPEvents=require("../../service/xmpp/XMPPEvents");var logger=require("jitsi-meet-logger").getLogger(__filename);function Recording(type,eventEmitter,connection,focusMucJid,jirecon,roomjid){this.eventEmitter=eventEmitter;this.connection=connection;this.state="off";this.focusMucJid=focusMucJid;this.jirecon=jirecon;this.url=null;this.type=type;this._isSupported=type===Recording.types.JIBRI||type===Recording.types.JIRECON&&!this.jirecon?false:true;this.jireconRid=null;this.roomjid=roomjid}Recording.types={COLIBRI:"colibri",JIRECON:"jirecon",JIBRI:"jibri"};Recording.prototype.handleJibriPresence=function(jibri){var attributes=jibri.attributes;if(!attributes)return;this._isSupported=attributes.status&&attributes.status!=="undefined";if(this._isSupported){this.url=attributes.url||null;this.state=attributes.status||"off"}this.eventEmitter.emit(XMPPEvents.RECORDING_STATE_CHANGED)};Recording.prototype.setRecordingJibri=function(state,callback,errCallback,options){if(state==this.state){errCallback(new Error("Invalid state!"))}options=options||{};var iq=$iq({to:this.focusMucJid,type:"set"}).c("jibri",{xmlns:"http://jitsi.org/protocol/jibri",action:state==="on"?"start":"stop",streamid:options.streamId,"follow-entity":options.followEntity}).up();logger.log("Set jibri recording: "+state,iq.nodeTree);console.log(iq.nodeTree);this.connection.sendIQ(iq,function(result){callback($(result).find("jibri").attr("state"),$(result).find("jibri").attr("url"))},function(error){logger.log("Failed to start recording, error: ",error);errCallback(error)})};Recording.prototype.setRecordingJirecon=function(state,callback,errCallback,options){if(state==this.state){errCallback(new Error("Invalid state!"))}var iq=$iq({to:this.jirecon,type:"set"}).c("recording",{xmlns:"http://jitsi.org/protocol/jirecon",action:state==="on"?"start":"stop",mucjid:this.roomjid});if(state==="off"){iq.attrs({rid:this.jireconRid})}console.log("Start recording");var self=this;this.connection.sendIQ(iq,function(result){self.jireconRid=$(result).find("recording").attr("rid");console.log("Recording "+(state==="on"?"started":"stopped")+"(jirecon)"+result);self.state=state;if(state==="off"){self.jireconRid=null}callback(state)},function(error){console.log("Failed to start recording, error: ",error);errCallback(error)})};Recording.prototype.setRecordingColibri=function(state,callback,errCallback,options){var elem=$iq({to:this.focusMucJid,type:"set"});elem.c("conference",{xmlns:"http://jitsi.org/protocol/colibri"});elem.c("recording",{state:state,token:options.token});var self=this;this.connection.sendIQ(elem,function(result){console.log('Set recording "',state,'". Result:',result);var recordingElem=$(result).find(">conference>recording");var newState=recordingElem.attr("state");self.state=newState;callback(newState);if(newState==="pending"){self.connection.addHandler(function(iq){var state=$(iq).find("recording").attr("state");if(state){self.state=newState;callback(state)}},"http://jitsi.org/protocol/colibri","iq",null,null,null)}},function(error){console.warn(error);errCallback(error)})};Recording.prototype.setRecording=function(state,callback,errCallback,options){switch(this.type){case Recording.types.JIRECON:this.setRecordingJirecon(state,callback,errCallback,options);break;case Recording.types.COLIBRI:this.setRecordingColibri(state,callback,errCallback,options);break;case Recording.types.JIBRI:this.setRecordingJibri(state,callback,errCallback,options);break;default:console.error("Unknown recording type!");return}};Recording.prototype.toggleRecording=function(options,statusChangeHandler){if(!options.token&&this.type===Recording.types.COLIBRI||!options.streamId&&this.type===Recording.types.JIBRI){statusChangeHandler("error",new Error("No token passed!"));logger.error("No token passed!");return}var oldState=this.state;var newState=oldState==="off"||!oldState?"on":"off";var self=this;this.setRecording(newState,function(state,url){logger.log("New recording state: ",state);if(state&&state!==oldState){self.state=state;self.url=url;statusChangeHandler(state)}else{statusChangeHandler("error",new Error("Status not changed!"))}},function(error){statusChangeHandler("error",error)},options)};Recording.prototype.isSupported=function(){return this._isSupported};Recording.prototype.getState=function(){return this.state};Recording.prototype.getURL=function(){return this.url};module.exports=Recording}).call(this,"/modules/xmpp/recording.js")},{"../../service/xmpp/XMPPEvents":138,"jitsi-meet-logger":49}],37:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var ChatRoom=require("./ChatRoom");module.exports=function(XMPP){Strophe.addConnectionPlugin("emuc",{connection:null,rooms:{},init:function(conn){this.connection=conn;this.connection.addHandler(this.onPresence.bind(this),null,"presence",null,null,null,null);this.connection.addHandler(this.onPresenceUnavailable.bind(this),null,"presence","unavailable",null);this.connection.addHandler(this.onPresenceError.bind(this),null,"presence","error",null);this.connection.addHandler(this.onMessage.bind(this),null,"message",null,null);this.connection.addHandler(this.onMute.bind(this),"http://jitsi.org/jitmeet/audio","iq","set",null,null)},createRoom:function(jid,password,options,settings){var roomJid=Strophe.getBareJidFromJid(jid);if(this.rooms[roomJid]){logger.error("You are already in the room!");return}this.rooms[roomJid]=new ChatRoom(this.connection,jid,password,XMPP,options,settings);return this.rooms[roomJid]},doLeave:function(jid){this.rooms[jid].doLeave();delete this.rooms[jid]},onPresence:function(pres){var from=pres.getAttribute("from");if(pres.getAttribute("type")){return true}var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;if($(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]>status[code="201"]').length){room.createNonAnonymousRoom()}room.onPresence(pres);return true},onPresenceUnavailable:function(pres){var from=pres.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onPresenceUnavailable(pres,from);return true},onPresenceError:function(pres){var from=pres.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onPresenceError(pres,from);return true},onMessage:function(msg){var from=msg.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onMessage(msg,from);return true},setJingleSession:function(from,session){var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.setJingleSession(session)},onMute:function(iq){var from=iq.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onMute(iq);return true}})}}).call(this,"/modules/xmpp/strophe.emuc.js")},{"./ChatRoom":28,"jitsi-meet-logger":49}],38:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var JingleSession=require("./JingleSessionPC");var XMPPEvents=require("../../service/xmpp/XMPPEvents");var RTCBrowserType=require("../RTC/RTCBrowserType");module.exports=function(XMPP,eventEmitter){Strophe.addConnectionPlugin("jingle",{connection:null,sessions:{},jid2session:{},ice_config:{iceServers:[]},media_constraints:{mandatory:{OfferToReceiveAudio:true,OfferToReceiveVideo:true}},init:function(conn){this.connection=conn;if(this.connection.disco){this.connection.disco.addFeature("urn:xmpp:jingle:1");this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:1");this.connection.disco.addFeature("urn:xmpp:jingle:transports:ice-udp:1");this.connection.disco.addFeature("urn:xmpp:jingle:apps:dtls:0");this.connection.disco.addFeature("urn:xmpp:jingle:transports:dtls-sctp:1");this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:audio");this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:video");if(RTCBrowserType.isChrome()||RTCBrowserType.isOpera()||RTCBrowserType.isTemasysPluginUsed()){this.connection.disco.addFeature("urn:ietf:rfc:4588")}this.connection.disco.addFeature("urn:ietf:rfc:5761");this.connection.disco.addFeature("urn:ietf:rfc:5888")}this.connection.addHandler(this.onJingle.bind(this),"urn:xmpp:jingle:1","iq","set",null,null)},onJingle:function(iq){var sid=$(iq).find("jingle").attr("sid");var action=$(iq).find("jingle").attr("action");var fromJid=iq.getAttribute("from");var ack=$iq({type:"result",to:fromJid,id:iq.getAttribute("id")});logger.log("on jingle "+action+" from "+fromJid,iq);var sess=this.sessions[sid];if("session-initiate"!=action){if(sess===null){ack.type="error";ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"});this.connection.send(ack);return true}if(fromJid!=sess.peerjid){logger.warn("jid mismatch for session id",sid,fromJid,sess.peerjid);ack.type="error";ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"});this.connection.send(ack);return true}}else if(sess!==undefined){ack.type="error";ack.c("error",{type:"cancel"}).c("service-unavailable",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up();logger.warn("duplicate session id",sid);this.connection.send(ack);return true}this.connection.send(ack);switch(action){case"session-initiate":console.log("(TIME) received session-initiate: ",window.performance.now());var startMuted=$(iq).find("jingle>startmuted");if(startMuted&&startMuted.length>0){var audioMuted=startMuted.attr("audio");var videoMuted=startMuted.attr("video");eventEmitter.emit(XMPPEvents.START_MUTED_FROM_FOCUS,audioMuted==="true",videoMuted==="true")}sess=new JingleSession($(iq).attr("to"),$(iq).find("jingle").attr("sid"),this.connection,XMPP);var fromBareJid=Strophe.getBareJidFromJid(fromJid);this.connection.emuc.setJingleSession(fromBareJid,sess);sess.media_constraints=this.media_constraints;sess.ice_config=this.ice_config;sess.initialize(fromJid,false);eventEmitter.emit(XMPPEvents.CALL_INCOMING,sess);sess.setOffer($(iq).find(">jingle"));this.sessions[sess.sid]=sess;this.jid2session[sess.peerjid]=sess;sess.sendAnswer();sess.accept();break;case"session-accept":sess.setAnswer($(iq).find(">jingle"));sess.accept();break;case"session-terminate":if(Object.keys(this.sessions).length<1||!(this.sessions[Object.keys(this.sessions)[0]]instanceof JingleSession)){break}logger.log("terminating...",sess.sid);sess.terminate();this.terminate(sess.sid);if($(iq).find(">jingle>reason").length){$(document).trigger("callterminated.jingle",[sess.sid,sess.peerjid,$(iq).find(">jingle>reason>:first")[0].tagName,$(iq).find(">jingle>reason>text").text()])}else{$(document).trigger("callterminated.jingle",[sess.sid,sess.peerjid])}break;case"transport-info":sess.addIceCandidate($(iq).find(">jingle>content"));break;case"session-info":var affected;if($(iq).find('>jingle>ringing[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length){$(document).trigger("ringing.jingle",[sess.sid])}else if($(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length){affected=$(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name");$(document).trigger("mute.jingle",[sess.sid,affected])}else if($(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length){affected=$(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name");$(document).trigger("unmute.jingle",[sess.sid,affected])}break;case"addsource":case"source-add":sess.addSource($(iq).find(">jingle>content"));break;case"removesource":case"source-remove":sess.removeSource($(iq).find(">jingle>content"));break;default:logger.warn("jingle action not implemented",action);break}return true},terminate:function(sid,reason,text){if(sid===null||sid===undefined){for(sid in this.sessions){if(this.sessions[sid].state!="ended"){this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text);this.sessions[sid].terminate()}delete this.jid2session[this.sessions[sid].peerjid];delete this.sessions[sid]}}else if(this.sessions.hasOwnProperty(sid)){if(this.sessions[sid].state!="ended"){this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text);this.sessions[sid].terminate()}delete this.jid2session[this.sessions[sid].peerjid];delete this.sessions[sid]}},getStunAndTurnCredentials:function(){var self=this;this.connection.sendIQ($iq({type:"get",to:this.connection.domain}).c("services",{xmlns:"urn:xmpp:extdisco:1"}).c("service",{host:"turn."+this.connection.domain}),function(res){var iceservers=[];$(res).find(">services>service").each(function(idx,el){el=$(el);var dict={};var type=el.attr("type");switch(type){case"stun":dict.url="stun:"+el.attr("host");if(el.attr("port")){dict.url+=":"+el.attr("port")}iceservers.push(dict);break;case"turn":case"turns":dict.url=type+":";if(el.attr("username")){if(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)&&parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2],10)<28){dict.url+=el.attr("username")+"@"}else{dict.username=el.attr("username")}}dict.url+=el.attr("host");if(el.attr("port")&&el.attr("port")!="3478"){dict.url+=":"+el.attr("port")}if(el.attr("transport")&&el.attr("transport")!="udp"){dict.url+="?transport="+el.attr("transport")}if(el.attr("password")){dict.credential=el.attr("password")}iceservers.push(dict);break}});self.ice_config.iceServers=iceservers},function(err){logger.warn("getting turn credentials failed",err);logger.warn("is mod_turncredentials or similar installed?")})},getLog:function(){var data={};var self=this;Object.keys(this.sessions).forEach(function(sid){var session=self.sessions[sid];if(session.peerconnection&&session.peerconnection.updateLog){data["jingle_"+session.sid]={updateLog:session.peerconnection.updateLog,stats:session.peerconnection.stats,url:window.location.href}}});return data}})}}).call(this,"/modules/xmpp/strophe.jingle.js")},{"../../service/xmpp/XMPPEvents":138,"../RTC/RTCBrowserType":17,"./JingleSessionPC":30,"jitsi-meet-logger":49}],39:[function(require,module,exports){module.exports=function(){Strophe.addConnectionPlugin("logger",{connection:null,log:[],init:function(conn){this.connection=conn;this.connection.rawInput=this.log_incoming.bind(this);this.connection.rawOutput=this.log_outgoing.bind(this)},log_incoming:function(stanza){this.log.push([(new Date).getTime(),"incoming",stanza])},log_outgoing:function(stanza){this.log.push([(new Date).getTime(),"outgoing",stanza])}})}},{}],40:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var XMPPEvents=require("../../service/xmpp/XMPPEvents");var PING_INTERVAL=1e4;var PING_TIMEOUT=15e3;var PING_THRESHOLD=3;module.exports=function(XMPP,eventEmitter){Strophe.addConnectionPlugin("ping",{connection:null,failedPings:0,init:function(connection){this.connection=connection;Strophe.addNamespace("PING","urn:xmpp:ping")},ping:function(jid,success,error,timeout){var iq=$iq({type:"get",to:jid});iq.c("ping",{xmlns:Strophe.NS.PING});this.connection.sendIQ(iq,success,error,timeout)},hasPingSupport:function(jid,callback){this.connection.disco.info(jid,null,function(result){var ping=$(result).find('>>feature[var="urn:xmpp:ping"]');callback(ping.length>0)},function(error){logger.error("Ping feature discovery error",error);callback(false)})},startInterval:function(remoteJid,interval){if(this.intervalId){logger.error("Ping task scheduled already");return}if(!interval)interval=PING_INTERVAL;var self=this;this.intervalId=window.setInterval(function(){self.ping(remoteJid,function(result){self.failedPings=0},function(error){self.failedPings+=1;logger.error("Ping "+(error?"error":"timeout"),error);if(self.failedPings>=PING_THRESHOLD){self.connection.disconnect()}},PING_TIMEOUT)},interval);logger.info("XMPP pings will be sent every "+interval+" ms")},stopInterval:function(){if(this.intervalId){window.clearInterval(this.intervalId);this.intervalId=null;this.failedPings=0;logger.info("Ping interval cleared")}}})}}).call(this,"/modules/xmpp/strophe.ping.js")},{"../../service/xmpp/XMPPEvents":138,"jitsi-meet-logger":49}],41:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);module.exports=function(){Strophe.addConnectionPlugin("rayo",{RAYO_XMLNS:"urn:xmpp:rayo:1",connection:null,init:function(conn){this.connection=conn;if(this.connection.disco){this.connection.disco.addFeature("urn:xmpp:rayo:client:1")}this.connection.addHandler(this.onRayo.bind(this),this.RAYO_XMLNS,"iq","set",null,null)},onRayo:function(iq){logger.info("Rayo IQ",iq)},dial:function(to,from,roomName,roomPass,focusMucJid){var self=this;return new Promise(function(resolve,reject){if(!focusMucJid){reject(new Error("Internal error!"));return}var req=$iq({type:"set",to:focusMucJid});req.c("dial",{xmlns:self.RAYO_XMLNS,to:to,from:from});req.c("header",{name:"JvbRoomName",value:roomName}).up();if(roomPass!==null&&roomPass.length){req.c("header",{name:"JvbRoomPassword",value:roomPass}).up()}self.connection.sendIQ(req,function(result){logger.info("Dial result ",result);var resource=$(result).find("ref").attr("uri");self.call_resource=resource.substr("xmpp:".length);logger.info("Received call resource: "+self.call_resource);resolve()},function(error){logger.info("Dial error ",error);reject(error)})})},hangup:function(){var self=this;return new Promise(function(resolve,reject){if(!self.call_resource){reject(new Error("No call in progress"));logger.warn("No call in progress");return}var req=$iq({type:"set",to:self.call_resource});req.c("hangup",{xmlns:self.RAYO_XMLNS});self.connection.sendIQ(req,function(result){logger.info("Hangup result ",result);self.call_resource=null;resolve()},function(error){logger.info("Hangup error ",error);self.call_resource=null;reject(new Error("Hangup error "))})})}})}}).call(this,"/modules/xmpp/strophe.rayo.js")},{"jitsi-meet-logger":49}],42:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);module.exports=function(){Strophe.log=function(level,msg){switch(level){case Strophe.LogLevel.WARN:logger.warn("Strophe: "+msg);break;case Strophe.LogLevel.ERROR:case Strophe.LogLevel.FATAL:logger.error("Strophe: "+msg);break}};Strophe.getStatusString=function(status){switch(status){case Strophe.Status.ERROR:return"ERROR";case Strophe.Status.CONNECTING:return"CONNECTING";case Strophe.Status.CONNFAIL:return"CONNFAIL";case Strophe.Status.AUTHENTICATING:return"AUTHENTICATING";case Strophe.Status.AUTHFAIL:return"AUTHFAIL";case Strophe.Status.CONNECTED:return"CONNECTED";case Strophe.Status.DISCONNECTED:return"DISCONNECTED";case Strophe.Status.DISCONNECTING:return"DISCONNECTING";case Strophe.Status.ATTACHED:return"ATTACHED";default:return"unknown"}}}}).call(this,"/modules/xmpp/strophe.util.js")},{"jitsi-meet-logger":49}],43:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var EventEmitter=require("events");var Pako=require("pako");var RTCEvents=require("../../service/RTC/RTCEvents");var XMPPEvents=require("../../service/xmpp/XMPPEvents");var JitsiConnectionErrors=require("../../JitsiConnectionErrors");var JitsiConnectionEvents=require("../../JitsiConnectionEvents");var RTC=require("../RTC/RTC");var authenticatedUser=false;function createConnection(bosh){bosh=bosh||"/http-bind";if(this.token){bosh+=bosh.indexOf("?")==-1?"?token="+this.token:"&token="+this.token}return new Strophe.Connection(bosh)}function initStrophePlugins(XMPP){require("./strophe.emuc")(XMPP);require("./strophe.jingle")(XMPP,XMPP.eventEmitter);require("./strophe.util")();require("./strophe.ping")(XMPP,XMPP.eventEmitter);require("./strophe.rayo")();require("./strophe.logger")()}function XMPP(options){this.eventEmitter=new EventEmitter;this.connection=null;this.disconnectInProgress=false;this.forceMuted=false;this.options=options;initStrophePlugins(this);this.connection=createConnection(options.bosh)}XMPP.prototype.getConnection=function(){return connection};XMPP.prototype._connect=function(jid,password){var self=this;var anonymousConnectionFailed=false;var connectionFailed=false;var lastErrorMsg;this.connection.connect(jid,password,function(status,msg){logger.log("(TIME) Strophe "+Strophe.getStatusString(status)+(msg?"["+msg+"]":"")+" :"+window.performance.now());if(status===Strophe.Status.CONNECTED){if(self.options.useStunTurn){self.connection.jingle.getStunAndTurnCredentials()}logger.info("My Jabber ID: "+self.connection.jid);var pingJid=self.connection.domain;self.connection.ping.hasPingSupport(pingJid,function(hasPing){if(hasPing)self.connection.ping.startInterval(pingJid);else logger.warn("Ping NOT supported by "+pingJid)});if(password)authenticatedUser=true;if(self.connection&&self.connection.connected&&Strophe.getResourceFromJid(self.connection.jid)){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_ESTABLISHED,Strophe.getResourceFromJid(self.connection.jid))}}else if(status===Strophe.Status.CONNFAIL){if(msg==="x-strophe-bad-non-anon-jid"){anonymousConnectionFailed=true}else{connectionFailed=true}lastErrorMsg=msg}else if(status===Strophe.Status.DISCONNECTED){self.connection.ping.stopInterval();self.disconnectInProgress=false;if(anonymousConnectionFailed){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_FAILED,JitsiConnectionErrors.PASSWORD_REQUIRED)}else if(connectionFailed){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_FAILED,JitsiConnectionErrors.OTHER_ERROR,msg?msg:lastErrorMsg)}else{self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_DISCONNECTED,msg?msg:lastErrorMsg)}}else if(status===Strophe.Status.AUTHFAIL){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_FAILED,JitsiConnectionErrors.PASSWORD_REQUIRED)}})};XMPP.prototype.connect=function(jid,password){if(!jid){var configDomain=this.options.hosts.anonymousdomain||this.options.hosts.domain;if(this.options.hosts.anonymousdomain&&window.location.search.indexOf("login=true")!==-1){configDomain=this.options.hosts.domain}jid=configDomain||window.location.hostname}return this._connect(jid,password)};XMPP.prototype.createRoom=function(roomName,options,settings){var roomjid=roomName+"@"+this.options.hosts.muc;if(options.useNicks){if(options.nick){roomjid+="/"+options.nick}else{roomjid+="/"+Strophe.getNodeFromJid(this.connection.jid)}}else{var tmpJid=Strophe.getNodeFromJid(this.connection.jid);if(!authenticatedUser)tmpJid=tmpJid.substr(0,8);roomjid+="/"+tmpJid}return this.connection.emuc.createRoom(roomjid,null,options,settings)};XMPP.prototype.addListener=function(type,listener){this.eventEmitter.on(type,listener)};XMPP.prototype.removeListener=function(type,listener){this.eventEmitter.removeListener(type,listener)};XMPP.prototype.leaveRoom=function(jid){var handler=this.connection.jingle.jid2session[jid];if(handler&&handler.peerconnection){if(RTC.localAudio){handler.peerconnection.removeStream(RTC.localAudio.getOriginalStream(),true)}if(RTC.localVideo){handler.peerconnection.removeStream(RTC.localVideo.getOriginalStream(),true)}handler.peerconnection.close()}this.eventEmitter.emit(XMPPEvents.DISPOSE_CONFERENCE);this.connection.emuc.doLeave(jid)};XMPP.prototype.sendLogs=function(data){if(!this.connection.emuc.focusMucJid)return false;var deflate=true;var content=JSON.stringify(data);if(deflate){content=String.fromCharCode.apply(null,Pako.deflateRaw(content))}content=Base64.encode(content);var message=$msg({to:this.connection.emuc.focusMucJid,type:"normal"});message.c("log",{xmlns:"urn:xmpp:eventlog",id:"PeerConnectionStats"});message.c("message").t(content).up();if(deflate){message.c("tag",{name:"deflated",value:"true"}).up()}message.up();this.connection.send(message);return true};XMPP.prototype.getJingleLog=function(){return this.connection.jingle?this.connection.jingle.getLog():{}};XMPP.prototype.getXmppLog=function(){return this.connection.logger?this.connection.logger.log:null};XMPP.prototype.dial=function(to,from,roomName,roomPass){this.connection.rayo.dial(to,from,roomName,roomPass)};XMPP.prototype.setMute=function(jid,mute){this.connection.moderate.setMute(jid,mute)};XMPP.prototype.eject=function(jid){this.connection.moderate.eject(jid)};XMPP.prototype.getSessions=function(){return this.connection.jingle.sessions};XMPP.prototype.disconnect=function(){if(this.disconnectInProgress||!this.connection||!this.connection.connected){this.eventEmitter.emit(JitsiConnectionEvents.WRONG_STATE);return}this.disconnectInProgress=true;this.connection.disconnect()};module.exports=XMPP}).call(this,"/modules/xmpp/xmpp.js")},{"../../JitsiConnectionErrors":5,"../../JitsiConnectionEvents":6,"../../service/RTC/RTCEvents":132,"../../service/xmpp/XMPPEvents":138,"../RTC/RTC":16,"./strophe.emuc":37,"./strophe.jingle":38,"./strophe.logger":39,"./strophe.ping":40,"./strophe.rayo":41,"./strophe.util":42,events:45,"jitsi-meet-logger":49,pako:51}],44:[function(require,module,exports){(function(process){(function(){var async={};var root,previous_async;root=this;if(root!=null){previous_async=root.async}async.noConflict=function(){root.async=previous_async;return async};function only_once(fn){var called=false;return function(){if(called)throw new Error("Callback was already called.");called=true;fn.apply(root,arguments)}}var _toString=Object.prototype.toString;var _isArray=Array.isArray||function(obj){return _toString.call(obj)==="[object Array]"};var _each=function(arr,iterator){if(arr.forEach){return arr.forEach(iterator)}for(var i=0;i=arr.length){callback()}}}};async.forEach=async.each;async.eachSeries=function(arr,iterator,callback){callback=callback||function(){};if(!arr.length){return callback()}var completed=0;var iterate=function(){iterator(arr[completed],function(err){if(err){callback(err);callback=function(){}}else{completed+=1;if(completed>=arr.length){callback()}else{iterate()}}})};iterate()};async.forEachSeries=async.eachSeries;async.eachLimit=function(arr,limit,iterator,callback){var fn=_eachLimit(limit);fn.apply(null,[arr,iterator,callback])};async.forEachLimit=async.eachLimit;var _eachLimit=function(limit){return function(arr,iterator,callback){callback=callback||function(){};if(!arr.length||limit<=0){return callback()}var completed=0;var started=0;var running=0;(function replenish(){if(completed>=arr.length){return callback()}while(running=arr.length){callback()}else{replenish()}}})}})()}};var doParallel=function(fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[async.each].concat(args))}};var doParallelLimit=function(limit,fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[_eachLimit(limit)].concat(args))}};var doSeries=function(fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[async.eachSeries].concat(args))}};var _asyncMap=function(eachfn,arr,iterator,callback){arr=_map(arr,function(x,i){return{index:i,value:x}});if(!callback){eachfn(arr,function(x,callback){iterator(x.value,function(err){callback(err)})})}else{var results=[];eachfn(arr,function(x,callback){iterator(x.value,function(err,v){results[x.index]=v;callback(err)})},function(err){callback(err,results)})}};async.map=doParallel(_asyncMap);async.mapSeries=doSeries(_asyncMap);async.mapLimit=function(arr,limit,iterator,callback){return _mapLimit(limit)(arr,iterator,callback)};var _mapLimit=function(limit){return doParallelLimit(limit,_asyncMap); +(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.lastSelectedEndpoint=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":136,"jitsi-meet-logger":49}],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==JitsiTrack.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(){if(this.stream)return RTC.getStreamID(this.stream);else return null};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:45}],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":135,"../../service/RTC/RTCEvents.js":136,"../../service/desktopsharing/DesktopSharingEventTypes":139,"./DataChannels":12,"./JitsiLocalTrack.js":13,"./JitsiRemoteTrack.js":14,"./JitsiTrack":15,"./RTCBrowserType":17,"./RTCUtils.js":18,events:45}],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(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(!RTCBrowserType.isTemasysPluginUsed()&&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":136,"../../service/RTC/Resolutions":137,"../xmpp/SDPUtil":33,"./RTCBrowserType":17,"./ScreenObtainer":19,"./adapter.screenshare":20,events:45,"jitsi-meet-logger":49}],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 JitsiTrackErrors=require("../../JitsiTrackErrors");var chromeExtInstalled=false;var chromeExtUpdateRequired=false;var firefoxExtInstalled=null;var reDetectFirefoxExtension=false;var GUM=null;var ScreenObtainer={obtainStream:null,init:function(options,gum){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;errorCallback({type:"jitsiError",errorObject:JitsiTrackErrors.FIREFOX_EXTENSION_NEEDED})},obtainScreenFromExtension:function(streamCallback,failCallback){var self=this;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(self.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")},{"../../JitsiTrackErrors":9,"../../service/desktopsharing/DesktopSharingEventTypes":139,"./RTCBrowserType":17,"./adapter.screenshare":20,"jitsi-meet-logger":49}],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":49}],21:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var UsernameGenerator=require("../util/UsernameGenerator");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;this.callStatsUserName;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()}if(!this.confSettings.callStatsUserName){this.confSettings.callStatsUserName=UsernameGenerator.generateUsername();logger.log("generated callstats uid",this.confSettings.callStatsUserName);this.save()}this.userId=this.confSettings.jitsiMeetId||"";this.displayName=this.confSettings.displayname||"";this.callStatsUserName=this.confSettings.callStatsUserName||""}else{logger.log("local storage is not supported");this.userId=generateUniqueId();this.callStatsUserName=UsernameGenerator.generateUsername()}}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}};Settings.prototype.getCallStatsUserName=function(){return this.callStatsUserName};module.exports=Settings}).call(this,"/modules/settings/Settings.js")},{"../util/UsernameGenerator":27,"jitsi-meet-logger":49}],22:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var jsSHA=require("jssha");var io=require("socket.io-client");var wrtcFuncNames={createOffer:"createOffer",createAnswer:"createAnswer",setLocalDescription:"setLocalDescription",setRemoteDescription:"setRemoteDescription",addIceCandidate:"addIceCandidate",getUserMedia:"getUserMedia"};var callStats=null;function initCallback(err,msg){logger.log("CallStats Status: err="+err+" msg="+msg)}function _try_catch(f){return function(){try{f.apply(this,arguments)}catch(e){logger.error(e)}}}var CallStats=_try_catch(function(jingleSession,Settings,options){try{if(!callStats){callStats=new callstats($,io,jsSHA)}else{return}this.session=jingleSession;this.peerconnection=jingleSession.peerconnection.peerconnection;this.userID=Settings.getCallStatsUserName();var location=window.location;this.confID=location.hostname+location.pathname;callStats.initialize(options.callStatsID,options.callStatsSecret,this.userID,initCallback);callStats.addNewFabric(this.peerconnection,Strophe.getResourceFromJid(jingleSession.peerjid),callStats.fabricUsage.multiplex,this.confID,this.pcCallback.bind(this))}catch(e){callStats=null;logger.error(e)}if(CallStats.pendingErrors.length){CallStats.pendingErrors.forEach(function(error){CallStats._reportError.call(this,error.type,error.error,error.pc)},this);CallStats.pendingErrors.length=0}});CallStats.pendingErrors=[];CallStats.prototype.pcCallback=_try_catch(function(err,msg){if(!callStats){return}logger.log("Monitoring status: "+err+" msg: "+msg);callStats.sendFabricEvent(this.peerconnection,callStats.fabricEvent.fabricSetup,this.confID)});CallStats.prototype.sendMuteEvent=_try_catch(function(mute,type){if(!callStats){return}var event=null;if(type==="video"){event=mute?callStats.fabricEvent.videoPause:callStats.fabricEvent.videoResume}else{event=mute?callStats.fabricEvent.audioMute:callStats.fabricEvent.audioUnmute}callStats.sendFabricEvent(this.peerconnection,event,this.confID)});CallStats.prototype.sendTerminateEvent=_try_catch(function(){if(!callStats){return}callStats.sendFabricEvent(this.peerconnection,callStats.fabricEvent.fabricTerminated,this.confID)});CallStats.prototype.sendSetupFailedEvent=_try_catch(function(){if(!callStats){return}callStats.sendFabricEvent(this.peerconnection,callStats.fabricEvent.fabricSetupFailed,this.confID)});CallStats.prototype.sendFeedback=_try_catch(function(overallFeedback,detailedFeedback){if(!callStats){return}var feedbackString='{"userID":"'+this.userID+'"'+', "overall":'+overallFeedback+', "comment": "'+detailedFeedback+'"}';var feedbackJSON=JSON.parse(feedbackString);callStats.sendUserFeedback(this.confID,feedbackJSON)});CallStats._reportError=function(type,e,pc){if(callStats){callStats.reportError(pc,this.confID,type,e)}else{CallStats.pendingErrors.push({type:type,error:e,pc:pc})}};CallStats.sendGetUserMediaFailed=_try_catch(function(e,cs){CallStats._reportError.call(cs,wrtcFuncNames.getUserMedia,e,null)});CallStats.sendCreateOfferFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.createOffer,e,pc)});CallStats.sendCreateAnswerFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.createAnswer,e,pc)});CallStats.sendSetLocalDescFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.setLocalDescription,e,pc)});CallStats.sendSetRemoteDescFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.setRemoteDescription,e,pc)});CallStats.sendAddIceCandidateFailed=_try_catch(function(e,pc,cs){CallStats._reportError.call(cs,wrtcFuncNames.addIceCandidate,e,pc)});module.exports=CallStats}).call(this,"/modules/statistics/CallStats.js")},{"jitsi-meet-logger":49,jssha:50,"socket.io-client":85}],23:[function(require,module,exports){var RTCBrowserType=require("../RTC/RTCBrowserType");var WEBAUDIO_ANALYZER_FFT_SIZE=2048;var WEBAUDIO_ANALYZER_SMOOTING_TIME=.8;window.AudioContext=window.AudioContext||window.webkitAudioContext;var context=null;if(window.AudioContext){context=new AudioContext}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){this.stream=stream;this.intervalId=null;this.intervalMilis=interval;this.audioLevel=0;this.callback=callback}LocalStatsCollector.prototype.start=function(){if(!context||RTCBrowserType.isTemasysPluginUsed())return;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}],24:[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)};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":142,"./moderator":35,"./recording":36,events:45,"jitsi-meet-logger":49}],29:[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":49}],30:[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 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(this.webrtcIceTcpDisable){this.remoteSDP.removeTcpCandidates=true}if(this.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);self.room.eventEmitter.emit(XMPPEvents.ADD_ICE_CANDIDATE_FAILED,err,self.peerconnection)}})})};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(RTCBrowserType.getBrowserType()===RTCBrowserType.RTC_BROWSER_FIREFOX){var sender=null;var track=null;if(stream.getAudioTracks()&&stream.getAudioTracks().length){track=stream.getAudioTracks()[0]}else if(stream.getVideoTracks()&&stream.getVideoTracks().length){track=stream.getVideoTracks()[0]}if(!track){console.log("Cannot switch tracks: no tracks.");return}self.peerconnection.peerconnection.getSenders().some(function(s){if(s.track===track){sender=s;return true}});if(sender){self.peerconnection.peerconnection.removeTrack(sender)}else{console.log("Cannot switch tracks: no RTPSender.")}}else 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){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){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")}};JingleSessionPC.prototype.setVideoMute=function(mute,callback,options){var byUser;if(options){byUser=options.byUser;if(typeof byUser==="undefined"){byUser=true}}else{byUser=true}if(byUser){this.videoMuteByUser=mute}else if(this.videoMuteByUser){return}this.hardMuteVideo(mute);var self=this;var oldSdp=null;if(self.peerconnection){if(self.peerconnection.localDescription){oldSdp=new SDP(self.peerconnection.localDescription.sdp)}}this.modifySourcesQueue.push(function(){logger.log("modify sources done");callback(mute);var newSdp=new SDP(self.peerconnection.localDescription.sdp);logger.log("SDPs",oldSdp,newSdp);self.notifyMySSRCUpdate(oldSdp,newSdp)})};JingleSessionPC.prototype.hardMuteVideo=function(muted){this.pendingop=muted?"mute":"unmute"};JingleSessionPC.prototype.sendMute=function(muted,content){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c(muted?"mute":"unmute",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"});info.attrs({creator:this.me==this.initiator?"creator":"responder"});if(content){info.attrs({name:content})}this.connection.send(info)};JingleSessionPC.prototype.sendRinging=function(){var info=$iq({to:this.peerjid,type:"set"}).c("jingle",{xmlns:"urn:xmpp:jingle:1",action:"session-info",initiator:this.initiator,sid:this.sid});info.c("ringing",{xmlns:"urn:xmpp:jingle:apps:rtp:info:1"});this.connection.send(info)};JingleSessionPC.prototype.getStats=function(interval){var self=this;var recv={audio:0,video:0};var lost={audio:0,video:0};var lastrecv={audio:0,video:0};var lastlost={audio:0,video:0};var loss={audio:0,video:0};var delta={audio:0,video:0};this.statsinterval=window.setInterval(function(){if(self&&self.peerconnection&&self.peerconnection.getStats){self.peerconnection.getStats(function(stats){var results=stats.result();for(var i=0;i0?Math.ceil(100*(lost.audio-lastlost.audio)/delta.audio):0;loss.video=delta.video>0?Math.ceil(100*(lost.video-lastlost.video)/delta.video):0;$(document).trigger("packetloss.jingle",[self.sid,loss])})}},interval||3e3);return this.statsinterval};JingleSessionPC.onJingleError=function(session,error){logger.error("Jingle error",error)};JingleSessionPC.onJingleFatalError=function(session,error){this.room.eventEmitter.emit(XMPPEvents.CONFERENCE_SETUP_FAILED);this.room.eventEmitter.emit(XMPPEvents.JINGLE_FATAL_ERROR,session,error)};JingleSessionPC.prototype.setLocalDescription=function(){var self=this;var newssrcs=[];if(!this.peerconnection.localDescription)return;var session=transform.parse(this.peerconnection.localDescription.sdp);var i;session.media.forEach(function(media){if(media.ssrcs&&media.ssrcs.length>0){media.ssrcs.forEach(function(ssrc){if(ssrc.attribute!=="cname"){return}newssrcs.push({ssrc:ssrc.id,type:media.type});self.localStreamsSSRC[media.type]=ssrc.id})}});logger.log("new ssrcs",newssrcs);if(newssrcs.length>0){for(i=0;i0;if(isVideo&&data.peerjid&&this.peerjid===data.peerjid&&data.stream.getVideoTracks().length===0&&RTC.localVideo.getTracks().length>0){window.setTimeout(function(){self.sendKeyframe()},3e3)}};JingleSessionPC.prototype.getIceConnectionState=function(){return this.peerconnection.iceConnectionState};module.exports=JingleSessionPC}).call(this,"/modules/xmpp/JingleSessionPC.js")},{"../../service/xmpp/XMPPEvents":142,"../RTC/RTC":16,"../RTC/RTCBrowserType":17,"./JingleSession":29,"./SDP":31,"./SDPDiffer":32,"./SDPUtil":33,"./TraceablePeerConnection":34,async:44,"jitsi-meet-logger":49,"sdp-transform":82}],31:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var SDPUtil=require("./SDPUtil");function SDP(sdp){this.removeTcpCandidates=false;this.removeUdpCandidates=false;this.media=sdp.split("\r\nm=");for(var i=1;i0){ssrclines.forEach(function(line){var idx=line.indexOf(" ");var linessrc=line.substr(0,idx).substr(7);if(linessrc!=ssrc){elem.up();ssrc=linessrc;elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"})}var kv=line.substr(idx+1);elem.c("parameter");if(kv.indexOf(":")==-1){elem.attrs({name:kv})}else{var k=kv.split(":",2)[0];elem.attrs({name:k});var v=kv.split(":",2)[1];v=SDPUtil.filter_special_chars(v);elem.attrs({value:v})}elem.up()})}else{elem.up();elem.c("source",{ssrc:ssrc,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"});elem.c("parameter");elem.attrs({name:"cname",value:Math.random().toString(36).substring(7)});elem.up();var msid=null;if(mline.media=="audio"){msid=APP.RTC.localAudio._getId()}else{msid=APP.RTC.localVideo._getId()}if(msid!=null){msid=SDPUtil.filter_special_chars(msid);elem.c("parameter");elem.attrs({name:"msid",value:msid});elem.up();elem.c("parameter");elem.attrs({name:"mslabel",value:msid});elem.up();elem.c("parameter");elem.attrs({name:"label",value:msid});elem.up()}}elem.up();var ssrc_group_lines=SDPUtil.find_lines(this.media[i],"a=ssrc-group:");ssrc_group_lines.forEach(function(line){var idx=line.indexOf(" ");var semantics=line.substr(0,idx).substr(13);var ssrcs=line.substr(14+semantics.length).split(" ");if(ssrcs.length){elem.c("ssrc-group",{semantics:semantics,xmlns:"urn:xmpp:jingle:apps:rtp:ssma:0"});ssrcs.forEach(function(ssrc){elem.c("source",{ssrc:ssrc}).up()});elem.up()}})}if(SDPUtil.find_line(this.media[i],"a=rtcp-mux")){elem.c("rtcp-mux").up()}this.rtcpFbToJingle(i,elem,"*");if(SDPUtil.find_line(this.media[i],"a=extmap:")){lines=SDPUtil.find_lines(this.media[i],"a=extmap:");for(j=0;j2)elem.attrs({streams:sctpAttrs[2]});elem.up()}}fingerprints=SDPUtil.find_lines(this.media[mediaindex],"a=fingerprint:",this.session);fingerprints.forEach(function(line){tmp=SDPUtil.parse_fingerprint(line);tmp.xmlns="urn:xmpp:jingle:apps:dtls:0";elem.c("fingerprint").t(tmp.fingerprint);delete tmp.fingerprint;line=SDPUtil.find_line(self.media[mediaindex],"a=setup:",self.session);if(line){tmp.setup=line.substr(8)}elem.attrs(tmp);elem.up()});tmp=SDPUtil.iceparams(this.media[mediaindex],this.session);if(tmp){tmp.xmlns="urn:xmpp:jingle:transports:ice-udp:1";elem.attrs(tmp);if(SDPUtil.find_line(this.media[mediaindex],"a=candidate:",this.session)){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=candidate:",this.session);lines.forEach(function(line){var candidate=SDPUtil.candidateToJingle(line);var protocol=candidate&&typeof candidate.protocol==="string"?candidate.protocol.toLowerCase():"";if(self.removeTcpCandidates&&protocol==="tcp"||self.removeUdpCandidates&&protocol==="udp"){return}elem.c("candidate",candidate).up()})}}elem.up()};SDP.prototype.rtcpFbToJingle=function(mediaindex,elem,payloadtype){var lines=SDPUtil.find_lines(this.media[mediaindex],"a=rtcp-fb:"+payloadtype);lines.forEach(function(line){var tmp=SDPUtil.parse_rtcpfb(line);if(tmp.type=="trr-int"){elem.c("rtcp-fb-trr-int",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",value:tmp.params[0]});elem.up()}else{elem.c("rtcp-fb",{xmlns:"urn:xmpp:jingle:apps:rtp:rtcp-fb:0",type:tmp.type});if(tmp.params.length>0){elem.attrs({subtype:tmp.params[0]})}elem.up()}})};SDP.prototype.rtcpFbFromJingle=function(elem,payloadtype){var media="";var tmp=elem.find('>rtcp-fb-trr-int[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]');if(tmp.length){media+="a=rtcp-fb:"+"*"+" "+"trr-int"+" ";if(tmp.attr("value")){media+=tmp.attr("value")}else{media+="0"}media+="\r\n"}tmp=elem.find('>rtcp-fb[xmlns="urn:xmpp:jingle:apps:rtp:rtcp-fb:0"]');tmp.each(function(){media+="a=rtcp-fb:"+payloadtype+" "+$(this).attr("type");if($(this).attr("subtype")){media+=" "+$(this).attr("subtype")}media+="\r\n"});return media};SDP.prototype.fromJingle=function(jingle){var self=this;this.raw="v=0\r\n"+"o=- 1923518516 2 IN IP4 0.0.0.0\r\n"+"s=-\r\n"+"t=0 0\r\n";if($(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').length){$(jingle).find('>group[xmlns="urn:xmpp:jingle:apps:grouping:0"]').each(function(idx,group){ +var contents=$(group).find(">content").map(function(idx,content){return content.getAttribute("name")}).get();if(contents.length>0){self.raw+="a=group:"+(group.getAttribute("semantics")||group.getAttribute("type"))+" "+contents.join(" ")+"\r\n"}})}this.session=this.raw;jingle.find(">content").each(function(){var m=self.jingle2media($(this));self.media.push(m)});this.raw=this.session+this.media.join("")};SDP.prototype.jingle2media=function(content){var media="",desc=content.find("description"),ssrc=desc.attr("ssrc"),self=this,tmp;var sctp=content.find('>transport>sctpmap[xmlns="urn:xmpp:jingle:transports:dtls-sctp:1"]');tmp={media:desc.attr("media")};tmp.port="1";if(content.attr("senders")=="rejected"){tmp.port="0"}if(content.find(">transport>fingerprint").length||desc.find("encryption").length){if(sctp.length)tmp.proto="DTLS/SCTP";else tmp.proto="RTP/SAVPF"}else{tmp.proto="RTP/AVPF"}if(!sctp.length){tmp.fmt=desc.find("payload-type").map(function(){return this.getAttribute("id")}).get();media+=SDPUtil.build_mline(tmp)+"\r\n"}else{media+="m=application 1 DTLS/SCTP "+sctp.attr("number")+"\r\n";media+="a=sctpmap:"+sctp.attr("number")+" "+sctp.attr("protocol");var streamCount=sctp.attr("streams");if(streamCount)media+=" "+streamCount+"\r\n";else media+="\r\n"}media+="c=IN IP4 0.0.0.0\r\n";if(!sctp.length)media+="a=rtcp:1 IN IP4 0.0.0.0\r\n";tmp=content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]');if(tmp.length){if(tmp.attr("ufrag")){media+=SDPUtil.build_iceufrag(tmp.attr("ufrag"))+"\r\n"}if(tmp.attr("pwd")){media+=SDPUtil.build_icepwd(tmp.attr("pwd"))+"\r\n"}tmp.find(">fingerprint").each(function(){media+="a=fingerprint:"+this.getAttribute("hash");media+=" "+$(this).text();media+="\r\n";if(this.getAttribute("setup")){media+="a=setup:"+this.getAttribute("setup")+"\r\n"}})}switch(content.attr("senders")){case"initiator":media+="a=sendonly\r\n";break;case"responder":media+="a=recvonly\r\n";break;case"none":media+="a=inactive\r\n";break;case"both":media+="a=sendrecv\r\n";break}media+="a=mid:"+content.attr("name")+"\r\n";if(desc.find("rtcp-mux").length){media+="a=rtcp-mux\r\n"}if(desc.find("encryption").length){desc.find("encryption>crypto").each(function(){media+="a=crypto:"+this.getAttribute("tag");media+=" "+this.getAttribute("crypto-suite");media+=" "+this.getAttribute("key-params");if(this.getAttribute("session-params")){media+=" "+this.getAttribute("session-params")}media+="\r\n"})}desc.find("payload-type").each(function(){media+=SDPUtil.build_rtpmap(this)+"\r\n";if($(this).find(">parameter").length){media+="a=fmtp:"+this.getAttribute("id")+" ";media+=$(this).find("parameter").map(function(){return(this.getAttribute("name")?this.getAttribute("name")+"=":"")+this.getAttribute("value")}).get().join("; ");media+="\r\n"}media+=self.rtcpFbFromJingle($(this),this.getAttribute("id"))});media+=self.rtcpFbFromJingle(desc,"*");tmp=desc.find('>rtp-hdrext[xmlns="urn:xmpp:jingle:apps:rtp:rtp-hdrext:0"]');tmp.each(function(){media+="a=extmap:"+this.getAttribute("id")+" "+this.getAttribute("uri")+"\r\n"});content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]>candidate').each(function(){var protocol=this.getAttribute("protocol");protocol=typeof protocol==="string"?protocol.toLowerCase():"";if(self.removeTcpCandidates&&protocol==="tcp"||self.removeUdpCandidates&&protocol==="udp"){return}media+=SDPUtil.candidateFromJingle(this)});content.find('description>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){media+="a=ssrc-group:"+semantics+" "+ssrcs.join(" ")+"\r\n"}});tmp=content.find('description>source[xmlns="urn:xmpp:jingle:apps:rtp:ssma:0"]');tmp.each(function(){var ssrc=this.getAttribute("ssrc");$(this).find(">parameter").each(function(){var name=this.getAttribute("name");var value=this.getAttribute("value");value=SDPUtil.filter_special_chars(value);media+="a=ssrc:"+ssrc+" "+name;if(value&&value.length)media+=":"+value;media+="\r\n"})});return media};module.exports=SDP}).call(this,"/modules/xmpp/SDP.js")},{"./SDPUtil":33,"jitsi-meet-logger":49}],32:[function(require,module,exports){var SDPUtil=require("./SDPUtil");function SDPDiffer(mySDP,otherSDP){this.mySDP=mySDP;this.otherSDP=otherSDP}SDPDiffer.prototype.getNewMedia=function(){function arrayEquals(array){if(!array)return false;if(this.length!=array.length)return false;for(var i=0,l=this.length;i2?parts[2]:null;return[sctpPort,protocol,streamCount]},build_rtpmap:function(el){var line="a=rtpmap:"+el.getAttribute("id")+" "+el.getAttribute("name")+"/"+el.getAttribute("clockrate");if(el.getAttribute("channels")&&el.getAttribute("channels")!="1"){line+="/"+el.getAttribute("channels")}return line},parse_crypto:function(line){var parts=line.substring(9).split(" "),data={};data.tag=parts.shift();data["crypto-suite"]=parts.shift();data["key-params"]=parts.shift();if(parts.length){data["session-params"]=parts.join(" ")}return data},parse_fingerprint:function(line){var parts=line.substring(14).split(" "),data={};data.hash=parts.shift();data.fingerprint=parts.shift();return data},parse_fmtp:function(line){var parts=line.split(" "),i,key,value,data=[];parts.shift();parts=parts.join(" ").split(";");for(i=0;iself.maxstats){self.stats[id].values.shift();self.stats[id].times.shift()}self.stats[id].endTime=now})}})},1e3)}}var dumpSDP=function(description){if(typeof description==="undefined"||description==null){return""}return"type: "+description.type+"\r\n"+description.sdp};var insertRecvOnlySSRC=function(desc){if(typeof desc!=="object"||desc===null||typeof desc.sdp!=="string"){console.warn("An empty description was passed as an argument.");return desc}var transform=require("sdp-transform");var RandomUtil=require("../util/RandomUtil");var session=transform.parse(desc.sdp);if(!Array.isArray(session.media)){return}var modded=false;session.media.forEach(function(bLine){if(bLine.direction!="recvonly"){return}modded=true;if(!Array.isArray(bLine.ssrcs)||bLine.ssrcs.length===0){var ssrc=RandomUtil.randomInt(1,4294967295);bLine.ssrcs=[{id:ssrc,attribute:"cname",value:["recvonly-",ssrc].join("")}]}});return!modded?desc:new RTCSessionDescription({type:desc.type,sdp:transform.write(session)})};var normalizePlanB=function(desc){if(typeof desc!=="object"||desc===null||typeof desc.sdp!=="string"){logger.warn("An empty description was passed as an argument.");return desc}var transform=require("sdp-transform");var session=transform.parse(desc.sdp);if(typeof session!=="undefined"&&typeof session.media!=="undefined"&&Array.isArray(session.media)){session.media.forEach(function(mLine){var firstSsrcs=[];var newSsrcLines=[];if(typeof mLine.ssrcGroups!=="undefined"&&Array.isArray(mLine.ssrcGroups)){mLine.ssrcGroups.forEach(function(group){if(typeof group.semantics!=="undefined"&&group.semantics==="FID"){if(typeof group.ssrcs!=="undefined"){firstSsrcs.push(Number(group.ssrcs.split(" ")[0]))}}})}if(typeof mLine.ssrcs!=="undefined"&&Array.isArray(mLine.ssrcs)){var i;for(i=0;iconference>property"+"[name='authentication'][value='true']").length>0;logger.info("Authentication enabled: "+authenticationEnabled);this.externalAuthEnabled=$(resultIq).find(">conference>property"+"[name='externalAuth'][value='true']").length>0;console.info("External authentication enabled: "+this.externalAuthEnabled);if(!this.externalAuthEnabled){this.parseSessionId(resultIq)}var authIdentity=$(resultIq).find(">conference").attr("identity");this.eventEmitter.emit(AuthenticationEvents.IDENTITY_UPDATED,authenticationEnabled,authIdentity);if($(resultIq).find(">conference>property"+"[name='sipGatewayEnabled'][value='true']").length){this.sipGatewayEnabled=true}logger.info("Sip gateway enabled: "+this.sipGatewayEnabled)};Moderator.prototype.allocateConferenceFocus=function(callback){this.setFocusUserJid(this.xmppService.options.focusUserJid);var iq=this.createConferenceIq();var self=this;this.connection.sendIQ(iq,function(result){self.parseConfigOptions(result);if("true"===$(result).find("conference").attr("ready")){self.getNextTimeout(true);self.getNextErrorTimeout(true);callback()}else{var waitMs=self.getNextTimeout();logger.info("Waiting for the focus... "+waitMs);self.getNextErrorTimeout(true);window.setTimeout(function(){self.allocateConferenceFocus(callback)},waitMs)}},function(error){var invalidSession=$(error).find(">error>session-invalid").length;if(invalidSession){logger.info("Session expired! - removing");localStorage.removeItem("sessionId")}if($(error).find(">error>graceful-shutdown").length){self.eventEmitter.emit(XMPPEvents.GRACEFUL_SHUTDOWN);return}var reservationErr=$(error).find(">error>reservation-error");if(reservationErr.length){var errorCode=reservationErr.attr("error-code");var errorMsg;if($(error).find(">error>text")){errorMsg=$(error).find(">error>text").text()}self.eventEmitter.emit(XMPPEvents.RESERVATION_ERROR,errorCode,errorMsg); +return}if($(error).find(">error>not-authorized").length){logger.warn("Unauthorized to start the conference",error);var toDomain=Strophe.getDomainFromJid(error.getAttribute("to"));if(toDomain!==this.xmppService.options.hosts.anonymousdomain){self.externalAuthEnabled=true}self.eventEmitter.emit(XMPPEvents.AUTHENTICATION_REQUIRED,function(){self.allocateConferenceFocus(callback)});return}var waitMs=self.getNextErrorTimeout();logger.error("Focus error, retry after "+waitMs,error);var focusComponent=self.getFocusComponent();var retrySec=waitMs/1e3;if(!invalidSession){self.eventEmitter.emit(XMPPEvents.FOCUS_DISCONNECTED,focusComponent,retrySec)}self.getNextTimeout(true);window.setTimeout(function(){self.allocateConferenceFocus(callback)},waitMs)})};Moderator.prototype.authenticate=function(){var self=this;return new Promise(function(resolve,reject){self.connection.sendIQ(self.createConferenceIq(),function(result){self.parseSessionId(result);resolve()},function(error){var code=$(error).find(">error").attr("code");reject(error,code)})})};Moderator.prototype.getLoginUrl=function(urlCallback,failureCallback){var iq=$iq({to:this.getFocusComponent(),type:"get"});iq.c("login-url",{xmlns:"http://jitsi.org/protocol/focus",room:this.roomName,"machine-uid":this.settings.getSettings().uid});this.connection.sendIQ(iq,function(result){var url=$(result).find("login-url").attr("url");url=url=decodeURIComponent(url);if(url){logger.info("Got auth url: "+url);urlCallback(url)}else{logger.error("Failed to get auth url from the focus",result);failureCallback(result)}},function(error){logger.error("Get auth url error",error);failureCallback(error)})};Moderator.prototype.getPopupLoginUrl=function(urlCallback,failureCallback){var iq=$iq({to:this.getFocusComponent(),type:"get"});iq.c("login-url",{xmlns:"http://jitsi.org/protocol/focus",room:this.roomName,"machine-uid":this.settings.getSettings().uid,popup:true});this.connection.sendIQ(iq,function(result){var url=$(result).find("login-url").attr("url");url=url=decodeURIComponent(url);if(url){logger.info("Got POPUP auth url: "+url);urlCallback(url)}else{logger.error("Failed to get POPUP auth url from the focus",result);failureCallback(result)}},function(error){logger.error("Get POPUP auth url error",error);failureCallback(error)})};Moderator.prototype.logout=function(callback){var iq=$iq({to:this.getFocusComponent(),type:"set"});var sessionId=localStorage.getItem("sessionId");if(!sessionId){callback();return}iq.c("logout",{xmlns:"http://jitsi.org/protocol/focus","session-id":sessionId});this.connection.sendIQ(iq,function(result){var logoutUrl=$(result).find("logout").attr("logout-url");if(logoutUrl){logoutUrl=decodeURIComponent(logoutUrl)}logger.info("Log out OK, url: "+logoutUrl,result);localStorage.removeItem("sessionId");callback(logoutUrl)},function(error){logger.error("Logout error",error)})};module.exports=Moderator}).call(this,"/modules/xmpp/moderator.js")},{"../../service/authentication/AuthenticationEvents":138,"../../service/xmpp/XMPPEvents":142,"jitsi-meet-logger":49}],36:[function(require,module,exports){(function(__filename){var XMPPEvents=require("../../service/xmpp/XMPPEvents");var logger=require("jitsi-meet-logger").getLogger(__filename);function Recording(type,eventEmitter,connection,focusMucJid,jirecon,roomjid){this.eventEmitter=eventEmitter;this.connection=connection;this.state="off";this.focusMucJid=focusMucJid;this.jirecon=jirecon;this.url=null;this.type=type;this._isSupported=type===Recording.types.JIBRI||type===Recording.types.JIRECON&&!this.jirecon?false:true;this.jireconRid=null;this.roomjid=roomjid}Recording.types={COLIBRI:"colibri",JIRECON:"jirecon",JIBRI:"jibri"};Recording.prototype.handleJibriPresence=function(jibri){var attributes=jibri.attributes;if(!attributes)return;this._isSupported=attributes.status&&attributes.status!=="undefined";if(this._isSupported){this.url=attributes.url||null;this.state=attributes.status||"off"}this.eventEmitter.emit(XMPPEvents.RECORDING_STATE_CHANGED)};Recording.prototype.setRecordingJibri=function(state,callback,errCallback,options){if(state==this.state){errCallback(new Error("Invalid state!"))}options=options||{};var iq=$iq({to:this.focusMucJid,type:"set"}).c("jibri",{xmlns:"http://jitsi.org/protocol/jibri",action:state==="on"?"start":"stop",streamid:options.streamId,"follow-entity":options.followEntity}).up();logger.log("Set jibri recording: "+state,iq.nodeTree);console.log(iq.nodeTree);this.connection.sendIQ(iq,function(result){callback($(result).find("jibri").attr("state"),$(result).find("jibri").attr("url"))},function(error){logger.log("Failed to start recording, error: ",error);errCallback(error)})};Recording.prototype.setRecordingJirecon=function(state,callback,errCallback,options){if(state==this.state){errCallback(new Error("Invalid state!"))}var iq=$iq({to:this.jirecon,type:"set"}).c("recording",{xmlns:"http://jitsi.org/protocol/jirecon",action:state==="on"?"start":"stop",mucjid:this.roomjid});if(state==="off"){iq.attrs({rid:this.jireconRid})}console.log("Start recording");var self=this;this.connection.sendIQ(iq,function(result){self.jireconRid=$(result).find("recording").attr("rid");console.log("Recording "+(state==="on"?"started":"stopped")+"(jirecon)"+result);self.state=state;if(state==="off"){self.jireconRid=null}callback(state)},function(error){console.log("Failed to start recording, error: ",error);errCallback(error)})};Recording.prototype.setRecordingColibri=function(state,callback,errCallback,options){var elem=$iq({to:this.focusMucJid,type:"set"});elem.c("conference",{xmlns:"http://jitsi.org/protocol/colibri"});elem.c("recording",{state:state,token:options.token});var self=this;this.connection.sendIQ(elem,function(result){console.log('Set recording "',state,'". Result:',result);var recordingElem=$(result).find(">conference>recording");var newState=recordingElem.attr("state");self.state=newState;callback(newState);if(newState==="pending"){self.connection.addHandler(function(iq){var state=$(iq).find("recording").attr("state");if(state){self.state=newState;callback(state)}},"http://jitsi.org/protocol/colibri","iq",null,null,null)}},function(error){console.warn(error);errCallback(error)})};Recording.prototype.setRecording=function(state,callback,errCallback,options){switch(this.type){case Recording.types.JIRECON:this.setRecordingJirecon(state,callback,errCallback,options);break;case Recording.types.COLIBRI:this.setRecordingColibri(state,callback,errCallback,options);break;case Recording.types.JIBRI:this.setRecordingJibri(state,callback,errCallback,options);break;default:console.error("Unknown recording type!");return}};Recording.prototype.toggleRecording=function(options,statusChangeHandler){if(!options.token&&this.type===Recording.types.COLIBRI||!options.streamId&&this.type===Recording.types.JIBRI){statusChangeHandler("error",new Error("No token passed!"));logger.error("No token passed!");return}var oldState=this.state;var newState=oldState==="off"||!oldState?"on":"off";var self=this;this.setRecording(newState,function(state,url){logger.log("New recording state: ",state);if(state&&state!==oldState){self.state=state;self.url=url;statusChangeHandler(state)}else{statusChangeHandler("error",new Error("Status not changed!"))}},function(error){statusChangeHandler("error",error)},options)};Recording.prototype.isSupported=function(){return this._isSupported};Recording.prototype.getState=function(){return this.state};Recording.prototype.getURL=function(){return this.url};module.exports=Recording}).call(this,"/modules/xmpp/recording.js")},{"../../service/xmpp/XMPPEvents":142,"jitsi-meet-logger":49}],37:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var ChatRoom=require("./ChatRoom");module.exports=function(XMPP){Strophe.addConnectionPlugin("emuc",{connection:null,rooms:{},init:function(conn){this.connection=conn;this.connection.addHandler(this.onPresence.bind(this),null,"presence",null,null,null,null);this.connection.addHandler(this.onPresenceUnavailable.bind(this),null,"presence","unavailable",null);this.connection.addHandler(this.onPresenceError.bind(this),null,"presence","error",null);this.connection.addHandler(this.onMessage.bind(this),null,"message",null,null);this.connection.addHandler(this.onMute.bind(this),"http://jitsi.org/jitmeet/audio","iq","set",null,null)},createRoom:function(jid,password,options,settings){var roomJid=Strophe.getBareJidFromJid(jid);if(this.rooms[roomJid]){logger.error("You are already in the room!");return}this.rooms[roomJid]=new ChatRoom(this.connection,jid,password,XMPP,options,settings);return this.rooms[roomJid]},doLeave:function(jid){this.rooms[jid].doLeave();delete this.rooms[jid]},onPresence:function(pres){var from=pres.getAttribute("from");if(pres.getAttribute("type")){return true}var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;if($(pres).find('>x[xmlns="http://jabber.org/protocol/muc#user"]>status[code="201"]').length){room.createNonAnonymousRoom()}room.onPresence(pres);return true},onPresenceUnavailable:function(pres){var from=pres.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onPresenceUnavailable(pres,from);return true},onPresenceError:function(pres){var from=pres.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onPresenceError(pres,from);return true},onMessage:function(msg){var from=msg.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onMessage(msg,from);return true},setJingleSession:function(from,session){var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.setJingleSession(session)},onMute:function(iq){var from=iq.getAttribute("from");var room=this.rooms[Strophe.getBareJidFromJid(from)];if(!room)return;room.onMute(iq);return true}})}}).call(this,"/modules/xmpp/strophe.emuc.js")},{"./ChatRoom":28,"jitsi-meet-logger":49}],38:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var JingleSession=require("./JingleSessionPC");var XMPPEvents=require("../../service/xmpp/XMPPEvents");var RTCBrowserType=require("../RTC/RTCBrowserType");module.exports=function(XMPP,eventEmitter){Strophe.addConnectionPlugin("jingle",{connection:null,sessions:{},jid2session:{},ice_config:{iceServers:[]},media_constraints:{mandatory:{OfferToReceiveAudio:true,OfferToReceiveVideo:true}},init:function(conn){this.connection=conn;if(this.connection.disco){this.connection.disco.addFeature("urn:xmpp:jingle:1");this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:1");this.connection.disco.addFeature("urn:xmpp:jingle:transports:ice-udp:1");this.connection.disco.addFeature("urn:xmpp:jingle:apps:dtls:0");this.connection.disco.addFeature("urn:xmpp:jingle:transports:dtls-sctp:1");this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:audio");this.connection.disco.addFeature("urn:xmpp:jingle:apps:rtp:video");if(RTCBrowserType.isChrome()||RTCBrowserType.isOpera()||RTCBrowserType.isTemasysPluginUsed()){this.connection.disco.addFeature("urn:ietf:rfc:4588")}this.connection.disco.addFeature("urn:ietf:rfc:5761");this.connection.disco.addFeature("urn:ietf:rfc:5888")}this.connection.addHandler(this.onJingle.bind(this),"urn:xmpp:jingle:1","iq","set",null,null)},onJingle:function(iq){var sid=$(iq).find("jingle").attr("sid");var action=$(iq).find("jingle").attr("action");var fromJid=iq.getAttribute("from");var ack=$iq({type:"result",to:fromJid,id:iq.getAttribute("id")});logger.log("on jingle "+action+" from "+fromJid,iq);var sess=this.sessions[sid];if("session-initiate"!=action){if(sess===null){ack.type="error";ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"});this.connection.send(ack);return true}if(fromJid!=sess.peerjid){logger.warn("jid mismatch for session id",sid,fromJid,sess.peerjid);ack.type="error";ack.c("error",{type:"cancel"}).c("item-not-found",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up().c("unknown-session",{xmlns:"urn:xmpp:jingle:errors:1"});this.connection.send(ack);return true}}else if(sess!==undefined){ack.type="error";ack.c("error",{type:"cancel"}).c("service-unavailable",{xmlns:"urn:ietf:params:xml:ns:xmpp-stanzas"}).up();logger.warn("duplicate session id",sid);this.connection.send(ack);return true}this.connection.send(ack);switch(action){case"session-initiate":console.log("(TIME) received session-initiate: ",window.performance.now());var startMuted=$(iq).find("jingle>startmuted");if(startMuted&&startMuted.length>0){var audioMuted=startMuted.attr("audio");var videoMuted=startMuted.attr("video");eventEmitter.emit(XMPPEvents.START_MUTED_FROM_FOCUS,audioMuted==="true",videoMuted==="true")}sess=new JingleSession($(iq).attr("to"),$(iq).find("jingle").attr("sid"),this.connection,XMPP);var fromBareJid=Strophe.getBareJidFromJid(fromJid);this.connection.emuc.setJingleSession(fromBareJid,sess);sess.media_constraints=this.media_constraints;sess.ice_config=this.ice_config;sess.initialize(fromJid,false);eventEmitter.emit(XMPPEvents.CALL_INCOMING,sess);sess.setOffer($(iq).find(">jingle"));this.sessions[sess.sid]=sess;this.jid2session[sess.peerjid]=sess;sess.sendAnswer();sess.accept();break;case"session-accept":sess.setAnswer($(iq).find(">jingle"));sess.accept();break;case"session-terminate":if(Object.keys(this.sessions).length<1||!(this.sessions[Object.keys(this.sessions)[0]]instanceof JingleSession)){break}logger.log("terminating...",sess.sid);sess.terminate();this.terminate(sess.sid);if($(iq).find(">jingle>reason").length){$(document).trigger("callterminated.jingle",[sess.sid,sess.peerjid,$(iq).find(">jingle>reason>:first")[0].tagName,$(iq).find(">jingle>reason>text").text()])}else{$(document).trigger("callterminated.jingle",[sess.sid,sess.peerjid])}break;case"transport-info":sess.addIceCandidate($(iq).find(">jingle>content"));break;case"session-info":var affected;if($(iq).find('>jingle>ringing[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length){$(document).trigger("ringing.jingle",[sess.sid])}else if($(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length){affected=$(iq).find('>jingle>mute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name");$(document).trigger("mute.jingle",[sess.sid,affected])}else if($(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').length){affected=$(iq).find('>jingle>unmute[xmlns="urn:xmpp:jingle:apps:rtp:info:1"]').attr("name");$(document).trigger("unmute.jingle",[sess.sid,affected])}break;case"addsource":case"source-add":sess.addSource($(iq).find(">jingle>content"));break;case"removesource":case"source-remove":sess.removeSource($(iq).find(">jingle>content"));break;default:logger.warn("jingle action not implemented",action);break}return true},terminate:function(sid,reason,text){if(sid===null||sid===undefined){for(sid in this.sessions){if(this.sessions[sid].state!="ended"){this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text);this.sessions[sid].terminate()}delete this.jid2session[this.sessions[sid].peerjid];delete this.sessions[sid]}}else if(this.sessions.hasOwnProperty(sid)){if(this.sessions[sid].state!="ended"){this.sessions[sid].sendTerminate(reason||!this.sessions[sid].active()?"cancel":null,text);this.sessions[sid].terminate()}delete this.jid2session[this.sessions[sid].peerjid];delete this.sessions[sid]}},getStunAndTurnCredentials:function(){var self=this;this.connection.sendIQ($iq({type:"get",to:this.connection.domain}).c("services",{xmlns:"urn:xmpp:extdisco:1"}).c("service",{host:"turn."+this.connection.domain}),function(res){var iceservers=[];$(res).find(">services>service").each(function(idx,el){el=$(el);var dict={};var type=el.attr("type");switch(type){case"stun":dict.url="stun:"+el.attr("host");if(el.attr("port")){dict.url+=":"+el.attr("port")}iceservers.push(dict);break;case"turn":case"turns":dict.url=type+":";if(el.attr("username")){if(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)&&parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2],10)<28){dict.url+=el.attr("username")+"@"}else{dict.username=el.attr("username")}}dict.url+=el.attr("host");if(el.attr("port")&&el.attr("port")!="3478"){dict.url+=":"+el.attr("port")}if(el.attr("transport")&&el.attr("transport")!="udp"){dict.url+="?transport="+el.attr("transport")}if(el.attr("password")){dict.credential=el.attr("password")}iceservers.push(dict);break}});self.ice_config.iceServers=iceservers},function(err){logger.warn("getting turn credentials failed",err);logger.warn("is mod_turncredentials or similar installed?")})},getLog:function(){var data={};var self=this;Object.keys(this.sessions).forEach(function(sid){var session=self.sessions[sid];if(session.peerconnection&&session.peerconnection.updateLog){data["jingle_"+session.sid]={updateLog:session.peerconnection.updateLog,stats:session.peerconnection.stats,url:window.location.href}}});return data}})}}).call(this,"/modules/xmpp/strophe.jingle.js")},{"../../service/xmpp/XMPPEvents":142,"../RTC/RTCBrowserType":17,"./JingleSessionPC":30,"jitsi-meet-logger":49}],39:[function(require,module,exports){module.exports=function(){Strophe.addConnectionPlugin("logger",{connection:null,log:[],init:function(conn){this.connection=conn;this.connection.rawInput=this.log_incoming.bind(this);this.connection.rawOutput=this.log_outgoing.bind(this)},log_incoming:function(stanza){this.log.push([(new Date).getTime(),"incoming",stanza])},log_outgoing:function(stanza){this.log.push([(new Date).getTime(),"outgoing",stanza])}})}},{}],40:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var XMPPEvents=require("../../service/xmpp/XMPPEvents");var PING_INTERVAL=1e4;var PING_TIMEOUT=15e3;var PING_THRESHOLD=3;module.exports=function(XMPP,eventEmitter){Strophe.addConnectionPlugin("ping",{connection:null,failedPings:0,init:function(connection){this.connection=connection;Strophe.addNamespace("PING","urn:xmpp:ping")},ping:function(jid,success,error,timeout){var iq=$iq({type:"get",to:jid});iq.c("ping",{xmlns:Strophe.NS.PING});this.connection.sendIQ(iq,success,error,timeout)},hasPingSupport:function(jid,callback){this.connection.disco.info(jid,null,function(result){var ping=$(result).find('>>feature[var="urn:xmpp:ping"]');callback(ping.length>0)},function(error){logger.error("Ping feature discovery error",error);callback(false)})},startInterval:function(remoteJid,interval){if(this.intervalId){logger.error("Ping task scheduled already");return}if(!interval)interval=PING_INTERVAL;var self=this;this.intervalId=window.setInterval(function(){self.ping(remoteJid,function(result){self.failedPings=0},function(error){self.failedPings+=1;logger.error("Ping "+(error?"error":"timeout"),error);if(self.failedPings>=PING_THRESHOLD){self.connection.disconnect()}},PING_TIMEOUT)},interval);logger.info("XMPP pings will be sent every "+interval+" ms")},stopInterval:function(){if(this.intervalId){window.clearInterval(this.intervalId);this.intervalId=null;this.failedPings=0;logger.info("Ping interval cleared")}}})}}).call(this,"/modules/xmpp/strophe.ping.js")},{"../../service/xmpp/XMPPEvents":142,"jitsi-meet-logger":49}],41:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);module.exports=function(){Strophe.addConnectionPlugin("rayo",{RAYO_XMLNS:"urn:xmpp:rayo:1",connection:null,init:function(conn){this.connection=conn;if(this.connection.disco){this.connection.disco.addFeature("urn:xmpp:rayo:client:1")}this.connection.addHandler(this.onRayo.bind(this),this.RAYO_XMLNS,"iq","set",null,null)},onRayo:function(iq){logger.info("Rayo IQ",iq)},dial:function(to,from,roomName,roomPass,focusMucJid){var self=this;return new Promise(function(resolve,reject){if(!focusMucJid){reject(new Error("Internal error!"));return}var req=$iq({type:"set",to:focusMucJid});req.c("dial",{xmlns:self.RAYO_XMLNS,to:to,from:from});req.c("header",{name:"JvbRoomName",value:roomName}).up();if(roomPass!==null&&roomPass.length){req.c("header",{name:"JvbRoomPassword",value:roomPass}).up()}self.connection.sendIQ(req,function(result){logger.info("Dial result ",result);var resource=$(result).find("ref").attr("uri");self.call_resource=resource.substr("xmpp:".length);logger.info("Received call resource: "+self.call_resource);resolve()},function(error){logger.info("Dial error ",error);reject(error)})})},hangup:function(){var self=this;return new Promise(function(resolve,reject){if(!self.call_resource){reject(new Error("No call in progress"));logger.warn("No call in progress");return}var req=$iq({type:"set",to:self.call_resource});req.c("hangup",{xmlns:self.RAYO_XMLNS});self.connection.sendIQ(req,function(result){logger.info("Hangup result ",result);self.call_resource=null;resolve()},function(error){logger.info("Hangup error ",error);self.call_resource=null;reject(new Error("Hangup error "))})})}})}}).call(this,"/modules/xmpp/strophe.rayo.js")},{"jitsi-meet-logger":49}],42:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);module.exports=function(){Strophe.log=function(level,msg){switch(level){case Strophe.LogLevel.WARN:logger.warn("Strophe: "+msg);break;case Strophe.LogLevel.ERROR:case Strophe.LogLevel.FATAL:logger.error("Strophe: "+msg);break}};Strophe.getStatusString=function(status){switch(status){case Strophe.Status.ERROR:return"ERROR";case Strophe.Status.CONNECTING:return"CONNECTING";case Strophe.Status.CONNFAIL:return"CONNFAIL";case Strophe.Status.AUTHENTICATING:return"AUTHENTICATING";case Strophe.Status.AUTHFAIL:return"AUTHFAIL";case Strophe.Status.CONNECTED:return"CONNECTED";case Strophe.Status.DISCONNECTED:return"DISCONNECTED";case Strophe.Status.DISCONNECTING:return"DISCONNECTING";case Strophe.Status.ATTACHED:return"ATTACHED";default:return"unknown"}}}}).call(this,"/modules/xmpp/strophe.util.js")},{"jitsi-meet-logger":49}],43:[function(require,module,exports){(function(__filename){var logger=require("jitsi-meet-logger").getLogger(__filename);var EventEmitter=require("events");var Pako=require("pako");var RTCEvents=require("../../service/RTC/RTCEvents");var XMPPEvents=require("../../service/xmpp/XMPPEvents");var JitsiConnectionErrors=require("../../JitsiConnectionErrors");var JitsiConnectionEvents=require("../../JitsiConnectionEvents");var RTC=require("../RTC/RTC");var authenticatedUser=false;function createConnection(bosh){bosh=bosh||"/http-bind";if(this.token){bosh+=bosh.indexOf("?")==-1?"?token="+this.token:"&token="+this.token}return new Strophe.Connection(bosh)}function initStrophePlugins(XMPP){require("./strophe.emuc")(XMPP);require("./strophe.jingle")(XMPP,XMPP.eventEmitter);require("./strophe.util")();require("./strophe.ping")(XMPP,XMPP.eventEmitter);require("./strophe.rayo")();require("./strophe.logger")()}function XMPP(options){this.eventEmitter=new EventEmitter;this.connection=null;this.disconnectInProgress=false;this.forceMuted=false;this.options=options;initStrophePlugins(this);this.connection=createConnection(options.bosh)}XMPP.prototype.getConnection=function(){return connection};XMPP.prototype._connect=function(jid,password){var self=this;var anonymousConnectionFailed=false;var connectionFailed=false;var lastErrorMsg;this.connection.connect(jid,password,function(status,msg){logger.log("(TIME) Strophe "+Strophe.getStatusString(status)+(msg?"["+msg+"]":"")+" :"+window.performance.now());if(status===Strophe.Status.CONNECTED){if(self.options.useStunTurn){self.connection.jingle.getStunAndTurnCredentials()}logger.info("My Jabber ID: "+self.connection.jid);var pingJid=self.connection.domain;self.connection.ping.hasPingSupport(pingJid,function(hasPing){if(hasPing)self.connection.ping.startInterval(pingJid);else logger.warn("Ping NOT supported by "+pingJid)});if(password)authenticatedUser=true;if(self.connection&&self.connection.connected&&Strophe.getResourceFromJid(self.connection.jid)){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_ESTABLISHED,Strophe.getResourceFromJid(self.connection.jid))}}else if(status===Strophe.Status.CONNFAIL){if(msg==="x-strophe-bad-non-anon-jid"){anonymousConnectionFailed=true}else{connectionFailed=true}lastErrorMsg=msg}else if(status===Strophe.Status.DISCONNECTED){self.connection.ping.stopInterval();self.disconnectInProgress=false;if(anonymousConnectionFailed){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_FAILED,JitsiConnectionErrors.PASSWORD_REQUIRED)}else if(connectionFailed){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_FAILED,JitsiConnectionErrors.OTHER_ERROR,msg?msg:lastErrorMsg)}else{self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_DISCONNECTED,msg?msg:lastErrorMsg)}}else if(status===Strophe.Status.AUTHFAIL){self.eventEmitter.emit(JitsiConnectionEvents.CONNECTION_FAILED,JitsiConnectionErrors.PASSWORD_REQUIRED)}})};XMPP.prototype.connect=function(jid,password){if(!jid){var configDomain=this.options.hosts.anonymousdomain||this.options.hosts.domain;if(this.options.hosts.anonymousdomain&&window.location.search.indexOf("login=true")!==-1){configDomain=this.options.hosts.domain}jid=configDomain||window.location.hostname}return this._connect(jid,password)};XMPP.prototype.createRoom=function(roomName,options,settings){var roomjid=roomName+"@"+this.options.hosts.muc;if(options.useNicks){if(options.nick){roomjid+="/"+options.nick}else{roomjid+="/"+Strophe.getNodeFromJid(this.connection.jid)}}else{var tmpJid=Strophe.getNodeFromJid(this.connection.jid);if(!authenticatedUser)tmpJid=tmpJid.substr(0,8);roomjid+="/"+tmpJid}return this.connection.emuc.createRoom(roomjid,null,options,settings)};XMPP.prototype.addListener=function(type,listener){this.eventEmitter.on(type,listener)};XMPP.prototype.removeListener=function(type,listener){this.eventEmitter.removeListener(type,listener)};XMPP.prototype.leaveRoom=function(jid){var handler=this.connection.jingle.jid2session[jid];if(handler&&handler.peerconnection){if(RTC.localAudio){handler.peerconnection.removeStream(RTC.localAudio.getOriginalStream(),true)}if(RTC.localVideo){handler.peerconnection.removeStream(RTC.localVideo.getOriginalStream(),true)}handler.peerconnection.close()}this.eventEmitter.emit(XMPPEvents.DISPOSE_CONFERENCE);this.connection.emuc.doLeave(jid)};XMPP.prototype.sendLogs=function(data){if(!this.connection.emuc.focusMucJid)return false;var deflate=true;var content=JSON.stringify(data);if(deflate){content=String.fromCharCode.apply(null,Pako.deflateRaw(content))}content=Base64.encode(content);var message=$msg({to:this.connection.emuc.focusMucJid,type:"normal"});message.c("log",{xmlns:"urn:xmpp:eventlog",id:"PeerConnectionStats"});message.c("message").t(content).up();if(deflate){message.c("tag",{name:"deflated",value:"true"}).up()}message.up();this.connection.send(message);return true};XMPP.prototype.getJingleLog=function(){return this.connection.jingle?this.connection.jingle.getLog():{}};XMPP.prototype.getXmppLog=function(){return this.connection.logger?this.connection.logger.log:null};XMPP.prototype.dial=function(to,from,roomName,roomPass){this.connection.rayo.dial(to,from,roomName,roomPass)};XMPP.prototype.setMute=function(jid,mute){this.connection.moderate.setMute(jid,mute)};XMPP.prototype.eject=function(jid){this.connection.moderate.eject(jid)};XMPP.prototype.getSessions=function(){return this.connection.jingle.sessions};XMPP.prototype.disconnect=function(){if(this.disconnectInProgress||!this.connection||!this.connection.connected){this.eventEmitter.emit(JitsiConnectionEvents.WRONG_STATE);return}this.disconnectInProgress=true;this.connection.disconnect()};module.exports=XMPP}).call(this,"/modules/xmpp/xmpp.js")},{"../../JitsiConnectionErrors":5,"../../JitsiConnectionEvents":6,"../../service/RTC/RTCEvents":136,"../../service/xmpp/XMPPEvents":142,"../RTC/RTC":16,"./strophe.emuc":37,"./strophe.jingle":38,"./strophe.logger":39,"./strophe.ping":40,"./strophe.rayo":41,"./strophe.util":42,events:45,"jitsi-meet-logger":49,pako:51}],44:[function(require,module,exports){(function(process){(function(){var async={};var root,previous_async;root=this;if(root!=null){previous_async=root.async}async.noConflict=function(){root.async=previous_async;return async};function only_once(fn){var called=false;return function(){if(called)throw new Error("Callback was already called.");called=true;fn.apply(root,arguments)}}var _toString=Object.prototype.toString;var _isArray=Array.isArray||function(obj){return _toString.call(obj)==="[object Array]"};var _each=function(arr,iterator){if(arr.forEach){return arr.forEach(iterator)}for(var i=0;i=arr.length){callback()}}}};async.forEach=async.each;async.eachSeries=function(arr,iterator,callback){callback=callback||function(){};if(!arr.length){return callback()}var completed=0;var iterate=function(){iterator(arr[completed],function(err){if(err){callback(err);callback=function(){}}else{completed+=1;if(completed>=arr.length){callback()}else{iterate()}}})};iterate()};async.forEachSeries=async.eachSeries;async.eachLimit=function(arr,limit,iterator,callback){var fn=_eachLimit(limit);fn.apply(null,[arr,iterator,callback])};async.forEachLimit=async.eachLimit;var _eachLimit=function(limit){return function(arr,iterator,callback){callback=callback||function(){};if(!arr.length||limit<=0){return callback()}var completed=0;var started=0;var running=0;(function replenish(){if(completed>=arr.length){return callback()}while(running=arr.length){callback()}else{replenish()}}})}})()}};var doParallel=function(fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[async.each].concat(args))}};var doParallelLimit=function(limit,fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[_eachLimit(limit)].concat(args))}};var doSeries=function(fn){return function(){var args=Array.prototype.slice.call(arguments);return fn.apply(null,[async.eachSeries].concat(args))}};var _asyncMap=function(eachfn,arr,iterator,callback){arr=_map(arr,function(x,i){return{index:i,value:x}});if(!callback){eachfn(arr,function(x,callback){iterator(x.value,function(err){callback(err)})})}else{var results=[];eachfn(arr,function(x,callback){iterator(x.value,function(err,v){results[x.index]=v;callback(err)})},function(err){callback(err,results)})}};async.map=doParallel(_asyncMap);async.mapSeries=doSeries(_asyncMap);async.mapLimit=function(arr,limit,iterator,callback){return _mapLimit(limit)(arr,iterator,callback)};var _mapLimit=function(limit){return doParallelLimit(limit,_asyncMap); };async.reduce=function(arr,memo,iterator,callback){async.eachSeries(arr,function(x,callback){iterator(memo,x,function(err,v){memo=v;callback(err)})},function(err){callback(err,memo)})};async.inject=async.reduce;async.foldl=async.reduce;async.reduceRight=function(arr,memo,iterator,callback){var reversed=_map(arr,function(x){return x}).reverse();async.reduce(reversed,memo,iterator,callback)};async.foldr=async.reduceRight;var _filter=function(eachfn,arr,iterator,callback){var results=[];arr=_map(arr,function(x,i){return{index:i,value:x}});eachfn(arr,function(x,callback){iterator(x.value,function(v){if(v){results.push(x)}callback()})},function(err){callback(_map(results.sort(function(a,b){return a.index-b.index}),function(x){return x.value}))})};async.filter=doParallel(_filter);async.filterSeries=doSeries(_filter);async.select=async.filter;async.selectSeries=async.filterSeries;var _reject=function(eachfn,arr,iterator,callback){var results=[];arr=_map(arr,function(x,i){return{index:i,value:x}});eachfn(arr,function(x,callback){iterator(x.value,function(v){if(!v){results.push(x)}callback()})},function(err){callback(_map(results.sort(function(a,b){return a.index-b.index}),function(x){return x.value}))})};async.reject=doParallel(_reject);async.rejectSeries=doSeries(_reject);var _detect=function(eachfn,arr,iterator,main_callback){eachfn(arr,function(x,callback){iterator(x,function(result){if(result){main_callback(x);main_callback=function(){}}else{callback()}})},function(err){main_callback()})};async.detect=doParallel(_detect);async.detectSeries=doSeries(_detect);async.some=function(arr,iterator,main_callback){async.each(arr,function(x,callback){iterator(x,function(v){if(v){main_callback(true);main_callback=function(){}}callback()})},function(err){main_callback(false)})};async.any=async.some;async.every=function(arr,iterator,main_callback){async.each(arr,function(x,callback){iterator(x,function(v){if(!v){main_callback(false);main_callback=function(){}}callback()})},function(err){main_callback(true)})};async.all=async.every;async.sortBy=function(arr,iterator,callback){async.map(arr,function(x,callback){iterator(x,function(err,criteria){if(err){callback(err)}else{callback(null,{value:x,criteria:criteria})}})},function(err,results){if(err){return callback(err)}else{var fn=function(left,right){var a=left.criteria,b=right.criteria;return ab?1:0};callback(null,_map(results.sort(fn),function(x){return x.value}))}})};async.auto=function(tasks,callback){callback=callback||function(){};var keys=_keys(tasks);var remainingTasks=keys.length;if(!remainingTasks){return callback()}var results={};var listeners=[];var addListener=function(fn){listeners.unshift(fn)};var removeListener=function(fn){for(var i=0;i>>1);if(compare(item,sequence[mid])>=0){beg=mid}else{end=mid-1}}return beg}function _insert(q,data,priority,callback){if(!q.started){q.started=true}if(!_isArray(data)){data=[data]}if(data.length==0){return async.setImmediate(function(){if(q.drain){q.drain()}})}_each(data,function(task){var item={data:task,priority:priority,callback:typeof callback==="function"?callback:null};q.tasks.splice(_binarySearch(q.tasks,item,_compareTasks)+1,0,item);if(q.saturated&&q.tasks.length===q.concurrency){q.saturated()}async.setImmediate(q.process)})}var q=async.queue(worker,concurrency);q.push=function(data,priority,callback){_insert(q,data,priority,callback)};delete q.unshift;return q};async.cargo=function(worker,payload){var working=false,tasks=[];var cargo={tasks:tasks,payload:payload,saturated:null,empty:null,drain:null,drained:true,push:function(data,callback){if(!_isArray(data)){data=[data]}_each(data,function(task){tasks.push({data:task,callback:typeof callback==="function"?callback:null});cargo.drained=false;if(cargo.saturated&&tasks.length===payload){cargo.saturated()}});async.setImmediate(cargo.process)},process:function process(){if(working)return;if(tasks.length===0){if(cargo.drain&&!cargo.drained)cargo.drain();cargo.drained=true;return}var ts=typeof payload==="number"?tasks.splice(0,payload):tasks.splice(0,tasks.length);var ds=_map(ts,function(task){return task.data});if(cargo.empty)cargo.empty();working=true;worker(ds,function(){working=false;var args=arguments;_each(ts,function(data){if(data.callback){data.callback.apply(null,args)}});process()})},length:function(){return tasks.length},running:function(){return working}};return cargo};var _console_fn=function(name){return function(fn){var args=Array.prototype.slice.call(arguments,1);fn.apply(null,args.concat([function(err){var args=Array.prototype.slice.call(arguments,1);if(typeof console!=="undefined"){if(err){if(console.error){console.error(err)}}else if(console[name]){_each(args,function(x){console[name](x)})}}}]))}};async.log=_console_fn("log");async.dir=_console_fn("dir");async.memoize=function(fn,hasher){var memo={};var queues={};hasher=hasher||function(x){return x};var memoized=function(){var args=Array.prototype.slice.call(arguments);var callback=args.pop();var key=hasher.apply(null,args);if(key in memo){async.nextTick(function(){callback.apply(null,memo[key])})}else if(key in queues){queues[key].push(callback)}else{queues[key]=[callback];fn.apply(null,args.concat([function(){memo[key]=arguments;var q=queues[key];delete queues[key];for(var i=0,l=q.length;i2){var args=Array.prototype.slice.call(arguments,2);return go.apply(this,args)}else{return go}};async.applyEach=doParallel(_applyEach);async.applyEachSeries=doSeries(_applyEach);async.forever=function(fn,callback){function next(err){if(err){if(callback){return callback(err)}throw err}fn(next)}next()};if(typeof module!=="undefined"&&module.exports){module.exports=async}else if(typeof define!=="undefined"&&define.amd){define([],function(){return async})}else{root.async=async}})()}).call(this,require("_process"))},{_process:46}],45:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}throw TypeError('Uncaught, unspecified "error" event.')}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:len=arguments.length;args=new Array(len-1);for(i=1;i0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-->0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else{while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.listenerCount=function(emitter,type){var ret;if(!emitter._events||!emitter._events[type])ret=0;else if(isFunction(emitter._events[type]))ret=1;else ret=emitter._events[type].length;return ret};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],46:[function(require,module,exports){var process=module.exports={};var queue=[];var draining=false;var currentQueue;var queueIndex=-1;function cleanUpNextTick(){draining=false;if(currentQueue.length){queue=currentQueue.concat(queue)}else{queueIndex=-1}if(queue.length){drainQueue()}}function drainQueue(){if(draining){return}var timeout=setTimeout(cleanUpNextTick);draining=true;var len=queue.length;while(len){currentQueue=queue;queue=[];while(++queueIndex1){for(var i=1;i: ").apply(t,args)}}}function Logger(level,id,transports,format){this.id=id;this.format=format;if(!this.transports){this.transports=[];this.transports.push(Logger.consoleTransport)}this.level=levels[level];var methods=Object.keys(levels);for(var i=0;ib)throw"numRounds must a integer >= 1";switch(c){case"HEX":l=L;break;case"B64":l=M;break;default:throw"format must be HEX or B64"}if("SHA-1"===a)for(p=0;pp/8&&(d[b]&=4294967040);for(n=0;n<=b;n+=1)w[n]=d[n]^909522486,x[n]=d[n]^1549556828;c="SHA-1"===c?y(x.concat(y(w.concat(f),a+g)),a+m):v(x.concat(v(w.concat(f),a+g,c)),a+m,c);return l(c,N(s))}}function s(a,c){this.a=a;this.b=c}function J(a,c){var b=[],g,f=[],h=0,l;if("UTF8"===c)for(l=0;l>>12,f[1]=128|(g&4032)>>>6,f[2]=128|g&63):128>>6,f[1]=128|g&63):f[0]=g,g=0;g>>2]|=f[g]<<24-h%4*8,h+=1;else if("UTF16"===c)for(l=0;l>>2]|=a.charCodeAt(l)<<16-h%4*8,h+=2;return{value:b,binLen:8*h}}function B(a){var c=[],b=a.length,g,f;if(0!==b%2)throw"String of HEX type must be in byte increments";for(g=0;g>>3]|=f<<24-g%8*4}return{value:c,binLen:4*b}}function K(a){var c=[],b=0,g,f,h,l,r;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";g=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==g&&g';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,"\\\n");this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":98,"component-inherit":101}],97:[function(require,module,exports){(function(global){var XMLHttpRequest=require("xmlhttprequest");var Polling=require("./polling");var Emitter=require("component-emitter");var inherit=require("component-inherit");var debug=require("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!=="string"&&data!==undefined;var req=this.request({method:"POST",data:data,isBinary:isBinary});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug("xhr open %s: %s",this.method,this.uri);xhr.open(this.method,this.uri,this.async);if(this.supportsBinary){xhr.responseType="arraybuffer"}if("POST"==this.method){try{if(this.isBinary){xhr.setRequestHeader("Content-type","application/octet-stream")}else{xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}}catch(e){}}if("withCredentials"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug("xhr data %s",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit("error",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if("undefined"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if(contentType==="application/octet-stream"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{data="ok"}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return"undefined"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent("onunload",unloadHandler)}else if(global.addEventListener){global.addEventListener("beforeunload",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":98,"component-emitter":89,"component-inherit":101,debug:102,xmlhttprequest:100}],98:[function(require,module,exports){var Transport=require("../transport");var parseqs=require("parseqs");var parser=require("engine.io-parser");var inherit=require("component-inherit");var debug=require("debug")("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=require("xmlhttprequest");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){if("opening"==self.readyState){self.onOpen()}if("close"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if("closed"!=this.readyState){this.polling=false;this.emit("pollComplete");if("open"==this.readyState){this.poll()}else{debug('ignoring poll - transport state "%s"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug("writing close packet");self.write([{type:"close"}])}if("open"==this.readyState){debug("transport open - closing");close()}else{debug("transport not open - deferring close");this.once("open",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit("drain")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(false!==this.timestampRequests){query[this.timestampParam]=+new Date+"-"+Transport.timestamps++}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80)){port=":"+this.port}if(query.length){query="?"+query}return schema+"://"+this.hostname+port+this.path+query}},{"../transport":94,"component-inherit":101,debug:102,"engine.io-parser":105,parseqs:117,xmlhttprequest:100}],99:[function(require,module,exports){var Transport=require("../transport");var parser=require("engine.io-parser");var parseqs=require("parseqs");var inherit=require("component-inherit");var debug=require("debug")("engine.io-client:websocket");var WebSocket=require("ws");module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name="websocket";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;this.ws=new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}this.ws.binaryType="arraybuffer";this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError("websocket error",e)}};if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;for(var i=0,l=packets.length;i=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff);if(!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if("%%"===match)return;index++;if("%c"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return"object"==typeof console&&"function"==typeof console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){localStorage.removeItem("debug")}else{localStorage.debug=namespaces}}catch(e){}}function load(){var r;try{r=localStorage.debug}catch(e){}return r}exports.enable(load())},{"./debug":103}],103:[function(require,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=require("ms");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if("string"!==typeof args[0]){args=["%o"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match==="%%")return match;index++;var formatter=exports.formatters[format];if("function"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if("function"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||"").split(/[\s,]+/);var len=split.length;for(var i=0;i=d)return Math.round(ms/d)+"d";if(ms>=h)return Math.round(ms/h)+"h";if(ms>=m)return Math.round(ms/m)+"m";if(ms>=s)return Math.round(ms/s)+"s";return ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(ms1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType==="blob"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType==="blob"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary=="function"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback("0:")}function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(""))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength="";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;ibytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i>2];base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+"="}else if(len%3===1){base64=base64.substring(0,base64.length-2)+"=="}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]==="="){bufferLength--;if(base64[base64.length-2]==="="){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],110:[function(require,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var b=new Blob(["hi"]);return b.size==2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;for(var i=0;i=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol="";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString="";while(++index=byteCount){throw Error("Invalid byte index")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error("Invalid byte index")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error("Invalid UTF-8 detected")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:"2.0.0",encode:utf8encode,decode:utf8decode};if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],114:[function(require,module,exports){var global=require("global");try{module.exports="XMLHttpRequest"in global&&"withCredentials"in new global.XMLHttpRequest}catch(err){module.exports=false}},{global:115}],115:[function(require,module,exports){module.exports=function(){return this}()},{}],116:[function(require,module,exports){(function(global){var rvalidchars=/^[\],:{}\s]*$/;var rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g;var rtrimLeft=/^\s+/;var rtrimRight=/\s+$/;module.exports=function parsejson(data){if("string"!=typeof data||!data){return null}data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],117:[function(require,module,exports){exports.encode=function(obj){var str="";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+="&";str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split("&");for(var i=0,l=pairs.length;i1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty={}.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}var PrimitiveTypes={"boolean":1,number:1,string:1,undefined:1};var isHostType=function(object,property){var type=typeof object[property];return type=="object"?!!object[property]:!PrimitiveTypes[type]};forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!="function"&&isHostType(object,"hasOwnProperty")?object.hasOwnProperty:isProperty;for(property in object){if(!(isFunction&&property=="prototype")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property=="prototype")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property=="prototype")&&isProperty.call(object,property)&&!(isConstructor=property==="constructor")){callback(property)}}if(isConstructor||isProperty.call(object,property="constructor")){callback(property)}}}return forEach(object,callback)};if(!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var leadingZeroes="000000";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix="\\u00";var quote=function(value){var result='"',index=0,length=value.length,isLarge=length>10&&charIndexBuggy,symbols;if(isLarge){symbols=value.split("")}for(;index-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else{value=null}}else if(typeof value.toJSON=="function"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return"null"}className=getClass.call(value);if(className==booleanClass){return""+value}else if(className==numberClass){return value>-1/0&&value<1/0?""+value:"null"}else if(className==stringClass){return quote(""+value)}if(typeof value=="object"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index0){for(whitespace="",width>10&&(width=10);whitespace.length=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)=="true"){Index+=4;return true}else if(source.slice(Index,Index+5)=="false"){Index+=5;return false}else if(source.slice(Index,Index+4)=="null"){Index+=4;return null}abort()}}return"$"};var get=function(value){var results,hasMembers;if(value=="$"){abort()}if(typeof value=="string"){if((charIndexBuggy?value.charAt(0):value[0])=="@"){return value.slice(1)}if(value=="["){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="]"){break}if(hasMembers){if(value==","){value=lex();if(value=="]"){abort()}}else{abort()}}if(value==","){abort()}results.push(get(value))}return results}else if(value=="{"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="}"){break}if(hasMembers){if(value==","){value=lex();if(value=="}"){abort()}}else{abort()}}if(value==","||typeof value!="string"||(charIndexBuggy?value.charAt(0):value[0])!="@"||lex()!=":"){abort()}results[value.slice(1)]=get(lex())}return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value=="object"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};JSON3.parse=function(source,callback){var result,value;Index=0;Source=""+source;result=get(lex());if(lex()!="$"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}if(isLoader){define(function(){return JSON3})}})(this)},{}],130:[function(require,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i0){idx=self.getFirstSendingIndexFromAnswer(type);if(idx===null){for(var i=0;iidx){var mLine=session.media[idx];Object.keys(recvonlySsrcs[type]).forEach(function(ssrc){if(mLine.sources&&mLine.sources[ssrc]){console.warn("Replacing an existing SSRC.")}if(!mLine.sources){mLine.sources={}}mLine.sources[ssrc]=recvonlySsrcs[type][ssrc]})}});session.groups.some(function(group){if(group.type==="BUNDLE"){group.mids=mids.join(" ");return true}});session.msidSemantic={semantic:"WMS",token:"*"};var resStr=transform.write(session);this.cache[desc.type]=resStr;return new RTCSessionDescription({type:desc.type,sdp:resStr})}},{"./array-equals":67,"./transform":70}],70:[function(require,module,exports){var transform=require("sdp-transform");exports.write=function(session,opts){if(typeof session!=="undefined"&&typeof session.media!=="undefined"&&Array.isArray(session.media)){session.media.forEach(function(mLine){if(typeof mLine.sources!=="undefined"&&Object.keys(mLine.sources).length!==0){mLine.ssrcs=[];Object.keys(mLine.sources).forEach(function(ssrc){var source=mLine.sources[ssrc];Object.keys(source).forEach(function(attribute){mLine.ssrcs.push({id:ssrc,attribute:attribute,value:source[attribute]})})});delete mLine.sources}if(typeof mLine.ssrcGroups!=="undefined"&&Array.isArray(mLine.ssrcGroups)){mLine.ssrcGroups.forEach(function(ssrcGroup){if(typeof ssrcGroup.ssrcs!=="undefined"&&Array.isArray(ssrcGroup.ssrcs)){ssrcGroup.ssrcs=ssrcGroup.ssrcs.join(" ")}})}})}if(typeof session!=="undefined"&&typeof session.groups!=="undefined"&&Array.isArray(session.groups)){session.groups.forEach(function(g){if(typeof g.mids!=="undefined"&&Array.isArray(g.mids)){g.mids=g.mids.join(" ")}})}return transform.write(session,opts)};exports.parse=function(sdp){var session=transform.parse(sdp);if(typeof session!=="undefined"&&typeof session.media!=="undefined"&&Array.isArray(session.media)){session.media.forEach(function(mLine){if(typeof mLine.ssrcs!=="undefined"&&Array.isArray(mLine.ssrcs)){mLine.sources={};mLine.ssrcs.forEach(function(ssrc){if(!mLine.sources[ssrc.id])mLine.sources[ssrc.id]={};mLine.sources[ssrc.id][ssrc.attribute]=ssrc.value});delete mLine.ssrcs}if(typeof mLine.ssrcGroups!=="undefined"&&Array.isArray(mLine.ssrcGroups)){mLine.ssrcGroups.forEach(function(ssrcGroup){if(typeof ssrcGroup.ssrcs==="string"){ssrcGroup.ssrcs=ssrcGroup.ssrcs.split(" ")}})}})}if(typeof session!=="undefined"&&typeof session.groups!=="undefined"&&Array.isArray(session.groups)){session.groups.forEach(function(g){if(typeof g.mids==="string"){g.mids=g.mids.split(" ")}})}return session}},{"sdp-transform":72}],71:[function(require,module,exports){var grammar=module.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w\/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(o){return o.encoding?"rtpmap:%d %s/%s/%s":o.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(o){return o.address!=null?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%d trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(o){return o.subtype!=null?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:([\w_\/]*) (\S*)(?: (\S*))?/,names:["value","uri","config"],format:function(o){return o.config!=null?"extmap:%s %s %s":"extmap:%s %s"}},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(o){return o.sessionConfig!=null?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%s"},{name:"ptime",reg:/^ptime:(\d*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation"],format:function(o){var str="candidate:%s %d %s %d %s %d typ %s";str+=o.raddr!=null?" raddr %s rport %d":"%v%v";str+=o.tcptype!=null?" tcptype %s":"%v";if(o.generation!=null){str+=" generation %d"}return str}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_]*):(.*)/,names:["id","attribute","value"],format:"ssrc:%d %s:%s"},{push:"ssrcGroups",reg:/^ssrc-group:(\w*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{push:"invalid",names:["value"]}]};Object.keys(grammar).forEach(function(key){var objs=grammar[key];objs.forEach(function(obj){if(!obj.reg){obj.reg=/(.*)/}if(!obj.format){obj.format="%s"}})})},{}],72:[function(require,module,exports){var parser=require("./parser");var writer=require("./writer");exports.write=writer;exports.parse=parser.parse;exports.parseFmtpConfig=parser.parseFmtpConfig;exports.parsePayloads=parser.parsePayloads;exports.parseRemoteCandidates=parser.parseRemoteCandidates},{"./parser":73,"./writer":74}],73:[function(require,module,exports){var toIntIfInt=function(v){return String(Number(v))===v?Number(v):v};var attachProperties=function(match,location,names,rawName){if(rawName&&!names){location[rawName]=toIntIfInt(match[1])}else{for(var i=0;i=len){return x}var arg=args[i];i+=1;switch(x){case"%%":return"%";case"%s":return String(arg);case"%d":return Number(arg);case"%v":return""}})};var makeLine=function(type,obj,location){var str=obj.format instanceof Function?obj.format(obj.push?location:location[obj.name]):obj.format;var args=[type+"="+str];if(obj.names){for(var i=0;i0&&sources[baseLayerSSRC].cname!==this.layers[0].cname){this.layers=[]}if(this.layers.length<1){this.layers.push({ssrc:baseLayerSSRC,msid:baseLayer.msid,cname:baseLayer.cname});var rtx=false;if(Array.isArray(mLine.rtp)){rtx=mLine.rtp.some(function(rtpmap){return rtpmap.codec==="rtx"})}if(rtx){this.layers[0].rtx=generateSSRC()}for(var i=1;i0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}};Manager.prototype.cleanup=function(){var sub;while(sub=this.subs.shift())sub.destroy();this.packetBuffer=[];this.encoding=false;this.decoder.destroy()};Manager.prototype.close=Manager.prototype.disconnect=function(){this.skipReconnect=true;this.backoff.reset();this.readyState="closed";this.engine&&this.engine.close()};Manager.prototype.onclose=function(reason){debug("close");this.cleanup();this.backoff.reset();this.readyState="closed";this.emit("close",reason);if(this._reconnection&&!this.skipReconnect){this.reconnect()}};Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts){debug("reconnect failed");this.backoff.reset();this.emitAll("reconnect_failed");this.reconnecting=false}else{var delay=this.backoff.duration();debug("will wait %dms before reconnect attempt",delay);this.reconnecting=true;var timer=setTimeout(function(){if(self.skipReconnect)return;debug("attempting reconnect");self.emitAll("reconnect_attempt",self.backoff.attempts);self.emitAll("reconnecting",self.backoff.attempts);if(self.skipReconnect)return;self.open(function(err){if(err){debug("reconnect attempt error");self.reconnecting=false;self.reconnect();self.emitAll("reconnect_error",err.data)}else{debug("reconnect success");self.onreconnect()}})},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}};Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=false;this.backoff.reset();this.updateSocketIds();this.emitAll("reconnect",attempt)}},{"./on":88,"./socket":89,"./url":90,backo2:91,"component-bind":92,"component-emitter":93,debug:94,"engine.io-client":95,indexof:126,"object-component":127,"socket.io-parser":130}],88:[function(require,module,exports){module.exports=on;function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.removeListener(ev,fn)}}}},{}],89:[function(require,module,exports){var parser=require("socket.io-parser");var Emitter=require("component-emitter");var toArray=require("to-array");var on=require("./on");var bind=require("component-bind");var debug=require("debug")("socket.io-client:socket");var hasBin=require("has-binary");module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1};var emit=Emitter.prototype.emit;function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=0;this.acks={};if(this.io.autoConnect)this.open();this.receiveBuffer=[];this.sendBuffer=[];this.connected=false;this.disconnected=true}Emitter(Socket.prototype);Socket.prototype.subEvents=function(){if(this.subs)return;var io=this.io;this.subs=[on(io,"open",bind(this,"onopen")),on(io,"packet",bind(this,"onpacket")),on(io,"close",bind(this,"onclose"))]};Socket.prototype.open=Socket.prototype.connect=function(){if(this.connected)return this;this.subEvents();this.io.open();if("open"==this.io.readyState)this.onopen();return this};Socket.prototype.send=function(){var args=toArray(arguments);args.unshift("message");this.emit.apply(this,args);return this};Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev)){emit.apply(this,arguments);return this}var args=toArray(arguments);var parserType=parser.EVENT;if(hasBin(args)){parserType=parser.BINARY_EVENT}var packet={type:parserType,data:args};if("function"==typeof args[args.length-1]){debug("emitting packet with ack id %d",this.ids);this.acks[this.ids]=args.pop();packet.id=this.ids++}if(this.connected){this.packet(packet)}else{this.sendBuffer.push(packet)}return this};Socket.prototype.packet=function(packet){packet.nsp=this.nsp;this.io.packet(packet)};Socket.prototype.onopen=function(){debug("transport is open - connecting");if("/"!=this.nsp){this.packet({type:parser.CONNECT})}};Socket.prototype.onclose=function(reason){debug("close (%s)",reason);this.connected=false;this.disconnected=true;delete this.id;this.emit("disconnect",reason)};Socket.prototype.onpacket=function(packet){if(packet.nsp!=this.nsp)return;switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit("error",packet.data);break}};Socket.prototype.onevent=function(packet){var args=packet.data||[];debug("emitting event %j",args);if(null!=packet.id){debug("attaching ack callback to event");args.push(this.ack(packet.id))}if(this.connected){emit.apply(this,args)}else{this.receiveBuffer.push(args)}};Socket.prototype.ack=function(id){var self=this;var sent=false;return function(){if(sent)return;sent=true;var args=toArray(arguments);debug("sending ack %j",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}};Socket.prototype.onack=function(packet){debug("calling ack %s with %j",packet.id,packet.data);var fn=this.acks[packet.id];fn.apply(this,packet.data);delete this.acks[packet.id]};Socket.prototype.onconnect=function(){this.connected=true;this.disconnected=false;this.emit("connect");this.emitBuffered()};Socket.prototype.emitBuffered=function(){var i;for(i=0;i0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},{}],92:[function(require,module,exports){var slice=[].slice;module.exports=function(obj,fn){if("string"==typeof fn)fn=obj[fn];if("function"!=typeof fn)throw new Error("bind() requires a function");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},{}],93:[function(require,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i=hour)return(ms/hour).toFixed(1)+"h";if(ms>=min)return(ms/min).toFixed(1)+"m";if(ms>=sec)return(ms/sec|0)+"s";return ms+"ms"};debug.enabled=function(name){for(var i=0,len=debug.skips.length;i';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,"\\\n");this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":102,"component-inherit":105}],101:[function(require,module,exports){(function(global){var XMLHttpRequest=require("xmlhttprequest");var Polling=require("./polling");var Emitter=require("component-emitter");var inherit=require("component-inherit");var debug=require("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!=="string"&&data!==undefined;var req=this.request({method:"POST",data:data,isBinary:isBinary});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug("xhr open %s: %s",this.method,this.uri);xhr.open(this.method,this.uri,this.async);if(this.supportsBinary){xhr.responseType="arraybuffer"}if("POST"==this.method){try{if(this.isBinary){xhr.setRequestHeader("Content-type","application/octet-stream")}else{xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}}catch(e){}}if("withCredentials"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug("xhr data %s",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit("error",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if("undefined"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if(contentType==="application/octet-stream"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{data="ok"}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return"undefined"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent("onunload",unloadHandler)}else if(global.addEventListener){global.addEventListener("beforeunload",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":102,"component-emitter":93,"component-inherit":105,debug:106,xmlhttprequest:104}],102:[function(require,module,exports){var Transport=require("../transport");var parseqs=require("parseqs");var parser=require("engine.io-parser");var inherit=require("component-inherit");var debug=require("debug")("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=require("xmlhttprequest");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){if("opening"==self.readyState){self.onOpen()}if("close"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if("closed"!=this.readyState){this.polling=false;this.emit("pollComplete");if("open"==this.readyState){this.poll()}else{debug('ignoring poll - transport state "%s"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug("writing close packet");self.write([{type:"close"}])}if("open"==this.readyState){debug("transport open - closing");close()}else{debug("transport not open - deferring close");this.once("open",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit("drain")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(false!==this.timestampRequests){query[this.timestampParam]=+new Date+"-"+Transport.timestamps++}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80)){port=":"+this.port}if(query.length){query="?"+query}return schema+"://"+this.hostname+port+this.path+query}},{"../transport":98,"component-inherit":105,debug:106,"engine.io-parser":109,parseqs:121,xmlhttprequest:104}],103:[function(require,module,exports){var Transport=require("../transport");var parser=require("engine.io-parser");var parseqs=require("parseqs");var inherit=require("component-inherit");var debug=require("debug")("engine.io-client:websocket");var WebSocket=require("ws");module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name="websocket";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;this.ws=new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}this.ws.binaryType="arraybuffer";this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError("websocket error",e)}};if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;for(var i=0,l=packets.length;i=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff);if(!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if("%%"===match)return;index++;if("%c"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return"object"==typeof console&&"function"==typeof console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){localStorage.removeItem("debug")}else{localStorage.debug=namespaces}}catch(e){}}function load(){var r;try{r=localStorage.debug}catch(e){}return r}exports.enable(load())},{"./debug":107}],107:[function(require,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=require("ms");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if("string"!==typeof args[0]){args=["%o"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match==="%%")return match;index++;var formatter=exports.formatters[format];if("function"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if("function"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||"").split(/[\s,]+/);var len=split.length;for(var i=0;i=d)return Math.round(ms/d)+"d";if(ms>=h)return Math.round(ms/h)+"h";if(ms>=m)return Math.round(ms/m)+"m";if(ms>=s)return Math.round(ms/s)+"s";return ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(ms1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType==="blob"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType==="blob"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary=="function"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback("0:")}function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(""))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength="";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;ibytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i>2];base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+"="}else if(len%3===1){base64=base64.substring(0,base64.length-2)+"=="}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]==="="){bufferLength--;if(base64[base64.length-2]==="="){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],114:[function(require,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var b=new Blob(["hi"]);return b.size==2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;for(var i=0;i=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol="";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString="";while(++index=byteCount){throw Error("Invalid byte index")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error("Invalid byte index")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error("Invalid UTF-8 detected")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:"2.0.0",encode:utf8encode,decode:utf8decode};if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],118:[function(require,module,exports){var global=require("global");try{module.exports="XMLHttpRequest"in global&&"withCredentials"in new global.XMLHttpRequest}catch(err){module.exports=false}},{global:119}],119:[function(require,module,exports){module.exports=function(){return this}()},{}],120:[function(require,module,exports){(function(global){var rvalidchars=/^[\],:{}\s]*$/;var rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g;var rtrimLeft=/^\s+/;var rtrimRight=/\s+$/;module.exports=function parsejson(data){if("string"!=typeof data||!data){return null}data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],121:[function(require,module,exports){exports.encode=function(obj){var str="";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+="&";str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split("&");for(var i=0,l=pairs.length;i1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty={}.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}var PrimitiveTypes={"boolean":1,number:1,string:1,undefined:1};var isHostType=function(object,property){var type=typeof object[property];return type=="object"?!!object[property]:!PrimitiveTypes[type]};forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!="function"&&isHostType(object,"hasOwnProperty")?object.hasOwnProperty:isProperty;for(property in object){if(!(isFunction&&property=="prototype")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property=="prototype")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property=="prototype")&&isProperty.call(object,property)&&!(isConstructor=property==="constructor")){callback(property)}}if(isConstructor||isProperty.call(object,property="constructor")){callback(property)}}}return forEach(object,callback)};if(!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var leadingZeroes="000000";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix="\\u00";var quote=function(value){var result='"',index=0,length=value.length,isLarge=length>10&&charIndexBuggy,symbols;if(isLarge){symbols=value.split("")}for(;index-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else{value=null}}else if(typeof value.toJSON=="function"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return"null"}className=getClass.call(value);if(className==booleanClass){return""+value}else if(className==numberClass){return value>-1/0&&value<1/0?""+value:"null"}else if(className==stringClass){return quote(""+value)}if(typeof value=="object"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index0){for(whitespace="",width>10&&(width=10);whitespace.length=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)=="true"){Index+=4;return true}else if(source.slice(Index,Index+5)=="false"){Index+=5;return false}else if(source.slice(Index,Index+4)=="null"){Index+=4;return null}abort()}}return"$"};var get=function(value){var results,hasMembers;if(value=="$"){abort()}if(typeof value=="string"){if((charIndexBuggy?value.charAt(0):value[0])=="@"){return value.slice(1)}if(value=="["){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="]"){break}if(hasMembers){if(value==","){value=lex();if(value=="]"){abort()}}else{abort()}}if(value==","){abort()}results.push(get(value))}return results}else if(value=="{"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="}"){break}if(hasMembers){if(value==","){value=lex();if(value=="}"){abort()}}else{abort()}}if(value==","||typeof value!="string"||(charIndexBuggy?value.charAt(0):value[0])!="@"||lex()!=":"){abort()}results[value.slice(1)]=get(lex())}return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value=="object"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};JSON3.parse=function(source,callback){var result,value;Index=0;Source=""+source;result=get(lex());if(lex()!="$"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}if(isLoader){define(function(){return JSON3})}})(this)},{}],134:[function(require,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i