diff --git a/README.md b/README.md index 1c4ec69..fd01f51 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# TConsole -Console log to terminal +# Termsole +Bring browser console to your terminal +This package is intended to use while developement -# https://stackoverflow.com/questions/65822409/logging-to-terminal-console-instead-of-browser-console-in-react-js diff --git a/cli.js b/cli.js index df8520d..365e50e 100755 --- a/cli.js +++ b/cli.js @@ -2,6 +2,7 @@ const WebSocket = require('ws'); const chalk = require('chalk'); const repl = require('repl'); +const { DEFAULT_HOST, DEFAULT_PORT } = require("./config"); const getTime = () => { const now = new Date(); @@ -11,7 +12,7 @@ const getTime = () => { return `[${hours}:${minutes}:${seconds}]`; } -const out = (text, color) => { +const out = (text, color = "white") => { switch (color) { case "white": console.log(getTime(), chalk.white(text)) @@ -31,10 +32,20 @@ const out = (text, color) => { } } -const server = new WebSocket.Server({ port: 3456 }); +function heartbeat() { + this.isAlive = true; +} -server.on('connection', (ws) => { - ws.on('message', (message) => { +console.log(`Listening to http://${DEFAULT_HOST}:${DEFAULT_PORT}`); +const server = new WebSocket.Server({ port: DEFAULT_PORT, host: DEFAULT_HOST}); + +server.on("connection", (conn) => { + conn.isAlive = true; + + conn.on('pong', heartbeat); + + conn.on('message', (message) => { + //conn.isAlive = true; const event = JSON.parse(message); const { type, data } = event; switch (type) { @@ -54,6 +65,32 @@ server.on('connection', (ws) => { data.forEach((text) => out(text, "white")); } }); + + conn.on("close", (event) => { + out("[TCONSOLE]: Closed", conn); + }); + }); +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('> '); diff --git a/config.js b/config.js new file mode 100644 index 0000000..3bcb997 --- /dev/null +++ b/config.js @@ -0,0 +1,2 @@ +exports.DEFAULT_PORT = 3456; +exports.DEFAULT_HOST = "localhost"; diff --git a/index.js b/index.js index d40fee9..83a1a87 100755 --- a/index.js +++ b/index.js @@ -1,9 +1,7 @@ +import { DEFAULT_HOST, DEFAULT_PORT } from "./config"; let ws = null; -// https://stackoverflow.com/a/44782052/7539840 -const defaultConsole = Object.assign(Object.create(Object.getPrototypeOf(console)), console); - -const configure = (conn) => { +const configure = (conn, defaultConsole) => { // skip if already configured if (console._tsconsole_configured) return; console._tsconsole_configured = true; @@ -30,34 +28,41 @@ const configure = (conn) => { } -const release = () => { +const release = (defaultConsole) => { console = defaultConsole; ws = null; } const termsole = (options = {}) => { - if (ws) return; // already running + // Ensure termsole doesn't run in production mode + if (process.env.NODE_ENV && process.env.NODE_ENV !== 'development') return; + + if (ws) { + console.log("already running"); + return; // already running + } + const defaultConsole = Object.assign(Object.create(Object.getPrototypeOf(console)), console); options = { - host: "localhost", - port: 3456, + host: DEFAULT_HOST, + port: DEFAULT_PORT, ssl: false, ...options, } ws = new WebSocket(`${options.ssl ? "wss" : "ws"}://${options.host}:${options.port}`); ws.onopen = () => { - configure(ws); + configure(ws, defaultConsole); console.log('[TCONSOLE]: Connected'); }; ws.onclose = (event) => { - release(); + release(defaultConsole); console.log("[TCONSOLE]: Disconnected", event.message); } ws.onerror = (event) => { - release(); + release(defaultConsole); console.error("[TCONSOLE]: Disconnected", event.message); } }