import { decode, encode } from "./encode_decode_message" import { Bytes, OnMessage, RTMT } from "./rtmt" import { context } from '../context'; import { server } from "../service/http_service"; export class RTMTWS implements RTMT { private messageChannels: Map private ws: WebSocket constructor() { this.messageChannels = new Map() } initWebSocket(userKey: string, onopen: () => any, onClose: () => any, onError: (event: Event) => any) { const url = server.wsServerAdress + '?userKey=' + userKey const ws = new WebSocket(url) ws.binaryType = "arraybuffer"; //for firefox ws.onopen = () => { console.log('(RTMT) ws has opened') this.ws = ws onopen() } ws.onclose = () => { console.log('(RTMT) ws has closed') //this.ws = undefined onClose() } ws.onmessage = (event: MessageEvent) => { this.onWebSocketMessage(this, event) } ws.addEventListener("error", ev => { console.log({ ws_error: ev }); onError(ev) }) } sendMessage(channel: string, message: Bytes) { console.log("(RTMT) Sending message to channel " + channel); if (this.ws === undefined) { console.log('(RTMT) ws is undefined') return } const data = encode(channel, message) this.ws.send(data) } listenMessage(channel: string, callback: OnMessage) { this.messageChannels.set(channel, callback) } onWebSocketMessage(rtmt: RTMTWS, event: MessageEvent) { const { channel, message } = decode(event.data) console.log("(RTMT) " + { channel, message }); rtmt.onMessage(channel, message) } onMessage(channel: string, message: Bytes) { const callback = this.messageChannels.get(channel) if (callback) { callback(message) } else { console.log("(RTMT) Channel callback not found!" + channel); } } }