diff --git a/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js b/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js index 0ec19ed37e..169216872d 100644 --- a/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js +++ b/packages/node_modules/pouchdb-abstract-mapreduce/src/index.js @@ -23,7 +23,6 @@ import { callbackify, sequentialize, uniq, - fin, promisedCallback, mapToKeysArray, QueryParseError, @@ -147,13 +146,11 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { } } - function postprocessAttachments(opts) { - return function (res) { + function postprocessAttachments(res, opts) { if (opts.include_docs && opts.attachments && opts.binary) { readAttachmentsAsBlobOrBuffer(res); } return res; - }; } function addHttpParam(paramName, opts, params, asJson) { @@ -303,10 +300,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { throw new Error(row.reason); } } - - return new Promise(function (resolve) { - resolve(result); - }).then(postprocessAttachments(opts)); + return postprocessAttachments(result, opts); } // We are using a temporary view, terrible for performance, good for testing @@ -333,9 +327,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { throw generateErrorFromResponse(result); } - return new Promise(function (resolve) { - resolve(result); - }).then(postprocessAttachments(opts)); + return postprocessAttachments(result, opts); } // custom adapters can define their own api._query @@ -451,50 +443,63 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { return processKeyValueDocs(metaDoc, keyValueDocs); } - function updatePurgeSeq(view) { + async function updatePurgeSeq(view) { // with this approach, we just assume to have processed all missing purges and write the latest // purgeSeq into the _local/purgeSeq doc. - return view.sourceDB.get('_local/purges').then(function (res) { + try { + const res = await view.sourceDB.get('_local/purges'); const purgeSeq = res.purgeSeq; - return view.db.get('_local/purgeSeq').then(function (res) { - return res._rev; - }) - .catch(defaultsTo(undefined)) - .then(function (rev) { - return view.db.put({ + //TODO: (defaultsto)-rev is purgeSeqDoc._rev or undefined + let rev; + try { + const purgeSeqDoc = await view.db.get('_local/purgeSeq'); + rev = purgeSeqDoc._rev; + } catch (err) { + if (err.status !== 404) { + throw err; + } else { + rev = undefined; + } + } + return await view.db.put({ _id: '_local/purgeSeq', _rev: rev, purgeSeq, }); - }); - }).catch(function (err) { + } catch (err) { if (err.status !== 404) { throw err; } - }); + } } // updates all emitted key/value docs and metaDocs in the mrview database // for the given batch of documents from the source database - function saveKeyValues(view, docIdsToChangesAndEmits, seq) { - var seqDocId = '_local/lastSeq'; - return view.db.get(seqDocId) - .catch(defaultsTo({_id: seqDocId, seq: 0})) - .then(function (lastSeqDoc) { - var docIds = mapToKeysArray(docIdsToChangesAndEmits); - return Promise.all(docIds.map(function (docId) { - return getDocsToPersist(docId, view, docIdsToChangesAndEmits); - })).then(function (listOfDocsToPersist) { - var docsToPersist = listOfDocsToPersist.flat(); + async function saveKeyValues(view, docIdsToChangesAndEmits, seq) { + const seqDocId = '_local/lastSeq'; + //TODO: (defaultsto)- lastSeqDoc get or {_id: seqDocId, seq: 0} + let lastSeqDoc; + try { + lastSeqDoc = await view.db.get(seqDocId); + } catch (err) { + if (err.status !== 404) { + throw err; + } + lastSeqDoc = {_id: seqDocId, seq: 0}; + } + const docIds = mapToKeysArray(docIdsToChangesAndEmits); + const listOfDocsToPersist = await Promise.all(docIds.map((docId) => + getDocsToPersist(docId, view, docIdsToChangesAndEmits))); + + const docsToPersist = listOfDocsToPersist.flat(); lastSeqDoc.seq = seq; docsToPersist.push(lastSeqDoc); // write all docs in a single operation, update the seq once - return view.db.bulkDocs({docs : docsToPersist}); - }) + await view.db.bulkDocs({docs: docsToPersist }); + // TODO: this should be placed somewhere else, probably? we're querying both docs twice // (first time when getting the actual purges). - .then(() => updatePurgeSeq(view)); - }); + return updatePurgeSeq(view); } function getQueue(view) { @@ -532,12 +537,11 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { let currentSeq = view.seq || 0; - function createTask() { - return view.sourceDB.info().then(function (info) { + async function createTask() { + const info = await view.sourceDB.info(); taskId = view.sourceDB.activeTasks.add({ name: 'view_indexing', total_items: info.update_seq - currentSeq, - }); }); } @@ -569,30 +573,50 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { return processBatch(response, purges); } - function getRecentPurges() { - return view.db.get('_local/purgeSeq').then(function (res) { - return res.purgeSeq; - }) - .catch(defaultsTo(-1)) - .then(function (purgeSeq) { - return view.sourceDB.get('_local/purges').then(function (res) { - const recentPurges = res.purges.filter(function (purge, index) { - return index > purgeSeq; - }).map((purge) => purge.docId); - - const uniquePurges = recentPurges.filter(function (docId, index) { - return recentPurges.indexOf(docId) === index; - }); + async function getRecentPurges() { + //TODO: (defaultsto)- purgeSeq get or defaults to -1 + let purgeSeq; + try { + const res = await view.db.get('_local/purgeSeq'); + purgeSeq = res.purgeSeq; + } catch (err) { + if (err.status !== 404) { + throw err; + } + purgeSeq = -1; + } + + let purges; + try { + //TODO: recentPurges get and filter or defaults to [] + const res = await view.sourceDB.get('_local/purges'); + purges = res.purges; + + + } catch (err) { + if (err.status !== 404) { + throw err; + } + purges = []; + } - return Promise.all(uniquePurges.map(function (docId) { - return view.sourceDB.get(docId).then(function (doc) { + const recentPurges = purges.filter((purge, index) => index > purgeSeq) + .map((purge) => purge.docId); + + const uniquePurges = recentPurges.filter( + (docId, index) => recentPurges.indexOf(docId) === index); + + return Promise.all(uniquePurges.map(async (docId) => { + try { + const doc = await view.sourceDB.get(docId); return { docId, doc }; - }) - .catch(defaultsTo({ docId })); - })); - }) - .catch(defaultsTo([])); - }); + //TODO: defaults to docId + } catch (err) { + if (err.status !== 404) { + throw err; + } return { docId }; + } + })); } function processBatch(response, purges) { @@ -972,10 +996,8 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { return new db.constructor(viewDBName, db.__opts).destroy(); })(); }); - - return Promise.all(destroyPromises).then(function () { + await Promise.all(destroyPromises); return {ok: true}; - }); } catch (err) { if (err.status === 404) { return {ok: true}; @@ -1011,10 +1033,12 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { /* temporary */ true, /* localDocName */ localDocName); - return fin(updateView(view, updateViewOpts).then( - function () { return queryView(view, opts); }), - function () { return view.db.destroy(); } - ); + try { + await updateView(view, updateViewOpts); + return queryView(view, opts); + } finally { + await view.db.destroy(); + } }); return tempViewQueue.finish(); } else { @@ -1068,10 +1092,7 @@ function createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) { if (typeof fun === 'function') { fun = {map : fun}; } - - const promise = Promise.resolve().then(function () { - return queryPromised(db, fun, opts); - }); + const promise = queryPromised(db, fun, opts); promisedCallback(promise, callback); return promise; }