1
0

main.js 1.6 KB

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