const prettyBytes = require('pretty-bytes'); const moment = require('moment'); const querystring = require('querystring'); function humanTimeAgo(utcDate) { const diff = moment.utc().diff(moment.utc(utcDate)); const uptime = {}; uptime.s = Math.round(diff / 1000); uptime.m = Math.floor(uptime.s / 60); uptime.h = Math.floor(uptime.m / 60); uptime.d = Math.floor(uptime.h / 24); uptime.s %= 60; uptime.m %= 60; uptime.h %= 24; let readableUptime = ''; readableUptime += uptime.d ? ` ${uptime.d}d` : ''; readableUptime += uptime.h ? ` ${uptime.h}h` : ''; readableUptime += !uptime.d || !uptime.h && uptime.m ? ` ${uptime.m}m` : ''; return readableUptime.trim(); } const filters = { bandwidth: node => `${prettyBytes(node.advertised_bandwidth)}/s`, uptime: node => { // Check node is up if(!node.running) { return 'Down'; } // Check uptime return humanTimeAgo(node.last_restarted); }, pagination: (req, direction) => { // Clone query string const query = Object.assign({}, req.query); // Set page as 1 by default query.p = query.p ? query.p : 1; // Update page if(direction == 'next') { query.p++; } else if(direction == 'prev') { query.p--; } // Encode query string return `/?${querystring.encode(query)}`; }, name: node => node.nickname || node.fingerprint && node.fingerprint.slice(0, 8) || node.hashed_fingerprint && node.hashed_fingerprint.slice(0, 8), status: node => node.running ? `Up for ${humanTimeAgo(node.last_restarted)}` : `Down for ${humanTimeAgo(node.last_seen)}` }; module.exports = app => Object.keys(filters).forEach(filter => { app.settings.nunjucksEnv.addFilter(filter, filters[filter]) });