@signaldb/indexeddb
Version:
This is the `IndexedDB` persistence adapter for [SignalDB](https://github.com/maxnowack/signaldb). SignalDB is a local-first JavaScript database with real-time sync, enabling optimistic UI with signal-based reactivity across multiple frameworks.
1 lines • 5.28 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { createPersistenceAdapter } from '@signaldb/core';\n/**\n * Creates a persistence adapter for managing a SignalDB collection using IndexedDB.\n * This adapter reads and writes data to an IndexedDB object store, with customizable serialization and deserialization.\n * @template T - The type of the items in the collection.\n * @template I - The type of the unique identifier for the items.\n * @param name - A unique name for the collection, used as the database name.\n * @param options - Optional configuration for the adapter.\n * @param options.prefix - A prefix to be added to the database name (default: 'signaldb-').\n * @returns A SignalDB persistence adapter for managing data in IndexedDB.\n */\nexport default function createIndexedDBAdapter(name, options) {\n const { prefix = 'signaldb-' } = options || {};\n const databaseName = `${prefix}${name}`;\n const storeName = 'items';\n /**\n * Opens the IndexedDB database and creates the object store if it doesn't exist.\n * @returns A promise that resolves with the opened database.\n */\n function openDatabase() {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(databaseName, 1);\n request.addEventListener('upgradeneeded', () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(storeName)) {\n database.createObjectStore(storeName, { keyPath: 'id' });\n }\n });\n request.addEventListener('success', () => resolve(request.result));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Database error')));\n });\n }\n /**\n * Retrieves all items from the IndexedDB object store.\n * @returns A promise that resolves with an array of items.\n */\n async function getAllItems() {\n const database = await openDatabase();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n request.addEventListener('success', () => resolve(request.result));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error fetching items')));\n });\n }\n return createPersistenceAdapter({\n async load() {\n const items = await getAllItems();\n return { items };\n },\n async save(items, { added, modified, removed }) {\n const database = await openDatabase();\n const transaction = database.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n added.forEach(item => store.add(item));\n modified.forEach(item => store.put(item));\n removed.forEach(item => store.delete(item.id));\n return new Promise((resolve, reject) => {\n transaction.addEventListener('complete', () => resolve());\n transaction.addEventListener('error', () => reject(new Error(transaction.error?.message || 'Transaction error')));\n });\n },\n async register() {\n return;\n },\n });\n}\n"],"names":["createIndexedDBAdapter","name","options","prefix","databaseName","storeName","openDatabase","resolve","reject","request","database","_a","getAllItems","createPersistenceAdapter","items","added","modified","removed","transaction","store","item"],"mappings":";AAWwB,SAAAA,EAAuBC,GAAMC,GAAS;AAC1D,QAAM,EAAE,QAAAC,IAAS,YAAY,IAAID,KAAW,CAAC,GACvCE,IAAe,GAAGD,CAAM,GAAGF,CAAI,IAC/BI,IAAY;AAKlB,WAASC,IAAe;AACpB,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACpC,YAAMC,IAAU,UAAU,KAAKL,GAAc,CAAC;AACtC,MAAAK,EAAA,iBAAiB,iBAAiB,MAAM;AAC5C,cAAMC,IAAWD,EAAQ;AACzB,QAAKC,EAAS,iBAAiB,SAASL,CAAS,KAC7CK,EAAS,kBAAkBL,GAAW,EAAE,SAAS,MAAM;AAAA,MAC3D,CACH,GACDI,EAAQ,iBAAiB,WAAW,MAAMF,EAAQE,EAAQ,MAAM,CAAC,GACzDA,EAAA,iBAAiB,SAAS,MAAA;;AAAM,eAAAD,EAAO,IAAI,QAAMG,IAAAF,EAAQ,UAAR,gBAAAE,EAAe,YAAW,gBAAgB,CAAC;AAAA,OAAC;AAAA,IAAA,CACxG;AAAA,EAAA;AAML,iBAAeC,IAAc;AACnB,UAAAF,IAAW,MAAMJ,EAAa;AACpC,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AAG9B,YAAAC,IAFcC,EAAS,YAAYL,GAAW,UAAU,EACpC,YAAYA,CAAS,EACzB,OAAO;AAC7B,MAAAI,EAAQ,iBAAiB,WAAW,MAAMF,EAAQE,EAAQ,MAAM,CAAC,GACzDA,EAAA,iBAAiB,SAAS,MAAA;;AAAM,eAAAD,EAAO,IAAI,QAAMG,IAAAF,EAAQ,UAAR,gBAAAE,EAAe,YAAW,sBAAsB,CAAC;AAAA,OAAC;AAAA,IAAA,CAC9G;AAAA,EAAA;AAEL,SAAOE,EAAyB;AAAA,IAC5B,MAAM,OAAO;AAET,aAAO,EAAE,OADK,MAAMD,EAAY,EACjB;AAAA,IACnB;AAAA,IACA,MAAM,KAAKE,GAAO,EAAE,OAAAC,GAAO,UAAAC,GAAU,SAAAC,KAAW;AAE5C,YAAMC,KADW,MAAMZ,EAAa,GACP,YAAYD,GAAW,WAAW,GACzDc,IAAQD,EAAY,YAAYb,CAAS;AAC/C,aAAAU,EAAM,QAAQ,CAAAK,MAAQD,EAAM,IAAIC,CAAI,CAAC,GACrCJ,EAAS,QAAQ,CAAAI,MAAQD,EAAM,IAAIC,CAAI,CAAC,GACxCH,EAAQ,QAAQ,CAAQG,MAAAD,EAAM,OAAOC,EAAK,EAAE,CAAC,GACtC,IAAI,QAAQ,CAACb,GAASC,MAAW;AACpC,QAAAU,EAAY,iBAAiB,YAAY,MAAMX,EAAA,CAAS,GAC5CW,EAAA,iBAAiB,SAAS,MAAA;;AAAM,iBAAAV,EAAO,IAAI,QAAMG,IAAAO,EAAY,UAAZ,gBAAAP,EAAmB,YAAW,mBAAmB,CAAC;AAAA,SAAC;AAAA,MAAA,CACnH;AAAA,IACL;AAAA,IACA,MAAM,WAAW;AAAA,IACb;AAAA,EACJ,CACH;AACL;"}