From 5e3115fb23c4746d728070298539f5ffac9309fa Mon Sep 17 00:00:00 2001 From: Ada Werefox Date: Tue, 16 Apr 2024 18:01:42 -0500 Subject: [PATCH] Attempted to add some more error handling, there is now a manual timeout for if the API server is not sending any response, but is still up. --- .../static/tracker/assets/fetch-updates.js | 73 +++++++++++++------ .../tracker/static/tracker/assets/main.js | 61 +++++++++++----- 2 files changed, 96 insertions(+), 38 deletions(-) diff --git a/tunictracker/tracker/static/tracker/assets/fetch-updates.js b/tunictracker/tracker/static/tracker/assets/fetch-updates.js index fd20a9a..9c93329 100644 --- a/tunictracker/tracker/static/tracker/assets/fetch-updates.js +++ b/tunictracker/tracker/static/tracker/assets/fetch-updates.js @@ -1,42 +1,73 @@ async function refresh_overview(server_address) { - try { - const response = await fetch(`${server_address}overview`); - if (response.ok) { - const data = await response.json(); - if (!("error" in data)) { - return { overview: data, error: null }; - } else { - return { overview: null, error: data }; - } + const response = await fetch_api(server_address, "overview"); + if (response.data) { + return response.data; + } else { + if (response.error) { + return response.error; } else { - return { overview: null, error: null }; + return null; } - } catch (e) { - return { overview: null, error: e }; } } async function refresh_hints(server_address) { - const response = await fetch(`${server_address}hints`); - const data = await response.json(); - return data; + const response = await fetch_api(server_address, "hints"); + if (response.data) { + return response.data; + } else { + return null; + } } async function refresh_checks(server_address) { - const response = await fetch(`${server_address}items`); - const data = await response.json(); - return data; + const response = await fetch_api(server_address, "items"); + if (response.data) { + return response.data; + } else { + return null; + } } async function refresh_entrances(server_address) { - const response = await fetch(`${server_address}doors`); - const data = await response.json(); - return data; + const response = await fetch_api(server_address, "doors"); + if (response.data) { + return response.data; + } else { + return null; + } } +async function fetch_api(server_address, uri) { + try { + const response = await fetch(`${server_address}${uri}`, { + signal: AbortSignal.timeout(1100), + }); + if (response.ok) { + const data = await response.json(); + if (!("error" in data)) { + return { data: data, error: null }; + } else { + return { data: null, error: data }; + } + } else { + return { data: null, error: null }; + } + } catch (e) { + return { data: null, error: e }; + } +} + +AbortSignal.timeout ??= function timeout(ms) { + const ctrl = new AbortController(); + setTimeout(() => ctrl.abort(), ms); + return ctrl.signal; +}; + export default { refresh_overview, refresh_checks, refresh_entrances, refresh_hints, + fetch_api, }; diff --git a/tunictracker/tracker/static/tracker/assets/main.js b/tunictracker/tracker/static/tracker/assets/main.js index ae536ea..cef91cc 100644 --- a/tunictracker/tracker/static/tracker/assets/main.js +++ b/tunictracker/tracker/static/tracker/assets/main.js @@ -11,7 +11,7 @@ var current_hints = 0; // Global state internal var server_address = "localhost:51111/"; -var can_access_api_server = true; +var can_access_api_server = false; var is_timeout = false; var hide_completed_areas = false; var cross_codes = {}; @@ -22,7 +22,7 @@ var all_scenes = []; window.onload = async () => { await get_updated_server_address(); await parse_cross_codes(); - await initialize_elements(); + // await initialize_elements(); await refresh_elements(); }; @@ -62,13 +62,23 @@ async function get_updated_server_address() { async function initialize_elements() { // Grab all updates from the backend. let overview = await update.refresh_overview(server_address); - if (!overview.overview) { + if (!overview) { return; } + // console.log(overview) const checks = await update.refresh_checks(server_address); + if (!checks) { + return; + } const entrances = await update.refresh_entrances(server_address); + if (!entrances) { + return; + } const hints = await update.refresh_hints(server_address); - overview = overview.overview; + if (!hints) { + return; + } + // Initialize global state current_checks = checks.collected; @@ -111,12 +121,13 @@ async function initialize_elements() { } async function refresh_elements() { - const response = await update.refresh_overview(server_address); + try { + const response = await update.fetch_api(server_address, "overview"); // Check if the "Hide completed areas" option is checked hide_completed_areas = document.getElementById("hideDone").checked; - if (response.overview) { + if (response.data) { if (!can_access_api_server) { console.info("I found the server!"); document.getElementById("status-block").classList.add("hidden"); @@ -124,16 +135,26 @@ async function refresh_elements() { await initialize_elements(); } is_timeout = false; - await update_if_changes(response.overview); - } else if (response.error.error) { - if (!is_timeout) { - is_timeout = true; - console.debug("Received timeout from API server."); - } - if (!can_access_api_server) { - console.info("I found the server!"); - document.getElementById("status-block").classList.add("hidden"); - can_access_api_server = true; + await update_if_changes(response.data); + setTimeout(refresh_elements, 500) + } else if (response.error) { + setTimeout(refresh_elements, 1100) + if (response.error.error) { + if (!is_timeout) { + is_timeout = true; + console.debug("Received timeout from API server."); + } + if (!can_access_api_server) { + console.info("I found the server!"); + document.getElementById("status-block").classList.add("hidden"); + can_access_api_server = true; + } + } else { + if (can_access_api_server) { + console.debug("Could not access the API server."); + document.getElementById("status-block").classList.remove("hidden"); + } + can_access_api_server = false; } } else { if (can_access_api_server) { @@ -141,8 +162,14 @@ async function refresh_elements() { document.getElementById("status-block").classList.remove("hidden"); } can_access_api_server = false; + setTimeout(refresh_elements, 1100) } - setTimeout(refresh_elements, 500); + + } catch (error) { + setTimeout(refresh_elements, 1100) + } + + } async function update_if_changes(overview) {