import { decode, encode } from "./encode_decode_message"; import { Bytes, OnMessage, RTMT } from "./rtmt"; 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.info("(RTMT) ws has opened"); this.ws = ws; onopen(); }; ws.onclose = () => { console.info("(RTMT) ws has closed"); //this.ws = undefined onClose(); }; ws.onmessage = (event: MessageEvent) => { this.onWebSocketMessage(this, event); }; ws.addEventListener("error", (ev) => { console.error({ ws_error: ev }); onError(ev); }); } sendMessage(channel: string, message: Object) { if (this.ws === undefined) { console.error("(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); rtmt.onMessage(channel, message); } onMessage(channel: string, message: Bytes) { const callback = this.messageChannels.get(channel); if (callback) { callback(message); } else { console.warn("(RTMT) Channel callback not found!" + channel); } } }