multiplayer-test/server/main.js
2024-08-30 03:56:03 +01:00

113 lines
3.3 KiB
JavaScript

import http from "http";
import path from "path";
import fs, { openSync } from "fs";
import Log from "../common/log.js";
import { init as initWS } from "./ws.js";
var PORT = 3000;
var mime_types = {
'html': 'text/html',
'css': 'text/css',
'js': 'application/javascript',
'png': 'image/png',
'jpg': 'image/jpg',
'gif': 'image/gif',
};
process.argv.forEach((arg, index) => {
if (index < 2) return;
if (!arg.startsWith('-')) return;
switch (arg.substring(1)) {
case "port":
if (process.argv.length < index + 2) {
Log.error("FATAL: -port was supplied with no arguments.");
exit(1);
}
var val = process.argv[index + 1];
if (val.startsWith('-')) {
Log.error("FATAL: -port was supplied with no arguments.");
exit(1);
}
var port = Number(val);
if (isNaN(port)) {
Log.error("FATAL: -port was supplied with invalid arguments.");
exit(1);
}
PORT = port;
break;
}
});
const server = http.createServer(async (req, res) => {
var code = await new Promise((resolve) => {
if (req.method !== "GET") {
res.writeHead(501, {
"Content-Type": "text/plain",
"Server": "ari's awesome server"
});
res.end("Not Implemented");
return resolve(501);
}
// find the file
var filepath = path.join("client", req.url);
if (req.url.startsWith("/common/")) {
filepath = path.join("common", req.url.slice(8));
}
if (filepath.endsWith('/') || filepath.endsWith('\\')) {
filepath = path.join(filepath, "index.html");
}
if (!fs.existsSync(filepath)) {
res.writeHead(404, {
"Content-Type": "text/plain",
"Server": "ari's awesome server"
});
res.end("Not Found");
return resolve(404);
}
try {
var ext = path.extname(filepath).slice(1);
var mime_type = mime_types[ext] || "application/octet-stream";
const stream = fs.createReadStream(filepath);
res.writeHead(200, {
"Content-Type": mime_type,
"Server": "ari's awesome server"
});
stream.pipe(res);
return resolve(200);
stream.on("open", () => {
res.writeHead(200, {
"Content-Type": mime_type,
"Server": "ari's awesome server"
});
stream.pipe(res);
res.end();
return resolve(200);
});
stream.on("error", error => {
throw error;
});
} catch (error) {
Log.error(error);
res.writeHead(500, {
"Content-Type": "text/plain",
"Server": "ari's awesome server"
});
res.end("Internal Server Error");
return resolve(500);
}
});
Log.info(`${code} - ${req.method} ${req.url}`);
});
initWS(server);
server.on("listening", () => {
Log.info("server listening on port " + PORT);
});
server.listen(PORT, "0.0.0.0")