98 lines
2.9 KiB
JavaScript
98 lines
2.9 KiB
JavaScript
const os = require('os');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const readLine = require('readline');
|
|
const chalk = require('chalk');
|
|
const speedTest = require('speedtest-net');
|
|
|
|
class Base {
|
|
constructor() {
|
|
this.maxHeapMb = process.arch.includes('64') ? 1024 : 512;
|
|
}
|
|
|
|
validate(program, message, params) {
|
|
let flag = false;
|
|
let output = message;
|
|
params.forEach(param => {
|
|
if (!program[param]) {
|
|
output += chalk.red(`Must specify ${param}\n`);
|
|
flag = true;
|
|
}
|
|
});
|
|
if (flag) return program.help(h => h + output);
|
|
else return { flag, output };
|
|
}
|
|
|
|
writeProgress(message) {
|
|
readLine.clearLine(process.stdout, 0);
|
|
readLine.cursorTo(process.stdout, 0);
|
|
process.stdout.write(message);
|
|
}
|
|
|
|
normalizePath(input) {
|
|
// Convert path input param to valid system absolute path
|
|
// Path is absolute, originating from system root
|
|
if (path.isAbsolute(input)) return input;
|
|
// Path is relative to user's home directory
|
|
if (input[0] === '~') return path.join(os.homedir(), input.substr(1));
|
|
// Path is relative to current directory
|
|
return path.resolve(process.cwd(), input);
|
|
}
|
|
|
|
setSource(options) {
|
|
// Set source directory and filenames array
|
|
// Used to process path inputs that may either be a single file or a directory of files
|
|
const source = this.normalizePath(options.sourceFilepath);
|
|
if (fs.lstatSync(source).isDirectory()) {
|
|
this.directory = source;
|
|
this.filenames = fs.readdirSync(source);
|
|
} else if (fs.lstatSync(source).isFile()) {
|
|
this.directory = path.parse(source).dir;
|
|
this.filenames = [path.parse(source).base];
|
|
} else {
|
|
throw new Error('Invalid sourcefilepath param');
|
|
}
|
|
}
|
|
|
|
getMemoryUsage() {
|
|
const used = process.memoryUsage().heapUsed / 1024 / 1024;
|
|
const usedMb = Math.round(used * 100) / 100;
|
|
const percentUsed = Math.floor((usedMb / this.maxHeapMb) * 100);
|
|
return { usedMb, percentUsed };
|
|
}
|
|
|
|
getStringSizeMb(string) {
|
|
const bytes = Buffer.byteLength(string, 'utf8');
|
|
const mb = bytes / 1024 / 1024;
|
|
return Math.ceil(mb);
|
|
}
|
|
|
|
getNetworkSpeed() {
|
|
return new Promise((resolve, reject) => {
|
|
this.writeProgress('Estimating network speed...');
|
|
const test = speedTest({ maxTime: 5000 });
|
|
let downloadSpeedMb = null;
|
|
let uploadSpeedMb = null;
|
|
test.on('error', e => {
|
|
console.log(chalk.white.bgRed('Speed test error'), chalk.red(e));
|
|
reject(e);
|
|
});
|
|
test.on('downloadspeed', speed => {
|
|
downloadSpeedMb = ((speed * 125) / 1000).toFixed(2);
|
|
});
|
|
test.on('uploadspeed', speed => {
|
|
uploadSpeedMb = ((speed * 125) / 1000).toFixed(2);
|
|
});
|
|
test.on('done', () => {
|
|
console.log(
|
|
chalk.blue(`\nDownload: ${downloadSpeedMb} MB/s`),
|
|
chalk.blue(`\nUpload: ${uploadSpeedMb} MB/s`)
|
|
);
|
|
resolve(uploadSpeedMb);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = Base;
|