main.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. const config = new InterpreterConfig(false);
  2. function main() {
  3. let root = window.document.getElementById("main");
  4. if (root != null) {
  5. window.ipc = new IPC(root);
  6. }
  7. }
  8. class IPC {
  9. constructor(root) {
  10. window.interpreter.initialize(root);
  11. const ws = new WebSocket(WS_ADDR);
  12. ws.binaryType = "arraybuffer";
  13. function ping() {
  14. ws.send("__ping__");
  15. }
  16. ws.onopen = () => {
  17. // we ping every 30 seconds to keep the websocket alive
  18. setInterval(ping, 30000);
  19. ws.send(window.interpreter.serializeIpcMessage("initialize"));
  20. };
  21. ws.onerror = (err) => {
  22. // todo: retry the connection
  23. };
  24. ws.onmessage = (message) => {
  25. const u8view = new Uint8Array(message.data);
  26. const binaryFrame = u8view[0] == 1;
  27. const messageData = message.data.slice(1)
  28. // The first byte tells the shim if this is a binary of text frame
  29. if (binaryFrame) {
  30. // binary frame
  31. run_from_bytes(messageData);
  32. }
  33. else {
  34. // text frame
  35. let decoder = new TextDecoder("utf-8");
  36. // Using decode method to get string output
  37. let str = decoder.decode(messageData);
  38. // Ignore pongs
  39. if (str != "__pong__") {
  40. const event = JSON.parse(str);
  41. switch (event.type) {
  42. case "query":
  43. Function("Eval", `"use strict";${event.data};`)();
  44. break;
  45. }
  46. }
  47. }
  48. };
  49. this.ws = ws;
  50. }
  51. postMessage(msg) {
  52. this.ws.send(msg);
  53. }
  54. }
  55. main();