2022-05-04 23:42:31 +03:00
|
|
|
import { decode, encode } from "./encode_decode_message";
|
|
|
|
|
import { Bytes, OnMessage, RTMT } from "./rtmt";
|
2021-07-04 00:45:00 +03:00
|
|
|
import { server } from "../service/http_service";
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2021-06-29 03:28:53 +03:00
|
|
|
export class RTMTWS implements RTMT {
|
2022-05-04 23:42:31 +03:00
|
|
|
private messageChannels: Map<String, OnMessage>;
|
|
|
|
|
private ws: WebSocket;
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
constructor() {
|
|
|
|
|
this.messageChannels = new Map<String, OnMessage>();
|
|
|
|
|
}
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
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();
|
|
|
|
|
};
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
ws.onmessage = (event: MessageEvent) => {
|
|
|
|
|
this.onWebSocketMessage(this, event);
|
|
|
|
|
};
|
2021-06-29 03:28:53 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
ws.addEventListener("error", (ev) => {
|
|
|
|
|
console.error({ ws_error: ev });
|
|
|
|
|
onError(ev);
|
|
|
|
|
});
|
|
|
|
|
}
|
2021-06-29 03:28:53 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
sendMessage(channel: string, message: Object) {
|
|
|
|
|
if (this.ws === undefined) {
|
|
|
|
|
console.error("(RTMT) ws is undefined");
|
|
|
|
|
return;
|
2021-06-27 19:28:55 +03:00
|
|
|
}
|
2022-05-04 23:42:31 +03:00
|
|
|
const data = encode(channel, message);
|
|
|
|
|
this.ws.send(data);
|
|
|
|
|
}
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
listenMessage(channel: string, callback: OnMessage) {
|
|
|
|
|
this.messageChannels.set(channel, callback);
|
|
|
|
|
}
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
onWebSocketMessage(rtmt: RTMTWS, event: MessageEvent) {
|
|
|
|
|
const { channel, message } = decode(event.data);
|
|
|
|
|
rtmt.onMessage(channel, message);
|
|
|
|
|
}
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
onMessage(channel: string, message: Bytes) {
|
|
|
|
|
const callback = this.messageChannels.get(channel);
|
2021-06-27 19:28:55 +03:00
|
|
|
|
2022-05-04 23:42:31 +03:00
|
|
|
if (callback) {
|
|
|
|
|
callback(message);
|
|
|
|
|
} else {
|
|
|
|
|
console.warn("(RTMT) Channel callback not found!" + channel);
|
2021-06-27 19:28:55 +03:00
|
|
|
}
|
2022-05-04 23:42:31 +03:00
|
|
|
}
|
|
|
|
|
}
|