import { decode, encode } from "./encode_decode_message" import { Bytes, OnMessage, RTMT } from "./rtmt" import WebSocket from "ws" import * as http from 'http'; export class RTMTWS implements RTMT { private messageChannels: Map private wsServer: WebSocket.Server | null public clients = new Map() constructor() { this.messageChannels = new Map() this.wsServer = null } initWebSocket(server: http.Server, onopen: () => any) { const wsServer = new WebSocket.Server({ server }) this.clients = new Map() wsServer.on("connection", (ws: WebSocket, req: Request) => { console.log(req.url); const regexResult = req.url.split(RegExp("\/\?userKey=")); const clientID = regexResult[1] console.log(regexResult); this.clients.set(clientID, ws) ws.on("message", (messageBytes: Bytes) => { console.log('received: %s', messageBytes); this.onWebSocketMessage("0", messageBytes) }) ws.on("close", (code: number, reason: string) => { console.log("WS Closed! code : " + code + " reason : " + reason); this.clients.delete(clientID) }) ws.on("error", (err: Error) => { console.log("WS Closed with error! error : " + err.message); this.clients.delete(clientID) }) }) } sendMessage(clientID: string, channel: string, message: Bytes) { if (this.wsServer) { const client = this.clients.get(clientID) if (client) { const data = encode({ channel: channel, data: message }) console.log("(RTMT) Sending message to channel " + channel); client.send(data) } else { console.log("Client not connected!"); } } else { console.log('ws is undefined') } } listenMessage(channel: string, callback: OnMessage) { this.messageChannels.set(channel, callback) } onWebSocketMessage(clientID: string, messageBytes: Bytes) { const message = decode(messageBytes) this.onMessage(clientID, message.channel, message.data) } onMessage(clientID: string, channel: string, message: Int8Array) { const callback = this.messageChannels.get(channel) if (callback) { callback(clientID, message) } else { console.log("Channel callback not found! " + channel); } } }