mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 04:59:38 +08:00
126 lines
2.9 KiB
JavaScript
126 lines
2.9 KiB
JavaScript
/*
|
|
_ __ _ __
|
|
| | / /___ _(_) /____
|
|
| | /| / / __ `/ / / ___/
|
|
| |/ |/ / /_/ / / (__ )
|
|
|__/|__/\__,_/_/_/____/
|
|
The electron alternative for Go
|
|
(c) Lea Anthony 2019-present
|
|
*/
|
|
/* jshint esversion: 6 */
|
|
|
|
import {log} from "./log";
|
|
import Overlay from "./Overlay.svelte";
|
|
import {hideOverlay, showOverlay} from "./store";
|
|
|
|
let components = {};
|
|
|
|
let wailsInvokeInternal = null;
|
|
let messageQueue = [];
|
|
|
|
window.WailsInvoke = (message) => {
|
|
if (!wailsInvokeInternal) {
|
|
console.log("Queueing: " + message);
|
|
messageQueue.push(message);
|
|
return;
|
|
}
|
|
wailsInvokeInternal(message);
|
|
};
|
|
|
|
window.addEventListener('DOMContentLoaded', () => {
|
|
components.overlay = new Overlay({
|
|
target: document.body,
|
|
anchor: document.querySelector('#wails-spinner'),
|
|
});
|
|
});
|
|
|
|
let websocket = null;
|
|
let connectTimer;
|
|
|
|
window.onbeforeunload = function () {
|
|
if (websocket) {
|
|
websocket.onclose = function () {
|
|
};
|
|
websocket.close();
|
|
websocket = null;
|
|
}
|
|
};
|
|
|
|
// ...and attempt to connect
|
|
connect();
|
|
|
|
function setupIPCBridge() {
|
|
wailsInvokeInternal = (message) => {
|
|
websocket.send(message);
|
|
};
|
|
for (let i = 0; i < messageQueue.length; i++) {
|
|
console.log("sending queued message: " + messageQueue[i]);
|
|
window.WailsInvoke(messageQueue[i]);
|
|
}
|
|
messageQueue = [];
|
|
}
|
|
|
|
// Handles incoming websocket connections
|
|
function handleConnect() {
|
|
log('Connected to backend');
|
|
hideOverlay();
|
|
setupIPCBridge();
|
|
clearInterval(connectTimer);
|
|
websocket.onclose = handleDisconnect;
|
|
websocket.onmessage = handleMessage;
|
|
}
|
|
|
|
// Handles websocket disconnects
|
|
function handleDisconnect() {
|
|
log('Disconnected from backend');
|
|
websocket = null;
|
|
showOverlay();
|
|
connect();
|
|
}
|
|
|
|
function _connect() {
|
|
if (websocket == null) {
|
|
websocket = new WebSocket('ws://' + window.location.host + '/wails/ipc');
|
|
websocket.onopen = handleConnect;
|
|
websocket.onerror = function (e) {
|
|
e.stopImmediatePropagation();
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
websocket = null;
|
|
return false;
|
|
};
|
|
}
|
|
}
|
|
|
|
// Try to connect to the backend every .5s
|
|
function connect() {
|
|
_connect();
|
|
connectTimer = setInterval(_connect, 500);
|
|
}
|
|
|
|
function handleMessage(message) {
|
|
|
|
if (message.data === "reload") {
|
|
window.runtime.WindowReload();
|
|
return;
|
|
}
|
|
if (message.data === "reloadapp") {
|
|
window.runtime.WindowReloadApp()
|
|
return;
|
|
}
|
|
|
|
// As a bridge we ignore js and css injections
|
|
switch (message.data[0]) {
|
|
// Notifications
|
|
case 'n':
|
|
window.wails.EventsNotify(message.data.slice(1));
|
|
break;
|
|
case 'c':
|
|
const callbackData = message.data.slice(1);
|
|
window.wails.Callback(callbackData);
|
|
break;
|
|
default:
|
|
log('Unknown message: ' + message.data);
|
|
}
|
|
}
|