UNPKG

diameter

Version:
107 lines (94 loc) 3.48 kB
'use strict'; var chalk = require('chalk'); var _ = require('lodash'); exports.random32BitNumber = function() { var max32 = Math.pow(2, 32) - 1; return Math.floor(Math.random() * max32); }; var avpsToString = function(avps, indent) { var indentString = _.repeat(' ', indent); return _.reduce(avps, function(out, avp) { out += indentString + chalk.cyan(avp[0]) + ': '; if (avp[1] instanceof Array) { out += '\n' + avpsToString(avp[1], indent + 2); } else { if (_.isString(avp[1])) { out += '"' + avp[1] + '"'; } else if (Buffer.isBuffer(avp[1])) { out += '0x' + avp[1].toString('hex'); } else { out += avp[1]; } out += '\n'; } return out; }, ''); }; var flagsToString = function(flags) { var messageString = ''; _.each(_.keys(flags), function(key) { if (flags[key]) { messageString += _.startCase(key) + ' [x] '; } else { messageString += chalk.gray(_.startCase(key) + ' [ ] '); } }); return messageString; }; exports.messageToColoredString = function(message) { var messageString = chalk.gray(_.repeat('-', 80)) + '\n'; messageString += chalk.gray('Application: ' + message.header.application) + '\n'; if (message.header.flags.request) { messageString += chalk.yellow(message.command) + '\n'; } else if (!message.header.flags.request && !message.header.flags.error) { messageString += chalk.bold.green(message.command) + '\n'; } else { messageString += chalk.red(message.command) + '\n'; } messageString += flagsToString(message.header.flags); messageString += '\n'; messageString += chalk.gray(_.repeat('-', 80)) + '\n'; messageString += avpsToString(message.body, 0); messageString += chalk.gray(_.repeat('-', 80)); return messageString; }; var getPathElements = function(path) { var pathElements = []; if (path === undefined || path === null) return pathElements; return path.split('.').map(function(pathElement) { var parts = /([^[]+)\[(\d)\]$/.exec(pathElement); if (parts !== null) { // element has an array index, e.g. Some-Avp[1] return { name: parts[1], index: parts[2] } } else { return { index: 0, name: pathElement } } }); }; exports.getAvpValue = function(message, path) { var pathElements = getPathElements(path); if (pathElements.length === 0) return undefined; var firstAvpName = pathElements[0].name; var avps = _.filter(message, function(avp) { return avp[0] === firstAvpName }); if (avps.length > 0) { if (pathElements[0].index === 0 && avps.length > 1) { throw new Error('Can\'t resolve path, multiple AVPs found with name \'' + firstAvpName + '\''); } if (pathElements[0].index >= avps.length) { throw new Error('Can\'t resolve path, index for \'' + firstAvpName + '\' is out of bounds'); } if (pathElements.length === 1) { return avps[pathElements[0].index][1]; } else { return exports.getAvpValue(avps[pathElements[0].index][1], path.substring(path.indexOf('.') + 1, path.length)); } } return undefined; };