Create a super primitive websocket server
This commit is contained in:
parent
7e5a4ffe86
commit
cb09d4a9df
5 changed files with 90 additions and 0 deletions
15
server/src/events/server_info.ts
Normal file
15
server/src/events/server_info.ts
Normal 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
26
server/src/main.ts
Normal 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
8
server/src/types/Config.d.ts
vendored
Normal 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
6
server/src/types/WebsocketEvent.d.ts
vendored
Normal 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
35
server/src/websocket.ts
Normal 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);
|
||||||
|
};
|
||||||
Loading…
Add table
Add a link
Reference in a new issue