| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | /* 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 = {};
/**
 * Quality percent( 100% - good, 0% - bad.) for the local user.
 */
var localConnectionQuality = 100;
/**
 * Quality percent( 100% - good, 0% - bad.) stored per id.
 */
var remoteConnectionQuality = {};
/**
 * Calculates the quality percent based on passed new and old value.
 * @param newVal the new value
 * @param oldVal the old value
 */
function calculateQuality(newVal, oldVal) {
    return (newVal <= oldVal) ? newVal : (9*oldVal + newVal) / 10;
}
export default {
    /**
     * Updates the local statistics
     * @param data new statistics
     * @param dontUpdateLocalConnectionQuality {boolean} if true -
     * localConnectionQuality wont be recalculated.
     */
    updateLocalStats: function (data, dontUpdateLocalConnectionQuality) {
        stats = data;
        if(!dontUpdateLocalConnectionQuality) {
            var newVal = 100 - stats.packetLoss.total;
            localConnectionQuality =
                calculateQuality(newVal, localConnectionQuality);
        }
        eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, localConnectionQuality,
            stats);
    },
    /**
     * Updates only the localConnectionQuality value
     * @param values {int} the new value. should be from 0 - 100.
     */
    updateLocalConnectionQuality: function (value) {
        localConnectionQuality = value;
        eventEmitter.emit(CQEvents.LOCALSTATS_UPDATED, localConnectionQuality,
            stats);
    },
    /**
     * Updates remote statistics
     * @param id the id associated with the statistics
     * @param data the statistics
     */
    updateRemoteStats: function (id, data) {
        if (!data || !("packetLoss" in data) || !("total" in data.packetLoss)) {
            eventEmitter.emit(CQEvents.REMOTESTATS_UPDATED, id, null, null);
            return;
        }
        // Use only the fields we need
        data = {bitrate: data.bitrate, packetLoss: data.packetLoss};
        remoteStats[id] = data;
        var newVal = 100 - data.packetLoss.total;
        var oldVal = remoteConnectionQuality[id];
        remoteConnectionQuality[id] = calculateQuality(newVal, oldVal || 100);
        eventEmitter.emit(
            CQEvents.REMOTESTATS_UPDATED, id, remoteConnectionQuality[id],
            remoteStats[id]);
    },
    /**
     * Returns the local statistics.
     */
    getStats: function () {
        return stats;
    },
    addListener: function (type, listener) {
        eventEmitter.on(type, listener);
    }
};
 |