mancala/src/rtmt/rtmt_websocket.ts

69 lines
2.1 KiB
TypeScript
Raw Normal View History

2021-06-27 19:28:55 +03:00
import { decode, encode } from "./encode_decode_message"
2021-06-29 03:28:53 +03:00
import { Bytes, OnMessage, RTMT } from "./rtmt"
2021-06-27 19:28:55 +03:00
import { context } from '../context';
import { wsServerAdress } from "../service/http_service";
2021-06-29 03:28:53 +03:00
export class RTMTWS implements RTMT {
2021-06-27 19:28:55 +03:00
2021-06-29 03:28:53 +03:00
private messageChannels: Map<String, OnMessage>
private ws: WebSocket
2021-06-27 19:28:55 +03:00
constructor() {
this.messageChannels = new Map<String, OnMessage>()
}
2021-07-02 23:13:38 +03:00
initWebSocket(userKey: string, onopen: () => any, onClose: () => any, onError: (event: Event) => any) {
2021-06-29 03:28:53 +03:00
const url = 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
2021-07-02 23:13:38 +03:00
onClose()
2021-06-29 03:28:53 +03:00
}
ws.onmessage = (event: MessageEvent) => {
this.onWebSocketMessage(this, event)
}
ws.addEventListener("error", ev => {
console.log({ ws_error: ev });
2021-07-02 23:13:38 +03:00
onError(ev)
2021-06-27 19:28:55 +03:00
})
}
2021-06-29 03:28:53 +03:00
sendMessage(channel: string, message: Bytes) {
console.log("(RTMT) Sending message to channel " + channel);
if (this.ws === undefined) {
console.log('(RTMT) ws is undefined')
2021-06-27 19:28:55 +03:00
return
}
const data = encode(channel, message)
this.ws.send(data)
}
2021-06-29 03:28:53 +03:00
listenMessage(channel: string, callback: OnMessage) {
2021-06-27 19:28:55 +03:00
this.messageChannels.set(channel, callback)
}
2021-06-29 03:28:53 +03:00
onWebSocketMessage(rtmt: RTMTWS, event: MessageEvent) {
2021-06-27 19:28:55 +03:00
const { channel, message } = decode(event.data)
2021-06-29 03:28:53 +03:00
console.log("(RTMT) " + { channel, message });
2021-06-27 19:28:55 +03:00
rtmt.onMessage(channel, message)
}
2021-06-29 03:28:53 +03:00
onMessage(channel: string, message: Bytes) {
2021-06-27 19:28:55 +03:00
const callback = this.messageChannels.get(channel)
2021-06-29 03:28:53 +03:00
if (callback) {
2021-06-27 19:28:55 +03:00
callback(message)
2021-06-29 03:28:53 +03:00
} else {
console.log("(RTMT) Channel callback not found!" + channel);
2021-06-27 19:28:55 +03:00
}
}
}