websocketResolver.js 1.5 KB

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