diff --git a/wco/apx/apx.js b/wco/apx/apx.js index 6954baf..2c52fe3 100644 --- a/wco/apx/apx.js +++ b/wco/apx/apx.js @@ -511,3 +511,113 @@ apx.update = async () => { apx.save(); //store in local the modification }; apx.ready(apx.update); //2nd param optional=> true mean does not wait same if apx.lock is set + +apx.indexedDB = apx.indexedDB || {}; + +apx.indexedDB.set = async (db, storeName, keyPath, key, value) => { + return new Promise((resolve, reject) => { + const request = indexedDB.open(db, 1); + + request.onupgradeneeded = (event) => { + const db = event.target.result; + + if (window.threadsObj) { + for (const threadId of Object.keys(window.threadsObj)) { + if (!db.objectStoreNames.contains(threadId)) { + db.createObjectStore(threadId, { keyPath: keyPath }); + }; + }; + }; + }; + + request.onsuccess = (event) => { + const db = event.target.result; + + if (!db.objectStoreNames.contains(storeName)) { + return resolve(); + }; + + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + const putRequest = store.put({ timestamp: key, value: value }); + putRequest.onsuccess = () => resolve(); + putRequest.onerror = (error) => reject(error); + }; + + request.onerror = (error) => reject(error); + }); +}; + +apx.indexedDB.get = async (db, storeName, keyPath, key) => { + return new Promise((resolve, reject) => { + const request = indexedDB.open(db, 1); + + request.onupgradeneeded = (event) => { + const db = event.target.result; + + if (window.threadsObj) { + for (const threadId of Object.keys(window.threadsObj)) { + if (!db.objectStoreNames.contains(threadId)) { + db.createObjectStore(threadId, { keyPath: keyPath }); + }; + }; + }; + }; + + request.onsuccess = (event) => { + const db = event.target.result; + + if (!db.objectStoreNames.contains(storeName)) { + return resolve(null); + }; + + const transaction = db.transaction(storeName, "readonly"); + const store = transaction.objectStore(storeName); + const getRequest = store.get(key); + + getRequest.onsuccess = () => { + resolve(getRequest.result ? getRequest.result.value : null); + }; + + getRequest.onerror = () => resolve(null); + }; + + request.onerror = (error) => reject(error); + }); +}; + +apx.indexedDB.del = async (db, storeName, keyPath, key) => { + return new Promise((resolve, reject) => { + const request = indexedDB.open(db, 1); + + request.onupgradeneeded = (event) => { + const db = event.target.result; + + if (window.threadsObj) { + for (const threadId of Object.keys(window.threadsObj)) { + if (!db.objectStoreNames.contains(threadId)) { + db.createObjectStore(threadId, { keyPath: keyPath }); + }; + }; + }; + }; + + request.onsuccess = (event) => { + const db = event.target.result; + + if (!db.objectStoreNames.contains(storeName)) { + return resolve(); + }; + + const transaction = db.transaction(storeName, "readwrite"); + const store = transaction.objectStore(storeName); + + const deleteRequest = store.delete(key); + deleteRequest.onsuccess = () => resolve(); + deleteRequest.onerror = (error) => reject(error); + }; + + request.onerror = (error) => reject(error); + }); +}; \ No newline at end of file