JavaScript

IndexedDB Wrapper

by @admin
9h ago
Apr 28, 2026
Public
A Promise-based wrapper for the IndexedDB API — simplifies the verbose request/onsuccess/onerror pattern into clean async/await calls. Supports get, set, delete, and getAll operations on a named object store. Ideal for storing large client-side datasets, offline data, and blobs that exceed localStorage limits.
JavaScript
function openDB(name, storeName, version = 1) {
  const req = indexedDB.open(name, version);
  req.onupgradeneeded = (e) => e.target.result.createObjectStore(storeName);

  const dbPromise = new Promise((res, rej) => {
    req.onsuccess = () => res(req.result);
    req.onerror   = () => rej(req.error);
  });

  function tx(mode, fn) {
    return dbPromise.then((db) =>
      new Promise((res, rej) => {
        const store = db.transaction(storeName, mode).objectStore(storeName);
        const r = fn(store);
        r.onsuccess = () => res(r.result);
        r.onerror   = () => rej(r.error);
      })
    );
  }

  return {
    get:    (key)        => tx('readonly',  (s) => s.get(key)),
    set:    (key, value) => tx('readwrite', (s) => s.put(value, key)),
    delete: (key)        => tx('readwrite', (s) => s.delete(key)),
    getAll: ()           => tx('readonly',  (s) => s.getAll()),
  };
}

// Usage
const db = openDB('my-app', 'cache');
await db.set('user', { name: 'Alice', role: 'admin' });
console.log(await db.get('user')); // { name: 'Alice', role: 'admin' }
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.