113 lines
3.3 KiB
JavaScript
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")
|