| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | /* global APP, require */
var EventEmitter = require("events");
var eventEmitter = new EventEmitter();
var CQEvents = require("../../service/connectionquality/CQEvents");
var XMPPEvents = require("../../service/xmpp/XMPPEvents");
/**
 * local stats
 * @type {{}}
 */
var stats = {};
/**
 * remote stats
 * @type {{}}
 */
var remoteStats = {};
/**
 * Interval for sending statistics to other participants
 * @type {null}
 */
var sendIntervalId = null;
/**
 * Start statistics sending.
 */
function startSendingStats() {
    sendStats();
    sendIntervalId = setInterval(sendStats, 10000);
}
/**
 * Sends statistics to other participants
 */
function sendStats() {
    APP.xmpp.addToPresence("connectionQuality", convertToMUCStats(stats));
}
/**
 * Converts statistics to format for sending through XMPP
 * @param stats the statistics
 * @returns {{bitrate_donwload: *, bitrate_uplpoad: *, packetLoss_total: *, packetLoss_download: *, packetLoss_upload: *}}
 */
function convertToMUCStats(stats) {
    return {
        "bitrate_download": stats.bitrate.download,
        "bitrate_upload": stats.bitrate.upload,
        "packetLoss_total": stats.packetLoss.total,
        "packetLoss_download": stats.packetLoss.download,
        "packetLoss_upload": stats.packetLoss.upload
    };
}
/**
 * Converts statistics to format used by VideoLayout
 * @param stats
 * @returns {{bitrate: {download: *, upload: *}, packetLoss: {total: *, download: *, upload: *}}}
 */
function parseMUCStats(stats) {
    return {
        bitrate: {
            download: stats.bitrate_download,
            upload: stats.bitrate_upload
        },
        packetLoss: {
            total: stats.packetLoss_total,
            download: stats.packetLoss_download,
            upload: stats.packetLoss_upload
        }
    };
}
var ConnectionQuality = {
    init: function () {
        APP.xmpp.addListener(XMPPEvents.REMOTE_STATS, this.updateRemoteStats);
        APP.statistics.addConnectionStatsListener(this.updateLocalStats);
        APP.statistics.addRemoteStatsStopListener(this.stopSendingStats);
    },
    /**
     * Updates the local statistics
     * @param data new statistics
     */
    updateLocalStats: function (data) {
        stats = data;
        eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, 100 - stats.packetLoss.total, stats);
        if (sendIntervalId == null) {
            startSendingStats();
        }
    },
    /**
     * Updates remote statistics
     * @param jid the jid associated with the statistics
     * @param data the statistics
     */
    updateRemoteStats: function (jid, data) {
        if (data == null || data.packetLoss_total == null) {
            eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED, jid, null, null);
            return;
        }
        remoteStats[jid] = parseMUCStats(data);
        eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED,
            jid, 100 - data.packetLoss_total, remoteStats[jid]);
    },
    /**
     * Stops statistics sending.
     */
    stopSendingStats: function () {
        clearInterval(sendIntervalId);
        sendIntervalId = null;
        //notify UI about stopping statistics gathering
        eventEmitter.emit(CQEvents.STOP);
    },
    /**
     * Returns the local statistics.
     */
    getStats: function () {
        return stats;
    },
    
    addListener: function (type, listener) {
        eventEmitter.on(type, listener);
    }
};
module.exports = ConnectionQuality;
 |