| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | /* global APP, require */
/* jshint -W101 */
import EventEmitter from "events";
import CQEvents from "../../service/connectionquality/CQEvents";
const eventEmitter = new EventEmitter();
/**
 * local stats
 * @type {{}}
 */
var stats = {};
/**
 * remote stats
 * @type {{}}
 */
var remoteStats = {};
/**
 * Converts statistics to format used by VideoLayout
 * @param stats
 * @returns {{bitrate: {download: *, upload: *}, packetLoss: {total: *, download: *, upload: *}}}
 */
function parseMUCStats(stats) {
    if(!stats || !stats.children || !stats.children.length)
        return null;
    var children = stats.children;
    var extractedStats = {};
    children.forEach((child) => {
        if(child.tagName !== "stat" || !child.attributes)
            return;
        var attrKeys = Object.keys(child.attributes);
        if(!attrKeys || !attrKeys.length)
            return;
        attrKeys.forEach((attr) => {
            extractedStats[attr] = child.attributes[attr];
        });
    });
    return {
        bitrate: {
            download: extractedStats.bitrate_download,
            upload: extractedStats.bitrate_upload
        },
        packetLoss: {
            total: extractedStats.packetLoss_total,
            download: extractedStats.packetLoss_download,
            upload: extractedStats.packetLoss_upload
        }
    };
}
export default {
    /**
     * Updates the local statistics
     * @param data new statistics
     */
    updateLocalStats: function (data) {
        stats = data;
        eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, 100 - stats.packetLoss.total, stats);
    },
    /**
     * Updates remote statistics
     * @param id the id associated with the statistics
     * @param data the statistics
     */
    updateRemoteStats: function (id, data) {
        data = parseMUCStats(data);
        if (!data || !data.packetLoss || !data.packetLoss.total) {
            eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED, id, null, null);
            return;
        }
        remoteStats[id] = data;
        eventEmitter.emit(
            CQEvents.REMOTESTATS_UPDATED, id, 100 - data.packetLoss_total, remoteStats[id]
        );
    },
    /**
     * Returns the local statistics.
     */
    getStats: function () {
        return stats;
    },
    addListener: function (type, listener) {
        eventEmitter.on(type, listener);
    },
    /**
     * Converts statistics to format for sending through XMPP
     * @param stats the statistics
     * @returns [{tagName: "stat", attributes: {{bitrate_donwload: *}},
     * {tagName: "stat", attributes: {{ bitrate_uplpoad: *}},
     * {tagName: "stat", attributes: {{ packetLoss_total: *}},
     * {tagName: "stat", attributes: {{ packetLoss_download: *}},
     * {tagName: "stat", attributes: {{ packetLoss_upload: *}}]
     */
    convertToMUCStats: function (stats) {
        return [
            {tagName: "stat", attributes: {"bitrate_download": stats.bitrate.download}},
            {tagName: "stat", attributes: {"bitrate_upload": stats.bitrate.upload}},
            {tagName: "stat", attributes: {"packetLoss_total": stats.packetLoss.total}},
            {tagName: "stat", attributes: {"packetLoss_download": stats.packetLoss.download}},
            {tagName: "stat", attributes: {"packetLoss_upload": stats.packetLoss.upload}}
        ];
    }
};
 |