Optimized the json loading
authorunlishema <unlishema@jtryba.com>
Thu, 17 Oct 2024 08:23:55 +0000 (04:23 -0400)
committerunlishema <unlishema@jtryba.com>
Thu, 17 Oct 2024 08:23:55 +0000 (04:23 -0400)
json loading was slow so I optimized it by adding a cache system.

src/modules/data/assignnments.ts
src/modules/data/creatures.ts
src/modules/data/masters.ts
src/modules/data/reapers.ts
src/modules/data/variants.ts

index 29b4f8c43aa34698cc54d99fa1773809a96fb8e9..a6d311fa4b83506245f47c6f681404a3d1b5a8d9 100644 (file)
@@ -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 += `<option>${a["index"]}</option>\n\r`;
-        }
-        return dataList;
-    } catch (error) {
-        console.error("Error fetching data:", error);
-        return "";
-    }
+    const data = await fetchAssignments();
+
+    return data.map(a => `<option>${a["index"]}</option>\n\r`).join('');
 }
index aaeae01f8748790cbc6678ed1ddc0197200a7919..f2b91712f3901db08edf87e154bb4b77e7561153 100644 (file)
@@ -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;
 }
index 5da9aba04c6ea7fb14ee018452a193d2cdf22f79..4e08be545aa6e26c65f7eaefc58a15b78e7f45bf 100644 (file)
@@ -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;
 }
index 0110cd3f21334199b2bf99acdf9199846f9bd2aa..104c7c7adac8bae55abdcb8489a62236d255a26d 100644 (file)
@@ -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 += `<option>${a["index"]}</option>\n\r`;
-        }
-        return dataList;
-    } catch (error) {
-        console.error("Error fetching data:", error);
-        return "";
-    }
+    const data = await fetchReapers();
+
+    return data.map(a => `<option>${a["index"]}</option>\n\r`).join('');
 }
index 1dce496292c9f9d3f5bd46cbfda336856ca0c431..09f1643612219cd429c87f1e858ae0904fe733d9 100644 (file)
@@ -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;
 }