1
0
Fork 0
forked from svrjs/svrjs

Implement listeningMessage() function, around with public IP obtaining

This commit is contained in:
Dorian Niemiec 2024-08-26 07:00:08 +02:00
parent 57f9c2ac99
commit ef78a88a39
2 changed files with 188 additions and 4 deletions

View file

@ -1,12 +1,13 @@
const http = require("http"); const http = require("http");
const fs = require("fs"); const fs = require("fs");
const os = require("os"); const os = require("os");
const dns = require("dns");
const readline = require("readline"); const readline = require("readline");
const logo = require("./res/logo.js"); const logo = require("./res/logo.js");
const generateServerString = require("./utils/generateServerString.js"); const generateServerString = require("./utils/generateServerString.js");
const deleteFolderRecursive = require("./utils/deleteFolderRecursive.js"); const deleteFolderRecursive = require("./utils/deleteFolderRecursive.js");
const svrjsInfo = require("../svrjs.json"); const svrjsInfo = require("../svrjs.json");
const { name, version } = svrjsInfo; const { name, version, statisticsServerCollectEndpoint } = svrjsInfo;
let inspector = undefined; let inspector = undefined;
try { try {
@ -460,7 +461,103 @@ if (ips.length == 0) {
var host = ips[ips.length - 1]; var host = ips[ips.length - 1];
if (!host) host = "[offline]"; if (!host) host = "[offline]";
// TODO: Public IP address-related // Public IP address-related
let ipRequestCompleted = false;
let ipRequestGotError = false;
let domain = process.serverConfig.domain ? process.serverConfig.domain : "";
let pubip = "";
function doIpRequest(isHTTPS, options) {
const ipRequest = (isHTTPS ? https : http).get(options, (res) => {
ipRequest.removeAllListeners("timeout");
res.on("data", function (d) {
if (res.statusCode != 200) {
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
return;
}
pubip = d.toString();
if (domain) {
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
} else {
let callbackDone = false;
const dnsTimeout = setTimeout(function () {
callbackDone = true;
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
}, 3000);
try {
dns.reverse(pubip, function (err, hostnames) {
if (callbackDone) return;
clearTimeout(dnsTimeout);
if (!err && hostnames.length > 0) domain = hostnames[0];
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
});
} catch (err) {
clearTimeout(dnsTimeout);
callbackDone = true;
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
}
}
});
});
ipRequest.on("error", function () {
if (crypto.__disabled__ || ipRequestGotError) {
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
} else {
ipRequestGotError = true;
}
});
ipRequest.on("timeout", function () {
if (crypto.__disabled__ || ipRequestGotError) {
ipRequestCompleted = true;
process.emit("ipRequestCompleted");
} else {
ipRequestGotError = true;
}
});
return ipRequest;
}
if (host != "[offline]" || ifaceEx) {
const ipRequest = doIpRequest(crypto.__disabled__ === undefined, {
host: "api64.ipify.org",
port: (crypto.__disabled__ !== undefined ? 80 : 443),
path: "/",
headers: {
"User-Agent": generateServerString(true)
},
timeout: 5000
});
if (crypto.__disabled__ === undefined) {
const ipRequest2 = doIpRequest(true, {
host: "api.seeip.org",
port: 443,
path: "/",
headers: {
"User-Agent": generateServerString(true)
},
timeout: 5000
});
}
} else {
ipRequestCompleted = true;
}
function ipStatusCallback(callback) {
if (ipRequestCompleted) {
callback();
} else {
process.once("ipRequestCompleted", callback);
}
}
// SSL-related // SSL-related
let key = ""; let key = "";
@ -745,13 +842,99 @@ const serverErrorHandler = require("./handlers/serverErrorHandler.js")(
serverconsole, serverconsole,
); );
let messageTransmitted = false;
function listeningMessage() { function listeningMessage() {
closedMaster = false; closedMaster = false;
if (!cluster.isPrimary && cluster.isPrimary !== undefined) { if (!cluster.isPrimary && cluster.isPrimary !== undefined) {
process.send("\x12LISTEN"); process.send("\x12LISTEN");
return; return;
} }
// TODO: listeningMessage() const listenToLocalhost = (listenAddress && (listenAddress == "localhost" || listenAddress.match(/^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) || listenAddress.match(/^(?:0{0,4}:)+0{0,3}1$/)));
const listenToAny = (!listenAddress || listenAddress.match(/^0{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) || listenAddress.match(/^(?:0{0,4}:)+0{0,4}$/));
const sListenToLocalhost = (sListenAddress && (sListenAddress == "localhost" || sListenAddress.match(/^127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) || sListenAddress.match(/^(?:0{0,4}:)+0{0,3}1$/)));
const sListenToAny = (!sListenAddress || sListenAddress.match(/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) || sListenAddress.match(/^(?:0{0,4}:)+0{0,4}$/));
let accHost = host;
let sAccHost = host;
if (!listenToAny) accHost = listenAddress;
if (!sListenToAny) sAccHost = sListenAddress;
if (messageTransmitted) return;
messageTransmitted = true;
serverconsole.locmessage("Started server at: ");
if (process.serverConfig.secure && (sListenToLocalhost || sListenToAny)) {
if (typeof process.serverConfig.sport === "number") {
serverconsole.locmessage("* https://localhost" + (process.serverConfig.sport == 443 ? "" : (":" + process.serverConfig.sport)));
} else {
serverconsole.locmessage("* " + process.serverConfig.sport); // Unix socket or Windows named pipe
}
}
if (!(process.serverConfig.secure && process.serverConfig.disableNonEncryptedServer) && (listenToLocalhost || listenToAny)) {
if (typeof process.serverConfig.port === "number") {
serverconsole.locmessage("* http://localhost" + (process.serverConfig.port == 80 ? "" : (":" + process.serverConfig.port)));
} else {
serverconsole.locmessage("* " + process.serverConfig.port); // Unix socket or Windows named pipe
}
}
if (process.serverConfig.secure && typeof process.serverConfig.sport === "number" && !sListenToLocalhost && (!sListenToAny || (host != "" && host != "[offline]"))) serverconsole.locmessage("* https://" + (sAccHost.indexOf(":") > -1 ? "[" + sAccHost + "]" : sAccHost) + (process.serverConfig.sport == 443 ? "" : (":" + process.serverConfig.sport)));
if (!(process.serverConfig.secure && process.serverConfig.disableNonEncryptedServer) && !listenToLocalhost && (!listenToAny || (host != "" && host != "[offline]")) && typeof process.serverConfig.port === "number") serverconsole.locmessage("* http://" + (accHost.indexOf(":") > -1 ? "[" + accHost + "]" : accHost) + (process.serverConfig.port == 80 ? "" : (":" + process.serverConfig.port)));
ipStatusCallback(() => {
if (pubip != "") {
if (process.serverConfig.secure && !sListenToLocalhost) serverconsole.locmessage("* https://" + (pubip.indexOf(":") > -1 ? "[" + pubip + "]" : pubip) + (process.serverConfig.spubport == 443 ? "" : (":" + process.serverConfig.spubport)));
if (!(process.serverConfig.secure && process.serverConfig.disableNonEncryptedServer) && !listenToLocalhost) serverconsole.locmessage("* http://" + (pubip.indexOf(":") > -1 ? "[" + pubip + "]" : pubip) + (process.serverConfig.pubport == 80 ? "" : (":" + process.serverConfig.pubport)));
}
if (domain != "") {
if (process.serverConfig.secure && !sListenToLocalhost) serverconsole.locmessage("* https://" + domain + (spubport == 443 ? "" : (":" + spubport)));
if (!(process.serverConfig.secure && process.serverConfig.disableNonEncryptedServer) && !listenToLocalhost) serverconsole.locmessage("* http://" + domain + (process.serverConfig.pubport == 80 ? "" : (":" + process.serverConfig.pubport)));
}
serverconsole.locmessage("For CLI help, you can type \"help\"");
// Code for sending data to a statistics server
// TODO: uncomment this
/*if (!optOutOfStatisticsServer) {
if (crypto.__disabled__ !== undefined) {
serverconsole.locwarnmessage("Sending data to statistics server is disabled, because the server only supports HTTPS, and your Node.JS version doesn't have crypto support.");
} else {
const statisticsToSend = JSON.stringify({
version: version,
runtime: process.isBun ? "Bun" : "Node.js",
runtimeVersion: process.isBun ? process.versions.bun : process.version,
mods: modInfos
});
const statisticsRequest = https.request(statisticsServerCollectEndpoint, {
method: "POST",
headers: {
"User-Agent": (exposeServerVersion ? "SVR.JS/" + version + " (" + getOS() + "; " + (process.isBun ? ("Bun/v" + process.versions.bun + "; like Node.JS/" + process.version) : ("Node.JS/" + process.version)) + ")" : "SVR.JS"),
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(statisticsToSend)
}
}, function (res) {
const statusCode = res.statusCode;
let data = "";
res.on("data", function (chunk) {
data += chunk.toString();
});
res.on("end", function () {
try {
let parsedJson = {};
try {
parsedJson = JSON.parse(data);
} catch (err) {
throw new Error("JSON parse error (response parsing failed).");
}
if (parsedJson.status != statusCode) throw new Error("Status code mismatch");
if (statusCode != 200) throw new Error(parsedJson.message);
} catch (err) {
serverconsole.locwarnmessage("There was a problem, when sending data to statistics server! Reason: " + err.message);
}
});
});
statisticsRequest.on("error", function (err) {
serverconsole.locwarnmessage("There was a problem, when sending data to statistics server! Reason: " + err.message);
});
statisticsRequest.end(statisticsToSend);
}
}*/
});
} }
let reqcounterKillReq = 0; let reqcounterKillReq = 0;

View file

@ -1,5 +1,6 @@
{ {
"version": "Nightly-GitNext", "version": "Nightly-GitNext",
"name": "SVR.JS", "name": "SVR.JS",
"documentationURL": "https://svrjs.org/docs" "documentationURL": "https://svrjs.org/docs",
"statisticsServerCollectEndpoint": "https://statistics.svrjs.org/collect.svr"
} }