add args for cli and now we can output to file

This commit is contained in:
Earther 2021-08-24 18:29:02 +07:00
parent 456eb6d270
commit ee3d6e4ab5
5 changed files with 132 additions and 63 deletions

112
cli.js
View File

@ -1,8 +1,11 @@
#!/usr/bin/env node #!/usr/bin/env node
const WebSocket = require('ws'); const WebSocket = require('ws');
const minimist = require("minimist");
const chalk = require('chalk'); const chalk = require('chalk');
const repl = require('repl'); const repl = require('repl');
const { DEFAULT_HOST, DEFAULT_PORT } = require("./config");
const DEFAULT_HOST = "localhost";
const DEFAULT_PORT = 3456;
const getTime = () => { const getTime = () => {
const now = new Date(); const now = new Date();
@ -12,57 +15,68 @@ const getTime = () => {
return `[${hours}:${minutes}:${seconds}]`; return `[${hours}:${minutes}:${seconds}]`;
} }
const out = (text, color = "white") => { const out = (text, color = "white", stream = null) => {
let formattedText;
switch (color) { switch (color) {
case "white": case "white":
console.log(getTime(), chalk.white(text)) text = `${getTime()} ${chalk.white(text)}`;
break; break;
case "red": case "red":
console.log(getTime(), chalk.red(text)) text = `${getTime()} ${chalk.red(text)}`;
break; break;
case "yellow": case "yellow":
console.log(getTime(), chalk.yellow(text)) text = `${getTime()} ${chalk.yellow(text)}`;
break; break;
case "blue": case "blue":
console.log(getTime(), chalk.blue(text)) text = `${getTime()} ${chalk.blue(text)}`;
break; break;
default: default:
console.log(getTime(), chalk.white(text)) text = `${getTime()} ${chalk.white(text)}`;
break; break;
} }
console.log(text);
if (stream) stream.write(text + "\n");
} }
function heartbeat() { function heartbeat() {
this.isAlive = true; this.isAlive = true;
} }
console.log(`Listening to http://${DEFAULT_HOST}:${DEFAULT_PORT}`); const startServer = (options) => {
const server = new WebSocket.Server({ port: DEFAULT_PORT, host: DEFAULT_HOST});
server.on("connection", (conn) => { console.log(`Server running at: ${options.host}:${options.port}`);
let fileStream;
if (options.out) {
const fs = require('fs');
fileStream = fs.createWriteStream(options.out, {flags: 'a'});
console.log(`Saving log to ${options.out}`);
}
const server = new WebSocket.Server({ port: options.port, host: options.host});
server.on("connection", (conn) => {
conn.isAlive = true; conn.isAlive = true;
conn.on('pong', heartbeat); conn.on('pong', heartbeat);
conn.on('message', (message) => { conn.on('message', (message) => {
//conn.isAlive = true;
const event = JSON.parse(message); const event = JSON.parse(message);
const { type, data } = event; const { type, data } = event;
switch (type) { switch (type) {
case 'log': case 'log':
data.forEach((text) => out(text, "white")); data.forEach((text) => out(text, "white", fileStream));
break; break;
case 'error': case 'error':
data.forEach((text) => out(text, "red")); data.forEach((text) => out(text, "red", fileStream));
break; break;
case 'warn': case 'warn':
data.forEach((text) => out(text, "yellow")); data.forEach((text) => out(text, "yellow", fileStream));
break; break;
case 'debug': case 'debug':
data.forEach((text) => out(text, "blue")); data.forEach((text) => out(text, "blue", fileStream));
break; break;
default: default:
data.forEach((text) => out(text, "white")); data.forEach((text) => out(text, "white"), fileStream);
} }
}); });
@ -70,27 +84,71 @@ server.on("connection", (conn) => {
out("[TCONSOLE]: Closed", conn); out("[TCONSOLE]: Closed", conn);
}); });
}); });
const interval = setInterval(() => { const closeHandler = (status=0) => {
if (fileStream) fileStream.end();
server.close();
process.exit(status)
}
const interval = setInterval(() => {
server.clients.forEach((conn) => { server.clients.forEach((conn) => {
if (conn.isAlive === false) return conn.terminate(); if (conn.isAlive === false) return conn.terminate();
conn.isAlive = false; conn.isAlive = false;
conn.ping(""); conn.ping("");
}); });
}, 5000); }, 5000);
server.on("close", () => { server.on("close", () => {
clearInterval(interval); clearInterval(interval);
process.exit(0); closeHandler(0);
}); });
server.on("error", (event) => { server.on("error", (event) => {
out(event, "red"); out(event, "red");
process.exit(1); closeHandler(1);
}) })
// Start a node repl // Start a node repl
const r = repl.start('> '); const r = repl.start('> ');
r.on('exit', () => {
closeHandler(0);
});
}
const args = minimist(process.argv.slice(2));
if ("help" in args) {
console.log(`
Termsole - Console to your terminal
Options:
--help
Display this help
--addr localhost
Change address of server
Default is: localhost
--port 3456
Change port of server
Default is: 3456
--out arg
Save output to file
`);
} else {
const options = {
port: DEFAULT_PORT,
host:DEFAULT_HOST,
...args
}
startServer(options);
}

View File

@ -1,2 +0,0 @@
exports.DEFAULT_PORT = 3456;
exports.DEFAULT_HOST = "localhost";

View File

@ -1,4 +1,5 @@
import { DEFAULT_HOST, DEFAULT_PORT } from "./config"; const DEFAULT_HOST = "localhost";
const DEFAULT_PORT = 3456;
let ws = null; let ws = null;
const configure = (conn, defaultConsole) => { const configure = (conn, defaultConsole) => {

17
package-lock.json generated
View File

@ -1,15 +1,16 @@
{ {
"name": "tconsole", "name": "termsole",
"version": "1.0.0", "version": "1.0.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "tconsole", "name": "termsole",
"version": "1.0.0", "version": "1.0.0",
"license": "ISC", "license": "MIT",
"dependencies": { "dependencies": {
"chalk": "^4.1.2", "chalk": "^4.1.2",
"minimist": "^1.2.5",
"repl": "^0.1.3", "repl": "^0.1.3",
"ws": "^8.2.0" "ws": "^8.2.0"
}, },
@ -70,6 +71,11 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"node_modules/repl": { "node_modules/repl": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/repl/-/repl-0.1.3.tgz", "resolved": "https://registry.npmjs.org/repl/-/repl-0.1.3.tgz",
@ -146,6 +152,11 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
}, },
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"repl": { "repl": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/repl/-/repl-0.1.3.tgz", "resolved": "https://registry.npmjs.org/repl/-/repl-0.1.3.tgz",

View File

@ -23,6 +23,7 @@
"homepage": "https://github.com/qnkhuat/TConsole#readme", "homepage": "https://github.com/qnkhuat/TConsole#readme",
"dependencies": { "dependencies": {
"chalk": "^4.1.2", "chalk": "^4.1.2",
"minimist": "^1.2.5",
"repl": "^0.1.3", "repl": "^0.1.3",
"ws": "^8.2.0" "ws": "^8.2.0"
} }