summary refs log tree commit diff
path: root/src/gateway/Server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/gateway/Server.ts')
-rw-r--r--src/gateway/Server.ts62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/gateway/Server.ts b/src/gateway/Server.ts
new file mode 100644
index 00000000..82fbeba2
--- /dev/null
+++ b/src/gateway/Server.ts
@@ -0,0 +1,62 @@
+import dotenv from "dotenv";
+dotenv.config();
+import { closeDatabase, Config, getOrInitialiseDatabase, initEvent } from "@fosscord/util";
+import ws from "ws";
+import { Connection } from "./events/Connection";
+import http from "http";
+
+export class Server {
+	public ws: ws.Server;
+	public port: number;
+	public server: http.Server;
+	public production: boolean;
+
+	constructor({
+		port,
+		server,
+		production,
+	}: {
+		port: number;
+		server?: http.Server;
+		production?: boolean;
+	}) {
+		this.port = port;
+		this.production = production || false;
+
+		if (server) this.server = server;
+		else {
+			this.server = http.createServer(function (req, res) {
+				res.writeHead(200).end("Online");
+			});
+		}
+
+		this.server.on("upgrade", (request, socket, head) => {
+			// @ts-ignore
+			this.ws.handleUpgrade(request, socket, head, (socket) => {
+				this.ws.emit("connection", socket, request);
+			});
+		});
+
+		this.ws = new ws.Server({
+			maxPayload: 4096,
+			noServer: true,
+		});
+		this.ws.on("connection", Connection);
+		this.ws.on("error", console.error);
+	}
+
+	async start(): Promise<void> {
+		await getOrInitialiseDatabase();
+		await Config.init();
+		await initEvent();
+		if (!this.server.listening) {
+			this.server.listen(this.port);
+			console.log(`[Gateway] online on 0.0.0.0:${this.port}`);
+		}
+	}
+
+	async stop() {
+		closeDatabase();
+		this.server.close();
+	}
+}