UNPKG

p3x-redis-ui-server

Version:

🏍️ The p3x-redis-ui-server package motor that is connected to the p3x-redis-ui-material web user interface

125 lines (106 loc) 2.96 kB
/* from npm's redis-info, adding missing avg_ttl */ const { fromPairs, find, has, } = require('lodash') module.exports = { parse: function (info) { return parseFields(splitStr(info)) } } function startWith(pattern) { return function (value) { return value.indexOf(pattern) === 0 } } function split(s) { return function (v) { return v.split(s) } } function orEmptyStr(v) { return v || '' } function takeN(func, n) { return function (v) { return func(v[n]) } } function takeFirst(func) { return takeN(func, 0) } /** * Split the info string by \n and : * @param {String} str the returned redis info * @return {Array} Array of [key, value] */ function splitStr(str) { return str.split('\n') .filter(function (line) { return line.length > 0 && line.indexOf('#') !== 0 }) .map(function (line) { return line.trim().split(':') }) } function parseDatabases(info) { return info .filter(takeFirst(startWith('db'))) .map(function _parseDatabaseInfo(args) { var dbName = args[0] var value = args[1] var values = orEmptyStr(value).split(',') // console.log({values}) function extract(param) { return parseInt(orEmptyStr(find(values, startWith(param))).split('=')[1] || 0, 10) } return { index: parseInt(dbName.substr(2), 10), keys: extract('keys'), expires: extract('expires'), avg_ttl: extract('avg_ttl'), } }) .reduce(function (m, v) { m[v.index] = { keys: v.keys, expires: v.expires, avg_ttl: v.avg_ttl, } return m }, {}) } function parseCommands(info) { return fromPairs(info.filter(function (a) { return orEmptyStr(a[0]).indexOf('cmdstat_') === 0 }) .map(function _parseCommands(args) { var v = args[0] var a = args[1] var val = fromPairs(orEmptyStr(a).split(',').map(split('='))) if (has(val, 'calls')) { val.calls = parseInt(val.calls, 10) } if (has(val, 'usec')) { val.usec = parseInt(val.usec, 10) } if (has(val, 'usec_per_call')) { val.usec_per_call = parseFloat(val.usec_per_call, 10) } return [orEmptyStr(v).split('_')[1], val] })) } function parseFields(info) { var fields = info.reduce(function (m, v) { if (!v[0].trim() || v[0].indexOf('db') === 0 || v[0].indexOf('cmdstat_') === 0) { return m } m[v[0]] = v[1] return m }, { databases: parseDatabases(info), commands: parseCommands(info) }) return fields }