idb-batch v1.0.0
idb-batch
Perform batch operation on IndexedDB
Create/update/remove objects from IndexedDB store in one transaction without blocking main tread. This module also manually validates unique indexes fixing bugs in WebKit and IndexedDBShim.
Example
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')
}batch(db: IDBDatabase, storeName: String, ops: Array|Object)
It creates readwrite transaction to storeName,
and performs ops sequentially. It returns Promise which resolves with 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 can be optional, when store has keyPath and 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 a sugar on top of array notation for put/del operations.
Set key to null in order to delete value.
await batch(db, 'storage', {
key1: 'update value',
key2: null, // delete value
key3: 'new value',
})ConstraintError
If during sequential execution one of operations throws ConstraintError,
Promise rejects with error, but previous successful operations commit.
This behavior can change in future versions,
when I will figure out how to properly abort transaction in IndexedDBShim.
LICENSE
10 years ago