stratumn-cli
Version:
CLI tools for Stratumn
132 lines (108 loc) • 3.5 kB
JavaScript
import commander from 'commander';
import moment from 'moment';
import chalk from 'chalk';
import readPackageSync from '../utils/readPackageSync';
import get from '../utils/get';
function parseTime(str) {
if (str.match(/^[0-9]{5,}$/)) {
return parseInt(str, 10);
}
const val = moment(str).valueOf();
if (isNaN(val)) {
process.stderr.write('Invalid time\n', () => process.exit(1));
}
return val;
}
commander
.version(readPackageSync('version'))
.usage('[app-name]')
.option('-f, --from <time>', 'from timestamp (milliseconds) or date', parseTime)
.option('-t, --to <time>', 'to timestamp (milliseconds) or date', parseTime)
.option('-l, --limit <int>', 'limit number of operations', parseInt)
.option('-s, --state <string>', 'filter by state')
.option('-z, --fossilized <bool>', 'show/hide fossilized operations')
.option('-S, --search <string>', 'search by map id')
.option('-O, --order <string>', 'specify order')
.option('-F, --format <string>', 'specify format')
.parse(process.argv);
if (commander.args.length > 1) {
commander.help();
}
function handleError(err) {
process.stderr.write(err.message + '\n', () => process.exit(1));
}
function rpad(str, cols) {
return str + new Array(Math.max(0, cols - str.length) + 1).join(' ');
}
const filters = [
'from',
'to',
'limit',
'state',
'fossilized',
'search',
'order',
'format'
].reduce((curr, opt) => {
if (commander[opt]) {
curr.push([opt, commander[opt]]);
}
return curr;
}, []);
let url;
if (commander.args.length) {
url = '/applications/' + commander.args[0] + '/operations';
} else {
url = '/operations';
}
let queryString = '';
if (filters.length) {
queryString = '?' + filters.map(filter => filter[0] + '=' + filter[1]).join('&');
}
get(url + queryString, true)
.then(ops => {
if (commander.format === 'CSV') {
process.stdout.write(ops, process.exit);
return;
}
if (commander.format === 'JSON') {
process.stdout.write(JSON.stringify(ops, null, ' ') + '\n', process.exit);
return;
}
let content = '';
ops.forEach(op => {
content += rpad('TIME', 18) + chalk.bold(moment(op.time).toISOString()) + '\n';
if (!commander.args.length) {
content += rpad('APPLICATION NAME', 18) + op.applicationName + '\n';
content += rpad('APPLICATION ID', 18) + op.applicationId + '\n';
}
content += rpad('CHAIN ID', 18) + op.mapId + '\n';
content += rpad('LINK HASH', 18) + op.linkHash + '\n';
content += rpad('PREV LINK HASH', 18) + op.prevLinkHash + '\n';
content += rpad('FOSSILIZED', 18) + op.fossilized + '\n';
content += rpad('STATE', 18);
switch (op.state) {
case 'SUCCESS':
content += chalk.green(op.state) + '\n';
break;
case 'ERROR':
content += chalk.red(op.state) + '\n';
break;
default:
content += op.state + '\n';
}
content += rpad('ERROR', 18) + op.errorMessage + '\n';
content += rpad('AGENT NAME', 18) + op.agentName + '\n';
content += rpad('REQUEST IP', 18) + op.requestIp + '\n';
content += rpad('TOTAL TIME', 18) + op.totalTimeMs.toFixed(2) + ' ms\n';
content += '\n';
});
process.stdout.write(content, process.exit);
})
.catch(err => {
if (err.code === 'ENOENT') {
process.stdout.write('You must login first\n', () => process.exit(1));
return;
}
handleError(err);
});