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