Add Fastify + EJS Templating
This commit is contained in:
parent
3159fc9c0a
commit
724e344cf5
8 changed files with 856 additions and 42 deletions
|
@ -1,5 +1,8 @@
|
|||
{
|
||||
"port": 38195,
|
||||
"ports": {
|
||||
"http": 38194,
|
||||
"ws": 39195
|
||||
},
|
||||
"database": {
|
||||
"address": "localhost",
|
||||
"port": 3306,
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
import { createReader, createWriter, Endian } from "bufferstuff";
|
||||
import { WebSocketServer } from "ws";
|
||||
import Fastify from "fastify";
|
||||
import FastifyView from "@fastify/view";
|
||||
import EJS from "ejs";
|
||||
import Config from "./objects/Config";
|
||||
import FunkyArray from "./objects/FunkyArray";
|
||||
import RemoteUser from "./objects/RemoteUser";
|
||||
|
@ -13,9 +16,36 @@ const users = new FunkyArray<string, RemoteUser>();
|
|||
|
||||
new Database(Config.database.address, Config.database.port, Config.database.username, Config.database.password, Config.database.name);
|
||||
|
||||
const server = new WebSocketServer({
|
||||
port: Config.port
|
||||
}, () => Console.printInfo(`Server listening at ${Config.port}`));
|
||||
const fastify = Fastify({
|
||||
logger: false
|
||||
});
|
||||
|
||||
fastify.register(FastifyView, {
|
||||
engine: {
|
||||
ejs: EJS
|
||||
}
|
||||
})
|
||||
|
||||
fastify.get("/", async (req, res) => {
|
||||
// @ts-ignore
|
||||
return res.view("templates/index.ejs", { });
|
||||
});
|
||||
|
||||
const websocketServer = new WebSocketServer({
|
||||
port: Config.ports.ws
|
||||
}, () => {
|
||||
Console.printInfo(`WebsocketServer listening at ws://localhost:${Config.ports.ws}`);
|
||||
fastify.listen({ port: Config.ports.http }, (err, address) => {
|
||||
if (err) {
|
||||
Console.printError(`Error occured while spinning up fastify:\n${err}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
Console.printInfo(`Fastify listening at ${address.replace("[::1]", "localhost")}`);
|
||||
|
||||
Console.printInfo("MultiProbe is ready to go!");
|
||||
});
|
||||
});
|
||||
|
||||
function sendToAllButSelf(user:RemoteUser, data:Buffer) {
|
||||
users.forEach(otherUser => {
|
||||
|
@ -33,7 +63,7 @@ function sendToAll(user:RemoteUser, data:Buffer) {
|
|||
});
|
||||
}
|
||||
|
||||
server.on("connection", (socket) => {
|
||||
websocketServer.on("connection", (socket) => {
|
||||
const myUUID = crypto.randomUUID();
|
||||
let user:RemoteUser;
|
||||
|
||||
|
@ -97,8 +127,9 @@ server.on("connection", (socket) => {
|
|||
return;
|
||||
}
|
||||
|
||||
if ((Date.now() - user.lastPingReset) >= 1000) {
|
||||
if ((performance.now() - user.lastPingReset) >= 1000) {
|
||||
user.allowedPings = 10;
|
||||
user.lastPingReset = performance.now();
|
||||
}
|
||||
|
||||
if (user.allowedPings > 0) {
|
||||
|
@ -113,4 +144,23 @@ server.on("connection", (socket) => {
|
|||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
let isShuttingDown = false;
|
||||
function shutdown() {
|
||||
if (isShuttingDown) {
|
||||
return;
|
||||
}
|
||||
isShuttingDown = true;
|
||||
|
||||
Console.printInfo("Shutting down...");
|
||||
websocketServer.close(async () => {
|
||||
await fastify.close();
|
||||
Console.cleanup();
|
||||
console.log("Goodbye!");
|
||||
});
|
||||
}
|
||||
|
||||
process.on("SIGQUIT", shutdown);
|
||||
process.on("SIGINT", shutdown);
|
||||
process.on("SIGUSR2", shutdown);
|
|
@ -5,11 +5,15 @@ const config = JSON.parse(readFileSync("./config.json").toString());
|
|||
export default class Config {
|
||||
public constructor() { throw new Error("Static Class"); }
|
||||
|
||||
public static port:number = config.port;
|
||||
|
||||
public static ports:ConfigPorts = config.ports;
|
||||
public static database:ConfigDatabase = config.database;
|
||||
}
|
||||
|
||||
interface ConfigPorts {
|
||||
http: number,
|
||||
ws: number
|
||||
}
|
||||
|
||||
interface ConfigDatabase {
|
||||
address: string,
|
||||
port: number,
|
||||
|
|
786
server/package-lock.json
generated
786
server/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -15,12 +15,16 @@
|
|||
"author": "tgpholly",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fastify/view": "^9.0.0",
|
||||
"bufferstuff": "^1.5.1",
|
||||
"ejs": "^3.1.10",
|
||||
"fastify": "^4.26.2",
|
||||
"hsconsole": "^1.0.2",
|
||||
"mysql2": "^3.9.7",
|
||||
"ws": "^8.16.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/ejs": "^3.1.5",
|
||||
"@types/node": "^20.12.7",
|
||||
"@types/ws": "^8.5.10",
|
||||
"@vercel/ncc": "^0.38.1",
|
||||
|
|
4
server/templates/base/footer.ejs
Normal file
4
server/templates/base/footer.ejs
Normal file
|
@ -0,0 +1,4 @@
|
|||
</div>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js" integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
</body>
|
||||
</html>
|
26
server/templates/base/header.ejs
Normal file
26
server/templates/base/header.ejs
Normal file
|
@ -0,0 +1,26 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" integrity="sha512-jnSuA4Ss2PkkikSOLtYs8BlYIeeIK1h99ty4YfvRPAlzr377vr3CXDb7sb7eEEBYjDtcYj+AjBH3FLv5uSJuXg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js" integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg bg-body-tertiary">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="/">MultiProbe</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="container pt-3">
|
3
server/templates/index.ejs
Normal file
3
server/templates/index.ejs
Normal file
|
@ -0,0 +1,3 @@
|
|||
<%- include("base/header") -%>
|
||||
<h1>Hello world!</h1>
|
||||
<%- include("base/footer") -%>
|
Loading…
Reference in a new issue