add args for cli and now we can output to file
This commit is contained in:
parent
456eb6d270
commit
ee3d6e4ab5
168
cli.js
168
cli.js
@ -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,85 +15,140 @@ 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}`);
|
||||||
conn.isAlive = true;
|
|
||||||
|
|
||||||
conn.on('pong', heartbeat);
|
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.on('pong', heartbeat);
|
||||||
|
|
||||||
|
conn.on('message', (message) => {
|
||||||
|
const event = JSON.parse(message);
|
||||||
|
const { type, data } = event;
|
||||||
|
switch (type) {
|
||||||
|
case 'log':
|
||||||
|
data.forEach((text) => out(text, "white", fileStream));
|
||||||
|
break;
|
||||||
|
case 'error':
|
||||||
|
data.forEach((text) => out(text, "red", fileStream));
|
||||||
|
break;
|
||||||
|
case 'warn':
|
||||||
|
data.forEach((text) => out(text, "yellow", fileStream));
|
||||||
|
break;
|
||||||
|
case 'debug':
|
||||||
|
data.forEach((text) => out(text, "blue", fileStream));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
data.forEach((text) => out(text, "white"), fileStream);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
conn.on("close", (event) => {
|
||||||
|
out("[TCONSOLE]: Closed", conn);
|
||||||
|
});
|
||||||
|
|
||||||
conn.on('message', (message) => {
|
|
||||||
//conn.isAlive = true;
|
|
||||||
const event = JSON.parse(message);
|
|
||||||
const { type, data } = event;
|
|
||||||
switch (type) {
|
|
||||||
case 'log':
|
|
||||||
data.forEach((text) => out(text, "white"));
|
|
||||||
break;
|
|
||||||
case 'error':
|
|
||||||
data.forEach((text) => out(text, "red"));
|
|
||||||
break;
|
|
||||||
case 'warn':
|
|
||||||
data.forEach((text) => out(text, "yellow"));
|
|
||||||
break;
|
|
||||||
case 'debug':
|
|
||||||
data.forEach((text) => out(text, "blue"));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
data.forEach((text) => out(text, "white"));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
conn.on("close", (event) => {
|
const closeHandler = (status=0) => {
|
||||||
out("[TCONSOLE]: Closed", conn);
|
if (fileStream) fileStream.end();
|
||||||
|
server.close();
|
||||||
|
process.exit(status)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const interval = setInterval(() => {
|
||||||
|
server.clients.forEach((conn) => {
|
||||||
|
if (conn.isAlive === false) return conn.terminate();
|
||||||
|
|
||||||
|
conn.isAlive = false;
|
||||||
|
conn.ping("");
|
||||||
|
});
|
||||||
|
}, 5000);
|
||||||
|
|
||||||
|
server.on("close", () => {
|
||||||
|
clearInterval(interval);
|
||||||
|
closeHandler(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
server.on("error", (event) => {
|
||||||
|
out(event, "red");
|
||||||
|
closeHandler(1);
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// Start a node repl
|
||||||
|
const r = repl.start('> ');
|
||||||
|
r.on('exit', () => {
|
||||||
|
closeHandler(0);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
const interval = setInterval(() => {
|
|
||||||
server.clients.forEach((conn) => {
|
|
||||||
if (conn.isAlive === false) return conn.terminate();
|
|
||||||
|
|
||||||
conn.isAlive = false;
|
|
||||||
conn.ping("");
|
|
||||||
});
|
|
||||||
}, 5000);
|
|
||||||
|
|
||||||
server.on("close", () => {
|
|
||||||
clearInterval(interval);
|
|
||||||
process.exit(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on("error", (event) => {
|
|
||||||
out(event, "red");
|
|
||||||
process.exit(1);
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
// Start a node repl
|
const args = minimist(process.argv.slice(2));
|
||||||
const r = repl.start('> ');
|
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);
|
||||||
|
}
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
exports.DEFAULT_PORT = 3456;
|
|
||||||
exports.DEFAULT_HOST = "localhost";
|
|
3
index.js
3
index.js
@ -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
17
package-lock.json
generated
@ -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",
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user