websocketResolver.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const PORT = 3821
  2. const HOST = location.hostname
  3. const PATH = new URLSearchParams(location.search).get("room")
  4. if (PATH === "" || PATH === undefined || PATH === null) {
  5. window.location = "/";
  6. }
  7. export class Resolver {
  8. registerMap = new Map()
  9. register(message, handler) {
  10. console.log("register", message, handler)
  11. this.registerMap.set(message, handler)
  12. }
  13. unregister(message) {
  14. return this.registerMap.delete(message)
  15. }
  16. resolve(data, websocket) {
  17. const message = JSON.parse(data)
  18. if (typeof message != "object") {
  19. console.error(`Received message is not a json object but a ${typeof message}`, message)
  20. return
  21. }
  22. if (!("__message" in message)) {
  23. console.error(`Received message does not have required '__message' field.`, message)
  24. return
  25. }
  26. const message_type = message["__message"]
  27. if (!(this.registerMap.has(message_type))) {
  28. console.error(`No handler for message type ${message_type}.`, message)
  29. return
  30. }
  31. if ("__body" in message) {
  32. this.registerMap.get(message_type)(websocket, message["__body"])
  33. } else {
  34. this.registerMap.get(message_type)(websocket, null)
  35. }
  36. }
  37. connectSocket() {
  38. const self = this;
  39. const socket = new WebSocket(`wss://${HOST}:${PORT}/${PATH}`)
  40. function handler(event) {
  41. self.resolve(event.data, socket)
  42. }
  43. socket.addEventListener('message', handler)
  44. return socket
  45. }
  46. }
  47. export function makeMessage(messageType, body) {
  48. return JSON.stringify({ "__message": messageType, "__body": body })
  49. }