UNPKG

dexie-batch

Version:

Fetch DB entries in batches to improve performance while respecting IPC size constraints

1 lines 7.31 kB
{"version":3,"file":"dexie-batch.mjs","sources":["../dexie-batch.js"],"sourcesContent":["const { Promise } = require('dexie')\n\nmodule.exports = class DexieBatch {\n constructor(opts) {\n assertValidOptions(opts)\n this.opts = opts\n }\n\n isParallel() {\n return Boolean(this.opts.limit)\n }\n\n each(collection, callback) {\n assertValidMethodArgs(...arguments)\n\n return this.eachBatch(collection, (batch, batchIdx) => {\n const baseIdx = batchIdx * this.opts.batchSize\n return Promise.all(batch.map((item, i) => callback(item, baseIdx + i)))\n })\n }\n\n eachBatch(collection, callback) {\n assertValidMethodArgs(...arguments)\n\n const delegate = this.isParallel() ? 'eachBatchParallel' : 'eachBatchSerial'\n return this[delegate](collection, callback)\n }\n\n eachBatchParallel(collection, callback) {\n assertValidMethodArgs(...arguments)\n const { batchSize, limit } = this.opts\n if (!limit) {\n throw new Error('Option \"limit\" must be set for parallel operation')\n }\n\n const nextBatch = batchIterator(collection, batchSize)\n const numBatches = Math.ceil(limit / batchSize)\n const batchPromises = Array.from({ length: numBatches }, (_, idx) =>\n nextBatch().then(batch => callback(batch, idx))\n )\n\n return Promise.all(batchPromises).then(batches => batches.length)\n }\n\n eachBatchSerial(collection, callback) {\n assertValidMethodArgs(...arguments)\n\n const userPromises = []\n const nextBatch = batchIterator(collection, this.opts.batchSize)\n\n const nextUnlessEmpty = batch => {\n if (batch.length === 0) return\n userPromises.push(callback(batch, userPromises.length))\n return nextBatch().then(nextUnlessEmpty)\n }\n\n return nextBatch()\n .then(nextUnlessEmpty)\n .then(() => Promise.all(userPromises))\n .then(() => userPromises.length)\n }\n}\n\n// Does not conform to JS iterator requirements\nfunction batchIterator(collection, batchSize) {\n const it = collection.clone()\n return () => {\n const batchPromise = it.clone().limit(batchSize).toArray()\n it.offset(batchSize)\n return batchPromise\n }\n}\n\nfunction assertValidOptions(opts) {\n const batchSize = opts && opts.batchSize\n if (!(batchSize && Number.isInteger(batchSize) && batchSize > 0)) {\n throw new Error('Mandatory option \"batchSize\" must be a positive integer')\n }\n\n if ('limit' in opts && !(Number.isInteger(opts.limit) && opts.limit >= 0)) {\n throw new Error('Option \"limit\" must be a non-negative integer')\n }\n}\n\nfunction assertValidMethodArgs(collection, callback) {\n if (arguments.length < 2) {\n throw new Error('Arguments \"collection\" and \"callback\" are mandatory')\n }\n\n if (!isCollectionInstance(collection)) {\n throw new Error('\"collection\" must be of type Collection')\n }\n\n if (!(typeof callback === 'function')) {\n throw new TypeError('\"callback\" must be a function')\n }\n}\n\n// We would need the Dexie instance that created the collection to get the\n// Collection constructor and do some proper type checking.\n// So for now we resort to duck typing\nfunction isCollectionInstance(obj) {\n if (!obj) return false\n return ['clone', 'offset', 'limit', 'toArray'].every(\n name => typeof obj[name] === 'function'\n )\n}\n"],"names":["Promise","require$$0","opts","assertValidOptions","Boolean","limit","collection","callback","assertValidMethodArgs","arguments","eachBatch","batch","batchIdx","baseIdx","batchSize","all","map","item","i","delegate","isParallel","Error","nextBatch","batchIterator","numBatches","Math","ceil","batchPromises","Array","from","length","_","idx","then","batches","userPromises","nextUnlessEmpty","push","it","clone","batchPromise","toArray","offset","Number","isInteger","isCollectionInstance","TypeError","obj","every","name"],"mappings":"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"}