mancala/src/rtmt/rtmt_websocket.ts
2022-05-04 23:42:31 +03:00

71 lines
1.8 KiB
TypeScript

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<String, OnMessage>;
private ws: WebSocket;
constructor() {
this.messageChannels = new Map<String, OnMessage>();
}
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);
}
}
}