Perform batch operation on IndexedDB
Create/update/remove objects from IndexedDB store in one transaction without blocking the main thread. This module also manually validates unique indexes, fixing bugs in WebKit and IndexedDBShim.
Using idb-factory and ES2016 async/await syntax. Check test.js for more examples.
import batch from 'idb-batch'
import { open } from 'idb-factory'
// open IndexedDB database with 2 stores
const db = await open('mydb', 1, upgradeCallback)
// modify object store
await batch(db, 'magazines', [
{ type: 'add', key: 1, value: { name: 'M1', frequency: 12 } },
{ type: 'add', key: 2, value: { name: 'M2', frequency: 24 } },
{ type: 'add', key: 3, value: { name: 'M3', frequency: 6 } },
{ type: 'del', key: 4 },
]).then((result) => {
console.log(result) // [1, 2, 3, undefined]
}).catch((err) => {
console.error(err)
})
function upgradeCallback(e) {
e.target.result.createObjectStore('books', { keyPath: 'id' })
e.target.result.createObjectStore('magazines')
}
This creates a readwrite
transaction to storeName
,
and performs ops
sequentially. It returns a Promise
which resolves with the results of each request.
Array notation is inspired by LevelUP.
Each operation is an object with 3 possible properties: type
, key
, value
.
type
is either add
, put
, or del
, and key
is optional (when the store has a keyPath
and the supplied value contains it).
await batch(db, 'books', [
{ type: 'add', key: 1, value: { name: 'M1', frequency: 12 } },
{ type: 'del', key: 2 }
{ type: 'put', value: { id: 3, name: 'M3', frequency: 24 } }, // no key
])
Object notation is sugar on top of array notation for put
/del
operations.
Set key
to null
in order to delete a value.
await batch(db, 'storage', {
key1: 'update value',
key2: null, // delete value
key3: 'new value',
})
If during sequential execution one of the operations throws a ConstraintError
,
the Promise
rejects with an error, but previous successful operations will commit.
This behavior may change in future versions,
as I figure out how to properly abort transactions in IndexedDBShim.