Natty Precise Maverick

    idb-batch

    1.0.0 • Public • Published

    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

    MIT

    Install

    npm i idb-batch

    DownloadsWeekly Downloads

    25

    Version

    1.0.0

    License

    MIT

    Last publish

    Collaborators

    • alekseykulikov