const logger = require('jitsi-meet-logger').getLogger(__filename); const Statistics = require('../statistics/statistics'); /** * The constant for the name of the focus component. * @type {string} */ ComponentsVersions.FOCUS_COMPONENT = 'focus'; /** * The constant for the name of the videobridge component. * @type {string} */ ComponentsVersions.VIDEOBRIDGE_COMPONENT = 'videobridge'; /** * The constant for the name of the XMPP server component. * @type {string} */ ComponentsVersions.XMPP_SERVER_COMPONENT = 'xmpp'; /** * Creates new instance of ComponentsVersions which will be discovering * the versions of conferencing system components in given * JitsiConference. * @param conference JitsiConference instance which will be used to * listen for focus presence updates. * @constructor */ function ComponentsVersions(conference) { this.versions = {}; this.conference = conference; this.conference.addCommandListener( 'versions', this.processPresence.bind(this)); } ComponentsVersions.prototype.processPresence = function(node, mucResource, mucJid) { if (node.attributes.xmlns !== 'http://jitsi.org/jitmeet') { logger.warn('Ignored presence versions node - invalid xmlns', node); return; } if (!this.conference._isFocus(mucJid)) { logger.warn( 'Received versions not from the focus user: ' + node, mucJid); return; } const log = []; node.children.forEach(function(item) { const componentName = item.attributes.name; if (componentName !== ComponentsVersions.FOCUS_COMPONENT && componentName !== ComponentsVersions.XMPP_SERVER_COMPONENT && componentName !== ComponentsVersions.VIDEOBRIDGE_COMPONENT) { logger.warn( 'Received version for not supported component name: ' + componentName); return; } const version = item.value; if (this.versions[componentName] !== version) { this.versions[componentName] = version; logger.info('Got ' + componentName + ' version: ' + version); log.push({ id: 'component_version', component: componentName, version}); } }.bind(this)); // logs versions to stats if (log.length > 0) { Statistics.sendLog(JSON.stringify(log)); } }; /** * Obtains the version of conferencing system component. * @param componentName the name of the component for which we want to obtain * the version. * @returns {String} which describes the version of the component identified by * given componentName or undefined if not found. */ ComponentsVersions.prototype.getComponentVersion = function(componentName) { return this.versions[componentName]; }; module.exports = ComponentsVersions;