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 }