Skip to content

Instantly share code, notes, and snippets.

@ROZ-MOFUMOFU-ME
Last active April 13, 2024 18:17
Show Gist options
  • Save ROZ-MOFUMOFU-ME/7300160df213e26798fcfe1488425330 to your computer and use it in GitHub Desktop.
Save ROZ-MOFUMOFU-ME/7300160df213e26798fcfe1488425330 to your computer and use it in GitHub Desktop.
Server Ping display with node.js (PCからサーバーまでのPing値をブラウザ表示する)
# vi package.json
-----------------------------
{
"name": "ping",
"version": "1.3.0",
"description": "A Server Ping display",
"repository": "https://github.com/ROZ-MOFUMOFU-ME/ping",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"author": "ROZ-MOFUMOFU-ME",
"authors": [
{
"name": "ROZ-MOFUMOFU-ME",
"email": "mail@mofumofu.me",
"url": "https://github.com/ROZ-MOFUMOFU-ME"
}
],
"main": "app.js",
"license": "MIT",
"dependencies": {
"socket.io": "^4.7.5"
},
"engines": {
"node": ">=12.22.12",
"npm": ">=6.14.16"
}
}
-----------------------------
# npm install
-----------------------------
# vi app.js
-----------------------------
const { Server } = require('socket.io');
const http = require('http');
const { execSync } = require('child_process');
const server = http.createServer();
const io = new Server(server);
const serverStartTime = getFormattedTime();
function getFormattedTime() {
try {
return execSync("date '+%Y/%m/%d %H:%M:%S'").toString().trim();
} catch (error) {
console.error("Failed to get server time:", error);
return "Time Error";
}
}
function logConnection(action, socket, extraInfo = '') {
const dateStr = getFormattedTime();
const ip = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address;
const origin = (socket.handshake.headers['origin'] || 'unknown origin').replace('https://', '');
const logMessage = `${dateStr} ${action} ${ip} [${origin}] ${extraInfo}`;
switch (action) {
case 'CONNECTION':
console.info(logMessage);
break;
case 'DISCONNECT':
console.info(logMessage);
break;
case 'FATALERROR':
console.error(logMessage);
break;
default:
console.log(logMessage);
}
}
io.on('connection', (socket) => {
logConnection('CONNECTION', socket);
socket.on('latency', (startTime, cb) => {
cb(startTime);
});
socket.on('disconnect', () => {
logConnection('DISCONNECT', socket);
});
socket.on('error', (err) => {
const errorInfo = `${err}`
logConnection('FATALERROR', socket, errorInfo);
});
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`${serverStartTime} Server is listening on port ${PORT}`);
});
-----------------------------
# npm start
-----------------------------
nginx
-----------------------------
server {
# reverse proxy
location /socket.io/ {
add_header Access-Control-Allow-Origin '*' always;
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
add_header Access-Control-Allow-Credentials true;
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
include nginxconfig.io/proxy.conf;
}
}
-----------------------------
# vi index.html
-----------------------------
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.5/socket.io.js"></script>
</head>
<body>
<div><span id="usPing"></span></div>
<div><span id="jpPing"></span></div>
<div><span id="euPing"></span></div>
<div><span id="sgPing"></span></div>
<script>
function setSocketConnection(spanId, serverName, serverUrl) {
$(`span#${spanId}`).html("connecting...");
setTimeout(function() {
const socket = io.connect(serverUrl, { 'reconnect': true });
socket._connectTimer = setTimeout(function () {
$(`span#${spanId}`).html("connect error!");
socket.close();
}, 10000);
socket.on('connect', function () {
console.log(`Connected to ${serverName}`);
clearTimeout(socket._connectTimer);
socket._connectTimer = setTimeout(function () {
socket.close();
}, 60000);
$(`span#${spanId}`).html("starting...");
setInterval(function () {
const startTime = Date.now();
socket.emit('latency', startTime, function () {
const latency = Date.now() - startTime;
$(`span#${spanId}`).html(`Your Ping is ${latency} ms`);
});
}, 3000);
});
}, 5000);
}
$(function () {
setSocketConnection('usPing', 'US Server', 'https://us.mofumofu.me');
setSocketConnection('jpPing', 'JP Server', 'https://jp.mofumofu.me');
setSocketConnection('euPing', 'EU Server', 'https://eu.mofumofu.me');
setSocketConnection('sgPing', 'SG Server', 'https://sg.mofumofu.me');
});
</script>
</body>
</html>
-----------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment