A simple wrapper for IndexedDB with Expiry Time

peterking1697923543 peterking1697923543
Blog
A simple wrapper for IndexedDB with Expiry Time

A simple wrapper for IndexedDB with Expiry Time


  // Usage:

  // await idb.setItem('myKey', 'myValue', maxAge = 30 * 24 * 60 * 60 * 1000);

  // await idb.getItem('myKey');

  // await idb.removeItem('myKey');

  // await idb.clear();



// This is a simple wrapper for IndexedDB
// Note: This is a basic example and error handling should be implemented for production use.
const dbRequest = indexedDB.open('myDatabase', 1);

dbRequest.onupgradeneeded = event => {
    let db = event.target.result;
    db.createObjectStore('myObjectStore', { keyPath: 'id' });
};

const dbPromise = new Promise((resolve, reject) => {
    const dbRequest = indexedDB.open('myDatabase', 1);

    dbRequest.onupgradeneeded = event => {
        let db = event.target.result;
        db.createObjectStore('myObjectStore', { keyPath: 'id' });
    };

    dbRequest.onsuccess = () => resolve(dbRequest.result);
    dbRequest.onerror = () => reject(dbRequest.error);
});

const idb = {
    async getItem(key) {
        const db = await dbPromise;
        return new Promise((resolve, reject) => {
            const transaction = db.transaction('myObjectStore', 'readonly');
            const objectStore = transaction.objectStore('myObjectStore');
            const request = objectStore.get(key);

            request.onsuccess = () => {
                const result = request.result;
                if (result) {
                    if (result.expireTime <= Date.now()) {
                        idb.removeItem(key);
                        resolve(null);
                    } else {
                        resolve(result.data);
                    }
                } else {
                    resolve(null);
                }
            };

            request.onerror = () => {
                reject('Error getting item from IndexedDB');
            };
        });
    },

    async setItem(key, value, maxAge = 30 * 24 * 60 * 60 * 1000) {
        const db = await dbPromise;
        const transaction = db.transaction('myObjectStore', 'readwrite');
        const objectStore = transaction.objectStore('myObjectStore');
        const data = {
            id: key,
            data: value,
            expireTime: maxAge ? Date.now() + maxAge : undefined
        };
        objectStore.put(data);
    },

    async removeItem(key) {
        const transaction = dbRequest.result.transaction('myObjectStore', 'readwrite');
        const objectStore = transaction.objectStore('myObjectStore');
        objectStore.delete(key);
    },

    async clear() {
        const transaction = dbRequest.result.transaction('myObjectStore', 'readwrite');
        const objectStore = transaction.objectStore('myObjectStore');
        objectStore.clear();
    }

    // Usage:
    // await idb.setItem('myKey', 'myValue');
    // await idb.getItem('myKey');
    // await idb.removeItem('myKey');
    // await idb.clear();

};

Comments (0)

U
Press Ctrl+Enter to post

No comments yet

Be the first to share your thoughts!