diff --git a/index.html b/index.html
index 5268e5476..1ac63ca17 100644
--- a/index.html
+++ b/index.html
@@ -19,7 +19,7 @@
-
+
diff --git a/libs/app.bundle.js b/libs/app.bundle.js
index 49d27b049..cbab99770 100644
--- a/libs/app.bundle.js
+++ b/libs/app.bundle.js
@@ -1,63 +1,4 @@
(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.APP = 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;o 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
if (!draining) {
setTimeout(drainQueue, 0);
}
};
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
process.title = 'browser';
process.browser = true;
process.env = {};
@@ -19019,7 +19034,7 @@ process.chdir = function (dir) {
};
process.umask = function() { return 0; };
-},{}],66:[function(require,module,exports){
+},{}],65:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -19322,7 +19337,7 @@ function isUndefined(arg) {
return arg === void 0;
}
-},{}],67:[function(require,module,exports){
+},{}],66:[function(require,module,exports){
// i18next, v1.7.7
// Copyright (c)2014 Jan Mühlemann (jamuhl).
// Distributed under MIT license
@@ -21445,7 +21460,7 @@ function isUndefined(arg) {
i18n.options = o;
})();
-},{"jquery":"jquery"}],68:[function(require,module,exports){
+},{"jquery":"jquery"}],67:[function(require,module,exports){
// Top level file is just a mixin of submodules & constants
'use strict';
@@ -21460,7 +21475,7 @@ var pako = {};
assign(pako, deflate, inflate, constants);
module.exports = pako;
-},{"./lib/deflate":69,"./lib/inflate":70,"./lib/utils/common":71,"./lib/zlib/constants":74}],69:[function(require,module,exports){
+},{"./lib/deflate":68,"./lib/inflate":69,"./lib/utils/common":70,"./lib/zlib/constants":73}],68:[function(require,module,exports){
'use strict';
@@ -21825,7 +21840,7 @@ exports.Deflate = Deflate;
exports.deflate = deflate;
exports.deflateRaw = deflateRaw;
exports.gzip = gzip;
-},{"./utils/common":71,"./utils/strings":72,"./zlib/deflate.js":76,"./zlib/messages":81,"./zlib/zstream":83}],70:[function(require,module,exports){
+},{"./utils/common":70,"./utils/strings":71,"./zlib/deflate.js":75,"./zlib/messages":80,"./zlib/zstream":82}],69:[function(require,module,exports){
'use strict';
@@ -22194,7 +22209,7 @@ exports.inflate = inflate;
exports.inflateRaw = inflateRaw;
exports.ungzip = inflate;
-},{"./utils/common":71,"./utils/strings":72,"./zlib/constants":74,"./zlib/gzheader":77,"./zlib/inflate.js":79,"./zlib/messages":81,"./zlib/zstream":83}],71:[function(require,module,exports){
+},{"./utils/common":70,"./utils/strings":71,"./zlib/constants":73,"./zlib/gzheader":76,"./zlib/inflate.js":78,"./zlib/messages":80,"./zlib/zstream":82}],70:[function(require,module,exports){
'use strict';
@@ -22297,7 +22312,7 @@ exports.setTyped = function (on) {
};
exports.setTyped(TYPED_OK);
-},{}],72:[function(require,module,exports){
+},{}],71:[function(require,module,exports){
// String encode/decode helpers
'use strict';
@@ -22484,7 +22499,7 @@ exports.utf8border = function(buf, max) {
return (pos + _utf8len[buf[pos]] > max) ? pos : max;
};
-},{"./common":71}],73:[function(require,module,exports){
+},{"./common":70}],72:[function(require,module,exports){
'use strict';
// Note: adler32 takes 12% for level 0 and 2% for level 6.
@@ -22517,7 +22532,7 @@ function adler32(adler, buf, len, pos) {
module.exports = adler32;
-},{}],74:[function(require,module,exports){
+},{}],73:[function(require,module,exports){
module.exports = {
/* Allowed flush values; see deflate() and inflate() below for details */
@@ -22565,7 +22580,7 @@ module.exports = {
Z_DEFLATED: 8
//Z_NULL: null // Use -1 or null inline, depending on var type
};
-},{}],75:[function(require,module,exports){
+},{}],74:[function(require,module,exports){
'use strict';
// Note: we can't get significant speed boost here.
@@ -22607,7 +22622,7 @@ function crc32(crc, buf, len, pos) {
module.exports = crc32;
-},{}],76:[function(require,module,exports){
+},{}],75:[function(require,module,exports){
'use strict';
var utils = require('../utils/common');
@@ -24373,7 +24388,7 @@ exports.deflatePending = deflatePending;
exports.deflatePrime = deflatePrime;
exports.deflateTune = deflateTune;
*/
-},{"../utils/common":71,"./adler32":73,"./crc32":75,"./messages":81,"./trees":82}],77:[function(require,module,exports){
+},{"../utils/common":70,"./adler32":72,"./crc32":74,"./messages":80,"./trees":81}],76:[function(require,module,exports){
'use strict';
@@ -24414,7 +24429,7 @@ function GZheader() {
}
module.exports = GZheader;
-},{}],78:[function(require,module,exports){
+},{}],77:[function(require,module,exports){
'use strict';
// See state defs from inflate.js
@@ -24741,7 +24756,7 @@ module.exports = function inflate_fast(strm, start) {
return;
};
-},{}],79:[function(require,module,exports){
+},{}],78:[function(require,module,exports){
'use strict';
@@ -26245,7 +26260,7 @@ exports.inflateSync = inflateSync;
exports.inflateSyncPoint = inflateSyncPoint;
exports.inflateUndermine = inflateUndermine;
*/
-},{"../utils/common":71,"./adler32":73,"./crc32":75,"./inffast":78,"./inftrees":80}],80:[function(require,module,exports){
+},{"../utils/common":70,"./adler32":72,"./crc32":74,"./inffast":77,"./inftrees":79}],79:[function(require,module,exports){
'use strict';
@@ -26572,7 +26587,7 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta
return 0;
};
-},{"../utils/common":71}],81:[function(require,module,exports){
+},{"../utils/common":70}],80:[function(require,module,exports){
'use strict';
module.exports = {
@@ -26586,7 +26601,7 @@ module.exports = {
'-5': 'buffer error', /* Z_BUF_ERROR (-5) */
'-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */
};
-},{}],82:[function(require,module,exports){
+},{}],81:[function(require,module,exports){
'use strict';
@@ -27786,7 +27801,7 @@ exports._tr_stored_block = _tr_stored_block;
exports._tr_flush_block = _tr_flush_block;
exports._tr_tally = _tr_tally;
exports._tr_align = _tr_align;
-},{"../utils/common":71}],83:[function(require,module,exports){
+},{"../utils/common":70}],82:[function(require,module,exports){
'use strict';
@@ -27816,9 +27831,9 @@ function ZStream() {
}
module.exports = ZStream;
-},{}],84:[function(require,module,exports){
+},{}],83:[function(require,module,exports){
module.exports = require('./lib/retry');
-},{"./lib/retry":85}],85:[function(require,module,exports){
+},{"./lib/retry":84}],84:[function(require,module,exports){
var RetryOperation = require('./retry_operation');
exports.operation = function(options) {
@@ -27869,7 +27884,7 @@ exports._createTimeout = function(attempt, opts) {
return timeout;
};
-},{"./retry_operation":86}],86:[function(require,module,exports){
+},{"./retry_operation":85}],85:[function(require,module,exports){
function RetryOperation(timeouts) {
this._timeouts = timeouts;
this._fn = null;
@@ -27979,7 +27994,7 @@ RetryOperation.prototype.mainError = function() {
return mainError;
};
-},{}],87:[function(require,module,exports){
+},{}],86:[function(require,module,exports){
module.exports = function arrayEquals(array) {
// if the other array is a falsy value, return
if (!array)
@@ -28005,27 +28020,30 @@ module.exports = function arrayEquals(array) {
}
-},{}],88:[function(require,module,exports){
+},{}],87:[function(require,module,exports){
exports.Interop = require('./interop');
-},{"./interop":89}],89:[function(require,module,exports){
+},{"./interop":88}],88:[function(require,module,exports){
var transform = require('./transform');
var arrayEquals = require('./array-equals');
-function Interop() { }
+function Interop() {
+
+ /**
+ * This map holds the most recent Unified Plan offer/answer SDP that was
+ * converted to Plan B, with the SDP type ('offer' or 'answer') as keys and
+ * the SDP string as values.
+ *
+ * @type {{}}
+ */
+ this.cache = {};
+}
+
module.exports = Interop;
-/**
- * This map holds the most recent Plan A offer/answer SDP that was converted
- * to Plan B, with the SDP type ('offer' or 'answer') as keys and the SDP
- * string as values.
- *
- * @type {{}}
- */
-var cache = {};
/**
- * This method transforms a Plan A SDP to an equivalent Plan B SDP. A
+ * This method transforms a Unified Plan SDP to an equivalent Plan B SDP. A
* PeerConnection wrapper transforms the SDP to Plan B before passing it to the
* application.
*
@@ -28052,22 +28070,22 @@ Interop.prototype.toPlanB = function(desc) {
return desc;
}
- // Try some heuristics to "make sure" this is a Plan A SDP. Plan B SDP has
- // a video, an audio and a data "channel" at most.
+ // Try some heuristics to "make sure" this is a Unified Plan SDP. Plan B
+ // SDP has a video, an audio and a data "channel" at most.
if (session.media.length <= 3 && session.media.every(function(m) {
return ['video', 'audio', 'data'].indexOf(m.mid) !== -1;
})) {
- console.warn('This description does not look like Plan A.');
+ console.warn('This description does not look like Unified Plan.');
return desc;
}
//#endregion
- // Plan A SDP is our "precious". Cache it for later use in the Plan B ->
- // Plan A transformation.
- cache[desc.type] = desc.sdp;
+ // Unified Plan SDP is our "precious". Cache it for later use in the Plan B
+ // -> Unified Plan transformation.
+ this.cache[desc.type] = desc.sdp;
- //#region Convert from Plan A to Plan B.
+ //#region Convert from Unified Plan to Plan B.
// We rebuild the session.media array.
var media = session.media;
@@ -28082,7 +28100,7 @@ Interop.prototype.toPlanB = function(desc) {
// loop.
var types = [];
- // Implode the Plan A m-lines/tracks into Plan B "channels".
+ // Implode the Unified Plan m-lines/tracks into Plan B "channels".
media.forEach(function(mLine) {
// rtcp-mux is required in the Plan B SDP.
@@ -28101,13 +28119,20 @@ Interop.prototype.toPlanB = function(desc) {
// Add sources to the channel and handle a=msid.
if (typeof mLine.sources === 'object') {
Object.keys(mLine.sources).forEach(function(ssrc) {
+ if (typeof channels[mLine.type].sources !== 'object')
+ channels[mLine.type].sources = {};
+
// Assign the sources to the channel.
channels[mLine.type].sources[ssrc] = mLine.sources[ssrc];
- // In Plan B the msid is an SSRC attribute. Also, we don't care
- // about the obsolete label and mslabel attributes.
- channels[mLine.type].sources[ssrc].msid = mLine.msid;
-
+ if (typeof mLine.msid !== 'undefined') {
+ // In Plan B the msid is an SSRC attribute. Also, we don't
+ // care about the obsolete label and mslabel attributes.
+ //
+ // Note that it is not guaranteed that the mLine will have
+ // an msid. recvonly channels in particular don't have one.
+ channels[mLine.type].sources[ssrc].msid = mLine.msid;
+ }
// NOTE ssrcs in ssrc groups will share msids, as
// draft-uberti-rtcweb-plan-00 mandates.
});
@@ -28151,11 +28176,9 @@ Interop.prototype.toPlanB = function(desc) {
});
// We regenerate the BUNDLE group with the new mids.
- session.groups.every(function(group) {
+ session.groups.some(function(group) {
if (group.type === 'BUNDLE') {
group.mids = types.join(' ');
- return false;
- } else {
return true;
}
});
@@ -28177,13 +28200,14 @@ Interop.prototype.toPlanB = function(desc) {
};
/**
- * This method transforms a Plan B SDP to an equivalent Plan A SDP. A
- * PeerConnection wrapper transforms the SDP to Plan A before passing it to FF.
+ * This method transforms a Plan B SDP to an equivalent Unified Plan SDP. A
+ * PeerConnection wrapper transforms the SDP to Unified Plan before passing it
+ * to FF.
*
* @param desc
* @returns {*}
*/
-Interop.prototype.toPlanA = function(desc) {
+Interop.prototype.toUnifiedPlan = function(desc) {
//#region Preliminary input validation.
@@ -28211,7 +28235,7 @@ Interop.prototype.toPlanA = function(desc) {
return desc;
}
- // Make sure this Plan B SDP can be converted to a Plan A SDP.
+ // Make sure this Plan B SDP can be converted to a Unified Plan SDP.
var mids = [];
session.media.forEach(function(m) {
mids.push(m.mid);
@@ -28227,47 +28251,47 @@ Interop.prototype.toPlanA = function(desc) {
}
if (!hasBundle) {
- throw new Error("Cannot convert to Plan A because m-lines that are " +
- "not bundled were found.");
+ throw new Error("Cannot convert to Unified Plan because m-lines that" +
+ " are not bundled were found.");
}
//#endregion
- //#region Convert from Plan B to Plan A.
+ //#region Convert from Plan B to Unified Plan.
// Unfortunately, a Plan B offer/answer doesn't have enough information to
- // rebuild an equivalent Plan A offer/answer.
+ // rebuild an equivalent Unified Plan offer/answer.
//
- // For example, if this is a local answer (in Plan A style) that we convert
- // to Plan B prior to handing it over to the application (the
+ // For example, if this is a local answer (in Unified Plan style) that we
+ // convert to Plan B prior to handing it over to the application (the
// PeerConnection wrapper called us, for instance, after a successful
// createAnswer), we want to remember the m-line at which we've seen the
// (local) SSRC. That's because when the application wants to do call the
// SLD method, forcing us to do the inverse transformation (from Plan B to
- // Plan A), we need to know to which m-line to assign the (local) SSRC. We
- // also need to know all the other m-lines that the original answer had and
- // include them in the transformed answer as well.
+ // Unified Plan), we need to know to which m-line to assign the (local)
+ // SSRC. We also need to know all the other m-lines that the original
+ // answer had and include them in the transformed answer as well.
//
// Another example is if this is a remote offer that we convert to Plan B
// prior to giving it to the application, we want to remember the mid at
// which we've seen the (remote) SSRC.
//
- // In the iteration that follows, we use the cached Plan A (if it exists)
- // to assign mids to ssrcs.
+ // In the iteration that follows, we use the cached Unified Plan (if it
+ // exists) to assign mids to ssrcs.
var cached;
- if (typeof cache[desc.type] !== 'undefined') {
- cached = transform.parse(cache[desc.type]);
+ if (typeof this.cache[desc.type] !== 'undefined') {
+ cached = transform.parse(this.cache[desc.type]);
}
// A helper map that sends mids to m-line objects. We use it later to
- // rebuild the Plan A style session.media array.
+ // rebuild the Unified Plan style session.media array.
var media = {};
session.media.forEach(function(channel) {
if (typeof channel.rtcpMux !== 'string' ||
channel.rtcpMux !== 'rtcp-mux') {
- throw new Error("Cannot convert to Plan A because m-lines " +
+ throw new Error("Cannot convert to Unified Plan because m-lines " +
"without the rtcp-mux attribute were found.");
}
@@ -28327,14 +28351,12 @@ Interop.prototype.toPlanA = function(desc) {
var mLine;
if (typeof invertedGroups[ssrc] !== 'undefined' &&
Array.isArray(invertedGroups[ssrc])) {
- invertedGroups[ssrc].every(function (ssrcGroup) {
+ invertedGroups[ssrc].some(function (ssrcGroup) {
// ssrcGroup.ssrcs *is* an Array, no need to check
// again here.
- return ssrcGroup.ssrcs.every(function (related) {
+ return ssrcGroup.ssrcs.some(function (related) {
if (typeof mLines[related] === 'object') {
mLine = mLines[related];
- return false;
- } else {
return true;
}
});
@@ -28346,65 +28368,72 @@ Interop.prototype.toPlanA = function(desc) {
mLine.sources[ssrc] = sources[ssrc];
delete sources[ssrc].msid;
} else {
- // Use the "channel" as a prototype for the "mLine".
- mLine = Object.create(channel);
- mLines[ssrc] = mLine;
+ // Use the "channel" as a prototype for the "mLine".
+ mLine = Object.create(channel);
+ mLines[ssrc] = mLine;
- // Assign the msid of the source to the m-line.
- mLine.msid = sources[ssrc].msid;
- delete sources[ssrc].msid;
-
- // We assign one SSRC per media line.
- mLine.sources = {};
- mLine.sources[ssrc] = sources[ssrc];
- mLine.ssrcGroups = invertedGroups[ssrc];
-
- // Use the cached Plan A SDP (if it exists) to assign SSRCs to
- // mids.
- if (typeof cached !== 'undefined' &&
- typeof cached.media !== 'undefined' &&
- Array.isArray(cached.media)) {
-
- cached.media.forEach(function(m) {
- if (typeof m.sources === 'object') {
- Object.keys(m.sources).forEach(function(s) {
- if (s === ssrc) {
- mLine.mid = m.mid;
- }
- });
- }
- });
- }
-
- if (typeof mLine.mid === 'undefined') {
-
- // If this is an SSRC that we see for the first time assign
- // it a new mid. This is typically the case when this
- // method is called to transform a remote description for
- // the first time or when there is a new SSRC in the remote
- // description because a new peer has joined the
- // conference. Local SSRCs should have already been added
- // to the map in the toPlanB method.
- //
- // Because FF generates answers in Plan A style, we MUST
- // already have a cached answer with all the local SSRCs
- // mapped to some mLine/mid.
-
- if (desc.type === 'answer') {
- throw new Error("An unmapped SSRC was found.");
+ if (typeof sources[ssrc].msid !== 'undefined') {
+ // Assign the msid of the source to the m-line. Note
+ // that it is not guaranteed that the source will have
+ // msid. In particular "recvonly" sources don't have an
+ // msid. Note that "recvonly" is a term only defined
+ // for m-lines.
+ mLine.msid = sources[ssrc].msid;
+ delete sources[ssrc].msid;
}
- mLine.mid = [channel.type, '-', ssrc].join('');
- }
+ // We assign one SSRC per media line.
+ mLine.sources = {};
+ mLine.sources[ssrc] = sources[ssrc];
+ mLine.ssrcGroups = invertedGroups[ssrc];
- // Include the candidates in the 1st media line.
- mLine.candidates = candidates;
- mLine.iceUfrag = iceUfrag;
- mLine.icePwd = icePwd;
- mLine.fingerprint = fingerprint;
- mLine.port = port;
+ // Use the cached Unified Plan SDP (if it exists) to assign
+ // SSRCs to mids.
+ if (typeof cached !== 'undefined' &&
+ typeof cached.media !== 'undefined' &&
+ Array.isArray(cached.media)) {
- media[mLine.mid] = mLine;
+ cached.media.forEach(function(m) {
+ if (typeof m.sources === 'object') {
+ Object.keys(m.sources).forEach(function(s) {
+ if (s === ssrc) {
+ mLine.mid = m.mid;
+ }
+ });
+ }
+ });
+ }
+
+ if (typeof mLine.mid === 'undefined') {
+
+ // If this is an SSRC that we see for the first time
+ // assign it a new mid. This is typically the case when
+ // this method is called to transform a remote
+ // description for the first time or when there is a
+ // new SSRC in the remote description because a new
+ // peer has joined the conference. Local SSRCs should
+ // have already been added to the map in the toPlanB
+ // method.
+ //
+ // Because FF generates answers in Unified Plan style,
+ // we MUST already have a cached answer with all the
+ // local SSRCs mapped to some mLine/mid.
+
+ if (desc.type === 'answer') {
+ throw new Error("An unmapped SSRC was found.");
+ }
+
+ mLine.mid = [channel.type, '-', ssrc].join('');
+ }
+
+ // Include the candidates in the 1st media line.
+ mLine.candidates = candidates;
+ mLine.iceUfrag = iceUfrag;
+ mLine.icePwd = icePwd;
+ mLine.fingerprint = fingerprint;
+ mLine.port = port;
+
+ media[mLine.mid] = mLine;
}
});
}
@@ -28422,12 +28451,12 @@ Interop.prototype.toPlanA = function(desc) {
// find the m-lines that are missing (from the converted answer), and
// use the cached answer to complete the converted answer.
- if (typeof cache['offer'] === 'undefined') {
+ if (typeof this.cache['offer'] === 'undefined') {
throw new Error("An answer is being processed but we couldn't " +
"find a cached offer.");
}
- var cachedOffer = transform.parse(cache['offer']);
+ var cachedOffer = transform.parse(this.cache['offer']);
if (typeof cachedOffer === 'undefined' ||
typeof cachedOffer.media === 'undefined' ||
@@ -28439,23 +28468,40 @@ Interop.prototype.toPlanA = function(desc) {
cachedOffer.media.forEach(function(mo) {
var mLine;
- if (typeof media[mo.mid] === 'undefined') {
+ cached.media.some(function(ma) {
+ if (mo.mid == ma.mid) {
+ if (typeof media[mo.mid] === 'undefined') {
- // This is probably an m-line containing a remote track only.
- // It MUST exist in the cached answer as a remote track only
- // mLine.
+ // This is either an m-line containing a remote
+ // track only, or an m-line containing a remote
+ // track and a local track that has been removed.
+ // In either case, it MUST exist in the cached
+ // answer.
+ //
+ // In case this is a removed local track, clean-up
+ // the m-line and make sure it's 'recvonly'.
- cached.media.every(function(ma) {
- if (mo.mid == ma.mid) {
- mLine = ma;
- return false;
+ // TODO sendonly -> inactive makes more sense.
+ delete ma.msid;
+ delete ma.sources;
+ delete ma.ssrcGroups;
+ if (!ma.direction
+ || ma.direction === 'sendonly'
+ || ma.direction === 'sendrecv')
+ ma.direction = 'recvonly';
} else {
- return true;
+ // This is an m-line/channel that contains a local
+ // track (sendrecv or sendonly channel) or it's a
+ // recvonly m-line/channel. In either case, since we're
+ // going from PlanB -> Unified Plan this m-line MUST
+ // exist in the cached answer.
}
- });
- } else {
- mLine = media[mo.mid];
- }
+
+ // assign the found object.
+ mLine = ma;
+ return true;
+ }
+ });
if (typeof mLine === 'undefined') {
throw new Error("The cached offer contains an m-line that " +
@@ -28503,11 +28549,9 @@ Interop.prototype.toPlanA = function(desc) {
}
// We regenerate the BUNDLE group (since we regenerated the mids)
- session.groups.every(function(group) {
+ session.groups.some(function(group) {
if (group.type === 'BUNDLE') {
group.mids = mids.join(' ');
- return false;
- } else {
return true;
}
});
@@ -28520,8 +28564,9 @@ Interop.prototype.toPlanA = function(desc) {
var resStr = transform.write(session);
- // Cache the transformed SDP (Plan A) for later re-use in this function.
- cache[desc.type] = resStr;
+ // Cache the transformed SDP (Unified Plan) for later re-use in this
+ // function.
+ this.cache[desc.type] = resStr;
return new RTCSessionDescription({
type: desc.type,
@@ -28531,7 +28576,7 @@ Interop.prototype.toPlanA = function(desc) {
//#endregion
};
-},{"./array-equals":87,"./transform":90}],90:[function(require,module,exports){
+},{"./array-equals":86,"./transform":89}],89:[function(require,module,exports){
var transform = require('sdp-transform');
exports.write = function(session, opts) {
@@ -28630,7 +28675,7 @@ exports.parse = function(sdp) {
};
-},{"sdp-transform":92}],91:[function(require,module,exports){
+},{"sdp-transform":91}],90:[function(require,module,exports){
var grammar = module.exports = {
v: [{
name: 'version',
@@ -28855,6 +28900,10 @@ var grammar = module.exports = {
name: 'rtcpMux',
reg: /^(rtcp-mux)/
},
+ { //a=rtcp-rsize
+ name: 'rtcpRsize',
+ reg: /^(rtcp-rsize)/
+ },
{ // any a= that we don't understand is kepts verbatim on media.invalid
push: 'invalid',
names: ["value"]
@@ -28875,7 +28924,7 @@ Object.keys(grammar).forEach(function (key) {
});
});
-},{}],92:[function(require,module,exports){
+},{}],91:[function(require,module,exports){
var parser = require('./parser');
var writer = require('./writer');
@@ -28885,7 +28934,7 @@ exports.parseFmtpConfig = parser.parseFmtpConfig;
exports.parsePayloads = parser.parsePayloads;
exports.parseRemoteCandidates = parser.parseRemoteCandidates;
-},{"./parser":93,"./writer":94}],93:[function(require,module,exports){
+},{"./parser":92,"./writer":93}],92:[function(require,module,exports){
var toIntIfInt = function (v) {
return String(Number(v)) === v ? Number(v) : v;
};
@@ -28980,7 +29029,7 @@ exports.parseRemoteCandidates = function (str) {
return candidates;
};
-},{"./grammar":91}],94:[function(require,module,exports){
+},{"./grammar":90}],93:[function(require,module,exports){
var grammar = require('./grammar');
// customized util.format - discards excess arguments and can void middle ones
@@ -29096,14 +29145,14 @@ module.exports = function (session, opts) {
return sdp.join('\r\n') + '\r\n';
};
-},{"./grammar":91}],95:[function(require,module,exports){
+},{"./grammar":90}],94:[function(require,module,exports){
var MediaStreamType = {
VIDEO_TYPE: "Video",
AUDIO_TYPE: "Audio"
};
module.exports = MediaStreamType;
-},{}],96:[function(require,module,exports){
+},{}],95:[function(require,module,exports){
var RTCBrowserType = {
RTC_BROWSER_CHROME: "rtc_browser.chrome",
@@ -29111,7 +29160,7 @@ var RTCBrowserType = {
};
module.exports = RTCBrowserType;
-},{}],97:[function(require,module,exports){
+},{}],96:[function(require,module,exports){
var RTCEvents = {
LASTN_CHANGED: "rtc.lastn_changed",
DOMINANTSPEAKER_CHANGED: "rtc.dominantspeaker_changed",
@@ -29124,7 +29173,7 @@ var RTCEvents = {
};
module.exports = RTCEvents;
-},{}],98:[function(require,module,exports){
+},{}],97:[function(require,module,exports){
var Resolutions = {
"1080": {
width: 1920,
@@ -29178,7 +29227,7 @@ var Resolutions = {
}
};
module.exports = Resolutions;
-},{}],99:[function(require,module,exports){
+},{}],98:[function(require,module,exports){
var StreamEventTypes = {
EVENT_TYPE_LOCAL_CREATED: "stream.local_created",
@@ -29194,14 +29243,14 @@ var StreamEventTypes = {
};
module.exports = StreamEventTypes;
-},{}],100:[function(require,module,exports){
+},{}],99:[function(require,module,exports){
var UIEvents = {
NICKNAME_CHANGED: "UI.nickname_changed",
SELECTED_ENDPOINT: "UI.selected_endpoint",
PINNED_ENDPOINT: "UI.pinned_endpoint"
};
module.exports = UIEvents;
-},{}],101:[function(require,module,exports){
+},{}],100:[function(require,module,exports){
var AuthenticationEvents = {
/**
* Event callback arguments:
@@ -29215,7 +29264,7 @@ var AuthenticationEvents = {
};
module.exports = AuthenticationEvents;
-},{}],102:[function(require,module,exports){
+},{}],101:[function(require,module,exports){
var CQEvents = {
LOCALSTATS_UPDATED: "cq.localstats_updated",
REMOTESTATS_UPDATED: "cq.remotestats_updated",
@@ -29223,7 +29272,7 @@ var CQEvents = {
};
module.exports = CQEvents;
-},{}],103:[function(require,module,exports){
+},{}],102:[function(require,module,exports){
var DesktopSharingEventTypes = {
INIT: "ds.init",
@@ -29233,14 +29282,14 @@ var DesktopSharingEventTypes = {
};
module.exports = DesktopSharingEventTypes;
-},{}],104:[function(require,module,exports){
+},{}],103:[function(require,module,exports){
var Events = {
DTMF_SUPPORT_CHANGED: "members.dtmf_support_changed"
};
module.exports = Events;
-},{}],105:[function(require,module,exports){
+},{}],104:[function(require,module,exports){
module.exports = {
getLanguages : function () {
var languages = [];
@@ -29256,7 +29305,7 @@ module.exports = {
DE: "de",
TR: "tr"
}
-},{}],106:[function(require,module,exports){
+},{}],105:[function(require,module,exports){
var XMPPEvents = {
CONNECTION_FAILED: "xmpp.connection.failed",
CONFERENCE_CREATED: "xmpp.conferenceCreated.jingle",
@@ -29291,5 +29340,64 @@ var XMPPEvents = {
DEVICE_AVAILABLE: "xmpp.device_available"
};
module.exports = XMPPEvents;
-},{}]},{},[1])(1)
+},{}],106:[function(require,module,exports){
+/* jshint -W117 */
+/* application specific logic */
+
+var APP =
+{
+ init: function () {
+ this.UI = require("./modules/UI/UI");
+ this.API = require("./modules/API/API");
+ this.connectionquality = require("./modules/connectionquality/connectionquality");
+ this.statistics = require("./modules/statistics/statistics");
+ this.RTC = require("./modules/RTC/RTC");
+ this.simulcast = require("./modules/simulcast/simulcast");
+ this.desktopsharing = require("./modules/desktopsharing/desktopsharing");
+ this.xmpp = require("./modules/xmpp/xmpp");
+ this.keyboardshortcut = require("./modules/keyboardshortcut/keyboardshortcut");
+ this.translation = require("./modules/translation/translation");
+ this.settings = require("./modules/settings/Settings");
+ this.DTMF = require("./modules/DTMF/DTMF");
+ this.members = require("./modules/members/MemberList");
+ }
+};
+
+function init() {
+
+ APP.RTC.start();
+ APP.xmpp.start();
+ APP.statistics.start();
+ APP.connectionquality.init();
+
+ // Set default desktop sharing method
+ APP.desktopsharing.init();
+
+ APP.keyboardshortcut.init();
+ APP.members.start();
+}
+
+
+$(document).ready(function () {
+
+ APP.init();
+
+ APP.translation.init();
+
+ if(APP.API.isEnabled())
+ APP.API.init();
+
+ APP.UI.start(init);
+
+});
+
+$(window).bind('beforeunload', function () {
+ if(APP.API.isEnabled())
+ APP.API.dispose();
+});
+
+module.exports = APP;
+
+
+},{"./modules/API/API":1,"./modules/DTMF/DTMF":2,"./modules/RTC/RTC":6,"./modules/UI/UI":8,"./modules/connectionquality/connectionquality":35,"./modules/desktopsharing/desktopsharing":36,"./modules/keyboardshortcut/keyboardshortcut":37,"./modules/members/MemberList":38,"./modules/settings/Settings":39,"./modules/simulcast/simulcast":44,"./modules/statistics/statistics":47,"./modules/translation/translation":48,"./modules/xmpp/xmpp":62}]},{},[106])(106)
});
\ No newline at end of file