From 275003a34b1f85bf25f43cea428e42f5fe8ca074 Mon Sep 17 00:00:00 2001 From: unlishema Date: Thu, 17 Oct 2024 04:23:55 -0400 Subject: [PATCH] Optimized the json loading json loading was slow so I optimized it by adding a cache system. --- src/modules/data/assignnments.ts | 63 +++++++++++++++++--------------- src/modules/data/creatures.ts | 40 +++++++++++++------- src/modules/data/masters.ts | 40 +++++++++++++------- src/modules/data/reapers.ts | 55 +++++++++++++++------------- src/modules/data/variants.ts | 43 +++++++++++++++------- 5 files changed, 146 insertions(+), 95 deletions(-) diff --git a/src/modules/data/assignnments.ts b/src/modules/data/assignnments.ts index 29b4f8c..a6d311f 100644 --- a/src/modules/data/assignnments.ts +++ b/src/modules/data/assignnments.ts @@ -1,39 +1,42 @@ +let cachedData = null; +const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes +let cacheTimestamp = Date.now(); + +// Fetch and cache the assignments data +async function fetchAssignments() { + // Check if we need to fetch new data + if (!cachedData || (Date.now() - cacheTimestamp) > CACHE_EXPIRATION_MS) { + try { + const response = await fetch("./data/assignments.json"); + cachedData = await response.json(); + cacheTimestamp = Date.now(); // Update timestamp after fetching new data + } catch (error) { + console.error("Error fetching data:", error); + cachedData = []; // Set to empty array on error to prevent further errors + } + } + return cachedData; +} + // Fetch a single assignment based on the index or alias export async function get(assignment) { - try { - const response = await fetch("./data/assignments.json"); - const data = await response.json(); - - for (const a of data) { - if (a["index"].toLowerCase() === assignment.toLowerCase()) { - return a; - } - for (const b of a["alias"]) { - if (b.toLowerCase() === assignment.toLowerCase()) { - return a; - } - } + const data = await fetchAssignments(); + const lowerCasedAssignment = assignment.toLowerCase(); + + for (const a of data) { + if (a["index"].toLowerCase() === lowerCasedAssignment) { + return a; + } + if (a["alias"].some(alias => alias.toLowerCase() === lowerCasedAssignment)) { + return a; } - return null; - } catch (error) { - console.error("Error fetching data:", error); - return null; } + return null; } // Get an array of the index export async function getIndexList() { - try { - let dataList = ""; - const response = await fetch("./data/assignments.json"); - const data = await response.json(); - - for (const a of data) { - dataList += `\n\r`; - } - return dataList; - } catch (error) { - console.error("Error fetching data:", error); - return ""; - } + const data = await fetchAssignments(); + + return data.map(a => `\n\r`).join(''); } diff --git a/src/modules/data/creatures.ts b/src/modules/data/creatures.ts index aaeae01..f2b9171 100644 --- a/src/modules/data/creatures.ts +++ b/src/modules/data/creatures.ts @@ -1,20 +1,34 @@ -// Assuming decodeHtml function is defined or imported elsewhere import { decodeHtml } from '../extrafuncs'; +let cachedCreaturesData = null; +const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes +let creaturesCacheTimestamp = Date.now(); + +// Fetch and cache the creatures data +async function fetchCreatures() { + // Check if we need to fetch new data + if (!cachedCreaturesData || (Date.now() - creaturesCacheTimestamp) > CACHE_EXPIRATION_MS) { + try { + const response = await fetch("./data/creatures.json"); + cachedCreaturesData = await response.json(); + creaturesCacheTimestamp = Date.now(); // Update timestamp after fetching new data + } catch (error) { + console.error("Error fetching data:", error); + cachedCreaturesData = []; // Set to empty array on error to prevent further errors + } + } + return cachedCreaturesData; +} + // Fetch a single creature based on the name export async function get(creature) { - try { - const response = await fetch("./data/creatures.json"); - const data = await response.json(); - - for (const a of data) { - if (decodeHtml(a["name"].toLowerCase()) === creature.toLowerCase()) { - return a; - } + const data = await fetchCreatures(); + const lowerCasedCreature = creature.toLowerCase(); + + for (const a of data) { + if (decodeHtml(a["name"].toLowerCase()) === lowerCasedCreature) { + return a; } - return null; - } catch (error) { - console.error("Error fetching data:", error); - return null; } + return null; } diff --git a/src/modules/data/masters.ts b/src/modules/data/masters.ts index 5da9aba..4e08be5 100644 --- a/src/modules/data/masters.ts +++ b/src/modules/data/masters.ts @@ -1,20 +1,34 @@ -// Assuming decodeHtml function is defined or imported elsewhere import { decodeHtml } from '../extrafuncs'; +let cachedMastersData = null; +const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes +let mastersCacheTimestamp = Date.now(); + +// Fetch and cache the masters data +async function fetchMasters() { + // Check if we need to fetch new data + if (!cachedMastersData || (Date.now() - mastersCacheTimestamp) > CACHE_EXPIRATION_MS) { + try { + const response = await fetch("./data/masters.json"); + cachedMastersData = await response.json(); + mastersCacheTimestamp = Date.now(); // Update timestamp after fetching new data + } catch (error) { + console.error("Error fetching data:", error); + cachedMastersData = []; // Set to empty array on error to prevent further errors + } + } + return cachedMastersData; +} + // Fetch a single master based on the name export async function get(master) { - try { - const response = await fetch("./data/masters.json"); - const data = await response.json(); - - for (const a of data) { - if (decodeHtml(a["name"].toLowerCase()) === master.toLowerCase()) { - return a; - } + const data = await fetchMasters(); + const lowerCasedMaster = master.toLowerCase(); + + for (const a of data) { + if (decodeHtml(a["name"].toLowerCase()) === lowerCasedMaster) { + return a; } - return null; - } catch (error) { - console.error("Error fetching data:", error); - return null; } + return null; } diff --git a/src/modules/data/reapers.ts b/src/modules/data/reapers.ts index 0110cd3..104c7c7 100644 --- a/src/modules/data/reapers.ts +++ b/src/modules/data/reapers.ts @@ -1,34 +1,39 @@ +let cachedReapersData = null; +const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes +let reapersCacheTimestamp = Date.now(); + +// Fetch and cache the reapers data +async function fetchReapers() { + // Check if we need to fetch new data + if (!cachedReapersData || (Date.now() - reapersCacheTimestamp) > CACHE_EXPIRATION_MS) { + try { + const response = await fetch("./data/reapers.json"); + cachedReapersData = await response.json(); + reapersCacheTimestamp = Date.now(); // Update timestamp after fetching new data + } catch (error) { + console.error("Error fetching data:", error); + cachedReapersData = []; // Set to empty array on error to prevent further errors + } + } + return cachedReapersData; +} + // Fetch a single reaper based on the index or alias export async function get(reaper) { - try { - const response = await fetch("./data/reapers.json"); - const data = await response.json(); - - for (const a of data) { - if (a["index"].toLowerCase() === reaper.toLowerCase()) { - return a; - } + const data = await fetchReapers(); + const lowerCasedReaper = reaper.toLowerCase(); + + for (const a of data) { + if (a["index"].toLowerCase() === lowerCasedReaper) { + return a; } - return null; - } catch (error) { - console.error("Error fetching data:", error); - return null; } + return null; } // Get an array of the index as HTML option elements export async function getIndexList() { - try { - let dataList = ""; - const response = await fetch("./data/reapers.json"); - const data = await response.json(); - - for (const a of data) { - dataList += `\n\r`; - } - return dataList; - } catch (error) { - console.error("Error fetching data:", error); - return ""; - } + const data = await fetchReapers(); + + return data.map(a => `\n\r`).join(''); } diff --git a/src/modules/data/variants.ts b/src/modules/data/variants.ts index 1dce496..09f1643 100644 --- a/src/modules/data/variants.ts +++ b/src/modules/data/variants.ts @@ -1,24 +1,39 @@ -// Import the decodeHtml function import { decodeHtml } from '../extrafuncs'; +let cachedCreaturesData = null; +const CACHE_EXPIRATION_MS = 10 * 60 * 1000; // 10 minutes +let creaturesCacheTimestamp = Date.now(); + +// Fetch and cache the creatures data +async function fetchCreatures() { + // Check if we need to fetch new data + if (!cachedCreaturesData || (Date.now() - creaturesCacheTimestamp) > CACHE_EXPIRATION_MS) { + try { + const response = await fetch("./data/creatures.json"); + cachedCreaturesData = await response.json(); + creaturesCacheTimestamp = Date.now(); // Update timestamp after fetching new data + } catch (error) { + console.error("Error fetching data:", error); + cachedCreaturesData = []; // Set to empty array on error to prevent further errors + } + } + return cachedCreaturesData; +} + // Fetch a single variant based on the creature name and variant name export async function get(creature, variant) { - try { - const response = await fetch("./data/creatures.json"); - const data = await response.json(); + const data = await fetchCreatures(); + const lowerCasedCreature = decodeHtml(creature.toLowerCase()); + const lowerCasedVariant = variant.toLowerCase(); - for (const a of data) { - if (decodeHtml(a["name"].toLowerCase()) === creature.toLowerCase()) { - for (const b of a["variants"]) { - if (b["name"].toLowerCase() === variant.toLowerCase()) { - return b; - } + for (const a of data) { + if (decodeHtml(a["name"].toLowerCase()) === lowerCasedCreature) { + for (const b of a["variants"]) { + if (b["name"].toLowerCase() === lowerCasedVariant) { + return b; } } } - return null; - } catch (error) { - console.error("Error fetching data:", error); - return null; } + return null; } -- 2.43.0