2023-06-08 15:45:47 +08:00
|
|
|
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<U extends keyof WebsocketServerEvents>(
|
|
|
|
|
event: U,
|
|
|
|
|
cb: WebsocketServerEvents[U]
|
|
|
|
|
): this
|
|
|
|
|
off<U extends keyof WebsocketServerEvents>(
|
|
|
|
|
event: U,
|
|
|
|
|
cb: WebsocketServerEvents[U]
|
|
|
|
|
): this
|
|
|
|
|
emit<U extends keyof WebsocketServerEvents>(
|
|
|
|
|
event: U,
|
|
|
|
|
...args: Parameters<WebsocketServerEvents[U]>
|
|
|
|
|
): 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())
|
|
|
|
|
})
|
2023-06-10 20:33:39 +08:00
|
|
|
socket.on("chat_message", (data: ExchangeMessageData) => {
|
2023-06-08 15:45:47 +08:00
|
|
|
this.emit("message_response", data)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sendMessageRequest = (data: ExchangeMessageData) => {
|
2023-06-10 20:33:39 +08:00
|
|
|
this.sioServer.emit("chat_message", data)
|
2023-06-08 15:45:47 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
start = () => {
|
|
|
|
|
this.httpServer.listen(this.port, () => {
|
|
|
|
|
console.log(`listening on *:${this.port}`)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stop = () => {
|
|
|
|
|
this.sioServer.close()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default WebsocketServer
|