diff --git a/cli.js b/cli.js index 365e50e..ac25235 100755 --- a/cli.js +++ b/cli.js @@ -1,8 +1,11 @@ #!/usr/bin/env node const WebSocket = require('ws'); +const minimist = require("minimist"); const chalk = require('chalk'); const repl = require('repl'); -const { DEFAULT_HOST, DEFAULT_PORT } = require("./config"); + +const DEFAULT_HOST = "localhost"; +const DEFAULT_PORT = 3456; const getTime = () => { const now = new Date(); @@ -12,85 +15,140 @@ const getTime = () => { return `[${hours}:${minutes}:${seconds}]`; } -const out = (text, color = "white") => { +const out = (text, color = "white", stream = null) => { + let formattedText; switch (color) { case "white": - console.log(getTime(), chalk.white(text)) + text = `${getTime()} ${chalk.white(text)}`; break; case "red": - console.log(getTime(), chalk.red(text)) + text = `${getTime()} ${chalk.red(text)}`; break; case "yellow": - console.log(getTime(), chalk.yellow(text)) + text = `${getTime()} ${chalk.yellow(text)}`; break; case "blue": - console.log(getTime(), chalk.blue(text)) + text = `${getTime()} ${chalk.blue(text)}`; break; default: - console.log(getTime(), chalk.white(text)) + text = `${getTime()} ${chalk.white(text)}`; break; } + console.log(text); + if (stream) stream.write(text + "\n"); } function heartbeat() { this.isAlive = true; } -console.log(`Listening to http://${DEFAULT_HOST}:${DEFAULT_PORT}`); -const server = new WebSocket.Server({ port: DEFAULT_PORT, host: DEFAULT_HOST}); +const startServer = (options) => { -server.on("connection", (conn) => { - conn.isAlive = true; + 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}`); + } - conn.on('pong', heartbeat); + 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) => { - out("[TCONSOLE]: Closed", conn); }); + const closeHandler = (status=0) => { + 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 r = repl.start('> '); +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); +} diff --git a/config.js b/config.js deleted file mode 100644 index 3bcb997..0000000 --- a/config.js +++ /dev/null @@ -1,2 +0,0 @@ -exports.DEFAULT_PORT = 3456; -exports.DEFAULT_HOST = "localhost"; diff --git a/index.js b/index.js index 83a1a87..33df8b7 100755 --- a/index.js +++ b/index.js @@ -1,4 +1,5 @@ -import { DEFAULT_HOST, DEFAULT_PORT } from "./config"; +const DEFAULT_HOST = "localhost"; +const DEFAULT_PORT = 3456; let ws = null; const configure = (conn, defaultConsole) => { diff --git a/package-lock.json b/package-lock.json index 51c60da..8be82fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { - "name": "tconsole", + "name": "termsole", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "tconsole", + "name": "termsole", "version": "1.0.0", - "license": "ISC", + "license": "MIT", "dependencies": { "chalk": "^4.1.2", + "minimist": "^1.2.5", "repl": "^0.1.3", "ws": "^8.2.0" }, @@ -70,6 +71,11 @@ "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": { "version": "0.1.3", "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", "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": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/repl/-/repl-0.1.3.tgz", diff --git a/package.json b/package.json index e61ad2e..6c4fabb 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "homepage": "https://github.com/qnkhuat/TConsole#readme", "dependencies": { "chalk": "^4.1.2", + "minimist": "^1.2.5", "repl": "^0.1.3", "ws": "^8.2.0" }