import { createServer, Server as HTTPServer } from "http" import { Server as SocketIOServer, Socket } from "socket.io" import express from "express" import EventEmitter from "events" import { ExchangeMessageData } from "../types/index.mjs" interface WebsocketServerEvents { message_response: (data: ExchangeMessageData) => void } declare interface WebsocketServer { on( event: U, cb: WebsocketServerEvents[U] ): this off( event: U, cb: WebsocketServerEvents[U] ): this emit( event: U, ...args: Parameters ): boolean } class WebsocketServer extends EventEmitter { constructor(port: number) { super() const app = express() const httpServer = createServer(app) const sioServer = new SocketIOServer(httpServer, { maxHttpBufferSize: 50 * 1024 * 1024, pingInterval: 25000, pingTimeout: 20000, }) sioServer.on("connect", this.handleConnect) this.port = port this.httpServer = httpServer this.sioServer = sioServer } private port: number private httpServer: HTTPServer private sioServer: SocketIOServer private handleConnect = (socket: Socket) => { console.log("handleConnect", socket.id) socket.on("disconnect", (reason: string) => { console.log("socket disconnect", reason, Date.now()) }) socket.on("message_response", (data: ExchangeMessageData) => { this.emit("message_response", data) }) } sendMessageRequest = (data: ExchangeMessageData) => { this.sioServer.emit("message_request", data) } start = () => { this.httpServer.listen(this.port, () => { console.log(`listening on *:${this.port}`) }) } stop = () => { this.sioServer.close() } } export default WebsocketServer