51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import Logger from "../Logger";
|
|
import SessionManager from "../SessionManager";
|
|
import ClientSet from "./ClientSet";
|
|
|
|
const WebSocket = require("ws");
|
|
|
|
const WS_SERVER_PORT: number = Number(process.env.WS_SERVER_PORT) || 8191;
|
|
|
|
export class WSServer {
|
|
private readonly clients: ClientSet[];
|
|
private readonly unknownClients: any[];
|
|
private readonly server: any;
|
|
private readonly logger: Logger;
|
|
private readonly sessionManagers: SessionManager[];
|
|
|
|
constructor(sessionManagers: SessionManager[]) {
|
|
this.clients = [];
|
|
this.unknownClients = [];
|
|
this.server = new WebSocket.Server({port: WS_SERVER_PORT});
|
|
this.sessionManagers = sessionManagers;
|
|
this.logger = new Logger("WSServer");
|
|
this.server.on('connection', this.eventOnConnection.bind(this));
|
|
this.logger.log1(`WSServer listening at ws://localhost:${WS_SERVER_PORT}`);
|
|
}
|
|
|
|
private eventOnConnection(ws: WebSocket): void {
|
|
this.logger.log1("New connection");
|
|
this.unknownClients.push(ws);
|
|
// @ts-ignore
|
|
ws.on('message', this.eventOnMessage.bind(this, ws));
|
|
// @ts-ignore
|
|
ws.on('close', this.eventOnClose.bind(this, ws));
|
|
}
|
|
|
|
private eventOnMessage(ws: any, message: string): void {
|
|
this.logger.log1("New message");
|
|
message = String(message);
|
|
this.unknownClients.splice(this.unknownClients.indexOf(ws), 1);
|
|
let clientSet: ClientSet | undefined = this.clients.find((clientSet: ClientSet) => clientSet.identifier === message);
|
|
if (!clientSet) {
|
|
clientSet = new ClientSet(message, this.sessionManagers);
|
|
this.clients.push(clientSet);
|
|
}
|
|
clientSet.add(ws);
|
|
}
|
|
|
|
private eventOnClose(ws: any): void {
|
|
this.logger.log1("Connection closed");
|
|
this.unknownClients.splice(this.unknownClients.indexOf(ws), 1);
|
|
}
|
|
} |