diff options
-rw-r--r-- | src/app/js/request.js | 61 | ||||
-rw-r--r-- | src/modules/requests.js | 48 |
2 files changed, 105 insertions, 4 deletions
diff --git a/src/app/js/request.js b/src/app/js/request.js index b9b5081..a8d4dd3 100644 --- a/src/app/js/request.js +++ b/src/app/js/request.js @@ -1,18 +1,27 @@ const ipcRenderer = require("electron").ipcRenderer; +let sent_error_toast = false; + let update_status = () => { // if offline, show toast and offline icon if (! navigator.onLine) { - ipcRenderer.send("no-internet"); + if (! sent_error_toast) { + sent_error_toast = true; + ipcRenderer.send("no-internet"); + } + offline.classList.remove("hidden"); - } else { // remove offline icon - offline.classList.add("hidden"); + return; } + + // remove offline icon + offline.classList.add("hidden"); + sent_error_toast = false; } +update_status(); window.addEventListener("online", update_status); window.addEventListener("offline", update_status); -update_status(); // invokes `requests.get()` from `src/modules/requests.js` through the // main process, and returns the output @@ -20,8 +29,52 @@ 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"); } +// 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) { + if (! sent_error_toast) { + sent_error_toast = true; + ipcRenderer.send("no-internet"); + } + + return offline.classList.remove("hidden"); + } + + // check endpoints + let status = await request.check([ + "https://github.com", + "https://northstar.tf", + "https://thunderstore.io" + ]) + + // if just 1 endpoint succeeded, we probably have internet + if (status.succeeded.length) { + sent_error_toast = false; + offline.classList.add("hidden"); + } else { // no endpoint succeeded! + if (! sent_error_toast) { + sent_error_toast = true; + ipcRenderer.send("no-internet"); + } + + offline.classList.remove("hidden"); + } +}; check_endpoints(); + +// check endpoints every 30 seconds +setInterval(check_endpoints, 30000); + module.exports = request; diff --git a/src/modules/requests.js b/src/modules/requests.js index dac3a4f..ffa57c6 100644 --- a/src/modules/requests.js +++ b/src/modules/requests.js @@ -25,6 +25,15 @@ ipcMain.handle("request", async (e, ...args) => { return res; }) +ipcMain.handle("request-check", async (_, ...args) => { + let res = false; + + try { + res = await requests.check(...args); + }catch(err) {} + + return res; +}) // updates `cache_dir` and `cache_file` function set_paths() { @@ -244,4 +253,43 @@ requests.get = (host, path, cache_key, ignore_max_time_when_offline = true, max_ }) } +// checks whether a list of `endpoints` can be contacted +requests.check = async (endpoints) => { + // turn `endpoints` into an array, if it isn't already + if (typeof endpoints == "string") { + endpoints = [endpoints]; + } + + // list of what failed and succeeded, will be returned later + let res = { + failed: [], + succeeded: [] + } + + // run through all the endpoints + for (let endpoint of endpoints) { + let req; + + // attempt to do a request + try { + req = await fetch(endpoint); + } catch(err) { // something went wrong! + res.failed.push(endpoint); + continue; + } + + // if we're within the `200-299` response code range, we + // consider it a success + if (req.status < 300 && req.status >= 200) { + res.succeeded.push(endpoint); + continue; + } + + // we failed! + res.failed.push(endpoint); + } + + return res; +} + module.exports = requests; |