Last active
April 13, 2024 18:17
-
-
Save ROZ-MOFUMOFU-ME/7300160df213e26798fcfe1488425330 to your computer and use it in GitHub Desktop.
Server Ping display with node.js (PCからサーバーまでのPing値をブラウザ表示する)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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