/* 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}} ]; } };