import express from "express"; import cors from "cors"; import * as http from "http"; import { EventEmitter } from "events"; import { Server, Socket } from "socket.io"; const pendingMessageEvents: { [id: string]: EventEmitter } = {}; let messageId = 0; export class MSeriesServer { public static readonly PORT: number = 5000; private app: express.Application; private server: http.Server; private io: Server; private port: string | number; constructor() { this.createApp(); this.config(); this.createServer(); this.sockets(); this.listen(); } private createApp(): void { this.app = express(); this.app.use(cors()); } private createServer(): void { this.server = http.createServer(this.app); } private config(): void { this.port = process.env.PORT || MSeriesServer.PORT; } private sockets(): void { this.io = new Server(this.server, { cors: { origin: '*', }, serveClient: false, pingTimeout: 1 * 60 * 1000, maxHttpBufferSize:1e9, }); } private listen(): void { this.io.on("connect", (socket: Socket) => { console.log("Connected client on port %s.", this.port); socket.on("message", (m: { id: string, payload: string }) => { console.log(`[server](message): ${m.id}`); pendingMessageEvents[m.id].emit("response", m.payload); }); socket.on("disconnect", (reason) => { console.log("Client disconnected: " + reason); }); }); this.server.listen(this.port, () => { console.log("Running server on port %s", this.port); }); } public getApp(): express.Application { return this.app; } public sendMessage(msg: string) { const currentMessageId = messageId++; return new Promise((resolve, reject) => { console.log(`[server] send message: ${currentMessageId}`); this.io.emit("message", { id: currentMessageId, payload: msg }); pendingMessageEvents[currentMessageId] = new EventEmitter(); pendingMessageEvents[currentMessageId].on("response", (response) => { resolve(response); }) }) } }