add ping to server

This commit is contained in:
Earther 2021-08-24 17:01:20 +07:00
parent 5128b0d530
commit 456eb6d270
4 changed files with 62 additions and 18 deletions

View File

@ -1,5 +1,5 @@
# TConsole # Termsole
Console log to terminal 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

45
cli.js
View File

@ -2,6 +2,7 @@
const WebSocket = require('ws'); const WebSocket = require('ws');
const chalk = require('chalk'); const chalk = require('chalk');
const repl = require('repl'); const repl = require('repl');
const { DEFAULT_HOST, DEFAULT_PORT } = require("./config");
const getTime = () => { const getTime = () => {
const now = new Date(); const now = new Date();
@ -11,7 +12,7 @@ const getTime = () => {
return `[${hours}:${minutes}:${seconds}]`; return `[${hours}:${minutes}:${seconds}]`;
} }
const out = (text, color) => { const out = (text, color = "white") => {
switch (color) { switch (color) {
case "white": case "white":
console.log(getTime(), chalk.white(text)) 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) => { console.log(`Listening to http://${DEFAULT_HOST}:${DEFAULT_PORT}`);
ws.on('message', (message) => { 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 event = JSON.parse(message);
const { type, data } = event; const { type, data } = event;
switch (type) { switch (type) {
@ -54,6 +65,32 @@ server.on('connection', (ws) => {
data.forEach((text) => out(text, "white")); 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('> '); const r = repl.start('> ');

2
config.js Normal file
View File

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

View File

@ -1,9 +1,7 @@
import { DEFAULT_HOST, DEFAULT_PORT } from "./config";
let ws = null; let ws = null;
// https://stackoverflow.com/a/44782052/7539840 const configure = (conn, defaultConsole) => {
const defaultConsole = Object.assign(Object.create(Object.getPrototypeOf(console)), console);
const configure = (conn) => {
// skip if already configured // skip if already configured
if (console._tsconsole_configured) return; if (console._tsconsole_configured) return;
console._tsconsole_configured = true; console._tsconsole_configured = true;
@ -30,34 +28,41 @@ const configure = (conn) => {
} }
const release = () => { const release = (defaultConsole) => {
console = defaultConsole; console = defaultConsole;
ws = null; ws = null;
} }
const termsole = (options = {}) => { 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 = { options = {
host: "localhost", host: DEFAULT_HOST,
port: 3456, port: DEFAULT_PORT,
ssl: false, ssl: false,
...options, ...options,
} }
ws = new WebSocket(`${options.ssl ? "wss" : "ws"}://${options.host}:${options.port}`); ws = new WebSocket(`${options.ssl ? "wss" : "ws"}://${options.host}:${options.port}`);
ws.onopen = () => { ws.onopen = () => {
configure(ws); configure(ws, defaultConsole);
console.log('[TCONSOLE]: Connected'); console.log('[TCONSOLE]: Connected');
}; };
ws.onclose = (event) => { ws.onclose = (event) => {
release(); release(defaultConsole);
console.log("[TCONSOLE]: Disconnected", event.message); console.log("[TCONSOLE]: Disconnected", event.message);
} }
ws.onerror = (event) => { ws.onerror = (event) => {
release(); release(defaultConsole);
console.error("[TCONSOLE]: Disconnected", event.message); console.error("[TCONSOLE]: Disconnected", event.message);
} }
} }