Package Exports
- idb-batch
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (idb-batch) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
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.