github.com/secoba/wails/v2@v2.6.4/internal/frontend/runtime/dev/main.js (about)

     1  /*
     2   _       __      _ __
     3  | |     / /___ _(_) /____
     4  | | /| / / __ `/ / / ___/
     5  | |/ |/ / /_/ / / (__  )
     6  |__/|__/\__,_/_/_/____/
     7  The electron alternative for Go
     8  (c) Lea Anthony 2019-present
     9  */
    10  /* jshint esversion: 6 */
    11  
    12  import {log} from "./log";
    13  import Overlay from "./Overlay.svelte";
    14  import {hideOverlay, showOverlay} from "./store";
    15  
    16  let components = {};
    17  
    18  let wailsInvokeInternal = null;
    19  let messageQueue = [];
    20  
    21  window.WailsInvoke = (message) => {
    22      if (!wailsInvokeInternal) {
    23          console.log("Queueing: " + message);
    24          messageQueue.push(message);
    25          return;
    26      }
    27      wailsInvokeInternal(message);
    28  };
    29  
    30  window.addEventListener('DOMContentLoaded', () => {
    31      components.overlay = new Overlay({
    32          target: document.body,
    33          anchor: document.querySelector('#wails-spinner'),
    34      });
    35  });
    36  
    37  let websocket = null;
    38  let connectTimer;
    39  
    40  window.onbeforeunload = function () {
    41      if (websocket) {
    42          websocket.onclose = function () {
    43          };
    44          websocket.close();
    45          websocket = null;
    46      }
    47  };
    48  
    49  // ...and attempt to connect
    50  connect();
    51  
    52  function setupIPCBridge() {
    53      wailsInvokeInternal = (message) => {
    54          websocket.send(message);
    55      };
    56      for (let i = 0; i < messageQueue.length; i++) {
    57          console.log("sending queued message: " + messageQueue[i]);
    58          window.WailsInvoke(messageQueue[i]);
    59      }
    60      messageQueue = [];
    61  }
    62  
    63  // Handles incoming websocket connections
    64  function handleConnect() {
    65      log('Connected to backend');
    66      hideOverlay();
    67      setupIPCBridge();
    68      clearInterval(connectTimer);
    69      websocket.onclose = handleDisconnect;
    70      websocket.onmessage = handleMessage;
    71  }
    72  
    73  // Handles websocket disconnects
    74  function handleDisconnect() {
    75      log('Disconnected from backend');
    76      websocket = null;
    77      showOverlay();
    78      connect();
    79  }
    80  
    81  function _connect() {
    82      if (websocket == null) {
    83          websocket = new WebSocket('ws://' + window.location.host + '/wails/ipc');
    84          websocket.onopen = handleConnect;
    85          websocket.onerror = function (e) {
    86              e.stopImmediatePropagation();
    87              e.stopPropagation();
    88              e.preventDefault();
    89              websocket = null;
    90              return false;
    91          };
    92      }
    93  }
    94  
    95  // Try to connect to the backend every .5s
    96  function connect() {
    97      _connect();
    98      connectTimer = setInterval(_connect, 500);
    99  }
   100  
   101  function handleMessage(message) {
   102  
   103      if (message.data === "reload") {
   104          window.runtime.WindowReload();
   105          return;
   106      }
   107      if (message.data === "reloadapp") {
   108          window.runtime.WindowReloadApp()
   109          return;
   110      }
   111  
   112      // As a bridge we ignore js and css injections
   113      switch (message.data[0]) {
   114          // Notifications
   115          case 'n':
   116              window.wails.EventsNotify(message.data.slice(1));
   117              break;
   118          case 'c':
   119              const callbackData = message.data.slice(1);
   120              window.wails.Callback(callbackData);
   121              break;
   122          default:
   123              log('Unknown message: ' + message.data);
   124      }
   125  }