From 0959b3d5b832342955fad676a6bbe94a2f229c47 Mon Sep 17 00:00:00 2001 From: George Politis Date: Fri, 15 May 2015 15:43:56 +0200 Subject: [PATCH] Updates app.bundle.js --- index.html | 2 +- libs/app.bundle.js | 732 ++++++++++++++++++++++++++------------------- 2 files changed, 421 insertions(+), 313 deletions(-) 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