102 lines
2.4 KiB
JavaScript
Executable File
102 lines
2.4 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const fs = require('fs');
|
|
const minimist = require('minimist');
|
|
const path = require('path');
|
|
const waitOn = require('../');
|
|
|
|
const interval = ['timeout', 'httpTimeout', 'tcpTimeout'];
|
|
const minimistOpts = {
|
|
string: ['c', 'd', 'i', 's', 't', 'w'].concat(interval),
|
|
boolean: ['h', 'l', 'r', 'v'],
|
|
alias: {
|
|
c: 'config',
|
|
d: 'delay',
|
|
i: 'interval',
|
|
l: 'log',
|
|
r: 'reverse',
|
|
s: 'simultaneous',
|
|
t: 'timeout',
|
|
v: 'verbose',
|
|
w: 'window',
|
|
h: 'help'
|
|
}
|
|
};
|
|
|
|
const argv = minimist(process.argv.slice(2), minimistOpts);
|
|
// if a js/json configuration file is provided require it
|
|
const configOpts = argv.config ? require(path.resolve(argv.config)) : {};
|
|
const hasResources = argv._.length || (configOpts.resources && configOpts.resources.length);
|
|
|
|
if (argv.help || !hasResources) {
|
|
// help
|
|
fs.createReadStream(path.join(__dirname, '/usage.txt'))
|
|
.pipe(process.stdout)
|
|
.on('close', function () {
|
|
process.exit(1);
|
|
});
|
|
} else {
|
|
// if resources are present in the command line then they take
|
|
// precedence over those in the config file.
|
|
if (argv._.length) {
|
|
configOpts.resources = argv._;
|
|
}
|
|
|
|
// now check for specific options and set those
|
|
const opts = [
|
|
'delay',
|
|
'httpTimeout',
|
|
'interval',
|
|
'log',
|
|
'reverse',
|
|
'simultaneous',
|
|
'timeout',
|
|
'tcpTimeout',
|
|
'verbose',
|
|
'window'
|
|
].reduce(function (accum, x) {
|
|
if (argv[x]) {
|
|
let value = argv[x];
|
|
if (interval.includes(x)) {
|
|
value = parseInterval(value);
|
|
}
|
|
accum[x] = value;
|
|
}
|
|
return accum;
|
|
}, configOpts);
|
|
|
|
waitOn(opts, function (err) {
|
|
if (err) {
|
|
return errorExit(err);
|
|
}
|
|
// success, could just let it exit on its own, however since
|
|
// rxjs window waits an extra loop before heeding the unsubscribe
|
|
// we can exit to speed things up
|
|
process.exit(0);
|
|
});
|
|
}
|
|
|
|
function errorExit(err) {
|
|
if (err.stack) {
|
|
console.error(err.stack);
|
|
} else {
|
|
console.error(String(err));
|
|
}
|
|
process.exit(1);
|
|
}
|
|
|
|
function parseInterval(arg) {
|
|
const res = /^([\d.]+)(|ms|s|m|h)$/i.exec(arg);
|
|
if (!res) {
|
|
return arg;
|
|
}
|
|
const value = parseFloat(res[1]);
|
|
switch (res[2]) {
|
|
case '':
|
|
case 'ms': return Math.floor(value);
|
|
case 's': return Math.floor(value * 1000);
|
|
case 'm': return Math.floor(value * 1000 * 60);
|
|
case 'h': return Math.floor(value * 1000 * 60 * 60);
|
|
}
|
|
}
|