// Derived from Chromium WebRTC Internals Dashboard - see Acknowledgements for full license details /** * @param {!Object} statsValues The object containing stats, an * array [key1, val1, key2, val2, ...] so searching a certain * key needs to ensure it does not collide with a value. */ function generateLabel(key, statsValues) { let label = ''; const statIndex = statsValues.findIndex((value, index) => { return value === key && index % 2 === 0; }); if (statIndex !== -1) { label += key + '=' + statsValues[statIndex + 1]; } return label; } /** * Formats the display text used for a stats type that is shown * in the stats table or the stats graph. * * @param {!Object} report The object containing stats, which is the object * containing timestamp and values, which is an array of strings, whose * even index entry is the name of the stat, and the odd index entry is * the value. */ export function generateStatsLabel(report) { let label = report.type + ' ('; let labels = []; if (['outbound-rtp', 'remote-outbound-rtp', 'inbound-rtp', 'remote-inbound-rtp'].includes(report.type) && report.stats.values) { labels = ['kind', 'mid', 'rid', 'ssrc', 'rtxSsrc', 'fecSsrc', 'scalabilityMode', 'encoderImplementation', 'decoderImplementation', 'powerEfficientEncoder', 'powerEfficientDecoder', '[codec]']; } else if (['local-candidate', 'remote-candidate'].includes(report.type)) { labels = ['candidateType', 'tcpType', 'relayProtocol']; } else if (report.type === 'codec') { labels = ['mimeType', 'payloadType']; } else if (['media-playout', 'media-source'].includes(report.type)) { labels = ['kind']; } else if (report.type === 'candidate-pair') { labels = ['state']; } else if (report.type === 'transport') { labels = ['iceState', 'dtlsState']; } labels = labels .map(stat => generateLabel(stat, report.stats.values)) .filter(label => !!label); if (labels.length) { label += labels.join(', ') + ', '; } label += 'id=' + report.id + ')'; return label; }