diff --git a/server/src/events/server_info.ts b/server/src/events/server_info.ts new file mode 100644 index 0000000..a84fd76 --- /dev/null +++ b/server/src/events/server_info.ts @@ -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; \ No newline at end of file diff --git a/server/src/main.ts b/server/src/main.ts new file mode 100644 index 0000000..30d1b3c --- /dev/null +++ b/server/src/main.ts @@ -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(); \ No newline at end of file diff --git a/server/src/types/Config.d.ts b/server/src/types/Config.d.ts new file mode 100644 index 0000000..c85000f --- /dev/null +++ b/server/src/types/Config.d.ts @@ -0,0 +1,8 @@ +interface IConfig { + server: { + port: number; + }; + log: { + level: "silly" | "trace" | "debug" | "info" | "warn" | "error" | "fatal"; + }; +} \ No newline at end of file diff --git a/server/src/types/WebsocketEvent.d.ts b/server/src/types/WebsocketEvent.d.ts new file mode 100644 index 0000000..c1fce20 --- /dev/null +++ b/server/src/types/WebsocketEvent.d.ts @@ -0,0 +1,6 @@ +import { Server, Socket } from "socket.io"; + +export interface WebsocketEvent { + name: string; + handler: (io: Server, socket: Socket, data: any) => any; +} \ No newline at end of file diff --git a/server/src/websocket.ts b/server/src/websocket.ts new file mode 100644 index 0000000..795c3f5 --- /dev/null +++ b/server/src/websocket.ts @@ -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); +}; \ No newline at end of file