const TOME_DB_VERSION = 3; // @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.jsA let tdb; let treload = false; let tload_complete = false; let tload_in_progress = false; let tomes; let tomeMap; let tometomeIDMap; let tomeRedirectMap; let tomeLists = new Map(); /* * Load tome set from local DB. Calls init() on success. */ async function load_tome_local() { return new Promise(function(resolve, reject) { let get_tx = tdb.transaction(['tome_db'], 'readonly'); let get_store = get_tx.objectStore('tome_db'); let request = get_store.getAll(); request.onerror = function(event) { reject("Could not read local tome db..."); } request.onsuccess = function(event) { console.log("Successfully read local tome db."); } get_tx.oncomplete = function(event) { tomes = request.result; init_tome_maps(); tload_complete = true; tdb.close(); resolve(); } }); } /* * Load tome set from remote DB (json). Calls init() on success. */ async function load_tome() { let getUrl = window.location; let baseUrl = getUrl.protocol + "//" + getUrl.host + "/";// + getUrl.pathname.split('/')[1]; // "Random" string to prevent caching! let url = baseUrl + "/tomes.json?"+new Date(); let result = await (await fetch(url)).json(); tomes = result.tomes let add_tx = tdb.transaction(['tome_db'], 'readwrite'); add_tx.onabort = function(e) { console.log(e); console.log("Not enough space..."); }; let tomes_store = add_tx.objectStore('tome_db'); let add_promises = []; for (const tome of tomes) { //dependency on clean_item in load.js clean_item(tome); let req = tomes_store.add(tome, tome.name); req.onerror = function() { console.log("ADD TOME ERROR? " + tome.name); }; add_promises.push(req); } add_promises.push(add_tx.complete); await Promise.all(add_promises); init_tome_maps(); tload_complete = true; tdb.close(); } async function load_tome_init() { return new Promise((resolve, reject) => { let request = window.indexedDB.open('tome_db', TOME_DB_VERSION); request.onerror = function() { reject("DB failed to open..."); }; request.onsuccess = async function() { tdb = request.result; if (tload_in_progress) { while (!tload_complete) { await sleep(100); } console.log("Skipping load...") } else { tload_in_progress = true if (treload) { console.log("Using new data...") await load_tome(); } else { console.log("Using stored data...") await load_tome_local(); } } resolve(); } request.onupgradeneeded = function(e) { treload = true; let tdb = e.target.result; try { tdb.deleteObjectStore('tome_db'); } catch (error) { console.log("Could not delete tome DB. This is probably fine"); } tdb.createObjectStore('tome_db'); console.log("DB setup complete..."); } }); } let none_tomes = [ ["tome", "weaponTome", "No Weapon Tome"], ["tome", "armorTome", "No Armor Tome"], ["tome", "guildTome", "No Guild Tome"] ]; function init_tome_maps() { //warp tomeMap = new Map(); /* Mapping from item names to set names. */ tomeIDMap = new Map(); tomeRedirectMap = new Map(); for (const it of tome_types) { tomeLists.set(it, []); } for (let i = 0; i < 3; i++) { let tome = Object(); tome.slots = 0; tome.category = none_tomes[i][0]; tome.type = none_tomes[i][1]; tome.name = none_tomes[i][2]; tome.displayName = tome.name; tome.set = null; tome.quest = null; tome.skillpoints = [0, 0, 0, 0, 0]; tome.has_negstat = false; tome.reqs = [0, 0, 0, 0, 0]; tome.fixID = true; tome.tier = "Normal"; tome.id = 61 + i; //special case! tome.nDam = "0-0"; tome.eDam = "0-0"; tome.tDam = "0-0"; tome.wDam = "0-0"; tome.fDam = "0-0"; tome.aDam = "0-0"; //dependency - load.js clean_item(tome); none_tomes[i] = tome; } tomes = tomes.concat(none_tomes); for (const tome of tomes) { if (tome.remapID === undefined) { tomeLists.get(tome.type).push(tome.displayName); tomeMap.set(tome.displayName, tome); if (none_tomes.includes(tome)) { tomeIDMap.set(tome.id, ""); } else { tomeIDMap.set(tome.id, tome.displayName); } } else { tomeRedirectMap.set(tome.id, tome.remapID); } } }