Create a super primitive websocket server

This commit is contained in:
Oliver-Akins 2022-01-04 20:30:11 -07:00
parent 7e5a4ffe86
commit cb09d4a9df
5 changed files with 90 additions and 0 deletions

View file

@ -0,0 +1,15 @@
import { WebsocketEvent } from "../types/WebsocketEvent";
import {
IServerInfoRequest,
IServerInfoResponse
} from "common";
const data: WebsocketEvent = {
name: "in:server.info",
handler(io, socket, data: IServerInfoRequest): IServerInfoResponse {
return {
version: "0.1",
};
},
};
export default data;

26
server/src/main.ts Normal file
View file

@ -0,0 +1,26 @@
import startWebsocketServer from "./websocket";
import { Logger } from "tslog";
import toml from "toml";
import fs from "fs";
// load the config
try {
var configData = toml.parse(fs.readFileSync("config.toml", "utf-8"));
} catch {
console.error("Can't find config file. Exiting");
process.exit(1);
};
export const config: IConfig = configData;
// Define the logger
export const log = new Logger({
displayFilePath: "hidden",
displayFunctionName: false,
displayDateTime: true,
displayLoggerName: false,
displayLogLevel: true,
minLevel: config.log.level,
});
startWebsocketServer();

8
server/src/types/Config.d.ts vendored Normal file
View file

@ -0,0 +1,8 @@
interface IConfig {
server: {
port: number;
};
log: {
level: "silly" | "trace" | "debug" | "info" | "warn" | "error" | "fatal";
};
}

6
server/src/types/WebsocketEvent.d.ts vendored Normal file
View file

@ -0,0 +1,6 @@
import { Server, Socket } from "socket.io";
export interface WebsocketEvent {
name: string;
handler: (io: Server, socket: Socket, data: any) => any;
}

35
server/src/websocket.ts Normal file
View file

@ -0,0 +1,35 @@
import { WebsocketEvent } from "./types/WebsocketEvent";
import { log, config } from "./main";
import { Server } from "socket.io";
import glob from "glob";
import path from "path";
export default async function() {
log.info("Starting socket.io server...");
let events: WebsocketEvent[] = [];
let eventFiles = glob.sync(
"events/**/!(*.map)",
{ cwd: __dirname, nodir: true }
);
for (var eventFile of eventFiles) {
let event = (await import(path.join(__dirname, eventFile))).default;
log.debug(`Identified event "${event.name}" from ${eventFile}`);
events.push(event);
};
const io = new Server();
io.on("connection", (socket) => {
log.debug(`Socket connected with ID: ${socket.id}`);
for (var event of events) {
socket.on(
event.name,
(data: any) => event.handler(io, socket, data)
);
};
});
io.listen(config.server.port);
};