1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
const lang = require("../../lang");
const toasts = require("./toasts");
const launcher = require("./launcher");
const set_buttons = require("./set_buttons");
const ipcRenderer = require("electron").ipcRenderer;
// invokes `requests.get()` from `src/modules/requests.js` through the
// main process, and returns the output
let request = async (...args) => {
return await ipcRenderer.invoke("request", ...args);
}
// invokes `requests.check()` from `src/modules/requests.js` through the
// main process, and returns the output
request.check = async (...args) => {
return await ipcRenderer.invoke("request-check", ...args);
}
request.delete_cache = () => {
ipcRenderer.send("delete-request-cache");
}
// does `request.check(...args)` and shows toast if the check failed,
// using `name` inside the toast message
request.check_with_toasts = async (name, ...args) => {
// perform check
let can_connect = (
await request.check(...args)
).succeeded.length;
// show toast, as the check failed
if (! can_connect) {
toasts.show({
timeout: 10000,
scheme: "error",
title: lang("gui.toast.title.failed_to_connect"),
description: lang("gui.toast.desc.failed_to_connect").replaceAll("%s", name)
})
}
return can_connect;
}
// keeps track of whether we've already sent a toast since we last went
// offline, to prevent multiple toasts
let sent_error_toast = false;
// shows or hides offline icon, and shows toast depending on `is_online`
let state_action = async (is_online) => {
if (is_online) {
// hide offline icon
sent_error_toast = false;
offline.classList.add("hidden");
// re-enable buttons that require internet
set_buttons(
true, false,
document.querySelectorAll(".requires-internet")
)
await launcher.check_servers();
serverstatus.style.opacity = "1.0";
} else {
// show toast
if (! sent_error_toast) {
sent_error_toast = true;
ipcRenderer.send("no-internet");
}
// show offline icon
offline.classList.remove("hidden");
// disable buttons that require internet
set_buttons(
false, false,
document.querySelectorAll(".requires-internet")
)
serverstatus.style.opacity = "0.0";
// close mod browser
try {
require("./browser").toggle(false);
} catch(err) {}
}
}
setTimeout(() => state_action(navigator.onLine), 100);
window.addEventListener("online", () => state_action(navigator.onLine));
window.addEventListener("offline", () => state_action(navigator.onLine));
// checks a list of endpoints/domains we need to be functioning for a
// lot of the WAN functionality
let check_endpoints = async () => {
// if we're not online according to the navigator, it's highly
// unlikely the endpoints will succeed
if (! navigator.onLine) {
return state_action(false);
}
// check endpoints
let status = await request.check([
"https://github.com",
"https://northstar.tf",
"https://thunderstore.io"
])
// handle result of check
state_action(!! status.succeeded.length);
}
// check endpoints on startup
setTimeout(check_endpoints, 100);
// check endpoints every 30 seconds
setInterval(check_endpoints, 30000);
module.exports = request;
|