const INTERNAL_SECOND_MS = 60 * 1000; const INTERNAL_MINUTE_MS = 60 * INTERNAL_SECOND_MS; const INTERNAL_HOUR_MS = 60 * INTERNAL_MINUTE_MS; var isIndexedDBSupported = 'indexedDB' in window; $.dbManager = { openDatabases: {} } $.dbManager.alert = function (msg) { alert(msg); } $.dbManager.openDatabase = function (name, version, onUpgradeNeeded) { let dbManager = this; return new Promise(function (resolve, reject) { let db = dbManager.openDatabases[name]; if (db !== undefined && db !== null) { resolve(db); return; } let request = indexedDB.open(name, version); request.onupgradeneeded = function (event) { //Upgrade DB? Drop DB and reload? For now, drop db console.log("onupgradeneeded"); if (onUpgradeNeeded != null) { onUpgradeNeeded(event); } else { dbManager.deleteDatabase(name).then( function onSuccess(db) { resolve(db); }, function onError(error) { reject(error); }); } //reject("Upgrade Needed"); }; request.onerror = function () { console.error("Error: ", request.error); reject(request.error); }; request.onblocked = function () { console.error(); reject("Database blocked"); }; request.onsuccess = function () { let db = request.result; db.onversionchange = function (event) { let isDeleted = event.newVersion === null; db.close(); if(!isDeleted) alert("Database is outdated, please reload the page: ", event.currentTarget.name) }; console.log("Database opened: ", name); if (dbManager.openDatabases == null) dbManager.openDatabases = {}; dbManager.openDatabases[name] = db; db.onclose = function () { //TODO: DOesn't appear to be called currently console.log('Database connection closed: ', name); dbManager.openDatabases[name] = null; } resolve(db); }; }); } $.dbManager.closeDatabase = function (name) { let currentDB = this; return new Promise(function (resolve, reject) { let db = currentDB.openDatabases[name]; if (db != null) { db.close(); } currentDB.openDatabases[name] == null; resolve(); }); } $.dbManager.deleteDatabase = function (name) { let currentDB = this; return new Promise(function (resolve, reject) { let request = indexedDB.deleteDatabase(name); request.onerror = function () { console.error("Error", request.error); reject(request.error); }; request.onsuccess = function () { console.log("database deleted: ", name); currentDB.openDatabases[name] = null; resolve(); }; }); }