@vue-skuilder/platform-ui 0.2.36 → 0.2.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{About-74htcNLT.js → About-BkMENQtD.js} +2 -2
- package/dist/assets/{About-74htcNLT.js.map → About-BkMENQtD.js.map} +1 -1
- package/dist/assets/{AdminDashboard-B00qno2M.js → AdminDashboard-5R-xgY-M.js} +2 -2
- package/dist/assets/{AdminDashboard-B00qno2M.js.map → AdminDashboard-5R-xgY-M.js.map} +1 -1
- package/dist/assets/{AdminLearner-SJNtSyJ_.js → AdminLearner-Br10DFSt.js} +2 -2
- package/dist/assets/{AdminLearner-SJNtSyJ_.js.map → AdminLearner-Br10DFSt.js.map} +1 -1
- package/dist/assets/BaseUserDB-BRgNfdWx.js +1 -0
- package/dist/assets/{ClassroomCtrlPanel-BSAG3h8B.js → ClassroomCtrlPanel-DQJQ0B7M.js} +2 -2
- package/dist/assets/{ClassroomCtrlPanel-BSAG3h8B.js.map → ClassroomCtrlPanel-DQJQ0B7M.js.map} +1 -1
- package/dist/assets/{Classrooms-DXNEbtsM.js → Classrooms-B5tQPFEE.js} +2 -2
- package/dist/assets/{Classrooms-DXNEbtsM.js.map → Classrooms-B5tQPFEE.js.map} +1 -1
- package/dist/assets/CouchDBSyncStrategy-0EgX8AAz.js +1 -0
- package/dist/assets/{CourseRouter-CsVa_92r.js → CourseRouter-W6S7DpZN.js} +2 -2
- package/dist/assets/{CourseRouter-CsVa_92r.js.map → CourseRouter-W6S7DpZN.js.map} +1 -1
- package/dist/assets/CourseSyncService-CrHp0wsl.js +1 -0
- package/dist/assets/{CourseWare-BTFRjgBR-DBp_fIwH.js → CourseWare-BTFRjgBR-lpqcYpAW.js} +3 -3
- package/dist/assets/{CourseWare-BTFRjgBR-DBp_fIwH.js.map → CourseWare-BTFRjgBR-lpqcYpAW.js.map} +1 -1
- package/dist/assets/{Courses-CB6GGtdm.js → Courses-TzwgFdwn.js} +2 -2
- package/dist/assets/{Courses-CB6GGtdm.js.map → Courses-TzwgFdwn.js.map} +1 -1
- package/dist/assets/{EloModeration-DUBgs-Vh.js → EloModeration-BCz7VKla.js} +2 -2
- package/dist/assets/{EloModeration-DUBgs-Vh.js.map → EloModeration-BCz7VKla.js.map} +1 -1
- package/dist/assets/{JoinCode-BBvYapCA.js → JoinCode-CEeZkFOp.js} +2 -2
- package/dist/assets/{JoinCode-BBvYapCA.js.map → JoinCode-CEeZkFOp.js.map} +1 -1
- package/dist/assets/{NewCourseDialog-DBgFVnt3.js → NewCourseDialog-DNzvvz_H.js} +2 -2
- package/dist/assets/{NewCourseDialog-DBgFVnt3.js.map → NewCourseDialog-DNzvvz_H.js.map} +1 -1
- package/dist/assets/{PipelineDebugger-BHaqzqZw.js → PipelineDebugger-DhnKlMgD.js} +3 -3
- package/dist/assets/{PipelineDebugger-BHaqzqZw.js.map → PipelineDebugger-DhnKlMgD.js.map} +1 -1
- package/dist/assets/PouchDataLayerProvider-CAuhZYIc.js +2 -0
- package/dist/assets/PouchDataLayerProvider-CAuhZYIc.js.map +1 -0
- package/dist/assets/{ReleaseNotes-Dg6mLL1C.js → ReleaseNotes-Bvw24QDI.js} +2 -2
- package/dist/assets/{ReleaseNotes-Dg6mLL1C.js.map → ReleaseNotes-Bvw24QDI.js.map} +1 -1
- package/dist/assets/{RequestPasswordReset-CcFMTnTc.js → RequestPasswordReset-YOq1JJ_o.js} +2 -2
- package/dist/assets/{RequestPasswordReset-CcFMTnTc.js.map → RequestPasswordReset-YOq1JJ_o.js.map} +1 -1
- package/dist/assets/{ResetPassword-Dw_cBJU2.js → ResetPassword-CQCb3B_Z.js} +2 -2
- package/dist/assets/{ResetPassword-Dw_cBJU2.js.map → ResetPassword-CQCb3B_Z.js.map} +1 -1
- package/dist/assets/{StaticDataLayerProvider-CtgU3VBh.js → StaticDataLayerProvider-DbGLKpb1.js} +2 -2
- package/dist/assets/{StaticDataLayerProvider-CtgU3VBh.js.map → StaticDataLayerProvider-DbGLKpb1.js.map} +1 -1
- package/dist/assets/{Study-DDsGQCTJ.js → Study-D2mXR27s.js} +2 -2
- package/dist/assets/{Study-DDsGQCTJ.js.map → Study-D2mXR27s.js.map} +1 -1
- package/dist/assets/{TagInformation-DBLoXA2a.js → TagInformation-DHw5jRNt.js} +2 -2
- package/dist/assets/{TagInformation-DBLoXA2a.js.map → TagInformation-DHw5jRNt.js.map} +1 -1
- package/dist/assets/{User-DfXUXjFb.js → User-C0xEcKaU.js} +2 -2
- package/dist/assets/{User-DfXUXjFb.js.map → User-C0xEcKaU.js.map} +1 -1
- package/dist/assets/{UserDBDebugger-DPqlc4O_.js → UserDBDebugger-BXLoT28w.js} +2 -2
- package/dist/assets/{UserDBDebugger-DPqlc4O_.js.map → UserDBDebugger-BXLoT28w.js.map} +1 -1
- package/dist/assets/UserDBDebugger-DHONc_-t.js +1 -0
- package/dist/assets/{UserStats-C04YVYv7.js → UserStats-Blm_daoT.js} +2 -2
- package/dist/assets/{UserStats-C04YVYv7.js.map → UserStats-Blm_daoT.js.map} +1 -1
- package/dist/assets/{VerifyEmail-Y05BSR57.js → VerifyEmail-DTwA6sFY.js} +2 -2
- package/dist/assets/{VerifyEmail-Y05BSR57.js.map → VerifyEmail-DTwA6sFY.js.map} +1 -1
- package/dist/assets/{admin-DcFjvYJw.js → admin-hzNSXp0o.js} +2 -2
- package/dist/assets/{admin-DcFjvYJw.js.map → admin-hzNSXp0o.js.map} +1 -1
- package/dist/assets/{chess-E2uOAyQS-BZi0vihz.js → chess-E2uOAyQS-DDTgqZMJ.js} +2 -2
- package/dist/assets/{chess-E2uOAyQS-BZi0vihz.js.map → chess-E2uOAyQS-DDTgqZMJ.js.map} +1 -1
- package/dist/assets/chess-Lfm7Fsvs-RaFhFnIh.js +1 -0
- package/dist/assets/{contentSource-DwznMSMs.js → contentSource-FGhM_ge8.js} +8 -8
- package/dist/assets/contentSource-FGhM_ge8.js.map +1 -0
- package/dist/assets/dist-5Z6GjIpR.js +1 -0
- package/dist/assets/{dist-CAHkbl3M.js → dist-BJLhyG8r.js} +3 -3
- package/dist/assets/{dist-CAHkbl3M.js.map → dist-BJLhyG8r.js.map} +1 -1
- package/dist/assets/dist-C5-_1l75.js +1 -0
- package/dist/assets/{dist-BsRvt0gH.js → dist-C8EQUxWW.js} +3 -3
- package/dist/assets/{dist-BsRvt0gH.js.map → dist-C8EQUxWW.js.map} +1 -1
- package/dist/assets/{dist-Dp6eBE2S.js → dist-DGbpjpKB.js} +2 -2
- package/dist/assets/{dist-Dp6eBE2S.js.map → dist-DGbpjpKB.js.map} +1 -1
- package/dist/assets/dist-M4o-5YLq.js +1 -0
- package/dist/assets/edit-ui.es-BT7ftsox.js +1 -0
- package/dist/assets/{edit-ui.es-UaQFL_My.js → edit-ui.es-DJgikaS7.js} +2 -2
- package/dist/assets/{edit-ui.es-UaQFL_My.js.map → edit-ui.es-DJgikaS7.js.map} +1 -1
- package/dist/assets/elo-5Z2qkwtw.js +1 -0
- package/dist/assets/{elo-COgu6Hu5.js → elo-C4ZdbMIJ.js} +2 -2
- package/dist/assets/{elo-COgu6Hu5.js.map → elo-C4ZdbMIJ.js.map} +1 -1
- package/dist/assets/{eloDistance-BV7vfiK5.js → eloDistance-CRxxdYPJ.js} +2 -2
- package/dist/assets/{eloDistance-BV7vfiK5.js.map → eloDistance-CRxxdYPJ.js.map} +1 -1
- package/dist/assets/eloDistance-DF4pmPOI.js +1 -0
- package/dist/assets/{french-Dk7YG8Td-CD7Hms2j.js → french-Dk7YG8Td-C2awfrzV.js} +2 -2
- package/dist/assets/{french-Dk7YG8Td-CD7Hms2j.js.map → french-Dk7YG8Td-C2awfrzV.js.map} +1 -1
- package/dist/assets/french-evUMlbbq-4izQyIk4.js +1 -0
- package/dist/assets/{hierarchyDefinition-DLC5DjaA.js → hierarchyDefinition-BbqnGEfR.js} +2 -2
- package/dist/assets/{hierarchyDefinition-DLC5DjaA.js.map → hierarchyDefinition-BbqnGEfR.js.map} +1 -1
- package/dist/assets/{index-CK-rfSIx.js → index-BRaeVAZb.js} +4 -4
- package/dist/assets/{index-CK-rfSIx.js.map → index-BRaeVAZb.js.map} +1 -1
- package/dist/assets/{interferenceMitigator-D78KgOxz.js → interferenceMitigator-BtAQm-0d.js} +2 -2
- package/dist/assets/{interferenceMitigator-D78KgOxz.js.map → interferenceMitigator-BtAQm-0d.js.map} +1 -1
- package/dist/assets/math-DR3fXDcX-Bj6dcLDF.js +1 -0
- package/dist/assets/{math-D_8HiEQR-E4QDLrWp.js → math-D_8HiEQR-CQynsoTm.js} +2 -2
- package/dist/assets/{math-D_8HiEQR-E4QDLrWp.js.map → math-D_8HiEQR-CQynsoTm.js.map} +1 -1
- package/dist/assets/piano-BN5Btq91-onBUnVgA.js +1 -0
- package/dist/assets/{piano-DF1g6yaX-Ck3BH5EK.js → piano-DF1g6yaX-vXbP1jX_.js} +2 -2
- package/dist/assets/{piano-DF1g6yaX-Ck3BH5EK.js.map → piano-DF1g6yaX-vXbP1jX_.js.map} +1 -1
- package/dist/assets/{pitch-CgGJFkZ1-Dd0LzmEe.js → pitch-CgGJFkZ1-DVzOpIVa.js} +2 -2
- package/dist/assets/{pitch-CgGJFkZ1-Dd0LzmEe.js.map → pitch-CgGJFkZ1-DVzOpIVa.js.map} +1 -1
- package/dist/assets/pitch-Dn0iNqiS-L2k4d66s.js +1 -0
- package/dist/assets/prescribed-Cjutx2ct.js +2 -0
- package/dist/assets/prescribed-Cjutx2ct.js.map +1 -0
- package/dist/assets/{relativePriority-DwPMECAp.js → relativePriority-fx6BMJm9.js} +2 -2
- package/dist/assets/{relativePriority-DwPMECAp.js.map → relativePriority-fx6BMJm9.js.map} +1 -1
- package/dist/assets/{server-CqR7xtQy.js → server-CUqWbXPL.js} +2 -2
- package/dist/assets/{server-CqR7xtQy.js.map → server-CUqWbXPL.js.map} +1 -1
- package/dist/assets/{sightsing-BFQ7HRig-DV69ELZf.js → sightsing-BFQ7HRig-CYuNcd8z.js} +2 -2
- package/dist/assets/{sightsing-BFQ7HRig-DV69ELZf.js.map → sightsing-BFQ7HRig-CYuNcd8z.js.map} +1 -1
- package/dist/assets/sightsing-CJX3k0Fd-C4-zGBSZ.js +1 -0
- package/dist/assets/{srs-DOsG9Y-i.js → srs-B3R2C3TU.js} +2 -2
- package/dist/assets/{srs-DOsG9Y-i.js.map → srs-B3R2C3TU.js.map} +1 -1
- package/dist/assets/srs-BD4FD2rw.js +1 -0
- package/dist/assets/{typing-BevtfWlp-CvStu5BY.js → typing-BevtfWlp-C0NbuTKI.js} +2 -2
- package/dist/assets/{typing-BevtfWlp-CvStu5BY.js.map → typing-BevtfWlp-C0NbuTKI.js.map} +1 -1
- package/dist/assets/typing-k-ojjO7G-gZjZ4YQx.js +1 -0
- package/dist/assets/{userDBKeys-DYLGKnVC.js → userDBKeys-3SQjNVdK.js} +4 -4
- package/dist/assets/{userDBKeys-DYLGKnVC.js.map → userDBKeys-3SQjNVdK.js.map} +1 -1
- package/dist/assets/{userTagPreference-cZCPqadC.js → userTagPreference-B23ZX5J4.js} +2 -2
- package/dist/assets/{userTagPreference-cZCPqadC.js.map → userTagPreference-B23ZX5J4.js.map} +1 -1
- package/dist/assets/validators-CnxSFY0I.js +2 -0
- package/dist/assets/{validators-lpYAHmRR.js.map → validators-CnxSFY0I.js.map} +1 -1
- package/dist/assets/{word-work-BOnRlZgd-CCGZdwyf.js → word-work-BOnRlZgd-CsMkeNdI.js} +2 -2
- package/dist/assets/{word-work-BOnRlZgd-CCGZdwyf.js.map → word-work-BOnRlZgd-CsMkeNdI.js.map} +1 -1
- package/dist/assets/word-work-Dd6tIKrt-WI45cKxO.js +1 -0
- package/dist/index.html +9 -9
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/package.json +7 -7
- package/dist/assets/BaseUserDB-CV2ZPZOR.js +0 -1
- package/dist/assets/CouchDBSyncStrategy-BjM7ROXC.js +0 -1
- package/dist/assets/CourseSyncService-CPU_Ll1h.js +0 -1
- package/dist/assets/PouchDataLayerProvider-DxsnSIKd.js +0 -2
- package/dist/assets/PouchDataLayerProvider-DxsnSIKd.js.map +0 -1
- package/dist/assets/UserDBDebugger-xmycWjck.js +0 -1
- package/dist/assets/chess-Lfm7Fsvs-DgN08Qx9.js +0 -1
- package/dist/assets/contentSource-DwznMSMs.js.map +0 -1
- package/dist/assets/dist-BcwaOf54.js +0 -1
- package/dist/assets/dist-CgW7D_Gh.js +0 -1
- package/dist/assets/dist-Dnehy0sn.js +0 -1
- package/dist/assets/edit-ui.es-BWqvElsJ.js +0 -1
- package/dist/assets/elo-Cwa8a3Yo.js +0 -1
- package/dist/assets/eloDistance-MReQeAuj.js +0 -1
- package/dist/assets/french-evUMlbbq-nGCjilG6.js +0 -1
- package/dist/assets/math-DR3fXDcX-C9KfHLHP.js +0 -1
- package/dist/assets/piano-BN5Btq91-CnKhyLGE.js +0 -1
- package/dist/assets/pitch-Dn0iNqiS-BxAdpDDb.js +0 -1
- package/dist/assets/prescribed-BWO17Gan.js +0 -2
- package/dist/assets/prescribed-BWO17Gan.js.map +0 -1
- package/dist/assets/sightsing-CJX3k0Fd-CG94OiDr.js +0 -1
- package/dist/assets/srs-DGscV6W4.js +0 -1
- package/dist/assets/typing-k-ojjO7G-AF8vU_q7.js +0 -1
- package/dist/assets/validators-lpYAHmRR.js +0 -2
- package/dist/assets/word-work-Dd6tIKrt-BNTSCq5F.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contentSource-DwznMSMs.js","names":["getRandomValues","rnds8","rng","validate","REGEX","byteToHex","stringify","validate","v4","rng","stringify","isBinaryObject","cloneBinaryObject","funcToString","objectCtorString","isPlainObject","clone","pick","hasLocal","nextTick","EE","guardedConsole","PouchError","MISSING_BULK_DOCS","MISSING_DOC","REV_CONFLICT","INVALID_ID","MISSING_ID","RESERVED_ID","UNKNOWN_ERROR","BAD_ARG","QUERY_PARSE_ERROR","DOC_VALIDATION","BAD_REQUEST","NOT_AN_OBJECT","IDB_ERROR","INVALID_REV","MISSING_STUB","createError","generateErrorFromResponse","isRemote","upsert","tryAndPut","thisAtob","createBlob","binaryStringToArrayBuffer","binStringToBluffer","b64ToBluffer","setImmediateShim","Md5","stringMd5","v4","TaskQueue","h","getFieldFromDoc","compare","parseField","combinationFields","isCombinationalField","getKey","getValue","mergeAndedSelectors","mergeGtGte","mergeLtLte","mergeNe","mergeEq","mergeRegex","mergeAndedSelectorsNested","isAndInSelector","massageSelector","normalizeArrayOperators","pad","padLeft","MIN_MAGNITUDE","MAGNITUDE_DIGITS","SEP","collate","normalizeKey","collationIndex","stringCollate","arrayCollate","objectCollate","indexify","numToIndexableString","toIndexableString","parseNumber","pop","parseIndexableString","createFieldSorter","filterInMemoryFields","rowFilter","matchCominationalSelector","matchSelector","match","matchers","fieldExists","fieldIsNotUndefined","modField","arrayContainsValue","arrayContainsAllValues","arraySize","regexMatch","typeMatch","matchesSelector","CHANGES_BATCH_SIZE","QueryParseError","NotFoundError","BuiltInError","promisedCallback","callbackify","fin","sequentialize","uniq","mapToKeysArray","log","TaskQueue$1","stringify","createViewSignature","createView","persistentQueues","tempViewQueue","CHANGES_BATCH_SIZE$1","parseViewName","isGenOne","emitError","createAbstractMapReduce","mapper","reducer","ddocValidator","Md5","uniq","base64StringToBlobOrBuffer","Headers","uniq","Headers","abstractMapReduce","plugin","Headers","process","PouchDBFind","PouchDBAuth","DocType","mergeHints","DocType","DocType","moment","path","os","fs","log","moment","moment","log","DocType","getStartAndEndKeys","moment","REVIEW_TIME_FORMAT","filterAllDocsByPrefix","moment","getCourseDB","exports","getCourseDB","native","DocType","getCourseDB","DocType"],"sources":["../../../common/dist/wire-format.mjs","../../../common/dist/db.mjs","../../../common/dist/namespacer.mjs","../../../common/dist/enums/FieldType.mjs","../../../common/dist/course-data.mjs","../../__vite-browser-external","../../../common/dist/interfaces/TagFilter.mjs","../../../../node_modules/spark-md5/spark-md5.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/regex.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/validate.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/pouchdb/node_modules/uuid/dist/esm-browser/v4.js","../../../../node_modules/vuvuzela/index.js","../../../../node_modules/events/events.js","../../../../node_modules/pouchdb/lib/index-browser.es.js","../../../../node_modules/pouchdb-errors/lib/index.es.js","../../../../node_modules/pouchdb-fetch/lib/index-browser.es.js","../../../../node_modules/pouchdb-binary-utils/lib/index-browser.es.js","../../../../node_modules/pouchdb-collate/lib/index.es.js","../../../../node_modules/pouchdb-md5/lib/index-browser.es.js","../../../../node_modules/pouchdb-utils/lib/index-browser.es.js","../../../../node_modules/pouchdb-mapreduce-utils/lib/index.es.js","../../../../node_modules/pouchdb-abstract-mapreduce/lib/index.es.js","../../../../node_modules/pouchdb-selector-core/lib/index.es.js","../../../../node_modules/pouchdb-find/lib/index-browser.es.js","../../../../node_modules/@nilock2/pouchdb-authentication/lib/index.es.js","../../../../node_modules/process/browser.js","../../../db/dist/impl/couch/pouchdb-setup.mjs","../../../db/dist/impl/couch/courseLookupDB.mjs","../../../db/dist/util/Loggable.mjs","../../../db/dist/core/types/contentNavigationStrategy.mjs","../../../db/dist/core/orchestration/signal.mjs","../../../db/dist/core/orchestration/recording.mjs","../../../db/dist/core/orchestration/index.mjs","../../../db/dist/core/navigators/Pipeline.mjs","../../../db/dist/core/navigators/generators/CompositeGenerator.mjs","../../../db/dist/core/navigators/defaults.mjs","../../../db/dist/core/navigators/pipelinePlan.mjs","../../../db/dist/core/util/index.mjs","../../../db/dist/study/SpacedRepetition.mjs","../../../db/dist/util/dataDirectory.mjs","../../../db/dist/impl/couch/updateQueue.mjs","../../../db/dist/impl/couch/clientCache.mjs","../../../db/dist/core/navigators/filters/WeightedFilter.mjs","../../../db/dist/core/navigators/PipelineAssembler.mjs","../../../db/dist/impl/common/userDBHelpers.mjs","../../../db/dist/impl/couch/user-course-relDB.mjs","../../../db/dist/core/types/strategyState.mjs","../../../db/dist/core/types/hydration.mjs","../../../db/dist/impl/common/BaseUserDB.mjs","../../../db/dist/impl/couch/classroomDB.mjs","../../../db/dist/impl/couch/adminDB.mjs","../../../db/dist/impl/couch/CourseSyncService.mjs","../../../../node_modules/cross-fetch/dist/browser-ponyfill.js","../../../db/dist/impl/couch/auth.mjs","../../../db/dist/impl/couch/CouchDBSyncStrategy.mjs","../../../db/dist/impl/couch/index.mjs","../../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../../node_modules/uuid/dist/esm-browser/rng.js","../../../../node_modules/uuid/dist/esm-browser/native.js","../../../../node_modules/uuid/dist/esm-browser/v4.js","../../../db/dist/impl/couch/courseAPI.mjs","../../../db/dist/impl/couch/courseDB.mjs","../../../db/dist/study/TagFilteredContentSource.mjs","../../../db/dist/core/interfaces/contentSource.mjs"],"sourcesContent":["export var Status;\n(function (Status) {\n Status[\"awaitingResponse\"] = \"awaiting\";\n Status[\"ok\"] = \"ok\";\n Status[\"warning\"] = \"warning\";\n Status[\"error\"] = \"error\";\n})(Status || (Status = {}));\nexport var ServerRequestType;\n(function (ServerRequestType) {\n ServerRequestType[\"CREATE_CLASSROOM\"] = \"CREATE_CLASSROOM\";\n ServerRequestType[\"DELETE_CLASSROOM\"] = \"DELETE_CLASSROOM\";\n ServerRequestType[\"JOIN_CLASSROOM\"] = \"JOIN_CLASSROOM\";\n ServerRequestType[\"LEAVE_CLASSROOM\"] = \"LEAVE_CLASSROOM\";\n ServerRequestType[\"CREATE_COURSE\"] = \"CREATE_COURSE\";\n ServerRequestType[\"DELETE_COURSE\"] = \"DELETE_COURSE\";\n ServerRequestType[\"ADD_COURSE_DATA\"] = \"ADD_COURSE_DATA\";\n ServerRequestType[\"PACK_COURSE\"] = \"PACK_COURSE\";\n})(ServerRequestType || (ServerRequestType = {}));\n//# sourceMappingURL=wire-format.mjs.map\n","export var DocType;\n(function (DocType) {\n DocType[\"DISPLAYABLE_DATA\"] = \"DISPLAYABLE_DATA\";\n DocType[\"CARD\"] = \"CARD\";\n DocType[\"DATASHAPE\"] = \"DATASHAPE\";\n DocType[\"QUESTIONTYPE\"] = \"QUESTION\";\n DocType[\"VIEW\"] = \"VIEW\";\n DocType[\"PEDAGOGY\"] = \"PEDAGOGY\";\n DocType[\"CARDRECORD\"] = \"CARDRECORD\";\n DocType[\"SCHEDULED_CARD\"] = \"SCHEDULED_CARD\";\n DocType[\"TAG\"] = \"TAG\";\n})(DocType || (DocType = {}));\nconst cardHistoryPrefix = 'cardH';\nexport function getCardHistoryID(courseID, cardID) {\n return `${cardHistoryPrefix}-${courseID}-${cardID}`;\n}\nexport function parseCardHistoryID(id) {\n const split = id.split('-');\n let error = '';\n error += split.length === 3 ? '' : `\\n\\tgiven ID has incorrect number of '-' characters`;\n error +=\n split[0] === cardHistoryPrefix ? '' : `\\n\\tgiven ID does not start with ${cardHistoryPrefix}`;\n if (split.length === 3 && split[0] === cardHistoryPrefix) {\n return {\n courseID: split[1],\n cardID: split[2],\n };\n }\n else {\n throw new Error('parseCardHistory Error:' + error);\n }\n}\nexport function areQuestionRecords(h) {\n return isQuestionRecord(h.records[0]);\n}\nexport function isQuestionRecord(c) {\n return c.userAnswer !== undefined;\n}\n//# sourceMappingURL=db.mjs.map\n","export class NameSpacer {\n static getDataShapeDescriptor(shapeStr) {\n const splitArray = shapeStr.split('.');\n if (splitArray.length !== 3) {\n throw new Error(`shapeStr [${shapeStr}] not valid`);\n }\n else {\n return {\n course: splitArray[0],\n dataShape: splitArray[2],\n };\n }\n }\n static getDataShapeString(shapeDescription) {\n return `${shapeDescription.course}.datashape.${shapeDescription.dataShape}`;\n }\n static getViewDescriptor(viewStr) {\n const splitArray = viewStr.split('.');\n if (splitArray.length !== 4) {\n throw new Error('viewStr not valid');\n }\n else {\n return {\n course: splitArray[0],\n questionType: splitArray[2],\n view: splitArray[3],\n };\n }\n }\n static getViewString(viewDescription) {\n return (`${viewDescription.course}.question.` +\n `${viewDescription.questionType}.${viewDescription.view}`);\n }\n static getQuestionDescriptor(questionStr) {\n const splitArray = questionStr.split('.');\n if (splitArray.length !== 3) {\n throw new Error('questionStr not valid');\n }\n else {\n return {\n course: splitArray[0],\n questionType: splitArray[2],\n };\n }\n }\n static getQuestionString(questionDescription) {\n return `${questionDescription.course}.question.${questionDescription.questionType}`;\n }\n}\n//# sourceMappingURL=namespacer.mjs.map\n","/**\n * These are the defined types of user input that can hydrate a configured\n * dataShape.\n *\n * These field types map to input elements and specific validation and processing functions.\n */\nexport var FieldType;\n(function (FieldType) {\n FieldType[\"STRING\"] = \"string\";\n FieldType[\"NUMBER\"] = \"number\";\n FieldType[\"INT\"] = \"int\";\n FieldType[\"IMAGE\"] = \"image\";\n FieldType[\"MARKDOWN\"] = \"markdown\";\n FieldType[\"AUDIO\"] = \"audio\";\n FieldType[\"MIDI\"] = \"midi\";\n FieldType[\"MEDIA_UPLOADS\"] = \"uploads\";\n FieldType[\"CHESS_PUZZLE\"] = \"chess_puzzle\";\n})(FieldType || (FieldType = {}));\n//# sourceMappingURL=FieldType.mjs.map\n","import { DocType } from './db.mjs';\nimport { NameSpacer } from './namespacer.mjs';\nimport { FieldType } from './enums/FieldType.mjs';\nexport function prepareNote55(courseID, codeCourse, shape, \n// [ ] add typing\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndata, author, _tags, uploads) {\n const dataShapeId = NameSpacer.getDataShapeString({\n course: codeCourse,\n dataShape: shape.name,\n });\n const attachmentFields = shape.fields\n .map((field) => {\n // make a copy, in order NOT to append to the datashape\n const copy = {\n name: field.name,\n type: field.type,\n };\n return copy;\n })\n .filter((field) => {\n return field.type === FieldType.IMAGE || field.type === FieldType.AUDIO;\n })\n .concat([\n {\n name: 'autoplayAudio',\n type: FieldType.AUDIO,\n },\n ]);\n for (let i = 1; i < 11; i++) {\n if (data[`audio-${i}`]) {\n attachmentFields.push({\n name: `audio-${i}`,\n type: FieldType.AUDIO,\n });\n }\n if (data[`image-${i}`]) {\n attachmentFields.push({\n name: `image-${i}`,\n type: FieldType.IMAGE,\n });\n }\n }\n if (data[`audio-11`]) {\n throw new Error('Too many audio attachments');\n }\n if (data[`image-11`]) {\n throw new Error('Too many image attachments');\n }\n const attachments = {};\n const payload = {\n course: courseID,\n data: [],\n docType: DocType.DISPLAYABLE_DATA,\n id_datashape: dataShapeId,\n };\n if (author) {\n payload.author = author;\n }\n attachmentFields.forEach((attField) => {\n attachments[attField.name] = data[attField.name];\n });\n //\n if (uploads) {\n Object.keys(uploads).forEach((k) => {\n attachments[k] = uploads[k];\n });\n }\n if (attachmentFields.length !== 0 || (uploads && Object.keys(uploads).length)) {\n payload._attachments = attachments;\n }\n shape.fields\n .filter((field) => {\n return field.type !== FieldType.IMAGE && field.type !== FieldType.AUDIO;\n })\n .forEach((field) => {\n payload.data.push({\n name: field.name,\n data: data[field.name],\n });\n });\n return payload;\n}\n/**\n * Type guard to check if performance is structured (TaggedPerformance).\n */\nexport function isTaggedPerformance(p) {\n return typeof p === 'object' && p !== null && '_global' in p;\n}\n//# sourceMappingURL=course-data.mjs.map\n","module.exports = {}","/**\n * Creates an empty TagFilter with no constraints.\n */\nexport function emptyTagFilter() {\n return {\n include: [],\n exclude: [],\n };\n}\n/**\n * Checks if a TagFilter has any active constraints.\n */\nexport function hasActiveFilter(filter) {\n if (!filter)\n return false;\n return filter.include.length > 0 || filter.exclude.length > 0;\n}\n//# sourceMappingURL=TagFilter.mjs.map\n","(function (factory) {\n if (typeof exports === 'object') {\n // Node/CommonJS\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n // AMD\n define(factory);\n } else {\n // Browser globals (with support for web workers)\n var glob;\n\n try {\n glob = window;\n } catch (e) {\n glob = self;\n }\n\n glob.SparkMD5 = factory();\n }\n}(function (undefined) {\n\n 'use strict';\n\n /*\n * Fastest md5 implementation around (JKM md5).\n * Credits: Joseph Myers\n *\n * @see http://www.myersdaily.org/joseph/javascript/md5-text.html\n * @see http://jsperf.com/md5-shootout/7\n */\n\n /* this function is much faster,\n so if possible we use it. Some IEs\n are the only ones I know of that\n need the idiotic second function,\n generated by an if clause. */\n var add32 = function (a, b) {\n return (a + b) & 0xFFFFFFFF;\n },\n hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\n\n function cmn(q, a, b, x, s, t) {\n a = add32(add32(a, q), add32(x, t));\n return add32((a << s) | (a >>> (32 - s)), b);\n }\n\n function md5cycle(x, k) {\n var a = x[0],\n b = x[1],\n c = x[2],\n d = x[3];\n\n a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[10] - 42063 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n a = (a << 7 | a >>> 25) + b | 0;\n d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n d = (d << 12 | d >>> 20) + a | 0;\n c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n c = (c << 17 | c >>> 15) + d | 0;\n b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n b = (b << 22 | b >>> 10) + c | 0;\n\n a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n a = (a << 5 | a >>> 27) + b | 0;\n d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n d = (d << 9 | d >>> 23) + a | 0;\n c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n c = (c << 14 | c >>> 18) + d | 0;\n b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n b = (b << 20 | b >>> 12) + c | 0;\n\n a += (b ^ c ^ d) + k[5] - 378558 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n a = (a << 4 | a >>> 28) + b | 0;\n d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n d = (d << 11 | d >>> 21) + a | 0;\n c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n c = (c << 16 | c >>> 16) + d | 0;\n b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n b = (b << 23 | b >>> 9) + c | 0;\n\n a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n b = (b << 21 |b >>> 11) + c | 0;\n a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n a = (a << 6 | a >>> 26) + b | 0;\n d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n d = (d << 10 | d >>> 22) + a | 0;\n c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n c = (c << 15 | c >>> 17) + d | 0;\n b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n b = (b << 21 | b >>> 11) + c | 0;\n\n x[0] = a + x[0] | 0;\n x[1] = b + x[1] | 0;\n x[2] = c + x[2] | 0;\n x[3] = d + x[3] | 0;\n }\n\n function md5blk(s) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n }\n return md5blks;\n }\n\n function md5blk_array(a) {\n var md5blks = [],\n i; /* Andy King said do it this way. */\n\n for (i = 0; i < 64; i += 4) {\n md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n }\n return md5blks;\n }\n\n function md51(s) {\n var n = s.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk(s.substring(i - 64, i)));\n }\n s = s.substring(i - 64);\n length = s.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);\n }\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n return state;\n }\n\n function md51_array(a) {\n var n = a.length,\n state = [1732584193, -271733879, -1732584194, 271733878],\n i,\n length,\n tail,\n tmp,\n lo,\n hi;\n\n for (i = 64; i <= n; i += 64) {\n md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n }\n\n // Not sure if it is a bug, however IE10 will always produce a sub array of length 1\n // containing the last element of the parent array if the sub array specified starts\n // beyond the length of the parent array - weird.\n // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue\n a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);\n\n length = a.length;\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= a[i] << ((i % 4) << 3);\n }\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(state, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Beware that the final length might not fit in 32 bits so we take care of that\n tmp = n * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n\n md5cycle(state, tail);\n\n return state;\n }\n\n function rhex(n) {\n var s = '',\n j;\n for (j = 0; j < 4; j += 1) {\n s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];\n }\n return s;\n }\n\n function hex(x) {\n var i;\n for (i = 0; i < x.length; i += 1) {\n x[i] = rhex(x[i]);\n }\n return x.join('');\n }\n\n // In some cases the fast add32 function cannot be used..\n if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {\n add32 = function (x, y) {\n var lsw = (x & 0xFFFF) + (y & 0xFFFF),\n msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return (msw << 16) | (lsw & 0xFFFF);\n };\n }\n\n // ---------------------------------------------------\n\n /**\n * ArrayBuffer slice polyfill.\n *\n * @see https://github.com/ttaubert/node-arraybuffer-slice\n */\n\n if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {\n (function () {\n function clamp(val, length) {\n val = (val | 0) || 0;\n\n if (val < 0) {\n return Math.max(val + length, 0);\n }\n\n return Math.min(val, length);\n }\n\n ArrayBuffer.prototype.slice = function (from, to) {\n var length = this.byteLength,\n begin = clamp(from, length),\n end = length,\n num,\n target,\n targetArray,\n sourceArray;\n\n if (to !== undefined) {\n end = clamp(to, length);\n }\n\n if (begin > end) {\n return new ArrayBuffer(0);\n }\n\n num = end - begin;\n target = new ArrayBuffer(num);\n targetArray = new Uint8Array(target);\n\n sourceArray = new Uint8Array(this, begin, num);\n targetArray.set(sourceArray);\n\n return target;\n };\n })();\n }\n\n // ---------------------------------------------------\n\n /**\n * Helpers.\n */\n\n function toUtf8(str) {\n if (/[\\u0080-\\uFFFF]/.test(str)) {\n str = unescape(encodeURIComponent(str));\n }\n\n return str;\n }\n\n function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n var length = str.length,\n buff = new ArrayBuffer(length),\n arr = new Uint8Array(buff),\n i;\n\n for (i = 0; i < length; i += 1) {\n arr[i] = str.charCodeAt(i);\n }\n\n return returnUInt8Array ? arr : buff;\n }\n\n function arrayBuffer2Utf8Str(buff) {\n return String.fromCharCode.apply(null, new Uint8Array(buff));\n }\n\n function concatenateArrayBuffers(first, second, returnUInt8Array) {\n var result = new Uint8Array(first.byteLength + second.byteLength);\n\n result.set(new Uint8Array(first));\n result.set(new Uint8Array(second), first.byteLength);\n\n return returnUInt8Array ? result : result.buffer;\n }\n\n function hexToBinaryString(hex) {\n var bytes = [],\n length = hex.length,\n x;\n\n for (x = 0; x < length - 1; x += 2) {\n bytes.push(parseInt(hex.substr(x, 2), 16));\n }\n\n return String.fromCharCode.apply(String, bytes);\n }\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation.\n *\n * Use this class to perform an incremental md5, otherwise use the\n * static methods instead.\n */\n\n function SparkMD5() {\n // call reset to init the instance\n this.reset();\n }\n\n /**\n * Appends a string.\n * A conversion will be applied if an utf8 string is detected.\n *\n * @param {String} str The string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.append = function (str) {\n // Converts the string to utf8 bytes if necessary\n // Then append as binary\n this.appendBinary(toUtf8(str));\n\n return this;\n };\n\n /**\n * Appends a binary string.\n *\n * @param {String} contents The binary string to be appended\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.appendBinary = function (contents) {\n this._buff += contents;\n this._length += contents.length;\n\n var length = this._buff.length,\n i;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n }\n\n this._buff = this._buff.substring(i - 64);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n i,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.reset = function () {\n this._buff = '';\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.prototype.getState = function () {\n return {\n buff: this._buff,\n length: this._length,\n hash: this._hash.slice()\n };\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5} The instance itself\n */\n SparkMD5.prototype.setState = function (state) {\n this._buff = state.buff;\n this._length = state.length;\n this._hash = state.hash;\n\n return this;\n };\n\n /**\n * Releases memory used by the incremental buffer and other additional\n * resources. If you plan to use the instance again, use reset instead.\n */\n SparkMD5.prototype.destroy = function () {\n delete this._hash;\n delete this._buff;\n delete this._length;\n };\n\n /**\n * Finish the final calculation based on the tail.\n *\n * @param {Array} tail The tail (will be modified)\n * @param {Number} length The length of the remaining buffer\n */\n SparkMD5.prototype._finish = function (tail, length) {\n var i = length,\n tmp,\n lo,\n hi;\n\n tail[i >> 2] |= 0x80 << ((i % 4) << 3);\n if (i > 55) {\n md5cycle(this._hash, tail);\n for (i = 0; i < 16; i += 1) {\n tail[i] = 0;\n }\n }\n\n // Do the final computation based on the tail and length\n // Beware that the final length may not fit in 32 bits so we take care of that\n tmp = this._length * 8;\n tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n lo = parseInt(tmp[2], 16);\n hi = parseInt(tmp[1], 16) || 0;\n\n tail[14] = lo;\n tail[15] = hi;\n md5cycle(this._hash, tail);\n };\n\n /**\n * Performs the md5 hash on a string.\n * A conversion will be applied if utf8 string is detected.\n *\n * @param {String} str The string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hash = function (str, raw) {\n // Converts the string to utf8 bytes if necessary\n // Then compute it using the binary function\n return SparkMD5.hashBinary(toUtf8(str), raw);\n };\n\n /**\n * Performs the md5 hash on a binary string.\n *\n * @param {String} content The binary string\n * @param {Boolean} [raw] True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.hashBinary = function (content, raw) {\n var hash = md51(content),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n // ---------------------------------------------------\n\n /**\n * SparkMD5 OOP implementation for array buffers.\n *\n * Use this class to perform an incremental md5 ONLY for array buffers.\n */\n SparkMD5.ArrayBuffer = function () {\n // call reset to init the instance\n this.reset();\n };\n\n /**\n * Appends an array buffer.\n *\n * @param {ArrayBuffer} arr The array to be appended\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.append = function (arr) {\n var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),\n length = buff.length,\n i;\n\n this._length += arr.byteLength;\n\n for (i = 64; i <= length; i += 64) {\n md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n }\n\n this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n\n return this;\n };\n\n /**\n * Finishes the incremental computation, reseting the internal state and\n * returning the result.\n *\n * @param {Boolean} raw True to get the raw string, false to get the hex string\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.prototype.end = function (raw) {\n var buff = this._buff,\n length = buff.length,\n tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n i,\n ret;\n\n for (i = 0; i < length; i += 1) {\n tail[i >> 2] |= buff[i] << ((i % 4) << 3);\n }\n\n this._finish(tail, length);\n ret = hex(this._hash);\n\n if (raw) {\n ret = hexToBinaryString(ret);\n }\n\n this.reset();\n\n return ret;\n };\n\n /**\n * Resets the internal state of the computation.\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.reset = function () {\n this._buff = new Uint8Array(0);\n this._length = 0;\n this._hash = [1732584193, -271733879, -1732584194, 271733878];\n\n return this;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @return {Object} The state\n */\n SparkMD5.ArrayBuffer.prototype.getState = function () {\n var state = SparkMD5.prototype.getState.call(this);\n\n // Convert buffer to a string\n state.buff = arrayBuffer2Utf8Str(state.buff);\n\n return state;\n };\n\n /**\n * Gets the internal state of the computation.\n *\n * @param {Object} state The state\n *\n * @return {SparkMD5.ArrayBuffer} The instance itself\n */\n SparkMD5.ArrayBuffer.prototype.setState = function (state) {\n // Convert string to buffer\n state.buff = utf8Str2ArrayBuffer(state.buff, true);\n\n return SparkMD5.prototype.setState.call(this, state);\n };\n\n SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n\n SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n\n /**\n * Performs the md5 hash on an array buffer.\n *\n * @param {ArrayBuffer} arr The array buffer\n * @param {Boolean} [raw] True to get the raw string, false to get the hex one\n *\n * @return {String} The result\n */\n SparkMD5.ArrayBuffer.hash = function (arr, raw) {\n var hash = md51_array(new Uint8Array(arr)),\n ret = hex(hash);\n\n return raw ? hexToBinaryString(ret) : ret;\n };\n\n return SparkMD5;\n}));\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","'use strict';\n\n/**\n * Stringify/parse functions that don't operate\n * recursively, so they avoid call stack exceeded\n * errors.\n */\nexports.stringify = function stringify(input) {\n var queue = [];\n queue.push({obj: input});\n\n var res = '';\n var next, obj, prefix, val, i, arrayPrefix, keys, k, key, value, objPrefix;\n while ((next = queue.pop())) {\n obj = next.obj;\n prefix = next.prefix || '';\n val = next.val || '';\n res += prefix;\n if (val) {\n res += val;\n } else if (typeof obj !== 'object') {\n res += typeof obj === 'undefined' ? null : JSON.stringify(obj);\n } else if (obj === null) {\n res += 'null';\n } else if (Array.isArray(obj)) {\n queue.push({val: ']'});\n for (i = obj.length - 1; i >= 0; i--) {\n arrayPrefix = i === 0 ? '' : ',';\n queue.push({obj: obj[i], prefix: arrayPrefix});\n }\n queue.push({val: '['});\n } else { // object\n keys = [];\n for (k in obj) {\n if (obj.hasOwnProperty(k)) {\n keys.push(k);\n }\n }\n queue.push({val: '}'});\n for (i = keys.length - 1; i >= 0; i--) {\n key = keys[i];\n value = obj[key];\n objPrefix = (i > 0 ? ',' : '');\n objPrefix += JSON.stringify(key) + ':';\n queue.push({obj: value, prefix: objPrefix});\n }\n queue.push({val: '{'});\n }\n }\n return res;\n};\n\n// Convenience function for the parse function.\n// This pop function is basically copied from\n// pouchCollate.parseIndexableString\nfunction pop(obj, stack, metaStack) {\n var lastMetaElement = metaStack[metaStack.length - 1];\n if (obj === lastMetaElement.element) {\n // popping a meta-element, e.g. an object whose value is another object\n metaStack.pop();\n lastMetaElement = metaStack[metaStack.length - 1];\n }\n var element = lastMetaElement.element;\n var lastElementIndex = lastMetaElement.index;\n if (Array.isArray(element)) {\n element.push(obj);\n } else if (lastElementIndex === stack.length - 2) { // obj with key+value\n var key = stack.pop();\n element[key] = obj;\n } else {\n stack.push(obj); // obj with key only\n }\n}\n\nexports.parse = function (str) {\n var stack = [];\n var metaStack = []; // stack for arrays and objects\n var i = 0;\n var collationIndex,parsedNum,numChar;\n var parsedString,lastCh,numConsecutiveSlashes,ch;\n var arrayElement, objElement;\n while (true) {\n collationIndex = str[i++];\n if (collationIndex === '}' ||\n collationIndex === ']' ||\n typeof collationIndex === 'undefined') {\n if (stack.length === 1) {\n return stack.pop();\n } else {\n pop(stack.pop(), stack, metaStack);\n continue;\n }\n }\n switch (collationIndex) {\n case ' ':\n case '\\t':\n case '\\n':\n case ':':\n case ',':\n break;\n case 'n':\n i += 3; // 'ull'\n pop(null, stack, metaStack);\n break;\n case 't':\n i += 3; // 'rue'\n pop(true, stack, metaStack);\n break;\n case 'f':\n i += 4; // 'alse'\n pop(false, stack, metaStack);\n break;\n case '0':\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n case '-':\n parsedNum = '';\n i--;\n while (true) {\n numChar = str[i++];\n if (/[\\d\\.\\-e\\+]/.test(numChar)) {\n parsedNum += numChar;\n } else {\n i--;\n break;\n }\n }\n pop(parseFloat(parsedNum), stack, metaStack);\n break;\n case '\"':\n parsedString = '';\n lastCh = void 0;\n numConsecutiveSlashes = 0;\n while (true) {\n ch = str[i++];\n if (ch !== '\"' || (lastCh === '\\\\' &&\n numConsecutiveSlashes % 2 === 1)) {\n parsedString += ch;\n lastCh = ch;\n if (lastCh === '\\\\') {\n numConsecutiveSlashes++;\n } else {\n numConsecutiveSlashes = 0;\n }\n } else {\n break;\n }\n }\n pop(JSON.parse('\"' + parsedString + '\"'), stack, metaStack);\n break;\n case '[':\n arrayElement = { element: [], index: stack.length };\n stack.push(arrayElement.element);\n metaStack.push(arrayElement);\n break;\n case '{':\n objElement = { element: {}, index: stack.length };\n stack.push(objElement.element);\n metaStack.push(objElement);\n break;\n default:\n throw new Error(\n 'unexpectedly reached end of input: ' + collationIndex);\n }\n }\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","import Md5 from 'spark-md5';\nimport { v4 } from 'uuid';\nimport vuvuzela from 'vuvuzela';\nimport EE from 'events';\n\nfunction isBinaryObject(object) {\n return (typeof ArrayBuffer !== 'undefined' && object instanceof ArrayBuffer) ||\n (typeof Blob !== 'undefined' && object instanceof Blob);\n}\n\n/**\n * @template {ArrayBuffer | Blob} T\n * @param {T} object\n * @returns {T}\n */\nfunction cloneBinaryObject(object) {\n return object instanceof ArrayBuffer\n ? object.slice(0)\n : object.slice(0, object.size, object.type);\n}\n\n// most of this is borrowed from lodash.isPlainObject:\n// https://github.com/fis-components/lodash.isplainobject/\n// blob/29c358140a74f252aeb08c9eb28bef86f2217d4a/index.js\n\nvar funcToString = Function.prototype.toString;\nvar objectCtorString = funcToString.call(Object);\n\nfunction isPlainObject(value) {\n var proto = Object.getPrototypeOf(value);\n /* istanbul ignore if */\n if (proto === null) { // not sure when this happens, but I guess it can\n return true;\n }\n var Ctor = proto.constructor;\n return (typeof Ctor == 'function' &&\n Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);\n}\n\nfunction clone(object) {\n var newObject;\n var i;\n var len;\n\n if (!object || typeof object !== 'object') {\n return object;\n }\n\n if (Array.isArray(object)) {\n newObject = [];\n for (i = 0, len = object.length; i < len; i++) {\n newObject[i] = clone(object[i]);\n }\n return newObject;\n }\n\n // special case: to avoid inconsistencies between IndexedDB\n // and other backends, we automatically stringify Dates\n if (object instanceof Date && isFinite(object)) {\n return object.toISOString();\n }\n\n if (isBinaryObject(object)) {\n return cloneBinaryObject(object);\n }\n\n if (!isPlainObject(object)) {\n return object; // don't clone objects like Workers\n }\n\n newObject = {};\n for (i in object) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(object, i)) {\n var value = clone(object[i]);\n if (typeof value !== 'undefined') {\n newObject[i] = value;\n }\n }\n }\n return newObject;\n}\n\nfunction once(fun) {\n var called = false;\n return function (...args) {\n /* istanbul ignore if */\n if (called) {\n // this is a smoke test and should never actually happen\n throw new Error('once called more than once');\n } else {\n called = true;\n fun.apply(this, args);\n }\n };\n}\n\nfunction toPromise(func) {\n //create the function we will be returning\n return function (...args) {\n // Clone arguments\n args = clone(args);\n var self = this;\n // if the last argument is a function, assume its a callback\n var usedCB = (typeof args[args.length - 1] === 'function') ? args.pop() : false;\n var promise = new Promise(function (fulfill, reject) {\n var resp;\n try {\n var callback = once(function (err, mesg) {\n if (err) {\n reject(err);\n } else {\n fulfill(mesg);\n }\n });\n // create a callback for this invocation\n // apply the function in the orig context\n args.push(callback);\n resp = func.apply(self, args);\n if (resp && typeof resp.then === 'function') {\n fulfill(resp);\n }\n } catch (e) {\n reject(e);\n }\n });\n // if there is a callback, call it back\n if (usedCB) {\n promise.then(function (result) {\n usedCB(null, result);\n }, usedCB);\n }\n return promise;\n };\n}\n\nfunction logApiCall(self, name, args) {\n /* istanbul ignore if */\n if (self.constructor.listeners('debug').length) {\n var logArgs = ['api', self.name, name];\n for (var i = 0; i < args.length - 1; i++) {\n logArgs.push(args[i]);\n }\n self.constructor.emit('debug', logArgs);\n\n // override the callback itself to log the response\n var origCallback = args[args.length - 1];\n args[args.length - 1] = function (err, res) {\n var responseArgs = ['api', self.name, name];\n responseArgs = responseArgs.concat(\n err ? ['error', err] : ['success', res]\n );\n self.constructor.emit('debug', responseArgs);\n origCallback(err, res);\n };\n }\n}\n\nfunction adapterFun(name, callback) {\n return toPromise(function (...args) {\n if (this._closed) {\n return Promise.reject(new Error('database is closed'));\n }\n if (this._destroyed) {\n return Promise.reject(new Error('database is destroyed'));\n }\n var self = this;\n logApiCall(self, name, args);\n if (!this.taskqueue.isReady) {\n return new Promise(function (fulfill, reject) {\n self.taskqueue.addTask(function (failed) {\n if (failed) {\n reject(failed);\n } else {\n fulfill(self[name].apply(self, args));\n }\n });\n });\n }\n return callback.apply(this, args);\n });\n}\n\n// like underscore/lodash _.pick()\nfunction pick(obj, arr) {\n var res = {};\n for (var i = 0, len = arr.length; i < len; i++) {\n var prop = arr[i];\n if (prop in obj) {\n res[prop] = obj[prop];\n }\n }\n return res;\n}\n\n// Most browsers throttle concurrent requests at 6, so it's silly\n// to shim _bulk_get by trying to launch potentially hundreds of requests\n// and then letting the majority time out. We can handle this ourselves.\nvar MAX_NUM_CONCURRENT_REQUESTS = 6;\n\nfunction identityFunction(x) {\n return x;\n}\n\nfunction formatResultForOpenRevsGet(result) {\n return [{\n ok: result\n }];\n}\n\n// shim for P/CouchDB adapters that don't directly implement _bulk_get\nfunction bulkGet(db, opts, callback) {\n var requests = opts.docs;\n\n // consolidate into one request per doc if possible\n var requestsById = new Map();\n requests.forEach(function (request) {\n if (requestsById.has(request.id)) {\n requestsById.get(request.id).push(request);\n } else {\n requestsById.set(request.id, [request]);\n }\n });\n\n var numDocs = requestsById.size;\n var numDone = 0;\n var perDocResults = new Array(numDocs);\n\n function collapseResultsAndFinish() {\n var results = [];\n perDocResults.forEach(function (res) {\n res.docs.forEach(function (info) {\n results.push({\n id: res.id,\n docs: [info]\n });\n });\n });\n callback(null, {results});\n }\n\n function checkDone() {\n if (++numDone === numDocs) {\n collapseResultsAndFinish();\n }\n }\n\n function gotResult(docIndex, id, docs) {\n perDocResults[docIndex] = {id, docs};\n checkDone();\n }\n\n var allRequests = [];\n requestsById.forEach(function (value, key) {\n allRequests.push(key);\n });\n\n var i = 0;\n\n function nextBatch() {\n\n if (i >= allRequests.length) {\n return;\n }\n\n var upTo = Math.min(i + MAX_NUM_CONCURRENT_REQUESTS, allRequests.length);\n var batch = allRequests.slice(i, upTo);\n processBatch(batch, i);\n i += batch.length;\n }\n\n function processBatch(batch, offset) {\n batch.forEach(function (docId, j) {\n var docIdx = offset + j;\n var docRequests = requestsById.get(docId);\n\n // just use the first request as the \"template\"\n // TODO: The _bulk_get API allows for more subtle use cases than this,\n // but for now it is unlikely that there will be a mix of different\n // \"atts_since\" or \"attachments\" in the same request, since it's just\n // replicate.js that is using this for the moment.\n // Also, atts_since is aspirational, since we don't support it yet.\n var docOpts = pick(docRequests[0], ['atts_since', 'attachments']);\n docOpts.open_revs = docRequests.map(function (request) {\n // rev is optional, open_revs disallowed\n return request.rev;\n });\n\n // remove falsey / undefined revisions\n docOpts.open_revs = docOpts.open_revs.filter(identityFunction);\n\n var formatResult = identityFunction;\n\n if (docOpts.open_revs.length === 0) {\n delete docOpts.open_revs;\n\n // when fetching only the \"winning\" leaf,\n // transform the result so it looks like an open_revs\n // request\n formatResult = formatResultForOpenRevsGet;\n }\n\n // globally-supplied options\n ['revs', 'attachments', 'binary', 'ajax', 'latest'].forEach(function (param) {\n if (param in opts) {\n docOpts[param] = opts[param];\n }\n });\n db.get(docId, docOpts, function (err, res) {\n var result;\n /* istanbul ignore if */\n if (err) {\n result = [{error: err}];\n } else {\n result = formatResult(res);\n }\n gotResult(docIdx, docId, result);\n nextBatch();\n });\n });\n }\n\n nextBatch();\n\n}\n\nvar hasLocal;\n\ntry {\n localStorage.setItem('_pouch_check_localstorage', 1);\n hasLocal = !!localStorage.getItem('_pouch_check_localstorage');\n} catch (e) {\n hasLocal = false;\n}\n\nfunction hasLocalStorage() {\n return hasLocal;\n}\n\nconst nextTick = typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : function nextTick(fn) {\n Promise.resolve().then(fn);\n };\n\nclass Changes extends EE {\n constructor() {\n super();\n\n this._listeners = {};\n\n if (hasLocalStorage()) {\n addEventListener(\"storage\", (e) => {\n this.emit(e.key);\n });\n }\n }\n\n addListener(dbName, id, db, opts) {\n if (this._listeners[id]) {\n return;\n }\n var inprogress = false;\n var self = this;\n function eventFunction() {\n if (!self._listeners[id]) {\n return;\n }\n if (inprogress) {\n inprogress = 'waiting';\n return;\n }\n inprogress = true;\n var changesOpts = pick(opts, [\n 'style', 'include_docs', 'attachments', 'conflicts', 'filter',\n 'doc_ids', 'view', 'since', 'query_params', 'binary', 'return_docs'\n ]);\n\n function onError() {\n inprogress = false;\n }\n\n db.changes(changesOpts).on('change', function (c) {\n if (c.seq > opts.since && !opts.cancelled) {\n opts.since = c.seq;\n opts.onChange(c);\n }\n }).on('complete', function () {\n if (inprogress === 'waiting') {\n nextTick(eventFunction);\n }\n inprogress = false;\n }).on('error', onError);\n }\n this._listeners[id] = eventFunction;\n this.on(dbName, eventFunction);\n }\n\n removeListener(dbName, id) {\n if (!(id in this._listeners)) {\n return;\n }\n super.removeListener(dbName, this._listeners[id]);\n delete this._listeners[id];\n }\n\n notifyLocalWindows(dbName) {\n //do a useless change on a storage thing\n //in order to get other windows's listeners to activate\n if (hasLocalStorage()) {\n localStorage[dbName] = (localStorage[dbName] === \"a\") ? \"b\" : \"a\";\n }\n }\n\n notify(dbName) {\n this.emit(dbName);\n this.notifyLocalWindows(dbName);\n }\n}\n\nfunction guardedConsole(method) {\n /* istanbul ignore else */\n if (typeof console !== 'undefined' && typeof console[method] === 'function') {\n var args = Array.prototype.slice.call(arguments, 1);\n console[method].apply(console, args);\n }\n}\n\nfunction randomNumber(min, max) {\n var maxTimeout = 600000; // Hard-coded default of 10 minutes\n min = parseInt(min, 10) || 0;\n max = parseInt(max, 10);\n if (max !== max || max <= min) {\n max = (min || 1) << 1; //doubling\n } else {\n max = max + 1;\n }\n // In order to not exceed maxTimeout, pick a random value between half of maxTimeout and maxTimeout\n if (max > maxTimeout) {\n min = maxTimeout >> 1; // divide by two\n max = maxTimeout;\n }\n var ratio = Math.random();\n var range = max - min;\n\n return ~~(range * ratio + min); // ~~ coerces to an int, but fast.\n}\n\nfunction defaultBackOff(min) {\n var max = 0;\n if (!min) {\n max = 2000;\n }\n return randomNumber(min, max);\n}\n\n// designed to give info to browser users, who are disturbed\n// when they see http errors in the console\nfunction explainError(status, str) {\n guardedConsole('info', 'The above ' + status + ' is totally normal. ' + str);\n}\n\nclass PouchError extends Error {\n constructor(status, error, reason) {\n super();\n this.status = status;\n this.name = error;\n this.message = reason;\n this.error = true;\n }\n\n toString() {\n return JSON.stringify({\n status: this.status,\n name: this.name,\n message: this.message,\n reason: this.reason\n });\n }\n}\n\nvar UNAUTHORIZED = new PouchError(401, 'unauthorized', \"Name or password is incorrect.\");\nvar MISSING_BULK_DOCS = new PouchError(400, 'bad_request', \"Missing JSON list of 'docs'\");\nvar MISSING_DOC = new PouchError(404, 'not_found', 'missing');\nvar REV_CONFLICT = new PouchError(409, 'conflict', 'Document update conflict');\nvar INVALID_ID = new PouchError(400, 'bad_request', '_id field must contain a string');\nvar MISSING_ID = new PouchError(412, 'missing_id', '_id is required for puts');\nvar RESERVED_ID = new PouchError(400, 'bad_request', 'Only reserved document ids may start with underscore.');\nvar NOT_OPEN = new PouchError(412, 'precondition_failed', 'Database not open');\nvar UNKNOWN_ERROR = new PouchError(500, 'unknown_error', 'Database encountered an unknown error');\nvar BAD_ARG = new PouchError(500, 'badarg', 'Some query argument is invalid');\nvar INVALID_REQUEST = new PouchError(400, 'invalid_request', 'Request was invalid');\nvar QUERY_PARSE_ERROR = new PouchError(400, 'query_parse_error', 'Some query parameter is invalid');\nvar DOC_VALIDATION = new PouchError(500, 'doc_validation', 'Bad special document member');\nvar BAD_REQUEST = new PouchError(400, 'bad_request', 'Something wrong with the request');\nvar NOT_AN_OBJECT = new PouchError(400, 'bad_request', 'Document must be a JSON object');\nvar DB_MISSING = new PouchError(404, 'not_found', 'Database not found');\nvar IDB_ERROR = new PouchError(500, 'indexed_db_went_bad', 'unknown');\nvar WSQ_ERROR = new PouchError(500, 'web_sql_went_bad', 'unknown');\nvar LDB_ERROR = new PouchError(500, 'levelDB_went_went_bad', 'unknown');\nvar FORBIDDEN = new PouchError(403, 'forbidden', 'Forbidden by design doc validate_doc_update function');\nvar INVALID_REV = new PouchError(400, 'bad_request', 'Invalid rev format');\nvar FILE_EXISTS = new PouchError(412, 'file_exists', 'The database could not be created, the file already exists.');\nvar MISSING_STUB = new PouchError(412, 'missing_stub', 'A pre-existing attachment stub wasn\\'t found');\nvar INVALID_URL = new PouchError(413, 'invalid_url', 'Provided URL is invalid');\n\nfunction createError(error, reason) {\n function CustomPouchError(reason) {\n // inherit error properties from our parent error manually\n // so as to allow proper JSON parsing.\n var names = Object.getOwnPropertyNames(error);\n for (var i = 0, len = names.length; i < len; i++) {\n if (typeof error[names[i]] !== 'function') {\n this[names[i]] = error[names[i]];\n }\n }\n\n if (this.stack === undefined) {\n this.stack = (new Error()).stack;\n }\n\n if (reason !== undefined) {\n this.reason = reason;\n }\n }\n CustomPouchError.prototype = PouchError.prototype;\n return new CustomPouchError(reason);\n}\n\nfunction generateErrorFromResponse(err) {\n\n if (typeof err !== 'object') {\n var data = err;\n err = UNKNOWN_ERROR;\n err.data = data;\n }\n\n if ('error' in err && err.error === 'conflict') {\n err.name = 'conflict';\n err.status = 409;\n }\n\n if (!('name' in err)) {\n err.name = err.error || 'unknown';\n }\n\n if (!('status' in err)) {\n err.status = 500;\n }\n\n if (!('message' in err)) {\n err.message = err.message || err.reason;\n }\n\n if (!('stack' in err)) {\n err.stack = (new Error()).stack;\n }\n\n return err;\n}\n\nfunction tryFilter(filter, doc, req) {\n try {\n return !filter(doc, req);\n } catch (err) {\n var msg = 'Filter function threw: ' + err.toString();\n return createError(BAD_REQUEST, msg);\n }\n}\n\nfunction filterChange(opts) {\n var req = {};\n var hasFilter = opts.filter && typeof opts.filter === 'function';\n req.query = opts.query_params;\n\n return function filter(change) {\n if (!change.doc) {\n // CSG sends events on the changes feed that don't have documents,\n // this hack makes a whole lot of existing code robust.\n change.doc = {};\n }\n\n var filterReturn = hasFilter && tryFilter(opts.filter, change.doc, req);\n\n if (typeof filterReturn === 'object') {\n return filterReturn;\n }\n\n if (filterReturn) {\n return false;\n }\n\n if (!opts.include_docs) {\n delete change.doc;\n } else if (!opts.attachments) {\n for (var att in change.doc._attachments) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(change.doc._attachments, att)) {\n change.doc._attachments[att].stub = true;\n }\n }\n }\n return true;\n };\n}\n\n// shim for Function.prototype.name,\n\n// Determine id an ID is valid\n// - invalid IDs begin with an underescore that does not begin '_design' or\n// '_local'\n// - any other string value is a valid id\n// Returns the specific error object for each case\nfunction invalidIdError(id) {\n var err;\n if (!id) {\n err = createError(MISSING_ID);\n } else if (typeof id !== 'string') {\n err = createError(INVALID_ID);\n } else if (/^_/.test(id) && !(/^_(design|local)/).test(id)) {\n err = createError(RESERVED_ID);\n }\n if (err) {\n throw err;\n }\n}\n\n// Checks if a PouchDB object is \"remote\" or not. This is\n\nfunction isRemote(db) {\n if (typeof db._remote === 'boolean') {\n return db._remote;\n }\n /* istanbul ignore next */\n if (typeof db.type === 'function') {\n guardedConsole('warn',\n 'db.type() is deprecated and will be removed in ' +\n 'a future version of PouchDB');\n return db.type() === 'http';\n }\n /* istanbul ignore next */\n return false;\n}\n\nfunction listenerCount(ee, type) {\n return 'listenerCount' in ee ? ee.listenerCount(type) :\n EE.listenerCount(ee, type);\n}\n\nfunction parseDesignDocFunctionName(s) {\n if (!s) {\n return null;\n }\n var parts = s.split('/');\n if (parts.length === 2) {\n return parts;\n }\n if (parts.length === 1) {\n return [s, s];\n }\n return null;\n}\n\nfunction normalizeDesignDocFunctionName(s) {\n var normalized = parseDesignDocFunctionName(s);\n return normalized ? normalized.join('/') : null;\n}\n\n// originally parseUri 1.2.2, now patched by us\n// (c) Steven Levithan <stevenlevithan.com>\n// MIT License\nvar keys = [\"source\", \"protocol\", \"authority\", \"userInfo\", \"user\", \"password\",\n \"host\", \"port\", \"relative\", \"path\", \"directory\", \"file\", \"query\", \"anchor\"];\nvar qName =\"queryKey\";\nvar qParser = /(?:^|&)([^&=]*)=?([^&]*)/g;\n\n// use the \"loose\" parser\n/* eslint no-useless-escape: 0 */\nvar parser = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nfunction parseUri(str) {\n var m = parser.exec(str);\n var uri = {};\n var i = 14;\n\n while (i--) {\n var key = keys[i];\n var value = m[i] || \"\";\n var encoded = ['user', 'password'].indexOf(key) !== -1;\n uri[key] = encoded ? decodeURIComponent(value) : value;\n }\n\n uri[qName] = {};\n uri[keys[12]].replace(qParser, function ($0, $1, $2) {\n if ($1) {\n uri[qName][$1] = $2;\n }\n });\n\n return uri;\n}\n\n// Based on https://github.com/alexdavid/scope-eval v0.0.3\n// (source: https://unpkg.com/scope-eval@0.0.3/scope_eval.js)\n// This is basically just a wrapper around new Function()\n\nfunction scopeEval(source, scope) {\n var keys = [];\n var values = [];\n for (var key in scope) {\n if (Object.prototype.hasOwnProperty.call(scope, key)) {\n keys.push(key);\n values.push(scope[key]);\n }\n }\n keys.push(source);\n return Function.apply(null, keys).apply(null, values);\n}\n\n// this is essentially the \"update sugar\" function from daleharvey/pouchdb#1388\n// the diffFun tells us what delta to apply to the doc. it either returns\n// the doc, or false if it doesn't need to do an update after all\nfunction upsert(db, docId, diffFun) {\n return db.get(docId)\n .catch(function (err) {\n /* istanbul ignore next */\n if (err.status !== 404) {\n throw err;\n }\n return {};\n })\n .then(function (doc) {\n // the user might change the _rev, so save it for posterity\n var docRev = doc._rev;\n var newDoc = diffFun(doc);\n\n if (!newDoc) {\n // if the diffFun returns falsy, we short-circuit as\n // an optimization\n return {updated: false, rev: docRev};\n }\n\n // users aren't allowed to modify these values,\n // so reset them here\n newDoc._id = docId;\n newDoc._rev = docRev;\n return tryAndPut(db, newDoc, diffFun);\n });\n}\n\nfunction tryAndPut(db, doc, diffFun) {\n return db.put(doc).then(function (res) {\n return {\n updated: true,\n rev: res.rev\n };\n }, function (err) {\n /* istanbul ignore next */\n if (err.status !== 409) {\n throw err;\n }\n return upsert(db, doc._id, diffFun);\n });\n}\n\nvar thisAtob = function (str) {\n return atob(str);\n};\n\nvar thisBtoa = function (str) {\n return btoa(str);\n};\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor (e.g.\n// old QtWebKit versions, Android < 4.4).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== \"TypeError\") {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\n typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\n typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :\n WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction binaryStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\nfunction binStringToBluffer(binString, type) {\n return createBlob([binaryStringToArrayBuffer(binString)], {type});\n}\n\nfunction b64ToBluffer(b64, type) {\n return binStringToBluffer(thisAtob(b64), type);\n}\n\n//Can't find original post, but this is close\n//http://stackoverflow.com/questions/6965107/ (continues on next line)\n//converting-between-strings-and-arraybuffers\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n for (var i = 0; i < length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n\n// shim for browsers that don't support it\nfunction readAsBinaryString(blob, callback) {\n var reader = new FileReader();\n var hasBinaryString = typeof reader.readAsBinaryString === 'function';\n reader.onloadend = function (e) {\n var result = e.target.result || '';\n if (hasBinaryString) {\n return callback(result);\n }\n callback(arrayBufferToBinaryString(result));\n };\n if (hasBinaryString) {\n reader.readAsBinaryString(blob);\n } else {\n reader.readAsArrayBuffer(blob);\n }\n}\n\nfunction blobToBinaryString(blobOrBuffer, callback) {\n readAsBinaryString(blobOrBuffer, function (bin) {\n callback(bin);\n });\n}\n\nfunction blobToBase64(blobOrBuffer, callback) {\n blobToBinaryString(blobOrBuffer, function (base64) {\n callback(thisBtoa(base64));\n });\n}\n\n// simplified API. universal browser support is assumed\nfunction readAsArrayBuffer(blob, callback) {\n var reader = new FileReader();\n reader.onloadend = function (e) {\n var result = e.target.result || new ArrayBuffer(0);\n callback(result);\n };\n reader.readAsArrayBuffer(blob);\n}\n\n// this is not used in the browser\n\nvar setImmediateShim = self.setImmediate || self.setTimeout;\nvar MD5_CHUNK_SIZE = 32768;\n\nfunction rawToBase64(raw) {\n return thisBtoa(raw);\n}\n\nfunction appendBlob(buffer, blob, start, end, callback) {\n if (start > 0 || end < blob.size) {\n // only slice blob if we really need to\n blob = blob.slice(start, end);\n }\n readAsArrayBuffer(blob, function (arrayBuffer) {\n buffer.append(arrayBuffer);\n callback();\n });\n}\n\nfunction appendString(buffer, string, start, end, callback) {\n if (start > 0 || end < string.length) {\n // only create a substring if we really need to\n string = string.substring(start, end);\n }\n buffer.appendBinary(string);\n callback();\n}\n\nfunction binaryMd5(data, callback) {\n var inputIsString = typeof data === 'string';\n var len = inputIsString ? data.length : data.size;\n var chunkSize = Math.min(MD5_CHUNK_SIZE, len);\n var chunks = Math.ceil(len / chunkSize);\n var currentChunk = 0;\n var buffer = inputIsString ? new Md5() : new Md5.ArrayBuffer();\n\n var append = inputIsString ? appendString : appendBlob;\n\n function next() {\n setImmediateShim(loadNextChunk);\n }\n\n function done() {\n var raw = buffer.end(true);\n var base64 = rawToBase64(raw);\n callback(base64);\n buffer.destroy();\n }\n\n function loadNextChunk() {\n var start = currentChunk * chunkSize;\n var end = start + chunkSize;\n currentChunk++;\n if (currentChunk < chunks) {\n append(buffer, data, start, end, next);\n } else {\n append(buffer, data, start, end, done);\n }\n }\n loadNextChunk();\n}\n\nfunction stringMd5(string) {\n return Md5.hash(string);\n}\n\n/**\n * Creates a new revision string that does NOT include the revision height\n * For example '56649f1b0506c6ca9fda0746eb0cacdf'\n */\nfunction rev(doc, deterministic_revs) {\n if (!deterministic_revs) {\n return v4().replace(/-/g, '').toLowerCase();\n }\n\n var mutateableDoc = Object.assign({}, doc);\n delete mutateableDoc._rev_tree;\n return stringMd5(JSON.stringify(mutateableDoc));\n}\n\nvar uuid = v4; // mimic old import, only v4 is ever used elsewhere\n\n// We fetch all leafs of the revision tree, and sort them based on tree length\n// and whether they were deleted, undeleted documents with the longest revision\n// tree (most edits) win\n// The final sort algorithm is slightly documented in a sidebar here:\n// http://guide.couchdb.org/draft/conflicts.html\nfunction winningRev(metadata) {\n var winningId;\n var winningPos;\n var winningDeleted;\n var toVisit = metadata.rev_tree.slice();\n var node;\n while ((node = toVisit.pop())) {\n var tree = node.ids;\n var branches = tree[2];\n var pos = node.pos;\n if (branches.length) { // non-leaf\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: pos + 1, ids: branches[i]});\n }\n continue;\n }\n var deleted = !!tree[1].deleted;\n var id = tree[0];\n // sort by deleted, then pos, then id\n if (!winningId || (winningDeleted !== deleted ? winningDeleted :\n winningPos !== pos ? winningPos < pos : winningId < id)) {\n winningId = id;\n winningPos = pos;\n winningDeleted = deleted;\n }\n }\n\n return winningPos + '-' + winningId;\n}\n\n// Pretty much all below can be combined into a higher order function to\n// traverse revisions\n// The return value from the callback will be passed as context to all\n// children of that node\nfunction traverseRevTree(revs, callback) {\n var toVisit = revs.slice();\n\n var node;\n while ((node = toVisit.pop())) {\n var pos = node.pos;\n var tree = node.ids;\n var branches = tree[2];\n var newCtx =\n callback(branches.length === 0, pos, tree[0], node.ctx, tree[1]);\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: pos + 1, ids: branches[i], ctx: newCtx});\n }\n }\n}\n\nfunction sortByPos(a, b) {\n return a.pos - b.pos;\n}\n\nfunction collectLeaves(revs) {\n var leaves = [];\n traverseRevTree(revs, function (isLeaf, pos, id, acc, opts) {\n if (isLeaf) {\n leaves.push({rev: pos + \"-\" + id, pos, opts});\n }\n });\n leaves.sort(sortByPos).reverse();\n for (var i = 0, len = leaves.length; i < len; i++) {\n delete leaves[i].pos;\n }\n return leaves;\n}\n\n// returns revs of all conflicts that is leaves such that\n// 1. are not deleted and\n// 2. are different than winning revision\nfunction collectConflicts(metadata) {\n var win = winningRev(metadata);\n var leaves = collectLeaves(metadata.rev_tree);\n var conflicts = [];\n for (var i = 0, len = leaves.length; i < len; i++) {\n var leaf = leaves[i];\n if (leaf.rev !== win && !leaf.opts.deleted) {\n conflicts.push(leaf.rev);\n }\n }\n return conflicts;\n}\n\n// compact a tree by marking its non-leafs as missing,\n// and return a list of revs to delete\nfunction compactTree(metadata) {\n var revs = [];\n traverseRevTree(metadata.rev_tree, function (isLeaf, pos,\n revHash, ctx, opts) {\n if (opts.status === 'available' && !isLeaf) {\n revs.push(pos + '-' + revHash);\n opts.status = 'missing';\n }\n });\n return revs;\n}\n\n// `findPathToLeaf()` returns an array of revs that goes from the specified\n// leaf rev to the root of that leaf’s branch.\n//\n// eg. for this rev tree:\n// 1-9692 ▶ 2-37aa ▶ 3-df22 ▶ 4-6e94 ▶ 5-df4a ▶ 6-6a3a ▶ 7-57e5\n// ┃ ┗━━━━━━▶ 5-8d8c ▶ 6-65e0\n// ┗━━━━━━▶ 3-43f6 ▶ 4-a3b4\n//\n// For a `targetRev` of '7-57e5', `findPathToLeaf()` would return ['7-57e5', '6-6a3a', '5-df4a']\n// The `revs` argument has the same structure as what `revs_tree` has on e.g.\n// the IndexedDB representation of the rev tree datastructure. Please refer to\n// tests/unit/test.purge.js for examples of what these look like.\n//\n// This function will throw an error if:\n// - The requested revision does not exist\n// - The requested revision is not a leaf\nfunction findPathToLeaf(revs, targetRev) {\n let path = [];\n const toVisit = revs.slice();\n\n let node;\n while ((node = toVisit.pop())) {\n const { pos, ids: tree } = node;\n const rev = `${pos}-${tree[0]}`;\n const branches = tree[2];\n\n // just assuming we're already working on the path up towards our desired leaf.\n path.push(rev);\n\n // we've reached the leaf of our dreams, so return the computed path.\n if (rev === targetRev) {\n //…unleeeeess\n if (branches.length !== 0) {\n throw new Error('The requested revision is not a leaf');\n }\n return path.reverse();\n }\n\n // this is based on the assumption that after we have a leaf (`branches.length == 0`), we handle the next\n // branch. this is true for all branches other than the path leading to the winning rev (which is 7-57e5 in\n // the example above. i've added a reset condition for branching nodes (`branches.length > 1`) as well.\n if (branches.length === 0 || branches.length > 1) {\n path = [];\n }\n\n // as a next step, we push the branches of this node to `toVisit` for visiting it during the next iteration\n for (let i = 0, len = branches.length; i < len; i++) {\n toVisit.push({ pos: pos + 1, ids: branches[i] });\n }\n }\n if (path.length === 0) {\n throw new Error('The requested revision does not exist');\n }\n return path.reverse();\n}\n\n// build up a list of all the paths to the leafs in this revision tree\nfunction rootToLeaf(revs) {\n var paths = [];\n var toVisit = revs.slice();\n var node;\n while ((node = toVisit.pop())) {\n var pos = node.pos;\n var tree = node.ids;\n var id = tree[0];\n var opts = tree[1];\n var branches = tree[2];\n var isLeaf = branches.length === 0;\n\n var history = node.history ? node.history.slice() : [];\n history.push({id, opts});\n if (isLeaf) {\n paths.push({pos: (pos + 1 - history.length), ids: history});\n }\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: pos + 1, ids: branches[i], history});\n }\n }\n return paths.reverse();\n}\n\n// for a better overview of what this is doing, read:\n\nfunction sortByPos$1(a, b) {\n return a.pos - b.pos;\n}\n\n// classic binary search\nfunction binarySearch(arr, item, comparator) {\n var low = 0;\n var high = arr.length;\n var mid;\n while (low < high) {\n mid = (low + high) >>> 1;\n if (comparator(arr[mid], item) < 0) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return low;\n}\n\n// assuming the arr is sorted, insert the item in the proper place\nfunction insertSorted(arr, item, comparator) {\n var idx = binarySearch(arr, item, comparator);\n arr.splice(idx, 0, item);\n}\n\n// Turn a path as a flat array into a tree with a single branch.\n// If any should be stemmed from the beginning of the array, that's passed\n// in as the second argument\nfunction pathToTree(path, numStemmed) {\n var root;\n var leaf;\n for (var i = numStemmed, len = path.length; i < len; i++) {\n var node = path[i];\n var currentLeaf = [node.id, node.opts, []];\n if (leaf) {\n leaf[2].push(currentLeaf);\n leaf = currentLeaf;\n } else {\n root = leaf = currentLeaf;\n }\n }\n return root;\n}\n\n// compare the IDs of two trees\nfunction compareTree(a, b) {\n return a[0] < b[0] ? -1 : 1;\n}\n\n// Merge two trees together\n// The roots of tree1 and tree2 must be the same revision\nfunction mergeTree(in_tree1, in_tree2) {\n var queue = [{tree1: in_tree1, tree2: in_tree2}];\n var conflicts = false;\n while (queue.length > 0) {\n var item = queue.pop();\n var tree1 = item.tree1;\n var tree2 = item.tree2;\n\n if (tree1[1].status || tree2[1].status) {\n tree1[1].status =\n (tree1[1].status === 'available' ||\n tree2[1].status === 'available') ? 'available' : 'missing';\n }\n\n for (var i = 0; i < tree2[2].length; i++) {\n if (!tree1[2][0]) {\n conflicts = 'new_leaf';\n tree1[2][0] = tree2[2][i];\n continue;\n }\n\n var merged = false;\n for (var j = 0; j < tree1[2].length; j++) {\n if (tree1[2][j][0] === tree2[2][i][0]) {\n queue.push({tree1: tree1[2][j], tree2: tree2[2][i]});\n merged = true;\n }\n }\n if (!merged) {\n conflicts = 'new_branch';\n insertSorted(tree1[2], tree2[2][i], compareTree);\n }\n }\n }\n return {conflicts, tree: in_tree1};\n}\n\nfunction doMerge(tree, path, dontExpand) {\n var restree = [];\n var conflicts = false;\n var merged = false;\n var res;\n\n if (!tree.length) {\n return {tree: [path], conflicts: 'new_leaf'};\n }\n\n for (var i = 0, len = tree.length; i < len; i++) {\n var branch = tree[i];\n if (branch.pos === path.pos && branch.ids[0] === path.ids[0]) {\n // Paths start at the same position and have the same root, so they need\n // merged\n res = mergeTree(branch.ids, path.ids);\n restree.push({pos: branch.pos, ids: res.tree});\n conflicts = conflicts || res.conflicts;\n merged = true;\n } else if (dontExpand !== true) {\n // The paths start at a different position, take the earliest path and\n // traverse up until it as at the same point from root as the path we\n // want to merge. If the keys match we return the longer path with the\n // other merged After stemming we don't want to expand the trees\n\n var t1 = branch.pos < path.pos ? branch : path;\n var t2 = branch.pos < path.pos ? path : branch;\n var diff = t2.pos - t1.pos;\n\n var candidateParents = [];\n\n var trees = [];\n trees.push({ids: t1.ids, diff, parent: null, parentIdx: null});\n while (trees.length > 0) {\n var item = trees.pop();\n if (item.diff === 0) {\n if (item.ids[0] === t2.ids[0]) {\n candidateParents.push(item);\n }\n continue;\n }\n var elements = item.ids[2];\n for (var j = 0, elementsLen = elements.length; j < elementsLen; j++) {\n trees.push({\n ids: elements[j],\n diff: item.diff - 1,\n parent: item.ids,\n parentIdx: j\n });\n }\n }\n\n var el = candidateParents[0];\n\n if (!el) {\n restree.push(branch);\n } else {\n res = mergeTree(el.ids, t2.ids);\n el.parent[2][el.parentIdx] = res.tree;\n restree.push({pos: t1.pos, ids: t1.ids});\n conflicts = conflicts || res.conflicts;\n merged = true;\n }\n } else {\n restree.push(branch);\n }\n }\n\n // We didnt find\n if (!merged) {\n restree.push(path);\n }\n\n restree.sort(sortByPos$1);\n\n return {\n tree: restree,\n conflicts: conflicts || 'internal_node'\n };\n}\n\n// To ensure we don't grow the revision tree infinitely, we stem old revisions\nfunction stem(tree, depth) {\n // First we break out the tree into a complete list of root to leaf paths\n var paths = rootToLeaf(tree);\n var stemmedRevs;\n\n var result;\n for (var i = 0, len = paths.length; i < len; i++) {\n // Then for each path, we cut off the start of the path based on the\n // `depth` to stem to, and generate a new set of flat trees\n var path = paths[i];\n var stemmed = path.ids;\n var node;\n if (stemmed.length > depth) {\n // only do the stemming work if we actually need to stem\n if (!stemmedRevs) {\n stemmedRevs = {}; // avoid allocating this object unnecessarily\n }\n var numStemmed = stemmed.length - depth;\n node = {\n pos: path.pos + numStemmed,\n ids: pathToTree(stemmed, numStemmed)\n };\n\n for (var s = 0; s < numStemmed; s++) {\n var rev = (path.pos + s) + '-' + stemmed[s].id;\n stemmedRevs[rev] = true;\n }\n } else { // no need to actually stem\n node = {\n pos: path.pos,\n ids: pathToTree(stemmed, 0)\n };\n }\n\n // Then we remerge all those flat trees together, ensuring that we don't\n // connect trees that would go beyond the depth limit\n if (result) {\n result = doMerge(result, node, true).tree;\n } else {\n result = [node];\n }\n }\n\n // this is memory-heavy per Chrome profiler, avoid unless we actually stemmed\n if (stemmedRevs) {\n traverseRevTree(result, function (isLeaf, pos, revHash) {\n // some revisions may have been removed in a branch but not in another\n delete stemmedRevs[pos + '-' + revHash];\n });\n }\n\n return {\n tree: result,\n revs: stemmedRevs ? Object.keys(stemmedRevs) : []\n };\n}\n\nfunction merge(tree, path, depth) {\n var newTree = doMerge(tree, path);\n var stemmed = stem(newTree.tree, depth);\n return {\n tree: stemmed.tree,\n stemmedRevs: stemmed.revs,\n conflicts: newTree.conflicts\n };\n}\n\n// return true if a rev exists in the rev tree, false otherwise\nfunction revExists(revs, rev) {\n var toVisit = revs.slice();\n var splitRev = rev.split('-');\n var targetPos = parseInt(splitRev[0], 10);\n var targetId = splitRev[1];\n\n var node;\n while ((node = toVisit.pop())) {\n if (node.pos === targetPos && node.ids[0] === targetId) {\n return true;\n }\n var branches = node.ids[2];\n for (var i = 0, len = branches.length; i < len; i++) {\n toVisit.push({pos: node.pos + 1, ids: branches[i]});\n }\n }\n return false;\n}\n\nfunction getTrees(node) {\n return node.ids;\n}\n\n// check if a specific revision of a doc has been deleted\n// - metadata: the metadata object from the doc store\n// - rev: (optional) the revision to check. defaults to winning revision\nfunction isDeleted(metadata, rev) {\n if (!rev) {\n rev = winningRev(metadata);\n }\n var id = rev.substring(rev.indexOf('-') + 1);\n var toVisit = metadata.rev_tree.map(getTrees);\n\n var tree;\n while ((tree = toVisit.pop())) {\n if (tree[0] === id) {\n return !!tree[1].deleted;\n }\n toVisit = toVisit.concat(tree[2]);\n }\n}\n\nfunction isLocalId(id) {\n return typeof id === 'string' && id.startsWith('_local/');\n}\n\n// returns the current leaf node for a given revision\nfunction latest(rev, metadata) {\n var toVisit = metadata.rev_tree.slice();\n var node;\n while ((node = toVisit.pop())) {\n var pos = node.pos;\n var tree = node.ids;\n var id = tree[0];\n var opts = tree[1];\n var branches = tree[2];\n var isLeaf = branches.length === 0;\n\n var history = node.history ? node.history.slice() : [];\n history.push({id, pos, opts});\n\n if (isLeaf) {\n for (var i = 0, len = history.length; i < len; i++) {\n var historyNode = history[i];\n var historyRev = historyNode.pos + '-' + historyNode.id;\n\n if (historyRev === rev) {\n // return the rev of this leaf\n return pos + '-' + id;\n }\n }\n }\n\n for (var j = 0, l = branches.length; j < l; j++) {\n toVisit.push({pos: pos + 1, ids: branches[j], history});\n }\n }\n\n /* istanbul ignore next */\n throw new Error('Unable to resolve latest revision for id ' + metadata.id + ', rev ' + rev);\n}\n\nfunction tryCatchInChangeListener(self, change, pending, lastSeq) {\n // isolate try/catches to avoid V8 deoptimizations\n try {\n self.emit('change', change, pending, lastSeq);\n } catch (e) {\n guardedConsole('error', 'Error in .on(\"change\", function):', e);\n }\n}\n\nfunction processChange(doc, metadata, opts) {\n var changeList = [{rev: doc._rev}];\n if (opts.style === 'all_docs') {\n changeList = collectLeaves(metadata.rev_tree)\n .map(function (x) { return {rev: x.rev}; });\n }\n var change = {\n id: metadata.id,\n changes: changeList,\n doc\n };\n\n if (isDeleted(metadata, doc._rev)) {\n change.deleted = true;\n }\n if (opts.conflicts) {\n change.doc._conflicts = collectConflicts(metadata);\n if (!change.doc._conflicts.length) {\n delete change.doc._conflicts;\n }\n }\n return change;\n}\n\nclass Changes$1 extends EE {\n constructor(db, opts, callback) {\n super();\n this.db = db;\n opts = opts ? clone(opts) : {};\n var complete = opts.complete = once((err, resp) => {\n if (err) {\n if (listenerCount(this, 'error') > 0) {\n this.emit('error', err);\n }\n } else {\n this.emit('complete', resp);\n }\n this.removeAllListeners();\n db.removeListener('destroyed', onDestroy);\n });\n if (callback) {\n this.on('complete', function (resp) {\n callback(null, resp);\n });\n this.on('error', callback);\n }\n const onDestroy = () => {\n this.cancel();\n };\n db.once('destroyed', onDestroy);\n\n opts.onChange = (change, pending, lastSeq) => {\n /* istanbul ignore if */\n if (this.isCancelled) {\n return;\n }\n tryCatchInChangeListener(this, change, pending, lastSeq);\n };\n\n var promise = new Promise(function (fulfill, reject) {\n opts.complete = function (err, res) {\n if (err) {\n reject(err);\n } else {\n fulfill(res);\n }\n };\n });\n this.once('cancel', function () {\n db.removeListener('destroyed', onDestroy);\n opts.complete(null, {status: 'cancelled'});\n });\n this.then = promise.then.bind(promise);\n this['catch'] = promise['catch'].bind(promise);\n this.then(function (result) {\n complete(null, result);\n }, complete);\n\n\n\n if (!db.taskqueue.isReady) {\n db.taskqueue.addTask((failed) => {\n if (failed) {\n opts.complete(failed);\n } else if (this.isCancelled) {\n this.emit('cancel');\n } else {\n this.validateChanges(opts);\n }\n });\n } else {\n this.validateChanges(opts);\n }\n }\n\n cancel() {\n this.isCancelled = true;\n if (this.db.taskqueue.isReady) {\n this.emit('cancel');\n }\n }\n\n validateChanges(opts) {\n var callback = opts.complete;\n\n /* istanbul ignore else */\n if (PouchDB._changesFilterPlugin) {\n PouchDB._changesFilterPlugin.validate(opts, (err) => {\n if (err) {\n return callback(err);\n }\n this.doChanges(opts);\n });\n } else {\n this.doChanges(opts);\n }\n }\n\n doChanges(opts) {\n var callback = opts.complete;\n\n opts = clone(opts);\n if ('live' in opts && !('continuous' in opts)) {\n opts.continuous = opts.live;\n }\n opts.processChange = processChange;\n\n if (opts.since === 'latest') {\n opts.since = 'now';\n }\n if (!opts.since) {\n opts.since = 0;\n }\n if (opts.since === 'now') {\n this.db.info().then((info) => {\n /* istanbul ignore if */\n if (this.isCancelled) {\n callback(null, {status: 'cancelled'});\n return;\n }\n opts.since = info.update_seq;\n this.doChanges(opts);\n }, callback);\n return;\n }\n\n /* istanbul ignore else */\n if (PouchDB._changesFilterPlugin) {\n PouchDB._changesFilterPlugin.normalize(opts);\n if (PouchDB._changesFilterPlugin.shouldFilter(this, opts)) {\n return PouchDB._changesFilterPlugin.filter(this, opts);\n }\n } else {\n ['doc_ids', 'filter', 'selector', 'view'].forEach(function (key) {\n if (key in opts) {\n guardedConsole('warn',\n 'The \"' + key + '\" option was passed in to changes/replicate, ' +\n 'but pouchdb-changes-filter plugin is not installed, so it ' +\n 'was ignored. Please install the plugin to enable filtering.'\n );\n }\n });\n }\n\n if (!('descending' in opts)) {\n opts.descending = false;\n }\n\n // 0 and 1 should return 1 document\n opts.limit = opts.limit === 0 ? 1 : opts.limit;\n opts.complete = callback;\n var newPromise = this.db._changes(opts);\n /* istanbul ignore else */\n if (newPromise && typeof newPromise.cancel === 'function') {\n const cancel = this.cancel;\n this.cancel = (...args) => {\n newPromise.cancel();\n cancel.apply(this, args);\n };\n }\n }\n}\n\n/*\n * A generic pouch adapter\n */\n\n// Wrapper for functions that call the bulkdocs api with a single doc,\n// if the first result is an error, return an error\nfunction yankError(callback, docId) {\n return function (err, results) {\n if (err || (results[0] && results[0].error)) {\n err = err || results[0];\n err.docId = docId;\n callback(err);\n } else {\n callback(null, results.length ? results[0] : results);\n }\n };\n}\n\n// clean docs given to us by the user\nfunction cleanDocs(docs) {\n for (var i = 0; i < docs.length; i++) {\n var doc = docs[i];\n if (doc._deleted) {\n delete doc._attachments; // ignore atts for deleted docs\n } else if (doc._attachments) {\n // filter out extraneous keys from _attachments\n var atts = Object.keys(doc._attachments);\n for (var j = 0; j < atts.length; j++) {\n var att = atts[j];\n doc._attachments[att] = pick(doc._attachments[att],\n ['data', 'digest', 'content_type', 'length', 'revpos', 'stub']);\n }\n }\n }\n}\n\n// compare two docs, first by _id then by _rev\nfunction compareByIdThenRev(a, b) {\n if (a._id === b._id) {\n const aStart = a._revisions ? a._revisions.start : 0;\n const bStart = b._revisions ? b._revisions.start : 0;\n return aStart - bStart;\n }\n return a._id < b._id ? -1 : 1;\n}\n\n// for every node in a revision tree computes its distance from the closest\n// leaf\nfunction computeHeight(revs) {\n var height = {};\n var edges = [];\n traverseRevTree(revs, function (isLeaf, pos, id, prnt) {\n var rev$$1 = pos + \"-\" + id;\n if (isLeaf) {\n height[rev$$1] = 0;\n }\n if (prnt !== undefined) {\n edges.push({from: prnt, to: rev$$1});\n }\n return rev$$1;\n });\n\n edges.reverse();\n edges.forEach(function (edge) {\n if (height[edge.from] === undefined) {\n height[edge.from] = 1 + height[edge.to];\n } else {\n height[edge.from] = Math.min(height[edge.from], 1 + height[edge.to]);\n }\n });\n return height;\n}\n\nfunction allDocsKeysParse(opts) {\n var keys = ('limit' in opts) ?\n opts.keys.slice(opts.skip, opts.limit + opts.skip) :\n (opts.skip > 0) ? opts.keys.slice(opts.skip) : opts.keys;\n opts.keys = keys;\n opts.skip = 0;\n delete opts.limit;\n if (opts.descending) {\n keys.reverse();\n opts.descending = false;\n }\n}\n\n// all compaction is done in a queue, to avoid attaching\n// too many listeners at once\nfunction doNextCompaction(self) {\n var task = self._compactionQueue[0];\n var opts = task.opts;\n var callback = task.callback;\n self.get('_local/compaction').catch(function () {\n return false;\n }).then(function (doc) {\n if (doc && doc.last_seq) {\n opts.last_seq = doc.last_seq;\n }\n self._compact(opts, function (err, res) {\n /* istanbul ignore if */\n if (err) {\n callback(err);\n } else {\n callback(null, res);\n }\n nextTick(function () {\n self._compactionQueue.shift();\n if (self._compactionQueue.length) {\n doNextCompaction(self);\n }\n });\n });\n });\n}\n\nfunction appendPurgeSeq(db, docId, rev$$1) {\n return db.get('_local/purges').then(function (doc) {\n const purgeSeq = doc.purgeSeq + 1;\n doc.purges.push({\n docId,\n rev: rev$$1,\n purgeSeq,\n });\n if (doc.purges.length > self.purged_infos_limit) {\n doc.purges.splice(0, doc.purges.length - self.purged_infos_limit);\n }\n doc.purgeSeq = purgeSeq;\n return doc;\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n return {\n _id: '_local/purges',\n purges: [{\n docId,\n rev: rev$$1,\n purgeSeq: 0,\n }],\n purgeSeq: 0,\n };\n }).then(function (doc) {\n return db.put(doc);\n });\n}\n\nfunction attachmentNameError(name) {\n if (name.charAt(0) === '_') {\n return name + ' is not a valid attachment name, attachment ' +\n 'names cannot start with \\'_\\'';\n }\n return false;\n}\n\nfunction isNotSingleDoc(doc) {\n return doc === null || typeof doc !== 'object' || Array.isArray(doc);\n}\n\nconst validRevRegex = /^\\d+-[^-]*$/;\nfunction isValidRev(rev$$1) {\n return typeof rev$$1 === 'string' && validRevRegex.test(rev$$1);\n}\n\nclass AbstractPouchDB extends EE {\n _setup() {\n this.post = adapterFun('post', function (doc, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n if (isNotSingleDoc(doc)) {\n return callback(createError(NOT_AN_OBJECT));\n }\n this.bulkDocs({docs: [doc]}, opts, yankError(callback, doc._id));\n }).bind(this);\n\n this.put = adapterFun('put', function (doc, opts, cb) {\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n if (isNotSingleDoc(doc)) {\n return cb(createError(NOT_AN_OBJECT));\n }\n invalidIdError(doc._id);\n if ('_rev' in doc && !isValidRev(doc._rev)) {\n return cb(createError(INVALID_REV));\n }\n if (isLocalId(doc._id) && typeof this._putLocal === 'function') {\n if (doc._deleted) {\n return this._removeLocal(doc, cb);\n } else {\n return this._putLocal(doc, cb);\n }\n }\n\n const putDoc = (next) => {\n if (typeof this._put === 'function' && opts.new_edits !== false) {\n this._put(doc, opts, next);\n } else {\n this.bulkDocs({docs: [doc]}, opts, yankError(next, doc._id));\n }\n };\n\n if (opts.force && doc._rev) {\n transformForceOptionToNewEditsOption();\n putDoc(function (err) {\n var result = err ? null : {ok: true, id: doc._id, rev: doc._rev};\n cb(err, result);\n });\n } else {\n putDoc(cb);\n }\n\n function transformForceOptionToNewEditsOption() {\n var parts = doc._rev.split('-');\n var oldRevId = parts[1];\n var oldRevNum = parseInt(parts[0], 10);\n\n var newRevNum = oldRevNum + 1;\n var newRevId = rev();\n\n doc._revisions = {\n start: newRevNum,\n ids: [newRevId, oldRevId]\n };\n doc._rev = newRevNum + '-' + newRevId;\n opts.new_edits = false;\n }\n }).bind(this);\n\n this.putAttachment = adapterFun('putAttachment', function (docId, attachmentId, rev$$1, blob, type) {\n var api = this;\n if (typeof type === 'function') {\n type = blob;\n blob = rev$$1;\n rev$$1 = null;\n }\n // Lets fix in https://github.com/pouchdb/pouchdb/issues/3267\n /* istanbul ignore if */\n if (typeof type === 'undefined') {\n type = blob;\n blob = rev$$1;\n rev$$1 = null;\n }\n if (!type) {\n guardedConsole('warn', 'Attachment', attachmentId, 'on document', docId, 'is missing content_type');\n }\n\n function createAttachment(doc) {\n var prevrevpos = '_rev' in doc ? parseInt(doc._rev, 10) : 0;\n doc._attachments = doc._attachments || {};\n doc._attachments[attachmentId] = {\n content_type: type,\n data: blob,\n revpos: ++prevrevpos\n };\n return api.put(doc);\n }\n\n return api.get(docId).then(function (doc) {\n if (doc._rev !== rev$$1) {\n throw createError(REV_CONFLICT);\n }\n\n return createAttachment(doc);\n }, function (err) {\n // create new doc\n /* istanbul ignore else */\n if (err.reason === MISSING_DOC.message) {\n return createAttachment({_id: docId});\n } else {\n throw err;\n }\n });\n }).bind(this);\n\n this.removeAttachment = adapterFun('removeAttachment', function (docId, attachmentId, rev$$1, callback) {\n this.get(docId, (err, obj) => {\n /* istanbul ignore if */\n if (err) {\n callback(err);\n return;\n }\n if (obj._rev !== rev$$1) {\n callback(createError(REV_CONFLICT));\n return;\n }\n /* istanbul ignore if */\n if (!obj._attachments) {\n return callback();\n }\n delete obj._attachments[attachmentId];\n if (Object.keys(obj._attachments).length === 0) {\n delete obj._attachments;\n }\n this.put(obj, callback);\n });\n }).bind(this);\n\n this.remove = adapterFun('remove', function (docOrId, optsOrRev, opts, callback) {\n var doc;\n if (typeof optsOrRev === 'string') {\n // id, rev, opts, callback style\n doc = {\n _id: docOrId,\n _rev: optsOrRev\n };\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n } else {\n // doc, opts, callback style\n doc = docOrId;\n if (typeof optsOrRev === 'function') {\n callback = optsOrRev;\n opts = {};\n } else {\n callback = opts;\n opts = optsOrRev;\n }\n }\n opts = opts || {};\n opts.was_delete = true;\n var newDoc = {_id: doc._id, _rev: (doc._rev || opts.rev)};\n newDoc._deleted = true;\n if (isLocalId(newDoc._id) && typeof this._removeLocal === 'function') {\n return this._removeLocal(doc, callback);\n }\n this.bulkDocs({docs: [newDoc]}, opts, yankError(callback, newDoc._id));\n }).bind(this);\n\n this.revsDiff = adapterFun('revsDiff', function (req, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n var ids = Object.keys(req);\n\n if (!ids.length) {\n return callback(null, {});\n }\n\n var count = 0;\n var missing = new Map();\n\n function addToMissing(id, revId) {\n if (!missing.has(id)) {\n missing.set(id, {missing: []});\n }\n missing.get(id).missing.push(revId);\n }\n\n function processDoc(id, rev_tree) {\n // Is this fast enough? Maybe we should switch to a set simulated by a map\n var missingForId = req[id].slice(0);\n traverseRevTree(rev_tree, function (isLeaf, pos, revHash, ctx,\n opts) {\n var rev$$1 = pos + '-' + revHash;\n var idx = missingForId.indexOf(rev$$1);\n if (idx === -1) {\n return;\n }\n\n missingForId.splice(idx, 1);\n /* istanbul ignore if */\n if (opts.status !== 'available') {\n addToMissing(id, rev$$1);\n }\n });\n\n // Traversing the tree is synchronous, so now `missingForId` contains\n // revisions that were not found in the tree\n missingForId.forEach(function (rev$$1) {\n addToMissing(id, rev$$1);\n });\n }\n\n ids.forEach(function (id) {\n this._getRevisionTree(id, function (err, rev_tree) {\n if (err && err.status === 404 && err.message === 'missing') {\n missing.set(id, {missing: req[id]});\n } else if (err) {\n /* istanbul ignore next */\n return callback(err);\n } else {\n processDoc(id, rev_tree);\n }\n\n if (++count === ids.length) {\n // convert LazyMap to object\n var missingObj = {};\n missing.forEach(function (value, key) {\n missingObj[key] = value;\n });\n return callback(null, missingObj);\n }\n });\n }, this);\n }).bind(this);\n\n // _bulk_get API for faster replication, as described in\n // https://github.com/apache/couchdb-chttpd/pull/33\n // At the \"abstract\" level, it will just run multiple get()s in\n // parallel, because this isn't much of a performance cost\n // for local databases (except the cost of multiple transactions, which is\n // small). The http adapter overrides this in order\n // to do a more efficient single HTTP request.\n this.bulkGet = adapterFun('bulkGet', function (opts, callback) {\n bulkGet(this, opts, callback);\n }).bind(this);\n\n // compact one document and fire callback\n // by compacting we mean removing all revisions which\n // are further from the leaf in revision tree than max_height\n this.compactDocument = adapterFun('compactDocument', function (docId, maxHeight, callback) {\n this._getRevisionTree(docId, (err, revTree) => {\n /* istanbul ignore if */\n if (err) {\n return callback(err);\n }\n var height = computeHeight(revTree);\n var candidates = [];\n var revs = [];\n Object.keys(height).forEach(function (rev$$1) {\n if (height[rev$$1] > maxHeight) {\n candidates.push(rev$$1);\n }\n });\n\n traverseRevTree(revTree, function (isLeaf, pos, revHash, ctx, opts) {\n var rev$$1 = pos + '-' + revHash;\n if (opts.status === 'available' && candidates.indexOf(rev$$1) !== -1) {\n revs.push(rev$$1);\n }\n });\n this._doCompaction(docId, revs, callback);\n });\n }).bind(this);\n\n // compact the whole database using single document\n // compaction\n this.compact = adapterFun('compact', function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n opts = opts || {};\n\n this._compactionQueue = this._compactionQueue || [];\n this._compactionQueue.push({opts, callback});\n if (this._compactionQueue.length === 1) {\n doNextCompaction(this);\n }\n }).bind(this);\n\n /* Begin api wrappers. Specific functionality to storage belongs in the _[method] */\n this.get = adapterFun('get', function (id, opts, cb) {\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n opts = opts || {};\n if (typeof id !== 'string') {\n return cb(createError(INVALID_ID));\n }\n if (isLocalId(id) && typeof this._getLocal === 'function') {\n return this._getLocal(id, cb);\n }\n var leaves = [];\n\n const finishOpenRevs = () => {\n var result = [];\n var count = leaves.length;\n /* istanbul ignore if */\n if (!count) {\n return cb(null, result);\n }\n\n // order with open_revs is unspecified\n leaves.forEach((leaf) => {\n this.get(id, {\n rev: leaf,\n revs: opts.revs,\n latest: opts.latest,\n attachments: opts.attachments,\n binary: opts.binary\n }, function (err, doc) {\n if (!err) {\n // using latest=true can produce duplicates\n var existing;\n for (var i = 0, l = result.length; i < l; i++) {\n if (result[i].ok && result[i].ok._rev === doc._rev) {\n existing = true;\n break;\n }\n }\n if (!existing) {\n result.push({ok: doc});\n }\n } else {\n result.push({missing: leaf});\n }\n count--;\n if (!count) {\n cb(null, result);\n }\n });\n });\n };\n\n if (opts.open_revs) {\n if (opts.open_revs === \"all\") {\n this._getRevisionTree(id, function (err, rev_tree) {\n /* istanbul ignore if */\n if (err) {\n return cb(err);\n }\n leaves = collectLeaves(rev_tree).map(function (leaf) {\n return leaf.rev;\n });\n finishOpenRevs();\n });\n } else {\n if (Array.isArray(opts.open_revs)) {\n leaves = opts.open_revs;\n for (var i = 0; i < leaves.length; i++) {\n var l = leaves[i];\n // looks like it's the only thing couchdb checks\n if (!isValidRev(l)) {\n return cb(createError(INVALID_REV));\n }\n }\n finishOpenRevs();\n } else {\n return cb(createError(UNKNOWN_ERROR, 'function_clause'));\n }\n }\n return; // open_revs does not like other options\n }\n\n return this._get(id, opts, (err, result) => {\n if (err) {\n err.docId = id;\n return cb(err);\n }\n\n var doc = result.doc;\n var metadata = result.metadata;\n var ctx = result.ctx;\n\n if (opts.conflicts) {\n var conflicts = collectConflicts(metadata);\n if (conflicts.length) {\n doc._conflicts = conflicts;\n }\n }\n\n if (isDeleted(metadata, doc._rev)) {\n doc._deleted = true;\n }\n\n if (opts.revs || opts.revs_info) {\n var splittedRev = doc._rev.split('-');\n var revNo = parseInt(splittedRev[0], 10);\n var revHash = splittedRev[1];\n\n var paths = rootToLeaf(metadata.rev_tree);\n var path = null;\n\n for (var i = 0; i < paths.length; i++) {\n var currentPath = paths[i];\n const hashIndex = currentPath.ids.findIndex(x => x.id === revHash);\n var hashFoundAtRevPos = hashIndex === (revNo - 1);\n\n if (hashFoundAtRevPos || (!path && hashIndex !== -1)) {\n path = currentPath;\n }\n }\n\n /* istanbul ignore if */\n if (!path) {\n err = new Error('invalid rev tree');\n err.docId = id;\n return cb(err);\n }\n\n const pathId = doc._rev.split('-')[1];\n const indexOfRev = path.ids.findIndex(x => x.id === pathId) + 1;\n var howMany = path.ids.length - indexOfRev;\n path.ids.splice(indexOfRev, howMany);\n path.ids.reverse();\n\n if (opts.revs) {\n doc._revisions = {\n start: (path.pos + path.ids.length) - 1,\n ids: path.ids.map(function (rev$$1) {\n return rev$$1.id;\n })\n };\n }\n if (opts.revs_info) {\n var pos = path.pos + path.ids.length;\n doc._revs_info = path.ids.map(function (rev$$1) {\n pos--;\n return {\n rev: pos + '-' + rev$$1.id,\n status: rev$$1.opts.status\n };\n });\n }\n }\n\n if (opts.attachments && doc._attachments) {\n var attachments = doc._attachments;\n var count = Object.keys(attachments).length;\n if (count === 0) {\n return cb(null, doc);\n }\n Object.keys(attachments).forEach((key) => {\n this._getAttachment(doc._id, key, attachments[key], {\n binary: opts.binary,\n metadata,\n ctx\n }, function (err, data) {\n var att = doc._attachments[key];\n att.data = data;\n delete att.stub;\n delete att.length;\n if (!--count) {\n cb(null, doc);\n }\n });\n });\n } else {\n if (doc._attachments) {\n for (var key in doc._attachments) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(doc._attachments, key)) {\n doc._attachments[key].stub = true;\n }\n }\n }\n cb(null, doc);\n }\n });\n }).bind(this);\n\n // TODO: I don't like this, it forces an extra read for every\n // attachment read and enforces a confusing api between\n // adapter.js and the adapter implementation\n this.getAttachment = adapterFun('getAttachment', function (docId, attachmentId, opts, callback) {\n if (opts instanceof Function) {\n callback = opts;\n opts = {};\n }\n this._get(docId, opts, (err, res) => {\n if (err) {\n return callback(err);\n }\n if (res.doc._attachments && res.doc._attachments[attachmentId]) {\n opts.ctx = res.ctx;\n opts.binary = true;\n opts.metadata = res.metadata;\n this._getAttachment(docId, attachmentId,\n res.doc._attachments[attachmentId], opts, callback);\n } else {\n return callback(createError(MISSING_DOC));\n }\n });\n }).bind(this);\n\n this.allDocs = adapterFun('allDocs', function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts.skip = typeof opts.skip !== 'undefined' ? opts.skip : 0;\n if (opts.start_key) {\n opts.startkey = opts.start_key;\n }\n if (opts.end_key) {\n opts.endkey = opts.end_key;\n }\n if ('keys' in opts) {\n if (!Array.isArray(opts.keys)) {\n return callback(new TypeError('options.keys must be an array'));\n }\n var incompatibleOpt =\n ['startkey', 'endkey', 'key'].filter(function (incompatibleOpt) {\n return incompatibleOpt in opts;\n })[0];\n if (incompatibleOpt) {\n callback(createError(QUERY_PARSE_ERROR,\n 'Query parameter `' + incompatibleOpt +\n '` is not compatible with multi-get'\n ));\n return;\n }\n if (!isRemote(this)) {\n allDocsKeysParse(opts);\n if (opts.keys.length === 0) {\n return this._allDocs({limit: 0}, callback);\n }\n }\n }\n\n return this._allDocs(opts, callback);\n }).bind(this);\n\n this.close = adapterFun('close', function (callback) {\n this._closed = true;\n this.emit('closed');\n return this._close(callback);\n }).bind(this);\n\n this.info = adapterFun('info', function (callback) {\n this._info((err, info) => {\n if (err) {\n return callback(err);\n }\n // assume we know better than the adapter, unless it informs us\n info.db_name = info.db_name || this.name;\n info.auto_compaction = !!(this.auto_compaction && !isRemote(this));\n info.adapter = this.adapter;\n callback(null, info);\n });\n }).bind(this);\n\n this.id = adapterFun('id', function (callback) {\n return this._id(callback);\n }).bind(this);\n\n this.bulkDocs = adapterFun('bulkDocs', function (req, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n opts = opts || {};\n\n if (Array.isArray(req)) {\n req = {\n docs: req\n };\n }\n\n if (!req || !req.docs || !Array.isArray(req.docs)) {\n return callback(createError(MISSING_BULK_DOCS));\n }\n\n for (var i = 0; i < req.docs.length; ++i) {\n const doc = req.docs[i];\n if (isNotSingleDoc(doc)) {\n return callback(createError(NOT_AN_OBJECT));\n }\n if ('_rev' in doc && !isValidRev(doc._rev)) {\n return callback(createError(INVALID_REV));\n }\n }\n\n var attachmentError;\n req.docs.forEach(function (doc) {\n if (doc._attachments) {\n Object.keys(doc._attachments).forEach(function (name) {\n attachmentError = attachmentError || attachmentNameError(name);\n if (!doc._attachments[name].content_type) {\n guardedConsole('warn', 'Attachment', name, 'on document', doc._id, 'is missing content_type');\n }\n });\n }\n });\n\n if (attachmentError) {\n return callback(createError(BAD_REQUEST, attachmentError));\n }\n\n if (!('new_edits' in opts)) {\n if ('new_edits' in req) {\n opts.new_edits = req.new_edits;\n } else {\n opts.new_edits = true;\n }\n }\n\n var adapter = this;\n if (!opts.new_edits && !isRemote(adapter)) {\n // ensure revisions of the same doc are sorted, so that\n // the local adapter processes them correctly (#2935)\n req.docs.sort(compareByIdThenRev);\n }\n\n cleanDocs(req.docs);\n\n // in the case of conflicts, we want to return the _ids to the user\n // however, the underlying adapter may destroy the docs array, so\n // create a copy here\n var ids = req.docs.map(function (doc) {\n return doc._id;\n });\n\n this._bulkDocs(req, opts, function (err, res) {\n if (err) {\n return callback(err);\n }\n if (!opts.new_edits) {\n // this is what couch does when new_edits is false\n res = res.filter(function (x) {\n return x.error;\n });\n }\n // add ids for error/conflict responses (not required for CouchDB)\n if (!isRemote(adapter)) {\n for (var i = 0, l = res.length; i < l; i++) {\n res[i].id = res[i].id || ids[i];\n }\n }\n\n callback(null, res);\n });\n }).bind(this);\n\n this.registerDependentDatabase = adapterFun('registerDependentDatabase', function (dependentDb, callback) {\n var dbOptions = clone(this.__opts);\n if (this.__opts.view_adapter) {\n dbOptions.adapter = this.__opts.view_adapter;\n }\n\n var depDB = new this.constructor(dependentDb, dbOptions);\n\n function diffFun(doc) {\n doc.dependentDbs = doc.dependentDbs || {};\n if (doc.dependentDbs[dependentDb]) {\n return false; // no update required\n }\n doc.dependentDbs[dependentDb] = true;\n return doc;\n }\n upsert(this, '_local/_pouch_dependentDbs', diffFun).then(function () {\n callback(null, {db: depDB});\n }).catch(callback);\n }).bind(this);\n\n this.destroy = adapterFun('destroy', function (opts, callback) {\n\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n var usePrefix = 'use_prefix' in this ? this.use_prefix : true;\n\n const destroyDb = () => {\n // call destroy method of the particular adaptor\n this._destroy(opts, (err, resp) => {\n if (err) {\n return callback(err);\n }\n this._destroyed = true;\n this.emit('destroyed');\n callback(null, resp || { 'ok': true });\n });\n };\n\n if (isRemote(this)) {\n // no need to check for dependent DBs if it's a remote DB\n return destroyDb();\n }\n\n this.get('_local/_pouch_dependentDbs', (err, localDoc) => {\n if (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n return callback(err);\n } else { // no dependencies\n return destroyDb();\n }\n }\n var dependentDbs = localDoc.dependentDbs;\n var PouchDB = this.constructor;\n var deletedMap = Object.keys(dependentDbs).map((name) => {\n // use_prefix is only false in the browser\n /* istanbul ignore next */\n var trueName = usePrefix ?\n name.replace(new RegExp('^' + PouchDB.prefix), '') : name;\n return new PouchDB(trueName, this.__opts).destroy();\n });\n Promise.all(deletedMap).then(destroyDb, callback);\n });\n }).bind(this);\n }\n\n _compact(opts, callback) {\n var changesOpts = {\n return_docs: false,\n last_seq: opts.last_seq || 0,\n since: opts.last_seq || 0\n };\n var promises = [];\n\n var taskId;\n var compactedDocs = 0;\n\n const onChange = (row) => {\n this.activeTasks.update(taskId, {\n completed_items: ++compactedDocs\n });\n promises.push(this.compactDocument(row.id, 0));\n };\n const onError = (err) => {\n this.activeTasks.remove(taskId, err);\n callback(err);\n };\n const onComplete = (resp) => {\n var lastSeq = resp.last_seq;\n Promise.all(promises).then(() => {\n return upsert(this, '_local/compaction', (doc) => {\n if (!doc.last_seq || doc.last_seq < lastSeq) {\n doc.last_seq = lastSeq;\n return doc;\n }\n return false; // somebody else got here first, don't update\n });\n }).then(() => {\n this.activeTasks.remove(taskId);\n callback(null, {ok: true});\n }).catch(onError);\n };\n\n this.info().then((info) => {\n taskId = this.activeTasks.add({\n name: 'database_compaction',\n total_items: info.update_seq - changesOpts.last_seq,\n });\n\n this.changes(changesOpts)\n .on('change', onChange)\n .on('complete', onComplete)\n .on('error', onError);\n });\n }\n\n changes(opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n opts = opts || {};\n\n // By default set return_docs to false if the caller has opts.live = true,\n // this will prevent us from collecting the set of changes indefinitely\n // resulting in growing memory\n opts.return_docs = ('return_docs' in opts) ? opts.return_docs : !opts.live;\n\n return new Changes$1(this, opts, callback);\n }\n\n type() {\n return (typeof this._type === 'function') ? this._type() : this.adapter;\n }\n}\n\n// The abstract purge implementation expects a doc id and the rev of a leaf node in that doc.\n// It will return errors if the rev doesn’t exist or isn’t a leaf.\nAbstractPouchDB.prototype.purge = adapterFun('_purge', function (docId, rev$$1, callback) {\n if (typeof this._purge === 'undefined') {\n return callback(createError(UNKNOWN_ERROR, 'Purge is not implemented in the ' + this.adapter + ' adapter.'));\n }\n var self = this;\n\n self._getRevisionTree(docId, (error, revs) => {\n if (error) {\n return callback(error);\n }\n if (!revs) {\n return callback(createError(MISSING_DOC));\n }\n let path;\n try {\n path = findPathToLeaf(revs, rev$$1);\n } catch (error) {\n return callback(error.message || error);\n }\n self._purge(docId, path, (error, result) => {\n if (error) {\n return callback(error);\n } else {\n appendPurgeSeq(self, docId, rev$$1).then(function () {\n return callback(null, result);\n });\n }\n });\n });\n});\n\nclass TaskQueue {\n constructor() {\n this.isReady = false;\n this.failed = false;\n this.queue = [];\n }\n\n execute() {\n var fun;\n if (this.failed) {\n while ((fun = this.queue.shift())) {\n fun(this.failed);\n }\n } else {\n while ((fun = this.queue.shift())) {\n fun();\n }\n }\n }\n\n fail(err) {\n this.failed = err;\n this.execute();\n }\n\n ready(db) {\n this.isReady = true;\n this.db = db;\n this.execute();\n }\n\n addTask(fun) {\n this.queue.push(fun);\n if (this.failed) {\n this.execute();\n }\n }\n}\n\nfunction parseAdapter(name, opts) {\n var match = name.match(/([a-z-]*):\\/\\/(.*)/);\n if (match) {\n // the http adapter expects the fully qualified name\n return {\n name: /https?/.test(match[1]) ? match[1] + '://' + match[2] : match[2],\n adapter: match[1]\n };\n }\n\n var adapters = PouchDB.adapters;\n var preferredAdapters = PouchDB.preferredAdapters;\n var prefix = PouchDB.prefix;\n var adapterName = opts.adapter;\n\n if (!adapterName) { // automatically determine adapter\n for (var i = 0; i < preferredAdapters.length; ++i) {\n adapterName = preferredAdapters[i];\n // check for browsers that have been upgraded from websql-only to websql+idb\n /* istanbul ignore if */\n if (adapterName === 'idb' && 'websql' in adapters &&\n hasLocalStorage() && localStorage['_pouch__websqldb_' + prefix + name]) {\n // log it, because this can be confusing during development\n guardedConsole('log', 'PouchDB is downgrading \"' + name + '\" to WebSQL to' +\n ' avoid data loss, because it was already opened with WebSQL.');\n continue; // keep using websql to avoid user data loss\n }\n break;\n }\n }\n\n var adapter = adapters[adapterName];\n\n // if adapter is invalid, then an error will be thrown later\n var usePrefix = (adapter && 'use_prefix' in adapter) ?\n adapter.use_prefix : true;\n\n return {\n name: usePrefix ? (prefix + name) : name,\n adapter: adapterName\n };\n}\n\nfunction inherits(A, B) {\n A.prototype = Object.create(B.prototype, {\n constructor: { value: A }\n });\n}\n\nfunction createClass(parent, init) {\n let klass = function (...args) {\n if (!(this instanceof klass)) {\n return new klass(...args);\n }\n init.apply(this, args);\n };\n inherits(klass, parent);\n return klass;\n}\n\n// OK, so here's the deal. Consider this code:\n// var db1 = new PouchDB('foo');\n// var db2 = new PouchDB('foo');\n// db1.destroy();\n// ^ these two both need to emit 'destroyed' events,\n// as well as the PouchDB constructor itself.\n// So we have one db object (whichever one got destroy() called on it)\n// responsible for emitting the initial event, which then gets emitted\n// by the constructor, which then broadcasts it to any other dbs\n// that may have been created with the same name.\nfunction prepareForDestruction(self) {\n\n function onDestroyed(from_constructor) {\n self.removeListener('closed', onClosed);\n if (!from_constructor) {\n self.constructor.emit('destroyed', self.name);\n }\n }\n\n function onClosed() {\n self.removeListener('destroyed', onDestroyed);\n self.constructor.emit('unref', self);\n }\n\n self.once('destroyed', onDestroyed);\n self.once('closed', onClosed);\n self.constructor.emit('ref', self);\n}\n\nclass PouchInternal extends AbstractPouchDB {\n constructor(name, opts) {\n super();\n this._setup(name, opts);\n }\n\n _setup(name, opts) {\n super._setup();\n opts = opts || {};\n\n if (name && typeof name === 'object') {\n opts = name;\n name = opts.name;\n delete opts.name;\n }\n\n if (opts.deterministic_revs === undefined) {\n opts.deterministic_revs = true;\n }\n\n this.__opts = opts = clone(opts);\n\n this.auto_compaction = opts.auto_compaction;\n this.purged_infos_limit = opts.purged_infos_limit || 1000;\n this.prefix = PouchDB.prefix;\n\n if (typeof name !== 'string') {\n throw new Error('Missing/invalid DB name');\n }\n\n var prefixedName = (opts.prefix || '') + name;\n var backend = parseAdapter(prefixedName, opts);\n\n opts.name = backend.name;\n opts.adapter = opts.adapter || backend.adapter;\n\n this.name = name;\n this._adapter = opts.adapter;\n PouchDB.emit('debug', ['adapter', 'Picked adapter: ', opts.adapter]);\n\n if (!PouchDB.adapters[opts.adapter] ||\n !PouchDB.adapters[opts.adapter].valid()) {\n throw new Error('Invalid Adapter: ' + opts.adapter);\n }\n\n if (opts.view_adapter) {\n if (!PouchDB.adapters[opts.view_adapter] ||\n !PouchDB.adapters[opts.view_adapter].valid()) {\n throw new Error('Invalid View Adapter: ' + opts.view_adapter);\n }\n }\n\n this.taskqueue = new TaskQueue();\n\n this.adapter = opts.adapter;\n\n PouchDB.adapters[opts.adapter].call(this, opts, (err) => {\n if (err) {\n return this.taskqueue.fail(err);\n }\n prepareForDestruction(this);\n\n this.emit('created', this);\n PouchDB.emit('created', this.name);\n this.taskqueue.ready(this);\n });\n }\n}\n\nconst PouchDB = createClass(PouchInternal, function (name, opts) {\n PouchInternal.prototype._setup.call(this, name, opts);\n});\n\nvar f$1 = fetch;\nvar h = Headers;\n\nclass ActiveTasks {\n constructor() {\n this.tasks = {};\n }\n\n list() {\n return Object.values(this.tasks);\n }\n\n add(task) {\n const id = v4();\n this.tasks[id] = {\n id,\n name: task.name,\n total_items: task.total_items,\n created_at: new Date().toJSON()\n };\n return id;\n }\n\n get(id) {\n return this.tasks[id];\n }\n\n /* eslint-disable no-unused-vars */\n remove(id, reason) {\n delete this.tasks[id];\n return this.tasks;\n }\n\n update(id, updatedTask) {\n const task = this.tasks[id];\n if (typeof task !== 'undefined') {\n const mergedTask = {\n id: task.id,\n name: task.name,\n created_at: task.created_at,\n total_items: updatedTask.total_items || task.total_items,\n completed_items: updatedTask.completed_items || task.completed_items,\n updated_at: new Date().toJSON()\n };\n this.tasks[id] = mergedTask;\n }\n return this.tasks;\n }\n}\n\nPouchDB.adapters = {};\nPouchDB.preferredAdapters = [];\n\nPouchDB.prefix = '_pouch_';\n\nvar eventEmitter = new EE();\n\nfunction setUpEventEmitter(Pouch) {\n Object.keys(EE.prototype).forEach(function (key) {\n if (typeof EE.prototype[key] === 'function') {\n Pouch[key] = eventEmitter[key].bind(eventEmitter);\n }\n });\n\n // these are created in constructor.js, and allow us to notify each DB with\n // the same name that it was destroyed, via the constructor object\n var destructListeners = Pouch._destructionListeners = new Map();\n\n Pouch.on('ref', function onConstructorRef(db) {\n if (!destructListeners.has(db.name)) {\n destructListeners.set(db.name, []);\n }\n destructListeners.get(db.name).push(db);\n });\n\n Pouch.on('unref', function onConstructorUnref(db) {\n if (!destructListeners.has(db.name)) {\n return;\n }\n var dbList = destructListeners.get(db.name);\n var pos = dbList.indexOf(db);\n if (pos < 0) {\n /* istanbul ignore next */\n return;\n }\n dbList.splice(pos, 1);\n if (dbList.length > 1) {\n /* istanbul ignore next */\n destructListeners.set(db.name, dbList);\n } else {\n destructListeners.delete(db.name);\n }\n });\n\n Pouch.on('destroyed', function onConstructorDestroyed(name) {\n if (!destructListeners.has(name)) {\n return;\n }\n var dbList = destructListeners.get(name);\n destructListeners.delete(name);\n dbList.forEach(function (db) {\n db.emit('destroyed',true);\n });\n });\n}\n\nsetUpEventEmitter(PouchDB);\n\nPouchDB.adapter = function (id, obj, addToPreferredAdapters) {\n /* istanbul ignore else */\n if (obj.valid()) {\n PouchDB.adapters[id] = obj;\n if (addToPreferredAdapters) {\n PouchDB.preferredAdapters.push(id);\n }\n }\n};\n\nPouchDB.plugin = function (obj) {\n if (typeof obj === 'function') { // function style for plugins\n obj(PouchDB);\n } else if (typeof obj !== 'object' || Object.keys(obj).length === 0) {\n throw new Error('Invalid plugin: got \"' + obj + '\", expected an object or a function');\n } else {\n Object.keys(obj).forEach(function (id) { // object style for plugins\n PouchDB.prototype[id] = obj[id];\n });\n }\n if (this.__defaults) {\n PouchDB.__defaults = Object.assign({}, this.__defaults);\n }\n return PouchDB;\n};\n\nPouchDB.defaults = function (defaultOpts) {\n let PouchWithDefaults = createClass(PouchDB, function (name, opts) {\n opts = opts || {};\n\n if (name && typeof name === 'object') {\n opts = name;\n name = opts.name;\n delete opts.name;\n }\n\n opts = Object.assign({}, PouchWithDefaults.__defaults, opts);\n PouchDB.call(this, name, opts);\n });\n\n PouchWithDefaults.preferredAdapters = PouchDB.preferredAdapters.slice();\n Object.keys(PouchDB).forEach(function (key) {\n if (!(key in PouchWithDefaults)) {\n PouchWithDefaults[key] = PouchDB[key];\n }\n });\n\n // make default options transitive\n // https://github.com/pouchdb/pouchdb/issues/5922\n PouchWithDefaults.__defaults = Object.assign({}, this.__defaults, defaultOpts);\n\n return PouchWithDefaults;\n};\n\nPouchDB.fetch = function (url, opts) {\n return f$1(url, opts);\n};\n\nPouchDB.prototype.activeTasks = PouchDB.activeTasks = new ActiveTasks();\n\n// managed automatically by set-version.js\nvar version = \"9.0.0\";\n\n// this would just be \"return doc[field]\", but fields\n// can be \"deep\" due to dot notation\nfunction getFieldFromDoc(doc, parsedField) {\n var value = doc;\n for (var i = 0, len = parsedField.length; i < len; i++) {\n var key = parsedField[i];\n value = value[key];\n if (!value) {\n break;\n }\n }\n return value;\n}\n\nfunction compare(left, right) {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\n// Converts a string in dot notation to an array of its components, with backslash escaping\nfunction parseField(fieldName) {\n // fields may be deep (e.g. \"foo.bar.baz\"), so parse\n var fields = [];\n var current = '';\n for (var i = 0, len = fieldName.length; i < len; i++) {\n var ch = fieldName[i];\n if (i > 0 && fieldName[i - 1] === '\\\\' && (ch === '$' || ch === '.')) {\n // escaped delimiter\n current = current.substring(0, current.length - 1) + ch;\n } else if (ch === '.') {\n // When `.` is not escaped (above), it is a field delimiter\n fields.push(current);\n current = '';\n } else { // normal character\n current += ch;\n }\n }\n fields.push(current);\n return fields;\n}\n\nvar combinationFields = ['$or', '$nor', '$not'];\nfunction isCombinationalField(field) {\n return combinationFields.indexOf(field) > -1;\n}\n\nfunction getKey(obj) {\n return Object.keys(obj)[0];\n}\n\nfunction getValue(obj) {\n return obj[getKey(obj)];\n}\n\n\n// flatten an array of selectors joined by an $and operator\nfunction mergeAndedSelectors(selectors) {\n\n // sort to ensure that e.g. if the user specified\n // $and: [{$gt: 'a'}, {$gt: 'b'}], then it's collapsed into\n // just {$gt: 'b'}\n var res = {};\n var first = {$or: true, $nor: true};\n\n selectors.forEach(function (selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n if (typeof matcher !== 'object') {\n matcher = {$eq: matcher};\n }\n\n if (isCombinationalField(field)) {\n // or, nor\n if (matcher instanceof Array) {\n if (first[field]) {\n first[field] = false;\n res[field] = matcher;\n return;\n }\n\n var entries = [];\n res[field].forEach(function (existing) {\n Object.keys(matcher).forEach(function (key) {\n var m = matcher[key];\n var longest = Math.max(Object.keys(existing).length, Object.keys(m).length);\n var merged = mergeAndedSelectors([existing, m]);\n if (Object.keys(merged).length <= longest) {\n // we have a situation like: (a :{$eq :1} || ...) && (a {$eq: 2} || ...)\n // merging would produce a $eq 2 when actually we shouldn't ever match against these merged conditions\n // merged should always contain more values to be valid\n return;\n }\n entries.push(merged);\n });\n });\n res[field] = entries;\n } else {\n // not\n res[field] = mergeAndedSelectors([matcher]);\n }\n } else {\n var fieldMatchers = res[field] = res[field] || {};\n Object.keys(matcher).forEach(function (operator) {\n var value = matcher[operator];\n\n if (operator === '$gt' || operator === '$gte') {\n return mergeGtGte(operator, value, fieldMatchers);\n } else if (operator === '$lt' || operator === '$lte') {\n return mergeLtLte(operator, value, fieldMatchers);\n } else if (operator === '$ne') {\n return mergeNe(value, fieldMatchers);\n } else if (operator === '$eq') {\n return mergeEq(value, fieldMatchers);\n } else if (operator === \"$regex\") {\n return mergeRegex(value, fieldMatchers);\n }\n fieldMatchers[operator] = value;\n });\n }\n });\n });\n\n return res;\n}\n\n\n\n// collapse logically equivalent gt/gte values\nfunction mergeGtGte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$gte !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gte) { // more specificity\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value >= fieldMatchers.$gte) { // more specificity\n delete fieldMatchers.$gte;\n fieldMatchers.$gt = value;\n }\n }\n } else if (typeof fieldMatchers.$gt !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gt) { // more specificity\n delete fieldMatchers.$gt;\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value > fieldMatchers.$gt) { // more specificity\n fieldMatchers.$gt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// collapse logically equivalent lt/lte values\nfunction mergeLtLte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$lte !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lte) { // more specificity\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value <= fieldMatchers.$lte) { // more specificity\n delete fieldMatchers.$lte;\n fieldMatchers.$lt = value;\n }\n }\n } else if (typeof fieldMatchers.$lt !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lt) { // more specificity\n delete fieldMatchers.$lt;\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value < fieldMatchers.$lt) { // more specificity\n fieldMatchers.$lt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// combine $ne values into one array\nfunction mergeNe(value, fieldMatchers) {\n if ('$ne' in fieldMatchers) {\n // there are many things this could \"not\" be\n fieldMatchers.$ne.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$ne = [value];\n }\n}\n\n// add $eq into the mix\nfunction mergeEq(value, fieldMatchers) {\n // these all have less specificity than the $eq\n // TODO: check for user errors here\n delete fieldMatchers.$gt;\n delete fieldMatchers.$gte;\n delete fieldMatchers.$lt;\n delete fieldMatchers.$lte;\n delete fieldMatchers.$ne;\n fieldMatchers.$eq = value;\n}\n\n// combine $regex values into one array\nfunction mergeRegex(value, fieldMatchers) {\n if ('$regex' in fieldMatchers) {\n // a value could match multiple regexes\n fieldMatchers.$regex.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$regex = [value];\n }\n}\n\n//#7458: execute function mergeAndedSelectors on nested $and\nfunction mergeAndedSelectorsNested(obj) {\n for (var prop in obj) {\n if (Array.isArray(obj)) {\n for (var i in obj) {\n if (obj[i]['$and']) {\n obj[i] = mergeAndedSelectors(obj[i]['$and']);\n }\n }\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n mergeAndedSelectorsNested(value); // <- recursive call\n }\n }\n return obj;\n}\n\n//#7458: determine id $and is present in selector (at any level)\nfunction isAndInSelector(obj, isAnd) {\n for (var prop in obj) {\n if (prop === '$and') {\n isAnd = true;\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n isAnd = isAndInSelector(value, isAnd); // <- recursive call\n }\n }\n return isAnd;\n}\n\n//\n// normalize the selector\n//\nfunction massageSelector(input) {\n var result = clone(input);\n\n //#7458: if $and is present in selector (at any level) merge nested $and\n if (isAndInSelector(result, false)) {\n result = mergeAndedSelectorsNested(result);\n if ('$and' in result) {\n result = mergeAndedSelectors(result['$and']);\n }\n }\n\n ['$or', '$nor'].forEach(function (orOrNor) {\n if (orOrNor in result) {\n // message each individual selector\n // e.g. {foo: 'bar'} becomes {foo: {$eq: 'bar'}}\n result[orOrNor].forEach(function (subSelector) {\n var fields = Object.keys(subSelector);\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = subSelector[field];\n if (typeof matcher !== 'object' || matcher === null) {\n subSelector[field] = {$eq: matcher};\n }\n }\n });\n }\n });\n\n if ('$not' in result) {\n //This feels a little like forcing, but it will work for now,\n //I would like to come back to this and make the merging of selectors a little more generic\n result['$not'] = mergeAndedSelectors([result['$not']]);\n }\n\n var fields = Object.keys(result);\n\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = result[field];\n\n if (typeof matcher !== 'object' || matcher === null) {\n matcher = {$eq: matcher};\n }\n result[field] = matcher;\n }\n\n normalizeArrayOperators(result);\n\n return result;\n}\n\n//\n// The $ne and $regex values must be placed in an array because these operators can be used multiple times on the same field.\n// When $and is used, mergeAndedSelectors takes care of putting some of them into arrays, otherwise it's done here.\n//\nfunction normalizeArrayOperators(selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n\n if (Array.isArray(matcher)) {\n matcher.forEach(function (matcherItem) {\n if (matcherItem && typeof matcherItem === 'object') {\n normalizeArrayOperators(matcherItem);\n }\n });\n } else if (field === '$ne') {\n selector.$ne = [matcher];\n } else if (field === '$regex') {\n selector.$regex = [matcher];\n } else if (matcher && typeof matcher === 'object') {\n normalizeArrayOperators(matcher);\n }\n });\n}\n\nfunction pad(str, padWith, upToLength) {\n var padding = '';\n var targetLength = upToLength - str.length;\n /* istanbul ignore next */\n while (padding.length < targetLength) {\n padding += padWith;\n }\n return padding;\n}\n\nfunction padLeft(str, padWith, upToLength) {\n var padding = pad(str, padWith, upToLength);\n return padding + str;\n}\n\nvar MIN_MAGNITUDE = -324; // verified by -Number.MIN_VALUE\nvar MAGNITUDE_DIGITS = 3; // ditto\nvar SEP = ''; // set to '_' for easier debugging\n\nfunction collate(a, b) {\n\n if (a === b) {\n return 0;\n }\n\n a = normalizeKey(a);\n b = normalizeKey(b);\n\n var ai = collationIndex(a);\n var bi = collationIndex(b);\n if ((ai - bi) !== 0) {\n return ai - bi;\n }\n switch (typeof a) {\n case 'number':\n return a - b;\n case 'boolean':\n return a < b ? -1 : 1;\n case 'string':\n return stringCollate(a, b);\n }\n return Array.isArray(a) ? arrayCollate(a, b) : objectCollate(a, b);\n}\n\n// couch considers null/NaN/Infinity/-Infinity === undefined,\n// for the purposes of mapreduce indexes. also, dates get stringified.\nfunction normalizeKey(key) {\n switch (typeof key) {\n case 'undefined':\n return null;\n case 'number':\n if (key === Infinity || key === -Infinity || isNaN(key)) {\n return null;\n }\n return key;\n case 'object':\n var origKey = key;\n if (Array.isArray(key)) {\n var len = key.length;\n key = new Array(len);\n for (var i = 0; i < len; i++) {\n key[i] = normalizeKey(origKey[i]);\n }\n /* istanbul ignore next */\n } else if (key instanceof Date) {\n return key.toJSON();\n } else if (key !== null) { // generic object\n key = {};\n for (var k in origKey) {\n if (Object.prototype.hasOwnProperty.call(origKey, k)) {\n var val = origKey[k];\n if (typeof val !== 'undefined') {\n key[k] = normalizeKey(val);\n }\n }\n }\n }\n }\n return key;\n}\n\nfunction indexify(key) {\n if (key !== null) {\n switch (typeof key) {\n case 'boolean':\n return key ? 1 : 0;\n case 'number':\n return numToIndexableString(key);\n case 'string':\n // We've to be sure that key does not contain \\u0000\n // Do order-preserving replacements:\n // 0 -> 1, 1\n // 1 -> 1, 2\n // 2 -> 2, 2\n /* eslint-disable no-control-regex */\n return key\n .replace(/\\u0002/g, '\\u0002\\u0002')\n .replace(/\\u0001/g, '\\u0001\\u0002')\n .replace(/\\u0000/g, '\\u0001\\u0001');\n /* eslint-enable no-control-regex */\n case 'object':\n var isArray = Array.isArray(key);\n var arr = isArray ? key : Object.keys(key);\n var i = -1;\n var len = arr.length;\n var result = '';\n if (isArray) {\n while (++i < len) {\n result += toIndexableString(arr[i]);\n }\n } else {\n while (++i < len) {\n var objKey = arr[i];\n result += toIndexableString(objKey) +\n toIndexableString(key[objKey]);\n }\n }\n return result;\n }\n }\n return '';\n}\n\n// convert the given key to a string that would be appropriate\n// for lexical sorting, e.g. within a database, where the\n// sorting is the same given by the collate() function.\nfunction toIndexableString(key) {\n var zero = '\\u0000';\n key = normalizeKey(key);\n return collationIndex(key) + SEP + indexify(key) + zero;\n}\n\nfunction parseNumber(str, i) {\n var originalIdx = i;\n var num;\n var zero = str[i] === '1';\n if (zero) {\n num = 0;\n i++;\n } else {\n var neg = str[i] === '0';\n i++;\n var numAsString = '';\n var magAsString = str.substring(i, i + MAGNITUDE_DIGITS);\n var magnitude = parseInt(magAsString, 10) + MIN_MAGNITUDE;\n /* istanbul ignore next */\n if (neg) {\n magnitude = -magnitude;\n }\n i += MAGNITUDE_DIGITS;\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n } else {\n numAsString += ch;\n }\n i++;\n }\n numAsString = numAsString.split('.');\n if (numAsString.length === 1) {\n num = parseInt(numAsString, 10);\n } else {\n /* istanbul ignore next */\n num = parseFloat(numAsString[0] + '.' + numAsString[1]);\n }\n /* istanbul ignore next */\n if (neg) {\n num = num - 10;\n }\n /* istanbul ignore next */\n if (magnitude !== 0) {\n // parseFloat is more reliable than pow due to rounding errors\n // e.g. Number.MAX_VALUE would return Infinity if we did\n // num * Math.pow(10, magnitude);\n num = parseFloat(num + 'e' + magnitude);\n }\n }\n return {num, length : i - originalIdx};\n}\n\n// move up the stack while parsing\n// this function moved outside of parseIndexableString for performance\nfunction pop(stack, metaStack) {\n var obj = stack.pop();\n\n if (metaStack.length) {\n var lastMetaElement = metaStack[metaStack.length - 1];\n if (obj === lastMetaElement.element) {\n // popping a meta-element, e.g. an object whose value is another object\n metaStack.pop();\n lastMetaElement = metaStack[metaStack.length - 1];\n }\n var element = lastMetaElement.element;\n var lastElementIndex = lastMetaElement.index;\n if (Array.isArray(element)) {\n element.push(obj);\n } else if (lastElementIndex === stack.length - 2) { // obj with key+value\n var key = stack.pop();\n element[key] = obj;\n } else {\n stack.push(obj); // obj with key only\n }\n }\n}\n\nfunction parseIndexableString(str) {\n var stack = [];\n var metaStack = []; // stack for arrays and objects\n var i = 0;\n\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var collationIndex = str[i++];\n if (collationIndex === '\\u0000') {\n if (stack.length === 1) {\n return stack.pop();\n } else {\n pop(stack, metaStack);\n continue;\n }\n }\n switch (collationIndex) {\n case '1':\n stack.push(null);\n break;\n case '2':\n stack.push(str[i] === '1');\n i++;\n break;\n case '3':\n var parsedNum = parseNumber(str, i);\n stack.push(parsedNum.num);\n i += parsedNum.length;\n break;\n case '4':\n var parsedStr = '';\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n }\n parsedStr += ch;\n i++;\n }\n // perform the reverse of the order-preserving replacement\n // algorithm (see above)\n /* eslint-disable no-control-regex */\n parsedStr = parsedStr.replace(/\\u0001\\u0001/g, '\\u0000')\n .replace(/\\u0001\\u0002/g, '\\u0001')\n .replace(/\\u0002\\u0002/g, '\\u0002');\n /* eslint-enable no-control-regex */\n stack.push(parsedStr);\n break;\n case '5':\n var arrayElement = { element: [], index: stack.length };\n stack.push(arrayElement.element);\n metaStack.push(arrayElement);\n break;\n case '6':\n var objElement = { element: {}, index: stack.length };\n stack.push(objElement.element);\n metaStack.push(objElement);\n break;\n /* istanbul ignore next */\n default:\n throw new Error(\n 'bad collationIndex or unexpectedly reached end of input: ' +\n collationIndex);\n }\n }\n}\n\nfunction arrayCollate(a, b) {\n var len = Math.min(a.length, b.length);\n for (var i = 0; i < len; i++) {\n var sort = collate(a[i], b[i]);\n if (sort !== 0) {\n return sort;\n }\n }\n return (a.length === b.length) ? 0 :\n (a.length > b.length) ? 1 : -1;\n}\nfunction stringCollate(a, b) {\n // See: https://github.com/daleharvey/pouchdb/issues/40\n // This is incompatible with the CouchDB implementation, but its the\n // best we can do for now\n return (a === b) ? 0 : ((a > b) ? 1 : -1);\n}\nfunction objectCollate(a, b) {\n var ak = Object.keys(a), bk = Object.keys(b);\n var len = Math.min(ak.length, bk.length);\n for (var i = 0; i < len; i++) {\n // First sort the keys\n var sort = collate(ak[i], bk[i]);\n if (sort !== 0) {\n return sort;\n }\n // if the keys are equal sort the values\n sort = collate(a[ak[i]], b[bk[i]]);\n if (sort !== 0) {\n return sort;\n }\n\n }\n return (ak.length === bk.length) ? 0 :\n (ak.length > bk.length) ? 1 : -1;\n}\n// The collation is defined by erlangs ordered terms\n// the atoms null, true, false come first, then numbers, strings,\n// arrays, then objects\n// null/undefined/NaN/Infinity/-Infinity are all considered null\nfunction collationIndex(x) {\n var id = ['boolean', 'number', 'string', 'object'];\n var idx = id.indexOf(typeof x);\n //false if -1 otherwise true, but fast!!!!1\n if (~idx) {\n if (x === null) {\n return 1;\n }\n if (Array.isArray(x)) {\n return 5;\n }\n return idx < 3 ? (idx + 2) : (idx + 3);\n }\n /* istanbul ignore next */\n if (Array.isArray(x)) {\n return 5;\n }\n}\n\n// conversion:\n// x yyy zz...zz\n// x = 0 for negative, 1 for 0, 2 for positive\n// y = exponent (for negative numbers negated) moved so that it's >= 0\n// z = mantisse\nfunction numToIndexableString(num) {\n\n if (num === 0) {\n return '1';\n }\n\n // convert number to exponential format for easier and\n // more succinct string sorting\n var expFormat = num.toExponential().split(/e\\+?/);\n var magnitude = parseInt(expFormat[1], 10);\n\n var neg = num < 0;\n\n var result = neg ? '0' : '2';\n\n // first sort by magnitude\n // it's easier if all magnitudes are positive\n var magForComparison = ((neg ? -magnitude : magnitude) - MIN_MAGNITUDE);\n var magString = padLeft((magForComparison).toString(), '0', MAGNITUDE_DIGITS);\n\n result += SEP + magString;\n\n // then sort by the factor\n var factor = Math.abs(parseFloat(expFormat[0])); // [1..10)\n /* istanbul ignore next */\n if (neg) { // for negative reverse ordering\n factor = 10 - factor;\n }\n\n var factorStr = factor.toFixed(20);\n\n // strip zeros from the end\n factorStr = factorStr.replace(/\\.?0+$/, '');\n\n result += SEP + factorStr;\n\n return result;\n}\n\n// create a comparator based on the sort object\nfunction createFieldSorter(sort) {\n\n function getFieldValuesAsArray(doc) {\n return sort.map(function (sorting) {\n var fieldName = getKey(sorting);\n var parsedField = parseField(fieldName);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n return docFieldValue;\n });\n }\n\n return function (aRow, bRow) {\n var aFieldValues = getFieldValuesAsArray(aRow.doc);\n var bFieldValues = getFieldValuesAsArray(bRow.doc);\n var collation = collate(aFieldValues, bFieldValues);\n if (collation !== 0) {\n return collation;\n }\n // this is what mango seems to do\n return compare(aRow.doc._id, bRow.doc._id);\n };\n}\n\nfunction filterInMemoryFields(rows, requestDef, inMemoryFields) {\n rows = rows.filter(function (row) {\n return rowFilter(row.doc, requestDef.selector, inMemoryFields);\n });\n\n if (requestDef.sort) {\n // in-memory sort\n var fieldSorter = createFieldSorter(requestDef.sort);\n rows = rows.sort(fieldSorter);\n if (typeof requestDef.sort[0] !== 'string' &&\n getValue(requestDef.sort[0]) === 'desc') {\n rows = rows.reverse();\n }\n }\n\n if ('limit' in requestDef || 'skip' in requestDef) {\n // have to do the limit in-memory\n var skip = requestDef.skip || 0;\n var limit = ('limit' in requestDef ? requestDef.limit : rows.length) + skip;\n rows = rows.slice(skip, limit);\n }\n return rows;\n}\n\nfunction rowFilter(doc, selector, inMemoryFields) {\n return inMemoryFields.every(function (field) {\n var matcher = selector[field];\n var parsedField = parseField(field);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n if (isCombinationalField(field)) {\n return matchCominationalSelector(field, matcher, doc);\n }\n\n return matchSelector(matcher, doc, parsedField, docFieldValue);\n });\n}\n\nfunction matchSelector(matcher, doc, parsedField, docFieldValue) {\n if (!matcher) {\n // no filtering necessary; this field is just needed for sorting\n return true;\n }\n\n // is matcher an object, if so continue recursion\n if (typeof matcher === 'object') {\n return Object.keys(matcher).every(function (maybeUserOperator) {\n var userValue = matcher[ maybeUserOperator ];\n // explicit operator\n if (maybeUserOperator.indexOf(\"$\") === 0) {\n return match(maybeUserOperator, doc, userValue, parsedField, docFieldValue);\n } else {\n var subParsedField = parseField(maybeUserOperator);\n\n if (\n docFieldValue === undefined &&\n typeof userValue !== \"object\" &&\n subParsedField.length > 0\n ) {\n // the field does not exist, return or getFieldFromDoc will throw\n return false;\n }\n\n var subDocFieldValue = getFieldFromDoc(docFieldValue, subParsedField);\n\n if (typeof userValue === \"object\") {\n // field value is an object that might contain more operators\n return matchSelector(userValue, doc, parsedField, subDocFieldValue);\n }\n\n // implicit operator\n return match(\"$eq\", doc, userValue, subParsedField, subDocFieldValue);\n }\n });\n }\n\n // no more depth, No need to recurse further\n return matcher === docFieldValue;\n}\n\nfunction matchCominationalSelector(field, matcher, doc) {\n\n if (field === '$or') {\n return matcher.some(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n }\n\n if (field === '$not') {\n return !rowFilter(doc, matcher, Object.keys(matcher));\n }\n\n //`$nor`\n return !matcher.find(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n\n}\n\nfunction match(userOperator, doc, userValue, parsedField, docFieldValue) {\n if (!matchers[userOperator]) {\n /* istanbul ignore next */\n throw new Error('unknown operator \"' + userOperator +\n '\" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, ' +\n '$nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');\n }\n return matchers[userOperator](doc, userValue, parsedField, docFieldValue);\n}\n\nfunction fieldExists(docFieldValue) {\n return typeof docFieldValue !== 'undefined' && docFieldValue !== null;\n}\n\nfunction fieldIsNotUndefined(docFieldValue) {\n return typeof docFieldValue !== 'undefined';\n}\n\nfunction modField(docFieldValue, userValue) {\n if (typeof docFieldValue !== \"number\" ||\n parseInt(docFieldValue, 10) !== docFieldValue) {\n return false;\n }\n\n var divisor = userValue[0];\n var mod = userValue[1];\n\n return docFieldValue % divisor === mod;\n}\n\nfunction arrayContainsValue(docFieldValue, userValue) {\n return userValue.some(function (val) {\n if (docFieldValue instanceof Array) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n }\n\n return collate(val, docFieldValue) === 0;\n });\n}\n\nfunction arrayContainsAllValues(docFieldValue, userValue) {\n return userValue.every(function (val) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n });\n}\n\nfunction arraySize(docFieldValue, userValue) {\n return docFieldValue.length === userValue;\n}\n\nfunction regexMatch(docFieldValue, userValue) {\n var re = new RegExp(userValue);\n\n return re.test(docFieldValue);\n}\n\nfunction typeMatch(docFieldValue, userValue) {\n\n switch (userValue) {\n case 'null':\n return docFieldValue === null;\n case 'boolean':\n return typeof (docFieldValue) === 'boolean';\n case 'number':\n return typeof (docFieldValue) === 'number';\n case 'string':\n return typeof (docFieldValue) === 'string';\n case 'array':\n return docFieldValue instanceof Array;\n case 'object':\n return ({}).toString.call(docFieldValue) === '[object Object]';\n }\n}\n\nvar matchers = {\n\n '$elemMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.some(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.some(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$allMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n /* istanbul ignore next */\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.every(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.every(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$eq': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) === 0;\n },\n\n '$gte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) >= 0;\n },\n\n '$gt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) > 0;\n },\n\n '$lte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) <= 0;\n },\n\n '$lt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) < 0;\n },\n\n '$exists': function (doc, userValue, parsedField, docFieldValue) {\n //a field that is null is still considered to exist\n if (userValue) {\n return fieldIsNotUndefined(docFieldValue);\n }\n\n return !fieldIsNotUndefined(docFieldValue);\n },\n\n '$mod': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && modField(docFieldValue, userValue);\n },\n\n '$ne': function (doc, userValue, parsedField, docFieldValue) {\n return userValue.every(function (neValue) {\n return collate(docFieldValue, neValue) !== 0;\n });\n },\n '$in': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && arrayContainsValue(docFieldValue, userValue);\n },\n\n '$nin': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && !arrayContainsValue(docFieldValue, userValue);\n },\n\n '$size': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n Array.isArray(docFieldValue) &&\n arraySize(docFieldValue, userValue);\n },\n\n '$all': function (doc, userValue, parsedField, docFieldValue) {\n return Array.isArray(docFieldValue) && arrayContainsAllValues(docFieldValue, userValue);\n },\n\n '$regex': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n typeof docFieldValue == \"string\" &&\n userValue.every(function (regexValue) {\n return regexMatch(docFieldValue, regexValue);\n });\n },\n\n '$type': function (doc, userValue, parsedField, docFieldValue) {\n return typeMatch(docFieldValue, userValue);\n }\n};\n\n// return true if the given doc matches the supplied selector\nfunction matchesSelector(doc, selector) {\n /* istanbul ignore if */\n if (typeof selector !== 'object') {\n // match the CouchDB error message\n throw new Error('Selector error: expected a JSON object');\n }\n\n selector = massageSelector(selector);\n var row = {\n doc\n };\n\n var rowsMatched = filterInMemoryFields([row], { selector }, Object.keys(selector));\n return rowsMatched && rowsMatched.length === 1;\n}\n\nfunction evalFilter(input) {\n return scopeEval('\"use strict\";\\nreturn ' + input + ';', {});\n}\n\nfunction evalView(input) {\n var code = [\n 'return function(doc) {',\n ' \"use strict\";',\n ' var emitted = false;',\n ' var emit = function (a, b) {',\n ' emitted = true;',\n ' };',\n ' var view = ' + input + ';',\n ' view(doc);',\n ' if (emitted) {',\n ' return true;',\n ' }',\n '};'\n ].join('\\n');\n\n return scopeEval(code, {});\n}\n\nfunction validate(opts, callback) {\n if (opts.selector) {\n if (opts.filter && opts.filter !== '_selector') {\n var filterName = typeof opts.filter === 'string' ?\n opts.filter : 'function';\n return callback(new Error('selector invalid for filter \"' + filterName + '\"'));\n }\n }\n callback();\n}\n\nfunction normalize(opts) {\n if (opts.view && !opts.filter) {\n opts.filter = '_view';\n }\n\n if (opts.selector && !opts.filter) {\n opts.filter = '_selector';\n }\n\n if (opts.filter && typeof opts.filter === 'string') {\n if (opts.filter === '_view') {\n opts.view = normalizeDesignDocFunctionName(opts.view);\n } else {\n opts.filter = normalizeDesignDocFunctionName(opts.filter);\n }\n }\n}\n\nfunction shouldFilter(changesHandler, opts) {\n return opts.filter && typeof opts.filter === 'string' &&\n !opts.doc_ids && !isRemote(changesHandler.db);\n}\n\nfunction filter(changesHandler, opts) {\n var callback = opts.complete;\n if (opts.filter === '_view') {\n if (!opts.view || typeof opts.view !== 'string') {\n var err = createError(BAD_REQUEST,\n '`view` filter parameter not found or invalid.');\n return callback(err);\n }\n // fetch a view from a design doc, make it behave like a filter\n var viewName = parseDesignDocFunctionName(opts.view);\n changesHandler.db.get('_design/' + viewName[0], function (err, ddoc) {\n /* istanbul ignore if */\n if (changesHandler.isCancelled) {\n return callback(null, {status: 'cancelled'});\n }\n /* istanbul ignore next */\n if (err) {\n return callback(generateErrorFromResponse(err));\n }\n var mapFun = ddoc && ddoc.views && ddoc.views[viewName[1]] &&\n ddoc.views[viewName[1]].map;\n if (!mapFun) {\n return callback(createError(MISSING_DOC,\n (ddoc.views ? 'missing json key: ' + viewName[1] :\n 'missing json key: views')));\n }\n opts.filter = evalView(mapFun);\n changesHandler.doChanges(opts);\n });\n } else if (opts.selector) {\n opts.filter = function (doc) {\n return matchesSelector(doc, opts.selector);\n };\n changesHandler.doChanges(opts);\n } else {\n // fetch a filter from a design doc\n var filterName = parseDesignDocFunctionName(opts.filter);\n changesHandler.db.get('_design/' + filterName[0], function (err, ddoc) {\n /* istanbul ignore if */\n if (changesHandler.isCancelled) {\n return callback(null, {status: 'cancelled'});\n }\n /* istanbul ignore next */\n if (err) {\n return callback(generateErrorFromResponse(err));\n }\n var filterFun = ddoc && ddoc.filters && ddoc.filters[filterName[1]];\n if (!filterFun) {\n return callback(createError(MISSING_DOC,\n ((ddoc && ddoc.filters) ? 'missing json key: ' + filterName[1]\n : 'missing json key: filters')));\n }\n opts.filter = evalFilter(filterFun);\n changesHandler.doChanges(opts);\n });\n }\n}\n\nfunction applyChangesFilterPlugin(PouchDB) {\n PouchDB._changesFilterPlugin = {\n validate,\n normalize,\n shouldFilter,\n filter\n };\n}\n\n// TODO: remove from pouchdb-core (breaking)\nPouchDB.plugin(applyChangesFilterPlugin);\n\nPouchDB.version = version;\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37, Android <5 and (some?) webkit-based browsers.\n// In those versions, storing a blob will throw.\n//\n// Example Webkit error:\n// > DataCloneError: Failed to store record in an IDBObjectStore: BlobURLs are not yet supported.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\nfunction checkBlobSupport(txn, store, docIdOrCreateDoc) {\n return new Promise(function (resolve) {\n var blob$$1 = createBlob(['']);\n\n let req;\n if (typeof docIdOrCreateDoc === 'function') {\n // Store may require a specific key path, in which case we can't store the\n // blob directly in the store.\n const createDoc = docIdOrCreateDoc;\n const doc = createDoc(blob$$1);\n req = txn.objectStore(store).put(doc);\n } else {\n const docId = docIdOrCreateDoc;\n req = txn.objectStore(store).put(blob$$1, docId);\n }\n\n req.onsuccess = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome ||\n parseInt(matchedChrome[1], 10) >= 43);\n };\n\n req.onerror = txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n }).catch(function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction toObject(array) {\n return array.reduce(function (obj, item) {\n obj[item] = true;\n return obj;\n }, {});\n}\n// List of top level reserved words for doc\nvar reservedWords = toObject([\n '_id',\n '_rev',\n '_access',\n '_attachments',\n '_deleted',\n '_revisions',\n '_revs_info',\n '_conflicts',\n '_deleted_conflicts',\n '_local_seq',\n '_rev_tree',\n // replication documents\n '_replication_id',\n '_replication_state',\n '_replication_state_time',\n '_replication_state_reason',\n '_replication_stats',\n // Specific to Couchbase Sync Gateway\n '_removed'\n]);\n\n// List of reserved words that should end up in the document\nvar dataWords = toObject([\n '_access',\n '_attachments',\n // replication documents\n '_replication_id',\n '_replication_state',\n '_replication_state_time',\n '_replication_state_reason',\n '_replication_stats'\n]);\n\nfunction parseRevisionInfo(rev$$1) {\n if (!/^\\d+-/.test(rev$$1)) {\n return createError(INVALID_REV);\n }\n var idx = rev$$1.indexOf('-');\n var left = rev$$1.substring(0, idx);\n var right = rev$$1.substring(idx + 1);\n return {\n prefix: parseInt(left, 10),\n id: right\n };\n}\n\nfunction makeRevTreeFromRevisions(revisions, opts) {\n var pos = revisions.start - revisions.ids.length + 1;\n\n var revisionIds = revisions.ids;\n var ids = [revisionIds[0], opts, []];\n\n for (var i = 1, len = revisionIds.length; i < len; i++) {\n ids = [revisionIds[i], {status: 'missing'}, [ids]];\n }\n\n return [{\n pos,\n ids\n }];\n}\n\n// Preprocess documents, parse their revisions, assign an id and a\n// revision for new writes that are missing them, etc\nfunction parseDoc(doc, newEdits, dbOpts) {\n if (!dbOpts) {\n dbOpts = {\n deterministic_revs: true\n };\n }\n\n var nRevNum;\n var newRevId;\n var revInfo;\n var opts = {status: 'available'};\n if (doc._deleted) {\n opts.deleted = true;\n }\n\n if (newEdits) {\n if (!doc._id) {\n doc._id = uuid();\n }\n newRevId = rev(doc, dbOpts.deterministic_revs);\n if (doc._rev) {\n revInfo = parseRevisionInfo(doc._rev);\n if (revInfo.error) {\n return revInfo;\n }\n doc._rev_tree = [{\n pos: revInfo.prefix,\n ids: [revInfo.id, {status: 'missing'}, [[newRevId, opts, []]]]\n }];\n nRevNum = revInfo.prefix + 1;\n } else {\n doc._rev_tree = [{\n pos: 1,\n ids : [newRevId, opts, []]\n }];\n nRevNum = 1;\n }\n } else {\n if (doc._revisions) {\n doc._rev_tree = makeRevTreeFromRevisions(doc._revisions, opts);\n nRevNum = doc._revisions.start;\n newRevId = doc._revisions.ids[0];\n }\n if (!doc._rev_tree) {\n revInfo = parseRevisionInfo(doc._rev);\n if (revInfo.error) {\n return revInfo;\n }\n nRevNum = revInfo.prefix;\n newRevId = revInfo.id;\n doc._rev_tree = [{\n pos: nRevNum,\n ids: [newRevId, opts, []]\n }];\n }\n }\n\n invalidIdError(doc._id);\n\n doc._rev = nRevNum + '-' + newRevId;\n\n var result = {metadata : {}, data : {}};\n for (var key in doc) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(doc, key)) {\n var specialKey = key[0] === '_';\n if (specialKey && !reservedWords[key]) {\n var error = createError(DOC_VALIDATION, key);\n error.message = DOC_VALIDATION.message + ': ' + key;\n throw error;\n } else if (specialKey && !dataWords[key]) {\n result.metadata[key.slice(1)] = doc[key];\n } else {\n result.data[key] = doc[key];\n }\n }\n }\n return result;\n}\n\nfunction parseBase64(data) {\n try {\n return thisAtob(data);\n } catch (e) {\n var err = createError(BAD_ARG,\n 'Attachment is not a valid base64 string');\n return {error: err};\n }\n}\n\nfunction preprocessString(att, blobType, callback) {\n var asBinary = parseBase64(att.data);\n if (asBinary.error) {\n return callback(asBinary.error);\n }\n\n att.length = asBinary.length;\n if (blobType === 'blob') {\n att.data = binStringToBluffer(asBinary, att.content_type);\n } else if (blobType === 'base64') {\n att.data = thisBtoa(asBinary);\n } else { // binary\n att.data = asBinary;\n }\n binaryMd5(asBinary, function (result) {\n att.digest = 'md5-' + result;\n callback();\n });\n}\n\nfunction preprocessBlob(att, blobType, callback) {\n binaryMd5(att.data, function (md5) {\n att.digest = 'md5-' + md5;\n // size is for blobs (browser), length is for buffers (node)\n att.length = att.data.size || att.data.length || 0;\n if (blobType === 'binary') {\n blobToBinaryString(att.data, function (binString) {\n att.data = binString;\n callback();\n });\n } else if (blobType === 'base64') {\n blobToBase64(att.data, function (b64) {\n att.data = b64;\n callback();\n });\n } else {\n callback();\n }\n });\n}\n\nfunction preprocessAttachment(att, blobType, callback) {\n if (att.stub) {\n return callback();\n }\n if (typeof att.data === 'string') { // input is a base64 string\n preprocessString(att, blobType, callback);\n } else { // input is a blob\n preprocessBlob(att, blobType, callback);\n }\n}\n\nfunction preprocessAttachments(docInfos, blobType, callback) {\n\n if (!docInfos.length) {\n return callback();\n }\n\n var docv = 0;\n var overallErr;\n\n docInfos.forEach(function (docInfo) {\n var attachments = docInfo.data && docInfo.data._attachments ?\n Object.keys(docInfo.data._attachments) : [];\n var recv = 0;\n\n if (!attachments.length) {\n return done();\n }\n\n function processedAttachment(err) {\n overallErr = err;\n recv++;\n if (recv === attachments.length) {\n done();\n }\n }\n\n for (var key in docInfo.data._attachments) {\n if (Object.prototype.hasOwnProperty.call(docInfo.data._attachments, key)) {\n preprocessAttachment(docInfo.data._attachments[key],\n blobType, processedAttachment);\n }\n }\n });\n\n function done() {\n docv++;\n if (docInfos.length === docv) {\n if (overallErr) {\n callback(overallErr);\n } else {\n callback();\n }\n }\n }\n}\n\nfunction updateDoc(revLimit, prev, docInfo, results,\n i, cb, writeDoc, newEdits) {\n\n if (revExists(prev.rev_tree, docInfo.metadata.rev) && !newEdits) {\n results[i] = docInfo;\n return cb();\n }\n\n // sometimes this is pre-calculated. historically not always\n var previousWinningRev = prev.winningRev || winningRev(prev);\n var previouslyDeleted = 'deleted' in prev ? prev.deleted :\n isDeleted(prev, previousWinningRev);\n var deleted = 'deleted' in docInfo.metadata ? docInfo.metadata.deleted :\n isDeleted(docInfo.metadata);\n var isRoot = /^1-/.test(docInfo.metadata.rev);\n\n if (previouslyDeleted && !deleted && newEdits && isRoot) {\n var newDoc = docInfo.data;\n newDoc._rev = previousWinningRev;\n newDoc._id = docInfo.metadata.id;\n docInfo = parseDoc(newDoc, newEdits);\n }\n\n var merged = merge(prev.rev_tree, docInfo.metadata.rev_tree[0], revLimit);\n\n var inConflict = newEdits && ((\n (previouslyDeleted && deleted && merged.conflicts !== 'new_leaf') ||\n (!previouslyDeleted && merged.conflicts !== 'new_leaf') ||\n (previouslyDeleted && !deleted && merged.conflicts === 'new_branch')));\n\n if (inConflict) {\n var err = createError(REV_CONFLICT);\n results[i] = err;\n return cb();\n }\n\n var newRev = docInfo.metadata.rev;\n docInfo.metadata.rev_tree = merged.tree;\n docInfo.stemmedRevs = merged.stemmedRevs || [];\n /* istanbul ignore else */\n if (prev.rev_map) {\n docInfo.metadata.rev_map = prev.rev_map; // used only by leveldb\n }\n\n // recalculate\n var winningRev$$1 = winningRev(docInfo.metadata);\n var winningRevIsDeleted = isDeleted(docInfo.metadata, winningRev$$1);\n\n // calculate the total number of documents that were added/removed,\n // from the perspective of total_rows/doc_count\n var delta = (previouslyDeleted === winningRevIsDeleted) ? 0 :\n previouslyDeleted < winningRevIsDeleted ? -1 : 1;\n\n var newRevIsDeleted;\n if (newRev === winningRev$$1) {\n // if the new rev is the same as the winning rev, we can reuse that value\n newRevIsDeleted = winningRevIsDeleted;\n } else {\n // if they're not the same, then we need to recalculate\n newRevIsDeleted = isDeleted(docInfo.metadata, newRev);\n }\n\n writeDoc(docInfo, winningRev$$1, winningRevIsDeleted, newRevIsDeleted,\n true, delta, i, cb);\n}\n\nfunction rootIsMissing(docInfo) {\n return docInfo.metadata.rev_tree[0].ids[1].status === 'missing';\n}\n\nfunction processDocs(revLimit, docInfos, api, fetchedDocs, tx, results,\n writeDoc, opts, overallCallback) {\n\n // Default to 1000 locally\n revLimit = revLimit || 1000;\n\n function insertDoc(docInfo, resultsIdx, callback) {\n // Cant insert new deleted documents\n var winningRev$$1 = winningRev(docInfo.metadata);\n var deleted = isDeleted(docInfo.metadata, winningRev$$1);\n if ('was_delete' in opts && deleted) {\n results[resultsIdx] = createError(MISSING_DOC, 'deleted');\n return callback();\n }\n\n // 4712 - detect whether a new document was inserted with a _rev\n var inConflict = newEdits && rootIsMissing(docInfo);\n\n if (inConflict) {\n var err = createError(REV_CONFLICT);\n results[resultsIdx] = err;\n return callback();\n }\n\n var delta = deleted ? 0 : 1;\n\n writeDoc(docInfo, winningRev$$1, deleted, deleted, false,\n delta, resultsIdx, callback);\n }\n\n var newEdits = opts.new_edits;\n var idsToDocs = new Map();\n\n var docsDone = 0;\n var docsToDo = docInfos.length;\n\n function checkAllDocsDone() {\n if (++docsDone === docsToDo && overallCallback) {\n overallCallback();\n }\n }\n\n docInfos.forEach(function (currentDoc, resultsIdx) {\n\n if (currentDoc._id && isLocalId(currentDoc._id)) {\n var fun = currentDoc._deleted ? '_removeLocal' : '_putLocal';\n api[fun](currentDoc, {ctx: tx}, function (err, res) {\n results[resultsIdx] = err || res;\n checkAllDocsDone();\n });\n return;\n }\n\n var id = currentDoc.metadata.id;\n if (idsToDocs.has(id)) {\n docsToDo--; // duplicate\n idsToDocs.get(id).push([currentDoc, resultsIdx]);\n } else {\n idsToDocs.set(id, [[currentDoc, resultsIdx]]);\n }\n });\n\n // in the case of new_edits, the user can provide multiple docs\n // with the same id. these need to be processed sequentially\n idsToDocs.forEach(function (docs, id) {\n var numDone = 0;\n\n function docWritten() {\n if (++numDone < docs.length) {\n nextDoc();\n } else {\n checkAllDocsDone();\n }\n }\n function nextDoc() {\n var value = docs[numDone];\n var currentDoc = value[0];\n var resultsIdx = value[1];\n\n if (fetchedDocs.has(id)) {\n updateDoc(revLimit, fetchedDocs.get(id), currentDoc, results,\n resultsIdx, docWritten, writeDoc, newEdits);\n } else {\n // Ensure stemming applies to new writes as well\n var merged = merge([], currentDoc.metadata.rev_tree[0], revLimit);\n currentDoc.metadata.rev_tree = merged.tree;\n currentDoc.stemmedRevs = merged.stemmedRevs || [];\n insertDoc(currentDoc, resultsIdx, docWritten);\n }\n }\n nextDoc();\n });\n}\n\n// IndexedDB requires a versioned database structure, so we use the\n// version here to manage migrations.\nvar ADAPTER_VERSION = 5;\n\n// The object stores created for each database\n// DOC_STORE stores the document meta data, its revision history and state\n// Keyed by document id\nvar DOC_STORE = 'document-store';\n// BY_SEQ_STORE stores a particular version of a document, keyed by its\n// sequence id\nvar BY_SEQ_STORE = 'by-sequence';\n// Where we store attachments\nvar ATTACH_STORE = 'attach-store';\n// Where we store many-to-many relations\n// between attachment digests and seqs\nvar ATTACH_AND_SEQ_STORE = 'attach-seq-store';\n\n// Where we store database-wide meta data in a single record\n// keyed by id: META_STORE\nvar META_STORE = 'meta-store';\n// Where we store local documents\nvar LOCAL_STORE = 'local-store';\n// Where we detect blob support\nvar DETECT_BLOB_SUPPORT_STORE = 'detect-blob-support';\n\nfunction safeJsonParse(str) {\n // This try/catch guards against stack overflow errors.\n // JSON.parse() is faster than vuvuzela.parse() but vuvuzela\n // cannot overflow.\n try {\n return JSON.parse(str);\n } catch (e) {\n /* istanbul ignore next */\n return vuvuzela.parse(str);\n }\n}\n\nfunction safeJsonStringify(json) {\n try {\n return JSON.stringify(json);\n } catch (e) {\n /* istanbul ignore next */\n return vuvuzela.stringify(json);\n }\n}\n\nfunction idbError(callback) {\n return function (evt) {\n var message = 'unknown_error';\n if (evt.target && evt.target.error) {\n message = evt.target.error.name || evt.target.error.message;\n }\n callback(createError(IDB_ERROR, message, evt.type));\n };\n}\n\n// Unfortunately, the metadata has to be stringified\n// when it is put into the database, because otherwise\n// IndexedDB can throw errors for deeply-nested objects.\n// Originally we just used JSON.parse/JSON.stringify; now\n// we use this custom vuvuzela library that avoids recursion.\n// If we could do it all over again, we'd probably use a\n// format for the revision trees other than JSON.\nfunction encodeMetadata(metadata, winningRev, deleted) {\n return {\n data: safeJsonStringify(metadata),\n winningRev,\n deletedOrLocal: deleted ? '1' : '0',\n seq: metadata.seq, // highest seq for this doc\n id: metadata.id\n };\n}\n\nfunction decodeMetadata(storedObject) {\n if (!storedObject) {\n return null;\n }\n var metadata = safeJsonParse(storedObject.data);\n metadata.winningRev = storedObject.winningRev;\n metadata.deleted = storedObject.deletedOrLocal === '1';\n metadata.seq = storedObject.seq;\n return metadata;\n}\n\n// read the doc back out from the database. we don't store the\n// _id or _rev because we already have _doc_id_rev.\nfunction decodeDoc(doc) {\n if (!doc) {\n return doc;\n }\n var idx = doc._doc_id_rev.lastIndexOf(':');\n doc._id = doc._doc_id_rev.substring(0, idx - 1);\n doc._rev = doc._doc_id_rev.substring(idx + 1);\n delete doc._doc_id_rev;\n return doc;\n}\n\n// Read a blob from the database, encoding as necessary\n// and translating from base64 if the IDB doesn't support\n// native Blobs\nfunction readBlobData(body, type, asBlob, callback) {\n if (asBlob) {\n if (!body) {\n callback(createBlob([''], {type}));\n } else if (typeof body !== 'string') { // we have blob support\n callback(body);\n } else { // no blob support\n callback(b64ToBluffer(body, type));\n }\n } else { // as base64 string\n if (!body) {\n callback('');\n } else if (typeof body !== 'string') { // we have blob support\n readAsBinaryString(body, function (binary) {\n callback(thisBtoa(binary));\n });\n } else { // no blob support\n callback(body);\n }\n }\n}\n\nfunction fetchAttachmentsIfNecessary(doc, opts, txn, cb) {\n var attachments = Object.keys(doc._attachments || {});\n if (!attachments.length) {\n return cb && cb();\n }\n var numDone = 0;\n\n function checkDone() {\n if (++numDone === attachments.length && cb) {\n cb();\n }\n }\n\n function fetchAttachment(doc, att) {\n var attObj = doc._attachments[att];\n var digest = attObj.digest;\n var req = txn.objectStore(ATTACH_STORE).get(digest);\n req.onsuccess = function (e) {\n attObj.body = e.target.result.body;\n checkDone();\n };\n }\n\n attachments.forEach(function (att) {\n if (opts.attachments && opts.include_docs) {\n fetchAttachment(doc, att);\n } else {\n doc._attachments[att].stub = true;\n checkDone();\n }\n });\n}\n\n// IDB-specific postprocessing necessary because\n// we don't know whether we stored a true Blob or\n// a base64-encoded string, and if it's a Blob it\n// needs to be read outside of the transaction context\nfunction postProcessAttachments(results, asBlob) {\n return Promise.all(results.map(function (row) {\n if (row.doc && row.doc._attachments) {\n var attNames = Object.keys(row.doc._attachments);\n return Promise.all(attNames.map(function (att) {\n var attObj = row.doc._attachments[att];\n if (!('body' in attObj)) { // already processed\n return;\n }\n var body = attObj.body;\n var type = attObj.content_type;\n return new Promise(function (resolve) {\n readBlobData(body, type, asBlob, function (data) {\n row.doc._attachments[att] = Object.assign(\n pick(attObj, ['digest', 'content_type']),\n {data}\n );\n resolve();\n });\n });\n }));\n }\n }));\n}\n\nfunction compactRevs(revs, docId, txn) {\n\n var possiblyOrphanedDigests = [];\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n var attStore = txn.objectStore(ATTACH_STORE);\n var attAndSeqStore = txn.objectStore(ATTACH_AND_SEQ_STORE);\n var count = revs.length;\n\n function checkDone() {\n count--;\n if (!count) { // done processing all revs\n deleteOrphanedAttachments();\n }\n }\n\n function deleteOrphanedAttachments() {\n if (!possiblyOrphanedDigests.length) {\n return;\n }\n possiblyOrphanedDigests.forEach(function (digest) {\n var countReq = attAndSeqStore.index('digestSeq').count(\n IDBKeyRange.bound(\n digest + '::', digest + '::\\uffff', false, false));\n countReq.onsuccess = function (e) {\n var count = e.target.result;\n if (!count) {\n // orphaned\n attStore.delete(digest);\n }\n };\n });\n }\n\n revs.forEach(function (rev$$1) {\n var index = seqStore.index('_doc_id_rev');\n var key = docId + \"::\" + rev$$1;\n index.getKey(key).onsuccess = function (e) {\n var seq = e.target.result;\n if (typeof seq !== 'number') {\n return checkDone();\n }\n seqStore.delete(seq);\n\n var cursor = attAndSeqStore.index('seq')\n .openCursor(IDBKeyRange.only(seq));\n\n cursor.onsuccess = function (event) {\n var cursor = event.target.result;\n if (cursor) {\n var digest = cursor.value.digestSeq.split('::')[0];\n possiblyOrphanedDigests.push(digest);\n attAndSeqStore.delete(cursor.primaryKey);\n cursor.continue();\n } else { // done\n checkDone();\n }\n };\n };\n });\n}\n\nfunction openTransactionSafely(idb, stores, mode) {\n try {\n return {\n txn: idb.transaction(stores, mode)\n };\n } catch (err) {\n return {\n error: err\n };\n }\n}\n\nvar changesHandler = new Changes();\n\nfunction idbBulkDocs(dbOpts, req, opts, api, idb, callback) {\n var docInfos = req.docs;\n var txn;\n var docStore;\n var bySeqStore;\n var attachStore;\n var attachAndSeqStore;\n var metaStore;\n var docInfoError;\n var metaDoc;\n\n for (var i = 0, len = docInfos.length; i < len; i++) {\n var doc = docInfos[i];\n if (doc._id && isLocalId(doc._id)) {\n continue;\n }\n doc = docInfos[i] = parseDoc(doc, opts.new_edits, dbOpts);\n if (doc.error && !docInfoError) {\n docInfoError = doc;\n }\n }\n\n if (docInfoError) {\n return callback(docInfoError);\n }\n\n var allDocsProcessed = false;\n var docCountDelta = 0;\n var results = new Array(docInfos.length);\n var fetchedDocs = new Map();\n var preconditionErrored = false;\n var blobType = api._meta.blobSupport ? 'blob' : 'base64';\n\n preprocessAttachments(docInfos, blobType, function (err) {\n if (err) {\n return callback(err);\n }\n startTransaction();\n });\n\n function startTransaction() {\n\n var stores = [\n DOC_STORE, BY_SEQ_STORE,\n ATTACH_STORE,\n LOCAL_STORE, ATTACH_AND_SEQ_STORE,\n META_STORE\n ];\n var txnResult = openTransactionSafely(idb, stores, 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n txn = txnResult.txn;\n txn.onabort = idbError(callback);\n txn.ontimeout = idbError(callback);\n txn.oncomplete = complete;\n docStore = txn.objectStore(DOC_STORE);\n bySeqStore = txn.objectStore(BY_SEQ_STORE);\n attachStore = txn.objectStore(ATTACH_STORE);\n attachAndSeqStore = txn.objectStore(ATTACH_AND_SEQ_STORE);\n metaStore = txn.objectStore(META_STORE);\n\n metaStore.get(META_STORE).onsuccess = function (e) {\n metaDoc = e.target.result;\n updateDocCountIfReady();\n };\n\n verifyAttachments(function (err) {\n if (err) {\n preconditionErrored = true;\n return callback(err);\n }\n fetchExistingDocs();\n });\n }\n\n function onAllDocsProcessed() {\n allDocsProcessed = true;\n updateDocCountIfReady();\n }\n\n function idbProcessDocs() {\n processDocs(dbOpts.revs_limit, docInfos, api, fetchedDocs,\n txn, results, writeDoc, opts, onAllDocsProcessed);\n }\n\n function updateDocCountIfReady() {\n if (!metaDoc || !allDocsProcessed) {\n return;\n }\n // caching the docCount saves a lot of time in allDocs() and\n // info(), which is why we go to all the trouble of doing this\n metaDoc.docCount += docCountDelta;\n metaStore.put(metaDoc);\n }\n\n function fetchExistingDocs() {\n\n if (!docInfos.length) {\n return;\n }\n\n var numFetched = 0;\n\n function checkDone() {\n if (++numFetched === docInfos.length) {\n idbProcessDocs();\n }\n }\n\n function readMetadata(event) {\n var metadata = decodeMetadata(event.target.result);\n\n if (metadata) {\n fetchedDocs.set(metadata.id, metadata);\n }\n checkDone();\n }\n\n for (var i = 0, len = docInfos.length; i < len; i++) {\n var docInfo = docInfos[i];\n if (docInfo._id && isLocalId(docInfo._id)) {\n checkDone(); // skip local docs\n continue;\n }\n var req = docStore.get(docInfo.metadata.id);\n req.onsuccess = readMetadata;\n }\n }\n\n function complete() {\n if (preconditionErrored) {\n return;\n }\n\n changesHandler.notify(api._meta.name);\n callback(null, results);\n }\n\n function verifyAttachment(digest, callback) {\n\n var req = attachStore.get(digest);\n req.onsuccess = function (e) {\n if (!e.target.result) {\n var err = createError(MISSING_STUB,\n 'unknown stub attachment with digest ' +\n digest);\n err.status = 412;\n callback(err);\n } else {\n callback();\n }\n };\n }\n\n function verifyAttachments(finish) {\n\n\n var digests = [];\n docInfos.forEach(function (docInfo) {\n if (docInfo.data && docInfo.data._attachments) {\n Object.keys(docInfo.data._attachments).forEach(function (filename) {\n var att = docInfo.data._attachments[filename];\n if (att.stub) {\n digests.push(att.digest);\n }\n });\n }\n });\n if (!digests.length) {\n return finish();\n }\n var numDone = 0;\n var err;\n\n function checkDone() {\n if (++numDone === digests.length) {\n finish(err);\n }\n }\n digests.forEach(function (digest) {\n verifyAttachment(digest, function (attErr) {\n if (attErr && !err) {\n err = attErr;\n }\n checkDone();\n });\n });\n }\n\n function writeDoc(docInfo, winningRev$$1, winningRevIsDeleted, newRevIsDeleted,\n isUpdate, delta, resultsIdx, callback) {\n\n docInfo.metadata.winningRev = winningRev$$1;\n docInfo.metadata.deleted = winningRevIsDeleted;\n\n var doc = docInfo.data;\n doc._id = docInfo.metadata.id;\n doc._rev = docInfo.metadata.rev;\n\n if (newRevIsDeleted) {\n doc._deleted = true;\n }\n\n var hasAttachments = doc._attachments &&\n Object.keys(doc._attachments).length;\n if (hasAttachments) {\n return writeAttachments(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback);\n }\n\n docCountDelta += delta;\n updateDocCountIfReady();\n\n finishDoc(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback);\n }\n\n function finishDoc(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback) {\n\n var doc = docInfo.data;\n var metadata = docInfo.metadata;\n\n doc._doc_id_rev = metadata.id + '::' + metadata.rev;\n delete doc._id;\n delete doc._rev;\n\n function afterPutDoc(e) {\n var revsToDelete = docInfo.stemmedRevs || [];\n\n if (isUpdate && api.auto_compaction) {\n revsToDelete = revsToDelete.concat(compactTree(docInfo.metadata));\n }\n\n if (revsToDelete && revsToDelete.length) {\n compactRevs(revsToDelete, docInfo.metadata.id, txn);\n }\n\n metadata.seq = e.target.result;\n // Current _rev is calculated from _rev_tree on read\n // delete metadata.rev;\n var metadataToStore = encodeMetadata(metadata, winningRev$$1,\n winningRevIsDeleted);\n var metaDataReq = docStore.put(metadataToStore);\n metaDataReq.onsuccess = afterPutMetadata;\n }\n\n function afterPutDocError(e) {\n // ConstraintError, need to update, not put (see #1638 for details)\n e.preventDefault(); // avoid transaction abort\n e.stopPropagation(); // avoid transaction onerror\n var index = bySeqStore.index('_doc_id_rev');\n var getKeyReq = index.getKey(doc._doc_id_rev);\n getKeyReq.onsuccess = function (e) {\n var putReq = bySeqStore.put(doc, e.target.result);\n putReq.onsuccess = afterPutDoc;\n };\n }\n\n function afterPutMetadata() {\n results[resultsIdx] = {\n ok: true,\n id: metadata.id,\n rev: metadata.rev\n };\n fetchedDocs.set(docInfo.metadata.id, docInfo.metadata);\n insertAttachmentMappings(docInfo, metadata.seq, callback);\n }\n\n var putReq = bySeqStore.put(doc);\n\n putReq.onsuccess = afterPutDoc;\n putReq.onerror = afterPutDocError;\n }\n\n function writeAttachments(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback) {\n\n\n var doc = docInfo.data;\n\n var numDone = 0;\n var attachments = Object.keys(doc._attachments);\n\n function collectResults() {\n if (numDone === attachments.length) {\n finishDoc(docInfo, winningRev$$1, winningRevIsDeleted,\n isUpdate, resultsIdx, callback);\n }\n }\n\n function attachmentSaved() {\n numDone++;\n collectResults();\n }\n\n attachments.forEach(function (key) {\n var att = docInfo.data._attachments[key];\n if (!att.stub) {\n var data = att.data;\n delete att.data;\n att.revpos = parseInt(winningRev$$1, 10);\n var digest = att.digest;\n saveAttachment(digest, data, attachmentSaved);\n } else {\n numDone++;\n collectResults();\n }\n });\n }\n\n // map seqs to attachment digests, which\n // we will need later during compaction\n function insertAttachmentMappings(docInfo, seq, callback) {\n\n var attsAdded = 0;\n var attsToAdd = Object.keys(docInfo.data._attachments || {});\n\n if (!attsToAdd.length) {\n return callback();\n }\n\n function checkDone() {\n if (++attsAdded === attsToAdd.length) {\n callback();\n }\n }\n\n function add(att) {\n var digest = docInfo.data._attachments[att].digest;\n var req = attachAndSeqStore.put({\n seq,\n digestSeq: digest + '::' + seq\n });\n\n req.onsuccess = checkDone;\n req.onerror = function (e) {\n // this callback is for a constaint error, which we ignore\n // because this docid/rev has already been associated with\n // the digest (e.g. when new_edits == false)\n e.preventDefault(); // avoid transaction abort\n e.stopPropagation(); // avoid transaction onerror\n checkDone();\n };\n }\n for (var i = 0; i < attsToAdd.length; i++) {\n add(attsToAdd[i]); // do in parallel\n }\n }\n\n function saveAttachment(digest, data, callback) {\n\n\n var getKeyReq = attachStore.count(digest);\n getKeyReq.onsuccess = function (e) {\n var count = e.target.result;\n if (count) {\n return callback(); // already exists\n }\n var newAtt = {\n digest,\n body: data\n };\n var putReq = attachStore.put(newAtt);\n putReq.onsuccess = callback;\n };\n }\n}\n\n// Abstraction over IDBCursor and getAll()/getAllKeys() that allows us to batch our operations\n// while falling back to a normal IDBCursor operation on browsers that don't support getAll() or\n// getAllKeys(). This allows for a much faster implementation than just straight-up cursors, because\n// we're not processing each document one-at-a-time.\nfunction runBatchedCursor(objectStore, keyRange, descending, batchSize, onBatch) {\n\n if (batchSize === -1) {\n batchSize = 1000;\n }\n\n // Bail out of getAll()/getAllKeys() in the following cases:\n // 1) either method is unsupported - we need both\n // 2) batchSize is 1 (might as well use IDBCursor)\n // 3) descending – no real way to do this via getAll()/getAllKeys()\n\n var useGetAll = typeof objectStore.getAll === 'function' &&\n typeof objectStore.getAllKeys === 'function' &&\n batchSize > 1 && !descending;\n\n var keysBatch;\n var valuesBatch;\n var pseudoCursor;\n\n function onGetAll(e) {\n valuesBatch = e.target.result;\n if (keysBatch) {\n onBatch(keysBatch, valuesBatch, pseudoCursor);\n }\n }\n\n function onGetAllKeys(e) {\n keysBatch = e.target.result;\n if (valuesBatch) {\n onBatch(keysBatch, valuesBatch, pseudoCursor);\n }\n }\n\n function continuePseudoCursor() {\n if (!keysBatch.length) { // no more results\n return onBatch();\n }\n // fetch next batch, exclusive start\n var lastKey = keysBatch[keysBatch.length - 1];\n var newKeyRange;\n if (keyRange && keyRange.upper) {\n try {\n newKeyRange = IDBKeyRange.bound(lastKey, keyRange.upper,\n true, keyRange.upperOpen);\n } catch (e) {\n if (e.name === \"DataError\" && e.code === 0) {\n return onBatch(); // we're done, startkey and endkey are equal\n }\n }\n } else {\n newKeyRange = IDBKeyRange.lowerBound(lastKey, true);\n }\n keyRange = newKeyRange;\n keysBatch = null;\n valuesBatch = null;\n objectStore.getAll(keyRange, batchSize).onsuccess = onGetAll;\n objectStore.getAllKeys(keyRange, batchSize).onsuccess = onGetAllKeys;\n }\n\n function onCursor(e) {\n var cursor = e.target.result;\n if (!cursor) { // done\n return onBatch();\n }\n // regular IDBCursor acts like a batch where batch size is always 1\n onBatch([cursor.key], [cursor.value], cursor);\n }\n\n if (useGetAll) {\n pseudoCursor = {\"continue\": continuePseudoCursor};\n objectStore.getAll(keyRange, batchSize).onsuccess = onGetAll;\n objectStore.getAllKeys(keyRange, batchSize).onsuccess = onGetAllKeys;\n } else if (descending) {\n objectStore.openCursor(keyRange, 'prev').onsuccess = onCursor;\n } else {\n objectStore.openCursor(keyRange).onsuccess = onCursor;\n }\n}\n\n// simple shim for objectStore.getAll(), falling back to IDBCursor\nfunction getAll(objectStore, keyRange, onSuccess) {\n if (typeof objectStore.getAll === 'function') {\n // use native getAll\n objectStore.getAll(keyRange).onsuccess = onSuccess;\n return;\n }\n // fall back to cursors\n var values = [];\n\n function onCursor(e) {\n var cursor = e.target.result;\n if (cursor) {\n values.push(cursor.value);\n cursor.continue();\n } else {\n onSuccess({\n target: {\n result: values\n }\n });\n }\n }\n\n objectStore.openCursor(keyRange).onsuccess = onCursor;\n}\n\nfunction allDocsKeys(keys, docStore, onBatch) {\n // It's not guaranteed to be returned in right order\n var valuesBatch = new Array(keys.length);\n var count = 0;\n keys.forEach(function (key, index) {\n docStore.get(key).onsuccess = function (event) {\n if (event.target.result) {\n valuesBatch[index] = event.target.result;\n } else {\n valuesBatch[index] = {key, error: 'not_found'};\n }\n count++;\n if (count === keys.length) {\n onBatch(keys, valuesBatch, {});\n }\n };\n });\n}\n\nfunction createKeyRange(start, end, inclusiveEnd, key, descending) {\n try {\n if (start && end) {\n if (descending) {\n return IDBKeyRange.bound(end, start, !inclusiveEnd, false);\n } else {\n return IDBKeyRange.bound(start, end, false, !inclusiveEnd);\n }\n } else if (start) {\n if (descending) {\n return IDBKeyRange.upperBound(start);\n } else {\n return IDBKeyRange.lowerBound(start);\n }\n } else if (end) {\n if (descending) {\n return IDBKeyRange.lowerBound(end, !inclusiveEnd);\n } else {\n return IDBKeyRange.upperBound(end, !inclusiveEnd);\n }\n } else if (key) {\n return IDBKeyRange.only(key);\n }\n } catch (e) {\n return {error: e};\n }\n return null;\n}\n\nfunction idbAllDocs(opts, idb, callback) {\n var start = 'startkey' in opts ? opts.startkey : false;\n var end = 'endkey' in opts ? opts.endkey : false;\n var key = 'key' in opts ? opts.key : false;\n var keys = 'keys' in opts ? opts.keys : false;\n var skip = opts.skip || 0;\n var limit = typeof opts.limit === 'number' ? opts.limit : -1;\n var inclusiveEnd = opts.inclusive_end !== false;\n\n var keyRange ;\n var keyRangeError;\n if (!keys) {\n keyRange = createKeyRange(start, end, inclusiveEnd, key, opts.descending);\n keyRangeError = keyRange && keyRange.error;\n if (keyRangeError &&\n !(keyRangeError.name === \"DataError\" && keyRangeError.code === 0)) {\n // DataError with error code 0 indicates start is less than end, so\n // can just do an empty query. Else need to throw\n return callback(createError(IDB_ERROR,\n keyRangeError.name, keyRangeError.message));\n }\n }\n\n var stores = [DOC_STORE, BY_SEQ_STORE, META_STORE];\n\n if (opts.attachments) {\n stores.push(ATTACH_STORE);\n }\n var txnResult = openTransactionSafely(idb, stores, 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n txn.oncomplete = onTxnComplete;\n txn.onabort = idbError(callback);\n var docStore = txn.objectStore(DOC_STORE);\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n var metaStore = txn.objectStore(META_STORE);\n var docIdRevIndex = seqStore.index('_doc_id_rev');\n var results = [];\n var docCount;\n var updateSeq;\n\n metaStore.get(META_STORE).onsuccess = function (e) {\n docCount = e.target.result.docCount;\n };\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n // get max updateSeq\n seqStore.openKeyCursor(null, 'prev').onsuccess = e => {\n var cursor = e.target.result;\n if (cursor && cursor.key) {\n updateSeq = cursor.key;\n }\n };\n }\n\n // if the user specifies include_docs=true, then we don't\n // want to block the main cursor while we're fetching the doc\n function fetchDocAsynchronously(metadata, row, winningRev$$1) {\n var key = metadata.id + \"::\" + winningRev$$1;\n docIdRevIndex.get(key).onsuccess = function onGetDoc(e) {\n row.doc = decodeDoc(e.target.result) || {};\n if (opts.conflicts) {\n var conflicts = collectConflicts(metadata);\n if (conflicts.length) {\n row.doc._conflicts = conflicts;\n }\n }\n fetchAttachmentsIfNecessary(row.doc, opts, txn);\n };\n }\n\n function allDocsInner(winningRev$$1, metadata) {\n var row = {\n id: metadata.id,\n key: metadata.id,\n value: {\n rev: winningRev$$1\n }\n };\n var deleted = metadata.deleted;\n if (deleted) {\n if (keys) {\n results.push(row);\n // deleted docs are okay with \"keys\" requests\n row.value.deleted = true;\n row.doc = null;\n }\n } else if (skip-- <= 0) {\n results.push(row);\n if (opts.include_docs) {\n fetchDocAsynchronously(metadata, row, winningRev$$1);\n }\n }\n }\n\n function processBatch(batchValues) {\n for (var i = 0, len = batchValues.length; i < len; i++) {\n if (results.length === limit) {\n break;\n }\n var batchValue = batchValues[i];\n if (batchValue.error && keys) {\n // key was not found with \"keys\" requests\n results.push(batchValue);\n continue;\n }\n var metadata = decodeMetadata(batchValue);\n var winningRev$$1 = metadata.winningRev;\n allDocsInner(winningRev$$1, metadata);\n }\n }\n\n function onBatch(batchKeys, batchValues, cursor) {\n if (!cursor) {\n return;\n }\n processBatch(batchValues);\n if (results.length < limit) {\n cursor.continue();\n }\n }\n\n function onGetAll(e) {\n var values = e.target.result;\n if (opts.descending) {\n values = values.reverse();\n }\n processBatch(values);\n }\n\n function onResultsReady() {\n var returnVal = {\n total_rows: docCount,\n offset: opts.skip,\n rows: results\n };\n\n /* istanbul ignore if */\n if (opts.update_seq && updateSeq !== undefined) {\n returnVal.update_seq = updateSeq;\n }\n callback(null, returnVal);\n }\n\n function onTxnComplete() {\n if (opts.attachments) {\n postProcessAttachments(results, opts.binary).then(onResultsReady);\n } else {\n onResultsReady();\n }\n }\n\n // don't bother doing any requests if start > end or limit === 0\n if (keyRangeError || limit === 0) {\n return;\n }\n if (keys) {\n return allDocsKeys(keys, docStore, onBatch);\n }\n if (limit === -1) { // just fetch everything\n return getAll(docStore, keyRange, onGetAll);\n }\n // else do a cursor\n // choose a batch size based on the skip, since we'll need to skip that many\n runBatchedCursor(docStore, keyRange, opts.descending, limit + skip, onBatch);\n}\n\nfunction countDocs(txn, cb) {\n var index = txn.objectStore(DOC_STORE).index('deletedOrLocal');\n index.count(IDBKeyRange.only('0')).onsuccess = function (e) {\n cb(e.target.result);\n };\n}\n\n// This task queue ensures that IDB open calls are done in their own tick\n\nvar running = false;\nvar queue = [];\n\nfunction tryCode(fun, err, res, PouchDB) {\n try {\n fun(err, res);\n } catch (err) {\n // Shouldn't happen, but in some odd cases\n // IndexedDB implementations might throw a sync\n // error, in which case this will at least log it.\n PouchDB.emit('error', err);\n }\n}\n\nfunction applyNext() {\n if (running || !queue.length) {\n return;\n }\n running = true;\n queue.shift()();\n}\n\nfunction enqueueTask(action, callback, PouchDB) {\n queue.push(function runAction() {\n action(function runCallback(err, res) {\n tryCode(callback, err, res, PouchDB);\n running = false;\n nextTick(function runNext() {\n applyNext(PouchDB);\n });\n });\n });\n applyNext();\n}\n\nfunction changes(opts, api, dbName, idb) {\n opts = clone(opts);\n\n if (opts.continuous) {\n var id = dbName + ':' + uuid();\n changesHandler.addListener(dbName, id, api, opts);\n changesHandler.notify(dbName);\n return {\n cancel: function () {\n changesHandler.removeListener(dbName, id);\n }\n };\n }\n\n var docIds = opts.doc_ids && new Set(opts.doc_ids);\n\n opts.since = opts.since || 0;\n var lastSeq = opts.since;\n\n var limit = 'limit' in opts ? opts.limit : -1;\n if (limit === 0) {\n limit = 1; // per CouchDB _changes spec\n }\n\n var results = [];\n var numResults = 0;\n var filter = filterChange(opts);\n var docIdsToMetadata = new Map();\n\n var txn;\n var bySeqStore;\n var docStore;\n var docIdRevIndex;\n\n function onBatch(batchKeys, batchValues, cursor) {\n if (!cursor || !batchKeys.length) { // done\n return;\n }\n\n var winningDocs = new Array(batchKeys.length);\n var metadatas = new Array(batchKeys.length);\n\n function processMetadataAndWinningDoc(metadata, winningDoc) {\n var change = opts.processChange(winningDoc, metadata, opts);\n lastSeq = change.seq = metadata.seq;\n\n var filtered = filter(change);\n if (typeof filtered === 'object') { // anything but true/false indicates error\n return Promise.reject(filtered);\n }\n\n if (!filtered) {\n return Promise.resolve();\n }\n numResults++;\n if (opts.return_docs) {\n results.push(change);\n }\n // process the attachment immediately\n // for the benefit of live listeners\n if (opts.attachments && opts.include_docs) {\n return new Promise(function (resolve) {\n fetchAttachmentsIfNecessary(winningDoc, opts, txn, function () {\n postProcessAttachments([change], opts.binary).then(function () {\n resolve(change);\n });\n });\n });\n } else {\n return Promise.resolve(change);\n }\n }\n\n function onBatchDone() {\n var promises = [];\n for (var i = 0, len = winningDocs.length; i < len; i++) {\n if (numResults === limit) {\n break;\n }\n var winningDoc = winningDocs[i];\n if (!winningDoc) {\n continue;\n }\n var metadata = metadatas[i];\n promises.push(processMetadataAndWinningDoc(metadata, winningDoc));\n }\n\n Promise.all(promises).then(function (changes) {\n for (var i = 0, len = changes.length; i < len; i++) {\n if (changes[i]) {\n opts.onChange(changes[i]);\n }\n }\n }).catch(opts.complete);\n\n if (numResults !== limit) {\n cursor.continue();\n }\n }\n\n // Fetch all metadatas/winningdocs from this batch in parallel, then process\n // them all only once all data has been collected. This is done in parallel\n // because it's faster than doing it one-at-a-time.\n var numDone = 0;\n batchValues.forEach(function (value, i) {\n var doc = decodeDoc(value);\n var seq = batchKeys[i];\n fetchWinningDocAndMetadata(doc, seq, function (metadata, winningDoc) {\n metadatas[i] = metadata;\n winningDocs[i] = winningDoc;\n if (++numDone === batchKeys.length) {\n onBatchDone();\n }\n });\n });\n }\n\n function onGetMetadata(doc, seq, metadata, cb) {\n if (metadata.seq !== seq) {\n // some other seq is later\n return cb();\n }\n\n if (metadata.winningRev === doc._rev) {\n // this is the winning doc\n return cb(metadata, doc);\n }\n\n // fetch winning doc in separate request\n var docIdRev = doc._id + '::' + metadata.winningRev;\n var req = docIdRevIndex.get(docIdRev);\n req.onsuccess = function (e) {\n cb(metadata, decodeDoc(e.target.result));\n };\n }\n\n function fetchWinningDocAndMetadata(doc, seq, cb) {\n if (docIds && !docIds.has(doc._id)) {\n return cb();\n }\n\n var metadata = docIdsToMetadata.get(doc._id);\n if (metadata) { // cached\n return onGetMetadata(doc, seq, metadata, cb);\n }\n // metadata not cached, have to go fetch it\n docStore.get(doc._id).onsuccess = function (e) {\n metadata = decodeMetadata(e.target.result);\n docIdsToMetadata.set(doc._id, metadata);\n onGetMetadata(doc, seq, metadata, cb);\n };\n }\n\n function finish() {\n opts.complete(null, {\n results,\n last_seq: lastSeq\n });\n }\n\n function onTxnComplete() {\n if (!opts.continuous && opts.attachments) {\n // cannot guarantee that postProcessing was already done,\n // so do it again\n postProcessAttachments(results).then(finish);\n } else {\n finish();\n }\n }\n\n var objectStores = [DOC_STORE, BY_SEQ_STORE];\n if (opts.attachments) {\n objectStores.push(ATTACH_STORE);\n }\n var txnResult = openTransactionSafely(idb, objectStores, 'readonly');\n if (txnResult.error) {\n return opts.complete(txnResult.error);\n }\n txn = txnResult.txn;\n txn.onabort = idbError(opts.complete);\n txn.oncomplete = onTxnComplete;\n\n bySeqStore = txn.objectStore(BY_SEQ_STORE);\n docStore = txn.objectStore(DOC_STORE);\n docIdRevIndex = bySeqStore.index('_doc_id_rev');\n\n var keyRange = (opts.since && !opts.descending) ?\n IDBKeyRange.lowerBound(opts.since, true) : null;\n\n runBatchedCursor(bySeqStore, keyRange, opts.descending, limit, onBatch);\n}\n\nvar cachedDBs = new Map();\nvar blobSupportPromise;\nvar openReqList = new Map();\n\nfunction IdbPouch(opts, callback) {\n var api = this;\n\n enqueueTask(function (thisCallback) {\n init(api, opts, thisCallback);\n }, callback, api.constructor);\n}\n\nfunction init(api, opts, callback) {\n\n var dbName = opts.name;\n\n var idb = null;\n var idbGlobalFailureError = null;\n api._meta = null;\n\n function enrichCallbackError(callback) {\n return function (error, result) {\n if (error && error instanceof Error && !error.reason) {\n if (idbGlobalFailureError) {\n error.reason = idbGlobalFailureError;\n }\n }\n\n callback(error, result);\n };\n }\n\n // called when creating a fresh new database\n function createSchema(db) {\n var docStore = db.createObjectStore(DOC_STORE, {keyPath : 'id'});\n db.createObjectStore(BY_SEQ_STORE, {autoIncrement: true})\n .createIndex('_doc_id_rev', '_doc_id_rev', {unique: true});\n db.createObjectStore(ATTACH_STORE, {keyPath: 'digest'});\n db.createObjectStore(META_STORE, {keyPath: 'id', autoIncrement: false});\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n\n // added in v2\n docStore.createIndex('deletedOrLocal', 'deletedOrLocal', {unique : false});\n\n // added in v3\n db.createObjectStore(LOCAL_STORE, {keyPath: '_id'});\n\n // added in v4\n var attAndSeqStore = db.createObjectStore(ATTACH_AND_SEQ_STORE,\n {autoIncrement: true});\n attAndSeqStore.createIndex('seq', 'seq');\n attAndSeqStore.createIndex('digestSeq', 'digestSeq', {unique: true});\n }\n\n // migration to version 2\n // unfortunately \"deletedOrLocal\" is a misnomer now that we no longer\n // store local docs in the main doc-store, but whaddyagonnado\n function addDeletedOrLocalIndex(txn, callback) {\n var docStore = txn.objectStore(DOC_STORE);\n docStore.createIndex('deletedOrLocal', 'deletedOrLocal', {unique : false});\n\n docStore.openCursor().onsuccess = function (event) {\n var cursor = event.target.result;\n if (cursor) {\n var metadata = cursor.value;\n var deleted = isDeleted(metadata);\n metadata.deletedOrLocal = deleted ? \"1\" : \"0\";\n docStore.put(metadata);\n cursor.continue();\n } else {\n callback();\n }\n };\n }\n\n // migration to version 3 (part 1)\n function createLocalStoreSchema(db) {\n db.createObjectStore(LOCAL_STORE, {keyPath: '_id'})\n .createIndex('_doc_id_rev', '_doc_id_rev', {unique: true});\n }\n\n // migration to version 3 (part 2)\n function migrateLocalStore(txn, cb) {\n var localStore = txn.objectStore(LOCAL_STORE);\n var docStore = txn.objectStore(DOC_STORE);\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n\n var cursor = docStore.openCursor();\n cursor.onsuccess = function (event) {\n var cursor = event.target.result;\n if (cursor) {\n var metadata = cursor.value;\n var docId = metadata.id;\n var local = isLocalId(docId);\n var rev$$1 = winningRev(metadata);\n if (local) {\n var docIdRev = docId + \"::\" + rev$$1;\n // remove all seq entries\n // associated with this docId\n var start = docId + \"::\";\n var end = docId + \"::~\";\n var index = seqStore.index('_doc_id_rev');\n var range = IDBKeyRange.bound(start, end, false, false);\n var seqCursor = index.openCursor(range);\n seqCursor.onsuccess = function (e) {\n seqCursor = e.target.result;\n if (!seqCursor) {\n // done\n docStore.delete(cursor.primaryKey);\n cursor.continue();\n } else {\n var data = seqCursor.value;\n if (data._doc_id_rev === docIdRev) {\n localStore.put(data);\n }\n seqStore.delete(seqCursor.primaryKey);\n seqCursor.continue();\n }\n };\n } else {\n cursor.continue();\n }\n } else if (cb) {\n cb();\n }\n };\n }\n\n // migration to version 4 (part 1)\n function addAttachAndSeqStore(db) {\n var attAndSeqStore = db.createObjectStore(ATTACH_AND_SEQ_STORE,\n {autoIncrement: true});\n attAndSeqStore.createIndex('seq', 'seq');\n attAndSeqStore.createIndex('digestSeq', 'digestSeq', {unique: true});\n }\n\n // migration to version 4 (part 2)\n function migrateAttsAndSeqs(txn, callback) {\n var seqStore = txn.objectStore(BY_SEQ_STORE);\n var attStore = txn.objectStore(ATTACH_STORE);\n var attAndSeqStore = txn.objectStore(ATTACH_AND_SEQ_STORE);\n\n // need to actually populate the table. this is the expensive part,\n // so as an optimization, check first that this database even\n // contains attachments\n var req = attStore.count();\n req.onsuccess = function (e) {\n var count = e.target.result;\n if (!count) {\n return callback(); // done\n }\n\n seqStore.openCursor().onsuccess = function (e) {\n var cursor = e.target.result;\n if (!cursor) {\n return callback(); // done\n }\n var doc = cursor.value;\n var seq = cursor.primaryKey;\n var atts = Object.keys(doc._attachments || {});\n var digestMap = {};\n for (var j = 0; j < atts.length; j++) {\n var att = doc._attachments[atts[j]];\n digestMap[att.digest] = true; // uniq digests, just in case\n }\n var digests = Object.keys(digestMap);\n for (j = 0; j < digests.length; j++) {\n var digest = digests[j];\n attAndSeqStore.put({\n seq,\n digestSeq: digest + '::' + seq\n });\n }\n cursor.continue();\n };\n };\n }\n\n // migration to version 5\n // Instead of relying on on-the-fly migration of metadata,\n // this brings the doc-store to its modern form:\n // - metadata.winningrev\n // - metadata.seq\n // - stringify the metadata when storing it\n function migrateMetadata(txn) {\n\n function decodeMetadataCompat(storedObject) {\n if (!storedObject.data) {\n // old format, when we didn't store it stringified\n storedObject.deleted = storedObject.deletedOrLocal === '1';\n return storedObject;\n }\n return decodeMetadata(storedObject);\n }\n\n // ensure that every metadata has a winningRev and seq,\n // which was previously created on-the-fly but better to migrate\n var bySeqStore = txn.objectStore(BY_SEQ_STORE);\n var docStore = txn.objectStore(DOC_STORE);\n var cursor = docStore.openCursor();\n cursor.onsuccess = function (e) {\n var cursor = e.target.result;\n if (!cursor) {\n return; // done\n }\n var metadata = decodeMetadataCompat(cursor.value);\n\n metadata.winningRev = metadata.winningRev ||\n winningRev(metadata);\n\n function fetchMetadataSeq() {\n // metadata.seq was added post-3.2.0, so if it's missing,\n // we need to fetch it manually\n var start = metadata.id + '::';\n var end = metadata.id + '::\\uffff';\n var req = bySeqStore.index('_doc_id_rev').openCursor(\n IDBKeyRange.bound(start, end));\n\n var metadataSeq = 0;\n req.onsuccess = function (e) {\n var cursor = e.target.result;\n if (!cursor) {\n metadata.seq = metadataSeq;\n return onGetMetadataSeq();\n }\n var seq = cursor.primaryKey;\n if (seq > metadataSeq) {\n metadataSeq = seq;\n }\n cursor.continue();\n };\n }\n\n function onGetMetadataSeq() {\n var metadataToStore = encodeMetadata(metadata,\n metadata.winningRev, metadata.deleted);\n\n var req = docStore.put(metadataToStore);\n req.onsuccess = function () {\n cursor.continue();\n };\n }\n\n if (metadata.seq) {\n return onGetMetadataSeq();\n }\n\n fetchMetadataSeq();\n };\n\n }\n\n api._remote = false;\n api.type = function () {\n return 'idb';\n };\n\n api._id = toPromise(function (callback) {\n callback(null, api._meta.instanceId);\n });\n\n api._bulkDocs = function idb_bulkDocs(req, reqOpts, callback) {\n idbBulkDocs(opts, req, reqOpts, api, idb, enrichCallbackError(callback));\n };\n\n // First we look up the metadata in the ids database, then we fetch the\n // current revision(s) from the by sequence store\n api._get = function idb_get(id, opts, callback) {\n var doc;\n var metadata;\n var err;\n var txn = opts.ctx;\n if (!txn) {\n var txnResult = openTransactionSafely(idb,\n [DOC_STORE, BY_SEQ_STORE, ATTACH_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n txn = txnResult.txn;\n }\n\n function finish() {\n callback(err, {doc, metadata, ctx: txn});\n }\n\n txn.objectStore(DOC_STORE).get(id).onsuccess = function (e) {\n metadata = decodeMetadata(e.target.result);\n // we can determine the result here if:\n // 1. there is no such document\n // 2. the document is deleted and we don't ask about specific rev\n // When we ask with opts.rev we expect the answer to be either\n // doc (possibly with _deleted=true) or missing error\n if (!metadata) {\n err = createError(MISSING_DOC, 'missing');\n return finish();\n }\n\n var rev$$1;\n if (!opts.rev) {\n rev$$1 = metadata.winningRev;\n var deleted = isDeleted(metadata);\n if (deleted) {\n err = createError(MISSING_DOC, \"deleted\");\n return finish();\n }\n } else {\n rev$$1 = opts.latest ? latest(opts.rev, metadata) : opts.rev;\n }\n\n var objectStore = txn.objectStore(BY_SEQ_STORE);\n var key = metadata.id + '::' + rev$$1;\n\n objectStore.index('_doc_id_rev').get(key).onsuccess = function (e) {\n doc = e.target.result;\n if (doc) {\n doc = decodeDoc(doc);\n }\n if (!doc) {\n err = createError(MISSING_DOC, 'missing');\n return finish();\n }\n finish();\n };\n };\n };\n\n api._getAttachment = function (docId, attachId, attachment, opts, callback) {\n var txn;\n if (opts.ctx) {\n txn = opts.ctx;\n } else {\n var txnResult = openTransactionSafely(idb,\n [DOC_STORE, BY_SEQ_STORE, ATTACH_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n txn = txnResult.txn;\n }\n var digest = attachment.digest;\n var type = attachment.content_type;\n\n txn.objectStore(ATTACH_STORE).get(digest).onsuccess = function (e) {\n var body = e.target.result.body;\n readBlobData(body, type, opts.binary, function (blobData) {\n callback(null, blobData);\n });\n };\n };\n\n api._info = function idb_info(callback) {\n var updateSeq;\n var docCount;\n\n var txnResult = openTransactionSafely(idb, [META_STORE, BY_SEQ_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n txn.objectStore(META_STORE).get(META_STORE).onsuccess = function (e) {\n docCount = e.target.result.docCount;\n };\n txn.objectStore(BY_SEQ_STORE).openKeyCursor(null, 'prev').onsuccess = function (e) {\n var cursor = e.target.result;\n updateSeq = cursor ? cursor.key : 0;\n };\n\n txn.oncomplete = function () {\n callback(null, {\n doc_count: docCount,\n update_seq: updateSeq,\n // for debugging\n idb_attachment_format: (api._meta.blobSupport ? 'binary' : 'base64')\n });\n };\n };\n\n api._allDocs = function idb_allDocs(opts, callback) {\n idbAllDocs(opts, idb, enrichCallbackError(callback));\n };\n\n api._changes = function idbChanges(opts) {\n return changes(opts, api, dbName, idb);\n };\n\n api._close = function (callback) {\n // https://developer.mozilla.org/en-US/docs/IndexedDB/IDBDatabase#close\n // \"Returns immediately and closes the connection in a separate thread...\"\n idb.close();\n cachedDBs.delete(dbName);\n callback();\n };\n\n api._getRevisionTree = function (docId, callback) {\n var txnResult = openTransactionSafely(idb, [DOC_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n var req = txn.objectStore(DOC_STORE).get(docId);\n req.onsuccess = function (event) {\n var doc = decodeMetadata(event.target.result);\n if (!doc) {\n callback(createError(MISSING_DOC));\n } else {\n callback(null, doc.rev_tree);\n }\n };\n };\n\n // This function removes revisions of document docId\n // which are listed in revs and sets this document\n // revision to to rev_tree\n api._doCompaction = function (docId, revs, callback) {\n var stores = [\n DOC_STORE,\n BY_SEQ_STORE,\n ATTACH_STORE,\n ATTACH_AND_SEQ_STORE\n ];\n var txnResult = openTransactionSafely(idb, stores, 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var txn = txnResult.txn;\n\n var docStore = txn.objectStore(DOC_STORE);\n\n docStore.get(docId).onsuccess = function (event) {\n var metadata = decodeMetadata(event.target.result);\n traverseRevTree(metadata.rev_tree, function (isLeaf, pos,\n revHash, ctx, opts) {\n var rev$$1 = pos + '-' + revHash;\n if (revs.indexOf(rev$$1) !== -1) {\n opts.status = 'missing';\n }\n });\n compactRevs(revs, docId, txn);\n var winningRev$$1 = metadata.winningRev;\n var deleted = metadata.deleted;\n txn.objectStore(DOC_STORE).put(\n encodeMetadata(metadata, winningRev$$1, deleted));\n };\n txn.onabort = idbError(callback);\n txn.oncomplete = function () {\n callback();\n };\n };\n\n\n api._getLocal = function (id, callback) {\n var txnResult = openTransactionSafely(idb, [LOCAL_STORE], 'readonly');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n var tx = txnResult.txn;\n var req = tx.objectStore(LOCAL_STORE).get(id);\n\n req.onerror = idbError(callback);\n req.onsuccess = function (e) {\n var doc = e.target.result;\n if (!doc) {\n callback(createError(MISSING_DOC));\n } else {\n delete doc['_doc_id_rev']; // for backwards compat\n callback(null, doc);\n }\n };\n };\n\n api._putLocal = function (doc, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n delete doc._revisions; // ignore this, trust the rev\n var oldRev = doc._rev;\n var id = doc._id;\n if (!oldRev) {\n doc._rev = '0-1';\n } else {\n doc._rev = '0-' + (parseInt(oldRev.split('-')[1], 10) + 1);\n }\n\n var tx = opts.ctx;\n var ret;\n if (!tx) {\n var txnResult = openTransactionSafely(idb, [LOCAL_STORE], 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n tx = txnResult.txn;\n tx.onerror = idbError(callback);\n tx.oncomplete = function () {\n if (ret) {\n callback(null, ret);\n }\n };\n }\n\n var oStore = tx.objectStore(LOCAL_STORE);\n var req;\n if (oldRev) {\n req = oStore.get(id);\n req.onsuccess = function (e) {\n var oldDoc = e.target.result;\n if (!oldDoc || oldDoc._rev !== oldRev) {\n callback(createError(REV_CONFLICT));\n } else { // update\n var req = oStore.put(doc);\n req.onsuccess = function () {\n ret = {ok: true, id: doc._id, rev: doc._rev};\n if (opts.ctx) { // return immediately\n callback(null, ret);\n }\n };\n }\n };\n } else { // new doc\n req = oStore.add(doc);\n req.onerror = function (e) {\n // constraint error, already exists\n callback(createError(REV_CONFLICT));\n e.preventDefault(); // avoid transaction abort\n e.stopPropagation(); // avoid transaction onerror\n };\n req.onsuccess = function () {\n ret = {ok: true, id: doc._id, rev: doc._rev};\n if (opts.ctx) { // return immediately\n callback(null, ret);\n }\n };\n }\n };\n\n api._removeLocal = function (doc, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n var tx = opts.ctx;\n if (!tx) {\n var txnResult = openTransactionSafely(idb, [LOCAL_STORE], 'readwrite');\n if (txnResult.error) {\n return callback(txnResult.error);\n }\n tx = txnResult.txn;\n tx.oncomplete = function () {\n if (ret) {\n callback(null, ret);\n }\n };\n }\n var ret;\n var id = doc._id;\n var oStore = tx.objectStore(LOCAL_STORE);\n var req = oStore.get(id);\n\n req.onerror = idbError(callback);\n req.onsuccess = function (e) {\n var oldDoc = e.target.result;\n if (!oldDoc || oldDoc._rev !== doc._rev) {\n callback(createError(MISSING_DOC));\n } else {\n oStore.delete(id);\n ret = {ok: true, id, rev: '0-0'};\n if (opts.ctx) { // return immediately\n callback(null, ret);\n }\n }\n };\n };\n\n api._destroy = function (opts, callback) {\n changesHandler.removeAllListeners(dbName);\n\n //Close open request for \"dbName\" database to fix ie delay.\n var openReq = openReqList.get(dbName);\n if (openReq && openReq.result) {\n openReq.result.close();\n cachedDBs.delete(dbName);\n }\n var req = indexedDB.deleteDatabase(dbName);\n\n req.onsuccess = function () {\n //Remove open request from the list.\n openReqList.delete(dbName);\n if (hasLocalStorage() && (dbName in localStorage)) {\n delete localStorage[dbName];\n }\n callback(null, { 'ok': true });\n };\n\n req.onerror = idbError(callback);\n };\n\n var cached = cachedDBs.get(dbName);\n\n if (cached) {\n idb = cached.idb;\n api._meta = cached.global;\n return nextTick(function () {\n callback(null, api);\n });\n }\n\n var req = indexedDB.open(dbName, ADAPTER_VERSION);\n openReqList.set(dbName, req);\n\n req.onupgradeneeded = function (e) {\n var db = e.target.result;\n if (e.oldVersion < 1) {\n return createSchema(db); // new db, initial schema\n }\n // do migrations\n\n var txn = e.currentTarget.transaction;\n // these migrations have to be done in this function, before\n // control is returned to the event loop, because IndexedDB\n\n if (e.oldVersion < 3) {\n createLocalStoreSchema(db); // v2 -> v3\n }\n if (e.oldVersion < 4) {\n addAttachAndSeqStore(db); // v3 -> v4\n }\n\n var migrations = [\n addDeletedOrLocalIndex, // v1 -> v2\n migrateLocalStore, // v2 -> v3\n migrateAttsAndSeqs, // v3 -> v4\n migrateMetadata // v4 -> v5\n ];\n\n var i = e.oldVersion;\n\n function next() {\n var migration = migrations[i - 1];\n i++;\n if (migration) {\n migration(txn, next);\n }\n }\n\n next();\n };\n\n req.onsuccess = function (e) {\n\n idb = e.target.result;\n\n idb.onversionchange = function () {\n idb.close();\n cachedDBs.delete(dbName);\n };\n\n idb.onabort = function (e) {\n guardedConsole('error', 'Database has a global failure', e.target.error);\n idbGlobalFailureError = e.target.error;\n idb.close();\n cachedDBs.delete(dbName);\n };\n\n // Do a few setup operations (in parallel as much as possible):\n // 1. Fetch meta doc\n // 2. Check blob support\n // 3. Calculate docCount\n // 4. Generate an instanceId if necessary\n // 5. Store docCount and instanceId on meta doc\n\n var txn = idb.transaction([\n META_STORE,\n DETECT_BLOB_SUPPORT_STORE,\n DOC_STORE\n ], 'readwrite');\n\n var storedMetaDoc = false;\n var metaDoc;\n var docCount;\n var blobSupport;\n var instanceId;\n\n function completeSetup() {\n if (typeof blobSupport === 'undefined' || !storedMetaDoc) {\n return;\n }\n api._meta = {\n name: dbName,\n instanceId,\n blobSupport\n };\n\n cachedDBs.set(dbName, {\n idb,\n global: api._meta\n });\n callback(null, api);\n }\n\n function storeMetaDocIfReady() {\n if (typeof docCount === 'undefined' || typeof metaDoc === 'undefined') {\n return;\n }\n var instanceKey = dbName + '_id';\n if (instanceKey in metaDoc) {\n instanceId = metaDoc[instanceKey];\n } else {\n metaDoc[instanceKey] = instanceId = uuid();\n }\n metaDoc.docCount = docCount;\n txn.objectStore(META_STORE).put(metaDoc);\n }\n\n //\n // fetch or generate the instanceId\n //\n txn.objectStore(META_STORE).get(META_STORE).onsuccess = function (e) {\n metaDoc = e.target.result || { id: META_STORE };\n storeMetaDocIfReady();\n };\n\n //\n // countDocs\n //\n countDocs(txn, function (count) {\n docCount = count;\n storeMetaDocIfReady();\n });\n\n //\n // check blob support\n //\n if (!blobSupportPromise) {\n // make sure blob support is only checked once\n blobSupportPromise = checkBlobSupport(txn, DETECT_BLOB_SUPPORT_STORE, 'key');\n }\n\n blobSupportPromise.then(function (val) {\n blobSupport = val;\n completeSetup();\n });\n\n // only when the metadata put transaction has completed,\n // consider the setup done\n txn.oncomplete = function () {\n storedMetaDoc = true;\n completeSetup();\n };\n txn.onabort = idbError(callback);\n };\n\n req.onerror = function (e) {\n var msg = e.target.error && e.target.error.message;\n\n if (!msg) {\n msg = 'Failed to open indexedDB, are you in private browsing mode?';\n } else if (msg.indexOf(\"stored database is a higher version\") !== -1) {\n msg = new Error('This DB was created with the newer \"indexeddb\" adapter, but you are trying to open it with the older \"idb\" adapter');\n }\n\n guardedConsole('error', msg);\n callback(createError(IDB_ERROR, msg));\n };\n}\n\nIdbPouch.valid = function () {\n // Following #7085 buggy idb versions (typically Safari < 10.1) are\n // considered valid.\n\n // On Firefox SecurityError is thrown while referencing indexedDB if cookies\n // are not allowed. `typeof indexedDB` also triggers the error.\n try {\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n return typeof indexedDB !== 'undefined' && typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n};\n\nfunction IDBPouch (PouchDB) {\n PouchDB.adapter('idb', IdbPouch, true);\n}\n\n// dead simple promise pool, inspired by https://github.com/timdp/es6-promise-pool\n// but much smaller in code size. limits the number of concurrent promises that are executed\n\n\nfunction pool(promiseFactories, limit) {\n return new Promise(function (resolve, reject) {\n var running = 0;\n var current = 0;\n var done = 0;\n var len = promiseFactories.length;\n var err;\n\n function runNext() {\n running++;\n promiseFactories[current++]().then(onSuccess, onError);\n }\n\n function doNext() {\n if (++done === len) {\n /* istanbul ignore if */\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n } else {\n runNextBatch();\n }\n }\n\n function onSuccess() {\n running--;\n doNext();\n }\n\n /* istanbul ignore next */\n function onError(thisErr) {\n running--;\n err = err || thisErr;\n doNext();\n }\n\n function runNextBatch() {\n while (running < limit && current < len) {\n runNext();\n }\n }\n\n runNextBatch();\n });\n}\n\nconst CHANGES_BATCH_SIZE = 25;\nconst MAX_SIMULTANEOUS_REVS = 50;\nconst CHANGES_TIMEOUT_BUFFER = 5000;\nconst DEFAULT_HEARTBEAT = 10000;\n\nconst supportsBulkGetMap = {};\n\nfunction readAttachmentsAsBlobOrBuffer(row) {\n const doc = row.doc || row.ok;\n const atts = doc && doc._attachments;\n if (!atts) {\n return;\n }\n Object.keys(atts).forEach(function (filename) {\n const att = atts[filename];\n att.data = b64ToBluffer(att.data, att.content_type);\n });\n}\n\nfunction encodeDocId(id) {\n if (/^_design/.test(id)) {\n return '_design/' + encodeURIComponent(id.slice(8));\n }\n if (id.startsWith('_local/')) {\n return '_local/' + encodeURIComponent(id.slice(7));\n }\n return encodeURIComponent(id);\n}\n\nfunction preprocessAttachments$1(doc) {\n if (!doc._attachments || !Object.keys(doc._attachments)) {\n return Promise.resolve();\n }\n\n return Promise.all(Object.keys(doc._attachments).map(function (key) {\n const attachment = doc._attachments[key];\n if (attachment.data && typeof attachment.data !== 'string') {\n return new Promise(function (resolve) {\n blobToBase64(attachment.data, resolve);\n }).then(function (b64) {\n attachment.data = b64;\n });\n }\n }));\n}\n\nfunction hasUrlPrefix(opts) {\n if (!opts.prefix) {\n return false;\n }\n const protocol = parseUri(opts.prefix).protocol;\n return protocol === 'http' || protocol === 'https';\n}\n\n// Get all the information you possibly can about the URI given by name and\n// return it as a suitable object.\nfunction getHost(name, opts) {\n // encode db name if opts.prefix is a url (#5574)\n if (hasUrlPrefix(opts)) {\n const dbName = opts.name.substr(opts.prefix.length);\n // Ensure prefix has a trailing slash\n const prefix = opts.prefix.replace(/\\/?$/, '/');\n name = prefix + encodeURIComponent(dbName);\n }\n\n const uri = parseUri(name);\n if (uri.user || uri.password) {\n uri.auth = {username: uri.user, password: uri.password};\n }\n\n // Split the path part of the URI into parts using '/' as the delimiter\n // after removing any leading '/' and any trailing '/'\n const parts = uri.path.replace(/(^\\/|\\/$)/g, '').split('/');\n\n uri.db = parts.pop();\n // Prevent double encoding of URI component\n if (uri.db.indexOf('%') === -1) {\n uri.db = encodeURIComponent(uri.db);\n }\n\n uri.path = parts.join('/');\n\n return uri;\n}\n\n// Generate a URL with the host data given by opts and the given path\nfunction genDBUrl(opts, path) {\n return genUrl(opts, opts.db + '/' + path);\n}\n\n// Generate a URL with the host data given by opts and the given path\nfunction genUrl(opts, path) {\n // If the host already has a path, then we need to have a path delimiter\n // Otherwise, the path delimiter is the empty string\n const pathDel = !opts.path ? '' : '/';\n\n // If the host already has a path, then we need to have a path delimiter\n // Otherwise, the path delimiter is the empty string\n return opts.protocol + '://' + opts.host +\n (opts.port ? (':' + opts.port) : '') +\n '/' + opts.path + pathDel + path;\n}\n\nfunction paramsToStr(params) {\n const paramKeys = Object.keys(params);\n if (paramKeys.length === 0) {\n return '';\n }\n\n return '?' + paramKeys.map(key => key + '=' + encodeURIComponent(params[key])).join('&');\n}\n\nfunction shouldCacheBust(opts) {\n const ua = (typeof navigator !== 'undefined' && navigator.userAgent) ?\n navigator.userAgent.toLowerCase() : '';\n const isIE = ua.indexOf('msie') !== -1;\n const isTrident = ua.indexOf('trident') !== -1;\n const isEdge = ua.indexOf('edge') !== -1;\n const isGET = !('method' in opts) || opts.method === 'GET';\n return (isIE || isTrident || isEdge) && isGET;\n}\n\n// Implements the PouchDB API for dealing with CouchDB instances over HTTP\nfunction HttpPouch(opts, callback) {\n\n // The functions that will be publicly available for HttpPouch\n const api = this;\n\n const host = getHost(opts.name, opts);\n const dbUrl = genDBUrl(host, '');\n\n opts = clone(opts);\n\n const ourFetch = async function (url, options) {\n\n options = options || {};\n options.headers = options.headers || new h();\n\n options.credentials = 'include';\n\n if (opts.auth || host.auth) {\n const nAuth = opts.auth || host.auth;\n const str = nAuth.username + ':' + nAuth.password;\n const token = thisBtoa(unescape(encodeURIComponent(str)));\n options.headers.set('Authorization', 'Basic ' + token);\n }\n\n const headers = opts.headers || {};\n Object.keys(headers).forEach(function (key) {\n options.headers.append(key, headers[key]);\n });\n\n /* istanbul ignore if */\n if (shouldCacheBust(options)) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + '_nonce=' + Date.now();\n }\n\n const fetchFun = opts.fetch || f$1;\n return await fetchFun(url, options);\n };\n\n function adapterFun$$1(name, fun) {\n return adapterFun(name, function (...args) {\n setup().then(function () {\n return fun.apply(this, args);\n }).catch(function (e) {\n const callback = args.pop();\n callback(e);\n });\n }).bind(api);\n }\n\n async function fetchJSON(url, options) {\n\n const result = {};\n\n options = options || {};\n options.headers = options.headers || new h();\n\n if (!options.headers.get('Content-Type')) {\n options.headers.set('Content-Type', 'application/json');\n }\n if (!options.headers.get('Accept')) {\n options.headers.set('Accept', 'application/json');\n }\n\n const response = await ourFetch(url, options);\n result.ok = response.ok;\n result.status = response.status;\n const json = await response.json();\n\n result.data = json;\n if (!result.ok) {\n result.data.status = result.status;\n const err = generateErrorFromResponse(result.data);\n throw err;\n }\n\n if (Array.isArray(result.data)) {\n result.data = result.data.map(function (v) {\n if (v.error || v.missing) {\n return generateErrorFromResponse(v);\n } else {\n return v;\n }\n });\n }\n\n return result;\n }\n\n let setupPromise;\n\n async function setup() {\n if (opts.skip_setup) {\n return Promise.resolve();\n }\n\n // If there is a setup in process or previous successful setup\n // done then we will use that\n // If previous setups have been rejected we will try again\n if (setupPromise) {\n return setupPromise;\n }\n\n setupPromise = fetchJSON(dbUrl).catch(function (err) {\n if (err && err.status && err.status === 404) {\n // Doesnt exist, create it\n explainError(404, 'PouchDB is just detecting if the remote exists.');\n return fetchJSON(dbUrl, {method: 'PUT'});\n } else {\n return Promise.reject(err);\n }\n }).catch(function (err) {\n // If we try to create a database that already exists, skipped in\n // istanbul since its catching a race condition.\n /* istanbul ignore if */\n if (err && err.status && err.status === 412) {\n return true;\n }\n return Promise.reject(err);\n });\n\n setupPromise.catch(function () {\n setupPromise = null;\n });\n\n return setupPromise;\n }\n\n nextTick(function () {\n callback(null, api);\n });\n\n api._remote = true;\n\n /* istanbul ignore next */\n api.type = function () {\n return 'http';\n };\n\n api.id = adapterFun$$1('id', async function (callback) {\n let result;\n try {\n const response = await ourFetch(genUrl(host, ''));\n result = await response.json();\n } catch (err) {\n result = {};\n }\n\n // Bad response or missing `uuid` should not prevent ID generation.\n const uuid$$1 = (result && result.uuid) ? (result.uuid + host.db) : genDBUrl(host, '');\n callback(null, uuid$$1);\n });\n\n // Sends a POST request to the host calling the couchdb _compact function\n // version: The version of CouchDB it is running\n api.compact = adapterFun$$1('compact', async function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = clone(opts);\n\n await fetchJSON(genDBUrl(host, '_compact'), {method: 'POST'});\n\n function ping() {\n api.info(function (err, res) {\n // CouchDB may send a \"compact_running:true\" if it's\n // already compacting. PouchDB Server doesn't.\n /* istanbul ignore else */\n if (res && !res.compact_running) {\n callback(null, {ok: true});\n } else {\n setTimeout(ping, opts.interval || 200);\n }\n });\n }\n // Ping the http if it's finished compaction\n ping();\n });\n\n api.bulkGet = adapterFun('bulkGet', function (opts, callback) {\n const self = this;\n\n async function doBulkGet(cb) {\n const params = {};\n if (opts.revs) {\n params.revs = true;\n }\n if (opts.attachments) {\n /* istanbul ignore next */\n params.attachments = true;\n }\n if (opts.latest) {\n params.latest = true;\n }\n try {\n const result = await fetchJSON(genDBUrl(host, '_bulk_get' + paramsToStr(params)), {\n method: 'POST',\n body: JSON.stringify({ docs: opts.docs})\n });\n\n if (opts.attachments && opts.binary) {\n result.data.results.forEach(function (res) {\n res.docs.forEach(readAttachmentsAsBlobOrBuffer);\n });\n }\n cb(null, result.data);\n } catch (error) {\n cb(error);\n }\n }\n\n /* istanbul ignore next */\n function doBulkGetShim() {\n // avoid \"url too long error\" by splitting up into multiple requests\n const batchSize = MAX_SIMULTANEOUS_REVS;\n const numBatches = Math.ceil(opts.docs.length / batchSize);\n let numDone = 0;\n const results = new Array(numBatches);\n\n function onResult(batchNum) {\n return function (err, res) {\n // err is impossible because shim returns a list of errs in that case\n results[batchNum] = res.results;\n if (++numDone === numBatches) {\n callback(null, {results: results.flat()});\n }\n };\n }\n\n for (let i = 0; i < numBatches; i++) {\n const subOpts = pick(opts, ['revs', 'attachments', 'binary', 'latest']);\n subOpts.docs = opts.docs.slice(i * batchSize,\n Math.min(opts.docs.length, (i + 1) * batchSize));\n bulkGet(self, subOpts, onResult(i));\n }\n }\n\n // mark the whole database as either supporting or not supporting _bulk_get\n const dbUrl = genUrl(host, '');\n const supportsBulkGet = supportsBulkGetMap[dbUrl];\n\n /* istanbul ignore next */\n if (typeof supportsBulkGet !== 'boolean') {\n // check if this database supports _bulk_get\n doBulkGet(function (err, res) {\n if (err) {\n supportsBulkGetMap[dbUrl] = false;\n explainError(\n err.status,\n 'PouchDB is just detecting if the remote ' +\n 'supports the _bulk_get API.'\n );\n doBulkGetShim();\n } else {\n supportsBulkGetMap[dbUrl] = true;\n callback(null, res);\n }\n });\n } else if (supportsBulkGet) {\n doBulkGet(callback);\n } else {\n doBulkGetShim();\n }\n });\n\n // Calls GET on the host, which gets back a JSON string containing\n // couchdb: A welcome string\n // version: The version of CouchDB it is running\n api._info = async function (callback) {\n try {\n await setup();\n const response = await ourFetch(genDBUrl(host, ''));\n const info = await response.json();\n info.host = genDBUrl(host, '');\n callback(null, info);\n } catch (err) {\n callback(err);\n }\n };\n\n api.fetch = async function (path, options) {\n await setup();\n const url = path.substring(0, 1) === '/' ?\n genUrl(host, path.substring(1)) :\n genDBUrl(host, path);\n return ourFetch(url, options);\n };\n\n // Get the document with the given id from the database given by host.\n // The id could be solely the _id in the database, or it may be a\n // _design/ID or _local/ID path\n api.get = adapterFun$$1('get', async function (id, opts, callback) {\n // If no options were given, set the callback to the second parameter\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = clone(opts);\n\n // List of parameters to add to the GET request\n const params = {};\n\n if (opts.revs) {\n params.revs = true;\n }\n\n if (opts.revs_info) {\n params.revs_info = true;\n }\n\n if (opts.latest) {\n params.latest = true;\n }\n\n if (opts.open_revs) {\n if (opts.open_revs !== \"all\") {\n opts.open_revs = JSON.stringify(opts.open_revs);\n }\n params.open_revs = opts.open_revs;\n }\n\n if (opts.rev) {\n params.rev = opts.rev;\n }\n\n if (opts.conflicts) {\n params.conflicts = opts.conflicts;\n }\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n params.update_seq = opts.update_seq;\n }\n\n id = encodeDocId(id);\n\n function fetchAttachments(doc) {\n const atts = doc._attachments;\n const filenames = atts && Object.keys(atts);\n if (!atts || !filenames.length) {\n return;\n }\n // we fetch these manually in separate XHRs, because\n // Sync Gateway would normally send it back as multipart/mixed,\n // which we cannot parse. Also, this is more efficient than\n // receiving attachments as base64-encoded strings.\n async function fetchData(filename) {\n const att = atts[filename];\n const path = encodeDocId(doc._id) + '/' + encodeAttachmentId(filename) +\n '?rev=' + doc._rev;\n\n const response = await ourFetch(genDBUrl(host, path));\n\n let blob;\n if ('buffer' in response) {\n blob = await response.buffer();\n } else {\n /* istanbul ignore next */\n blob = await response.blob();\n }\n\n let data;\n if (opts.binary) {\n const typeFieldDescriptor = Object.getOwnPropertyDescriptor(blob.__proto__, 'type');\n if (!typeFieldDescriptor || typeFieldDescriptor.set) {\n blob.type = att.content_type;\n }\n data = blob;\n } else {\n data = await new Promise(function (resolve) {\n blobToBase64(blob, resolve);\n });\n }\n\n delete att.stub;\n delete att.length;\n att.data = data;\n }\n\n const promiseFactories = filenames.map(function (filename) {\n return function () {\n return fetchData(filename);\n };\n });\n\n // This limits the number of parallel xhr requests to 5 any time\n // to avoid issues with maximum browser request limits\n return pool(promiseFactories, 5);\n }\n\n function fetchAllAttachments(docOrDocs) {\n if (Array.isArray(docOrDocs)) {\n return Promise.all(docOrDocs.map(function (doc) {\n if (doc.ok) {\n return fetchAttachments(doc.ok);\n }\n }));\n }\n return fetchAttachments(docOrDocs);\n }\n\n const url = genDBUrl(host, id + paramsToStr(params));\n try {\n const res = await fetchJSON(url);\n if (opts.attachments) {\n await fetchAllAttachments(res.data);\n }\n callback(null, res.data);\n } catch (error) {\n error.docId = id;\n callback(error);\n }\n });\n\n\n // Delete the document given by doc from the database given by host.\n api.remove = adapterFun$$1('remove', async function (docOrId, optsOrRev, opts, cb) {\n let doc;\n if (typeof optsOrRev === 'string') {\n // id, rev, opts, callback style\n doc = {\n _id: docOrId,\n _rev: optsOrRev\n };\n if (typeof opts === 'function') {\n cb = opts;\n opts = {};\n }\n } else {\n // doc, opts, callback style\n doc = docOrId;\n if (typeof optsOrRev === 'function') {\n cb = optsOrRev;\n opts = {};\n } else {\n cb = opts;\n opts = optsOrRev;\n }\n }\n\n const rev$$1 = (doc._rev || opts.rev);\n const url = genDBUrl(host, encodeDocId(doc._id)) + '?rev=' + rev$$1;\n\n try {\n const result = await fetchJSON(url, {method: 'DELETE'});\n cb(null, result.data);\n } catch (error) {\n cb(error);\n }\n });\n\n function encodeAttachmentId(attachmentId) {\n return attachmentId.split(\"/\").map(encodeURIComponent).join(\"/\");\n }\n\n // Get the attachment\n api.getAttachment = adapterFun$$1('getAttachment', async function (docId, attachmentId,\n opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n const params = opts.rev ? ('?rev=' + opts.rev) : '';\n const url = genDBUrl(host, encodeDocId(docId)) + '/' +\n encodeAttachmentId(attachmentId) + params;\n let contentType;\n try {\n const response = await ourFetch(url, {method: 'GET'});\n\n if (!response.ok) {\n throw response;\n }\n\n contentType = response.headers.get('content-type');\n let blob;\n if (typeof process !== 'undefined' && !process.browser && typeof response.buffer === 'function') {\n blob = await response.buffer();\n } else {\n /* istanbul ignore next */\n blob = await response.blob();\n }\n\n // TODO: also remove\n if (typeof process !== 'undefined' && !process.browser) {\n const typeFieldDescriptor = Object.getOwnPropertyDescriptor(blob.__proto__, 'type');\n if (!typeFieldDescriptor || typeFieldDescriptor.set) {\n blob.type = contentType;\n }\n }\n callback(null, blob);\n } catch (err) {\n callback(err);\n }\n });\n\n // Remove the attachment given by the id and rev\n api.removeAttachment = adapterFun$$1('removeAttachment', async function (\n docId,\n attachmentId,\n rev$$1,\n callback,\n ) {\n const url = genDBUrl(host, encodeDocId(docId) + '/' + encodeAttachmentId(attachmentId)) + '?rev=' + rev$$1;\n\n try {\n const result = await fetchJSON(url, {method: 'DELETE'});\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n // Add the attachment given by blob and its contentType property\n // to the document with the given id, the revision given by rev, and\n // add it to the database given by host.\n api.putAttachment = adapterFun$$1('putAttachment', async function (\n docId,\n attachmentId,\n rev$$1,\n blob,\n type,\n callback,\n ) {\n if (typeof type === 'function') {\n callback = type;\n type = blob;\n blob = rev$$1;\n rev$$1 = null;\n }\n const id = encodeDocId(docId) + '/' + encodeAttachmentId(attachmentId);\n let url = genDBUrl(host, id);\n if (rev$$1) {\n url += '?rev=' + rev$$1;\n }\n\n if (typeof blob === 'string') {\n // input is assumed to be a base64 string\n let binary;\n try {\n binary = thisAtob(blob);\n } catch (err) {\n return callback(createError(BAD_ARG,\n 'Attachment is not a valid base64 string'));\n }\n blob = binary ? binStringToBluffer(binary, type) : '';\n }\n\n try {\n // Add the attachment\n const result = await fetchJSON(url, {\n headers: new h({'Content-Type': type}),\n method: 'PUT',\n body: blob\n });\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n // Update/create multiple documents given by req in the database\n // given by host.\n api._bulkDocs = async function (req, opts, callback) {\n // If new_edits=false then it prevents the database from creating\n // new revision numbers for the documents. Instead it just uses\n // the old ones. This is used in database replication.\n req.new_edits = opts.new_edits;\n\n try {\n await setup();\n await Promise.all(req.docs.map(preprocessAttachments$1));\n\n // Update/create the documents\n const result = await fetchJSON(genDBUrl(host, '_bulk_docs'), {\n method: 'POST',\n body: JSON.stringify(req)\n });\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n };\n\n // Update/create document\n api._put = async function (doc, opts, callback) {\n try {\n await setup();\n await preprocessAttachments$1(doc);\n\n const result = await fetchJSON(genDBUrl(host, encodeDocId(doc._id)), {\n method: 'PUT',\n body: JSON.stringify(doc)\n });\n callback(null, result.data);\n } catch (error) {\n error.docId = doc && doc._id;\n callback(error);\n }\n };\n\n\n // Get a listing of the documents in the database given\n // by host and ordered by increasing id.\n api.allDocs = adapterFun$$1('allDocs', async function (opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = clone(opts);\n\n // List of parameters to add to the GET request\n const params = {};\n let body;\n let method = 'GET';\n\n if (opts.conflicts) {\n params.conflicts = true;\n }\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n params.update_seq = true;\n }\n\n if (opts.descending) {\n params.descending = true;\n }\n\n if (opts.include_docs) {\n params.include_docs = true;\n }\n\n // added in CouchDB 1.6.0\n if (opts.attachments) {\n params.attachments = true;\n }\n\n if (opts.key) {\n params.key = JSON.stringify(opts.key);\n }\n\n if (opts.start_key) {\n opts.startkey = opts.start_key;\n }\n\n if (opts.startkey) {\n params.startkey = JSON.stringify(opts.startkey);\n }\n\n if (opts.end_key) {\n opts.endkey = opts.end_key;\n }\n\n if (opts.endkey) {\n params.endkey = JSON.stringify(opts.endkey);\n }\n\n if (typeof opts.inclusive_end !== 'undefined') {\n params.inclusive_end = !!opts.inclusive_end;\n }\n\n if (typeof opts.limit !== 'undefined') {\n params.limit = opts.limit;\n }\n\n if (typeof opts.skip !== 'undefined') {\n params.skip = opts.skip;\n }\n\n const paramStr = paramsToStr(params);\n\n if (typeof opts.keys !== 'undefined') {\n method = 'POST';\n body = {keys: opts.keys};\n }\n\n try {\n const result = await fetchJSON(genDBUrl(host, '_all_docs' + paramStr), {\n method,\n body: JSON.stringify(body)\n });\n if (opts.include_docs && opts.attachments && opts.binary) {\n result.data.rows.forEach(readAttachmentsAsBlobOrBuffer);\n }\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n // Get a list of changes made to documents in the database given by host.\n // TODO According to the README, there should be two other methods here,\n // api.changes.addListener and api.changes.removeListener.\n api._changes = function (opts) {\n\n // We internally page the results of a changes request, this means\n // if there is a large set of changes to be returned we can start\n // processing them quicker instead of waiting on the entire\n // set of changes to return and attempting to process them at once\n const batchSize = 'batch_size' in opts ? opts.batch_size : CHANGES_BATCH_SIZE;\n\n opts = clone(opts);\n\n if (opts.continuous && !('heartbeat' in opts)) {\n opts.heartbeat = DEFAULT_HEARTBEAT;\n }\n\n let requestTimeout = ('timeout' in opts) ? opts.timeout : 30 * 1000;\n\n // ensure CHANGES_TIMEOUT_BUFFER applies\n if ('timeout' in opts && opts.timeout &&\n (requestTimeout - opts.timeout) < CHANGES_TIMEOUT_BUFFER) {\n requestTimeout = opts.timeout + CHANGES_TIMEOUT_BUFFER;\n }\n\n /* istanbul ignore if */\n if ('heartbeat' in opts && opts.heartbeat &&\n (requestTimeout - opts.heartbeat) < CHANGES_TIMEOUT_BUFFER) {\n requestTimeout = opts.heartbeat + CHANGES_TIMEOUT_BUFFER;\n }\n\n const params = {};\n if ('timeout' in opts && opts.timeout) {\n params.timeout = opts.timeout;\n }\n\n const limit = (typeof opts.limit !== 'undefined') ? opts.limit : false;\n let leftToFetch = limit;\n\n if (opts.style) {\n params.style = opts.style;\n }\n\n if (opts.include_docs || opts.filter && typeof opts.filter === 'function') {\n params.include_docs = true;\n }\n\n if (opts.attachments) {\n params.attachments = true;\n }\n\n if (opts.continuous) {\n params.feed = 'longpoll';\n }\n\n if (opts.seq_interval) {\n params.seq_interval = opts.seq_interval;\n }\n\n if (opts.conflicts) {\n params.conflicts = true;\n }\n\n if (opts.descending) {\n params.descending = true;\n }\n\n /* istanbul ignore if */\n if (opts.update_seq) {\n params.update_seq = true;\n }\n\n if ('heartbeat' in opts) {\n // If the heartbeat value is false, it disables the default heartbeat\n if (opts.heartbeat) {\n params.heartbeat = opts.heartbeat;\n }\n }\n\n if (opts.filter && typeof opts.filter === 'string') {\n params.filter = opts.filter;\n }\n\n if (opts.view && typeof opts.view === 'string') {\n params.filter = '_view';\n params.view = opts.view;\n }\n\n // If opts.query_params exists, pass it through to the changes request.\n // These parameters may be used by the filter on the source database.\n if (opts.query_params && typeof opts.query_params === 'object') {\n for (const param_name in opts.query_params) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(opts.query_params, param_name)) {\n params[param_name] = opts.query_params[param_name];\n }\n }\n }\n\n let method = 'GET';\n let body;\n\n if (opts.doc_ids) {\n // set this automagically for the user; it's annoying that couchdb\n // requires both a \"filter\" and a \"doc_ids\" param.\n params.filter = '_doc_ids';\n method = 'POST';\n body = {doc_ids: opts.doc_ids };\n }\n /* istanbul ignore next */\n else if (opts.selector) {\n // set this automagically for the user, similar to above\n params.filter = '_selector';\n method = 'POST';\n body = {selector: opts.selector };\n }\n\n const controller = new AbortController();\n let lastFetchedSeq;\n\n // Get all the changes starting with the one immediately after the\n // sequence number given by since.\n const fetchData = async function (since, callback) {\n if (opts.aborted) {\n return;\n }\n params.since = since;\n // \"since\" can be any kind of json object in Cloudant/CouchDB 2.x\n /* istanbul ignore next */\n if (typeof params.since === \"object\") {\n params.since = JSON.stringify(params.since);\n }\n\n if (opts.descending) {\n if (limit) {\n params.limit = leftToFetch;\n }\n } else {\n params.limit = (!limit || leftToFetch > batchSize) ?\n batchSize : leftToFetch;\n }\n\n // Set the options for the ajax call\n const url = genDBUrl(host, '_changes' + paramsToStr(params));\n const fetchOpts = {\n signal: controller.signal,\n method,\n body: JSON.stringify(body)\n };\n lastFetchedSeq = since;\n\n /* istanbul ignore if */\n if (opts.aborted) {\n return;\n }\n\n // Get the changes\n try {\n await setup();\n const result = await fetchJSON(url, fetchOpts);\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n };\n\n // If opts.since exists, get all the changes from the sequence\n // number given by opts.since. Otherwise, get all the changes\n // from the sequence number 0.\n const results = {results: []};\n\n const fetched = function (err, res) {\n if (opts.aborted) {\n return;\n }\n let raw_results_length = 0;\n // If the result of the ajax call (res) contains changes (res.results)\n if (res && res.results) {\n raw_results_length = res.results.length;\n results.last_seq = res.last_seq;\n let pending = null;\n let lastSeq = null;\n // Attach 'pending' property if server supports it (CouchDB 2.0+)\n /* istanbul ignore if */\n if (typeof res.pending === 'number') {\n pending = res.pending;\n }\n if (typeof results.last_seq === 'string' || typeof results.last_seq === 'number') {\n lastSeq = results.last_seq;\n }\n // For each change\n const req = {};\n req.query = opts.query_params;\n res.results = res.results.filter(function (c) {\n leftToFetch--;\n const ret = filterChange(opts)(c);\n if (ret) {\n if (opts.include_docs && opts.attachments && opts.binary) {\n readAttachmentsAsBlobOrBuffer(c);\n }\n if (opts.return_docs) {\n results.results.push(c);\n }\n opts.onChange(c, pending, lastSeq);\n }\n return ret;\n });\n } else if (err) {\n // In case of an error, stop listening for changes and call\n // opts.complete\n opts.aborted = true;\n opts.complete(err);\n return;\n }\n\n // The changes feed may have timed out with no results\n // if so reuse last update sequence\n if (res && res.last_seq) {\n lastFetchedSeq = res.last_seq;\n }\n\n const finished = (limit && leftToFetch <= 0) ||\n (res && raw_results_length < batchSize) ||\n (opts.descending);\n\n if ((opts.continuous && !(limit && leftToFetch <= 0)) || !finished) {\n // Queue a call to fetch again with the newest sequence number\n nextTick(function () { fetchData(lastFetchedSeq, fetched); });\n } else {\n // We're done, call the callback\n opts.complete(null, results);\n }\n };\n\n fetchData(opts.since || 0, fetched);\n\n // Return a method to cancel this method from processing any more\n return {\n cancel: function () {\n opts.aborted = true;\n controller.abort();\n }\n };\n };\n\n // Given a set of document/revision IDs (given by req), tets the subset of\n // those that do NOT correspond to revisions stored in the database.\n // See http://wiki.apache.org/couchdb/HttpPostRevsDiff\n api.revsDiff = adapterFun$$1('revsDiff', async function (req, opts, callback) {\n // If no options were given, set the callback to be the second parameter\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n\n try {\n // Get the missing document/revision IDs\n const result = await fetchJSON(genDBUrl(host, '_revs_diff'), {\n method: 'POST',\n body: JSON.stringify(req)\n });\n callback(null, result.data);\n } catch (error) {\n callback(error);\n }\n });\n\n api._close = function (callback) {\n callback();\n };\n\n api._destroy = async function (options, callback) {\n try {\n const json = await fetchJSON(genDBUrl(host, ''), {method: 'DELETE'});\n callback(null, json);\n } catch (error) {\n if (error.status === 404) {\n callback(null, {ok: true});\n } else {\n callback(error);\n }\n }\n };\n}\n\n// HttpPouch is a valid adapter.\nHttpPouch.valid = function () {\n return true;\n};\n\nfunction HttpPouch$1 (PouchDB) {\n PouchDB.adapter('http', HttpPouch, false);\n PouchDB.adapter('https', HttpPouch, false);\n}\n\nclass QueryParseError extends Error {\n constructor(message) {\n super();\n this.status = 400;\n this.name = 'query_parse_error';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, QueryParseError);\n } catch (e) {}\n }\n}\n\nclass NotFoundError extends Error {\n constructor(message) {\n super();\n this.status = 404;\n this.name = 'not_found';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, NotFoundError);\n } catch (e) {}\n }\n}\n\nclass BuiltInError extends Error {\n constructor(message) {\n super();\n this.status = 500;\n this.name = 'invalid_value';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, BuiltInError);\n } catch (e) {}\n }\n}\n\nfunction promisedCallback(promise, callback) {\n if (callback) {\n promise.then(function (res) {\n nextTick(function () {\n callback(null, res);\n });\n }, function (reason) {\n nextTick(function () {\n callback(reason);\n });\n });\n }\n return promise;\n}\n\nfunction callbackify(fun) {\n return function (...args) {\n var cb = args.pop();\n var promise = fun.apply(this, args);\n if (typeof cb === 'function') {\n promisedCallback(promise, cb);\n }\n return promise;\n };\n}\n\n// Promise finally util similar to Q.finally\nfunction fin(promise, finalPromiseFactory) {\n return promise.then(function (res) {\n return finalPromiseFactory().then(function () {\n return res;\n });\n }, function (reason) {\n return finalPromiseFactory().then(function () {\n throw reason;\n });\n });\n}\n\nfunction sequentialize(queue, promiseFactory) {\n return function () {\n var args = arguments;\n var that = this;\n return queue.add(function () {\n return promiseFactory.apply(that, args);\n });\n };\n}\n\n// uniq an array of strings, order not guaranteed\n// similar to underscore/lodash _.uniq\nfunction uniq(arr) {\n var theSet = new Set(arr);\n var result = new Array(theSet.size);\n var index = -1;\n theSet.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\nfunction mapToKeysArray(map) {\n var result = new Array(map.size);\n var index = -1;\n map.forEach(function (value, key) {\n result[++index] = key;\n });\n return result;\n}\n\nfunction createBuiltInError(name) {\n var message = 'builtin ' + name +\n ' function requires map values to be numbers' +\n ' or number arrays';\n return new BuiltInError(message);\n}\n\nfunction sum(values) {\n var result = 0;\n for (var i = 0, len = values.length; i < len; i++) {\n var num = values[i];\n if (typeof num !== 'number') {\n if (Array.isArray(num)) {\n // lists of numbers are also allowed, sum them separately\n result = typeof result === 'number' ? [result] : result;\n for (var j = 0, jLen = num.length; j < jLen; j++) {\n var jNum = num[j];\n if (typeof jNum !== 'number') {\n throw createBuiltInError('_sum');\n } else if (typeof result[j] === 'undefined') {\n result.push(jNum);\n } else {\n result[j] += jNum;\n }\n }\n } else { // not array/number\n throw createBuiltInError('_sum');\n }\n } else if (typeof result === 'number') {\n result += num;\n } else { // add number to array\n result[0] += num;\n }\n }\n return result;\n}\n\nvar log = guardedConsole.bind(null, 'log');\nvar isArray = Array.isArray;\nvar toJSON = JSON.parse;\n\nfunction evalFunctionWithEval(func, emit) {\n return scopeEval(\n \"return (\" + func.replace(/;\\s*$/, \"\") + \");\",\n {\n emit,\n sum,\n log,\n isArray,\n toJSON\n }\n );\n}\n\n/*\n * Simple task queue to sequentialize actions. Assumes\n * callbacks will eventually fire (once).\n */\n\nclass TaskQueue$1 {\n constructor() {\n this.promise = Promise.resolve();\n }\n\n add(promiseFactory) {\n this.promise = this.promise\n // just recover\n .catch(() => { })\n .then(() => promiseFactory());\n return this.promise;\n }\n\n finish() {\n return this.promise;\n }\n}\n\nfunction stringify(input) {\n if (!input) {\n return 'undefined'; // backwards compat for empty reduce\n }\n // for backwards compat with mapreduce, functions/strings are stringified\n // as-is. everything else is JSON-stringified.\n switch (typeof input) {\n case 'function':\n // e.g. a mapreduce map\n return input.toString();\n case 'string':\n // e.g. a mapreduce built-in _reduce function\n return input.toString();\n default:\n // e.g. a JSON object in the case of mango queries\n return JSON.stringify(input);\n }\n}\n\n/* create a string signature for a view so we can cache it and uniq it */\nfunction createViewSignature(mapFun, reduceFun) {\n // the \"undefined\" part is for backwards compatibility\n return stringify(mapFun) + stringify(reduceFun) + 'undefined';\n}\n\nasync function createView(sourceDB, viewName, mapFun, reduceFun, temporary, localDocName) {\n const viewSignature = createViewSignature(mapFun, reduceFun);\n\n let cachedViews;\n if (!temporary) {\n // cache this to ensure we don't try to update the same view twice\n cachedViews = sourceDB._cachedViews = sourceDB._cachedViews || {};\n if (cachedViews[viewSignature]) {\n return cachedViews[viewSignature];\n }\n }\n\n const promiseForView = sourceDB.info().then(async function (info) {\n const depDbName = info.db_name + '-mrview-' +\n (temporary ? 'temp' : stringMd5(viewSignature));\n\n // save the view name in the source db so it can be cleaned up if necessary\n // (e.g. when the _design doc is deleted, remove all associated view data)\n function diffFunction(doc) {\n doc.views = doc.views || {};\n let fullViewName = viewName;\n if (fullViewName.indexOf('/') === -1) {\n fullViewName = viewName + '/' + viewName;\n }\n const depDbs = doc.views[fullViewName] = doc.views[fullViewName] || {};\n /* istanbul ignore if */\n if (depDbs[depDbName]) {\n return; // no update necessary\n }\n depDbs[depDbName] = true;\n return doc;\n }\n await upsert(sourceDB, '_local/' + localDocName, diffFunction);\n const res = await sourceDB.registerDependentDatabase(depDbName);\n const db = res.db;\n db.auto_compaction = true;\n const view = {\n name: depDbName,\n db,\n sourceDB,\n adapter: sourceDB.adapter,\n mapFun,\n reduceFun\n };\n\n let lastSeqDoc;\n try {\n lastSeqDoc = await view.db.get('_local/lastSeq');\n } catch (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n throw err;\n }\n }\n\n view.seq = lastSeqDoc ? lastSeqDoc.seq : 0;\n if (cachedViews) {\n view.db.once('destroyed', function () {\n delete cachedViews[viewSignature];\n });\n }\n return view;\n });\n\n if (cachedViews) {\n cachedViews[viewSignature] = promiseForView;\n }\n return promiseForView;\n}\n\nconst persistentQueues = {};\nconst tempViewQueue = new TaskQueue$1();\nconst CHANGES_BATCH_SIZE$1 = 50;\n\nfunction parseViewName(name) {\n // can be either 'ddocname/viewname' or just 'viewname'\n // (where the ddoc name is the same)\n return name.indexOf('/') === -1 ? [name, name] : name.split('/');\n}\n\nfunction isGenOne(changes) {\n // only return true if the current change is 1-\n // and there are no other leafs\n return changes.length === 1 && /^1-/.test(changes[0].rev);\n}\n\nfunction emitError(db, e, data) {\n try {\n db.emit('error', e);\n } catch (err) {\n guardedConsole('error',\n 'The user\\'s map/reduce function threw an uncaught error.\\n' +\n 'You can debug this error by doing:\\n' +\n 'myDatabase.on(\\'error\\', function (err) { debugger; });\\n' +\n 'Please double-check your map/reduce function.');\n guardedConsole('error', e, data);\n }\n}\n\n/**\n * Returns an \"abstract\" mapreduce object of the form:\n *\n * {\n * query: queryFun,\n * viewCleanup: viewCleanupFun\n * }\n *\n * Arguments are:\n *\n * localDoc: string\n * This is for the local doc that gets saved in order to track the\n * \"dependent\" DBs and clean them up for viewCleanup. It should be\n * unique, so that indexer plugins don't collide with each other.\n * mapper: function (mapFunDef, emit)\n * Returns a map function based on the mapFunDef, which in the case of\n * normal map/reduce is just the de-stringified function, but may be\n * something else, such as an object in the case of pouchdb-find.\n * reducer: function (reduceFunDef)\n * Ditto, but for reducing. Modules don't have to support reducing\n * (e.g. pouchdb-find).\n * ddocValidator: function (ddoc, viewName)\n * Throws an error if the ddoc or viewName is not valid.\n * This could be a way to communicate to the user that the configuration for the\n * indexer is invalid.\n */\nfunction createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {\n\n function tryMap(db, fun, doc) {\n // emit an event if there was an error thrown by a map function.\n // putting try/catches in a single function also avoids deoptimizations.\n try {\n fun(doc);\n } catch (e) {\n emitError(db, e, {fun, doc});\n }\n }\n\n function tryReduce(db, fun, keys, values, rereduce) {\n // same as above, but returning the result or an error. there are two separate\n // functions to avoid extra memory allocations since the tryCode() case is used\n // for custom map functions (common) vs this function, which is only used for\n // custom reduce functions (rare)\n try {\n return {output : fun(keys, values, rereduce)};\n } catch (e) {\n emitError(db, e, {fun, keys, values, rereduce});\n return {error: e};\n }\n }\n\n function sortByKeyThenValue(x, y) {\n const keyCompare = collate(x.key, y.key);\n return keyCompare !== 0 ? keyCompare : collate(x.value, y.value);\n }\n\n function sliceResults(results, limit, skip) {\n skip = skip || 0;\n if (typeof limit === 'number') {\n return results.slice(skip, limit + skip);\n } else if (skip > 0) {\n return results.slice(skip);\n }\n return results;\n }\n\n function rowToDocId(row) {\n const val = row.value;\n // Users can explicitly specify a joined doc _id, or it\n // defaults to the doc _id that emitted the key/value.\n const docId = (val && typeof val === 'object' && val._id) || row.id;\n return docId;\n }\n\n function readAttachmentsAsBlobOrBuffer(res) {\n for (const row of res.rows) {\n const atts = row.doc && row.doc._attachments;\n if (!atts) {\n continue;\n }\n for (const filename of Object.keys(atts)) {\n const att = atts[filename];\n atts[filename].data = b64ToBluffer(att.data, att.content_type);\n }\n }\n }\n\n function postprocessAttachments(opts) {\n return function (res) {\n if (opts.include_docs && opts.attachments && opts.binary) {\n readAttachmentsAsBlobOrBuffer(res);\n }\n return res;\n };\n }\n\n function addHttpParam(paramName, opts, params, asJson) {\n // add an http param from opts to params, optionally json-encoded\n let val = opts[paramName];\n if (typeof val !== 'undefined') {\n if (asJson) {\n val = encodeURIComponent(JSON.stringify(val));\n }\n params.push(paramName + '=' + val);\n }\n }\n\n function coerceInteger(integerCandidate) {\n if (typeof integerCandidate !== 'undefined') {\n const asNumber = Number(integerCandidate);\n // prevents e.g. '1foo' or '1.1' being coerced to 1\n if (!isNaN(asNumber) && asNumber === parseInt(integerCandidate, 10)) {\n return asNumber;\n } else {\n return integerCandidate;\n }\n }\n }\n\n function coerceOptions(opts) {\n opts.group_level = coerceInteger(opts.group_level);\n opts.limit = coerceInteger(opts.limit);\n opts.skip = coerceInteger(opts.skip);\n return opts;\n }\n\n function checkPositiveInteger(number) {\n if (number) {\n if (typeof number !== 'number') {\n return new QueryParseError(`Invalid value for integer: \"${number}\"`);\n }\n if (number < 0) {\n return new QueryParseError(`Invalid value for positive integer: \"${number}\"`);\n }\n }\n }\n\n function checkQueryParseError(options, fun) {\n const startkeyName = options.descending ? 'endkey' : 'startkey';\n const endkeyName = options.descending ? 'startkey' : 'endkey';\n\n if (typeof options[startkeyName] !== 'undefined' &&\n typeof options[endkeyName] !== 'undefined' &&\n collate(options[startkeyName], options[endkeyName]) > 0) {\n throw new QueryParseError('No rows can match your key range, ' +\n 'reverse your start_key and end_key or set {descending : true}');\n } else if (fun.reduce && options.reduce !== false) {\n if (options.include_docs) {\n throw new QueryParseError('{include_docs:true} is invalid for reduce');\n } else if (options.keys && options.keys.length > 1 &&\n !options.group && !options.group_level) {\n throw new QueryParseError('Multi-key fetches for reduce views must use ' +\n '{group: true}');\n }\n }\n for (const optionName of ['group_level', 'limit', 'skip']) {\n const error = checkPositiveInteger(options[optionName]);\n if (error) {\n throw error;\n }\n }\n }\n\n async function httpQuery(db, fun, opts) {\n // List of parameters to add to the PUT request\n let params = [];\n let body;\n let method = 'GET';\n let ok;\n\n // If opts.reduce exists and is defined, then add it to the list\n // of parameters.\n // If reduce=false then the results are that of only the map function\n // not the final result of map and reduce.\n addHttpParam('reduce', opts, params);\n addHttpParam('include_docs', opts, params);\n addHttpParam('attachments', opts, params);\n addHttpParam('limit', opts, params);\n addHttpParam('descending', opts, params);\n addHttpParam('group', opts, params);\n addHttpParam('group_level', opts, params);\n addHttpParam('skip', opts, params);\n addHttpParam('stale', opts, params);\n addHttpParam('conflicts', opts, params);\n addHttpParam('startkey', opts, params, true);\n addHttpParam('start_key', opts, params, true);\n addHttpParam('endkey', opts, params, true);\n addHttpParam('end_key', opts, params, true);\n addHttpParam('inclusive_end', opts, params);\n addHttpParam('key', opts, params, true);\n addHttpParam('update_seq', opts, params);\n\n // Format the list of parameters into a valid URI query string\n params = params.join('&');\n params = params === '' ? '' : '?' + params;\n\n // If keys are supplied, issue a POST to circumvent GET query string limits\n // see http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options\n if (typeof opts.keys !== 'undefined') {\n const MAX_URL_LENGTH = 2000;\n // according to http://stackoverflow.com/a/417184/680742,\n // the de facto URL length limit is 2000 characters\n\n const keysAsString = `keys=${encodeURIComponent(JSON.stringify(opts.keys))}`;\n if (keysAsString.length + params.length + 1 <= MAX_URL_LENGTH) {\n // If the keys are short enough, do a GET. we do this to work around\n // Safari not understanding 304s on POSTs (see pouchdb/pouchdb#1239)\n params += (params[0] === '?' ? '&' : '?') + keysAsString;\n } else {\n method = 'POST';\n if (typeof fun === 'string') {\n body = {keys: opts.keys};\n } else { // fun is {map : mapfun}, so append to this\n fun.keys = opts.keys;\n }\n }\n }\n\n // We are referencing a query defined in the design doc\n if (typeof fun === 'string') {\n const parts = parseViewName(fun);\n\n const response = await db.fetch('_design/' + parts[0] + '/_view/' + parts[1] + params, {\n headers: new h({'Content-Type': 'application/json'}),\n method,\n body: JSON.stringify(body)\n });\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n // fail the entire request if the result contains an error\n for (const row of result.rows) {\n /* istanbul ignore if */\n if (row.value && row.value.error && row.value.error === \"builtin_reduce_error\") {\n throw new Error(row.reason);\n }\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // We are using a temporary view, terrible for performance, good for testing\n body = body || {};\n for (const key of Object.keys(fun)) {\n if (Array.isArray(fun[key])) {\n body[key] = fun[key];\n } else {\n body[key] = fun[key].toString();\n }\n }\n\n const response = await db.fetch('_temp_view' + params, {\n headers: new h({'Content-Type': 'application/json'}),\n method: 'POST',\n body: JSON.stringify(body)\n });\n\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // custom adapters can define their own api._query\n // and override the default behavior\n /* istanbul ignore next */\n function customQuery(db, fun, opts) {\n return new Promise(function (resolve, reject) {\n db._query(fun, opts, function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n // custom adapters can define their own api._viewCleanup\n // and override the default behavior\n /* istanbul ignore next */\n function customViewCleanup(db) {\n return new Promise(function (resolve, reject) {\n db._viewCleanup(function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n function defaultsTo(value) {\n return function (reason) {\n /* istanbul ignore else */\n if (reason.status === 404) {\n return value;\n } else {\n throw reason;\n }\n };\n }\n\n // returns a promise for a list of docs to update, based on the input docId.\n // the order doesn't matter, because post-3.2.0, bulkDocs\n // is an atomic operation in all three adapters.\n async function getDocsToPersist(docId, view, docIdsToChangesAndEmits) {\n const metaDocId = '_local/doc_' + docId;\n const defaultMetaDoc = {_id: metaDocId, keys: []};\n const docData = docIdsToChangesAndEmits.get(docId);\n const indexableKeysToKeyValues = docData[0];\n const changes = docData[1];\n\n function getMetaDoc() {\n if (isGenOne(changes)) {\n // generation 1, so we can safely assume initial state\n // for performance reasons (avoids unnecessary GETs)\n return Promise.resolve(defaultMetaDoc);\n }\n return view.db.get(metaDocId).catch(defaultsTo(defaultMetaDoc));\n }\n\n function getKeyValueDocs(metaDoc) {\n if (!metaDoc.keys.length) {\n // no keys, no need for a lookup\n return Promise.resolve({rows: []});\n }\n return view.db.allDocs({\n keys: metaDoc.keys,\n include_docs: true\n });\n }\n\n function processKeyValueDocs(metaDoc, kvDocsRes) {\n const kvDocs = [];\n const oldKeys = new Set();\n\n for (const row of kvDocsRes.rows) {\n const doc = row.doc;\n if (!doc) { // deleted\n continue;\n }\n kvDocs.push(doc);\n oldKeys.add(doc._id);\n doc._deleted = !indexableKeysToKeyValues.has(doc._id);\n if (!doc._deleted) {\n const keyValue = indexableKeysToKeyValues.get(doc._id);\n if ('value' in keyValue) {\n doc.value = keyValue.value;\n }\n }\n }\n const newKeys = mapToKeysArray(indexableKeysToKeyValues);\n for (const key of newKeys) {\n if (!oldKeys.has(key)) {\n // new doc\n const kvDoc = {\n _id: key\n };\n const keyValue = indexableKeysToKeyValues.get(key);\n if ('value' in keyValue) {\n kvDoc.value = keyValue.value;\n }\n kvDocs.push(kvDoc);\n }\n }\n metaDoc.keys = uniq(newKeys.concat(metaDoc.keys));\n kvDocs.push(metaDoc);\n\n return kvDocs;\n }\n\n const metaDoc = await getMetaDoc();\n const keyValueDocs = await getKeyValueDocs(metaDoc);\n return processKeyValueDocs(metaDoc, keyValueDocs);\n }\n\n function updatePurgeSeq(view) {\n // with this approach, we just assume to have processed all missing purges and write the latest\n // purgeSeq into the _local/purgeSeq doc.\n return view.sourceDB.get('_local/purges').then(function (res) {\n const purgeSeq = res.purgeSeq;\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res._rev;\n })\n .catch(defaultsTo(undefined))\n .then(function (rev$$1) {\n return view.db.put({\n _id: '_local/purgeSeq',\n _rev: rev$$1,\n purgeSeq,\n });\n });\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n });\n }\n\n // updates all emitted key/value docs and metaDocs in the mrview database\n // for the given batch of documents from the source database\n function saveKeyValues(view, docIdsToChangesAndEmits, seq) {\n var seqDocId = '_local/lastSeq';\n return view.db.get(seqDocId)\n .catch(defaultsTo({_id: seqDocId, seq: 0}))\n .then(function (lastSeqDoc) {\n var docIds = mapToKeysArray(docIdsToChangesAndEmits);\n return Promise.all(docIds.map(function (docId) {\n return getDocsToPersist(docId, view, docIdsToChangesAndEmits);\n })).then(function (listOfDocsToPersist) {\n var docsToPersist = listOfDocsToPersist.flat();\n lastSeqDoc.seq = seq;\n docsToPersist.push(lastSeqDoc);\n // write all docs in a single operation, update the seq once\n return view.db.bulkDocs({docs : docsToPersist});\n })\n // TODO: this should be placed somewhere else, probably? we're querying both docs twice\n // (first time when getting the actual purges).\n .then(() => updatePurgeSeq(view));\n });\n }\n\n function getQueue(view) {\n const viewName = typeof view === 'string' ? view : view.name;\n let queue = persistentQueues[viewName];\n if (!queue) {\n queue = persistentQueues[viewName] = new TaskQueue$1();\n }\n return queue;\n }\n\n async function updateView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return updateViewInQueue(view, opts);\n })();\n }\n\n async function updateViewInQueue(view, opts) {\n // bind the emit function once\n let mapResults;\n let doc;\n let taskId;\n\n function emit(key, value) {\n const output = {id: doc._id, key: normalizeKey(key)};\n // Don't explicitly store the value unless it's defined and non-null.\n // This saves on storage space, because often people don't use it.\n if (typeof value !== 'undefined' && value !== null) {\n output.value = normalizeKey(value);\n }\n mapResults.push(output);\n }\n\n const mapFun = mapper(view.mapFun, emit);\n\n let currentSeq = view.seq || 0;\n\n function createTask() {\n return view.sourceDB.info().then(function (info) {\n taskId = view.sourceDB.activeTasks.add({\n name: 'view_indexing',\n total_items: info.update_seq - currentSeq,\n });\n });\n }\n\n function processChange(docIdsToChangesAndEmits, seq) {\n return function () {\n return saveKeyValues(view, docIdsToChangesAndEmits, seq);\n };\n }\n\n let indexed_docs = 0;\n const progress = {\n view: view.name,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n\n const queue = new TaskQueue$1();\n\n async function processNextBatch() {\n const response = await view.sourceDB.changes({\n return_docs: true,\n conflicts: true,\n include_docs: true,\n style: 'all_docs',\n since: currentSeq,\n limit: opts.changes_batch_size\n });\n const purges = await getRecentPurges();\n return processBatch(response, purges);\n }\n\n function getRecentPurges() {\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res.purgeSeq;\n })\n .catch(defaultsTo(-1))\n .then(function (purgeSeq) {\n return view.sourceDB.get('_local/purges').then(function (res) {\n const recentPurges = res.purges.filter(function (purge, index) {\n return index > purgeSeq;\n }).map((purge) => purge.docId);\n\n const uniquePurges = recentPurges.filter(function (docId, index) {\n return recentPurges.indexOf(docId) === index;\n });\n\n return Promise.all(uniquePurges.map(function (docId) {\n return view.sourceDB.get(docId).then(function (doc) {\n return { docId, doc };\n })\n .catch(defaultsTo({ docId }));\n }));\n })\n .catch(defaultsTo([]));\n });\n }\n\n function processBatch(response, purges) {\n const results = response.results;\n if (!results.length && !purges.length) {\n return;\n }\n\n for (const purge of purges) {\n const index = results.findIndex(function (change) {\n return change.id === purge.docId;\n });\n if (index < 0) {\n // mimic a db.remove() on the changes feed\n const entry = {\n _id: purge.docId,\n doc: {\n _id: purge.docId,\n _deleted: 1,\n },\n changes: [],\n };\n\n if (purge.doc) {\n // update with new winning rev after purge\n entry.doc = purge.doc;\n entry.changes.push({ rev: purge.doc._rev });\n }\n\n results.push(entry);\n }\n }\n\n const docIdsToChangesAndEmits = createDocIdsToChangesAndEmits(results);\n\n queue.add(processChange(docIdsToChangesAndEmits, currentSeq));\n\n indexed_docs = indexed_docs + results.length;\n const progress = {\n view: view.name,\n last_seq: response.last_seq,\n results_count: results.length,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n view.sourceDB.activeTasks.update(taskId, {completed_items: indexed_docs});\n\n if (results.length < opts.changes_batch_size) {\n return;\n }\n return processNextBatch();\n }\n\n function createDocIdsToChangesAndEmits(results) {\n const docIdsToChangesAndEmits = new Map();\n for (const change of results) {\n if (change.doc._id[0] !== '_') {\n mapResults = [];\n doc = change.doc;\n\n if (!doc._deleted) {\n tryMap(view.sourceDB, mapFun, doc);\n }\n mapResults.sort(sortByKeyThenValue);\n\n const indexableKeysToKeyValues = createIndexableKeysToKeyValues(mapResults);\n docIdsToChangesAndEmits.set(change.doc._id, [\n indexableKeysToKeyValues,\n change.changes\n ]);\n }\n currentSeq = change.seq;\n }\n return docIdsToChangesAndEmits;\n }\n\n function createIndexableKeysToKeyValues(mapResults) {\n const indexableKeysToKeyValues = new Map();\n let lastKey;\n for (let i = 0, len = mapResults.length; i < len; i++) {\n const emittedKeyValue = mapResults[i];\n const complexKey = [emittedKeyValue.key, emittedKeyValue.id];\n if (i > 0 && collate(emittedKeyValue.key, lastKey) === 0) {\n complexKey.push(i); // dup key+id, so make it unique\n }\n indexableKeysToKeyValues.set(toIndexableString(complexKey), emittedKeyValue);\n lastKey = emittedKeyValue.key;\n }\n return indexableKeysToKeyValues;\n }\n\n try {\n await createTask();\n await processNextBatch();\n await queue.finish();\n view.seq = currentSeq;\n view.sourceDB.activeTasks.remove(taskId);\n } catch (error) {\n view.sourceDB.activeTasks.remove(taskId, error);\n }\n }\n\n function reduceView(view, results, options) {\n if (options.group_level === 0) {\n delete options.group_level;\n }\n\n const shouldGroup = options.group || options.group_level;\n const reduceFun = reducer(view.reduceFun);\n const groups = [];\n const lvl = isNaN(options.group_level)\n ? Number.POSITIVE_INFINITY\n : options.group_level;\n\n for (const result of results) {\n const last = groups[groups.length - 1];\n let groupKey = shouldGroup ? result.key : null;\n\n // only set group_level for array keys\n if (shouldGroup && Array.isArray(groupKey)) {\n groupKey = groupKey.slice(0, lvl);\n }\n\n if (last && collate(last.groupKey, groupKey) === 0) {\n last.keys.push([result.key, result.id]);\n last.values.push(result.value);\n continue;\n }\n groups.push({\n keys: [[result.key, result.id]],\n values: [result.value],\n groupKey\n });\n }\n\n results = [];\n for (const group of groups) {\n const reduceTry = tryReduce(view.sourceDB, reduceFun, group.keys, group.values, false);\n if (reduceTry.error && reduceTry.error instanceof BuiltInError) {\n // CouchDB returns an error if a built-in errors out\n throw reduceTry.error;\n }\n results.push({\n // CouchDB just sets the value to null if a non-built-in errors out\n value: reduceTry.error ? null : reduceTry.output,\n key: group.groupKey\n });\n }\n // no total_rows/offset when reducing\n return { rows: sliceResults(results, options.limit, options.skip) };\n }\n\n function queryView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return queryViewInQueue(view, opts);\n })();\n }\n\n async function queryViewInQueue(view, opts) {\n let totalRows;\n const shouldReduce = view.reduceFun && opts.reduce !== false;\n const skip = opts.skip || 0;\n if (typeof opts.keys !== 'undefined' && !opts.keys.length) {\n // equivalent query\n opts.limit = 0;\n delete opts.keys;\n }\n\n async function fetchFromView(viewOpts) {\n viewOpts.include_docs = true;\n const res = await view.db.allDocs(viewOpts);\n totalRows = res.total_rows;\n\n return res.rows.map(function (result) {\n // implicit migration - in older versions of PouchDB,\n // we explicitly stored the doc as {id: ..., key: ..., value: ...}\n // this is tested in a migration test\n /* istanbul ignore next */\n if ('value' in result.doc && typeof result.doc.value === 'object' &&\n result.doc.value !== null) {\n const keys = Object.keys(result.doc.value).sort();\n // this detection method is not perfect, but it's unlikely the user\n // emitted a value which was an object with these 3 exact keys\n const expectedKeys = ['id', 'key', 'value'];\n if (!(keys < expectedKeys || keys > expectedKeys)) {\n return result.doc.value;\n }\n }\n\n const parsedKeyAndDocId = parseIndexableString(result.doc._id);\n return {\n key: parsedKeyAndDocId[0],\n id: parsedKeyAndDocId[1],\n value: ('value' in result.doc ? result.doc.value : null)\n };\n });\n }\n\n async function onMapResultsReady(rows) {\n let finalResults;\n if (shouldReduce) {\n finalResults = reduceView(view, rows, opts);\n } else if (typeof opts.keys === 'undefined') {\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows\n };\n } else {\n // support limit, skip for keys query\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows: sliceResults(rows,opts.limit,opts.skip)\n };\n }\n /* istanbul ignore if */\n if (opts.update_seq) {\n finalResults.update_seq = view.seq;\n }\n if (opts.include_docs) {\n const docIds = uniq(rows.map(rowToDocId));\n\n const allDocsRes = await view.sourceDB.allDocs({\n keys: docIds,\n include_docs: true,\n conflicts: opts.conflicts,\n attachments: opts.attachments,\n binary: opts.binary\n });\n const docIdsToDocs = new Map();\n for (const row of allDocsRes.rows) {\n docIdsToDocs.set(row.id, row.doc);\n }\n for (const row of rows) {\n const docId = rowToDocId(row);\n const doc = docIdsToDocs.get(docId);\n if (doc) {\n row.doc = doc;\n }\n }\n }\n return finalResults;\n }\n\n if (typeof opts.keys !== 'undefined') {\n const keys = opts.keys;\n const fetchPromises = keys.map(function (key) {\n const viewOpts = {\n startkey : toIndexableString([key]),\n endkey : toIndexableString([key, {}])\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n return fetchFromView(viewOpts);\n });\n const result = await Promise.all(fetchPromises);\n const flattenedResult = result.flat();\n return onMapResultsReady(flattenedResult);\n } else { // normal query, no 'keys'\n const viewOpts = {\n descending : opts.descending\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n let startkey;\n let endkey;\n if ('start_key' in opts) {\n startkey = opts.start_key;\n }\n if ('startkey' in opts) {\n startkey = opts.startkey;\n }\n if ('end_key' in opts) {\n endkey = opts.end_key;\n }\n if ('endkey' in opts) {\n endkey = opts.endkey;\n }\n if (typeof startkey !== 'undefined') {\n viewOpts.startkey = opts.descending ?\n toIndexableString([startkey, {}]) :\n toIndexableString([startkey]);\n }\n if (typeof endkey !== 'undefined') {\n let inclusiveEnd = opts.inclusive_end !== false;\n if (opts.descending) {\n inclusiveEnd = !inclusiveEnd;\n }\n\n viewOpts.endkey = toIndexableString(\n inclusiveEnd ? [endkey, {}] : [endkey]);\n }\n if (typeof opts.key !== 'undefined') {\n const keyStart = toIndexableString([opts.key]);\n const keyEnd = toIndexableString([opts.key, {}]);\n if (viewOpts.descending) {\n viewOpts.endkey = keyStart;\n viewOpts.startkey = keyEnd;\n } else {\n viewOpts.startkey = keyStart;\n viewOpts.endkey = keyEnd;\n }\n }\n if (!shouldReduce) {\n if (typeof opts.limit === 'number') {\n viewOpts.limit = opts.limit;\n }\n viewOpts.skip = skip;\n }\n\n const result = await fetchFromView(viewOpts);\n return onMapResultsReady(result);\n }\n }\n\n async function httpViewCleanup(db) {\n const response = await db.fetch('_view_cleanup', {\n headers: new h({'Content-Type': 'application/json'}),\n method: 'POST'\n });\n return response.json();\n }\n\n async function localViewCleanup(db) {\n try {\n const metaDoc = await db.get('_local/' + localDocName);\n const docsToViews = new Map();\n\n for (const fullViewName of Object.keys(metaDoc.views)) {\n const parts = parseViewName(fullViewName);\n const designDocName = '_design/' + parts[0];\n const viewName = parts[1];\n let views = docsToViews.get(designDocName);\n if (!views) {\n views = new Set();\n docsToViews.set(designDocName, views);\n }\n views.add(viewName);\n }\n const opts = {\n keys : mapToKeysArray(docsToViews),\n include_docs : true\n };\n\n const res = await db.allDocs(opts);\n const viewsToStatus = {};\n for (const row of res.rows) {\n const ddocName = row.key.substring(8); // cuts off '_design/'\n for (const viewName of docsToViews.get(row.key)) {\n let fullViewName = ddocName + '/' + viewName;\n /* istanbul ignore if */\n if (!metaDoc.views[fullViewName]) {\n // new format, without slashes, to support PouchDB 2.2.0\n // migration test in pouchdb's browser.migration.js verifies this\n fullViewName = viewName;\n }\n const viewDBNames = Object.keys(metaDoc.views[fullViewName]);\n // design doc deleted, or view function nonexistent\n const statusIsGood = row.doc && row.doc.views &&\n row.doc.views[viewName];\n for (const viewDBName of viewDBNames) {\n viewsToStatus[viewDBName] = viewsToStatus[viewDBName] || statusIsGood;\n }\n }\n }\n\n const dbsToDelete = Object.keys(viewsToStatus)\n .filter(function (viewDBName) { return !viewsToStatus[viewDBName]; });\n\n const destroyPromises = dbsToDelete.map(function (viewDBName) {\n return sequentialize(getQueue(viewDBName), function () {\n return new db.constructor(viewDBName, db.__opts).destroy();\n })();\n });\n\n return Promise.all(destroyPromises).then(function () {\n return {ok: true};\n });\n } catch (err) {\n if (err.status === 404) {\n return {ok: true};\n } else {\n throw err;\n }\n }\n }\n\n async function queryPromised(db, fun, opts) {\n /* istanbul ignore next */\n if (typeof db._query === 'function') {\n return customQuery(db, fun, opts);\n }\n if (isRemote(db)) {\n return httpQuery(db, fun, opts);\n }\n\n const updateViewOpts = {\n changes_batch_size: db.__opts.view_update_changes_batch_size || CHANGES_BATCH_SIZE$1\n };\n\n if (typeof fun !== 'string') {\n // temp_view\n checkQueryParseError(opts, fun);\n\n tempViewQueue.add(async function () {\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ 'temp_view/temp_view',\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ true,\n /* localDocName */ localDocName);\n\n return fin(updateView(view, updateViewOpts).then(\n function () { return queryView(view, opts); }),\n function () { return view.db.destroy(); }\n );\n });\n return tempViewQueue.finish();\n } else {\n // persistent view\n const fullViewName = fun;\n const parts = parseViewName(fullViewName);\n const designDocName = parts[0];\n const viewName = parts[1];\n\n const doc = await db.get('_design/' + designDocName);\n fun = doc.views && doc.views[viewName];\n\n if (!fun) {\n // basic validator; it's assumed that every subclass would want this\n throw new NotFoundError(`ddoc ${doc._id} has no view named ${viewName}`);\n }\n\n ddocValidator(doc, viewName);\n checkQueryParseError(opts, fun);\n\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ fullViewName,\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ false,\n /* localDocName */ localDocName);\n\n if (opts.stale === 'ok' || opts.stale === 'update_after') {\n if (opts.stale === 'update_after') {\n nextTick(function () {\n updateView(view, updateViewOpts);\n });\n }\n return queryView(view, opts);\n } else { // stale not ok\n await updateView(view, updateViewOpts);\n return queryView(view, opts);\n }\n }\n }\n\n function abstractQuery(fun, opts, callback) {\n const db = this;\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = opts ? coerceOptions(opts) : {};\n\n if (typeof fun === 'function') {\n fun = {map : fun};\n }\n\n const promise = Promise.resolve().then(function () {\n return queryPromised(db, fun, opts);\n });\n promisedCallback(promise, callback);\n return promise;\n }\n\n const abstractViewCleanup = callbackify(function () {\n const db = this;\n /* istanbul ignore next */\n if (typeof db._viewCleanup === 'function') {\n return customViewCleanup(db);\n }\n if (isRemote(db)) {\n return httpViewCleanup(db);\n }\n return localViewCleanup(db);\n });\n\n return {\n query: abstractQuery,\n viewCleanup: abstractViewCleanup\n };\n}\n\nvar builtInReduce = {\n _sum: function (keys, values) {\n return sum(values);\n },\n\n _count: function (keys, values) {\n return values.length;\n },\n\n _stats: function (keys, values) {\n // no need to implement rereduce=true, because Pouch\n // will never call it\n function sumsqr(values) {\n var _sumsqr = 0;\n for (var i = 0, len = values.length; i < len; i++) {\n var num = values[i];\n _sumsqr += (num * num);\n }\n return _sumsqr;\n }\n return {\n sum : sum(values),\n min : Math.min.apply(null, values),\n max : Math.max.apply(null, values),\n count : values.length,\n sumsqr : sumsqr(values)\n };\n }\n};\n\nfunction getBuiltIn(reduceFunString) {\n if (/^_sum/.test(reduceFunString)) {\n return builtInReduce._sum;\n } else if (/^_count/.test(reduceFunString)) {\n return builtInReduce._count;\n } else if (/^_stats/.test(reduceFunString)) {\n return builtInReduce._stats;\n } else if (/^_/.test(reduceFunString)) {\n throw new Error(reduceFunString + ' is not a supported reduce function.');\n }\n}\n\nfunction mapper(mapFun, emit) {\n // for temp_views one can use emit(doc, emit), see #38\n if (typeof mapFun === \"function\" && mapFun.length === 2) {\n var origMap = mapFun;\n return function (doc) {\n return origMap(doc, emit);\n };\n } else {\n return evalFunctionWithEval(mapFun.toString(), emit);\n }\n}\n\nfunction reducer(reduceFun) {\n var reduceFunString = reduceFun.toString();\n var builtIn = getBuiltIn(reduceFunString);\n if (builtIn) {\n return builtIn;\n } else {\n return evalFunctionWithEval(reduceFunString);\n }\n}\n\nfunction ddocValidator(ddoc, viewName) {\n var fun = ddoc.views && ddoc.views[viewName];\n if (typeof fun.map !== 'string') {\n throw new NotFoundError('ddoc ' + ddoc._id + ' has no string view named ' +\n viewName + ', instead found object of type: ' + typeof fun.map);\n }\n}\n\nvar localDocName = 'mrviews';\nvar abstract = createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator);\n\nfunction query(fun, opts, callback) {\n return abstract.query.call(this, fun, opts, callback);\n}\n\nfunction viewCleanup(callback) {\n return abstract.viewCleanup.call(this, callback);\n}\n\nvar mapreduce = {\n query,\n viewCleanup\n};\n\nfunction fileHasChanged(localDoc, remoteDoc, filename) {\n return !localDoc._attachments ||\n !localDoc._attachments[filename] ||\n localDoc._attachments[filename].digest !== remoteDoc._attachments[filename].digest;\n}\n\nfunction getDocAttachments(db, doc) {\n var filenames = Object.keys(doc._attachments);\n return Promise.all(filenames.map(function (filename) {\n return db.getAttachment(doc._id, filename, {rev: doc._rev});\n }));\n}\n\nfunction getDocAttachmentsFromTargetOrSource(target, src, doc) {\n var doCheckForLocalAttachments = isRemote(src) && !isRemote(target);\n var filenames = Object.keys(doc._attachments);\n\n if (!doCheckForLocalAttachments) {\n return getDocAttachments(src, doc);\n }\n\n return target.get(doc._id).then(function (localDoc) {\n return Promise.all(filenames.map(function (filename) {\n if (fileHasChanged(localDoc, doc, filename)) {\n return src.getAttachment(doc._id, filename);\n }\n\n return target.getAttachment(localDoc._id, filename);\n }));\n }).catch(function (error) {\n /* istanbul ignore if */\n if (error.status !== 404) {\n throw error;\n }\n\n return getDocAttachments(src, doc);\n });\n}\n\nfunction createBulkGetOpts(diffs) {\n var requests = [];\n Object.keys(diffs).forEach(function (id) {\n var missingRevs = diffs[id].missing;\n missingRevs.forEach(function (missingRev) {\n requests.push({\n id,\n rev: missingRev\n });\n });\n });\n\n return {\n docs: requests,\n revs: true,\n latest: true\n };\n}\n\n//\n// Fetch all the documents from the src as described in the \"diffs\",\n// which is a mapping of docs IDs to revisions. If the state ever\n// changes to \"cancelled\", then the returned promise will be rejected.\n// Else it will be resolved with a list of fetched documents.\n//\nfunction getDocs(src, target, diffs, state) {\n diffs = clone(diffs); // we do not need to modify this\n\n var resultDocs = [],\n ok = true;\n\n function getAllDocs() {\n\n var bulkGetOpts = createBulkGetOpts(diffs);\n\n if (!bulkGetOpts.docs.length) { // optimization: skip empty requests\n return;\n }\n\n return src.bulkGet(bulkGetOpts).then(function (bulkGetResponse) {\n /* istanbul ignore if */\n if (state.cancelled) {\n throw new Error('cancelled');\n }\n return Promise.all(bulkGetResponse.results.map(function (bulkGetInfo) {\n return Promise.all(bulkGetInfo.docs.map(function (doc) {\n var remoteDoc = doc.ok;\n\n if (doc.error) {\n // when AUTO_COMPACTION is set, docs can be returned which look\n // like this: {\"missing\":\"1-7c3ac256b693c462af8442f992b83696\"}\n ok = false;\n }\n\n if (!remoteDoc || !remoteDoc._attachments) {\n return remoteDoc;\n }\n\n return getDocAttachmentsFromTargetOrSource(target, src, remoteDoc).then((attachments) => {\n var filenames = Object.keys(remoteDoc._attachments);\n attachments.forEach(function (attachment, i) {\n var att = remoteDoc._attachments[filenames[i]];\n delete att.stub;\n delete att.length;\n att.data = attachment;\n });\n\n return remoteDoc;\n });\n }));\n }))\n\n .then(function (results) {\n resultDocs = resultDocs.concat(results.flat().filter(Boolean));\n });\n });\n }\n\n function returnResult() {\n return { ok, docs:resultDocs };\n }\n\n return Promise.resolve()\n .then(getAllDocs)\n .then(returnResult);\n}\n\nvar CHECKPOINT_VERSION = 1;\nvar REPLICATOR = \"pouchdb\";\n// This is an arbitrary number to limit the\n// amount of replication history we save in the checkpoint.\n// If we save too much, the checkpoint docs will become very big,\n// if we save fewer, we'll run a greater risk of having to\n// read all the changes from 0 when checkpoint PUTs fail\n// CouchDB 2.0 has a more involved history pruning,\n// but let's go for the simple version for now.\nvar CHECKPOINT_HISTORY_SIZE = 5;\nvar LOWEST_SEQ = 0;\n\nfunction updateCheckpoint(db, id, checkpoint, session, returnValue) {\n return db.get(id).catch(function (err) {\n if (err.status === 404) {\n if (db.adapter === 'http' || db.adapter === 'https') {\n explainError(\n 404, 'PouchDB is just checking if a remote checkpoint exists.'\n );\n }\n return {\n session_id: session,\n _id: id,\n history: [],\n replicator: REPLICATOR,\n version: CHECKPOINT_VERSION\n };\n }\n throw err;\n }).then(function (doc) {\n if (returnValue.cancelled) {\n return;\n }\n\n // if the checkpoint has not changed, do not update\n if (doc.last_seq === checkpoint) {\n return;\n }\n\n // Filter out current entry for this replication\n doc.history = (doc.history || []).filter(function (item) {\n return item.session_id !== session;\n });\n\n // Add the latest checkpoint to history\n doc.history.unshift({\n last_seq: checkpoint,\n session_id: session\n });\n\n // Just take the last pieces in history, to\n // avoid really big checkpoint docs.\n // see comment on history size above\n doc.history = doc.history.slice(0, CHECKPOINT_HISTORY_SIZE);\n\n doc.version = CHECKPOINT_VERSION;\n doc.replicator = REPLICATOR;\n\n doc.session_id = session;\n doc.last_seq = checkpoint;\n\n return db.put(doc).catch(function (err) {\n if (err.status === 409) {\n // retry; someone is trying to write a checkpoint simultaneously\n return updateCheckpoint(db, id, checkpoint, session, returnValue);\n }\n throw err;\n });\n });\n}\n\nclass CheckpointerInternal {\n constructor(src, target, id, returnValue, opts = {\n writeSourceCheckpoint: true,\n writeTargetCheckpoint: true,\n }) {\n this.src = src;\n this.target = target;\n this.id = id;\n this.returnValue = returnValue;\n this.opts = opts;\n\n if (typeof opts.writeSourceCheckpoint === \"undefined\") {\n opts.writeSourceCheckpoint = true;\n }\n\n if (typeof opts.writeTargetCheckpoint === \"undefined\") {\n opts.writeTargetCheckpoint = true;\n }\n }\n\n writeCheckpoint(checkpoint, session) {\n var self = this;\n return this.updateTarget(checkpoint, session).then(function () {\n return self.updateSource(checkpoint, session);\n });\n }\n\n updateTarget(checkpoint, session) {\n if (this.opts.writeTargetCheckpoint) {\n return updateCheckpoint(this.target, this.id, checkpoint,\n session, this.returnValue);\n } else {\n return Promise.resolve(true);\n }\n }\n\n updateSource(checkpoint, session) {\n if (this.opts.writeSourceCheckpoint) {\n var self = this;\n return updateCheckpoint(this.src, this.id, checkpoint,\n session, this.returnValue)\n .catch(function (err) {\n if (isForbiddenError(err)) {\n self.opts.writeSourceCheckpoint = false;\n return true;\n }\n throw err;\n });\n } else {\n return Promise.resolve(true);\n }\n }\n\n getCheckpoint() {\n var self = this;\n\n if (!self.opts.writeSourceCheckpoint && !self.opts.writeTargetCheckpoint) {\n return Promise.resolve(LOWEST_SEQ);\n }\n\n if (self.opts && self.opts.writeSourceCheckpoint && !self.opts.writeTargetCheckpoint) {\n return self.src.get(self.id).then(function (sourceDoc) {\n return sourceDoc.last_seq || LOWEST_SEQ;\n }).catch(function (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n throw err;\n }\n return LOWEST_SEQ;\n });\n }\n\n return self.target.get(self.id).then(function (targetDoc) {\n if (self.opts && self.opts.writeTargetCheckpoint && !self.opts.writeSourceCheckpoint) {\n return targetDoc.last_seq || LOWEST_SEQ;\n }\n\n return self.src.get(self.id).then(function (sourceDoc) {\n // Since we can't migrate an old version doc to a new one\n // (no session id), we just go with the lowest seq in this case\n /* istanbul ignore if */\n if (targetDoc.version !== sourceDoc.version) {\n return LOWEST_SEQ;\n }\n\n var version;\n if (targetDoc.version) {\n version = targetDoc.version.toString();\n } else {\n version = \"undefined\";\n }\n\n if (version in comparisons) {\n return comparisons[version](targetDoc, sourceDoc);\n }\n /* istanbul ignore next */\n return LOWEST_SEQ;\n }, function (err) {\n if (err.status === 404 && targetDoc.last_seq) {\n return self.src.put({\n _id: self.id,\n last_seq: LOWEST_SEQ\n }).then(function () {\n return LOWEST_SEQ;\n }, function (err) {\n if (isForbiddenError(err)) {\n self.opts.writeSourceCheckpoint = false;\n return targetDoc.last_seq;\n }\n /* istanbul ignore next */\n return LOWEST_SEQ;\n });\n }\n throw err;\n });\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n return LOWEST_SEQ;\n });\n }\n}\n\nvar comparisons = {\n \"undefined\": function (targetDoc, sourceDoc) {\n // This is the previous comparison function\n if (collate(targetDoc.last_seq, sourceDoc.last_seq) === 0) {\n return sourceDoc.last_seq;\n }\n /* istanbul ignore next */\n return 0;\n },\n \"1\": function (targetDoc, sourceDoc) {\n // This is the comparison function ported from CouchDB\n return compareReplicationLogs(sourceDoc, targetDoc).last_seq;\n }\n};\n\n// This checkpoint comparison is ported from CouchDBs source\n// they come from here:\n// https://github.com/apache/couchdb-couch-replicator/blob/master/src/couch_replicator.erl#L863-L906\n\nfunction compareReplicationLogs(srcDoc, tgtDoc) {\n if (srcDoc.session_id === tgtDoc.session_id) {\n return {\n last_seq: srcDoc.last_seq,\n history: srcDoc.history\n };\n }\n\n return compareReplicationHistory(srcDoc.history, tgtDoc.history);\n}\n\nfunction compareReplicationHistory(sourceHistory, targetHistory) {\n // the erlang loop via function arguments is not so easy to repeat in JS\n // therefore, doing this as recursion\n var S = sourceHistory[0];\n var sourceRest = sourceHistory.slice(1);\n var T = targetHistory[0];\n var targetRest = targetHistory.slice(1);\n\n if (!S || targetHistory.length === 0) {\n return {\n last_seq: LOWEST_SEQ,\n history: []\n };\n }\n\n var sourceId = S.session_id;\n /* istanbul ignore if */\n if (hasSessionId(sourceId, targetHistory)) {\n return {\n last_seq: S.last_seq,\n history: sourceHistory\n };\n }\n\n var targetId = T.session_id;\n if (hasSessionId(targetId, sourceRest)) {\n return {\n last_seq: T.last_seq,\n history: targetRest\n };\n }\n\n return compareReplicationHistory(sourceRest, targetRest);\n}\n\nfunction hasSessionId(sessionId, history) {\n var props = history[0];\n var rest = history.slice(1);\n\n if (!sessionId || history.length === 0) {\n return false;\n }\n\n if (sessionId === props.session_id) {\n return true;\n }\n\n return hasSessionId(sessionId, rest);\n}\n\nfunction isForbiddenError(err) {\n return typeof err.status === 'number' && Math.floor(err.status / 100) === 4;\n}\n\nfunction Checkpointer(src, target, id, returnValue, opts) {\n if (!(this instanceof CheckpointerInternal)) {\n return new CheckpointerInternal(src, target, id, returnValue, opts);\n }\n return Checkpointer;\n}\n\nvar STARTING_BACK_OFF = 0;\n\nfunction backOff(opts, returnValue, error, callback) {\n if (opts.retry === false) {\n returnValue.emit('error', error);\n returnValue.removeAllListeners();\n return;\n }\n /* istanbul ignore if */\n if (typeof opts.back_off_function !== 'function') {\n opts.back_off_function = defaultBackOff;\n }\n returnValue.emit('requestError', error);\n if (returnValue.state === 'active' || returnValue.state === 'pending') {\n returnValue.emit('paused', error);\n returnValue.state = 'stopped';\n var backOffSet = function backoffTimeSet() {\n opts.current_back_off = STARTING_BACK_OFF;\n };\n var removeBackOffSetter = function removeBackOffTimeSet() {\n returnValue.removeListener('active', backOffSet);\n };\n returnValue.once('paused', removeBackOffSetter);\n returnValue.once('active', backOffSet);\n }\n\n opts.current_back_off = opts.current_back_off || STARTING_BACK_OFF;\n opts.current_back_off = opts.back_off_function(opts.current_back_off);\n setTimeout(callback, opts.current_back_off);\n}\n\nfunction sortObjectPropertiesByKey(queryParams) {\n return Object.keys(queryParams).sort(collate).reduce(function (result, key) {\n result[key] = queryParams[key];\n return result;\n }, {});\n}\n\n// Generate a unique id particular to this replication.\n// Not guaranteed to align perfectly with CouchDB's rep ids.\nfunction generateReplicationId(src, target, opts) {\n var docIds = opts.doc_ids ? opts.doc_ids.sort(collate) : '';\n var filterFun = opts.filter ? opts.filter.toString() : '';\n var queryParams = '';\n var filterViewName = '';\n var selector = '';\n\n // possibility for checkpoints to be lost here as behaviour of\n // JSON.stringify is not stable (see #6226)\n /* istanbul ignore if */\n if (opts.selector) {\n selector = JSON.stringify(opts.selector);\n }\n\n if (opts.filter && opts.query_params) {\n queryParams = JSON.stringify(sortObjectPropertiesByKey(opts.query_params));\n }\n\n if (opts.filter && opts.filter === '_view') {\n filterViewName = opts.view.toString();\n }\n\n return Promise.all([src.id(), target.id()]).then(function (res) {\n var queryData = res[0] + res[1] + filterFun + filterViewName +\n queryParams + docIds + selector;\n return new Promise(function (resolve) {\n binaryMd5(queryData, resolve);\n });\n }).then(function (md5sum) {\n // can't use straight-up md5 alphabet, because\n // the char '/' is interpreted as being for attachments,\n // and + is also not url-safe\n md5sum = md5sum.replace(/\\//g, '.').replace(/\\+/g, '_');\n return '_local/' + md5sum;\n });\n}\n\nfunction replicate(src, target, opts, returnValue, result) {\n var batches = []; // list of batches to be processed\n var currentBatch; // the batch currently being processed\n var pendingBatch = {\n seq: 0,\n changes: [],\n docs: []\n }; // next batch, not yet ready to be processed\n var writingCheckpoint = false; // true while checkpoint is being written\n var changesCompleted = false; // true when all changes received\n var replicationCompleted = false; // true when replication has completed\n // initial_last_seq is the state of the source db before\n // replication started, and it is _not_ updated during\n // replication or used anywhere else, as opposed to last_seq\n var initial_last_seq = 0;\n var last_seq = 0;\n var continuous = opts.continuous || opts.live || false;\n var batch_size = opts.batch_size || 100;\n var batches_limit = opts.batches_limit || 10;\n var style = opts.style || 'all_docs';\n var changesPending = false; // true while src.changes is running\n var doc_ids = opts.doc_ids;\n var selector = opts.selector;\n var repId;\n var checkpointer;\n var changedDocs = [];\n // Like couchdb, every replication gets a unique session id\n var session = uuid();\n var taskId;\n\n result = result || {\n ok: true,\n start_time: new Date().toISOString(),\n docs_read: 0,\n docs_written: 0,\n doc_write_failures: 0,\n errors: []\n };\n\n var changesOpts = {};\n returnValue.ready(src, target);\n\n function initCheckpointer() {\n if (checkpointer) {\n return Promise.resolve();\n }\n return generateReplicationId(src, target, opts).then(function (res) {\n repId = res;\n\n var checkpointOpts = {};\n if (opts.checkpoint === false) {\n checkpointOpts = { writeSourceCheckpoint: false, writeTargetCheckpoint: false };\n } else if (opts.checkpoint === 'source') {\n checkpointOpts = { writeSourceCheckpoint: true, writeTargetCheckpoint: false };\n } else if (opts.checkpoint === 'target') {\n checkpointOpts = { writeSourceCheckpoint: false, writeTargetCheckpoint: true };\n } else {\n checkpointOpts = { writeSourceCheckpoint: true, writeTargetCheckpoint: true };\n }\n\n checkpointer = new Checkpointer(src, target, repId, returnValue, checkpointOpts);\n });\n }\n\n function writeDocs() {\n changedDocs = [];\n\n if (currentBatch.docs.length === 0) {\n return;\n }\n var docs = currentBatch.docs;\n var bulkOpts = {timeout: opts.timeout};\n return target.bulkDocs({docs, new_edits: false}, bulkOpts).then(function (res) {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n }\n\n // `res` doesn't include full documents (which live in `docs`), so we create a map of\n // (id -> error), and check for errors while iterating over `docs`\n var errorsById = Object.create(null);\n res.forEach(function (res) {\n if (res.error) {\n errorsById[res.id] = res;\n }\n });\n\n var errorsNo = Object.keys(errorsById).length;\n result.doc_write_failures += errorsNo;\n result.docs_written += docs.length - errorsNo;\n\n docs.forEach(function (doc) {\n var error = errorsById[doc._id];\n if (error) {\n result.errors.push(error);\n // Normalize error name. i.e. 'Unauthorized' -> 'unauthorized' (eg Sync Gateway)\n var errorName = (error.name || '').toLowerCase();\n if (errorName === 'unauthorized' || errorName === 'forbidden') {\n returnValue.emit('denied', clone(error));\n } else {\n throw error;\n }\n } else {\n changedDocs.push(doc);\n }\n });\n\n }, function (err) {\n result.doc_write_failures += docs.length;\n throw err;\n });\n }\n\n function finishBatch() {\n if (currentBatch.error) {\n throw new Error('There was a problem getting docs.');\n }\n result.last_seq = last_seq = currentBatch.seq;\n var outResult = clone(result);\n if (changedDocs.length) {\n outResult.docs = changedDocs;\n // Attach 'pending' property if server supports it (CouchDB 2.0+)\n /* istanbul ignore if */\n if (typeof currentBatch.pending === 'number') {\n outResult.pending = currentBatch.pending;\n delete currentBatch.pending;\n }\n returnValue.emit('change', outResult);\n }\n writingCheckpoint = true;\n\n src.info().then(function (info) {\n var task = src.activeTasks.get(taskId);\n if (!currentBatch || !task) {\n return;\n }\n\n var completed = task.completed_items || 0;\n var total_items = parseInt(info.update_seq, 10) - parseInt(initial_last_seq, 10);\n src.activeTasks.update(taskId, {\n completed_items: completed + currentBatch.changes.length,\n total_items\n });\n });\n\n return checkpointer.writeCheckpoint(currentBatch.seq,\n session).then(function () {\n returnValue.emit('checkpoint', { 'checkpoint': currentBatch.seq });\n writingCheckpoint = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n }\n currentBatch = undefined;\n getChanges();\n }).catch(function (err) {\n onCheckpointError(err);\n throw err;\n });\n }\n\n function getDiffs() {\n var diff = {};\n currentBatch.changes.forEach(function (change) {\n returnValue.emit('checkpoint', { 'revs_diff': change });\n // Couchbase Sync Gateway emits these, but we can ignore them\n /* istanbul ignore if */\n if (change.id === \"_user/\") {\n return;\n }\n diff[change.id] = change.changes.map(function (x) {\n return x.rev;\n });\n });\n return target.revsDiff(diff).then(function (diffs) {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n }\n // currentBatch.diffs elements are deleted as the documents are written\n currentBatch.diffs = diffs;\n });\n }\n\n function getBatchDocs() {\n return getDocs(src, target, currentBatch.diffs, returnValue).then(function (got) {\n currentBatch.error = !got.ok;\n got.docs.forEach(function (doc) {\n delete currentBatch.diffs[doc._id];\n result.docs_read++;\n currentBatch.docs.push(doc);\n });\n });\n }\n\n function startNextBatch() {\n if (returnValue.cancelled || currentBatch) {\n return;\n }\n if (batches.length === 0) {\n processPendingBatch(true);\n return;\n }\n currentBatch = batches.shift();\n returnValue.emit('checkpoint', { 'start_next_batch': currentBatch.seq });\n getDiffs()\n .then(getBatchDocs)\n .then(writeDocs)\n .then(finishBatch)\n .then(startNextBatch)\n .catch(function (err) {\n abortReplication('batch processing terminated with error', err);\n });\n }\n\n\n function processPendingBatch(immediate) {\n if (pendingBatch.changes.length === 0) {\n if (batches.length === 0 && !currentBatch) {\n if ((continuous && changesOpts.live) || changesCompleted) {\n returnValue.state = 'pending';\n returnValue.emit('paused');\n }\n if (changesCompleted) {\n completeReplication();\n }\n }\n return;\n }\n if (\n immediate ||\n changesCompleted ||\n pendingBatch.changes.length >= batch_size\n ) {\n batches.push(pendingBatch);\n pendingBatch = {\n seq: 0,\n changes: [],\n docs: []\n };\n if (returnValue.state === 'pending' || returnValue.state === 'stopped') {\n returnValue.state = 'active';\n returnValue.emit('active');\n }\n startNextBatch();\n }\n }\n\n\n function abortReplication(reason, err) {\n if (replicationCompleted) {\n return;\n }\n if (!err.message) {\n err.message = reason;\n }\n result.ok = false;\n result.status = 'aborting';\n batches = [];\n pendingBatch = {\n seq: 0,\n changes: [],\n docs: []\n };\n completeReplication(err);\n }\n\n\n function completeReplication(fatalError) {\n if (replicationCompleted) {\n return;\n }\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n result.status = 'cancelled';\n if (writingCheckpoint) {\n return;\n }\n }\n result.status = result.status || 'complete';\n result.end_time = new Date().toISOString();\n result.last_seq = last_seq;\n replicationCompleted = true;\n\n src.activeTasks.remove(taskId, fatalError);\n\n if (fatalError) {\n // need to extend the error because Firefox considers \".result\" read-only\n fatalError = createError(fatalError);\n fatalError.result = result;\n\n // Normalize error name. i.e. 'Unauthorized' -> 'unauthorized' (eg Sync Gateway)\n var errorName = (fatalError.name || '').toLowerCase();\n if (errorName === 'unauthorized' || errorName === 'forbidden') {\n returnValue.emit('error', fatalError);\n returnValue.removeAllListeners();\n } else {\n backOff(opts, returnValue, fatalError, function () {\n replicate(src, target, opts, returnValue);\n });\n }\n } else {\n returnValue.emit('complete', result);\n returnValue.removeAllListeners();\n }\n }\n\n function onChange(change, pending, lastSeq) {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n return completeReplication();\n }\n // Attach 'pending' property if server supports it (CouchDB 2.0+)\n /* istanbul ignore if */\n if (typeof pending === 'number') {\n pendingBatch.pending = pending;\n }\n\n var filter = filterChange(opts)(change);\n if (!filter) {\n // update processed items count by 1\n var task = src.activeTasks.get(taskId);\n if (task) {\n // we can assume that task exists here? shouldn't be deleted by here.\n var completed = task.completed_items || 0;\n src.activeTasks.update(taskId, {completed_items: ++completed});\n }\n return;\n }\n pendingBatch.seq = change.seq || lastSeq;\n pendingBatch.changes.push(change);\n returnValue.emit('checkpoint', { 'pending_batch': pendingBatch.seq });\n nextTick(function () {\n processPendingBatch(batches.length === 0 && changesOpts.live);\n });\n }\n\n\n function onChangesComplete(changes) {\n changesPending = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n return completeReplication();\n }\n\n // if no results were returned then we're done,\n // else fetch more\n if (changes.results.length > 0) {\n changesOpts.since = changes.results[changes.results.length - 1].seq;\n getChanges();\n processPendingBatch(true);\n } else {\n\n var complete = function () {\n if (continuous) {\n changesOpts.live = true;\n getChanges();\n } else {\n changesCompleted = true;\n }\n processPendingBatch(true);\n };\n\n // update the checkpoint so we start from the right seq next time\n if (!currentBatch && changes.results.length === 0) {\n writingCheckpoint = true;\n checkpointer.writeCheckpoint(changes.last_seq,\n session).then(function () {\n writingCheckpoint = false;\n result.last_seq = last_seq = changes.last_seq;\n if (returnValue.cancelled) {\n completeReplication();\n throw new Error('cancelled');\n } else {\n complete();\n }\n })\n .catch(onCheckpointError);\n } else {\n complete();\n }\n }\n }\n\n\n function onChangesError(err) {\n changesPending = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n return completeReplication();\n }\n abortReplication('changes rejected', err);\n }\n\n\n function getChanges() {\n if (!(\n !changesPending &&\n !changesCompleted &&\n batches.length < batches_limit\n )) {\n return;\n }\n changesPending = true;\n function abortChanges() {\n changes.cancel();\n }\n function removeListener() {\n returnValue.removeListener('cancel', abortChanges);\n }\n\n if (returnValue._changes) { // remove old changes() and listeners\n returnValue.removeListener('cancel', returnValue._abortChanges);\n returnValue._changes.cancel();\n }\n returnValue.once('cancel', abortChanges);\n\n var changes = src.changes(changesOpts)\n .on('change', onChange);\n changes.then(removeListener, removeListener);\n changes.then(onChangesComplete)\n .catch(onChangesError);\n\n if (opts.retry) {\n // save for later so we can cancel if necessary\n returnValue._changes = changes;\n returnValue._abortChanges = abortChanges;\n }\n }\n\n function createTask(checkpoint) {\n return src.info().then(function (info) {\n var total_items = typeof opts.since === 'undefined' ?\n parseInt(info.update_seq, 10) - parseInt(checkpoint, 10) :\n parseInt(info.update_seq, 10);\n\n taskId = src.activeTasks.add({\n name: `${continuous ? 'continuous ' : ''}replication from ${info.db_name}` ,\n total_items,\n });\n\n return checkpoint;\n });\n }\n\n function startChanges() {\n initCheckpointer().then(function () {\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n return;\n }\n return checkpointer.getCheckpoint().then(createTask).then(function (checkpoint) {\n last_seq = checkpoint;\n initial_last_seq = checkpoint;\n changesOpts = {\n since: last_seq,\n limit: batch_size,\n batch_size,\n style,\n doc_ids,\n selector,\n return_docs: true // required so we know when we're done\n };\n if (opts.filter) {\n if (typeof opts.filter !== 'string') {\n // required for the client-side filter in onChange\n changesOpts.include_docs = true;\n } else { // ddoc filter\n changesOpts.filter = opts.filter;\n }\n }\n if ('heartbeat' in opts) {\n changesOpts.heartbeat = opts.heartbeat;\n }\n if ('timeout' in opts) {\n changesOpts.timeout = opts.timeout;\n }\n if (opts.query_params) {\n changesOpts.query_params = opts.query_params;\n }\n if (opts.view) {\n changesOpts.view = opts.view;\n }\n getChanges();\n });\n }).catch(function (err) {\n abortReplication('getCheckpoint rejected with ', err);\n });\n }\n\n /* istanbul ignore next */\n function onCheckpointError(err) {\n writingCheckpoint = false;\n abortReplication('writeCheckpoint completed with error', err);\n }\n\n /* istanbul ignore if */\n if (returnValue.cancelled) { // cancelled immediately\n completeReplication();\n return;\n }\n\n if (!returnValue._addedListeners) {\n returnValue.once('cancel', completeReplication);\n\n if (typeof opts.complete === 'function') {\n returnValue.once('error', opts.complete);\n returnValue.once('complete', function (result) {\n opts.complete(null, result);\n });\n }\n returnValue._addedListeners = true;\n }\n\n if (typeof opts.since === 'undefined') {\n startChanges();\n } else {\n initCheckpointer().then(function () {\n writingCheckpoint = true;\n return checkpointer.writeCheckpoint(opts.since, session);\n }).then(function () {\n writingCheckpoint = false;\n /* istanbul ignore if */\n if (returnValue.cancelled) {\n completeReplication();\n return;\n }\n last_seq = opts.since;\n startChanges();\n }).catch(onCheckpointError);\n }\n}\n\n// We create a basic promise so the caller can cancel the replication possibly\n// before we have actually started listening to changes etc\nclass Replication extends EE {\n constructor() {\n super();\n this.cancelled = false;\n this.state = 'pending';\n const promise = new Promise((fulfill, reject) => {\n this.once('complete', fulfill);\n this.once('error', reject);\n });\n this.then = function (resolve, reject) {\n return promise.then(resolve, reject);\n };\n this.catch = function (reject) {\n return promise.catch(reject);\n };\n // As we allow error handling via \"error\" event as well,\n // put a stub in here so that rejecting never throws UnhandledError.\n this.catch(function () {});\n }\n\n cancel() {\n this.cancelled = true;\n this.state = 'cancelled';\n this.emit('cancel');\n }\n\n ready(src, target) {\n if (this._readyCalled) {\n return;\n }\n this._readyCalled = true;\n\n const onDestroy = () => {\n this.cancel();\n };\n src.once('destroyed', onDestroy);\n target.once('destroyed', onDestroy);\n function cleanup() {\n src.removeListener('destroyed', onDestroy);\n target.removeListener('destroyed', onDestroy);\n }\n this.once('complete', cleanup);\n this.once('error', cleanup);\n }\n}\n\nfunction toPouch(db, opts) {\n var PouchConstructor = opts.PouchConstructor;\n if (typeof db === 'string') {\n return new PouchConstructor(db, opts);\n } else {\n return db;\n }\n}\n\nfunction replicateWrapper(src, target, opts, callback) {\n\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n if (opts.doc_ids && !Array.isArray(opts.doc_ids)) {\n throw createError(BAD_REQUEST,\n \"`doc_ids` filter parameter is not a list.\");\n }\n\n opts.complete = callback;\n opts = clone(opts);\n opts.continuous = opts.continuous || opts.live;\n opts.retry = ('retry' in opts) ? opts.retry : false;\n opts.PouchConstructor = opts.PouchConstructor || this;\n var replicateRet = new Replication(opts);\n var srcPouch = toPouch(src, opts);\n var targetPouch = toPouch(target, opts);\n replicate(srcPouch, targetPouch, opts, replicateRet);\n return replicateRet;\n}\n\nfunction sync(src, target, opts, callback) {\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n if (typeof opts === 'undefined') {\n opts = {};\n }\n opts = clone(opts);\n opts.PouchConstructor = opts.PouchConstructor || this;\n src = toPouch(src, opts);\n target = toPouch(target, opts);\n return new Sync(src, target, opts, callback);\n}\n\nclass Sync extends EE {\n constructor(src, target, opts, callback) {\n super();\n this.canceled = false;\n\n const optsPush = opts.push ? Object.assign({}, opts, opts.push) : opts;\n const optsPull = opts.pull ? Object.assign({}, opts, opts.pull) : opts;\n\n this.push = replicateWrapper(src, target, optsPush);\n this.pull = replicateWrapper(target, src, optsPull);\n\n this.pushPaused = true;\n this.pullPaused = true;\n\n const pullChange = (change) => {\n this.emit('change', {\n direction: 'pull',\n change\n });\n };\n const pushChange = (change) => {\n this.emit('change', {\n direction: 'push',\n change\n });\n };\n const pushDenied = (doc) => {\n this.emit('denied', {\n direction: 'push',\n doc\n });\n };\n const pullDenied = (doc) => {\n this.emit('denied', {\n direction: 'pull',\n doc\n });\n };\n const pushPaused = () => {\n this.pushPaused = true;\n /* istanbul ignore if */\n if (this.pullPaused) {\n this.emit('paused');\n }\n };\n const pullPaused = () => {\n this.pullPaused = true;\n /* istanbul ignore if */\n if (this.pushPaused) {\n this.emit('paused');\n }\n };\n const pushActive = () => {\n this.pushPaused = false;\n /* istanbul ignore if */\n if (this.pullPaused) {\n this.emit('active', {\n direction: 'push'\n });\n }\n };\n const pullActive = () => {\n this.pullPaused = false;\n /* istanbul ignore if */\n if (this.pushPaused) {\n this.emit('active', {\n direction: 'pull'\n });\n }\n };\n\n let removed = {};\n\n const removeAll = (type) => { // type is 'push' or 'pull'\n return (event, func) => {\n const isChange = event === 'change' &&\n (func === pullChange || func === pushChange);\n const isDenied = event === 'denied' &&\n (func === pullDenied || func === pushDenied);\n const isPaused = event === 'paused' &&\n (func === pullPaused || func === pushPaused);\n const isActive = event === 'active' &&\n (func === pullActive || func === pushActive);\n\n if (isChange || isDenied || isPaused || isActive) {\n if (!(event in removed)) {\n removed[event] = {};\n }\n removed[event][type] = true;\n if (Object.keys(removed[event]).length === 2) {\n // both push and pull have asked to be removed\n this.removeAllListeners(event);\n }\n }\n };\n };\n\n if (opts.live) {\n this.push.on('complete', this.pull.cancel.bind(this.pull));\n this.pull.on('complete', this.push.cancel.bind(this.push));\n }\n\n function addOneListener(ee, event, listener) {\n if (ee.listeners(event).indexOf(listener) == -1) {\n ee.on(event, listener);\n }\n }\n\n this.on('newListener', function (event) {\n if (event === 'change') {\n addOneListener(this.pull, 'change', pullChange);\n addOneListener(this.push, 'change', pushChange);\n } else if (event === 'denied') {\n addOneListener(this.pull, 'denied', pullDenied);\n addOneListener(this.push, 'denied', pushDenied);\n } else if (event === 'active') {\n addOneListener(this.pull, 'active', pullActive);\n addOneListener(this.push, 'active', pushActive);\n } else if (event === 'paused') {\n addOneListener(this.pull, 'paused', pullPaused);\n addOneListener(this.push, 'paused', pushPaused);\n }\n });\n\n this.on('removeListener', function (event) {\n if (event === 'change') {\n this.pull.removeListener('change', pullChange);\n this.push.removeListener('change', pushChange);\n } else if (event === 'denied') {\n this.pull.removeListener('denied', pullDenied);\n this.push.removeListener('denied', pushDenied);\n } else if (event === 'active') {\n this.pull.removeListener('active', pullActive);\n this.push.removeListener('active', pushActive);\n } else if (event === 'paused') {\n this.pull.removeListener('paused', pullPaused);\n this.push.removeListener('paused', pushPaused);\n }\n });\n\n this.pull.on('removeListener', removeAll('pull'));\n this.push.on('removeListener', removeAll('push'));\n\n const promise = Promise.all([\n this.push,\n this.pull\n ]).then((resp) => {\n const out = {\n push: resp[0],\n pull: resp[1]\n };\n this.emit('complete', out);\n if (callback) {\n callback(null, out);\n }\n this.removeAllListeners();\n return out;\n }, (err) => {\n this.cancel();\n if (callback) {\n // if there's a callback, then the callback can receive\n // the error event\n callback(err);\n } else {\n // if there's no callback, then we're safe to emit an error\n // event, which would otherwise throw an unhandled error\n // due to 'error' being a special event in EventEmitters\n this.emit('error', err);\n }\n this.removeAllListeners();\n if (callback) {\n // no sense throwing if we're already emitting an 'error' event\n throw err;\n }\n });\n\n this.then = function (success, err) {\n return promise.then(success, err);\n };\n\n this.catch = function (err) {\n return promise.catch(err);\n };\n }\n\n cancel() {\n if (!this.canceled) {\n this.canceled = true;\n this.push.cancel();\n this.pull.cancel();\n }\n }\n}\n\nfunction replication(PouchDB) {\n PouchDB.replicate = replicateWrapper;\n PouchDB.sync = sync;\n\n Object.defineProperty(PouchDB.prototype, 'replicate', {\n get: function () {\n var self = this;\n if (typeof this.replicateMethods === 'undefined') {\n this.replicateMethods = {\n from: function (other, opts, callback) {\n return self.constructor.replicate(other, self, opts, callback);\n },\n to: function (other, opts, callback) {\n return self.constructor.replicate(self, other, opts, callback);\n }\n };\n }\n return this.replicateMethods;\n }\n });\n\n PouchDB.prototype.sync = function (dbName, opts, callback) {\n return this.constructor.sync(this, dbName, opts, callback);\n };\n}\n\nPouchDB.plugin(IDBPouch)\n .plugin(HttpPouch$1)\n .plugin(mapreduce)\n .plugin(replication);\n\n// Pull from src because pouchdb-node/pouchdb-browser themselves\n\nexport default PouchDB;\n","class PouchError extends Error {\n constructor(status, error, reason) {\n super();\n this.status = status;\n this.name = error;\n this.message = reason;\n this.error = true;\n }\n\n toString() {\n return JSON.stringify({\n status: this.status,\n name: this.name,\n message: this.message,\n reason: this.reason\n });\n }\n}\n\nvar UNAUTHORIZED = new PouchError(401, 'unauthorized', \"Name or password is incorrect.\");\nvar MISSING_BULK_DOCS = new PouchError(400, 'bad_request', \"Missing JSON list of 'docs'\");\nvar MISSING_DOC = new PouchError(404, 'not_found', 'missing');\nvar REV_CONFLICT = new PouchError(409, 'conflict', 'Document update conflict');\nvar INVALID_ID = new PouchError(400, 'bad_request', '_id field must contain a string');\nvar MISSING_ID = new PouchError(412, 'missing_id', '_id is required for puts');\nvar RESERVED_ID = new PouchError(400, 'bad_request', 'Only reserved document ids may start with underscore.');\nvar NOT_OPEN = new PouchError(412, 'precondition_failed', 'Database not open');\nvar UNKNOWN_ERROR = new PouchError(500, 'unknown_error', 'Database encountered an unknown error');\nvar BAD_ARG = new PouchError(500, 'badarg', 'Some query argument is invalid');\nvar INVALID_REQUEST = new PouchError(400, 'invalid_request', 'Request was invalid');\nvar QUERY_PARSE_ERROR = new PouchError(400, 'query_parse_error', 'Some query parameter is invalid');\nvar DOC_VALIDATION = new PouchError(500, 'doc_validation', 'Bad special document member');\nvar BAD_REQUEST = new PouchError(400, 'bad_request', 'Something wrong with the request');\nvar NOT_AN_OBJECT = new PouchError(400, 'bad_request', 'Document must be a JSON object');\nvar DB_MISSING = new PouchError(404, 'not_found', 'Database not found');\nvar IDB_ERROR = new PouchError(500, 'indexed_db_went_bad', 'unknown');\nvar WSQ_ERROR = new PouchError(500, 'web_sql_went_bad', 'unknown');\nvar LDB_ERROR = new PouchError(500, 'levelDB_went_went_bad', 'unknown');\nvar FORBIDDEN = new PouchError(403, 'forbidden', 'Forbidden by design doc validate_doc_update function');\nvar INVALID_REV = new PouchError(400, 'bad_request', 'Invalid rev format');\nvar FILE_EXISTS = new PouchError(412, 'file_exists', 'The database could not be created, the file already exists.');\nvar MISSING_STUB = new PouchError(412, 'missing_stub', 'A pre-existing attachment stub wasn\\'t found');\nvar INVALID_URL = new PouchError(413, 'invalid_url', 'Provided URL is invalid');\n\nfunction createError(error, reason) {\n function CustomPouchError(reason) {\n // inherit error properties from our parent error manually\n // so as to allow proper JSON parsing.\n var names = Object.getOwnPropertyNames(error);\n for (var i = 0, len = names.length; i < len; i++) {\n if (typeof error[names[i]] !== 'function') {\n this[names[i]] = error[names[i]];\n }\n }\n\n if (this.stack === undefined) {\n this.stack = (new Error()).stack;\n }\n\n if (reason !== undefined) {\n this.reason = reason;\n }\n }\n CustomPouchError.prototype = PouchError.prototype;\n return new CustomPouchError(reason);\n}\n\nfunction generateErrorFromResponse(err) {\n\n if (typeof err !== 'object') {\n var data = err;\n err = UNKNOWN_ERROR;\n err.data = data;\n }\n\n if ('error' in err && err.error === 'conflict') {\n err.name = 'conflict';\n err.status = 409;\n }\n\n if (!('name' in err)) {\n err.name = err.error || 'unknown';\n }\n\n if (!('status' in err)) {\n err.status = 500;\n }\n\n if (!('message' in err)) {\n err.message = err.message || err.reason;\n }\n\n if (!('stack' in err)) {\n err.stack = (new Error()).stack;\n }\n\n return err;\n}\n\nexport { UNAUTHORIZED, MISSING_BULK_DOCS, MISSING_DOC, REV_CONFLICT, INVALID_ID, MISSING_ID, RESERVED_ID, NOT_OPEN, UNKNOWN_ERROR, BAD_ARG, INVALID_REQUEST, QUERY_PARSE_ERROR, DOC_VALIDATION, BAD_REQUEST, NOT_AN_OBJECT, DB_MISSING, WSQ_ERROR, LDB_ERROR, FORBIDDEN, INVALID_REV, FILE_EXISTS, MISSING_STUB, IDB_ERROR, INVALID_URL, createError, generateErrorFromResponse };\n","var f = fetch;\nvar h = Headers;\n\nexport { f as fetch, h as Headers };\n","var thisAtob = function (str) {\n return atob(str);\n};\n\nvar thisBtoa = function (str) {\n return btoa(str);\n};\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor (e.g.\n// old QtWebKit versions, Android < 4.4).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== \"TypeError\") {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :\n typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :\n typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :\n WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction binaryStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\nfunction binStringToBluffer(binString, type) {\n return createBlob([binaryStringToArrayBuffer(binString)], {type});\n}\n\nfunction b64ToBluffer(b64, type) {\n return binStringToBluffer(thisAtob(b64), type);\n}\n\n//Can't find original post, but this is close\n//http://stackoverflow.com/questions/6965107/ (continues on next line)\n//converting-between-strings-and-arraybuffers\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n for (var i = 0; i < length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n\n// shim for browsers that don't support it\nfunction readAsBinaryString(blob, callback) {\n var reader = new FileReader();\n var hasBinaryString = typeof reader.readAsBinaryString === 'function';\n reader.onloadend = function (e) {\n var result = e.target.result || '';\n if (hasBinaryString) {\n return callback(result);\n }\n callback(arrayBufferToBinaryString(result));\n };\n if (hasBinaryString) {\n reader.readAsBinaryString(blob);\n } else {\n reader.readAsArrayBuffer(blob);\n }\n}\n\nfunction blobToBinaryString(blobOrBuffer, callback) {\n readAsBinaryString(blobOrBuffer, function (bin) {\n callback(bin);\n });\n}\n\nfunction blobToBase64(blobOrBuffer, callback) {\n blobToBinaryString(blobOrBuffer, function (base64) {\n callback(thisBtoa(base64));\n });\n}\n\n// simplified API. universal browser support is assumed\nfunction readAsArrayBuffer(blob, callback) {\n var reader = new FileReader();\n reader.onloadend = function (e) {\n var result = e.target.result || new ArrayBuffer(0);\n callback(result);\n };\n reader.readAsArrayBuffer(blob);\n}\n\n// this is not used in the browser\nfunction typedBuffer() {\n}\n\nexport { thisAtob as atob, thisBtoa as btoa, b64ToBluffer as base64StringToBlobOrBuffer, binaryStringToArrayBuffer, binStringToBluffer as binaryStringToBlobOrBuffer, createBlob as blob, blobToBase64 as blobOrBufferToBase64, blobToBinaryString as blobOrBufferToBinaryString, readAsArrayBuffer, readAsBinaryString, typedBuffer };\n","function pad(str, padWith, upToLength) {\n var padding = '';\n var targetLength = upToLength - str.length;\n /* istanbul ignore next */\n while (padding.length < targetLength) {\n padding += padWith;\n }\n return padding;\n}\n\nfunction padLeft(str, padWith, upToLength) {\n var padding = pad(str, padWith, upToLength);\n return padding + str;\n}\n\nvar MIN_MAGNITUDE = -324; // verified by -Number.MIN_VALUE\nvar MAGNITUDE_DIGITS = 3; // ditto\nvar SEP = ''; // set to '_' for easier debugging\n\nfunction collate(a, b) {\n\n if (a === b) {\n return 0;\n }\n\n a = normalizeKey(a);\n b = normalizeKey(b);\n\n var ai = collationIndex(a);\n var bi = collationIndex(b);\n if ((ai - bi) !== 0) {\n return ai - bi;\n }\n switch (typeof a) {\n case 'number':\n return a - b;\n case 'boolean':\n return a < b ? -1 : 1;\n case 'string':\n return stringCollate(a, b);\n }\n return Array.isArray(a) ? arrayCollate(a, b) : objectCollate(a, b);\n}\n\n// couch considers null/NaN/Infinity/-Infinity === undefined,\n// for the purposes of mapreduce indexes. also, dates get stringified.\nfunction normalizeKey(key) {\n switch (typeof key) {\n case 'undefined':\n return null;\n case 'number':\n if (key === Infinity || key === -Infinity || isNaN(key)) {\n return null;\n }\n return key;\n case 'object':\n var origKey = key;\n if (Array.isArray(key)) {\n var len = key.length;\n key = new Array(len);\n for (var i = 0; i < len; i++) {\n key[i] = normalizeKey(origKey[i]);\n }\n /* istanbul ignore next */\n } else if (key instanceof Date) {\n return key.toJSON();\n } else if (key !== null) { // generic object\n key = {};\n for (var k in origKey) {\n if (Object.prototype.hasOwnProperty.call(origKey, k)) {\n var val = origKey[k];\n if (typeof val !== 'undefined') {\n key[k] = normalizeKey(val);\n }\n }\n }\n }\n }\n return key;\n}\n\nfunction indexify(key) {\n if (key !== null) {\n switch (typeof key) {\n case 'boolean':\n return key ? 1 : 0;\n case 'number':\n return numToIndexableString(key);\n case 'string':\n // We've to be sure that key does not contain \\u0000\n // Do order-preserving replacements:\n // 0 -> 1, 1\n // 1 -> 1, 2\n // 2 -> 2, 2\n /* eslint-disable no-control-regex */\n return key\n .replace(/\\u0002/g, '\\u0002\\u0002')\n .replace(/\\u0001/g, '\\u0001\\u0002')\n .replace(/\\u0000/g, '\\u0001\\u0001');\n /* eslint-enable no-control-regex */\n case 'object':\n var isArray = Array.isArray(key);\n var arr = isArray ? key : Object.keys(key);\n var i = -1;\n var len = arr.length;\n var result = '';\n if (isArray) {\n while (++i < len) {\n result += toIndexableString(arr[i]);\n }\n } else {\n while (++i < len) {\n var objKey = arr[i];\n result += toIndexableString(objKey) +\n toIndexableString(key[objKey]);\n }\n }\n return result;\n }\n }\n return '';\n}\n\n// convert the given key to a string that would be appropriate\n// for lexical sorting, e.g. within a database, where the\n// sorting is the same given by the collate() function.\nfunction toIndexableString(key) {\n var zero = '\\u0000';\n key = normalizeKey(key);\n return collationIndex(key) + SEP + indexify(key) + zero;\n}\n\nfunction parseNumber(str, i) {\n var originalIdx = i;\n var num;\n var zero = str[i] === '1';\n if (zero) {\n num = 0;\n i++;\n } else {\n var neg = str[i] === '0';\n i++;\n var numAsString = '';\n var magAsString = str.substring(i, i + MAGNITUDE_DIGITS);\n var magnitude = parseInt(magAsString, 10) + MIN_MAGNITUDE;\n /* istanbul ignore next */\n if (neg) {\n magnitude = -magnitude;\n }\n i += MAGNITUDE_DIGITS;\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n } else {\n numAsString += ch;\n }\n i++;\n }\n numAsString = numAsString.split('.');\n if (numAsString.length === 1) {\n num = parseInt(numAsString, 10);\n } else {\n /* istanbul ignore next */\n num = parseFloat(numAsString[0] + '.' + numAsString[1]);\n }\n /* istanbul ignore next */\n if (neg) {\n num = num - 10;\n }\n /* istanbul ignore next */\n if (magnitude !== 0) {\n // parseFloat is more reliable than pow due to rounding errors\n // e.g. Number.MAX_VALUE would return Infinity if we did\n // num * Math.pow(10, magnitude);\n num = parseFloat(num + 'e' + magnitude);\n }\n }\n return {num, length : i - originalIdx};\n}\n\n// move up the stack while parsing\n// this function moved outside of parseIndexableString for performance\nfunction pop(stack, metaStack) {\n var obj = stack.pop();\n\n if (metaStack.length) {\n var lastMetaElement = metaStack[metaStack.length - 1];\n if (obj === lastMetaElement.element) {\n // popping a meta-element, e.g. an object whose value is another object\n metaStack.pop();\n lastMetaElement = metaStack[metaStack.length - 1];\n }\n var element = lastMetaElement.element;\n var lastElementIndex = lastMetaElement.index;\n if (Array.isArray(element)) {\n element.push(obj);\n } else if (lastElementIndex === stack.length - 2) { // obj with key+value\n var key = stack.pop();\n element[key] = obj;\n } else {\n stack.push(obj); // obj with key only\n }\n }\n}\n\nfunction parseIndexableString(str) {\n var stack = [];\n var metaStack = []; // stack for arrays and objects\n var i = 0;\n\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var collationIndex = str[i++];\n if (collationIndex === '\\u0000') {\n if (stack.length === 1) {\n return stack.pop();\n } else {\n pop(stack, metaStack);\n continue;\n }\n }\n switch (collationIndex) {\n case '1':\n stack.push(null);\n break;\n case '2':\n stack.push(str[i] === '1');\n i++;\n break;\n case '3':\n var parsedNum = parseNumber(str, i);\n stack.push(parsedNum.num);\n i += parsedNum.length;\n break;\n case '4':\n var parsedStr = '';\n /*eslint no-constant-condition: [\"error\", { \"checkLoops\": false }]*/\n while (true) {\n var ch = str[i];\n if (ch === '\\u0000') {\n break;\n }\n parsedStr += ch;\n i++;\n }\n // perform the reverse of the order-preserving replacement\n // algorithm (see above)\n /* eslint-disable no-control-regex */\n parsedStr = parsedStr.replace(/\\u0001\\u0001/g, '\\u0000')\n .replace(/\\u0001\\u0002/g, '\\u0001')\n .replace(/\\u0002\\u0002/g, '\\u0002');\n /* eslint-enable no-control-regex */\n stack.push(parsedStr);\n break;\n case '5':\n var arrayElement = { element: [], index: stack.length };\n stack.push(arrayElement.element);\n metaStack.push(arrayElement);\n break;\n case '6':\n var objElement = { element: {}, index: stack.length };\n stack.push(objElement.element);\n metaStack.push(objElement);\n break;\n /* istanbul ignore next */\n default:\n throw new Error(\n 'bad collationIndex or unexpectedly reached end of input: ' +\n collationIndex);\n }\n }\n}\n\nfunction arrayCollate(a, b) {\n var len = Math.min(a.length, b.length);\n for (var i = 0; i < len; i++) {\n var sort = collate(a[i], b[i]);\n if (sort !== 0) {\n return sort;\n }\n }\n return (a.length === b.length) ? 0 :\n (a.length > b.length) ? 1 : -1;\n}\nfunction stringCollate(a, b) {\n // See: https://github.com/daleharvey/pouchdb/issues/40\n // This is incompatible with the CouchDB implementation, but its the\n // best we can do for now\n return (a === b) ? 0 : ((a > b) ? 1 : -1);\n}\nfunction objectCollate(a, b) {\n var ak = Object.keys(a), bk = Object.keys(b);\n var len = Math.min(ak.length, bk.length);\n for (var i = 0; i < len; i++) {\n // First sort the keys\n var sort = collate(ak[i], bk[i]);\n if (sort !== 0) {\n return sort;\n }\n // if the keys are equal sort the values\n sort = collate(a[ak[i]], b[bk[i]]);\n if (sort !== 0) {\n return sort;\n }\n\n }\n return (ak.length === bk.length) ? 0 :\n (ak.length > bk.length) ? 1 : -1;\n}\n// The collation is defined by erlangs ordered terms\n// the atoms null, true, false come first, then numbers, strings,\n// arrays, then objects\n// null/undefined/NaN/Infinity/-Infinity are all considered null\nfunction collationIndex(x) {\n var id = ['boolean', 'number', 'string', 'object'];\n var idx = id.indexOf(typeof x);\n //false if -1 otherwise true, but fast!!!!1\n if (~idx) {\n if (x === null) {\n return 1;\n }\n if (Array.isArray(x)) {\n return 5;\n }\n return idx < 3 ? (idx + 2) : (idx + 3);\n }\n /* istanbul ignore next */\n if (Array.isArray(x)) {\n return 5;\n }\n}\n\n// conversion:\n// x yyy zz...zz\n// x = 0 for negative, 1 for 0, 2 for positive\n// y = exponent (for negative numbers negated) moved so that it's >= 0\n// z = mantisse\nfunction numToIndexableString(num) {\n\n if (num === 0) {\n return '1';\n }\n\n // convert number to exponential format for easier and\n // more succinct string sorting\n var expFormat = num.toExponential().split(/e\\+?/);\n var magnitude = parseInt(expFormat[1], 10);\n\n var neg = num < 0;\n\n var result = neg ? '0' : '2';\n\n // first sort by magnitude\n // it's easier if all magnitudes are positive\n var magForComparison = ((neg ? -magnitude : magnitude) - MIN_MAGNITUDE);\n var magString = padLeft((magForComparison).toString(), '0', MAGNITUDE_DIGITS);\n\n result += SEP + magString;\n\n // then sort by the factor\n var factor = Math.abs(parseFloat(expFormat[0])); // [1..10)\n /* istanbul ignore next */\n if (neg) { // for negative reverse ordering\n factor = 10 - factor;\n }\n\n var factorStr = factor.toFixed(20);\n\n // strip zeros from the end\n factorStr = factorStr.replace(/\\.?0+$/, '');\n\n result += SEP + factorStr;\n\n return result;\n}\n\nexport { collate, normalizeKey, toIndexableString, parseIndexableString };\n","import { btoa, readAsArrayBuffer } from 'pouchdb-binary-utils';\nimport Md5 from 'spark-md5';\n\nvar setImmediateShim = self.setImmediate || self.setTimeout;\nvar MD5_CHUNK_SIZE = 32768;\n\nfunction rawToBase64(raw) {\n return btoa(raw);\n}\n\nfunction appendBlob(buffer, blob, start, end, callback) {\n if (start > 0 || end < blob.size) {\n // only slice blob if we really need to\n blob = blob.slice(start, end);\n }\n readAsArrayBuffer(blob, function (arrayBuffer) {\n buffer.append(arrayBuffer);\n callback();\n });\n}\n\nfunction appendString(buffer, string, start, end, callback) {\n if (start > 0 || end < string.length) {\n // only create a substring if we really need to\n string = string.substring(start, end);\n }\n buffer.appendBinary(string);\n callback();\n}\n\nfunction binaryMd5(data, callback) {\n var inputIsString = typeof data === 'string';\n var len = inputIsString ? data.length : data.size;\n var chunkSize = Math.min(MD5_CHUNK_SIZE, len);\n var chunks = Math.ceil(len / chunkSize);\n var currentChunk = 0;\n var buffer = inputIsString ? new Md5() : new Md5.ArrayBuffer();\n\n var append = inputIsString ? appendString : appendBlob;\n\n function next() {\n setImmediateShim(loadNextChunk);\n }\n\n function done() {\n var raw = buffer.end(true);\n var base64 = rawToBase64(raw);\n callback(base64);\n buffer.destroy();\n }\n\n function loadNextChunk() {\n var start = currentChunk * chunkSize;\n var end = start + chunkSize;\n currentChunk++;\n if (currentChunk < chunks) {\n append(buffer, data, start, end, next);\n } else {\n append(buffer, data, start, end, done);\n }\n }\n loadNextChunk();\n}\n\nfunction stringMd5(string) {\n return Md5.hash(string);\n}\n\nexport { binaryMd5, stringMd5 };\n","import { createError, BAD_REQUEST, INVALID_ID, MISSING_ID, RESERVED_ID } from 'pouchdb-errors';\nimport EventEmitter from 'events';\nimport { v4 } from 'uuid';\nimport { stringMd5 } from 'pouchdb-md5';\n\nfunction isBinaryObject(object) {\n return (typeof ArrayBuffer !== 'undefined' && object instanceof ArrayBuffer) ||\n (typeof Blob !== 'undefined' && object instanceof Blob);\n}\n\n/**\n * @template {ArrayBuffer | Blob} T\n * @param {T} object\n * @returns {T}\n */\nfunction cloneBinaryObject(object) {\n return object instanceof ArrayBuffer\n ? object.slice(0)\n : object.slice(0, object.size, object.type);\n}\n\n// most of this is borrowed from lodash.isPlainObject:\n// https://github.com/fis-components/lodash.isplainobject/\n// blob/29c358140a74f252aeb08c9eb28bef86f2217d4a/index.js\n\nvar funcToString = Function.prototype.toString;\nvar objectCtorString = funcToString.call(Object);\n\nfunction isPlainObject(value) {\n var proto = Object.getPrototypeOf(value);\n /* istanbul ignore if */\n if (proto === null) { // not sure when this happens, but I guess it can\n return true;\n }\n var Ctor = proto.constructor;\n return (typeof Ctor == 'function' &&\n Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString);\n}\n\nfunction clone(object) {\n var newObject;\n var i;\n var len;\n\n if (!object || typeof object !== 'object') {\n return object;\n }\n\n if (Array.isArray(object)) {\n newObject = [];\n for (i = 0, len = object.length; i < len; i++) {\n newObject[i] = clone(object[i]);\n }\n return newObject;\n }\n\n // special case: to avoid inconsistencies between IndexedDB\n // and other backends, we automatically stringify Dates\n if (object instanceof Date && isFinite(object)) {\n return object.toISOString();\n }\n\n if (isBinaryObject(object)) {\n return cloneBinaryObject(object);\n }\n\n if (!isPlainObject(object)) {\n return object; // don't clone objects like Workers\n }\n\n newObject = {};\n for (i in object) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(object, i)) {\n var value = clone(object[i]);\n if (typeof value !== 'undefined') {\n newObject[i] = value;\n }\n }\n }\n return newObject;\n}\n\nfunction once(fun) {\n var called = false;\n return function (...args) {\n /* istanbul ignore if */\n if (called) {\n // this is a smoke test and should never actually happen\n throw new Error('once called more than once');\n } else {\n called = true;\n fun.apply(this, args);\n }\n };\n}\n\nfunction toPromise(func) {\n //create the function we will be returning\n return function (...args) {\n // Clone arguments\n args = clone(args);\n var self = this;\n // if the last argument is a function, assume its a callback\n var usedCB = (typeof args[args.length - 1] === 'function') ? args.pop() : false;\n var promise = new Promise(function (fulfill, reject) {\n var resp;\n try {\n var callback = once(function (err, mesg) {\n if (err) {\n reject(err);\n } else {\n fulfill(mesg);\n }\n });\n // create a callback for this invocation\n // apply the function in the orig context\n args.push(callback);\n resp = func.apply(self, args);\n if (resp && typeof resp.then === 'function') {\n fulfill(resp);\n }\n } catch (e) {\n reject(e);\n }\n });\n // if there is a callback, call it back\n if (usedCB) {\n promise.then(function (result) {\n usedCB(null, result);\n }, usedCB);\n }\n return promise;\n };\n}\n\nfunction logApiCall(self, name, args) {\n /* istanbul ignore if */\n if (self.constructor.listeners('debug').length) {\n var logArgs = ['api', self.name, name];\n for (var i = 0; i < args.length - 1; i++) {\n logArgs.push(args[i]);\n }\n self.constructor.emit('debug', logArgs);\n\n // override the callback itself to log the response\n var origCallback = args[args.length - 1];\n args[args.length - 1] = function (err, res) {\n var responseArgs = ['api', self.name, name];\n responseArgs = responseArgs.concat(\n err ? ['error', err] : ['success', res]\n );\n self.constructor.emit('debug', responseArgs);\n origCallback(err, res);\n };\n }\n}\n\nfunction adapterFun(name, callback) {\n return toPromise(function (...args) {\n if (this._closed) {\n return Promise.reject(new Error('database is closed'));\n }\n if (this._destroyed) {\n return Promise.reject(new Error('database is destroyed'));\n }\n var self = this;\n logApiCall(self, name, args);\n if (!this.taskqueue.isReady) {\n return new Promise(function (fulfill, reject) {\n self.taskqueue.addTask(function (failed) {\n if (failed) {\n reject(failed);\n } else {\n fulfill(self[name].apply(self, args));\n }\n });\n });\n }\n return callback.apply(this, args);\n });\n}\n\n// like underscore/lodash _.pick()\nfunction pick(obj, arr) {\n var res = {};\n for (var i = 0, len = arr.length; i < len; i++) {\n var prop = arr[i];\n if (prop in obj) {\n res[prop] = obj[prop];\n }\n }\n return res;\n}\n\n// Most browsers throttle concurrent requests at 6, so it's silly\n// to shim _bulk_get by trying to launch potentially hundreds of requests\n// and then letting the majority time out. We can handle this ourselves.\nvar MAX_NUM_CONCURRENT_REQUESTS = 6;\n\nfunction identityFunction(x) {\n return x;\n}\n\nfunction formatResultForOpenRevsGet(result) {\n return [{\n ok: result\n }];\n}\n\n// shim for P/CouchDB adapters that don't directly implement _bulk_get\nfunction bulkGet(db, opts, callback) {\n var requests = opts.docs;\n\n // consolidate into one request per doc if possible\n var requestsById = new Map();\n requests.forEach(function (request) {\n if (requestsById.has(request.id)) {\n requestsById.get(request.id).push(request);\n } else {\n requestsById.set(request.id, [request]);\n }\n });\n\n var numDocs = requestsById.size;\n var numDone = 0;\n var perDocResults = new Array(numDocs);\n\n function collapseResultsAndFinish() {\n var results = [];\n perDocResults.forEach(function (res) {\n res.docs.forEach(function (info) {\n results.push({\n id: res.id,\n docs: [info]\n });\n });\n });\n callback(null, {results});\n }\n\n function checkDone() {\n if (++numDone === numDocs) {\n collapseResultsAndFinish();\n }\n }\n\n function gotResult(docIndex, id, docs) {\n perDocResults[docIndex] = {id, docs};\n checkDone();\n }\n\n var allRequests = [];\n requestsById.forEach(function (value, key) {\n allRequests.push(key);\n });\n\n var i = 0;\n\n function nextBatch() {\n\n if (i >= allRequests.length) {\n return;\n }\n\n var upTo = Math.min(i + MAX_NUM_CONCURRENT_REQUESTS, allRequests.length);\n var batch = allRequests.slice(i, upTo);\n processBatch(batch, i);\n i += batch.length;\n }\n\n function processBatch(batch, offset) {\n batch.forEach(function (docId, j) {\n var docIdx = offset + j;\n var docRequests = requestsById.get(docId);\n\n // just use the first request as the \"template\"\n // TODO: The _bulk_get API allows for more subtle use cases than this,\n // but for now it is unlikely that there will be a mix of different\n // \"atts_since\" or \"attachments\" in the same request, since it's just\n // replicate.js that is using this for the moment.\n // Also, atts_since is aspirational, since we don't support it yet.\n var docOpts = pick(docRequests[0], ['atts_since', 'attachments']);\n docOpts.open_revs = docRequests.map(function (request) {\n // rev is optional, open_revs disallowed\n return request.rev;\n });\n\n // remove falsey / undefined revisions\n docOpts.open_revs = docOpts.open_revs.filter(identityFunction);\n\n var formatResult = identityFunction;\n\n if (docOpts.open_revs.length === 0) {\n delete docOpts.open_revs;\n\n // when fetching only the \"winning\" leaf,\n // transform the result so it looks like an open_revs\n // request\n formatResult = formatResultForOpenRevsGet;\n }\n\n // globally-supplied options\n ['revs', 'attachments', 'binary', 'ajax', 'latest'].forEach(function (param) {\n if (param in opts) {\n docOpts[param] = opts[param];\n }\n });\n db.get(docId, docOpts, function (err, res) {\n var result;\n /* istanbul ignore if */\n if (err) {\n result = [{error: err}];\n } else {\n result = formatResult(res);\n }\n gotResult(docIdx, docId, result);\n nextBatch();\n });\n });\n }\n\n nextBatch();\n\n}\n\nvar hasLocal;\n\ntry {\n localStorage.setItem('_pouch_check_localstorage', 1);\n hasLocal = !!localStorage.getItem('_pouch_check_localstorage');\n} catch (e) {\n hasLocal = false;\n}\n\nfunction hasLocalStorage() {\n return hasLocal;\n}\n\nconst nextTick = typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : function nextTick(fn) {\n Promise.resolve().then(fn);\n };\n\nclass Changes extends EventEmitter {\n constructor() {\n super();\n\n this._listeners = {};\n\n if (hasLocalStorage()) {\n addEventListener(\"storage\", (e) => {\n this.emit(e.key);\n });\n }\n }\n\n addListener(dbName, id, db, opts) {\n if (this._listeners[id]) {\n return;\n }\n var inprogress = false;\n var self = this;\n function eventFunction() {\n if (!self._listeners[id]) {\n return;\n }\n if (inprogress) {\n inprogress = 'waiting';\n return;\n }\n inprogress = true;\n var changesOpts = pick(opts, [\n 'style', 'include_docs', 'attachments', 'conflicts', 'filter',\n 'doc_ids', 'view', 'since', 'query_params', 'binary', 'return_docs'\n ]);\n\n function onError() {\n inprogress = false;\n }\n\n db.changes(changesOpts).on('change', function (c) {\n if (c.seq > opts.since && !opts.cancelled) {\n opts.since = c.seq;\n opts.onChange(c);\n }\n }).on('complete', function () {\n if (inprogress === 'waiting') {\n nextTick(eventFunction);\n }\n inprogress = false;\n }).on('error', onError);\n }\n this._listeners[id] = eventFunction;\n this.on(dbName, eventFunction);\n }\n\n removeListener(dbName, id) {\n if (!(id in this._listeners)) {\n return;\n }\n super.removeListener(dbName, this._listeners[id]);\n delete this._listeners[id];\n }\n\n notifyLocalWindows(dbName) {\n //do a useless change on a storage thing\n //in order to get other windows's listeners to activate\n if (hasLocalStorage()) {\n localStorage[dbName] = (localStorage[dbName] === \"a\") ? \"b\" : \"a\";\n }\n }\n\n notify(dbName) {\n this.emit(dbName);\n this.notifyLocalWindows(dbName);\n }\n}\n\nfunction guardedConsole(method) {\n /* istanbul ignore else */\n if (typeof console !== 'undefined' && typeof console[method] === 'function') {\n var args = Array.prototype.slice.call(arguments, 1);\n console[method].apply(console, args);\n }\n}\n\nfunction randomNumber(min, max) {\n var maxTimeout = 600000; // Hard-coded default of 10 minutes\n min = parseInt(min, 10) || 0;\n max = parseInt(max, 10);\n if (max !== max || max <= min) {\n max = (min || 1) << 1; //doubling\n } else {\n max = max + 1;\n }\n // In order to not exceed maxTimeout, pick a random value between half of maxTimeout and maxTimeout\n if (max > maxTimeout) {\n min = maxTimeout >> 1; // divide by two\n max = maxTimeout;\n }\n var ratio = Math.random();\n var range = max - min;\n\n return ~~(range * ratio + min); // ~~ coerces to an int, but fast.\n}\n\nfunction defaultBackOff(min) {\n var max = 0;\n if (!min) {\n max = 2000;\n }\n return randomNumber(min, max);\n}\n\n// designed to give info to browser users, who are disturbed\n// when they see http errors in the console\nfunction explainError(status, str) {\n guardedConsole('info', 'The above ' + status + ' is totally normal. ' + str);\n}\n\nfunction tryFilter(filter, doc, req) {\n try {\n return !filter(doc, req);\n } catch (err) {\n var msg = 'Filter function threw: ' + err.toString();\n return createError(BAD_REQUEST, msg);\n }\n}\n\nfunction filterChange(opts) {\n var req = {};\n var hasFilter = opts.filter && typeof opts.filter === 'function';\n req.query = opts.query_params;\n\n return function filter(change) {\n if (!change.doc) {\n // CSG sends events on the changes feed that don't have documents,\n // this hack makes a whole lot of existing code robust.\n change.doc = {};\n }\n\n var filterReturn = hasFilter && tryFilter(opts.filter, change.doc, req);\n\n if (typeof filterReturn === 'object') {\n return filterReturn;\n }\n\n if (filterReturn) {\n return false;\n }\n\n if (!opts.include_docs) {\n delete change.doc;\n } else if (!opts.attachments) {\n for (var att in change.doc._attachments) {\n /* istanbul ignore else */\n if (Object.prototype.hasOwnProperty.call(change.doc._attachments, att)) {\n change.doc._attachments[att].stub = true;\n }\n }\n }\n return true;\n };\n}\n\n// shim for Function.prototype.name,\n// for browsers that don't support it like IE\n\n/* istanbul ignore next */\nfunction f() {}\n\nvar hasName = f.name;\nvar res;\n\n// We don't run coverage in IE\n/* istanbul ignore else */\nif (hasName) {\n res = function (fun) {\n return fun.name;\n };\n} else {\n res = function (fun) {\n var match = fun.toString().match(/^\\s*function\\s*(?:(\\S+)\\s*)?\\(/);\n if (match && match[1]) {\n return match[1];\n }\n else {\n return '';\n }\n };\n}\n\nvar res$1 = res;\n\n// Determine id an ID is valid\n// - invalid IDs begin with an underescore that does not begin '_design' or\n// '_local'\n// - any other string value is a valid id\n// Returns the specific error object for each case\nfunction invalidIdError(id) {\n var err;\n if (!id) {\n err = createError(MISSING_ID);\n } else if (typeof id !== 'string') {\n err = createError(INVALID_ID);\n } else if (/^_/.test(id) && !(/^_(design|local)/).test(id)) {\n err = createError(RESERVED_ID);\n }\n if (err) {\n throw err;\n }\n}\n\n// Checks if a PouchDB object is \"remote\" or not. This is\n\nfunction isRemote(db) {\n if (typeof db._remote === 'boolean') {\n return db._remote;\n }\n /* istanbul ignore next */\n if (typeof db.type === 'function') {\n guardedConsole('warn',\n 'db.type() is deprecated and will be removed in ' +\n 'a future version of PouchDB');\n return db.type() === 'http';\n }\n /* istanbul ignore next */\n return false;\n}\n\nfunction listenerCount(ee, type) {\n return 'listenerCount' in ee ? ee.listenerCount(type) :\n EventEmitter.listenerCount(ee, type);\n}\n\nfunction parseDesignDocFunctionName(s) {\n if (!s) {\n return null;\n }\n var parts = s.split('/');\n if (parts.length === 2) {\n return parts;\n }\n if (parts.length === 1) {\n return [s, s];\n }\n return null;\n}\n\nfunction normalizeDesignDocFunctionName(s) {\n var normalized = parseDesignDocFunctionName(s);\n return normalized ? normalized.join('/') : null;\n}\n\n// originally parseUri 1.2.2, now patched by us\n// (c) Steven Levithan <stevenlevithan.com>\n// MIT License\nvar keys = [\"source\", \"protocol\", \"authority\", \"userInfo\", \"user\", \"password\",\n \"host\", \"port\", \"relative\", \"path\", \"directory\", \"file\", \"query\", \"anchor\"];\nvar qName =\"queryKey\";\nvar qParser = /(?:^|&)([^&=]*)=?([^&]*)/g;\n\n// use the \"loose\" parser\n/* eslint no-useless-escape: 0 */\nvar parser = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\nfunction parseUri(str) {\n var m = parser.exec(str);\n var uri = {};\n var i = 14;\n\n while (i--) {\n var key = keys[i];\n var value = m[i] || \"\";\n var encoded = ['user', 'password'].indexOf(key) !== -1;\n uri[key] = encoded ? decodeURIComponent(value) : value;\n }\n\n uri[qName] = {};\n uri[keys[12]].replace(qParser, function ($0, $1, $2) {\n if ($1) {\n uri[qName][$1] = $2;\n }\n });\n\n return uri;\n}\n\n// Based on https://github.com/alexdavid/scope-eval v0.0.3\n// (source: https://unpkg.com/scope-eval@0.0.3/scope_eval.js)\n// This is basically just a wrapper around new Function()\n\nfunction scopeEval(source, scope) {\n var keys = [];\n var values = [];\n for (var key in scope) {\n if (Object.prototype.hasOwnProperty.call(scope, key)) {\n keys.push(key);\n values.push(scope[key]);\n }\n }\n keys.push(source);\n return Function.apply(null, keys).apply(null, values);\n}\n\n// this is essentially the \"update sugar\" function from daleharvey/pouchdb#1388\n// the diffFun tells us what delta to apply to the doc. it either returns\n// the doc, or false if it doesn't need to do an update after all\nfunction upsert(db, docId, diffFun) {\n return db.get(docId)\n .catch(function (err) {\n /* istanbul ignore next */\n if (err.status !== 404) {\n throw err;\n }\n return {};\n })\n .then(function (doc) {\n // the user might change the _rev, so save it for posterity\n var docRev = doc._rev;\n var newDoc = diffFun(doc);\n\n if (!newDoc) {\n // if the diffFun returns falsy, we short-circuit as\n // an optimization\n return {updated: false, rev: docRev};\n }\n\n // users aren't allowed to modify these values,\n // so reset them here\n newDoc._id = docId;\n newDoc._rev = docRev;\n return tryAndPut(db, newDoc, diffFun);\n });\n}\n\nfunction tryAndPut(db, doc, diffFun) {\n return db.put(doc).then(function (res) {\n return {\n updated: true,\n rev: res.rev\n };\n }, function (err) {\n /* istanbul ignore next */\n if (err.status !== 409) {\n throw err;\n }\n return upsert(db, doc._id, diffFun);\n });\n}\n\n/**\n * Creates a new revision string that does NOT include the revision height\n * For example '56649f1b0506c6ca9fda0746eb0cacdf'\n */\nfunction rev(doc, deterministic_revs) {\n if (!deterministic_revs) {\n return v4().replace(/-/g, '').toLowerCase();\n }\n\n var mutateableDoc = Object.assign({}, doc);\n delete mutateableDoc._rev_tree;\n return stringMd5(JSON.stringify(mutateableDoc));\n}\n\nvar uuid = v4; // mimic old import, only v4 is ever used elsewhere\n\nexport { adapterFun, bulkGet as bulkGetShim, Changes as changesHandler, clone, defaultBackOff, explainError, filterChange, res$1 as functionName, guardedConsole, hasLocalStorage, invalidIdError, isRemote, listenerCount, nextTick, normalizeDesignDocFunctionName as normalizeDdocFunctionName, once, parseDesignDocFunctionName as parseDdocFunctionName, parseUri, pick, rev, scopeEval, toPromise, upsert, uuid };\n","import { nextTick } from 'pouchdb-utils';\n\nclass QueryParseError extends Error {\n constructor(message) {\n super();\n this.status = 400;\n this.name = 'query_parse_error';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, QueryParseError);\n } catch (e) {}\n }\n}\n\nclass NotFoundError extends Error {\n constructor(message) {\n super();\n this.status = 404;\n this.name = 'not_found';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, NotFoundError);\n } catch (e) {}\n }\n}\n\nclass BuiltInError extends Error {\n constructor(message) {\n super();\n this.status = 500;\n this.name = 'invalid_value';\n this.message = message;\n this.error = true;\n try {\n Error.captureStackTrace(this, BuiltInError);\n } catch (e) {}\n }\n}\n\nfunction promisedCallback(promise, callback) {\n if (callback) {\n promise.then(function (res) {\n nextTick(function () {\n callback(null, res);\n });\n }, function (reason) {\n nextTick(function () {\n callback(reason);\n });\n });\n }\n return promise;\n}\n\nfunction callbackify(fun) {\n return function (...args) {\n var cb = args.pop();\n var promise = fun.apply(this, args);\n if (typeof cb === 'function') {\n promisedCallback(promise, cb);\n }\n return promise;\n };\n}\n\n// Promise finally util similar to Q.finally\nfunction fin(promise, finalPromiseFactory) {\n return promise.then(function (res) {\n return finalPromiseFactory().then(function () {\n return res;\n });\n }, function (reason) {\n return finalPromiseFactory().then(function () {\n throw reason;\n });\n });\n}\n\nfunction sequentialize(queue, promiseFactory) {\n return function () {\n var args = arguments;\n var that = this;\n return queue.add(function () {\n return promiseFactory.apply(that, args);\n });\n };\n}\n\n// uniq an array of strings, order not guaranteed\n// similar to underscore/lodash _.uniq\nfunction uniq(arr) {\n var theSet = new Set(arr);\n var result = new Array(theSet.size);\n var index = -1;\n theSet.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\nfunction mapToKeysArray(map) {\n var result = new Array(map.size);\n var index = -1;\n map.forEach(function (value, key) {\n result[++index] = key;\n });\n return result;\n}\n\nexport { uniq, sequentialize, fin, callbackify, promisedCallback, mapToKeysArray, QueryParseError, NotFoundError, BuiltInError };\n","import { base64StringToBlobOrBuffer } from 'pouchdb-binary-utils';\nimport { collate, toIndexableString, normalizeKey, parseIndexableString } from 'pouchdb-collate';\nimport { generateErrorFromResponse } from 'pouchdb-errors';\nimport { Headers } from 'pouchdb-fetch';\nimport { upsert, guardedConsole, nextTick, isRemote } from 'pouchdb-utils';\nimport { stringMd5 } from 'pouchdb-md5';\nimport { callbackify, sequentialize, uniq, fin, promisedCallback, mapToKeysArray, QueryParseError, NotFoundError, BuiltInError } from 'pouchdb-mapreduce-utils';\n\n/*\n * Simple task queue to sequentialize actions. Assumes\n * callbacks will eventually fire (once).\n */\n\nclass TaskQueue {\n constructor() {\n this.promise = Promise.resolve();\n }\n\n add(promiseFactory) {\n this.promise = this.promise\n // just recover\n .catch(() => { })\n .then(() => promiseFactory());\n return this.promise;\n }\n\n finish() {\n return this.promise;\n }\n}\n\nfunction stringify(input) {\n if (!input) {\n return 'undefined'; // backwards compat for empty reduce\n }\n // for backwards compat with mapreduce, functions/strings are stringified\n // as-is. everything else is JSON-stringified.\n switch (typeof input) {\n case 'function':\n // e.g. a mapreduce map\n return input.toString();\n case 'string':\n // e.g. a mapreduce built-in _reduce function\n return input.toString();\n default:\n // e.g. a JSON object in the case of mango queries\n return JSON.stringify(input);\n }\n}\n\n/* create a string signature for a view so we can cache it and uniq it */\nfunction createViewSignature(mapFun, reduceFun) {\n // the \"undefined\" part is for backwards compatibility\n return stringify(mapFun) + stringify(reduceFun) + 'undefined';\n}\n\nasync function createView(sourceDB, viewName, mapFun, reduceFun, temporary, localDocName) {\n const viewSignature = createViewSignature(mapFun, reduceFun);\n\n let cachedViews;\n if (!temporary) {\n // cache this to ensure we don't try to update the same view twice\n cachedViews = sourceDB._cachedViews = sourceDB._cachedViews || {};\n if (cachedViews[viewSignature]) {\n return cachedViews[viewSignature];\n }\n }\n\n const promiseForView = sourceDB.info().then(async function (info) {\n const depDbName = info.db_name + '-mrview-' +\n (temporary ? 'temp' : stringMd5(viewSignature));\n\n // save the view name in the source db so it can be cleaned up if necessary\n // (e.g. when the _design doc is deleted, remove all associated view data)\n function diffFunction(doc) {\n doc.views = doc.views || {};\n let fullViewName = viewName;\n if (fullViewName.indexOf('/') === -1) {\n fullViewName = viewName + '/' + viewName;\n }\n const depDbs = doc.views[fullViewName] = doc.views[fullViewName] || {};\n /* istanbul ignore if */\n if (depDbs[depDbName]) {\n return; // no update necessary\n }\n depDbs[depDbName] = true;\n return doc;\n }\n await upsert(sourceDB, '_local/' + localDocName, diffFunction);\n const res = await sourceDB.registerDependentDatabase(depDbName);\n const db = res.db;\n db.auto_compaction = true;\n const view = {\n name: depDbName,\n db,\n sourceDB,\n adapter: sourceDB.adapter,\n mapFun,\n reduceFun\n };\n\n let lastSeqDoc;\n try {\n lastSeqDoc = await view.db.get('_local/lastSeq');\n } catch (err) {\n /* istanbul ignore if */\n if (err.status !== 404) {\n throw err;\n }\n }\n\n view.seq = lastSeqDoc ? lastSeqDoc.seq : 0;\n if (cachedViews) {\n view.db.once('destroyed', function () {\n delete cachedViews[viewSignature];\n });\n }\n return view;\n });\n\n if (cachedViews) {\n cachedViews[viewSignature] = promiseForView;\n }\n return promiseForView;\n}\n\nconst persistentQueues = {};\nconst tempViewQueue = new TaskQueue();\nconst CHANGES_BATCH_SIZE = 50;\n\nfunction parseViewName(name) {\n // can be either 'ddocname/viewname' or just 'viewname'\n // (where the ddoc name is the same)\n return name.indexOf('/') === -1 ? [name, name] : name.split('/');\n}\n\nfunction isGenOne(changes) {\n // only return true if the current change is 1-\n // and there are no other leafs\n return changes.length === 1 && /^1-/.test(changes[0].rev);\n}\n\nfunction emitError(db, e, data) {\n try {\n db.emit('error', e);\n } catch (err) {\n guardedConsole('error',\n 'The user\\'s map/reduce function threw an uncaught error.\\n' +\n 'You can debug this error by doing:\\n' +\n 'myDatabase.on(\\'error\\', function (err) { debugger; });\\n' +\n 'Please double-check your map/reduce function.');\n guardedConsole('error', e, data);\n }\n}\n\n/**\n * Returns an \"abstract\" mapreduce object of the form:\n *\n * {\n * query: queryFun,\n * viewCleanup: viewCleanupFun\n * }\n *\n * Arguments are:\n *\n * localDoc: string\n * This is for the local doc that gets saved in order to track the\n * \"dependent\" DBs and clean them up for viewCleanup. It should be\n * unique, so that indexer plugins don't collide with each other.\n * mapper: function (mapFunDef, emit)\n * Returns a map function based on the mapFunDef, which in the case of\n * normal map/reduce is just the de-stringified function, but may be\n * something else, such as an object in the case of pouchdb-find.\n * reducer: function (reduceFunDef)\n * Ditto, but for reducing. Modules don't have to support reducing\n * (e.g. pouchdb-find).\n * ddocValidator: function (ddoc, viewName)\n * Throws an error if the ddoc or viewName is not valid.\n * This could be a way to communicate to the user that the configuration for the\n * indexer is invalid.\n */\nfunction createAbstractMapReduce(localDocName, mapper, reducer, ddocValidator) {\n\n function tryMap(db, fun, doc) {\n // emit an event if there was an error thrown by a map function.\n // putting try/catches in a single function also avoids deoptimizations.\n try {\n fun(doc);\n } catch (e) {\n emitError(db, e, {fun, doc});\n }\n }\n\n function tryReduce(db, fun, keys, values, rereduce) {\n // same as above, but returning the result or an error. there are two separate\n // functions to avoid extra memory allocations since the tryCode() case is used\n // for custom map functions (common) vs this function, which is only used for\n // custom reduce functions (rare)\n try {\n return {output : fun(keys, values, rereduce)};\n } catch (e) {\n emitError(db, e, {fun, keys, values, rereduce});\n return {error: e};\n }\n }\n\n function sortByKeyThenValue(x, y) {\n const keyCompare = collate(x.key, y.key);\n return keyCompare !== 0 ? keyCompare : collate(x.value, y.value);\n }\n\n function sliceResults(results, limit, skip) {\n skip = skip || 0;\n if (typeof limit === 'number') {\n return results.slice(skip, limit + skip);\n } else if (skip > 0) {\n return results.slice(skip);\n }\n return results;\n }\n\n function rowToDocId(row) {\n const val = row.value;\n // Users can explicitly specify a joined doc _id, or it\n // defaults to the doc _id that emitted the key/value.\n const docId = (val && typeof val === 'object' && val._id) || row.id;\n return docId;\n }\n\n function readAttachmentsAsBlobOrBuffer(res) {\n for (const row of res.rows) {\n const atts = row.doc && row.doc._attachments;\n if (!atts) {\n continue;\n }\n for (const filename of Object.keys(atts)) {\n const att = atts[filename];\n atts[filename].data = base64StringToBlobOrBuffer(att.data, att.content_type);\n }\n }\n }\n\n function postprocessAttachments(opts) {\n return function (res) {\n if (opts.include_docs && opts.attachments && opts.binary) {\n readAttachmentsAsBlobOrBuffer(res);\n }\n return res;\n };\n }\n\n function addHttpParam(paramName, opts, params, asJson) {\n // add an http param from opts to params, optionally json-encoded\n let val = opts[paramName];\n if (typeof val !== 'undefined') {\n if (asJson) {\n val = encodeURIComponent(JSON.stringify(val));\n }\n params.push(paramName + '=' + val);\n }\n }\n\n function coerceInteger(integerCandidate) {\n if (typeof integerCandidate !== 'undefined') {\n const asNumber = Number(integerCandidate);\n // prevents e.g. '1foo' or '1.1' being coerced to 1\n if (!isNaN(asNumber) && asNumber === parseInt(integerCandidate, 10)) {\n return asNumber;\n } else {\n return integerCandidate;\n }\n }\n }\n\n function coerceOptions(opts) {\n opts.group_level = coerceInteger(opts.group_level);\n opts.limit = coerceInteger(opts.limit);\n opts.skip = coerceInteger(opts.skip);\n return opts;\n }\n\n function checkPositiveInteger(number) {\n if (number) {\n if (typeof number !== 'number') {\n return new QueryParseError(`Invalid value for integer: \"${number}\"`);\n }\n if (number < 0) {\n return new QueryParseError(`Invalid value for positive integer: \"${number}\"`);\n }\n }\n }\n\n function checkQueryParseError(options, fun) {\n const startkeyName = options.descending ? 'endkey' : 'startkey';\n const endkeyName = options.descending ? 'startkey' : 'endkey';\n\n if (typeof options[startkeyName] !== 'undefined' &&\n typeof options[endkeyName] !== 'undefined' &&\n collate(options[startkeyName], options[endkeyName]) > 0) {\n throw new QueryParseError('No rows can match your key range, ' +\n 'reverse your start_key and end_key or set {descending : true}');\n } else if (fun.reduce && options.reduce !== false) {\n if (options.include_docs) {\n throw new QueryParseError('{include_docs:true} is invalid for reduce');\n } else if (options.keys && options.keys.length > 1 &&\n !options.group && !options.group_level) {\n throw new QueryParseError('Multi-key fetches for reduce views must use ' +\n '{group: true}');\n }\n }\n for (const optionName of ['group_level', 'limit', 'skip']) {\n const error = checkPositiveInteger(options[optionName]);\n if (error) {\n throw error;\n }\n }\n }\n\n async function httpQuery(db, fun, opts) {\n // List of parameters to add to the PUT request\n let params = [];\n let body;\n let method = 'GET';\n let ok;\n\n // If opts.reduce exists and is defined, then add it to the list\n // of parameters.\n // If reduce=false then the results are that of only the map function\n // not the final result of map and reduce.\n addHttpParam('reduce', opts, params);\n addHttpParam('include_docs', opts, params);\n addHttpParam('attachments', opts, params);\n addHttpParam('limit', opts, params);\n addHttpParam('descending', opts, params);\n addHttpParam('group', opts, params);\n addHttpParam('group_level', opts, params);\n addHttpParam('skip', opts, params);\n addHttpParam('stale', opts, params);\n addHttpParam('conflicts', opts, params);\n addHttpParam('startkey', opts, params, true);\n addHttpParam('start_key', opts, params, true);\n addHttpParam('endkey', opts, params, true);\n addHttpParam('end_key', opts, params, true);\n addHttpParam('inclusive_end', opts, params);\n addHttpParam('key', opts, params, true);\n addHttpParam('update_seq', opts, params);\n\n // Format the list of parameters into a valid URI query string\n params = params.join('&');\n params = params === '' ? '' : '?' + params;\n\n // If keys are supplied, issue a POST to circumvent GET query string limits\n // see http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options\n if (typeof opts.keys !== 'undefined') {\n const MAX_URL_LENGTH = 2000;\n // according to http://stackoverflow.com/a/417184/680742,\n // the de facto URL length limit is 2000 characters\n\n const keysAsString = `keys=${encodeURIComponent(JSON.stringify(opts.keys))}`;\n if (keysAsString.length + params.length + 1 <= MAX_URL_LENGTH) {\n // If the keys are short enough, do a GET. we do this to work around\n // Safari not understanding 304s on POSTs (see pouchdb/pouchdb#1239)\n params += (params[0] === '?' ? '&' : '?') + keysAsString;\n } else {\n method = 'POST';\n if (typeof fun === 'string') {\n body = {keys: opts.keys};\n } else { // fun is {map : mapfun}, so append to this\n fun.keys = opts.keys;\n }\n }\n }\n\n // We are referencing a query defined in the design doc\n if (typeof fun === 'string') {\n const parts = parseViewName(fun);\n\n const response = await db.fetch('_design/' + parts[0] + '/_view/' + parts[1] + params, {\n headers: new Headers({'Content-Type': 'application/json'}),\n method,\n body: JSON.stringify(body)\n });\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n // fail the entire request if the result contains an error\n for (const row of result.rows) {\n /* istanbul ignore if */\n if (row.value && row.value.error && row.value.error === \"builtin_reduce_error\") {\n throw new Error(row.reason);\n }\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // We are using a temporary view, terrible for performance, good for testing\n body = body || {};\n for (const key of Object.keys(fun)) {\n if (Array.isArray(fun[key])) {\n body[key] = fun[key];\n } else {\n body[key] = fun[key].toString();\n }\n }\n\n const response = await db.fetch('_temp_view' + params, {\n headers: new Headers({'Content-Type': 'application/json'}),\n method: 'POST',\n body: JSON.stringify(body)\n });\n\n ok = response.ok;\n // status = response.status;\n const result = await response.json();\n if (!ok) {\n result.status = response.status;\n throw generateErrorFromResponse(result);\n }\n\n return new Promise(function (resolve) {\n resolve(result);\n }).then(postprocessAttachments(opts));\n }\n\n // custom adapters can define their own api._query\n // and override the default behavior\n /* istanbul ignore next */\n function customQuery(db, fun, opts) {\n return new Promise(function (resolve, reject) {\n db._query(fun, opts, function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n // custom adapters can define their own api._viewCleanup\n // and override the default behavior\n /* istanbul ignore next */\n function customViewCleanup(db) {\n return new Promise(function (resolve, reject) {\n db._viewCleanup(function (err, res) {\n if (err) {\n return reject(err);\n }\n resolve(res);\n });\n });\n }\n\n function defaultsTo(value) {\n return function (reason) {\n /* istanbul ignore else */\n if (reason.status === 404) {\n return value;\n } else {\n throw reason;\n }\n };\n }\n\n // returns a promise for a list of docs to update, based on the input docId.\n // the order doesn't matter, because post-3.2.0, bulkDocs\n // is an atomic operation in all three adapters.\n async function getDocsToPersist(docId, view, docIdsToChangesAndEmits) {\n const metaDocId = '_local/doc_' + docId;\n const defaultMetaDoc = {_id: metaDocId, keys: []};\n const docData = docIdsToChangesAndEmits.get(docId);\n const indexableKeysToKeyValues = docData[0];\n const changes = docData[1];\n\n function getMetaDoc() {\n if (isGenOne(changes)) {\n // generation 1, so we can safely assume initial state\n // for performance reasons (avoids unnecessary GETs)\n return Promise.resolve(defaultMetaDoc);\n }\n return view.db.get(metaDocId).catch(defaultsTo(defaultMetaDoc));\n }\n\n function getKeyValueDocs(metaDoc) {\n if (!metaDoc.keys.length) {\n // no keys, no need for a lookup\n return Promise.resolve({rows: []});\n }\n return view.db.allDocs({\n keys: metaDoc.keys,\n include_docs: true\n });\n }\n\n function processKeyValueDocs(metaDoc, kvDocsRes) {\n const kvDocs = [];\n const oldKeys = new Set();\n\n for (const row of kvDocsRes.rows) {\n const doc = row.doc;\n if (!doc) { // deleted\n continue;\n }\n kvDocs.push(doc);\n oldKeys.add(doc._id);\n doc._deleted = !indexableKeysToKeyValues.has(doc._id);\n if (!doc._deleted) {\n const keyValue = indexableKeysToKeyValues.get(doc._id);\n if ('value' in keyValue) {\n doc.value = keyValue.value;\n }\n }\n }\n const newKeys = mapToKeysArray(indexableKeysToKeyValues);\n for (const key of newKeys) {\n if (!oldKeys.has(key)) {\n // new doc\n const kvDoc = {\n _id: key\n };\n const keyValue = indexableKeysToKeyValues.get(key);\n if ('value' in keyValue) {\n kvDoc.value = keyValue.value;\n }\n kvDocs.push(kvDoc);\n }\n }\n metaDoc.keys = uniq(newKeys.concat(metaDoc.keys));\n kvDocs.push(metaDoc);\n\n return kvDocs;\n }\n\n const metaDoc = await getMetaDoc();\n const keyValueDocs = await getKeyValueDocs(metaDoc);\n return processKeyValueDocs(metaDoc, keyValueDocs);\n }\n\n function updatePurgeSeq(view) {\n // with this approach, we just assume to have processed all missing purges and write the latest\n // purgeSeq into the _local/purgeSeq doc.\n return view.sourceDB.get('_local/purges').then(function (res) {\n const purgeSeq = res.purgeSeq;\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res._rev;\n })\n .catch(defaultsTo(undefined))\n .then(function (rev) {\n return view.db.put({\n _id: '_local/purgeSeq',\n _rev: rev,\n purgeSeq,\n });\n });\n }).catch(function (err) {\n if (err.status !== 404) {\n throw err;\n }\n });\n }\n\n // updates all emitted key/value docs and metaDocs in the mrview database\n // for the given batch of documents from the source database\n function saveKeyValues(view, docIdsToChangesAndEmits, seq) {\n var seqDocId = '_local/lastSeq';\n return view.db.get(seqDocId)\n .catch(defaultsTo({_id: seqDocId, seq: 0}))\n .then(function (lastSeqDoc) {\n var docIds = mapToKeysArray(docIdsToChangesAndEmits);\n return Promise.all(docIds.map(function (docId) {\n return getDocsToPersist(docId, view, docIdsToChangesAndEmits);\n })).then(function (listOfDocsToPersist) {\n var docsToPersist = listOfDocsToPersist.flat();\n lastSeqDoc.seq = seq;\n docsToPersist.push(lastSeqDoc);\n // write all docs in a single operation, update the seq once\n return view.db.bulkDocs({docs : docsToPersist});\n })\n // TODO: this should be placed somewhere else, probably? we're querying both docs twice\n // (first time when getting the actual purges).\n .then(() => updatePurgeSeq(view));\n });\n }\n\n function getQueue(view) {\n const viewName = typeof view === 'string' ? view : view.name;\n let queue = persistentQueues[viewName];\n if (!queue) {\n queue = persistentQueues[viewName] = new TaskQueue();\n }\n return queue;\n }\n\n async function updateView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return updateViewInQueue(view, opts);\n })();\n }\n\n async function updateViewInQueue(view, opts) {\n // bind the emit function once\n let mapResults;\n let doc;\n let taskId;\n\n function emit(key, value) {\n const output = {id: doc._id, key: normalizeKey(key)};\n // Don't explicitly store the value unless it's defined and non-null.\n // This saves on storage space, because often people don't use it.\n if (typeof value !== 'undefined' && value !== null) {\n output.value = normalizeKey(value);\n }\n mapResults.push(output);\n }\n\n const mapFun = mapper(view.mapFun, emit);\n\n let currentSeq = view.seq || 0;\n\n function createTask() {\n return view.sourceDB.info().then(function (info) {\n taskId = view.sourceDB.activeTasks.add({\n name: 'view_indexing',\n total_items: info.update_seq - currentSeq,\n });\n });\n }\n\n function processChange(docIdsToChangesAndEmits, seq) {\n return function () {\n return saveKeyValues(view, docIdsToChangesAndEmits, seq);\n };\n }\n\n let indexed_docs = 0;\n const progress = {\n view: view.name,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n\n const queue = new TaskQueue();\n\n async function processNextBatch() {\n const response = await view.sourceDB.changes({\n return_docs: true,\n conflicts: true,\n include_docs: true,\n style: 'all_docs',\n since: currentSeq,\n limit: opts.changes_batch_size\n });\n const purges = await getRecentPurges();\n return processBatch(response, purges);\n }\n\n function getRecentPurges() {\n return view.db.get('_local/purgeSeq').then(function (res) {\n return res.purgeSeq;\n })\n .catch(defaultsTo(-1))\n .then(function (purgeSeq) {\n return view.sourceDB.get('_local/purges').then(function (res) {\n const recentPurges = res.purges.filter(function (purge, index) {\n return index > purgeSeq;\n }).map((purge) => purge.docId);\n\n const uniquePurges = recentPurges.filter(function (docId, index) {\n return recentPurges.indexOf(docId) === index;\n });\n\n return Promise.all(uniquePurges.map(function (docId) {\n return view.sourceDB.get(docId).then(function (doc) {\n return { docId, doc };\n })\n .catch(defaultsTo({ docId }));\n }));\n })\n .catch(defaultsTo([]));\n });\n }\n\n function processBatch(response, purges) {\n const results = response.results;\n if (!results.length && !purges.length) {\n return;\n }\n\n for (const purge of purges) {\n const index = results.findIndex(function (change) {\n return change.id === purge.docId;\n });\n if (index < 0) {\n // mimic a db.remove() on the changes feed\n const entry = {\n _id: purge.docId,\n doc: {\n _id: purge.docId,\n _deleted: 1,\n },\n changes: [],\n };\n\n if (purge.doc) {\n // update with new winning rev after purge\n entry.doc = purge.doc;\n entry.changes.push({ rev: purge.doc._rev });\n }\n\n results.push(entry);\n }\n }\n\n const docIdsToChangesAndEmits = createDocIdsToChangesAndEmits(results);\n\n queue.add(processChange(docIdsToChangesAndEmits, currentSeq));\n\n indexed_docs = indexed_docs + results.length;\n const progress = {\n view: view.name,\n last_seq: response.last_seq,\n results_count: results.length,\n indexed_docs\n };\n view.sourceDB.emit('indexing', progress);\n view.sourceDB.activeTasks.update(taskId, {completed_items: indexed_docs});\n\n if (results.length < opts.changes_batch_size) {\n return;\n }\n return processNextBatch();\n }\n\n function createDocIdsToChangesAndEmits(results) {\n const docIdsToChangesAndEmits = new Map();\n for (const change of results) {\n if (change.doc._id[0] !== '_') {\n mapResults = [];\n doc = change.doc;\n\n if (!doc._deleted) {\n tryMap(view.sourceDB, mapFun, doc);\n }\n mapResults.sort(sortByKeyThenValue);\n\n const indexableKeysToKeyValues = createIndexableKeysToKeyValues(mapResults);\n docIdsToChangesAndEmits.set(change.doc._id, [\n indexableKeysToKeyValues,\n change.changes\n ]);\n }\n currentSeq = change.seq;\n }\n return docIdsToChangesAndEmits;\n }\n\n function createIndexableKeysToKeyValues(mapResults) {\n const indexableKeysToKeyValues = new Map();\n let lastKey;\n for (let i = 0, len = mapResults.length; i < len; i++) {\n const emittedKeyValue = mapResults[i];\n const complexKey = [emittedKeyValue.key, emittedKeyValue.id];\n if (i > 0 && collate(emittedKeyValue.key, lastKey) === 0) {\n complexKey.push(i); // dup key+id, so make it unique\n }\n indexableKeysToKeyValues.set(toIndexableString(complexKey), emittedKeyValue);\n lastKey = emittedKeyValue.key;\n }\n return indexableKeysToKeyValues;\n }\n\n try {\n await createTask();\n await processNextBatch();\n await queue.finish();\n view.seq = currentSeq;\n view.sourceDB.activeTasks.remove(taskId);\n } catch (error) {\n view.sourceDB.activeTasks.remove(taskId, error);\n }\n }\n\n function reduceView(view, results, options) {\n if (options.group_level === 0) {\n delete options.group_level;\n }\n\n const shouldGroup = options.group || options.group_level;\n const reduceFun = reducer(view.reduceFun);\n const groups = [];\n const lvl = isNaN(options.group_level)\n ? Number.POSITIVE_INFINITY\n : options.group_level;\n\n for (const result of results) {\n const last = groups[groups.length - 1];\n let groupKey = shouldGroup ? result.key : null;\n\n // only set group_level for array keys\n if (shouldGroup && Array.isArray(groupKey)) {\n groupKey = groupKey.slice(0, lvl);\n }\n\n if (last && collate(last.groupKey, groupKey) === 0) {\n last.keys.push([result.key, result.id]);\n last.values.push(result.value);\n continue;\n }\n groups.push({\n keys: [[result.key, result.id]],\n values: [result.value],\n groupKey\n });\n }\n\n results = [];\n for (const group of groups) {\n const reduceTry = tryReduce(view.sourceDB, reduceFun, group.keys, group.values, false);\n if (reduceTry.error && reduceTry.error instanceof BuiltInError) {\n // CouchDB returns an error if a built-in errors out\n throw reduceTry.error;\n }\n results.push({\n // CouchDB just sets the value to null if a non-built-in errors out\n value: reduceTry.error ? null : reduceTry.output,\n key: group.groupKey\n });\n }\n // no total_rows/offset when reducing\n return { rows: sliceResults(results, options.limit, options.skip) };\n }\n\n function queryView(view, opts) {\n return sequentialize(getQueue(view), function () {\n return queryViewInQueue(view, opts);\n })();\n }\n\n async function queryViewInQueue(view, opts) {\n let totalRows;\n const shouldReduce = view.reduceFun && opts.reduce !== false;\n const skip = opts.skip || 0;\n if (typeof opts.keys !== 'undefined' && !opts.keys.length) {\n // equivalent query\n opts.limit = 0;\n delete opts.keys;\n }\n\n async function fetchFromView(viewOpts) {\n viewOpts.include_docs = true;\n const res = await view.db.allDocs(viewOpts);\n totalRows = res.total_rows;\n\n return res.rows.map(function (result) {\n // implicit migration - in older versions of PouchDB,\n // we explicitly stored the doc as {id: ..., key: ..., value: ...}\n // this is tested in a migration test\n /* istanbul ignore next */\n if ('value' in result.doc && typeof result.doc.value === 'object' &&\n result.doc.value !== null) {\n const keys = Object.keys(result.doc.value).sort();\n // this detection method is not perfect, but it's unlikely the user\n // emitted a value which was an object with these 3 exact keys\n const expectedKeys = ['id', 'key', 'value'];\n if (!(keys < expectedKeys || keys > expectedKeys)) {\n return result.doc.value;\n }\n }\n\n const parsedKeyAndDocId = parseIndexableString(result.doc._id);\n return {\n key: parsedKeyAndDocId[0],\n id: parsedKeyAndDocId[1],\n value: ('value' in result.doc ? result.doc.value : null)\n };\n });\n }\n\n async function onMapResultsReady(rows) {\n let finalResults;\n if (shouldReduce) {\n finalResults = reduceView(view, rows, opts);\n } else if (typeof opts.keys === 'undefined') {\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows\n };\n } else {\n // support limit, skip for keys query\n finalResults = {\n total_rows: totalRows,\n offset: skip,\n rows: sliceResults(rows,opts.limit,opts.skip)\n };\n }\n /* istanbul ignore if */\n if (opts.update_seq) {\n finalResults.update_seq = view.seq;\n }\n if (opts.include_docs) {\n const docIds = uniq(rows.map(rowToDocId));\n\n const allDocsRes = await view.sourceDB.allDocs({\n keys: docIds,\n include_docs: true,\n conflicts: opts.conflicts,\n attachments: opts.attachments,\n binary: opts.binary\n });\n const docIdsToDocs = new Map();\n for (const row of allDocsRes.rows) {\n docIdsToDocs.set(row.id, row.doc);\n }\n for (const row of rows) {\n const docId = rowToDocId(row);\n const doc = docIdsToDocs.get(docId);\n if (doc) {\n row.doc = doc;\n }\n }\n }\n return finalResults;\n }\n\n if (typeof opts.keys !== 'undefined') {\n const keys = opts.keys;\n const fetchPromises = keys.map(function (key) {\n const viewOpts = {\n startkey : toIndexableString([key]),\n endkey : toIndexableString([key, {}])\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n return fetchFromView(viewOpts);\n });\n const result = await Promise.all(fetchPromises);\n const flattenedResult = result.flat();\n return onMapResultsReady(flattenedResult);\n } else { // normal query, no 'keys'\n const viewOpts = {\n descending : opts.descending\n };\n /* istanbul ignore if */\n if (opts.update_seq) {\n viewOpts.update_seq = true;\n }\n let startkey;\n let endkey;\n if ('start_key' in opts) {\n startkey = opts.start_key;\n }\n if ('startkey' in opts) {\n startkey = opts.startkey;\n }\n if ('end_key' in opts) {\n endkey = opts.end_key;\n }\n if ('endkey' in opts) {\n endkey = opts.endkey;\n }\n if (typeof startkey !== 'undefined') {\n viewOpts.startkey = opts.descending ?\n toIndexableString([startkey, {}]) :\n toIndexableString([startkey]);\n }\n if (typeof endkey !== 'undefined') {\n let inclusiveEnd = opts.inclusive_end !== false;\n if (opts.descending) {\n inclusiveEnd = !inclusiveEnd;\n }\n\n viewOpts.endkey = toIndexableString(\n inclusiveEnd ? [endkey, {}] : [endkey]);\n }\n if (typeof opts.key !== 'undefined') {\n const keyStart = toIndexableString([opts.key]);\n const keyEnd = toIndexableString([opts.key, {}]);\n if (viewOpts.descending) {\n viewOpts.endkey = keyStart;\n viewOpts.startkey = keyEnd;\n } else {\n viewOpts.startkey = keyStart;\n viewOpts.endkey = keyEnd;\n }\n }\n if (!shouldReduce) {\n if (typeof opts.limit === 'number') {\n viewOpts.limit = opts.limit;\n }\n viewOpts.skip = skip;\n }\n\n const result = await fetchFromView(viewOpts);\n return onMapResultsReady(result);\n }\n }\n\n async function httpViewCleanup(db) {\n const response = await db.fetch('_view_cleanup', {\n headers: new Headers({'Content-Type': 'application/json'}),\n method: 'POST'\n });\n return response.json();\n }\n\n async function localViewCleanup(db) {\n try {\n const metaDoc = await db.get('_local/' + localDocName);\n const docsToViews = new Map();\n\n for (const fullViewName of Object.keys(metaDoc.views)) {\n const parts = parseViewName(fullViewName);\n const designDocName = '_design/' + parts[0];\n const viewName = parts[1];\n let views = docsToViews.get(designDocName);\n if (!views) {\n views = new Set();\n docsToViews.set(designDocName, views);\n }\n views.add(viewName);\n }\n const opts = {\n keys : mapToKeysArray(docsToViews),\n include_docs : true\n };\n\n const res = await db.allDocs(opts);\n const viewsToStatus = {};\n for (const row of res.rows) {\n const ddocName = row.key.substring(8); // cuts off '_design/'\n for (const viewName of docsToViews.get(row.key)) {\n let fullViewName = ddocName + '/' + viewName;\n /* istanbul ignore if */\n if (!metaDoc.views[fullViewName]) {\n // new format, without slashes, to support PouchDB 2.2.0\n // migration test in pouchdb's browser.migration.js verifies this\n fullViewName = viewName;\n }\n const viewDBNames = Object.keys(metaDoc.views[fullViewName]);\n // design doc deleted, or view function nonexistent\n const statusIsGood = row.doc && row.doc.views &&\n row.doc.views[viewName];\n for (const viewDBName of viewDBNames) {\n viewsToStatus[viewDBName] = viewsToStatus[viewDBName] || statusIsGood;\n }\n }\n }\n\n const dbsToDelete = Object.keys(viewsToStatus)\n .filter(function (viewDBName) { return !viewsToStatus[viewDBName]; });\n\n const destroyPromises = dbsToDelete.map(function (viewDBName) {\n return sequentialize(getQueue(viewDBName), function () {\n return new db.constructor(viewDBName, db.__opts).destroy();\n })();\n });\n\n return Promise.all(destroyPromises).then(function () {\n return {ok: true};\n });\n } catch (err) {\n if (err.status === 404) {\n return {ok: true};\n } else {\n throw err;\n }\n }\n }\n\n async function queryPromised(db, fun, opts) {\n /* istanbul ignore next */\n if (typeof db._query === 'function') {\n return customQuery(db, fun, opts);\n }\n if (isRemote(db)) {\n return httpQuery(db, fun, opts);\n }\n\n const updateViewOpts = {\n changes_batch_size: db.__opts.view_update_changes_batch_size || CHANGES_BATCH_SIZE\n };\n\n if (typeof fun !== 'string') {\n // temp_view\n checkQueryParseError(opts, fun);\n\n tempViewQueue.add(async function () {\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ 'temp_view/temp_view',\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ true,\n /* localDocName */ localDocName);\n\n return fin(updateView(view, updateViewOpts).then(\n function () { return queryView(view, opts); }),\n function () { return view.db.destroy(); }\n );\n });\n return tempViewQueue.finish();\n } else {\n // persistent view\n const fullViewName = fun;\n const parts = parseViewName(fullViewName);\n const designDocName = parts[0];\n const viewName = parts[1];\n\n const doc = await db.get('_design/' + designDocName);\n fun = doc.views && doc.views[viewName];\n\n if (!fun) {\n // basic validator; it's assumed that every subclass would want this\n throw new NotFoundError(`ddoc ${doc._id} has no view named ${viewName}`);\n }\n\n ddocValidator(doc, viewName);\n checkQueryParseError(opts, fun);\n\n const view = await createView(\n /* sourceDB */ db,\n /* viewName */ fullViewName,\n /* mapFun */ fun.map,\n /* reduceFun */ fun.reduce,\n /* temporary */ false,\n /* localDocName */ localDocName);\n\n if (opts.stale === 'ok' || opts.stale === 'update_after') {\n if (opts.stale === 'update_after') {\n nextTick(function () {\n updateView(view, updateViewOpts);\n });\n }\n return queryView(view, opts);\n } else { // stale not ok\n await updateView(view, updateViewOpts);\n return queryView(view, opts);\n }\n }\n }\n\n function abstractQuery(fun, opts, callback) {\n const db = this;\n if (typeof opts === 'function') {\n callback = opts;\n opts = {};\n }\n opts = opts ? coerceOptions(opts) : {};\n\n if (typeof fun === 'function') {\n fun = {map : fun};\n }\n\n const promise = Promise.resolve().then(function () {\n return queryPromised(db, fun, opts);\n });\n promisedCallback(promise, callback);\n return promise;\n }\n\n const abstractViewCleanup = callbackify(function () {\n const db = this;\n /* istanbul ignore next */\n if (typeof db._viewCleanup === 'function') {\n return customViewCleanup(db);\n }\n if (isRemote(db)) {\n return httpViewCleanup(db);\n }\n return localViewCleanup(db);\n });\n\n return {\n query: abstractQuery,\n viewCleanup: abstractViewCleanup\n };\n}\n\nexport default createAbstractMapReduce;\n","import { clone } from 'pouchdb-utils';\nimport { collate } from 'pouchdb-collate';\n\n// this would just be \"return doc[field]\", but fields\n// can be \"deep\" due to dot notation\nfunction getFieldFromDoc(doc, parsedField) {\n var value = doc;\n for (var i = 0, len = parsedField.length; i < len; i++) {\n var key = parsedField[i];\n value = value[key];\n if (!value) {\n break;\n }\n }\n return value;\n}\n\nfunction setFieldInDoc(doc, parsedField, value) {\n for (var i = 0, len = parsedField.length; i < len-1; i++) {\n var elem = parsedField[i];\n doc = doc[elem] = doc[elem] || {};\n }\n doc[parsedField[len-1]] = value;\n}\n\nfunction compare(left, right) {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\n// Converts a string in dot notation to an array of its components, with backslash escaping\nfunction parseField(fieldName) {\n // fields may be deep (e.g. \"foo.bar.baz\"), so parse\n var fields = [];\n var current = '';\n for (var i = 0, len = fieldName.length; i < len; i++) {\n var ch = fieldName[i];\n if (i > 0 && fieldName[i - 1] === '\\\\' && (ch === '$' || ch === '.')) {\n // escaped delimiter\n current = current.substring(0, current.length - 1) + ch;\n } else if (ch === '.') {\n // When `.` is not escaped (above), it is a field delimiter\n fields.push(current);\n current = '';\n } else { // normal character\n current += ch;\n }\n }\n fields.push(current);\n return fields;\n}\n\nvar combinationFields = ['$or', '$nor', '$not'];\nfunction isCombinationalField(field) {\n return combinationFields.indexOf(field) > -1;\n}\n\nfunction getKey(obj) {\n return Object.keys(obj)[0];\n}\n\nfunction getValue(obj) {\n return obj[getKey(obj)];\n}\n\n\n// flatten an array of selectors joined by an $and operator\nfunction mergeAndedSelectors(selectors) {\n\n // sort to ensure that e.g. if the user specified\n // $and: [{$gt: 'a'}, {$gt: 'b'}], then it's collapsed into\n // just {$gt: 'b'}\n var res = {};\n var first = {$or: true, $nor: true};\n\n selectors.forEach(function (selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n if (typeof matcher !== 'object') {\n matcher = {$eq: matcher};\n }\n\n if (isCombinationalField(field)) {\n // or, nor\n if (matcher instanceof Array) {\n if (first[field]) {\n first[field] = false;\n res[field] = matcher;\n return;\n }\n\n var entries = [];\n res[field].forEach(function (existing) {\n Object.keys(matcher).forEach(function (key) {\n var m = matcher[key];\n var longest = Math.max(Object.keys(existing).length, Object.keys(m).length);\n var merged = mergeAndedSelectors([existing, m]);\n if (Object.keys(merged).length <= longest) {\n // we have a situation like: (a :{$eq :1} || ...) && (a {$eq: 2} || ...)\n // merging would produce a $eq 2 when actually we shouldn't ever match against these merged conditions\n // merged should always contain more values to be valid\n return;\n }\n entries.push(merged);\n });\n });\n res[field] = entries;\n } else {\n // not\n res[field] = mergeAndedSelectors([matcher]);\n }\n } else {\n var fieldMatchers = res[field] = res[field] || {};\n Object.keys(matcher).forEach(function (operator) {\n var value = matcher[operator];\n\n if (operator === '$gt' || operator === '$gte') {\n return mergeGtGte(operator, value, fieldMatchers);\n } else if (operator === '$lt' || operator === '$lte') {\n return mergeLtLte(operator, value, fieldMatchers);\n } else if (operator === '$ne') {\n return mergeNe(value, fieldMatchers);\n } else if (operator === '$eq') {\n return mergeEq(value, fieldMatchers);\n } else if (operator === \"$regex\") {\n return mergeRegex(value, fieldMatchers);\n }\n fieldMatchers[operator] = value;\n });\n }\n });\n });\n\n return res;\n}\n\n\n\n// collapse logically equivalent gt/gte values\nfunction mergeGtGte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$gte !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gte) { // more specificity\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value >= fieldMatchers.$gte) { // more specificity\n delete fieldMatchers.$gte;\n fieldMatchers.$gt = value;\n }\n }\n } else if (typeof fieldMatchers.$gt !== 'undefined') {\n if (operator === '$gte') {\n if (value > fieldMatchers.$gt) { // more specificity\n delete fieldMatchers.$gt;\n fieldMatchers.$gte = value;\n }\n } else { // operator === '$gt'\n if (value > fieldMatchers.$gt) { // more specificity\n fieldMatchers.$gt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// collapse logically equivalent lt/lte values\nfunction mergeLtLte(operator, value, fieldMatchers) {\n if (typeof fieldMatchers.$eq !== 'undefined') {\n return; // do nothing\n }\n if (typeof fieldMatchers.$lte !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lte) { // more specificity\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value <= fieldMatchers.$lte) { // more specificity\n delete fieldMatchers.$lte;\n fieldMatchers.$lt = value;\n }\n }\n } else if (typeof fieldMatchers.$lt !== 'undefined') {\n if (operator === '$lte') {\n if (value < fieldMatchers.$lt) { // more specificity\n delete fieldMatchers.$lt;\n fieldMatchers.$lte = value;\n }\n } else { // operator === '$gt'\n if (value < fieldMatchers.$lt) { // more specificity\n fieldMatchers.$lt = value;\n }\n }\n } else {\n fieldMatchers[operator] = value;\n }\n}\n\n// combine $ne values into one array\nfunction mergeNe(value, fieldMatchers) {\n if ('$ne' in fieldMatchers) {\n // there are many things this could \"not\" be\n fieldMatchers.$ne.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$ne = [value];\n }\n}\n\n// add $eq into the mix\nfunction mergeEq(value, fieldMatchers) {\n // these all have less specificity than the $eq\n // TODO: check for user errors here\n delete fieldMatchers.$gt;\n delete fieldMatchers.$gte;\n delete fieldMatchers.$lt;\n delete fieldMatchers.$lte;\n delete fieldMatchers.$ne;\n fieldMatchers.$eq = value;\n}\n\n// combine $regex values into one array\nfunction mergeRegex(value, fieldMatchers) {\n if ('$regex' in fieldMatchers) {\n // a value could match multiple regexes\n fieldMatchers.$regex.push(value);\n } else { // doesn't exist yet\n fieldMatchers.$regex = [value];\n }\n}\n\n//#7458: execute function mergeAndedSelectors on nested $and\nfunction mergeAndedSelectorsNested(obj) {\n for (var prop in obj) {\n if (Array.isArray(obj)) {\n for (var i in obj) {\n if (obj[i]['$and']) {\n obj[i] = mergeAndedSelectors(obj[i]['$and']);\n }\n }\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n mergeAndedSelectorsNested(value); // <- recursive call\n }\n }\n return obj;\n}\n\n//#7458: determine id $and is present in selector (at any level)\nfunction isAndInSelector(obj, isAnd) {\n for (var prop in obj) {\n if (prop === '$and') {\n isAnd = true;\n }\n var value = obj[prop];\n if (typeof value === 'object') {\n isAnd = isAndInSelector(value, isAnd); // <- recursive call\n }\n }\n return isAnd;\n}\n\n//\n// normalize the selector\n//\nfunction massageSelector(input) {\n var result = clone(input);\n\n //#7458: if $and is present in selector (at any level) merge nested $and\n if (isAndInSelector(result, false)) {\n result = mergeAndedSelectorsNested(result);\n if ('$and' in result) {\n result = mergeAndedSelectors(result['$and']);\n }\n }\n\n ['$or', '$nor'].forEach(function (orOrNor) {\n if (orOrNor in result) {\n // message each individual selector\n // e.g. {foo: 'bar'} becomes {foo: {$eq: 'bar'}}\n result[orOrNor].forEach(function (subSelector) {\n var fields = Object.keys(subSelector);\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = subSelector[field];\n if (typeof matcher !== 'object' || matcher === null) {\n subSelector[field] = {$eq: matcher};\n }\n }\n });\n }\n });\n\n if ('$not' in result) {\n //This feels a little like forcing, but it will work for now,\n //I would like to come back to this and make the merging of selectors a little more generic\n result['$not'] = mergeAndedSelectors([result['$not']]);\n }\n\n var fields = Object.keys(result);\n\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n var matcher = result[field];\n\n if (typeof matcher !== 'object' || matcher === null) {\n matcher = {$eq: matcher};\n }\n result[field] = matcher;\n }\n\n normalizeArrayOperators(result);\n\n return result;\n}\n\n//\n// The $ne and $regex values must be placed in an array because these operators can be used multiple times on the same field.\n// When $and is used, mergeAndedSelectors takes care of putting some of them into arrays, otherwise it's done here.\n//\nfunction normalizeArrayOperators(selector) {\n Object.keys(selector).forEach(function (field) {\n var matcher = selector[field];\n\n if (Array.isArray(matcher)) {\n matcher.forEach(function (matcherItem) {\n if (matcherItem && typeof matcherItem === 'object') {\n normalizeArrayOperators(matcherItem);\n }\n });\n } else if (field === '$ne') {\n selector.$ne = [matcher];\n } else if (field === '$regex') {\n selector.$regex = [matcher];\n } else if (matcher && typeof matcher === 'object') {\n normalizeArrayOperators(matcher);\n }\n });\n}\n\n// create a comparator based on the sort object\nfunction createFieldSorter(sort) {\n\n function getFieldValuesAsArray(doc) {\n return sort.map(function (sorting) {\n var fieldName = getKey(sorting);\n var parsedField = parseField(fieldName);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n return docFieldValue;\n });\n }\n\n return function (aRow, bRow) {\n var aFieldValues = getFieldValuesAsArray(aRow.doc);\n var bFieldValues = getFieldValuesAsArray(bRow.doc);\n var collation = collate(aFieldValues, bFieldValues);\n if (collation !== 0) {\n return collation;\n }\n // this is what mango seems to do\n return compare(aRow.doc._id, bRow.doc._id);\n };\n}\n\nfunction filterInMemoryFields(rows, requestDef, inMemoryFields) {\n rows = rows.filter(function (row) {\n return rowFilter(row.doc, requestDef.selector, inMemoryFields);\n });\n\n if (requestDef.sort) {\n // in-memory sort\n var fieldSorter = createFieldSorter(requestDef.sort);\n rows = rows.sort(fieldSorter);\n if (typeof requestDef.sort[0] !== 'string' &&\n getValue(requestDef.sort[0]) === 'desc') {\n rows = rows.reverse();\n }\n }\n\n if ('limit' in requestDef || 'skip' in requestDef) {\n // have to do the limit in-memory\n var skip = requestDef.skip || 0;\n var limit = ('limit' in requestDef ? requestDef.limit : rows.length) + skip;\n rows = rows.slice(skip, limit);\n }\n return rows;\n}\n\nfunction rowFilter(doc, selector, inMemoryFields) {\n return inMemoryFields.every(function (field) {\n var matcher = selector[field];\n var parsedField = parseField(field);\n var docFieldValue = getFieldFromDoc(doc, parsedField);\n if (isCombinationalField(field)) {\n return matchCominationalSelector(field, matcher, doc);\n }\n\n return matchSelector(matcher, doc, parsedField, docFieldValue);\n });\n}\n\nfunction matchSelector(matcher, doc, parsedField, docFieldValue) {\n if (!matcher) {\n // no filtering necessary; this field is just needed for sorting\n return true;\n }\n\n // is matcher an object, if so continue recursion\n if (typeof matcher === 'object') {\n return Object.keys(matcher).every(function (maybeUserOperator) {\n var userValue = matcher[ maybeUserOperator ];\n // explicit operator\n if (maybeUserOperator.indexOf(\"$\") === 0) {\n return match(maybeUserOperator, doc, userValue, parsedField, docFieldValue);\n } else {\n var subParsedField = parseField(maybeUserOperator);\n\n if (\n docFieldValue === undefined &&\n typeof userValue !== \"object\" &&\n subParsedField.length > 0\n ) {\n // the field does not exist, return or getFieldFromDoc will throw\n return false;\n }\n\n var subDocFieldValue = getFieldFromDoc(docFieldValue, subParsedField);\n\n if (typeof userValue === \"object\") {\n // field value is an object that might contain more operators\n return matchSelector(userValue, doc, parsedField, subDocFieldValue);\n }\n\n // implicit operator\n return match(\"$eq\", doc, userValue, subParsedField, subDocFieldValue);\n }\n });\n }\n\n // no more depth, No need to recurse further\n return matcher === docFieldValue;\n}\n\nfunction matchCominationalSelector(field, matcher, doc) {\n\n if (field === '$or') {\n return matcher.some(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n }\n\n if (field === '$not') {\n return !rowFilter(doc, matcher, Object.keys(matcher));\n }\n\n //`$nor`\n return !matcher.find(function (orMatchers) {\n return rowFilter(doc, orMatchers, Object.keys(orMatchers));\n });\n\n}\n\nfunction match(userOperator, doc, userValue, parsedField, docFieldValue) {\n if (!matchers[userOperator]) {\n /* istanbul ignore next */\n throw new Error('unknown operator \"' + userOperator +\n '\" - should be one of $eq, $lte, $lt, $gt, $gte, $exists, $ne, $in, ' +\n '$nin, $size, $mod, $regex, $elemMatch, $type, $allMatch or $all');\n }\n return matchers[userOperator](doc, userValue, parsedField, docFieldValue);\n}\n\nfunction fieldExists(docFieldValue) {\n return typeof docFieldValue !== 'undefined' && docFieldValue !== null;\n}\n\nfunction fieldIsNotUndefined(docFieldValue) {\n return typeof docFieldValue !== 'undefined';\n}\n\nfunction modField(docFieldValue, userValue) {\n if (typeof docFieldValue !== \"number\" ||\n parseInt(docFieldValue, 10) !== docFieldValue) {\n return false;\n }\n\n var divisor = userValue[0];\n var mod = userValue[1];\n\n return docFieldValue % divisor === mod;\n}\n\nfunction arrayContainsValue(docFieldValue, userValue) {\n return userValue.some(function (val) {\n if (docFieldValue instanceof Array) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n }\n\n return collate(val, docFieldValue) === 0;\n });\n}\n\nfunction arrayContainsAllValues(docFieldValue, userValue) {\n return userValue.every(function (val) {\n return docFieldValue.some(function (docFieldValueItem) {\n return collate(val, docFieldValueItem) === 0;\n });\n });\n}\n\nfunction arraySize(docFieldValue, userValue) {\n return docFieldValue.length === userValue;\n}\n\nfunction regexMatch(docFieldValue, userValue) {\n var re = new RegExp(userValue);\n\n return re.test(docFieldValue);\n}\n\nfunction typeMatch(docFieldValue, userValue) {\n\n switch (userValue) {\n case 'null':\n return docFieldValue === null;\n case 'boolean':\n return typeof (docFieldValue) === 'boolean';\n case 'number':\n return typeof (docFieldValue) === 'number';\n case 'string':\n return typeof (docFieldValue) === 'string';\n case 'array':\n return docFieldValue instanceof Array;\n case 'object':\n return ({}).toString.call(docFieldValue) === '[object Object]';\n }\n}\n\nvar matchers = {\n\n '$elemMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.some(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.some(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$allMatch': function (doc, userValue, parsedField, docFieldValue) {\n if (!Array.isArray(docFieldValue)) {\n return false;\n }\n\n /* istanbul ignore next */\n if (docFieldValue.length === 0) {\n return false;\n }\n\n if (typeof docFieldValue[0] === 'object' && docFieldValue[0] !== null) {\n return docFieldValue.every(function (val) {\n return rowFilter(val, userValue, Object.keys(userValue));\n });\n }\n\n return docFieldValue.every(function (val) {\n return matchSelector(userValue, doc, parsedField, val);\n });\n },\n\n '$eq': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) === 0;\n },\n\n '$gte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) >= 0;\n },\n\n '$gt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) > 0;\n },\n\n '$lte': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) <= 0;\n },\n\n '$lt': function (doc, userValue, parsedField, docFieldValue) {\n return fieldIsNotUndefined(docFieldValue) && collate(docFieldValue, userValue) < 0;\n },\n\n '$exists': function (doc, userValue, parsedField, docFieldValue) {\n //a field that is null is still considered to exist\n if (userValue) {\n return fieldIsNotUndefined(docFieldValue);\n }\n\n return !fieldIsNotUndefined(docFieldValue);\n },\n\n '$mod': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && modField(docFieldValue, userValue);\n },\n\n '$ne': function (doc, userValue, parsedField, docFieldValue) {\n return userValue.every(function (neValue) {\n return collate(docFieldValue, neValue) !== 0;\n });\n },\n '$in': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && arrayContainsValue(docFieldValue, userValue);\n },\n\n '$nin': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) && !arrayContainsValue(docFieldValue, userValue);\n },\n\n '$size': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n Array.isArray(docFieldValue) &&\n arraySize(docFieldValue, userValue);\n },\n\n '$all': function (doc, userValue, parsedField, docFieldValue) {\n return Array.isArray(docFieldValue) && arrayContainsAllValues(docFieldValue, userValue);\n },\n\n '$regex': function (doc, userValue, parsedField, docFieldValue) {\n return fieldExists(docFieldValue) &&\n typeof docFieldValue == \"string\" &&\n userValue.every(function (regexValue) {\n return regexMatch(docFieldValue, regexValue);\n });\n },\n\n '$type': function (doc, userValue, parsedField, docFieldValue) {\n return typeMatch(docFieldValue, userValue);\n }\n};\n\n// return true if the given doc matches the supplied selector\nfunction matchesSelector(doc, selector) {\n /* istanbul ignore if */\n if (typeof selector !== 'object') {\n // match the CouchDB error message\n throw new Error('Selector error: expected a JSON object');\n }\n\n selector = massageSelector(selector);\n var row = {\n doc\n };\n\n var rowsMatched = filterInMemoryFields([row], { selector }, Object.keys(selector));\n return rowsMatched && rowsMatched.length === 1;\n}\n\nexport { massageSelector, matchesSelector, filterInMemoryFields, createFieldSorter, rowFilter, isCombinationalField, getKey, getValue, getFieldFromDoc, setFieldInDoc, compare, parseField };\n","import { createError, generateErrorFromResponse } from 'pouchdb-errors';\nimport { Headers } from 'pouchdb-fetch';\nimport abstractMapReduce from 'pouchdb-abstract-mapreduce';\nimport { stringMd5 } from 'pouchdb-md5';\nimport { collate } from 'pouchdb-collate';\nimport { getFieldFromDoc, setFieldInDoc, parseField, matchesSelector, getKey, getValue, massageSelector, compare, filterInMemoryFields } from 'pouchdb-selector-core';\nimport { clone, upsert, isRemote } from 'pouchdb-utils';\n\nconst nativeFlat = (...args) => args.flat(Infinity);\n\nconst polyFlat = (...args) => {\n let res = [];\n for (const subArr of args) {\n if (Array.isArray(subArr)) {\n res = res.concat(polyFlat(...subArr));\n } else {\n res.push(subArr);\n }\n }\n return res;\n};\n\nconst flatten = typeof Array.prototype.flat === 'function'\n ? nativeFlat\n : polyFlat;\n\nfunction mergeObjects(arr) {\n const res = {};\n for (const element of arr) {\n Object.assign(res, element);\n }\n return res;\n}\n\n// Selects a list of fields defined in dot notation from one doc\n// and copies them to a new doc. Like underscore _.pick but supports nesting.\nfunction pick(obj, arr) {\n const res = {};\n for (const field of arr) {\n const parsedField = parseField(field);\n const value = getFieldFromDoc(obj, parsedField);\n if (typeof value !== 'undefined') {\n setFieldInDoc(res, parsedField, value);\n }\n }\n return res;\n}\n\n// e.g. ['a'], ['a', 'b'] is true, but ['b'], ['a', 'b'] is false\nfunction oneArrayIsSubArrayOfOther(left, right) {\n for (let i = 0, len = Math.min(left.length, right.length); i < len; i++) {\n if (left[i] !== right[i]) {\n return false;\n }\n }\n return true;\n}\n\n// e.g.['a', 'b', 'c'], ['a', 'b'] is false\nfunction oneArrayIsStrictSubArrayOfOther(left, right) {\n if (left.length > right.length) {\n return false;\n }\n\n return oneArrayIsSubArrayOfOther(left, right);\n}\n\n// same as above, but treat the left array as an unordered set\n// e.g. ['b', 'a'], ['a', 'b', 'c'] is true, but ['c'], ['a', 'b', 'c'] is false\nfunction oneSetIsSubArrayOfOther(left, right) {\n left = left.slice();\n for (const field of right) {\n if (!left.length) {\n break;\n }\n const leftIdx = left.indexOf(field);\n if (leftIdx === -1) {\n return false;\n } else {\n left.splice(leftIdx, 1);\n }\n }\n return true;\n}\n\nfunction arrayToObject(arr) {\n const res = {};\n for (const field of arr) {\n res[field] = true;\n }\n return res;\n}\n\nfunction max(arr, fun) {\n let max = null;\n let maxScore = -1;\n for (const element of arr) {\n const score = fun(element);\n if (score > maxScore) {\n maxScore = score;\n max = element;\n }\n }\n return max;\n}\n\nfunction arrayEquals(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return false;\n }\n for (let i = 0, len = arr1.length; i < len; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction uniq(arr) {\n return Array.from(new Set(arr));\n}\n\n/**\n * Callbackifyable wrapper for async functions\n *\n * @template T, Args\n * @param {(...args: Args) => Promise<T>} fun\n * @returns {<CBArgs = [...Args, (err: any, value: T) => void], InnerArgs extends Args | CBArgs>(...innerArgs: InnerArgs) => InnerArgs extends CBArgs ? void : Promise<T>}\n *\n * @example\n * const fn = resolveToCallback(async () => { return 42; })\n * // with callback:\n * fn((err, value) => { ... })\n * // with await:\n * const value = await fn()\n */\nfunction resolveToCallback(fun) {\n return function (...args) {\n const maybeCallback = args[args.length - 1];\n if (typeof maybeCallback === \"function\") {\n const fulfilled = maybeCallback.bind(null, null);\n const rejected = maybeCallback.bind(null);\n fun.apply(this, args.slice(0, -1)).then(fulfilled, rejected);\n } else {\n return fun.apply(this, args);\n }\n };\n}\n\n// we restructure the supplied JSON considerably, because the official\n// Mango API is very particular about a lot of this stuff, but we like\n// to be liberal with what we accept in order to prevent mental\n// breakdowns in our users\nfunction massageCreateIndexRequest(requestDef) {\n requestDef = clone(requestDef);\n\n if (!requestDef.index) {\n requestDef.index = {};\n }\n\n for (const key of ['type', 'name', 'ddoc']) {\n if (requestDef.index[key]) {\n requestDef[key] = requestDef.index[key];\n delete requestDef.index[key];\n }\n }\n\n if (requestDef.fields) {\n requestDef.index.fields = requestDef.fields;\n delete requestDef.fields;\n }\n\n if (!requestDef.type) {\n requestDef.type = 'json';\n }\n return requestDef;\n}\n\nfunction isNonNullObject(value) {\n return typeof value === 'object' && value !== null;\n}\n\n// throws if the user is using the wrong query field value type\nfunction checkFieldValueType(name, value, isHttp) {\n let message = '';\n let received = value;\n let addReceived = true;\n if (['$in', '$nin', '$or', '$and', '$mod', '$nor', '$all'].indexOf(name) !== -1) {\n if (!Array.isArray(value)) {\n message = 'Query operator ' + name + ' must be an array.';\n\n }\n }\n\n if (['$not', '$elemMatch', '$allMatch'].indexOf(name) !== -1) {\n if (!(!Array.isArray(value) && isNonNullObject(value))) {\n message = 'Query operator ' + name + ' must be an object.';\n }\n }\n\n if (name === '$mod' && Array.isArray(value)) {\n if (value.length !== 2) {\n message = 'Query operator $mod must be in the format [divisor, remainder], ' +\n 'where divisor and remainder are both integers.';\n } else {\n const divisor = value[0];\n const mod = value[1];\n if (divisor === 0) {\n message = 'Query operator $mod\\'s divisor cannot be 0, cannot divide by zero.';\n addReceived = false;\n }\n if (typeof divisor !== 'number' || parseInt(divisor, 10) !== divisor) {\n message = 'Query operator $mod\\'s divisor is not an integer.';\n received = divisor;\n }\n if (parseInt(mod, 10) !== mod) {\n message = 'Query operator $mod\\'s remainder is not an integer.';\n received = mod;\n }\n }\n }\n if (name === '$exists') {\n if (typeof value !== 'boolean') {\n message = 'Query operator $exists must be a boolean.';\n }\n }\n\n if (name === '$type') {\n const allowed = ['null', 'boolean', 'number', 'string', 'array', 'object'];\n const allowedStr = '\"' + allowed.slice(0, allowed.length - 1).join('\", \"') + '\", or \"' + allowed[allowed.length - 1] + '\"';\n if (typeof value !== 'string') {\n message = 'Query operator $type must be a string. Supported values: ' + allowedStr + '.';\n } else if (allowed.indexOf(value) == -1) {\n message = 'Query operator $type must be a string. Supported values: ' + allowedStr + '.';\n }\n }\n\n if (name === '$size') {\n if (parseInt(value, 10) !== value) {\n message = 'Query operator $size must be a integer.';\n }\n }\n\n if (name === '$regex') {\n if (typeof value !== 'string') {\n if (isHttp) {\n message = 'Query operator $regex must be a string.';\n } else if (!(value instanceof RegExp)) {\n message = 'Query operator $regex must be a string or an instance ' +\n 'of a javascript regular expression.';\n }\n }\n }\n\n if (message) {\n if (addReceived) {\n const type = received === null\n ? ' '\n : Array.isArray(received)\n ? ' array'\n : ' ' + typeof received;\n const receivedStr = isNonNullObject(received)\n ? JSON.stringify(received, null, '\\t')\n : received;\n\n message += ' Received' + type + ': ' + receivedStr;\n }\n throw new Error(message);\n }\n}\n\nconst requireValidation = ['$all', '$allMatch', '$and', '$elemMatch', '$exists', '$in', '$mod', '$nin', '$nor', '$not', '$or', '$regex', '$size', '$type'];\nconst arrayTypeComparisonOperators = ['$in', '$nin', '$mod', '$all'];\nconst equalityOperators = ['$eq', '$gt', '$gte', '$lt', '$lte'];\n\n// recursively walks down the a query selector validating any operators\nfunction validateSelector(input, isHttp) {\n if (Array.isArray(input)) {\n for (const entry of input) {\n if (isNonNullObject(entry)) {\n validateSelector(entry, isHttp);\n }\n }\n }\n else {\n for (const [key, value] of Object.entries(input)) {\n if (requireValidation.indexOf(key) !== -1) {\n checkFieldValueType(key, value, isHttp);\n }\n if (equalityOperators.indexOf(key) !== -1) {\n // skip, explicit comparison operators can be anything\n continue;\n }\n if (arrayTypeComparisonOperators.indexOf(key) !== -1) {\n // skip, their values are already valid\n continue;\n }\n if (isNonNullObject(value)) {\n validateSelector(value, isHttp);\n }\n }\n }\n}\n\nasync function dbFetch(db, path, opts) {\n if (opts.body) {\n opts.body = JSON.stringify(opts.body);\n opts.headers = new Headers({ 'Content-type': 'application/json' });\n }\n\n const response = await db.fetch(path, opts);\n const json = await response.json();\n if (!response.ok) {\n json.status = response.status;\n const pouchError = createError(json);\n throw generateErrorFromResponse(pouchError);\n }\n return json;\n}\n\nasync function createIndex(db, requestDef) {\n return await dbFetch(db, '_index', {\n method: 'POST',\n body: massageCreateIndexRequest(requestDef)\n });\n}\n\nasync function find(db, requestDef) {\n validateSelector(requestDef.selector, true);\n return await dbFetch(db, '_find', {\n method: 'POST',\n body: requestDef\n });\n}\n\nasync function explain(db, requestDef) {\n return await dbFetch(db, '_explain', {\n method: 'POST',\n body: requestDef\n });\n}\n\nasync function getIndexes(db) {\n return await dbFetch(db, '_index', {\n method: 'GET'\n });\n}\n\nasync function deleteIndex(db, indexDef) {\n const ddoc = indexDef.ddoc;\n const type = indexDef.type || 'json';\n const name = indexDef.name;\n\n if (!ddoc) {\n throw new Error('you must provide an index\\'s ddoc');\n }\n\n if (!name) {\n throw new Error('you must provide an index\\'s name');\n }\n\n const url = '_index/' + [ddoc, type, name].map(encodeURIComponent).join('/');\n\n return await dbFetch(db, url, { method: 'DELETE' });\n}\n\n//\n// One thing about these mappers:\n//\n// Per the advice of John-David Dalton (http://youtu.be/NthmeLEhDDM),\n// what you want to do in this case is optimize for the smallest possible\n// function, since that's the thing that gets run over and over again.\n//\n// This code would be a lot simpler if all the if/elses were inside\n// the function, but it would also be a lot less performant.\n//\n\nfunction getDeepValue(value, path) {\n for (const key of path) {\n value = value[key];\n if (value === undefined) {\n return undefined;\n }\n }\n return value;\n}\n\nfunction createDeepMultiMapper(fields, emit, selector) {\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n\n const toEmit = [];\n for (const field of fields) {\n const value = getDeepValue(doc, parseField(field));\n if (value === undefined) {\n return;\n }\n toEmit.push(value);\n }\n emit(toEmit);\n };\n}\n\nfunction createDeepSingleMapper(field, emit, selector) {\n const parsedField = parseField(field);\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n\n const value = getDeepValue(doc, parsedField);\n if (value !== undefined) {\n emit(value);\n }\n };\n}\n\nfunction createShallowSingleMapper(field, emit, selector) {\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n emit(doc[field]);\n };\n}\n\nfunction createShallowMultiMapper(fields, emit, selector) {\n return function (doc) {\n if (selector && !matchesSelector(doc, selector)) { return; }\n const toEmit = fields.map(field => doc[field]);\n emit(toEmit);\n };\n}\n\nfunction checkShallow(fields) {\n return fields.every((field) => field.indexOf('.') === -1);\n}\n\nfunction createMapper(fields, emit, selector) {\n const isShallow = checkShallow(fields);\n const isSingle = fields.length === 1;\n\n // notice we try to optimize for the most common case,\n // i.e. single shallow indexes\n if (isShallow) {\n if (isSingle) {\n return createShallowSingleMapper(fields[0], emit, selector);\n } else { // multi\n return createShallowMultiMapper(fields, emit, selector);\n }\n } else { // deep\n if (isSingle) {\n return createDeepSingleMapper(fields[0], emit, selector);\n } else { // multi\n return createDeepMultiMapper(fields, emit, selector);\n }\n }\n}\n\nfunction mapper(mapFunDef, emit) {\n // mapFunDef is a list of fields\n\n const fields = Object.keys(mapFunDef.fields);\n const partialSelector = mapFunDef.partial_filter_selector;\n\n return createMapper(fields, emit, partialSelector);\n}\n\n/* istanbul ignore next */\nfunction reducer(/*reduceFunDef*/) {\n throw new Error('reduce not supported');\n}\n\nfunction ddocValidator(ddoc, viewName) {\n const view = ddoc.views[viewName];\n // This doesn't actually need to be here apparently, but\n // I feel safer keeping it.\n /* istanbul ignore if */\n if (!view.map || !view.map.fields) {\n throw new Error('ddoc ' + ddoc._id + ' with view ' + viewName +\n ' doesn\\'t have map.fields defined. ' +\n 'maybe it wasn\\'t created by this plugin?');\n }\n}\n\nconst abstractMapper = abstractMapReduce(\n /* localDocName */ 'indexes',\n mapper,\n reducer,\n ddocValidator\n);\n\nfunction abstractMapper$1 (db) {\n if (db._customFindAbstractMapper) {\n return {\n // Calls the _customFindAbstractMapper, but with a third argument:\n // the standard findAbstractMapper query/viewCleanup.\n // This allows the indexeddb adapter to support partial_filter_selector.\n query: function addQueryFallback(signature, opts) {\n const fallback = abstractMapper.query.bind(this);\n return db._customFindAbstractMapper.query.call(this, signature, opts, fallback);\n },\n viewCleanup: function addViewCleanupFallback() {\n const fallback = abstractMapper.viewCleanup.bind(this);\n return db._customFindAbstractMapper.viewCleanup.call(this, fallback);\n }\n };\n }\n return abstractMapper;\n}\n\n// normalize the \"sort\" value\nfunction massageSort(sort) {\n if (!Array.isArray(sort)) {\n throw new Error('invalid sort json - should be an array');\n }\n return sort.map(function (sorting) {\n if (typeof sorting === 'string') {\n const obj = {};\n obj[sorting] = 'asc';\n return obj;\n } else {\n return sorting;\n }\n });\n}\n\nconst ddocIdPrefix = /^_design\\//;\nfunction massageUseIndex(useIndex) {\n let cleanedUseIndex = [];\n if (typeof useIndex === 'string') {\n cleanedUseIndex.push(useIndex);\n } else {\n cleanedUseIndex = useIndex;\n }\n\n return cleanedUseIndex.map(function (name) {\n return name.replace(ddocIdPrefix, '');\n });\n}\n\nfunction massageIndexDef(indexDef) {\n indexDef.fields = indexDef.fields.map(function (field) {\n if (typeof field === 'string') {\n const obj = {};\n obj[field] = 'asc';\n return obj;\n }\n return field;\n });\n if (indexDef.partial_filter_selector) {\n indexDef.partial_filter_selector = massageSelector(\n indexDef.partial_filter_selector\n );\n }\n return indexDef;\n}\n\nfunction getKeyFromDoc(doc, index) {\n return index.def.fields.map((obj) => {\n const field = getKey(obj);\n return getFieldFromDoc(doc, parseField(field));\n });\n}\n\n// have to do this manually because REASONS. I don't know why\n// CouchDB didn't implement inclusive_start\nfunction filterInclusiveStart(rows, targetValue, index) {\n const indexFields = index.def.fields;\n let startAt = 0;\n for (const row of rows) {\n // shave off any docs at the beginning that are <= the\n // target value\n\n let docKey = getKeyFromDoc(row.doc, index);\n if (indexFields.length === 1) {\n docKey = docKey[0]; // only one field, not multi-field\n } else { // more than one field in index\n // in the case where e.g. the user is searching {$gt: {a: 1}}\n // but the index is [a, b], then we need to shorten the doc key\n while (docKey.length > targetValue.length) {\n docKey.pop();\n }\n }\n //ABS as we just looking for values that don't match\n if (Math.abs(collate(docKey, targetValue)) > 0) {\n // no need to filter any further; we're past the key\n break;\n }\n ++startAt;\n }\n return startAt > 0 ? rows.slice(startAt) : rows;\n}\n\nfunction reverseOptions(opts) {\n const newOpts = clone(opts);\n delete newOpts.startkey;\n delete newOpts.endkey;\n delete newOpts.inclusive_start;\n delete newOpts.inclusive_end;\n\n if ('endkey' in opts) {\n newOpts.startkey = opts.endkey;\n }\n if ('startkey' in opts) {\n newOpts.endkey = opts.startkey;\n }\n if ('inclusive_start' in opts) {\n newOpts.inclusive_end = opts.inclusive_start;\n }\n if ('inclusive_end' in opts) {\n newOpts.inclusive_start = opts.inclusive_end;\n }\n return newOpts;\n}\n\nfunction validateIndex(index) {\n const ascFields = index.fields.filter(function (field) {\n return getValue(field) === 'asc';\n });\n if (ascFields.length !== 0 && ascFields.length !== index.fields.length) {\n throw new Error('unsupported mixed sorting');\n }\n}\n\nfunction validateSort(requestDef, index) {\n if (index.defaultUsed && requestDef.sort) {\n const noneIdSorts = requestDef.sort.filter(function (sortItem) {\n return Object.keys(sortItem)[0] !== '_id';\n }).map(function (sortItem) {\n return Object.keys(sortItem)[0];\n });\n\n if (noneIdSorts.length > 0) {\n throw new Error('Cannot sort on field(s) \"' + noneIdSorts.join(',') +\n '\" when using the default index');\n }\n }\n\n if (index.defaultUsed) {\n return;\n }\n}\n\nfunction validateFindRequest(requestDef) {\n if (typeof requestDef.selector !== 'object') {\n throw new Error('you must provide a selector when you find()');\n }\n\n /*var selectors = requestDef.selector['$and'] || [requestDef.selector];\n for (var i = 0; i < selectors.length; i++) {\n var selector = selectors[i];\n var keys = Object.keys(selector);\n if (keys.length === 0) {\n throw new Error('invalid empty selector');\n }\n //var selection = selector[keys[0]];\n /*if (Object.keys(selection).length !== 1) {\n throw new Error('invalid selector: ' + JSON.stringify(selection) +\n ' - it must have exactly one key/value');\n }\n }*/\n}\n\n// determine the maximum number of fields\n// we're going to need to query, e.g. if the user\n// has selection ['a'] and sorting ['a', 'b'], then we\n// need to use the longer of the two: ['a', 'b']\nfunction getUserFields(selector, sort) {\n const selectorFields = Object.keys(selector);\n const sortFields = sort ? sort.map(getKey) : [];\n let userFields;\n if (selectorFields.length >= sortFields.length) {\n userFields = selectorFields;\n } else {\n userFields = sortFields;\n }\n\n if (sortFields.length === 0) {\n return {\n fields: userFields\n };\n }\n\n // sort according to the user's preferred sorting\n userFields = userFields.sort(function (left, right) {\n let leftIdx = sortFields.indexOf(left);\n if (leftIdx === -1) {\n leftIdx = Number.MAX_VALUE;\n }\n let rightIdx = sortFields.indexOf(right);\n if (rightIdx === -1) {\n rightIdx = Number.MAX_VALUE;\n }\n return leftIdx < rightIdx ? -1 : leftIdx > rightIdx ? 1 : 0;\n });\n\n return {\n fields: userFields,\n sortOrder: sort.map(getKey)\n };\n}\n\nasync function createIndex$1(db, requestDef) {\n requestDef = massageCreateIndexRequest(requestDef);\n const originalIndexDef = clone(requestDef.index);\n requestDef.index = massageIndexDef(requestDef.index);\n\n validateIndex(requestDef.index);\n\n // calculating md5 is expensive - memoize and only\n // run if required\n let md5;\n function getMd5() {\n return md5 || (md5 = stringMd5(JSON.stringify(requestDef)));\n }\n\n const viewName = requestDef.name || ('idx-' + getMd5());\n\n const ddocName = requestDef.ddoc || ('idx-' + getMd5());\n const ddocId = '_design/' + ddocName;\n\n let hasInvalidLanguage = false;\n let viewExists = false;\n\n function updateDdoc(doc) {\n if (doc._rev && doc.language !== 'query') {\n hasInvalidLanguage = true;\n }\n doc.language = 'query';\n doc.views = doc.views || {};\n\n viewExists = !!doc.views[viewName];\n\n if (viewExists) {\n return false;\n }\n\n doc.views[viewName] = {\n map: {\n fields: mergeObjects(requestDef.index.fields),\n partial_filter_selector: requestDef.index.partial_filter_selector\n },\n reduce: '_count',\n options: {\n def: originalIndexDef\n }\n };\n\n return doc;\n }\n\n db.constructor.emit('debug', ['find', 'creating index', ddocId]);\n\n await upsert(db, ddocId, updateDdoc);\n\n if (hasInvalidLanguage) {\n throw new Error('invalid language for ddoc with id \"' +\n ddocId +\n '\" (should be \"query\")');\n }\n\n // kick off a build\n // TODO: abstract-pouchdb-mapreduce should support auto-updating\n // TODO: should also use update_after, but pouchdb/pouchdb#3415 blocks me\n const signature = ddocName + '/' + viewName;\n await abstractMapper$1(db).query.call(db, signature, {\n limit: 0,\n reduce: false\n });\n return {\n id: ddocId,\n name: viewName,\n result: viewExists ? 'exists' : 'created'\n };\n}\n\nasync function getIndexes$1(db) {\n // just search through all the design docs and filter in-memory.\n // hopefully there aren't that many ddocs.\n const allDocsRes = await db.allDocs({\n startkey: '_design/',\n endkey: '_design/\\uffff',\n include_docs: true\n });\n const res = {\n indexes: [{\n ddoc: null,\n name: '_all_docs',\n type: 'special',\n def: {\n fields: [{ _id: 'asc' }]\n }\n }]\n };\n\n res.indexes = flatten(res.indexes, allDocsRes.rows.filter(function (row) {\n return row.doc.language === 'query';\n }).map(function (row) {\n const viewNames = row.doc.views !== undefined ? Object.keys(row.doc.views) : [];\n\n return viewNames.map(function (viewName) {\n const view = row.doc.views[viewName];\n return {\n ddoc: row.id,\n name: viewName,\n type: 'json',\n def: massageIndexDef(view.options.def)\n };\n });\n }));\n\n // these are sorted by view name for some reason\n res.indexes.sort(function (left, right) {\n return compare(left.name, right.name);\n });\n res.total_rows = res.indexes.length;\n return res;\n}\n\n// couchdb lowest collation value\nconst COLLATE_LO = null;\n\n// couchdb highest collation value (TODO: well not really, but close enough amirite)\nconst COLLATE_HI = { \"\\uffff\": {} };\n\nconst SHORT_CIRCUIT_QUERY = {\n queryOpts: { limit: 0, startkey: COLLATE_HI, endkey: COLLATE_LO },\n inMemoryFields: [],\n};\n\n// couchdb second-lowest collation value\n\nfunction checkFieldInIndex(index, field) {\n return index.def.fields\n .some((key) => getKey(key) === field);\n}\n\n// so when you do e.g. $eq/$eq, we can do it entirely in the database.\n// but when you do e.g. $gt/$eq, the first part can be done\n// in the database, but the second part has to be done in-memory,\n// because $gt has forced us to lose precision.\n// so that's what this determines\nfunction userOperatorLosesPrecision(selector, field) {\n const matcher = selector[field];\n const userOperator = getKey(matcher);\n\n return userOperator !== '$eq';\n}\n\n// sort the user fields by their position in the index,\n// if they're in the index\nfunction sortFieldsByIndex(userFields, index) {\n const indexFields = index.def.fields.map(getKey);\n\n return userFields.slice().sort(function (a, b) {\n let aIdx = indexFields.indexOf(a);\n let bIdx = indexFields.indexOf(b);\n if (aIdx === -1) {\n aIdx = Number.MAX_VALUE;\n }\n if (bIdx === -1) {\n bIdx = Number.MAX_VALUE;\n }\n return compare(aIdx, bIdx);\n });\n}\n\n// first pass to try to find fields that will need to be sorted in-memory\nfunction getBasicInMemoryFields(index, selector, userFields) {\n userFields = sortFieldsByIndex(userFields, index);\n\n // check if any of the user selectors lose precision\n let needToFilterInMemory = false;\n for (let i = 0, len = userFields.length; i < len; i++) {\n const field = userFields[i];\n if (needToFilterInMemory || !checkFieldInIndex(index, field)) {\n return userFields.slice(i);\n }\n if (i < len - 1 && userOperatorLosesPrecision(selector, field)) {\n needToFilterInMemory = true;\n }\n }\n return [];\n}\n\nfunction getInMemoryFieldsFromNe(selector) {\n const fields = [];\n for (const [field, matcher] of Object.entries(selector)) {\n for (const operator of Object.keys(matcher)) {\n if (operator === '$ne') {\n fields.push(field);\n }\n }\n }\n return fields;\n}\n\nfunction getInMemoryFields(coreInMemoryFields, index, selector, userFields) {\n const result = flatten(\n // in-memory fields reported as necessary by the query planner\n coreInMemoryFields,\n // combine with another pass that checks for any we may have missed\n getBasicInMemoryFields(index, selector, userFields),\n // combine with another pass that checks for $ne's\n getInMemoryFieldsFromNe(selector)\n );\n\n return sortFieldsByIndex(uniq(result), index);\n}\n\n// check that at least one field in the user's query is represented\n// in the index. order matters in the case of sorts\nfunction checkIndexFieldsMatch(indexFields, sortOrder, fields) {\n if (sortOrder) {\n // array has to be a strict subarray of index array. furthermore,\n // the sortOrder fields need to all be represented in the index\n const sortMatches = oneArrayIsStrictSubArrayOfOther(sortOrder, indexFields);\n const selectorMatches = oneArrayIsSubArrayOfOther(fields, indexFields);\n\n return sortMatches && selectorMatches;\n }\n\n // all of the user's specified fields still need to be\n // on the left side of the index array, although the order\n // doesn't matter\n return oneSetIsSubArrayOfOther(fields, indexFields);\n}\n\nconst logicalMatchers = ['$eq', '$gt', '$gte', '$lt', '$lte'];\nfunction isNonLogicalMatcher(matcher) {\n return logicalMatchers.indexOf(matcher) === -1;\n}\n\n// check all the index fields for usages of '$ne'\n// e.g. if the user queries {foo: {$ne: 'foo'}, bar: {$eq: 'bar'}},\n// then we can neither use an index on ['foo'] nor an index on\n// ['foo', 'bar'], but we can use an index on ['bar'] or ['bar', 'foo']\nfunction checkFieldsLogicallySound(indexFields, selector) {\n const firstField = indexFields[0];\n const matcher = selector[firstField];\n\n if (typeof matcher === 'undefined') {\n /* istanbul ignore next */\n return true;\n }\n\n const isInvalidNe = Object.keys(matcher).length === 1 &&\n getKey(matcher) === '$ne';\n\n return !isInvalidNe;\n}\n\nfunction checkIndexMatches(index, sortOrder, fields, selector) {\n const indexFields = index.def.fields.map(getKey);\n const fieldsMatch = checkIndexFieldsMatch(indexFields, sortOrder, fields);\n\n if (!fieldsMatch) {\n return false;\n }\n\n return checkFieldsLogicallySound(indexFields, selector);\n}\n\n//\n// the algorithm is very simple:\n// take all the fields the user supplies, and if those fields\n// are a strict subset of the fields in some index,\n// then use that index\n//\nfunction findMatchingIndexes(selector, userFields, sortOrder, indexes) {\n return indexes.filter(function (index) {\n return checkIndexMatches(index, sortOrder, userFields, selector);\n });\n}\n\n// find the best index, i.e. the one that matches the most fields\n// in the user's query\nfunction findBestMatchingIndex(selector, userFields, sortOrder, indexes, useIndex) {\n const matchingIndexes = findMatchingIndexes(selector, userFields, sortOrder, indexes);\n\n if (matchingIndexes.length === 0) {\n if (useIndex) {\n throw {\n error: \"no_usable_index\",\n message: \"There is no index available for this selector.\"\n };\n }\n // return `all_docs` as a default index;\n // I'm assuming that _all_docs is always first\n const defaultIndex = indexes[0];\n defaultIndex.defaultUsed = true;\n return defaultIndex;\n }\n if (matchingIndexes.length === 1 && !useIndex) {\n return matchingIndexes[0];\n }\n\n const userFieldsMap = arrayToObject(userFields);\n\n function scoreIndex(index) {\n const indexFields = index.def.fields.map(getKey);\n let score = 0;\n for (const indexField of indexFields) {\n if (userFieldsMap[indexField]) {\n score++;\n }\n }\n return score;\n }\n\n if (useIndex) {\n const useIndexDdoc = '_design/' + useIndex[0];\n const useIndexName = useIndex.length === 2 ? useIndex[1] : false;\n const index = matchingIndexes.find(function (index) {\n if (useIndexName && index.ddoc === useIndexDdoc && useIndexName === index.name) {\n return true;\n }\n\n if (index.ddoc === useIndexDdoc) {\n /* istanbul ignore next */\n return true;\n }\n\n return false;\n });\n\n if (!index) {\n throw {\n error: \"unknown_error\",\n message: \"Could not find that index or could not use that index for the query\"\n };\n }\n return index;\n }\n\n return max(matchingIndexes, scoreIndex);\n}\n\nfunction getSingleFieldQueryOptsFor(userOperator, userValue) {\n switch (userOperator) {\n case '$eq':\n return { key: userValue };\n case '$lte':\n return { endkey: userValue };\n case '$gte':\n return { startkey: userValue };\n case '$lt':\n return {\n endkey: userValue,\n inclusive_end: false\n };\n case '$gt':\n return {\n startkey: userValue,\n inclusive_start: false\n };\n }\n\n return {\n startkey: COLLATE_LO\n };\n}\n\nfunction getSingleFieldCoreQueryPlan(selector, index) {\n const field = getKey(index.def.fields[0]);\n //ignoring this because the test to exercise the branch is skipped at the moment\n /* istanbul ignore next */\n const matcher = selector[field] || {};\n const inMemoryFields = [];\n const userOperators = Object.keys(matcher);\n\n let combinedOpts;\n\n for (const userOperator of userOperators) {\n if (isNonLogicalMatcher(userOperator)) {\n inMemoryFields.push(field);\n }\n\n const userValue = matcher[userOperator];\n const newQueryOpts = getSingleFieldQueryOptsFor(userOperator, userValue);\n\n if (combinedOpts) {\n combinedOpts = mergeObjects([combinedOpts, newQueryOpts]);\n } else {\n combinedOpts = newQueryOpts;\n }\n }\n\n return {\n queryOpts: combinedOpts,\n inMemoryFields\n };\n}\n\nfunction getMultiFieldCoreQueryPlan(userOperator, userValue) {\n switch (userOperator) {\n case '$eq':\n return {\n startkey: userValue,\n endkey: userValue\n };\n case '$lte':\n return {\n endkey: userValue\n };\n case '$gte':\n return {\n startkey: userValue\n };\n case '$lt':\n return {\n endkey: userValue,\n inclusive_end: false\n };\n case '$gt':\n return {\n startkey: userValue,\n inclusive_start: false\n };\n }\n}\n\nfunction getMultiFieldQueryOpts(selector, index) {\n const indexFields = index.def.fields.map(getKey);\n\n let inMemoryFields = [];\n const startkey = [];\n const endkey = [];\n let inclusiveStart;\n let inclusiveEnd;\n\n function finish(i) {\n\n if (inclusiveStart !== false) {\n startkey.push(COLLATE_LO);\n }\n if (inclusiveEnd !== false) {\n endkey.push(COLLATE_HI);\n }\n // keep track of the fields where we lost specificity,\n // and therefore need to filter in-memory\n inMemoryFields = indexFields.slice(i);\n }\n\n for (let i = 0, len = indexFields.length; i < len; i++) {\n const indexField = indexFields[i];\n const matcher = selector[indexField];\n\n if (!matcher || !Object.keys(matcher).length) { // fewer fields in user query than in index\n finish(i);\n break;\n } else if (Object.keys(matcher).some(isNonLogicalMatcher)) { // non-logical are ignored\n finish(i);\n break;\n } else if (i > 0) {\n const usingGtlt = (\n '$gt' in matcher || '$gte' in matcher ||\n '$lt' in matcher || '$lte' in matcher);\n const previousKeys = Object.keys(selector[indexFields[i - 1]]);\n const previousWasEq = arrayEquals(previousKeys, ['$eq']);\n const previousWasSame = arrayEquals(previousKeys, Object.keys(matcher));\n const gtltLostSpecificity = usingGtlt && !previousWasEq && !previousWasSame;\n if (gtltLostSpecificity) {\n finish(i);\n break;\n }\n }\n\n const userOperators = Object.keys(matcher);\n let combinedOpts = null;\n\n for (const userOperator of userOperators) {\n const userValue = matcher[userOperator];\n const newOpts = getMultiFieldCoreQueryPlan(userOperator, userValue);\n\n if (combinedOpts) {\n combinedOpts = mergeObjects([combinedOpts, newOpts]);\n } else {\n combinedOpts = newOpts;\n }\n }\n\n startkey.push('startkey' in combinedOpts ? combinedOpts.startkey : COLLATE_LO);\n endkey.push('endkey' in combinedOpts ? combinedOpts.endkey : COLLATE_HI);\n if ('inclusive_start' in combinedOpts) {\n inclusiveStart = combinedOpts.inclusive_start;\n }\n if ('inclusive_end' in combinedOpts) {\n inclusiveEnd = combinedOpts.inclusive_end;\n }\n }\n\n const res = {\n startkey,\n endkey\n };\n\n if (typeof inclusiveStart !== 'undefined') {\n res.inclusive_start = inclusiveStart;\n }\n if (typeof inclusiveEnd !== 'undefined') {\n res.inclusive_end = inclusiveEnd;\n }\n\n return {\n queryOpts: res,\n inMemoryFields\n };\n}\n\nfunction shouldShortCircuit(selector) {\n // We have a field to select from, but not a valid value\n // this should result in a short circuited query\n // just like the http adapter (couchdb) and mongodb\n // see tests for issue #7810\n\n // @todo Use 'Object.values' when Node.js v6 support is dropped.\n const values = Object.keys(selector).map(function (key) {\n return selector[key];\n });\n return values.some(function (val) {\n return typeof val === 'object' && Object.keys(val).length === 0;\n });\n}\n\nfunction getDefaultQueryPlan(selector) {\n //using default index, so all fields need to be done in memory\n return {\n queryOpts: { startkey: null },\n inMemoryFields: [Object.keys(selector)]\n };\n}\n\nfunction getCoreQueryPlan(selector, index) {\n if (index.defaultUsed) {\n return getDefaultQueryPlan(selector, index);\n }\n\n if (index.def.fields.length === 1) {\n // one field in index, so the value was indexed as a singleton\n return getSingleFieldCoreQueryPlan(selector, index);\n }\n // else index has multiple fields, so the value was indexed as an array\n return getMultiFieldQueryOpts(selector, index);\n}\n\nfunction planQuery(request, indexes) {\n const selector = request.selector;\n const sort = request.sort;\n\n if (shouldShortCircuit(selector)) {\n return Object.assign({}, SHORT_CIRCUIT_QUERY, { index: indexes[0] });\n }\n\n const userFieldsRes = getUserFields(selector, sort);\n\n const userFields = userFieldsRes.fields;\n const sortOrder = userFieldsRes.sortOrder;\n const index = findBestMatchingIndex(selector, userFields, sortOrder, indexes, request.use_index);\n\n const coreQueryPlan = getCoreQueryPlan(selector, index);\n const queryOpts = coreQueryPlan.queryOpts;\n const coreInMemoryFields = coreQueryPlan.inMemoryFields;\n\n const inMemoryFields = getInMemoryFields(coreInMemoryFields, index, selector, userFields);\n\n return {\n queryOpts,\n index,\n inMemoryFields\n };\n}\n\nfunction indexToSignature(index) {\n // remove '_design/'\n return index.ddoc.substring(8) + '/' + index.name;\n}\n\nasync function doAllDocs(db, originalOpts) {\n const opts = clone(originalOpts);\n\n // CouchDB responds in weird ways when you provide a non-string to _id;\n // we mimic the behavior for consistency. See issue66 tests for details.\n if (opts.descending) {\n if ('endkey' in opts && typeof opts.endkey !== 'string') {\n opts.endkey = '';\n }\n if ('startkey' in opts && typeof opts.startkey !== 'string') {\n opts.limit = 0;\n }\n } else {\n if ('startkey' in opts && typeof opts.startkey !== 'string') {\n opts.startkey = '';\n }\n if ('endkey' in opts && typeof opts.endkey !== 'string') {\n opts.limit = 0;\n }\n }\n if ('key' in opts && typeof opts.key !== 'string') {\n opts.limit = 0;\n }\n\n if (opts.limit > 0 && opts.indexes_count) {\n // brute force and quite naive impl.\n // amp up the limit with the amount of (indexes) design docs\n // or is this too naive? How about skip?\n opts.original_limit = opts.limit;\n opts.limit += opts.indexes_count;\n }\n\n const res = await db.allDocs(opts);\n // filter out any design docs that _all_docs might return\n res.rows = res.rows.filter(function (row) {\n return !/^_design\\//.test(row.id);\n });\n // put back original limit\n if (opts.original_limit) {\n opts.limit = opts.original_limit;\n }\n // enforce the rows to respect the given limit\n res.rows = res.rows.slice(0, opts.limit);\n return res;\n}\n\nasync function queryAllOrIndex(db, opts, indexToUse) {\n if (indexToUse.name === '_all_docs') {\n return doAllDocs(db, opts);\n }\n return abstractMapper$1(db).query.call(db, indexToSignature(indexToUse), opts);\n}\n\nasync function find$1(db, requestDef, explain) {\n if (requestDef.selector) {\n // must be validated before massaging\n validateSelector(requestDef.selector, false);\n requestDef.selector = massageSelector(requestDef.selector);\n }\n\n if (requestDef.sort) {\n requestDef.sort = massageSort(requestDef.sort);\n }\n\n if (requestDef.use_index) {\n requestDef.use_index = massageUseIndex(requestDef.use_index);\n }\n\n if (!('limit' in requestDef)) {\n // Match the default limit of CouchDB\n requestDef.limit = 25;\n }\n\n validateFindRequest(requestDef);\n\n const getIndexesRes = await getIndexes$1(db);\n\n db.constructor.emit('debug', ['find', 'planning query', requestDef]);\n const queryPlan = planQuery(requestDef, getIndexesRes.indexes);\n db.constructor.emit('debug', ['find', 'query plan', queryPlan]);\n\n const indexToUse = queryPlan.index;\n\n validateSort(requestDef, indexToUse);\n\n let opts = Object.assign({\n include_docs: true,\n reduce: false,\n // Add amount of index for doAllDocs to use (related to issue #7810)\n indexes_count: getIndexesRes.total_rows,\n }, queryPlan.queryOpts);\n\n if ('startkey' in opts && 'endkey' in opts &&\n collate(opts.startkey, opts.endkey) > 0) {\n // can't possibly return any results, startkey > endkey\n /* istanbul ignore next */\n return { docs: [] };\n }\n\n const isDescending = requestDef.sort &&\n typeof requestDef.sort[0] !== 'string' &&\n getValue(requestDef.sort[0]) === 'desc';\n\n if (isDescending) {\n // either all descending or all ascending\n opts.descending = true;\n opts = reverseOptions(opts);\n }\n\n if (!queryPlan.inMemoryFields.length) {\n // no in-memory filtering necessary, so we can let the\n // database do the limit/skip for us\n opts.limit = requestDef.limit;\n if ('skip' in requestDef) {\n opts.skip = requestDef.skip;\n }\n }\n\n if (explain) {\n return Promise.resolve(queryPlan, opts);\n }\n\n const res = await queryAllOrIndex(db, opts, indexToUse);\n\n\n if (opts.inclusive_start === false) {\n // may have to manually filter the first one,\n // since couchdb has no true inclusive_start option\n res.rows = filterInclusiveStart(res.rows, opts.startkey, indexToUse);\n }\n\n if (queryPlan.inMemoryFields.length) {\n // need to filter some stuff in-memory\n res.rows = filterInMemoryFields(res.rows, requestDef, queryPlan.inMemoryFields);\n }\n\n const resp = {\n docs: res.rows.map(function (row) {\n const doc = row.doc;\n if (requestDef.fields) {\n return pick(doc, requestDef.fields);\n }\n return doc;\n })\n };\n\n if (indexToUse.defaultUsed) {\n resp.warning = 'No matching index found, create an index to optimize query time.';\n }\n\n return resp;\n}\n\nasync function explain$1(db, requestDef) {\n const queryPlan = await find$1(db, requestDef, true);\n\n return {\n dbname: db.name,\n index: queryPlan.index,\n selector: requestDef.selector,\n range: {\n start_key: queryPlan.queryOpts.startkey,\n end_key: queryPlan.queryOpts.endkey,\n },\n opts: {\n use_index: requestDef.use_index || [],\n bookmark: \"nil\", //hardcoded to match CouchDB since its not supported,\n limit: requestDef.limit,\n skip: requestDef.skip,\n sort: requestDef.sort || {},\n fields: requestDef.fields,\n conflicts: false, //hardcoded to match CouchDB since its not supported,\n r: [49], // hardcoded to match CouchDB since its not support\n },\n limit: requestDef.limit,\n skip: requestDef.skip || 0,\n fields: requestDef.fields,\n };\n}\n\nasync function deleteIndex$1(db, index) {\n\n if (!index.ddoc) {\n throw new Error('you must supply an index.ddoc when deleting');\n }\n\n if (!index.name) {\n throw new Error('you must supply an index.name when deleting');\n }\n\n const docId = index.ddoc;\n const viewName = index.name;\n\n function deltaFun(doc) {\n if (Object.keys(doc.views).length === 1 && doc.views[viewName]) {\n // only one view in this ddoc, delete the whole ddoc\n return {_id: docId, _deleted: true};\n }\n // more than one view here, just remove the view\n delete doc.views[viewName];\n return doc;\n }\n\n await upsert(db, docId, deltaFun);\n await abstractMapper$1(db).viewCleanup.apply(db);\n return { ok: true };\n}\n\nconst plugin = {};\nplugin.createIndex = resolveToCallback(async function (requestDef) {\n if (typeof requestDef !== 'object') {\n throw new Error('you must provide an index to create');\n }\n\n const createIndex$$1 = isRemote(this) ?\n createIndex : createIndex$1;\n return createIndex$$1(this, requestDef);\n});\n\nplugin.find = resolveToCallback(async function (requestDef) {\n if (typeof requestDef !== 'object') {\n throw new Error('you must provide search parameters to find()');\n }\n\n const find$$1 = isRemote(this) ? find : find$1;\n return find$$1(this, requestDef);\n});\n\nplugin.explain = resolveToCallback(async function (requestDef) {\n if (typeof requestDef !== 'object') {\n throw new Error('you must provide search parameters to explain()');\n }\n\n const find$$1 = isRemote(this) ? explain : explain$1;\n return find$$1(this, requestDef);\n});\n\nplugin.getIndexes = resolveToCallback(async function () {\n const getIndexes$$1 = isRemote(this) ? getIndexes : getIndexes$1;\n return getIndexes$$1(this);\n});\n\nplugin.deleteIndex = resolveToCallback(async function (indexDef) {\n if (typeof indexDef !== 'object') {\n throw new Error('you must provide an index to delete');\n }\n\n const deleteIndex$$1 = isRemote(this) ?\n deleteIndex : deleteIndex$1;\n return deleteIndex$$1(this, indexDef);\n});\n\nexport default plugin;\n","import { Headers } from 'pouchdb-fetch';\nimport { clone } from 'pouchdb-utils';\n\nfunction getConfigUrl(nodeName) {\n return (nodeName ? '/_node/' + nodeName : '') + '/_config';\n}\n\nfunction wrapError(err) {\n if (err.name === 'unknown_error') {\n err.message = (err.message || '') +\n ' Unknown error! Did you remember to enable CORS?';\n }\n throw err;\n}\n\n// Wrapper around the fetch API to send and receive JSON objects\n// Similar to fetchJSON in pouchdb-adapter-http, but both functions are private.\n// Consider extracting them to a common library.\nfunction fetchJSON(dbFetch, path, options) {\n options = options || {};\n\n if (options.body) {\n options.body = JSON.stringify(options.body);\n }\n\n options.headers = options.headers || new Headers();\n options.headers.set('Content-Type', 'application/json');\n options.headers.set('Accept', 'application/json');\n\n return dbFetch(path, options).then(function (response) {\n if (response.ok) {\n return response.json();\n } else {\n return response.json().then(function (responseError) {\n throw responseError;\n });\n }\n }).catch(wrapError);\n}\n\n// toCallback takes a function that returns a promise,\n// and returns a function that can be used with a callback as the last argument,\n// but still retains the ability to be used without a callback and return a promise.\n// (Roughly speaking, the opposite of `toPromise` from pouchdb-utils,\n// but more suited for `fetch`, that returns a promise by default.)\nfunction toCallback(func) {\n return function () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n if (typeof args[-1] === 'function') {\n var callback = args[-1];\n return func.apply(this, args.slice(0, -2)).then(\n function (res) { return callback(null, res); },\n function (err) { return callback(err); }\n );\n } else {\n return func.apply(this, args);\n }\n };\n}\n\nvar AuthError = /*@__PURE__*/(function (Error) {\n function AuthError(message) {\n Error.call(this, message);\n this.name = 'authentication_error';\n this.status = 400;\n this.error = true;\n\n // This is needed because extending built-in classes like Error\n // can have issues with the prototype chain in TypeScript/JavaScript\n Object.setPrototypeOf(this, AuthError.prototype);\n }\n\n if ( Error ) AuthError.__proto__ = Error;\n AuthError.prototype = Object.create( Error && Error.prototype );\n AuthError.prototype.constructor = AuthError;\n\n return AuthError;\n}(Error));\n\nvar getMembership = toCallback(function (opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n var path = '/_membership';\n var ajaxOpts = Object.assign({\n method: 'GET',\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar getNodeName = function (db, opts) {\n return db.getMembership(opts).then(\n function (membership) {\n // Some couchdb-2.x-like server\n return membership.all_nodes[0];\n },\n function (error) {\n if (error.error !== 'illegal_database_name') {\n throw error;\n } else {\n // Some couchdb-1.x-like server\n return undefined;\n }\n }\n );\n};\n\nvar signUpAdmin = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('You must provide a password'));\n }\n\n return getNodeName(db, opts).then(function (nodeName) {\n var configUrl = getConfigUrl(nodeName);\n var url = (opts.configUrl || configUrl) + '/admins/' + encodeURIComponent(username);\n var ajaxOpts = Object.assign({\n method: 'PUT',\n body: password\n }, opts.ajax || {});\n return fetchJSON(db.fetch, url, ajaxOpts);\n });\n});\n\nvar deleteAdmin = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n }\n\n return getNodeName(db, opts).then(function (nodeName) {\n var configUrl = getConfigUrl(nodeName);\n var url = (opts.configUrl || configUrl) + '/admins/' + encodeURIComponent(username);\n var ajaxOpts = Object.assign({\n method: 'DELETE',\n processData: false\n }, opts.ajax || {});\n return fetchJSON(db.fetch, url, ajaxOpts);\n });\n});\n\nvar sessionPath = '/_session';\n\nvar logIn = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('this plugin only works for the http/https adapter'));\n }\n\n if (!username) {\n return Promise.reject(new AuthError('you must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('you must provide a password'));\n }\n\n var path = sessionPath;\n var ajaxOpts = Object.assign({\n method: 'POST',\n body: {name: username, password: password},\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar logOut = toCallback(function (opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n var path = sessionPath;\n var ajaxOpts = Object.assign({\n method: 'DELETE'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar getSession = toCallback(function (opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n\n var path = sessionPath;\n var ajaxOpts = Object.assign({\n method: 'GET'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n});\n\nvar usersPath = '/_users';\n\nfunction updateUser(db, user, opts) {\n var reservedWords = [\n '_id',\n '_rev',\n 'name',\n 'type',\n 'roles',\n 'password',\n 'password_scheme',\n 'iterations',\n 'derived_key',\n 'salt' ];\n\n if (opts.metadata) {\n for (var key in opts.metadata) {\n if (opts.metadata.hasOwnProperty(key) && reservedWords.indexOf(key) !== -1) {\n return Promise.reject(new AuthError('cannot use reserved word in metadata: \"' + key + '\"'));\n }\n }\n user = Object.assign(user, opts.metadata);\n }\n\n if (opts.roles) {\n user = Object.assign(user, {roles: opts.roles});\n }\n var path = usersPath + '/' + encodeURIComponent(user._id);\n var ajaxOpts = Object.assign({\n method: 'PUT',\n body: user\n }, opts.ajax || {});\n\n return fetchJSON(db.fetch, path, ajaxOpts);\n}\n\nvar signUp = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('You must provide a password'));\n }\n\n var userId = 'org.couchdb.user:' + username;\n var user = {\n name: username,\n password: password,\n roles: [],\n type: 'user',\n _id: userId,\n };\n\n return updateUser(db, user, opts);\n});\n\nvar getUser = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (!username) {\n return Promise.reject(new AuthError('you must provide a username'));\n }\n\n var path = usersPath + '/' + encodeURIComponent('org.couchdb.user:' + username);\n var ajaxOpts = Object.assign({\n method: 'GET'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts).then(function (x) { console.log(x); return x;});\n});\n\nvar putUser = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n }\n\n return db.getUser(username, opts).then(function (user) { return updateUser(db, user, opts); });\n});\n\nvar deleteUser = toCallback(function (username, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n }\n\n return db.getUser(username, opts).then(function (user) {\n var path = usersPath + '/' + encodeURIComponent(user._id) + '?rev=' + user._rev;\n var ajaxOpts = Object.assign({\n method: 'DELETE'\n }, opts.ajax || {});\n return fetchJSON(db.fetch, path, ajaxOpts);\n });\n});\n\nvar changePassword = toCallback(function (username, password, opts) {\n var db = this;\n if (typeof opts === 'undefined') {\n opts = {};\n }\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n } else if (!username) {\n return Promise.reject(new AuthError('You must provide a username'));\n } else if (!password) {\n return Promise.reject(new AuthError('You must provide a password'));\n }\n return db.getUser(username, opts).then(function (user) {\n user.password = password;\n var path = usersPath + '/' + encodeURIComponent(user._id);\n var ajaxOpts = Object.assign({\n method: 'PUT',\n body: user,\n }, opts.ajax || {});\n\n return fetchJSON(db.fetch, path, ajaxOpts);\n });\n});\n\nvar changeUsername = toCallback(function (oldUsername, newUsername, opts) {\n var db = this;\n var USERNAME_PREFIX = 'org.couchdb.user:';\n var updateUser = function (user, opts) {\n var path = usersPath + '/' + encodeURIComponent(user._id);\n var updateOpts = Object.assign({\n method: 'PUT',\n body: user\n }, opts.ajax);\n return fetchJSON(db.fetch, path, updateOpts);\n };\n if (typeof opts === 'undefined') {\n opts = {};\n }\n opts.ajax = opts.ajax || {};\n if (['http', 'https'].indexOf(db.type()) === -1) {\n return Promise.reject(new AuthError('This plugin only works for the http/https adapter. ' +\n 'So you should use new PouchDB(\"http://mysite.com:5984/mydb\") instead.'));\n }\n if (!newUsername) {\n return Promise.reject(new AuthError('You must provide a new username'));\n }\n if (!oldUsername) {\n return Promise.reject(new AuthError('You must provide a username to rename'));\n }\n\n return db.getUser(newUsername, opts)\n .then(function () {\n var error = new AuthError('user already exists');\n error.taken = true;\n throw error;\n }, function () {\n return db.getUser(oldUsername, opts);\n })\n .then(function (user) {\n var newUser = clone(user);\n delete newUser._rev;\n newUser._id = USERNAME_PREFIX + newUsername;\n newUser.name = newUsername;\n newUser.roles = opts.roles || user.roles || {};\n return updateUser(newUser, opts).then(function () {\n user._deleted = true;\n return updateUser(user, opts);\n });\n });\n});\n\nvar plugin = {};\n\nplugin.login = logIn;\nplugin.logIn = logIn;\nplugin.logout = logOut;\nplugin.logOut = logOut;\nplugin.getSession = getSession;\n\nplugin.getMembership = getMembership;\nplugin.signUpAdmin = signUpAdmin;\nplugin.deleteAdmin = deleteAdmin;\n\nplugin.signup = signUp;\nplugin.signUp = signUp;\nplugin.getUser = getUser;\nplugin.putUser = putUser;\nplugin.deleteUser = deleteUser;\nplugin.changePassword = changePassword;\nplugin.changeUsername = changeUsername;\n\nif (typeof window !== 'undefined' && window.PouchDB) {\n window.PouchDB.plugin(plugin);\n}\n\nexport default plugin;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","import PouchDB from \"pouchdb\";\nimport PouchDBFind from \"pouchdb-find\";\nimport PouchDBAuth from \"@nilock2/pouchdb-authentication\";\nimport process from \"process\";\n//#region src/impl/couch/pouchdb-setup.ts\nif (typeof window !== \"undefined\") window.process = process;\nPouchDB.plugin(PouchDBFind);\nPouchDB.plugin(PouchDBAuth);\nif (typeof PouchDB.debug !== \"undefined\") PouchDB.debug.disable();\nPouchDB.defaults({});\nvar pouchdb_setup_default = PouchDB;\n//#endregion\nexport { pouchdb_setup_default as default };\n\n//# sourceMappingURL=pouchdb-setup.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\n//#region src/impl/couch/courseLookupDB.ts\nconst courseLookupDBTitle = \"coursedb-lookup\";\nlogger.debug(`COURSELOOKUP FILE RUNNING`);\n/**\n* A Lookup table of existant courses. Each docID in this DB correspondes to a\n* course database whose name is `coursedb-{docID}`\n*/\nvar CourseLookup = class CourseLookup {\n\tstatic _dbInstance = null;\n\t/**\n\t* Static getter for the PouchDB database instance.\n\t* Connects using ENV variables and caches the instance.\n\t* Throws an error if required ENV variables are not set.\n\t*/\n\tstatic get _db() {\n\t\tif (this._dbInstance) return this._dbInstance;\n\t\tif (ENV.COUCHDB_SERVER_URL === \"NOT_SET\" || !ENV.COUCHDB_SERVER_URL) throw new Error(\"CourseLookup.db: COUCHDB_SERVER_URL is not set. Ensure initializeDataLayer has been called with valid configuration.\");\n\t\tif (ENV.COUCHDB_SERVER_PROTOCOL === \"NOT_SET\" || !ENV.COUCHDB_SERVER_PROTOCOL) throw new Error(\"CourseLookup.db: COUCHDB_SERVER_PROTOCOL is not set. Ensure initializeDataLayer has been called with valid configuration.\");\n\t\tconst dbUrl = `${ENV.COUCHDB_SERVER_PROTOCOL}://${ENV.COUCHDB_SERVER_URL}/${courseLookupDBTitle}`;\n\t\tconst options = {};\n\t\tif (ENV.COUCHDB_USERNAME && ENV.COUCHDB_PASSWORD) {\n\t\t\toptions.auth = {\n\t\t\t\tusername: ENV.COUCHDB_USERNAME,\n\t\t\t\tpassword: ENV.COUCHDB_PASSWORD\n\t\t\t};\n\t\t\tlogger.info(`CourseLookup: Connecting to ${dbUrl} with authentication.`);\n\t\t} else logger.info(`CourseLookup: Connecting to ${dbUrl} without authentication.`);\n\t\ttry {\n\t\t\tthis._dbInstance = new pouchdb_setup_default(dbUrl, options);\n\t\t\tlogger.info(`CourseLookup: Database instance created for ${courseLookupDBTitle}.`);\n\t\t\treturn this._dbInstance;\n\t\t} catch (error) {\n\t\t\tlogger.error(`CourseLookup: Failed to create PouchDB instance for ${dbUrl}`, error);\n\t\t\tthis._dbInstance = null;\n\t\t\tthrow new Error(`CourseLookup: Failed to initialize database connection: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\t/**\n\t* Adds a new course to the lookup database, and returns the courseID\n\t* @param courseName\n\t* @returns\n\t*/\n\tstatic async add(courseName) {\n\t\treturn (await CourseLookup._db.post({ name: courseName })).id;\n\t}\n\t/**\n\t* Adds a new course to the lookup database with a specific courseID\n\t* @param courseId The specific course ID to use\n\t* @param courseName The course name\n\t* @param disambiguator Optional disambiguator\n\t* @returns Promise<void>\n\t*/\n\tstatic async addWithId(courseId, courseName, disambiguator) {\n\t\tconst doc = {\n\t\t\t_id: courseId,\n\t\t\tname: courseName\n\t\t};\n\t\tif (disambiguator) doc.disambiguator = disambiguator;\n\t\tawait CourseLookup._db.put(doc);\n\t}\n\t/**\n\t* Removes a course from the index\n\t* @param courseID\n\t*/\n\tstatic async delete(courseID) {\n\t\tconst doc = await CourseLookup._db.get(courseID);\n\t\treturn await CourseLookup._db.remove(doc);\n\t}\n\tstatic async allCourseWare() {\n\t\treturn (await CourseLookup._db.allDocs({ include_docs: true })).rows.map((row) => row.doc);\n\t}\n\tstatic async updateDisambiguator(courseID, disambiguator) {\n\t\tconst doc = await CourseLookup._db.get(courseID);\n\t\tdoc.disambiguator = disambiguator;\n\t\treturn await CourseLookup._db.put(doc);\n\t}\n\tstatic async isCourse(courseID) {\n\t\ttry {\n\t\t\tawait CourseLookup._db.get(courseID);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tlogger.info(`Courselookup failed:`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n};\n//#endregion\nexport { CourseLookup as default };\n\n//# sourceMappingURL=courseLookupDB.mjs.map","import \"../_virtual/_rolldown/runtime.mjs\";\n//#region src/util/Loggable.ts\nvar Loggable = class {\n\tlog(...args) {\n\t\tconsole.log(`LOG-${this._className}@${/* @__PURE__ */ new Date()}:`, ...args);\n\t}\n\terror(...args) {\n\t\tconsole.error(`ERROR-${this._className}@${/* @__PURE__ */ new Date()}:`, ...args);\n\t}\n};\n//#endregion\nexport { Loggable };\n\n//# sourceMappingURL=Loggable.mjs.map","//#region src/core/types/contentNavigationStrategy.ts\nconst DEFAULT_LEARNABLE_WEIGHT = {\n\tweight: 1,\n\tconfidence: .1,\n\tsampleSize: 0\n};\n//#endregion\nexport { DEFAULT_LEARNABLE_WEIGHT };\n\n//# sourceMappingURL=contentNavigationStrategy.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\n//#region src/core/orchestration/signal.ts\n/**\n* Computes a scalar signal (0-1) representing the quality of the learning outcome.\n*\n* Current implementation focuses on \"accuracy within Zone of Proximal Development\".\n* Future versions should include ELO gain rate.\n*\n* @param records - List of question attempts in the period\n* @param config - Configuration for the signal function\n* @returns Score 0.0-1.0, or null if insufficient data\n*/\nfunction computeOutcomeSignal(records, config = {}) {\n\tif (!records || records.length === 0) return null;\n\tconst target = config.targetAccuracy ?? .85;\n\tconst tolerance = config.tolerance ?? .05;\n\tlet correct = 0;\n\tfor (const r of records) if (r.isCorrect) correct++;\n\treturn scoreAccuracyInZone(correct / records.length, target, tolerance);\n}\n/**\n* Scores an accuracy value based on how close it is to the target \"sweet spot\".\n*\n* The function defines a plateau of width (2 * tolerance) around the target\n* where score is 1.0. Outside this plateau, it falls off linearly.\n*\n* @param accuracy - Observed accuracy (0-1)\n* @param target - Target accuracy (e.g. 0.85)\n* @param tolerance - +/- range allowed for max score\n*/\nfunction scoreAccuracyInZone(accuracy, target, tolerance) {\n\tconst dist = Math.abs(accuracy - target);\n\tif (dist <= tolerance) return 1;\n\tconst excess = dist - tolerance;\n\treturn Math.max(0, 1 - excess * 2.5);\n}\n//#endregion\nexport { computeOutcomeSignal, scoreAccuracyInZone };\n\n//# sourceMappingURL=signal.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { DocType } from \"../types/types-legacy.mjs\";\nimport { computeOutcomeSignal } from \"./signal.mjs\";\n//#region src/core/orchestration/recording.ts\n/**\n* Records a learning outcome for a specific period of time.\n*\n* This function:\n* 1. Computes a scalar \"success\" signal from the provided question records\n* 2. Re-computes the deviations that were active for this user/course\n* 3. Persists a UserOutcomeRecord to the user's database\n*\n* This record is later used by the optimization job to correlate\n* deviations with outcomes (Evolutionary Orchestration).\n*\n* @param context - Orchestration context (user, course, etc.)\n* @param periodStart - ISO timestamp of period start\n* @param periodEnd - ISO timestamp of period end (now)\n* @param records - Question records generated during this period\n* @param activeStrategyIds - IDs of strategies active in this course\n* @param eloStart - User's ELO at start of period (optional)\n* @param eloEnd - User's ELO at end of period (optional)\n* @param config - Optional configuration for signal computation\n*/\nasync function recordUserOutcome(context, periodStart, periodEnd, records, activeStrategyIds, eloStart = 0, eloEnd = 0, config) {\n\tconst { user, course, userId } = context;\n\tconst courseId = course.getCourseID();\n\tconst outcomeValue = computeOutcomeSignal(records, config);\n\tif (outcomeValue === null) {\n\t\tlogger.debug(`[Orchestration] No outcome signal computed for ${userId} (insufficient data). Skipping record.`);\n\t\treturn;\n\t}\n\tconst deviations = {};\n\tfor (const strategyId of activeStrategyIds) deviations[strategyId] = context.getDeviation(strategyId);\n\tconst id = `USER_OUTCOME::${courseId}::${userId}::${periodEnd}`;\n\tconst record = {\n\t\t_id: id,\n\t\tdocType: DocType.USER_OUTCOME,\n\t\tcourseId,\n\t\tuserId,\n\t\tperiodStart,\n\t\tperiodEnd,\n\t\toutcomeValue,\n\t\tdeviations,\n\t\tmetadata: {\n\t\t\tsessionsCount: 1,\n\t\t\tcardsSeen: records.length,\n\t\t\teloStart,\n\t\t\teloEnd,\n\t\t\tsignalType: \"accuracy_in_zone\"\n\t\t}\n\t};\n\ttry {\n\t\tawait user.putUserOutcome(record);\n\t\tlogger.debug(`[Orchestration] Recorded outcome ${outcomeValue.toFixed(3)} for ${userId} (doc: ${id})`);\n\t} catch (e) {\n\t\tlogger.error(`[Orchestration] Failed to record outcome: ${e}`);\n\t}\n}\n//#endregion\nexport { recordUserOutcome };\n\n//# sourceMappingURL=recording.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport \"./gradient.mjs\";\nimport \"./learning.mjs\";\nimport \"./signal.mjs\";\nimport \"./recording.mjs\";\n//#region src/core/orchestration/index.ts\nconst MIN_SPREAD = .1;\nconst MAX_SPREAD = .5;\nconst MIN_WEIGHT = .1;\nconst MAX_WEIGHT = 3;\n/**\n* FNV-1a hash implementation for deterministic distribution.\n*/\nfunction fnv1a(str) {\n\tlet hash = 2166136261;\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash ^= str.charCodeAt(i);\n\t\thash = Math.imul(hash, 16777619);\n\t}\n\treturn hash >>> 0;\n}\n/**\n* Compute a user's deviation for a specific strategy.\n* \n* Returns a value in [-1, 1] that is:\n* 1. Deterministic for the same (user, strategy, salt) tuple\n* 2. Uniformly distributed across users\n* 3. Uncorrelated between different strategies (due to strategyId in hash)\n* 4. Rotatable by changing the salt\n* \n* @param userId - ID of the user\n* @param strategyId - ID of the strategy\n* @param salt - Random seed from course config\n* @returns Deviation factor between -1.0 and 1.0\n*/\nfunction computeDeviation(userId, strategyId, salt) {\n\treturn fnv1a(`${userId}:${strategyId}:${salt}`) / 4294967296 * 2 - 1;\n}\n/**\n* Compute the exploration spread based on confidence.\n* \n* - Low confidence (0.0) -> Max spread (Explore broadly)\n* - High confidence (1.0) -> Min spread (Exploit known good weight)\n* \n* @param confidence - Confidence level 0-1\n* @returns Spread magnitude (half-width of the distribution)\n*/\nfunction computeSpread(confidence) {\n\treturn MAX_SPREAD - Math.max(0, Math.min(1, confidence)) * (MAX_SPREAD - MIN_SPREAD);\n}\n/**\n* Calculate the effective weight for a strategy instance.\n* \n* Combines the learnable weight (peak) with the user's deviation and the\n* allowed spread (based on confidence).\n* \n* @param learnable - Strategy learning config\n* @param userId - User ID\n* @param strategyId - Strategy ID\n* @param salt - Course salt\n* @returns Effective weight multiplier\n*/\nfunction computeEffectiveWeight(learnable, userId, strategyId, salt) {\n\tconst adjustment = computeDeviation(userId, strategyId, salt) * computeSpread(learnable.confidence) * learnable.weight;\n\tconst effective = learnable.weight + adjustment;\n\treturn Math.max(MIN_WEIGHT, Math.min(MAX_WEIGHT, effective));\n}\n/**\n* Create an orchestration context for a study session.\n* \n* Fetches necessary configuration to enable deterministic weight calculation.\n* \n* @param user - User DB interface\n* @param course - Course DB interface\n* @returns Initialized orchestration context\n*/\nasync function createOrchestrationContext(user, course) {\n\tlet courseConfig;\n\ttry {\n\t\tcourseConfig = await course.getCourseConfig();\n\t} catch (e) {\n\t\tlogger.error(`[Orchestration] Failed to load course config: ${e}`);\n\t\tcourseConfig = {\n\t\t\tname: \"Unknown\",\n\t\t\tdescription: \"\",\n\t\t\tpublic: false,\n\t\t\tdeleted: false,\n\t\t\tcreator: \"\",\n\t\t\tadmins: [],\n\t\t\tmoderators: [],\n\t\t\tdataShapes: [],\n\t\t\tquestionTypes: [],\n\t\t\torchestration: { salt: \"default\" }\n\t\t};\n\t}\n\tconst userId = user.getUsername();\n\tconst salt = courseConfig.orchestration?.salt || \"default_salt\";\n\treturn {\n\t\tuser,\n\t\tcourse,\n\t\tuserId,\n\t\tcourseConfig,\n\t\tgetEffectiveWeight(strategyId, learnable) {\n\t\t\treturn computeEffectiveWeight(learnable, userId, strategyId, salt);\n\t\t},\n\t\tgetDeviation(strategyId) {\n\t\t\treturn computeDeviation(userId, strategyId, salt);\n\t\t}\n\t};\n}\n//#endregion\nexport { computeDeviation, computeEffectiveWeight, computeSpread, createOrchestrationContext };\n\n//# sourceMappingURL=index.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { diversityRerank } from \"./diversityRerank.mjs\";\nimport { buildRunReport, captureRun, registerPipelineForDebug } from \"./PipelineDebugger.mjs\";\nimport { noteReviewPressure } from \"./SrsDebugger.mjs\";\nimport { ContentNavigator } from \"./index.mjs\";\nimport { createOrchestrationContext } from \"../orchestration/index.mjs\";\nimport { DEFAULT_REGULATOR_CONFIG, INTAKE_CLOCK_KEY, applyReading, intakeReading, resetIntakeClock, reviewMassReading, stepIntakeClock } from \"./regulators.mjs\";\nimport { toCourseElo } from \"@vue-skuilder/common\";\n//#region src/core/navigators/Pipeline.ts\n/**\n* Convert a glob pattern (with `*` wildcards) to a RegExp.\n* Only `*` is supported as a wildcard (matches any characters).\n*/\nfunction globToRegex(pattern) {\n\tconst withWildcards = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n\treturn new RegExp(`^${withWildcards}$`);\n}\n/** Test whether a string matches a glob pattern. */\nfunction globMatch(value, pattern) {\n\tif (!pattern.includes(\"*\")) return value === pattern;\n\treturn globToRegex(pattern).test(value);\n}\n/** Test whether any of a card's tags match a glob pattern. */\nfunction cardMatchesTagPattern(card, pattern) {\n\treturn (card.tags ?? []).some((tag) => globMatch(tag, pattern));\n}\nfunction mergeHints(allHints) {\n\tconst defined = allHints.filter((h) => h !== null && h !== void 0);\n\tif (defined.length === 0) return void 0;\n\tconst merged = {};\n\tconst boostTags = {};\n\tfor (const hints of defined) for (const [pattern, factor] of Object.entries(hints.boostTags ?? {})) boostTags[pattern] = (boostTags[pattern] ?? 1) * factor;\n\tif (Object.keys(boostTags).length > 0) merged.boostTags = boostTags;\n\tconst boostCards = {};\n\tfor (const hints of defined) for (const [pattern, factor] of Object.entries(hints.boostCards ?? {})) boostCards[pattern] = (boostCards[pattern] ?? 1) * factor;\n\tif (Object.keys(boostCards).length > 0) merged.boostCards = boostCards;\n\tconst concatUnique = (field) => {\n\t\tconst values = defined.flatMap((h) => h[field] ?? []);\n\t\tif (values.length > 0) merged[field] = [...new Set(values)];\n\t};\n\tconcatUnique(\"requireTags\");\n\tconcatUnique(\"requireCards\");\n\tconcatUnique(\"excludeTags\");\n\tconcatUnique(\"excludeCards\");\n\tconst labels = defined.map((h) => h._label).filter(Boolean);\n\tif (labels.length > 0) merged._label = labels.join(\"; \");\n\treturn Object.keys(merged).length > 0 ? merged : void 0;\n}\n/**\n* Log pipeline configuration on construction.\n* Shows generator and filter chain structure.\n*/\nfunction logPipelineConfig(generator, filters) {\n\tconst filterList = filters.length > 0 ? \"\\n - \" + filters.map((f) => f.name).join(\"\\n - \") : \" none\";\n\tlogger.info(`[Pipeline] Configuration:\\n Generator: ${generator.name}\\n Filters:${filterList}`);\n}\n/**\n* Log tag hydration results.\n* Shows effectiveness of batch query (how many cards/tags were hydrated).\n*/\nfunction logTagHydration(cards, tagsByCard) {\n\tconst totalTags = Array.from(tagsByCard.values()).reduce((sum, tags) => sum + tags.length, 0);\n\tconst cardsWithTags = Array.from(tagsByCard.values()).filter((tags) => tags.length > 0).length;\n\tlogger.debug(`[Pipeline] Tag hydration: ${cards.length} cards, ${cardsWithTags} have tags (${totalTags} total tags) - single batch query`);\n}\n/**\n* Log pipeline execution summary.\n* Shows complete flow from generator through filters to final results.\n*/\nfunction logExecutionSummary(generatorName, generatedCount, filterCount, finalCount, topScores, filterImpacts) {\n\tconst scoreDisplay = topScores.length > 0 ? topScores.map((s) => s.toFixed(2)).join(\", \") : \"none\";\n\tlet filterSummary = \"\";\n\tif (filterImpacts.length > 0) filterSummary = `\\n Filter impact: ${filterImpacts.map((f) => {\n\t\tconst parts = [];\n\t\tif (f.boosted > 0) parts.push(`+${f.boosted}`);\n\t\tif (f.penalized > 0) parts.push(`-${f.penalized}`);\n\t\tif (f.passed > 0) parts.push(`=${f.passed}`);\n\t\treturn `${f.name}: ${parts.join(\"/\")}`;\n\t}).join(\", \")}`;\n\tlogger.info(`[Pipeline] Execution: ${generatorName} produced ${generatedCount} → ${filterCount} filters → ${finalCount} results (top scores: ${scoreDisplay})` + filterSummary + `\\n 💡 Inspect: window.skuilder.pipeline`);\n}\nfunction logResultCards(cards) {}\n/**\n* Log provenance trails for cards.\n* Shows the complete scoring history for each card through the pipeline.\n* Useful for debugging why cards scored the way they did.\n*/\nfunction logCardProvenance(cards, maxCards = 3) {\n\tconst cardsToLog = cards.slice(0, maxCards);\n\tlogger.debug(`[Pipeline] Provenance for top ${cardsToLog.length} cards:`);\n\tfor (const card of cardsToLog) {\n\t\tlogger.debug(`[Pipeline] ${card.cardId} (final score: ${card.score.toFixed(3)}):`);\n\t\tfor (const entry of card.provenance) {\n\t\t\tconst scoreChange = entry.score.toFixed(3);\n\t\t\tconst action = entry.action.padEnd(9);\n\t\t\tlogger.debug(`[Pipeline] ${action} ${scoreChange} - ${entry.strategyName}: ${entry.reason}`);\n\t\t}\n\t}\n}\nvar Pipeline = class extends ContentNavigator {\n\tgenerator;\n\tfilters;\n\t/**\n\t* Cached orchestration context. Course config and salt don't change within\n\t* a page load, so we build the orchestration context once and reuse it on\n\t* subsequent getWeightedCards() calls (e.g. mid-session replans).\n\t*\n\t* This eliminates a remote getCourseConfig() round trip per pipeline run.\n\t*/\n\t_cachedOrchestration = null;\n\t/**\n\t* Hash of the strategy docs this pipeline was assembled from (see\n\t* versionStamps.ts), set by whoever builds it. Stamped on every run.\n\t*/\n\tstrategyHash;\n\t/**\n\t* Persistent tag cache. Maps cardId → tag names.\n\t*\n\t* Tags are static within a session (they're set at card generation time),\n\t* so we cache them across pipeline runs. On replans, many of the same cards\n\t* reappear — cache hits avoid redundant remote getAppliedTagsBatch() queries.\n\t*/\n\t_tagCache = /* @__PURE__ */ new Map();\n\t/**\n\t* One-shot replan hints. Applied after the filter chain on the next\n\t* getWeightedCards() call, then cleared.\n\t*/\n\t_ephemeralHints = null;\n\t/**\n\t* The intake valve's clock (see regulators.ts), loaded from strategy state on\n\t* first use and kept in memory. Writes are chained so a presentation and a\n\t* run can't race each other's revision.\n\t*/\n\t_intakeClock = null;\n\t_intakeClockWrite = Promise.resolve();\n\t/**\n\t* Create a new pipeline.\n\t*\n\t* @param generator - The generator (or CompositeGenerator) that produces candidates\n\t* @param filters - Filters to apply sequentially (order doesn't matter for multipliers)\n\t* @param user - User database interface\n\t* @param course - Course database interface\n\t*/\n\tconstructor(generator, filters, user, course) {\n\t\tsuper();\n\t\tthis.generator = generator;\n\t\tthis.filters = filters;\n\t\tthis.user = user;\n\t\tthis.course = course;\n\t\tcourse.getCourseConfig().then((cfg) => {\n\t\t\tlogger.debug(`[pipeline] Crated pipeline for ${cfg.name}`);\n\t\t}).catch((e) => {\n\t\t\tlogger.error(`[pipeline] Failed to lookup courseCfg: ${e}`);\n\t\t});\n\t\tlogPipelineConfig(generator, filters);\n\t\tregisterPipelineForDebug(this);\n\t}\n\t/**\n\t* Set one-shot hints for the next pipeline run.\n\t* Consumed after one getWeightedCards() call, then cleared.\n\t*\n\t* Overrides ContentNavigator.setEphemeralHints() no-op.\n\t*/\n\tsetEphemeralHints(hints) {\n\t\tthis._ephemeralHints = hints;\n\t\tlogger.info(`[Pipeline] Ephemeral hints set: ${JSON.stringify(hints)}`);\n\t}\n\t/**\n\t* Get weighted cards by running generator and applying filters.\n\t*\n\t* 1. Build shared context (user ELO, etc.)\n\t* 2. Get candidates from generator (passing context)\n\t* 3. Batch hydrate tags for all candidates\n\t* 4. Apply each filter sequentially\n\t* 5. Remove zero-score cards\n\t* 6. Sort by score descending\n\t* 7. Return top N\n\t*\n\t* @param limit - Maximum number of cards to return\n\t* @returns Cards sorted by score descending\n\t*/\n\tasync getWeightedCards(limit) {\n\t\tconst t0 = performance.now();\n\t\tconst context = await this.buildContext();\n\t\tconst tContext = performance.now();\n\t\tconst fetchLimit = 500;\n\t\tlogger.debug(`[Pipeline] Fetching ${fetchLimit} candidates from generator '${this.generator.name}'`);\n\t\tconst generatorResult = await this.generator.getWeightedCards(fetchLimit, context);\n\t\tlet cards = generatorResult.cards;\n\t\tconst tGenerate = performance.now();\n\t\tconst generatedCount = cards.length;\n\t\tthis._ephemeralHints = mergeHints([this._ephemeralHints, generatorResult.hints]) ?? null;\n\t\tlet generatorSummaries;\n\t\tif (this.generator.generators) {\n\t\t\tconst genMap = /* @__PURE__ */ new Map();\n\t\t\tfor (const card of cards) {\n\t\t\t\tconst firstProv = card.provenance[0];\n\t\t\t\tif (firstProv) {\n\t\t\t\t\tconst genName = firstProv.strategyName;\n\t\t\t\t\tif (!genMap.has(genName)) genMap.set(genName, { cards: [] });\n\t\t\t\t\tgenMap.get(genName).cards.push(card);\n\t\t\t\t}\n\t\t\t}\n\t\t\tgeneratorSummaries = Array.from(genMap.entries()).map(([name, data]) => {\n\t\t\t\tconst reviewCount = data.cards.filter((c) => c.reviewID).length;\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tcardCount: data.cards.length,\n\t\t\t\t\tnewCount: data.cards.length - reviewCount,\n\t\t\t\t\treviewCount,\n\t\t\t\t\ttopScore: Math.max(...data.cards.map((c) => c.score), 0)\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\t\tlogger.debug(`[Pipeline] Generator returned ${generatedCount} candidates`);\n\t\tcards = await this.hydrateTags(cards);\n\t\tconst tHydrate = performance.now();\n\t\tconst allCardsBeforeFiltering = [...cards];\n\t\tconst pendingHints = this._ephemeralHints;\n\t\tif (pendingHints?.requireCards?.length) {\n\t\t\tconst poolIds = new Set(allCardsBeforeFiltering.map((c) => c.cardId));\n\t\t\tconst missingIds = pendingHints.requireCards.filter((p) => !p.includes(\"*\") && !poolIds.has(p));\n\t\t\tif (missingIds.length > 0) {\n\t\t\t\tconst fetchedTags = await this.course.getAppliedTagsBatch(missingIds);\n\t\t\t\tconst courseId = this.course.getCourseID();\n\t\t\t\tfor (const cardId of missingIds) allCardsBeforeFiltering.push({\n\t\t\t\t\tcardId,\n\t\t\t\t\tcourseId,\n\t\t\t\t\tscore: 1,\n\t\t\t\t\ttags: fetchedTags.get(cardId) ?? [],\n\t\t\t\t\tprovenance: []\n\t\t\t\t});\n\t\t\t\tlogger.info(`[Pipeline] Pre-fetched ${missingIds.length} required card(s) into pool: ${missingIds.join(\", \")}`);\n\t\t\t}\n\t\t}\n\t\tconst prescribedIds = new Set(cards.filter((c) => c.provenance.some((p) => p.strategy === \"prescribed\")).map((c) => c.cardId));\n\t\tconst filterImpacts = [];\n\t\tconst generatedScores = new Map(cards.map((c) => [c.cardId, c.score]));\n\t\tconst gated = /* @__PURE__ */ new Set();\n\t\tfor (const filter of this.filters) {\n\t\t\tconst beforeCount = cards.length;\n\t\t\tconst beforeScores = new Map(cards.map((c) => [c.cardId, c.score]));\n\t\t\tcards = await filter.transform(cards, context);\n\t\t\tlet boosted = 0;\n\t\t\tlet penalized = 0;\n\t\t\tlet passed = 0;\n\t\t\tconst removed = beforeCount - cards.length;\n\t\t\tconst kind = filter.kind ?? \"gate\";\n\t\t\tfor (const card of cards) {\n\t\t\t\tconst before = beforeScores.get(card.cardId) ?? 0;\n\t\t\t\tif (card.score > before) boosted++;\n\t\t\t\telse if (card.score < before) {\n\t\t\t\t\tpenalized++;\n\t\t\t\t\tif (kind === \"gate\") gated.add(card.cardId);\n\t\t\t\t} else passed++;\n\t\t\t}\n\t\t\tfilterImpacts.push({\n\t\t\t\tname: filter.name,\n\t\t\t\tkind,\n\t\t\t\tboosted,\n\t\t\t\tpenalized,\n\t\t\t\tpassed,\n\t\t\t\tremoved\n\t\t\t});\n\t\t\tif (prescribedIds.size > 0) {\n\t\t\t\tconst survivingIds = new Set(cards.map((c) => c.cardId));\n\t\t\t\tconst killedPrescribed = [...prescribedIds].filter((id) => !survivingIds.has(id));\n\t\t\t\tconst zeroedPrescribed = cards.filter((c) => prescribedIds.has(c.cardId) && c.score === 0).map((c) => c.cardId);\n\t\t\t\tif (killedPrescribed.length > 0 || zeroedPrescribed.length > 0) {\n\t\t\t\t\tlogger.info(`[Pipeline] Filter '${filter.name}' impact on prescribed cards: ` + (killedPrescribed.length > 0 ? `removed=[${killedPrescribed.join(\", \")}] ` : \"\") + (zeroedPrescribed.length > 0 ? `zeroed=[${zeroedPrescribed.join(\", \")}]` : \"\"));\n\t\t\t\t\tkilledPrescribed.forEach((id) => prescribedIds.delete(id));\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogger.debug(`[Pipeline] Filter '${filter.name}': ${beforeScores.size} → ${cards.length} cards (↑${boosted} ↓${penalized} =${passed})`);\n\t\t}\n\t\tconst scoredCards = cards;\n\t\tcards = cards.filter((c) => c.score > 0);\n\t\tconst regulators = await this.regulate(cards, generatedScores, gated);\n\t\tconst hints = this._ephemeralHints;\n\t\tif (hints) {\n\t\t\tthis._ephemeralHints = null;\n\t\t\tcards = this.applyHints(cards, hints, allCardsBeforeFiltering);\n\t\t}\n\t\tcards = diversityRerank(cards);\n\t\tcards.sort((a, b) => b.score - a.score);\n\t\tconst tFilter = performance.now();\n\t\tconst result = cards.slice(0, limit);\n\t\tlogger.info(`[Pipeline:timing] total=${(tFilter - t0).toFixed(0)}ms (context=${(tContext - t0).toFixed(0)} generate=${(tGenerate - tContext).toFixed(0)} hydrate=${(tHydrate - tGenerate).toFixed(0)} filter=${(tFilter - tHydrate).toFixed(0)})`);\n\t\tconst topScores = result.slice(0, 3).map((c) => c.score);\n\t\tlogExecutionSummary(this.generator.name, generatedCount, this.filters.length, result.length, topScores, filterImpacts);\n\t\tlogResultCards(result);\n\t\tlogCardProvenance(result, 3);\n\t\ttry {\n\t\t\tconst courseConfig = await this.course?.getCourseConfig().catch(() => void 0);\n\t\t\tconst courseName = courseConfig?.name;\n\t\t\tconst report = buildRunReport(this.course?.getCourseID() || \"unknown\", courseName, this.generator.name, generatorSummaries, generatedCount, filterImpacts, cards, result, context.userElo, hints ?? void 0, scoredCards, regulators);\n\t\t\tconst versions = {\n\t\t\t\t...this.strategyHash ? { strategies: this.strategyHash } : {},\n\t\t\t\t...courseConfig?.contentVersion ? { content: courseConfig.contentVersion } : {}\n\t\t\t};\n\t\t\tcaptureRun({\n\t\t\t\t...report,\n\t\t\t\t...Object.keys(versions).length ? { versions } : {}\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tlogger.debug(`[Pipeline] Failed to capture debug run: ${e}`);\n\t\t}\n\t\treturn { cards: result };\n\t}\n\t/**\n\t* Batch hydrate tags for all cards.\n\t*\n\t* Fetches tags for all cards in a single database query and attaches them\n\t* to the WeightedCard objects. Filters can then use card.tags instead of\n\t* making individual getAppliedTags() calls.\n\t*\n\t* Uses a persistent tag cache across pipeline runs — tags are static within\n\t* a session, so cards seen in a prior run (e.g. before a replan) don't\n\t* require a second DB query.\n\t*\n\t* @param cards - Cards to hydrate\n\t* @returns Cards with tags populated\n\t*/\n\tasync hydrateTags(cards) {\n\t\tif (cards.length === 0) return cards;\n\t\tconst uncachedIds = [];\n\t\tfor (const card of cards) if (!this._tagCache.has(card.cardId)) uncachedIds.push(card.cardId);\n\t\tif (uncachedIds.length > 0) {\n\t\t\tconst freshTags = await this.course.getAppliedTagsBatch(uncachedIds);\n\t\t\tfor (const [cardId, tags] of freshTags) this._tagCache.set(cardId, tags);\n\t\t}\n\t\tconst tagsByCard = /* @__PURE__ */ new Map();\n\t\tfor (const card of cards) tagsByCard.set(card.cardId, this._tagCache.get(card.cardId) ?? []);\n\t\tlogTagHydration(cards, tagsByCard);\n\t\treturn cards.map((card) => ({\n\t\t\t...card,\n\t\t\ttags: this._tagCache.get(card.cardId) ?? []\n\t\t}));\n\t}\n\t/**\n\t* Apply one-shot replan hints to the post-filter card set.\n\t*\n\t* Order of operations:\n\t* 1. Exclude (remove unwanted cards)\n\t* 2. Boost (multiply scores)\n\t* 3. Require (inject must-have cards from the full pre-filter pool)\n\t*\n\t* @param cards - Post-filter cards (score > 0)\n\t* @param hints - The ephemeral hints to apply\n\t* @param allCards - Full pre-filter card pool (for require injection)\n\t*/\n\tapplyHints(cards, hints, allCards) {\n\t\tconst beforeCount = cards.length;\n\t\tif (hints.excludeCards?.length) cards = cards.filter((c) => !hints.excludeCards.some((pat) => globMatch(c.cardId, pat)));\n\t\tif (hints.excludeTags?.length) cards = cards.filter((c) => !hints.excludeTags.some((pat) => cardMatchesTagPattern(c, pat)));\n\t\tif (hints.boostTags) {\n\t\t\tfor (const [pattern, factor] of Object.entries(hints.boostTags)) for (const card of cards) if (cardMatchesTagPattern(card, pattern)) {\n\t\t\t\tcard.score *= factor;\n\t\t\t\tcard.provenance.push({\n\t\t\t\t\tstrategy: \"ephemeralHint\",\n\t\t\t\t\tstrategyId: \"ephemeral-hint\",\n\t\t\t\t\tstrategyName: hints._label ? `Replan Hint (${hints._label})` : \"Replan Hint\",\n\t\t\t\t\taction: \"boosted\",\n\t\t\t\t\tscore: card.score,\n\t\t\t\t\treason: `boostTag ${pattern} ×${factor}`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (hints.boostCards) {\n\t\t\tfor (const [pattern, factor] of Object.entries(hints.boostCards)) for (const card of cards) if (globMatch(card.cardId, pattern)) {\n\t\t\t\tcard.score *= factor;\n\t\t\t\tcard.provenance.push({\n\t\t\t\t\tstrategy: \"ephemeralHint\",\n\t\t\t\t\tstrategyId: \"ephemeral-hint\",\n\t\t\t\t\tstrategyName: hints._label ? `Replan Hint (${hints._label})` : \"Replan Hint\",\n\t\t\t\t\taction: \"boosted\",\n\t\t\t\t\tscore: card.score,\n\t\t\t\t\treason: `boostCard ${pattern} ×${factor}`\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tconst cardIds = new Set(cards.map((c) => c.cardId));\n\t\tconst cardMap = new Map(cards.map((c) => [c.cardId, c]));\n\t\tconst hintLabel = hints._label ? `Replan Hint (${hints._label})` : \"Replan Hint\";\n\t\tconst applyRequirement = (card, reason) => {\n\t\t\tconst mandatoryScore = Number.POSITIVE_INFINITY;\n\t\t\tconst existing = cardMap.get(card.cardId);\n\t\t\tif (existing) {\n\t\t\t\tif (existing.score < mandatoryScore) {\n\t\t\t\t\texisting.score = mandatoryScore;\n\t\t\t\t\texisting.provenance.push({\n\t\t\t\t\t\tstrategy: \"ephemeralHint\",\n\t\t\t\t\t\tstrategyId: \"ephemeral-hint\",\n\t\t\t\t\t\tstrategyName: hintLabel,\n\t\t\t\t\t\taction: \"boosted\",\n\t\t\t\t\t\tscore: mandatoryScore,\n\t\t\t\t\t\treason: `${reason} (upgrade to mandatory score)`\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcards.push({\n\t\t\t\t\t...card,\n\t\t\t\t\tscore: mandatoryScore,\n\t\t\t\t\tprovenance: [...card.provenance, {\n\t\t\t\t\t\tstrategy: \"ephemeralHint\",\n\t\t\t\t\t\tstrategyId: \"ephemeral-hint\",\n\t\t\t\t\t\tstrategyName: hintLabel,\n\t\t\t\t\t\taction: \"boosted\",\n\t\t\t\t\t\tscore: mandatoryScore,\n\t\t\t\t\t\treason\n\t\t\t\t\t}]\n\t\t\t\t});\n\t\t\t\tcardIds.add(card.cardId);\n\t\t\t\tcardMap.set(card.cardId, cards[cards.length - 1]);\n\t\t\t}\n\t\t};\n\t\tif (hints.requireCards?.length) for (const pattern of hints.requireCards) {\n\t\t\tfor (const cardId of cardIds) if (globMatch(cardId, pattern)) applyRequirement(cardMap.get(cardId), `requireCard ${pattern}`);\n\t\t\tfor (const card of allCards) if (globMatch(card.cardId, pattern)) applyRequirement(card, `requireCard ${pattern}`);\n\t\t}\n\t\tif (hints.requireTags?.length) for (const pattern of hints.requireTags) {\n\t\t\tfor (const cardId of cardIds) {\n\t\t\t\tconst card = cardMap.get(cardId);\n\t\t\t\tif (cardMatchesTagPattern(card, pattern)) applyRequirement(card, `requireTag ${pattern}`);\n\t\t\t}\n\t\t\tfor (const card of allCards) if (cardMatchesTagPattern(card, pattern)) applyRequirement(card, `requireTag ${pattern}`);\n\t\t}\n\t\tlogger.info(`[Pipeline] Hints applied: ${beforeCount} → ${cards.length} cards`);\n\t\treturn cards;\n\t}\n\t/**\n\t* The regulator stage: measure each class's pressure and scale it.\n\t*\n\t* - Review mass: every due review's SRS urgency times the filters' net\n\t* effect on it.\n\t* - Intake: servable hours since a new card was presented, applied only to\n\t* eligible new cards (no gate penalized them). With none eligible, the\n\t* clock freezes.\n\t*\n\t* Mutates `cards` in place; returns the readings for the run report.\n\t*/\n\tasync regulate(cards, generatedScores, gated) {\n\t\tconst config = DEFAULT_REGULATOR_CONFIG;\n\t\tconst reviews = cards.filter((c) => c.reviewID);\n\t\tconst newCards = cards.filter((c) => !c.reviewID);\n\t\tconst eligibleNew = newCards.filter((c) => !gated.has(c.cardId));\n\t\tconst mass = reviewMassReading(reviews, generatedScores, config.reviewMass);\n\t\tapplyReading(reviews, mass);\n\t\tnoteReviewPressure(this.course.getCourseID(), {\n\t\t\tmass: mass.urgency,\n\t\t\thealthyMass: config.reviewMass.healthyMass,\n\t\t\trate: config.reviewMass.rate,\n\t\t\tmultiplier: mass.multiplier\n\t\t});\n\t\tconst now = Date.now();\n\t\tconst clock = await this.loadIntakeClock(now);\n\t\tconst stepped = stepIntakeClock(clock, now, eligibleNew.length);\n\t\tif (stepped !== clock) this.saveIntakeClock(stepped);\n\t\tconst intake = intakeReading(stepped, now, {\n\t\t\teligibleNew: eligibleNew.length,\n\t\t\tnewCandidates: newCards.length\n\t\t}, config.intake);\n\t\tapplyReading(eligibleNew, intake);\n\t\tlogger.info(`[Pipeline:regulators] review mass ${mass.urgency.toFixed(1)} over ${reviews.length} due → ×${mass.multiplier.toFixed(2)}; intake ${intake.urgency.toFixed(1)}h, ${eligibleNew.length}/${newCards.length} new eligible → ×${intake.multiplier.toFixed(2)}`);\n\t\treturn [mass, intake];\n\t}\n\t/**\n\t* A card was presented. A new card's first presentation discharges the\n\t* intake valve: its clock restarts. Called by the SessionController.\n\t*/\n\tnotePresented(card) {\n\t\tif (card.status !== \"new\" || card.courseId !== this.course?.getCourseID()) return;\n\t\tthis.saveIntakeClock(resetIntakeClock(Date.now()));\n\t}\n\tasync loadIntakeClock(nowMs) {\n\t\tif (this._intakeClock) return this._intakeClock;\n\t\tlet stored = null;\n\t\ttry {\n\t\t\tstored = await this.user.getStrategyState(this.course.getCourseID(), INTAKE_CLOCK_KEY);\n\t\t} catch (e) {\n\t\t\tlogger.warn(`[Pipeline:regulators] Could not read the intake clock: ${e}`);\n\t\t}\n\t\tif (stored) this._intakeClock = stored;\n\t\telse this.saveIntakeClock(resetIntakeClock(nowMs));\n\t\treturn this._intakeClock;\n\t}\n\tsaveIntakeClock(state) {\n\t\tthis._intakeClock = state;\n\t\tconst courseId = this.course.getCourseID();\n\t\tthis._intakeClockWrite = this._intakeClockWrite.then(() => this.user.putStrategyState(courseId, INTAKE_CLOCK_KEY, state)).catch((e) => logger.warn(`[Pipeline:regulators] Could not save the intake clock: ${e}`));\n\t}\n\t/**\n\t* Build shared context for generator and filters.\n\t*\n\t* Called once per getWeightedCards() invocation.\n\t* Contains data that the generator and multiple filters might need.\n\t*\n\t* The context satisfies both GeneratorContext and FilterContext interfaces.\n\t*/\n\tasync buildContext() {\n\t\tlet userElo = 1e3;\n\t\tlet userCourseElo;\n\t\ttry {\n\t\t\tuserCourseElo = toCourseElo((await this.user.getCourseRegDoc(this.course.getCourseID())).elo);\n\t\t\tuserElo = userCourseElo.global.score;\n\t\t} catch (e) {\n\t\t\tlogger.debug(`[Pipeline] Could not get user ELO, using default: ${e}`);\n\t\t}\n\t\tif (!this._cachedOrchestration) this._cachedOrchestration = await createOrchestrationContext(this.user, this.course);\n\t\tconst orchestration = this._cachedOrchestration;\n\t\treturn {\n\t\t\tuser: this.user,\n\t\t\tcourse: this.course,\n\t\t\tuserElo,\n\t\t\t...userCourseElo ? { userCourseElo } : {},\n\t\t\torchestration\n\t\t};\n\t}\n\t/**\n\t* Get the course ID for this pipeline.\n\t*/\n\tgetCourseID() {\n\t\treturn this.course.getCourseID();\n\t}\n\t/**\n\t* Get orchestration context for outcome recording.\n\t*/\n\tasync getOrchestrationContext() {\n\t\treturn createOrchestrationContext(this.user, this.course);\n\t}\n\t/**\n\t* Get IDs of all strategies in this pipeline.\n\t* Used to record which strategies contributed to an outcome.\n\t*/\n\tgetStrategyIds() {\n\t\tconst ids = [];\n\t\tconst extractId = (obj) => {\n\t\t\tif (obj.strategyId) return obj.strategyId;\n\t\t\treturn null;\n\t\t};\n\t\tconst genId = extractId(this.generator);\n\t\tif (genId) ids.push(genId);\n\t\tif (this.generator.generators && Array.isArray(this.generator.generators)) this.generator.generators.forEach((g) => {\n\t\t\tconst subId = extractId(g);\n\t\t\tif (subId) ids.push(subId);\n\t\t});\n\t\tfor (const filter of this.filters) {\n\t\t\tconst fId = extractId(filter);\n\t\t\tif (fId) ids.push(fId);\n\t\t}\n\t\treturn [...new Set(ids)];\n\t}\n\t/**\n\t* Get the user's per-tag ELO data for specified tags (or all tags).\n\t* Useful for diagnosing why hierarchy gates are open/closed.\n\t*/\n\tasync getTagEloStatus(tagFilter) {\n\t\tconst courseElo = toCourseElo((await this.user.getCourseRegDoc(this.course.getCourseID())).elo);\n\t\tconst result = {};\n\t\tif (!tagFilter) for (const [tag, data] of Object.entries(courseElo.tags)) result[tag] = {\n\t\t\tscore: data.score,\n\t\t\tcount: data.count\n\t\t};\n\t\telse {\n\t\t\tconst patterns = Array.isArray(tagFilter) ? tagFilter : [tagFilter];\n\t\t\tfor (const pattern of patterns) {\n\t\t\t\tconst regex = globToRegex(pattern);\n\t\t\t\tfor (const [tag, data] of Object.entries(courseElo.tags)) if (regex.test(tag)) result[tag] = {\n\t\t\t\t\tscore: data.score,\n\t\t\t\t\tcount: data.count\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\t/**\n\t* Commit-free forecast: score the user's full card space through the filter\n\t* chain and return the cards that are currently *reachable* (score >=\n\t* threshold), optionally nudged by caller-supplied hints and/or restricted\n\t* to cards the user hasn't seen yet.\n\t*\n\t* This is a GENERIC primitive — it returns scored, tag-hydrated cards and\n\t* stops there. It has no knowledge of any particular tag convention; callers\n\t* decide what the surviving cards mean (e.g. filter to their own \"intro\"\n\t* tag family). Nothing is written and no session is started.\n\t*\n\t* The optional `hints` are the \"out-of-band kick\": they run through the same\n\t* {@link applyHints} path a live replan uses, so the two semantics carry over —\n\t* - `boostTags`/`boostCards` reweight *within* gating (a gated score-0 card\n\t* stays out), and\n\t* - `requireTags`/`requireCards` inject from the full pre-filter pool,\n\t* *bypassing* gating (use when you want a card regardless of reachability).\n\t* Note `unseenOnly` is applied LAST, so it can drop a `require`d card that the\n\t* user has already seen — pass `unseenOnly: false` if that matters.\n\t*\n\t* Cost note: like {@link diagnoseCardSpace}, this scans every card through the\n\t* filters, so it's heavier than a normal replan. Intended for one-shot\n\t* out-of-band use (e.g. a session-end \"what's next\" snapshot), not the hot path.\n\t*\n\t* @param opts.hints Optional ephemeral hints to apply after the filter chain.\n\t* @param opts.unseenOnly Only return cards the user hasn't encountered (default true).\n\t* @param opts.threshold Min score to count as reachable (default 0.10).\n\t* @param opts.limit Optional cap on results (already sorted desc).\n\t*/\n\tasync forecast(opts) {\n\t\tconst threshold = opts?.threshold ?? .1;\n\t\tconst unseenOnly = opts?.unseenOnly ?? true;\n\t\tconst courseId = this.course.getCourseID();\n\t\tlet cards = (await this.course.getAllCardIds()).map((cardId) => ({\n\t\t\tcardId,\n\t\t\tcourseId,\n\t\t\tscore: 1,\n\t\t\tprovenance: []\n\t\t}));\n\t\tcards = await this.hydrateTags(cards);\n\t\tconst fullPool = cards.slice();\n\t\tconst context = await this.buildContext();\n\t\tfor (const filter of this.forecastFilters()) cards = await filter.transform(cards, context);\n\t\tif (opts?.hints) cards = this.applyHints(cards, opts.hints, fullPool);\n\t\tcards = cards.filter((c) => c.score >= threshold);\n\t\tif (unseenOnly) {\n\t\t\tlet encountered;\n\t\t\ttry {\n\t\t\t\tencountered = new Set(await this.user.getSeenCards(courseId));\n\t\t\t} catch {\n\t\t\t\tencountered = /* @__PURE__ */ new Set();\n\t\t\t}\n\t\t\tcards = cards.filter((c) => !encountered.has(c.cardId));\n\t\t}\n\t\tcards.sort((a, b) => b.score - a.score);\n\t\treturn opts?.limit ? cards.slice(0, opts.limit) : cards;\n\t}\n\t/**\n\t* The filters a forecast or card-space scan applies. Those start every card at\n\t* 1.0 without a generator, so they skip `liveOnly` filters (ELO distance),\n\t* which only make sense against generator scores.\n\t*/\n\tforecastFilters() {\n\t\treturn this.filters.filter((f) => !f.liveOnly);\n\t}\n\t/**\n\t* Scan every card in the course through the filter chain and report\n\t* how many are \"well indicated\" (score >= threshold) for the current user.\n\t*\n\t* Also reports how many well-indicated cards the user has NOT yet encountered.\n\t*\n\t* Exposed via `window.skuilder.pipeline.diagnoseCardSpace()`.\n\t*/\n\tasync diagnoseCardSpace(opts) {\n\t\tconst THRESHOLD = opts?.threshold ?? .1;\n\t\tconst t0 = performance.now();\n\t\tconst allCardIds = await this.course.getAllCardIds();\n\t\tlet cards = allCardIds.map((cardId) => ({\n\t\t\tcardId,\n\t\t\tcourseId: this.course.getCourseID(),\n\t\t\tscore: 1,\n\t\t\tprovenance: []\n\t\t}));\n\t\tcards = await this.hydrateTags(cards);\n\t\tconst context = await this.buildContext();\n\t\tconst filterBreakdown = [];\n\t\tfor (const filter of this.forecastFilters()) {\n\t\t\tcards = await filter.transform(cards, context);\n\t\t\tconst wi = cards.filter((c) => c.score >= THRESHOLD).length;\n\t\t\tfilterBreakdown.push({\n\t\t\t\tname: filter.name,\n\t\t\t\twellIndicated: wi\n\t\t\t});\n\t\t}\n\t\tconst wellIndicated = cards.filter((c) => c.score >= THRESHOLD);\n\t\tconst wellIndicatedIds = new Set(wellIndicated.map((c) => c.cardId));\n\t\tlet encounteredIds;\n\t\ttry {\n\t\t\tconst courseId = this.course.getCourseID();\n\t\t\tconst seenCards = await this.user.getSeenCards(courseId);\n\t\t\tencounteredIds = new Set(seenCards);\n\t\t} catch {\n\t\t\tencounteredIds = /* @__PURE__ */ new Set();\n\t\t}\n\t\tconst wellIndicatedNew = wellIndicated.filter((c) => !encounteredIds.has(c.cardId));\n\t\tconst byType = /* @__PURE__ */ new Map();\n\t\tfor (const card of cards) {\n\t\t\tconst type = card.cardId.split(\"-\")[1] || \"unknown\";\n\t\t\tif (!byType.has(type)) byType.set(type, {\n\t\t\t\ttotal: 0,\n\t\t\t\twellIndicated: 0,\n\t\t\t\tnew: 0\n\t\t\t});\n\t\t\tconst entry = byType.get(type);\n\t\t\tentry.total++;\n\t\t\tif (card.score >= THRESHOLD) {\n\t\t\t\tentry.wellIndicated++;\n\t\t\t\tif (!encounteredIds.has(card.cardId)) entry.new++;\n\t\t\t}\n\t\t}\n\t\tconst elapsed = performance.now() - t0;\n\t\tconst result = {\n\t\t\ttotalCards: allCardIds.length,\n\t\t\tthreshold: THRESHOLD,\n\t\t\twellIndicated: wellIndicatedIds.size,\n\t\t\tencountered: encounteredIds.size,\n\t\t\twellIndicatedNew: wellIndicatedNew.length,\n\t\t\tbyType: Object.fromEntries(byType),\n\t\t\tfilterBreakdown,\n\t\t\telapsedMs: Math.round(elapsed)\n\t\t};\n\t\tlogger.print(`[Pipeline:diagnose] Card space scan (${result.elapsedMs}ms):`);\n\t\tlogger.print(`[Pipeline:diagnose] Total cards: ${result.totalCards}`);\n\t\tlogger.print(`[Pipeline:diagnose] Well-indicated (score >= ${THRESHOLD}): ${result.wellIndicated}`);\n\t\tlogger.print(`[Pipeline:diagnose] Encountered: ${result.encountered}`);\n\t\tlogger.print(`[Pipeline:diagnose] Well-indicated & new: ${result.wellIndicatedNew}`);\n\t\tlogger.print(`[Pipeline:diagnose] By type:`);\n\t\tfor (const [type, counts] of byType) logger.print(`[Pipeline:diagnose] ${type}: ${counts.wellIndicated}/${counts.total} well-indicated, ${counts.new} new`);\n\t\tlogger.print(`[Pipeline:diagnose] After each filter:`);\n\t\tfor (const fb of filterBreakdown) logger.print(`[Pipeline:diagnose] ${fb.name}: ${fb.wellIndicated} well-indicated`);\n\t\treturn result;\n\t}\n};\n//#endregion\nexport { Pipeline, mergeHints };\n\n//# sourceMappingURL=Pipeline.mjs.map","import \"../../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../../util/logger.mjs\";\nimport { ContentNavigator } from \"../index.mjs\";\n//#region src/core/navigators/generators/CompositeGenerator.ts\n/**\n* Aggregation modes for combining scores from multiple generators.\n*/\nlet AggregationMode = /* @__PURE__ */ function(AggregationMode) {\n\t/** Use the maximum score from any generator */\n\tAggregationMode[\"MAX\"] = \"max\";\n\t/** Average all scores */\n\tAggregationMode[\"AVERAGE\"] = \"average\";\n\t/** Average with frequency boost: avg * (1 + 0.1 * (n-1)) */\n\tAggregationMode[\"FREQUENCY_BOOST\"] = \"frequencyBoost\";\n\treturn AggregationMode;\n}({});\nconst DEFAULT_AGGREGATION_MODE = AggregationMode.FREQUENCY_BOOST;\nconst FREQUENCY_BOOST_FACTOR = .1;\nfunction mergeHints(allHints) {\n\tconst defined = allHints.filter((h) => h !== void 0);\n\tif (defined.length === 0) return void 0;\n\tconst merged = {};\n\tconst boostTags = {};\n\tfor (const hints of defined) for (const [pattern, factor] of Object.entries(hints.boostTags ?? {})) boostTags[pattern] = (boostTags[pattern] ?? 1) * factor;\n\tif (Object.keys(boostTags).length > 0) merged.boostTags = boostTags;\n\tconst boostCards = {};\n\tfor (const hints of defined) for (const [pattern, factor] of Object.entries(hints.boostCards ?? {})) boostCards[pattern] = (boostCards[pattern] ?? 1) * factor;\n\tif (Object.keys(boostCards).length > 0) merged.boostCards = boostCards;\n\tconst concatUnique = (field) => {\n\t\tconst values = defined.flatMap((h) => h[field] ?? []);\n\t\tif (values.length > 0) merged[field] = [...new Set(values)];\n\t};\n\tconcatUnique(\"requireTags\");\n\tconcatUnique(\"requireCards\");\n\tconcatUnique(\"excludeTags\");\n\tconcatUnique(\"excludeCards\");\n\tconst labels = defined.map((h) => h._label).filter(Boolean);\n\tif (labels.length > 0) merged._label = labels.join(\"; \");\n\treturn Object.keys(merged).length > 0 ? merged : void 0;\n}\n/**\n* Composes multiple generators into a single generator.\n*\n* Implements CardGenerator for use in Pipeline architecture.\n* Also extends ContentNavigator for backward compatibility.\n*\n* Fetches candidates from all generators, deduplicates by cardId,\n* and aggregates scores based on the configured mode.\n*/\nvar CompositeGenerator = class CompositeGenerator extends ContentNavigator {\n\t/** Human-readable name for CardGenerator interface */\n\tname = \"Composite Generator\";\n\tgenerators;\n\taggregationMode;\n\tconstructor(generators, aggregationMode = DEFAULT_AGGREGATION_MODE) {\n\t\tsuper();\n\t\tthis.generators = generators;\n\t\tthis.aggregationMode = aggregationMode;\n\t\tif (generators.length === 0) throw new Error(\"CompositeGenerator requires at least one generator\");\n\t\tlogger.debug(`[CompositeGenerator] Created with ${generators.length} generators, mode: ${aggregationMode}`);\n\t}\n\t/**\n\t* Creates a CompositeGenerator from strategy data.\n\t*\n\t* This is a convenience factory for use by PipelineAssembler.\n\t*/\n\tstatic async fromStrategies(user, course, strategies, aggregationMode = DEFAULT_AGGREGATION_MODE) {\n\t\treturn new CompositeGenerator(await Promise.all(strategies.map((s) => ContentNavigator.create(user, course, s))), aggregationMode);\n\t}\n\t/**\n\t* Get weighted cards from all generators, merge and deduplicate.\n\t*\n\t* Cards appearing in multiple generators receive a score boost.\n\t* Provenance tracks which generators produced each card and how scores were aggregated.\n\t*\n\t* This method supports both the legacy signature (limit only) and the\n\t* CardGenerator interface signature (limit, context).\n\t*\n\t* @param limit - Maximum number of cards to return\n\t* @param context - GeneratorContext passed to child generators (required when called via Pipeline)\n\t*/\n\tasync getWeightedCards(limit, context) {\n\t\tif (!context) throw new Error(\"CompositeGenerator.getWeightedCards requires a GeneratorContext. It should be called via Pipeline, not directly.\");\n\t\tconst results = await Promise.all(this.generators.map((g) => g.getWeightedCards(limit, context)));\n\t\tconst generatorSummaries = [];\n\t\tresults.forEach((result, index) => {\n\t\t\tconst cards = result.cards;\n\t\t\tconst genName = this.generators[index].name || `Generator ${index}`;\n\t\t\tconst newCards = cards.filter((c) => c.provenance[0]?.reason?.includes(\"new card\"));\n\t\t\tconst reviewCards = cards.filter((c) => c.provenance[0]?.reason?.includes(\"review\"));\n\t\t\tif (cards.length > 0) {\n\t\t\t\tconst topScore = Math.max(...cards.map((c) => c.score)).toFixed(2);\n\t\t\t\tconst parts = [];\n\t\t\t\tif (newCards.length > 0) parts.push(`${newCards.length} new`);\n\t\t\t\tif (reviewCards.length > 0) parts.push(`${reviewCards.length} reviews`);\n\t\t\t\tconst breakdown = parts.length > 0 ? parts.join(\", \") : `${cards.length} cards`;\n\t\t\t\tgeneratorSummaries.push(`${genName}: ${breakdown} (top: ${topScore})`);\n\t\t\t} else generatorSummaries.push(`${genName}: 0 cards`);\n\t\t});\n\t\tlogger.info(`[Composite] Generator breakdown: ${generatorSummaries.join(\" | \")}`);\n\t\tconst byCardId = /* @__PURE__ */ new Map();\n\t\tresults.forEach((result, index) => {\n\t\t\tconst cards = result.cards;\n\t\t\tconst gen = this.generators[index];\n\t\t\tlet weight = gen.learnable?.weight ?? 1;\n\t\t\tlet deviation;\n\t\t\tif (gen.learnable && !gen.staticWeight && context.orchestration) {\n\t\t\t\tconst strategyId = gen.strategyId;\n\t\t\t\tif (strategyId) {\n\t\t\t\t\tweight = context.orchestration.getEffectiveWeight(strategyId, gen.learnable);\n\t\t\t\t\tdeviation = context.orchestration.getDeviation(strategyId);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const card of cards) {\n\t\t\t\tif (card.provenance.length > 0) {\n\t\t\t\t\tcard.provenance[0].effectiveWeight = weight;\n\t\t\t\t\tcard.provenance[0].deviation = deviation;\n\t\t\t\t}\n\t\t\t\tconst existing = byCardId.get(card.cardId) || [];\n\t\t\t\texisting.push({\n\t\t\t\t\tcard,\n\t\t\t\t\tweight\n\t\t\t\t});\n\t\t\t\tbyCardId.set(card.cardId, existing);\n\t\t\t}\n\t\t});\n\t\tconst merged = [];\n\t\tfor (const [, items] of byCardId) {\n\t\t\tconst cards = items.map((i) => i.card);\n\t\t\tconst aggregatedScore = this.aggregateScores(items);\n\t\t\tconst finalScore = Math.max(0, aggregatedScore);\n\t\t\tconst mergedProvenance = cards.flatMap((c) => c.provenance);\n\t\t\tconst initialScore = cards[0].score;\n\t\t\tconst action = finalScore > initialScore ? \"boosted\" : finalScore < initialScore ? \"penalized\" : \"passed\";\n\t\t\tconst reason = this.buildAggregationReason(items, finalScore);\n\t\t\tmerged.push({\n\t\t\t\t...cards[0],\n\t\t\t\tscore: finalScore,\n\t\t\t\tprovenance: [...mergedProvenance, {\n\t\t\t\t\tstrategy: \"composite\",\n\t\t\t\t\tstrategyName: \"Composite Generator\",\n\t\t\t\t\tstrategyId: \"COMPOSITE_GENERATOR\",\n\t\t\t\t\taction,\n\t\t\t\t\tscore: finalScore,\n\t\t\t\t\treason\n\t\t\t\t}]\n\t\t\t});\n\t\t}\n\t\treturn {\n\t\t\tcards: merged.sort((a, b) => b.score - a.score).slice(0, limit),\n\t\t\thints: mergeHints(results.map((result) => result.hints))\n\t\t};\n\t}\n\t/**\n\t* Build human-readable reason for score aggregation.\n\t*/\n\tbuildAggregationReason(items, finalScore) {\n\t\tconst cards = items.map((i) => i.card);\n\t\tconst count = cards.length;\n\t\tconst scores = cards.map((c) => c.score.toFixed(2)).join(\", \");\n\t\tif (count === 1) {\n\t\t\tconst weightMsg = Math.abs(items[0].weight - 1) > .001 ? ` (w=${items[0].weight.toFixed(2)})` : \"\";\n\t\t\treturn `Single generator, score ${finalScore.toFixed(2)}${weightMsg}`;\n\t\t}\n\t\tconst strategies = cards.map((c) => c.provenance[0]?.strategy || \"unknown\").join(\", \");\n\t\tswitch (this.aggregationMode) {\n\t\t\tcase AggregationMode.MAX: return `Max of ${count} generators (${strategies}): scores [${scores}] → ${finalScore.toFixed(2)}`;\n\t\t\tcase AggregationMode.AVERAGE: return `Weighted Avg of ${count} generators (${strategies}): scores [${scores}] → ${finalScore.toFixed(2)}`;\n\t\t\tcase AggregationMode.FREQUENCY_BOOST: {\n\t\t\t\tconst totalWeight = items.reduce((sum, i) => sum + i.weight, 0);\n\t\t\t\tconst weightedSum = items.reduce((sum, i) => sum + i.card.score * i.weight, 0);\n\t\t\t\tconst avg = totalWeight > 0 ? weightedSum / totalWeight : 0;\n\t\t\t\tconst boost = 1 + FREQUENCY_BOOST_FACTOR * (count - 1);\n\t\t\t\treturn `Frequency boost from ${count} generators (${strategies}): w-avg ${avg.toFixed(2)} × ${boost.toFixed(2)} → ${finalScore.toFixed(2)}`;\n\t\t\t}\n\t\t\tdefault: return `Aggregated from ${count} generators: ${finalScore.toFixed(2)}`;\n\t\t}\n\t}\n\t/**\n\t* Aggregate scores from multiple generators for the same card.\n\t*/\n\taggregateScores(items) {\n\t\tconst scores = items.map((i) => i.card.score);\n\t\tswitch (this.aggregationMode) {\n\t\t\tcase AggregationMode.MAX: return Math.max(...scores);\n\t\t\tcase AggregationMode.AVERAGE: {\n\t\t\t\tconst totalWeight = items.reduce((sum, i) => sum + i.weight, 0);\n\t\t\t\tif (totalWeight === 0) return 0;\n\t\t\t\treturn items.reduce((sum, i) => sum + i.card.score * i.weight, 0) / totalWeight;\n\t\t\t}\n\t\t\tcase AggregationMode.FREQUENCY_BOOST: {\n\t\t\t\tconst totalWeight = items.reduce((sum, i) => sum + i.weight, 0);\n\t\t\t\tconst weightedSum = items.reduce((sum, i) => sum + i.card.score * i.weight, 0);\n\t\t\t\treturn (totalWeight > 0 ? weightedSum / totalWeight : 0) * (1 + FREQUENCY_BOOST_FACTOR * (items.length - 1));\n\t\t\t}\n\t\t\tdefault: return scores[0];\n\t\t}\n\t}\n};\n//#endregion\nexport { CompositeGenerator as default };\n\n//# sourceMappingURL=CompositeGenerator.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { Navigators } from \"./index.mjs\";\nimport { DEFAULT_STRATEGY_HASH } from \"../versionStamps.mjs\";\nimport { DocType } from \"../types/types-legacy.mjs\";\nimport { Pipeline } from \"./Pipeline.mjs\";\nimport CompositeGenerator from \"./generators/CompositeGenerator.mjs\";\nimport ELONavigator from \"./generators/elo.mjs\";\nimport SRSNavigator from \"./generators/srs.mjs\";\nimport EloDistanceFilter, { DEFAULT_ELO_DISTANCE_CONFIG } from \"./filters/eloDistance.mjs\";\n//#region src/core/navigators/defaults.ts\n/**\n* Default navigation pipeline configuration.\n*\n* This module provides factory functions for creating the canonical default\n* navigation pipeline used by both CouchDB and static course implementations.\n*/\n/**\n* Create default ELO navigation strategy data.\n* Used when no custom strategies are configured.\n*\n* @param courseId - The course ID to associate with this strategy\n* @returns Strategy data for default ELO navigation\n*/\nfunction createDefaultEloStrategy(courseId) {\n\treturn {\n\t\t_id: \"NAVIGATION_STRATEGY-ELO-default\",\n\t\tdocType: DocType.NAVIGATION_STRATEGY,\n\t\tname: \"ELO (default)\",\n\t\tdescription: \"Default ELO-based navigation strategy for new cards\",\n\t\timplementingClass: Navigators.ELO,\n\t\tcourse: courseId,\n\t\tserializedData: \"\"\n\t};\n}\n/**\n* Create default SRS navigation strategy data.\n* Used when no custom strategies are configured.\n*\n* @param courseId - The course ID to associate with this strategy\n* @returns Strategy data for default SRS navigation\n*/\nfunction createDefaultSrsStrategy(courseId) {\n\treturn {\n\t\t_id: \"NAVIGATION_STRATEGY-SRS-default\",\n\t\tdocType: DocType.NAVIGATION_STRATEGY,\n\t\tname: \"SRS (default)\",\n\t\tdescription: \"Default SRS-based navigation strategy for reviews\",\n\t\timplementingClass: Navigators.SRS,\n\t\tcourse: courseId,\n\t\tserializedData: \"\"\n\t};\n}\n/**\n* Create default ELO distance filter strategy data. The assembler adds it to\n* any pipeline whose strategy docs declare no `eloDistance` filter.\n*\n* @param courseId - The course ID to associate with this strategy\n* @returns Strategy data for the default ELO distance filter (default curve)\n*/\nfunction createDefaultEloDistanceStrategy(courseId) {\n\treturn {\n\t\t_id: \"NAVIGATION_STRATEGY-eloDistance-default\",\n\t\tdocType: DocType.NAVIGATION_STRATEGY,\n\t\tname: \"ELO Distance (default)\",\n\t\tdescription: \"Scales every candidate, new or review, by its distance from the learner's ELO\",\n\t\timplementingClass: Navigators.ELO_DISTANCE,\n\t\tcourse: courseId,\n\t\tserializedData: JSON.stringify(DEFAULT_ELO_DISTANCE_CONFIG)\n\t};\n}\n/**\n* Creates the default navigation pipeline for courses with no configured strategies.\n*\n* Default: Pipeline(Composite(ELO, SRS), [ELO distance])\n* - ELO generator: retrieves new cards near the learner's ELO\n* - SRS generator: scores reviews by overdueness and interval recency\n* - ELO distance filter: scales every card by its distance from the learner's ELO\n*\n* This is the canonical default configuration used when:\n* - No navigation strategy documents exist in the course\n* - PipelineAssembler fails to build from strategy documents\n*\n* @param user - User database interface for accessing user state\n* @param course - Course database interface for accessing course data\n* @returns Configured Pipeline ready for use\n*/\nfunction createDefaultPipeline(user, course) {\n\tconst courseId = course.getCourseID();\n\tconst pipeline = new Pipeline(new CompositeGenerator([new ELONavigator(user, course, createDefaultEloStrategy(courseId)), new SRSNavigator(user, course, createDefaultSrsStrategy(courseId))]), [new EloDistanceFilter(user, course, createDefaultEloDistanceStrategy(courseId))], user, course);\n\tpipeline.strategyHash = DEFAULT_STRATEGY_HASH;\n\treturn pipeline;\n}\n//#endregion\nexport { createDefaultEloDistanceStrategy, createDefaultEloStrategy, createDefaultPipeline, createDefaultSrsStrategy };\n\n//# sourceMappingURL=defaults.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { NavigatorRole, getRegisteredFilterKind, isFilter, isGenerator } from \"./index.mjs\";\nimport { DEFAULT_REGULATOR_CONFIG } from \"./regulators.mjs\";\nimport { createDefaultEloDistanceStrategy, createDefaultEloStrategy, createDefaultSrsStrategy } from \"./defaults.mjs\";\n//#region src/core/navigators/pipelinePlan.ts\n/**\n* The steps every pipeline run takes, in order (`Pipeline.getWeightedCards`).\n* `generate` and `filter` are where a plan's navigators run; the rest are\n* fixed framework behaviour.\n*/\nconst PIPELINE_STAGES = [\n\t{\n\t\tkey: \"generate\",\n\t\ttitle: \"Generate\",\n\t\tsummary: \"Each generator proposes candidates (up to 500 in all), scored on what is specific to its source. A card proposed by several generators keeps their mean score, raised 10% per extra generator.\"\n\t},\n\t{\n\t\tkey: \"filter\",\n\t\ttitle: \"Filter\",\n\t\tsummary: \"Each filter multiplies candidate scores, in the order shown. A gate says a card is not ready yet; a signal expresses preference. Gates usually penalize rather than remove, so a gated card stays in the pool at a low score.\"\n\t},\n\t{\n\t\tkey: \"drop-zero\",\n\t\ttitle: \"Drop zero scores\",\n\t\tsummary: \"Candidates whose score reached 0 leave the pool.\"\n\t},\n\t{\n\t\tkey: \"regulate\",\n\t\ttitle: \"Regulate\",\n\t\tsummary: \"Balances reviews against new cards. Review mass: the due reviews weighed by their filtered scores; above a healthy level, every review is lifted. Intake: hours since a new card was last presented; new cards no gate penalized are lifted, and the clock stops while there are none.\"\n\t},\n\t{\n\t\tkey: \"hints\",\n\t\ttitle: \"Apply hints\",\n\t\tsummary: \"The session's hints (from the app: an intro's follow-up, a difficulty boost) exclude, boost, or require cards. Required cards skip the filters entirely.\"\n\t},\n\t{\n\t\tkey: \"diversity\",\n\t\ttitle: \"Diversity re-rank\",\n\t\tsummary: \"Demotes candidates that repeat a distinctive tag already ranked above them, so one concept or answer cannot take the whole head of the queue. Sees this run only, not what the session already served.\"\n\t},\n\t{\n\t\tkey: \"select\",\n\t\ttitle: \"Select\",\n\t\tsummary: \"Highest scores first, up to the run's limit. The session mixes them into its supply queue.\"\n\t}\n];\nfunction planned(strategy, role, origin) {\n\tconst kind = role === NavigatorRole.FILTER ? getRegisteredFilterKind(strategy.implementingClass) : void 0;\n\treturn {\n\t\trole,\n\t\torigin,\n\t\tname: strategy.name,\n\t\timplementingClass: strategy.implementingClass,\n\t\tstrategy,\n\t\t...kind ? { kind } : {}\n\t};\n}\n/**\n* Plan the pipeline a course's strategy documents assemble into.\n*\n* Mirrors the assembly rules: generators keep document order, with ELO and SRS\n* added when absent; an ELO distance filter is added when absent; filters run\n* sorted by name; unknown implementing classes are skipped with a warning. With no documents at all, describes the default\n* pipeline that `createDefaultPipeline` builds instead.\n*/\nfunction planPipeline(strategies, courseId) {\n\tif (strategies.length === 0) return {\n\t\tkind: \"default\",\n\t\tgenerators: [planned(createDefaultEloStrategy(courseId), NavigatorRole.GENERATOR, \"default-pipeline\"), planned(createDefaultSrsStrategy(courseId), NavigatorRole.GENERATOR, \"default-pipeline\")],\n\t\tfilters: [planned(createDefaultEloDistanceStrategy(courseId), NavigatorRole.FILTER, \"default-pipeline\")],\n\t\tskipped: [],\n\t\twarnings: [],\n\t\tnotes: [],\n\t\tregulators: DEFAULT_REGULATOR_CONFIG\n\t};\n\tconst generators = [];\n\tconst filters = [];\n\tconst skipped = [];\n\tconst warnings = [];\n\tfor (const s of strategies) if (isGenerator(s.implementingClass)) generators.push(planned(s, NavigatorRole.GENERATOR, \"strategy-doc\"));\n\telse if (isFilter(s.implementingClass)) filters.push(planned(s, NavigatorRole.FILTER, \"strategy-doc\"));\n\telse {\n\t\tskipped.push({\n\t\t\tstrategy: s,\n\t\t\treason: \"not a registered generator or filter\"\n\t\t});\n\t\twarnings.push(`Unknown strategy type '${s.implementingClass}', skipping: ${s.name}`);\n\t}\n\tconst declared = new Set(generators.map((g) => g.implementingClass));\n\tif (!declared.has(createDefaultEloStrategy(courseId).implementingClass)) generators.push(planned(createDefaultEloStrategy(courseId), NavigatorRole.GENERATOR, \"assembler-default\"));\n\tif (!declared.has(createDefaultSrsStrategy(courseId).implementingClass)) generators.push(planned(createDefaultSrsStrategy(courseId), NavigatorRole.GENERATOR, \"assembler-default\"));\n\tconst eloDistance = createDefaultEloDistanceStrategy(courseId);\n\tif (!filters.some((f) => f.implementingClass === eloDistance.implementingClass)) filters.push(planned(eloDistance, NavigatorRole.FILTER, \"assembler-default\"));\n\tfilters.sort((a, b) => a.name.localeCompare(b.name));\n\treturn {\n\t\tkind: \"assembled\",\n\t\tgenerators,\n\t\tfilters,\n\t\tskipped,\n\t\twarnings,\n\t\tnotes: [],\n\t\tregulators: DEFAULT_REGULATOR_CONFIG\n\t};\n}\n//#endregion\nexport { PIPELINE_STAGES, planPipeline };\n\n//# sourceMappingURL=pipelinePlan.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { DocType, DocTypePrefixes } from \"../types/types-legacy.mjs\";\n//#region src/core/util/index.ts\nfunction areQuestionRecords(h) {\n\treturn isQuestionRecord(h.records[0]);\n}\nfunction isQuestionRecord(c) {\n\treturn c.userAnswer !== void 0;\n}\nfunction getCardHistoryID(courseID, cardID) {\n\treturn `${DocTypePrefixes[DocType.CARDRECORD]}-${courseID}-${cardID}`;\n}\nfunction parseCardHistoryID(id) {\n\tconst split = id.split(\"-\");\n\tlet error = \"\";\n\terror += split.length === 3 ? \"\" : `\\n\\tgiven ID has incorrect number of '-' characters`;\n\terror += split[0] === DocTypePrefixes[DocType.CARDRECORD] ? \"\" : `\n\tgiven ID does not start with ${DocTypePrefixes[DocType.CARDRECORD]}`;\n\tif (split.length === 3 && split[0] === DocTypePrefixes[DocType.CARDRECORD]) return {\n\t\tcourseID: split[1],\n\t\tcardID: split[2]\n\t};\n\telse throw new Error(\"parseCardHistory Error:\" + error);\n}\nfunction docIsDeleted(e) {\n\treturn Boolean(e?.error === \"not_found\" && e?.reason === \"deleted\");\n}\n//#endregion\nexport { areQuestionRecords, docIsDeleted, getCardHistoryID, isQuestionRecord, parseCardHistoryID };\n\n//# sourceMappingURL=index.mjs.map","import \"../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../util/logger.mjs\";\nimport { areQuestionRecords } from \"../core/util/index.mjs\";\nimport moment from \"moment\";\nimport { isTaggedPerformance } from \"@vue-skuilder/common\";\n//#region src/study/SpacedRepetition.ts\nconst duration = moment.duration;\n/**\n* Longest interval (seconds) after a correct answer flagged `fluent: false`.\n* Matches the 20h floor in `lastSuccessfulInterval`: due again next day.\n*/\nconst SLOW_CORRECT_MAX_INTERVAL = 1200 * 60;\n/**\n* Returns the minimum number of seconds that should pass before a\n* card is redisplayed for review / practice.\n*\n* @param cardHistory The user's history working with the given card\n*/\nfunction newInterval(user, cardHistory) {\n\tif (areQuestionRecords(cardHistory)) return newQuestionInterval(user, cardHistory);\n\telse return 1e5;\n}\nfunction newQuestionInterval(user, cardHistory) {\n\tconst records = cardHistory.records;\n\tconst currentAttempt = records[records.length - 1];\n\tconst lastInterval = lastSuccessfulInterval(records);\n\tif (lastInterval > cardHistory.bestInterval) {\n\t\tcardHistory.bestInterval = lastInterval;\n\t\tuser.update(cardHistory._id, { bestInterval: lastInterval }).catch((e) => {\n\t\t\tlogger.warn(`[SpacedRepetition] Failed to update bestInterval for ${cardHistory._id}: ${e?.message ?? e}`);\n\t\t});\n\t}\n\tif (currentAttempt.isCorrect) {\n\t\tconst rawPerf = currentAttempt.performance;\n\t\tconst numericPerf = isTaggedPerformance(rawPerf) ? rawPerf._global : rawPerf;\n\t\tconst skill = Math.min(1, Math.max(0, numericPerf));\n\t\tlogger.debug(`Demontrated skill: \\t${skill}`);\n\t\tconst interval = lastInterval * (.75 + skill);\n\t\tcardHistory.lapses = getLapses(cardHistory.records);\n\t\tcardHistory.streak = getStreak(cardHistory.records);\n\t\tlet ret = interval;\n\t\tif (cardHistory.lapses && cardHistory.streak && cardHistory.bestInterval && (cardHistory.lapses >= 0 || cardHistory.streak >= 0)) {\n\t\t\tret = (cardHistory.lapses * interval + cardHistory.streak * cardHistory.bestInterval) / (cardHistory.lapses + cardHistory.streak);\n\t\t\tlogger.debug(`Weighted average interval calculation:\n\\t(${cardHistory.lapses} * ${interval} + ${cardHistory.streak} * ${cardHistory.bestInterval}) / (${cardHistory.lapses} + ${cardHistory.streak}) = ${ret}`);\n\t\t}\n\t\tif (currentAttempt.fluent === false) {\n\t\t\tlogger.debug(`Correct but not fluent: capping interval ${ret}s at ${SLOW_CORRECT_MAX_INTERVAL}s`);\n\t\t\treturn Math.min(ret, SLOW_CORRECT_MAX_INTERVAL);\n\t\t}\n\t\treturn ret;\n\t} else return 0;\n}\n/**\n* Returns the amount of time, in seconds, of the most recent successful\n* interval for this card. An interval is successful if the user answers\n* a question correctly on the first attempt, and not flagged as too slow.\n*\n* @param cardHistory The record of user attempts with the question\n*/\nfunction lastSuccessfulInterval(cardHistory) {\n\tfor (let i = cardHistory.length - 1; i >= 1; i--) if (cardHistory[i].priorAttemps === 0 && cardHistory[i].isCorrect && cardHistory[i].fluent !== false) {\n\t\tconst lastInterval = secondsBetween(cardHistory[i - 1].timeStamp, cardHistory[i].timeStamp);\n\t\tconst ret = Math.max(lastInterval, 1200 * 60);\n\t\tlogger.debug(`Last interval w/ this card was: ${lastInterval}s, returning ${ret}s`);\n\t\treturn ret;\n\t}\n\treturn getInitialInterval(cardHistory);\n}\n/**\n* Number of trailing consecutive correct records (retries within a single\n* presentation count as separate records). Exported so the persisted\n* `CardHistory.streak` can be kept in step with this derivation.\n*/\nfunction getStreak(records) {\n\tlet streak = 0;\n\tlet index = records.length - 1;\n\twhile (index >= 0 && records[index].isCorrect) {\n\t\tindex--;\n\t\tstreak++;\n\t}\n\treturn streak;\n}\n/**\n* Total number of incorrect records on the card. Exported so the persisted\n* `CardHistory.lapses` can be kept in step with this derivation.\n*/\nfunction getLapses(records) {\n\treturn records.filter((r) => r.isCorrect === false).length;\n}\nfunction getInitialInterval(cardHistory) {\n\tlogger.warn(`history of length: ${cardHistory.length} ignored!`);\n\treturn 3600 * 24 * 3;\n}\n/**\n* Returns the time in seconds between two Moment objects\n* @param start The first time\n* @param end The second time\n*/\nfunction secondsBetween(start, end) {\n\tstart = moment(start);\n\tend = moment(end);\n\treturn duration(end.diff(start)).asSeconds();\n}\n//#endregion\nexport { getLapses, getStreak, newInterval };\n\n//# sourceMappingURL=SpacedRepetition.mjs.map","import \"../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"./logger.mjs\";\nimport { ENV } from \"../factory.mjs\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n//#region src/util/dataDirectory.ts\n/**\n* Get the application data directory for the current platform\n* Uses ~/.tuilder as requested by user for simplicity\n*/\nfunction getAppDataDirectory() {\n\tif (ENV.LOCAL_STORAGE_PREFIX) return path.join(os.homedir(), `.tuilder`, ENV.LOCAL_STORAGE_PREFIX);\n\telse return path.join(os.homedir(), \".tuilder\");\n}\n/**\n* Ensure the application data directory exists\n* Creates directory recursively if it doesn't exist\n*/\nasync function ensureAppDataDirectory() {\n\tconst appDataDir = getAppDataDirectory();\n\ttry {\n\t\tawait fs.promises.mkdir(appDataDir, { recursive: true });\n\t} catch (err) {\n\t\tif (err.code !== \"EEXIST\") throw new Error(`Failed to create app data directory ${appDataDir}: ${err.message}`);\n\t}\n\treturn appDataDir;\n}\n/**\n* Get the full path for a PouchDB database file\n* @param dbName - The database name (e.g., 'userdb-Colin')\n*/\nfunction getDbPath(dbName) {\n\treturn path.join(getAppDataDirectory(), dbName);\n}\n/**\n* Initialize data directory for PouchDB usage\n* Should be called once at application startup\n*/\nasync function initializeDataDirectory() {\n\tawait ensureAppDataDirectory();\n\tlogger.info(`PouchDB data directory initialized: ${getAppDataDirectory()}`);\n}\n//#endregion\nexport { ensureAppDataDirectory, getAppDataDirectory, getDbPath, initializeDataDirectory };\n\n//# sourceMappingURL=dataDirectory.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { Loggable } from \"../../util/Loggable.mjs\";\n//#region src/impl/couch/updateQueue.ts\nvar UpdateQueue = class extends Loggable {\n\t_className = \"UpdateQueue\";\n\tpendingUpdates = {};\n\tinprogressUpdates = {};\n\treadDB;\n\twriteDB;\n\t/**\n\t* Queues an update for a document and applies it with conflict resolution.\n\t*\n\t* @param id - Document ID to update\n\t* @param update - Partial object or function that transforms the document\n\t* @returns Promise resolving to the updated document\n\t*\n\t* @throws {PouchError} with status 404 if document doesn't exist\n\t*\n\t* @remarks\n\t* **Error Handling Pattern:**\n\t* - This method does NOT create documents if they don't exist\n\t* - Callers are responsible for handling 404 errors and creating documents\n\t* - This design maintains separation of concerns (UpdateQueue handles conflicts, callers handle lifecycle)\n\t*\n\t* @example\n\t* ```typescript\n\t* try {\n\t* await updateQueue.update(docId, (doc) => ({ ...doc, field: newValue }));\n\t* } catch (e) {\n\t* if ((e as PouchError).status === 404) {\n\t* // Create the document with initial values\n\t* await db.put({ _id: docId, field: newValue, ...initialFields });\n\t* }\n\t* }\n\t* ```\n\t*/\n\tupdate(id, update) {\n\t\tlogger.debug(`Update requested on doc: ${id}`);\n\t\tif (this.pendingUpdates[id]) this.pendingUpdates[id].push(update);\n\t\telse this.pendingUpdates[id] = [update];\n\t\treturn this.applyUpdates(id);\n\t}\n\tconstructor(readDB, writeDB) {\n\t\tsuper();\n\t\tthis.readDB = readDB;\n\t\tthis.writeDB = writeDB || readDB;\n\t\tlogger.debug(`UpdateQ initialized...`);\n\t\tthis.readDB.info().then((i) => {\n\t\t\tlogger.debug(`db info: ${JSON.stringify(i)}`);\n\t\t});\n\t}\n\tasync applyUpdates(id) {\n\t\tlogger.debug(`Applying updates on doc: ${id}`);\n\t\tif (this.inprogressUpdates[id]) {\n\t\t\twhile (this.inprogressUpdates[id]) await new Promise((resolve) => setTimeout(resolve, Math.random() * 50));\n\t\t\treturn this.applyUpdates(id);\n\t\t} else if (this.pendingUpdates[id] && this.pendingUpdates[id].length > 0) {\n\t\t\tthis.inprogressUpdates[id] = true;\n\t\t\tconst MAX_RETRIES = 5;\n\t\t\tfor (let i = 0; i < MAX_RETRIES; i++) try {\n\t\t\t\tlet updatedDoc = { ...await this.readDB.get(id) };\n\t\t\t\tconst updatesToApply = [...this.pendingUpdates[id]];\n\t\t\t\tfor (const update of updatesToApply) if (typeof update === \"function\") updatedDoc = {\n\t\t\t\t\t...updatedDoc,\n\t\t\t\t\t...update(updatedDoc)\n\t\t\t\t};\n\t\t\t\telse updatedDoc = {\n\t\t\t\t\t...updatedDoc,\n\t\t\t\t\t...update\n\t\t\t\t};\n\t\t\t\tawait this.writeDB.put(updatedDoc);\n\t\t\t\tthis.pendingUpdates[id].splice(0, updatesToApply.length);\n\t\t\t\tif (this.pendingUpdates[id].length === 0) {\n\t\t\t\t\tthis.inprogressUpdates[id] = false;\n\t\t\t\t\tdelete this.inprogressUpdates[id];\n\t\t\t\t} else return this.applyUpdates(id);\n\t\t\t\treturn updatedDoc;\n\t\t\t} catch (e) {\n\t\t\t\tif (e.name === \"conflict\" && i < MAX_RETRIES - 1) {\n\t\t\t\t\tlogger.warn(`Conflict on update for doc ${id}, retry #${i + 1}`);\n\t\t\t\t\tawait new Promise((res) => setTimeout(res, 50 * Math.random()));\n\t\t\t\t} else if (e.name === \"not_found\" && i === 0) {\n\t\t\t\t\tlogger.warn(`Update failed for ${id} - does not exist. Throwing to caller.`);\n\t\t\t\t\tdelete this.inprogressUpdates[id];\n\t\t\t\t\tthrow e;\n\t\t\t\t} else {\n\t\t\t\t\tdelete this.inprogressUpdates[id];\n\t\t\t\t\tif (this.pendingUpdates[id]) delete this.pendingUpdates[id];\n\t\t\t\t\tlogger.error(`Error on attemped update (retry ${i}): ${JSON.stringify(e)}`);\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new Error(`UpdateQueue failed for doc ${id} after ${MAX_RETRIES} retries.`);\n\t\t} else throw new Error(`Empty Updates Queue Triggered`);\n\t}\n};\n//#endregion\nexport { UpdateQueue as default };\n\n//# sourceMappingURL=updateQueue.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\n//#region src/impl/couch/clientCache.ts\nconst CLIENT_CACHE = {};\nasync function GET_CACHED(k, f) {\n\tif (CLIENT_CACHE[k]) return CLIENT_CACHE[k];\n\tCLIENT_CACHE[k] = f ? await f(k) : await GET_ITEM(k);\n\treturn GET_CACHED(k);\n}\nasync function GET_ITEM(k) {\n\tthrow new Error(`No implementation found for GET_CACHED(${k})`);\n}\n//#endregion\nexport { GET_CACHED };\n\n//# sourceMappingURL=clientCache.mjs.map","import \"../../../_virtual/_rolldown/runtime.mjs\";\nimport { DEFAULT_LEARNABLE_WEIGHT } from \"../../types/contentNavigationStrategy.mjs\";\n//#region src/core/navigators/filters/WeightedFilter.ts\n/**\n* Wraps a CardFilter to apply evolutionary weighting to its effects.\n*\n* If a filter applies a multiplier M (score * M), and the strategy has\n* an effective weight W, the final multiplier becomes M^W.\n*\n* - W=1.0: Original behavior\n* - W>1.0: Amplifies the filter's opinion (stronger boost/penalty)\n* - W<1.0: Dampens the filter's opinion (weaker boost/penalty)\n* - W=0.0: Nullifies the filter (identity)\n*\n* This wrapper handles the math of scaling the filter's impact and updating\n* the provenance trail with the effective weight used.\n*/\nvar WeightedFilter = class {\n\tname;\n\tkind;\n\tliveOnly;\n\tinner;\n\tlearnable;\n\tstaticWeight;\n\tstrategyId;\n\tconstructor(inner, learnable = DEFAULT_LEARNABLE_WEIGHT, staticWeight = false, strategyId) {\n\t\tthis.inner = inner;\n\t\tthis.name = inner.name;\n\t\tthis.kind = inner.kind;\n\t\tthis.liveOnly = inner.liveOnly;\n\t\tthis.learnable = learnable;\n\t\tthis.staticWeight = staticWeight;\n\t\tthis.strategyId = strategyId;\n\t}\n\t/**\n\t* Apply the inner filter, then scale its effect by the configured weight.\n\t*/\n\tasync transform(cards, context) {\n\t\tlet effectiveWeight = this.learnable.weight;\n\t\tlet deviation;\n\t\tif (!this.staticWeight && context.orchestration) {\n\t\t\tconst strategyId = this.strategyId || this.inner.strategyId || this.name;\n\t\t\teffectiveWeight = context.orchestration.getEffectiveWeight(strategyId, this.learnable);\n\t\t\tdeviation = context.orchestration.getDeviation(strategyId);\n\t\t}\n\t\tif (Math.abs(effectiveWeight - 1) < .001) return this.inner.transform(cards, context);\n\t\tconst originalScores = /* @__PURE__ */ new Map();\n\t\tfor (const card of cards) originalScores.set(card.cardId, card.score);\n\t\treturn (await this.inner.transform(cards, context)).map((card) => {\n\t\t\tconst originalScore = originalScores.get(card.cardId);\n\t\t\tif (originalScore === void 0 || originalScore === 0 || card.score === 0) return card;\n\t\t\tconst rawEffect = card.score / originalScore;\n\t\t\tif (Math.abs(rawEffect - 1) < 1e-4) return card;\n\t\t\tconst newScore = originalScore * Math.pow(rawEffect, effectiveWeight);\n\t\t\tconst lastProvIndex = card.provenance.length - 1;\n\t\t\tconst lastProv = card.provenance[lastProvIndex];\n\t\t\tif (lastProv) {\n\t\t\t\tconst updatedProvenance = [...card.provenance];\n\t\t\t\tupdatedProvenance[lastProvIndex] = {\n\t\t\t\t\t...lastProv,\n\t\t\t\t\tscore: newScore,\n\t\t\t\t\teffectiveWeight,\n\t\t\t\t\tdeviation\n\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\t...card,\n\t\t\t\t\tscore: newScore,\n\t\t\t\t\tprovenance: updatedProvenance\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...card,\n\t\t\t\tscore: newScore\n\t\t\t};\n\t\t});\n\t}\n};\n//#endregion\nexport { WeightedFilter };\n\n//# sourceMappingURL=WeightedFilter.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ContentNavigator } from \"./index.mjs\";\nimport { strategyHash } from \"../versionStamps.mjs\";\nimport { WeightedFilter } from \"./filters/WeightedFilter.mjs\";\nimport { Pipeline } from \"./Pipeline.mjs\";\nimport CompositeGenerator from \"./generators/CompositeGenerator.mjs\";\nimport { planPipeline } from \"./pipelinePlan.mjs\";\n//#region src/core/navigators/PipelineAssembler.ts\n/**\n* Assembles navigation strategies into a Pipeline.\n*\n* Instantiates generators and filters from strategy documents and\n* composes them into a ready-to-use Pipeline instance.\n*/\nvar PipelineAssembler = class {\n\t/**\n\t* Assembles a navigation pipeline from strategy documents.\n\t*\n\t* 1. Plans: classifies by role, adds default ELO/SRS and ELO distance, orders filters\n\t* (`planPipeline`)\n\t* 2. Instantiates generators - wraps multiple in CompositeGenerator\n\t* 3. Instantiates filters\n\t* 4. Returns Pipeline(generator, filters)\n\t*\n\t* @param input - Strategy documents plus user/course interfaces\n\t* @returns Assembled pipeline and any warnings\n\t*/\n\tasync assemble(input) {\n\t\tconst { strategies, user, course } = input;\n\t\tconst warnings = [];\n\t\tif (strategies.length === 0) return {\n\t\t\tpipeline: null,\n\t\t\tgeneratorStrategies: [],\n\t\t\tfilterStrategies: [],\n\t\t\twarnings\n\t\t};\n\t\tconst plan = planPipeline(strategies, course.getCourseID());\n\t\twarnings.push(...plan.warnings);\n\t\tfor (const n of [...plan.generators, ...plan.filters]) if (n.origin === \"assembler-default\") logger.debug(`[PipelineAssembler] No ${n.implementingClass} ${n.role} configured, adding default`);\n\t\tconst generatorStrategies = plan.generators.map((g) => g.strategy);\n\t\tconst sortedFilterStrategies = plan.filters.map((f) => f.strategy);\n\t\tif (generatorStrategies.length === 0) {\n\t\t\twarnings.push(\"No generator strategy found\");\n\t\t\treturn {\n\t\t\t\tpipeline: null,\n\t\t\t\tgeneratorStrategies: [],\n\t\t\t\tfilterStrategies: [],\n\t\t\t\twarnings\n\t\t\t};\n\t\t}\n\t\tlet generator;\n\t\tif (generatorStrategies.length === 1) {\n\t\t\tgenerator = await ContentNavigator.create(user, course, generatorStrategies[0]);\n\t\t\tlogger.debug(`[PipelineAssembler] Using single generator: ${generatorStrategies[0].name}`);\n\t\t} else {\n\t\t\tlogger.debug(`[PipelineAssembler] Using CompositeGenerator for ${generatorStrategies.length} generators: ${generatorStrategies.map((g) => g.name).join(\", \")}`);\n\t\t\tgenerator = await CompositeGenerator.fromStrategies(user, course, generatorStrategies);\n\t\t}\n\t\tconst filters = [];\n\t\tfor (const filterStrategy of sortedFilterStrategies) try {\n\t\t\tconst nav = await ContentNavigator.create(user, course, filterStrategy);\n\t\t\tif (\"transform\" in nav && typeof nav.transform === \"function\") {\n\t\t\t\tlet filter = nav;\n\t\t\t\tif (filterStrategy.learnable) filter = new WeightedFilter(filter, filterStrategy.learnable, filterStrategy.staticWeight, filterStrategy._id);\n\t\t\t\tfilters.push(filter);\n\t\t\t\tlogger.debug(`[PipelineAssembler] Added filter: ${filterStrategy.name}`);\n\t\t\t} else warnings.push(`Filter '${filterStrategy.name}' does not implement CardFilter.transform(), skipping`);\n\t\t} catch (e) {\n\t\t\twarnings.push(`Failed to instantiate filter '${filterStrategy.name}': ${e}`);\n\t\t}\n\t\tconst pipeline = new Pipeline(generator, filters, user, course);\n\t\tpipeline.strategyHash = strategyHash(strategies);\n\t\tlogger.debug(`[PipelineAssembler] Assembled pipeline with ${generatorStrategies.length} generator(s) and ${filters.length} filter(s)`);\n\t\treturn {\n\t\t\tpipeline,\n\t\t\tgeneratorStrategies,\n\t\t\tfilterStrategies: sortedFilterStrategies,\n\t\t\twarnings\n\t\t};\n\t}\n};\n//#endregion\nexport { PipelineAssembler };\n\n//# sourceMappingURL=PipelineAssembler.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport pouchdb_setup_default from \"../couch/pouchdb-setup.mjs\";\nimport { makeScheduledCardId } from \"./userDBKeys.mjs\";\nimport { getDbPath } from \"../../util/dataDirectory.mjs\";\nimport moment from \"moment\";\n//#region src/impl/common/userDBHelpers.ts\nconst log = (s) => {\n\tlogger.info(s);\n};\n/**\n* Get local user database with appropriate adapter for environment\n*/\nfunction getLocalUserDB(username) {\n\tconst dbName = `userdb-${username}`;\n\tif (typeof window === \"undefined\") return new pouchdb_setup_default(getDbPath(dbName), {});\n\telse return new pouchdb_setup_default(dbName, {});\n}\n/**\n* Schedule a card review (strategy-agnostic version)\n*/\nfunction scheduleCardReviewLocal(userDB, review) {\n\tconst now = moment.utc();\n\tlogger.info(`Scheduling for review in: ${review.time.diff(now, \"h\") / 24} days`);\n\tuserDB.put({\n\t\t_id: makeScheduledCardId(review.time),\n\t\tcardId: review.card_id,\n\t\treviewTime: review.time.toISOString(),\n\t\tcourseId: review.course_id,\n\t\tscheduledAt: now.toISOString(),\n\t\tscheduledFor: review.scheduledFor,\n\t\tschedulingAgentId: review.schedulingAgentId\n\t});\n}\n/**\n* Remove a scheduled card review (strategy-agnostic version)\n*/\nasync function removeScheduledCardReviewLocal(userDB, reviewDocID) {\n\tconst reviewDoc = await userDB.get(reviewDocID);\n\tuserDB.remove(reviewDoc).then((res) => {\n\t\tif (res.ok) log(`Removed Review Doc: ${reviewDocID}`);\n\t}).catch((err) => {\n\t\tlog(`Failed to remove Review Doc: ${reviewDocID},\\n${JSON.stringify(err)}`);\n\t});\n}\n//#endregion\nexport { getLocalUserDB, removeScheduledCardReviewLocal, scheduleCardReviewLocal };\n\n//# sourceMappingURL=userDBHelpers.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport moment from \"moment\";\n//#region src/impl/couch/user-course-relDB.ts\nvar UsrCrsData = class {\n\tuser;\n\t_courseId;\n\tconstructor(user, courseId) {\n\t\tthis.user = user;\n\t\tthis._courseId = courseId;\n\t}\n\tasync getReviewsForcast(daysCount) {\n\t\tconst time = moment.utc().add(daysCount, \"days\");\n\t\treturn this.getReviewstoDate(time);\n\t}\n\tasync getPendingReviews() {\n\t\tconst now = moment.utc();\n\t\treturn this.getReviewstoDate(now);\n\t}\n\tasync getScheduledReviewCount() {\n\t\treturn (await this.getPendingReviews()).length;\n\t}\n\tasync getCourseSettings() {\n\t\tconst crsDoc = (await this.user.getCourseRegistrationsDoc()).courses.find((c) => c.courseID === this._courseId);\n\t\tif (crsDoc && crsDoc.settings) return crsDoc.settings;\n\t\telse {\n\t\t\tlogger.warn(`no settings found during lookup on course ${this._courseId}`);\n\t\t\treturn {};\n\t\t}\n\t}\n\tupdateCourseSettings(updates) {\n\t\tif (\"updateCourseSettings\" in this.user) this.user.updateCourseSettings(this._courseId, updates);\n\t}\n\tasync getStrategyState(strategyKey) {\n\t\treturn this.user.getStrategyState(this._courseId, strategyKey);\n\t}\n\tasync putStrategyState(strategyKey, data) {\n\t\treturn this.user.putStrategyState(this._courseId, strategyKey, data);\n\t}\n\tasync deleteStrategyState(strategyKey) {\n\t\treturn this.user.deleteStrategyState(this._courseId, strategyKey);\n\t}\n\tasync getReviewstoDate(targetDate) {\n\t\tconst allReviews = await this.user.getPendingReviews(this._courseId);\n\t\tlogger.debug(`Fetching ${this.user.getUsername()}'s scheduled reviews for course ${this._courseId}.`);\n\t\treturn allReviews.filter((review) => {\n\t\t\tconst reviewTime = moment.utc(review.reviewTime);\n\t\t\treturn targetDate.isAfter(reviewTime);\n\t\t});\n\t}\n};\n//#endregion\nexport { UsrCrsData };\n\n//# sourceMappingURL=user-course-relDB.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\n//#region src/core/types/strategyState.ts\n/**\n* Build the document ID for a strategy state document.\n*\n* @param courseId - The course ID\n* @param strategyKey - The strategy key (typically class name)\n* @returns The document ID in format `STRATEGY_STATE::{courseId}::{strategyKey}`\n*/\nfunction buildStrategyStateId(courseId, strategyKey) {\n\treturn `STRATEGY_STATE::${courseId}::${strategyKey}`;\n}\n//#endregion\nexport { buildStrategyStateId };\n\n//# sourceMappingURL=strategyState.mjs.map","//#region src/core/types/hydration.ts\n/**\n* ID of the per-device marker recording that a full pull once completed.\n*\n* `_local/*` documents are deliberately excluded from replication by CouchDB\n* and PouchDB alike, which is exactly the semantics wanted here: the marker\n* describes THIS device's mirror, and must never travel to another one.\n*/\nconst HYDRATION_MARKER_ID = \"_local/hydration\";\n//#endregion\nexport { HYDRATION_MARKER_ID };\n\n//# sourceMappingURL=hydration.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { DocType, DocTypePrefixes, GuestUsername } from \"../../core/types/types-legacy.mjs\";\nimport { REVIEW_TIME_FORMAT, filterAllDocsByPrefix, getStartAndEndKeys } from \"./userDBKeys.mjs\";\nimport UpdateQueue from \"../couch/updateQueue.mjs\";\nimport { areQuestionRecords, getCardHistoryID } from \"../../core/util/index.mjs\";\nimport { getLapses, getStreak } from \"../../study/SpacedRepetition.mjs\";\nimport { getLocalUserDB, removeScheduledCardReviewLocal, scheduleCardReviewLocal } from \"./userDBHelpers.mjs\";\nimport { UsrCrsData } from \"../couch/user-course-relDB.mjs\";\nimport { getCredentialledCourseConfig } from \"../couch/courseAPI.mjs\";\nimport { buildStrategyStateId } from \"../../core/types/strategyState.mjs\";\nimport { HYDRATION_MARKER_ID } from \"../../core/types/hydration.mjs\";\nimport moment from \"moment\";\nimport { Status } from \"@vue-skuilder/common\";\n//#region src/impl/common/BaseUserDB.ts\nconst log = (s) => {\n\tlogger.info(s);\n};\n/**\n* Ceiling on the initial pull of a user's data before we give up and report\n* `failed`. Generous relative to the expected payload (a user database is a\n* config doc, registrations, strategy state, and per-card history), so hitting\n* it indicates a genuinely unusable connection rather than a large account.\n*/\nconst HYDRATION_TIMEOUT_MS = 15e3;\n/**\n* Reject if `p` has not settled within `ms`.\n*\n* Note the underlying work is not cancelled by this — callers that need the\n* operation stopped must do so themselves.\n*/\nfunction withTimeout(p, ms, label) {\n\tlet timer;\n\treturn Promise.race([p, new Promise((_resolve, reject) => {\n\t\ttimer = setTimeout(() => reject(/* @__PURE__ */ new Error(`${label} timed out after ${ms}ms`)), ms);\n\t})]).finally(() => {\n\t\tif (timer !== void 0) clearTimeout(timer);\n\t});\n}\n/**\n* Base user database implementation that uses a pluggable sync strategy.\n* Handles local storage operations and delegates sync/remote operations to the strategy.\n*/\nvar BaseUser = class BaseUser {\n\tstatic _instance;\n\tstatic _initialized = false;\n\tstatic Dummy(syncStrategy) {\n\t\treturn new BaseUser(\"Me\", syncStrategy);\n\t}\n\tstatic DOC_IDS = {\n\t\tCONFIG: \"CONFIG\",\n\t\tCOURSE_REGISTRATIONS: \"CourseRegistrations\",\n\t\tCLASSROOM_REGISTRATIONS: \"ClassroomRegistrations\"\n\t};\n\t_username;\n\tsyncStrategy;\n\tgetUsername() {\n\t\treturn this._username;\n\t}\n\tisLoggedIn() {\n\t\treturn !this._username.startsWith(GuestUsername);\n\t}\n\tremote() {\n\t\treturn this.remoteDB;\n\t}\n\tlocalDB;\n\tremoteDB;\n\twriteDB;\n\tupdateQueue;\n\t_hydration = { state: \"not-required\" };\n\t/** In-flight hydration, so concurrent callers can wait for a real answer. */\n\t_hydrationPromise = null;\n\t/**\n\t* Sequence the local mirror was filled to by a hydration that succeeded in\n\t* THIS init(), handed to startSync() so the live pull can skip history it\n\t* would otherwise re-walk. Undefined whenever there is no such guarantee —\n\t* hydration skipped, not required, or failed. Never persisted; see the\n\t* `since` note in CouchDBSyncStrategy.startSync().\n\t*/\n\t_hydratedSeq;\n\t/**\n\t* How far the local mirror can be trusted, RIGHT NOW. See\n\t* {@link UserHydrationStatus}.\n\t*\n\t* This is a snapshot, and during login it can legitimately read\n\t* `hydrating` — prefer awaitHydration() anywhere a decision hangs on the\n\t* answer.\n\t*/\n\thydrationStatus() {\n\t\treturn { ...this._hydration };\n\t}\n\t/**\n\t* The hydration status once it has settled — never `hydrating`.\n\t*\n\t* Resolves immediately unless a pull is in flight. Exists for callers that\n\t* must decide something (a route guard, a first-run branch) and would\n\t* otherwise sample `hydrating` and guess. Since init() is awaited by both\n\t* app startup and login(), that only happens when something navigates\n\t* concurrently with a login still in progress — a window that stretches to\n\t* HYDRATION_TIMEOUT_MS on a slow connection.\n\t*/\n\tasync awaitHydration() {\n\t\ttry {\n\t\t\tawait this._hydrationPromise;\n\t\t} catch {}\n\t\treturn this.hydrationStatus();\n\t}\n\t/**\n\t* Whether a missing document may be treated as genuinely absent, allowing\n\t* callers to create it with defaults.\n\t*\n\t* False only when hydration failed or is still running: a 404 then may just\n\t* mean \"not pulled down yet\", and materializing a default would both lie to\n\t* the user and, once live sync starts, push a rev-1 document that loses to\n\t* the real one — silently discarding it.\n\t*/\n\tcanMaterializeDefaults() {\n\t\treturn this._hydration.state !== \"failed\" && this._hydration.state !== \"hydrating\";\n\t}\n\tasync createAccount(username, password) {\n\t\tif (!this.syncStrategy.canCreateAccount()) throw new Error(\"Account creation not supported by current sync strategy\");\n\t\tif (!this._username.startsWith(\"sk-guest-\")) throw new Error(`Cannot create a new account while logged in:\nCurrently logged-in as ${this._username}.`);\n\t\tconst result = await this.syncStrategy.createAccount(username, password);\n\t\tif (result.status === Status.ok) {\n\t\t\tlog(`Account created successfully, updating username to ${username}`);\n\t\t\tthis._username = username;\n\t\t\ttry {\n\t\t\t\tlocalStorage.removeItem(\"sk-guest-uuid\");\n\t\t\t} catch (e) {\n\t\t\t\tlogger.warn(\"localStorage not available (Node.js environment):\", e);\n\t\t\t}\n\t\t\tawait this.init();\n\t\t}\n\t\treturn {\n\t\t\tstatus: result.status,\n\t\t\terror: result.error || \"\"\n\t\t};\n\t}\n\tasync login(username, password) {\n\t\tif (!this.syncStrategy.canAuthenticate()) throw new Error(\"Authentication not supported by current sync strategy\");\n\t\tif (!this._username.startsWith(\"sk-guest-\") && this._username != username) {\n\t\t\tif (this._username != username) throw new Error(`Cannot change accounts while logged in.\n Log out of account ${this.getUsername()} before logging in as ${username}.`);\n\t\t\tlogger.warn(`User ${this._username} is already logged in, but executing login again.`);\n\t\t}\n\t\tconst loginResult = await this.syncStrategy.authenticate(username, password);\n\t\tif (loginResult.ok) {\n\t\t\tlog(`Logged in as ${username}`);\n\t\t\tthis._username = username;\n\t\t\ttry {\n\t\t\t\tlocalStorage.removeItem(\"sk-guest-uuid\");\n\t\t\t} catch (e) {\n\t\t\t\tlogger.warn(\"localStorage not available (Node.js environment):\", e);\n\t\t\t}\n\t\t\tawait this.init();\n\t\t}\n\t\treturn loginResult;\n\t}\n\t/**\n\t* Adopt a remote session that was established outside this client — e.g. a\n\t* backend verified a third-party sign-in (Google) and set the session cookie\n\t* on its response. Afterwards the user is logged in exactly as after\n\t* login(): username switched, guest pointer cleared, init() re-run.\n\t*\n\t* @param opts.migrateGuestData Carry the current guest account's local data\n\t* into the adopted account. Pass true for a freshly created account (as\n\t* createAccount() does), false for an existing one (as login() does).\n\t*/\n\tasync adoptSession(opts) {\n\t\tif (!this.syncStrategy.canAuthenticate() || !this.syncStrategy.adoptSession) throw new Error(\"Session adoption not supported by current sync strategy\");\n\t\tconst guestUsername = this._username.startsWith(\"sk-guest-\") ? this._username : void 0;\n\t\tif (!guestUsername) throw new Error(`Cannot adopt a session while logged in.\n Log out of account ${this.getUsername()} first.`);\n\t\tconst result = await this.syncStrategy.adoptSession(opts.migrateGuestData ? guestUsername : void 0);\n\t\tif (result.ok && result.username) {\n\t\t\tlog(`Adopted session for ${result.username}`);\n\t\t\tthis._username = result.username;\n\t\t\ttry {\n\t\t\t\tlocalStorage.removeItem(\"sk-guest-uuid\");\n\t\t\t} catch (e) {\n\t\t\t\tlogger.warn(\"localStorage not available (Node.js environment):\", e);\n\t\t\t}\n\t\t\tawait this.init();\n\t\t}\n\t\treturn result;\n\t}\n\tasync resetUserData() {\n\t\tif (this.syncStrategy.canAuthenticate()) return {\n\t\t\tstatus: Status.error,\n\t\t\terror: \"Reset user data is only available for local-only mode. Use logout instead for remote sync.\"\n\t\t};\n\t\ttry {\n\t\t\tconst localDB = getLocalUserDB(this._username);\n\t\t\tconst docsToDelete = (await localDB.allDocs({ include_docs: false })).rows.filter((row) => {\n\t\t\t\tconst id = row.id;\n\t\t\t\treturn id.startsWith(DocTypePrefixes[DocType.CARDRECORD]) || id.startsWith(DocTypePrefixes[DocType.SCHEDULED_CARD]) || id.startsWith(DocTypePrefixes[DocType.STRATEGY_STATE]) || id.startsWith(DocTypePrefixes[DocType.USER_OUTCOME]) || id.startsWith(DocTypePrefixes[DocType.STRATEGY_LEARNING_STATE]) || id === BaseUser.DOC_IDS.COURSE_REGISTRATIONS || id === BaseUser.DOC_IDS.CLASSROOM_REGISTRATIONS || id === BaseUser.DOC_IDS.CONFIG;\n\t\t\t}).map((row) => ({\n\t\t\t\t_id: row.id,\n\t\t\t\t_rev: row.value.rev,\n\t\t\t\t_deleted: true\n\t\t\t}));\n\t\t\tif (docsToDelete.length > 0) await localDB.bulkDocs(docsToDelete);\n\t\t\tawait this.init();\n\t\t\treturn { status: Status.ok };\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to reset user data:\", error);\n\t\t\treturn {\n\t\t\t\tstatus: Status.error,\n\t\t\t\terror: error instanceof Error ? error.message : \"Unknown error during reset\"\n\t\t\t};\n\t\t}\n\t}\n\tasync logout() {\n\t\tif (!this.syncStrategy.canAuthenticate()) {\n\t\t\tthis._username = await this.syncStrategy.getCurrentUsername();\n\t\t\tawait this.init();\n\t\t\treturn { ok: true };\n\t\t}\n\t\tconst ret = await this.syncStrategy.logout();\n\t\ttry {\n\t\t\tlocalStorage.removeItem(\"sk-guest-uuid\");\n\t\t} catch (e) {\n\t\t\tlogger.warn(\"localStorage not available (Node.js environment):\", e);\n\t\t}\n\t\tthis._username = await this.syncStrategy.getCurrentUsername();\n\t\tawait this.init();\n\t\treturn ret;\n\t}\n\tasync get(id) {\n\t\treturn this.localDB.get(id);\n\t}\n\tupdate(id, update) {\n\t\treturn this.updateQueue.update(id, update);\n\t}\n\tasync getCourseRegistrationsDoc() {\n\t\tlogger.debug(`Fetching courseRegistrations for ${this.getUsername()}`);\n\t\tlet ret;\n\t\ttry {\n\t\t\treturn await this.localDB.get(BaseUser.DOC_IDS.COURSE_REGISTRATIONS);\n\t\t} catch (e) {\n\t\t\tif (e.status === 404) {\n\t\t\t\tif (!this.canMaterializeDefaults()) throw new Error(`Cannot read course registrations for ${this._username}: the local mirror is unavailable (hydration state '${this._hydration.state}'). Refusing to create an empty registration doc — that would report an existing user as unregistered, and then lose to their real document once sync resumes.`);\n\t\t\t\tawait this.localDB.put({\n\t\t\t\t\t_id: BaseUser.DOC_IDS.COURSE_REGISTRATIONS,\n\t\t\t\t\tcourses: [],\n\t\t\t\t\tstudyWeight: {}\n\t\t\t\t});\n\t\t\t\tret = await this.getCourseRegistrationsDoc();\n\t\t\t} else throw new Error(`Unexpected error ${JSON.stringify(e)} in getOrCreateCourseRegistrationDoc...`);\n\t\t}\n\t\treturn ret;\n\t}\n\tasync getActiveCourses() {\n\t\treturn (await this.getCourseRegistrationsDoc()).courses.filter((c) => {\n\t\t\treturn c.status === void 0 || c.status === \"active\";\n\t\t});\n\t}\n\t/**\n\t* Returns a promise of the card IDs that the user has\n\t* a scheduled review for.\n\t*\n\t*/\n\tasync getActiveCards() {\n\t\tconst keys = getStartAndEndKeys(DocTypePrefixes[DocType.SCHEDULED_CARD]);\n\t\treturn (await this.remoteDB.allDocs({\n\t\t\tstartkey: keys.startkey,\n\t\t\tendkey: keys.endkey,\n\t\t\tinclude_docs: true\n\t\t})).rows.map((r) => {\n\t\t\treturn {\n\t\t\t\tcourseID: r.doc.courseId,\n\t\t\t\tcardID: r.doc.cardId\n\t\t\t};\n\t\t});\n\t}\n\tasync getActivityRecords() {\n\t\ttry {\n\t\t\tconst hist = await this.getHistory();\n\t\t\tconst allRecords = [];\n\t\t\tif (!Array.isArray(hist)) {\n\t\t\t\tlogger.error(\"getHistory did not return an array:\", hist);\n\t\t\t\treturn allRecords;\n\t\t\t}\n\t\t\tlet sampleCount = 0;\n\t\t\tfor (let i = 0; i < hist.length; i++) try {\n\t\t\t\tif (hist[i] && Array.isArray(hist[i].records)) hist[i].records.forEach((record) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!record.timeStamp) return;\n\t\t\t\t\t\tlet timeStamp;\n\t\t\t\t\t\tif (typeof record.timeStamp === \"object\") if (typeof record.timeStamp.toDate === \"function\") timeStamp = record.timeStamp.toISOString();\n\t\t\t\t\t\telse if (record.timeStamp instanceof Date) timeStamp = record.timeStamp.toISOString();\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (sampleCount < 3) {\n\t\t\t\t\t\t\t\tlogger.warn(\"Unknown timestamp object type:\", record.timeStamp);\n\t\t\t\t\t\t\t\tsampleCount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (typeof record.timeStamp === \"string\") {\n\t\t\t\t\t\t\tconst date = new Date(record.timeStamp);\n\t\t\t\t\t\t\tif (isNaN(date.getTime())) return;\n\t\t\t\t\t\t\ttimeStamp = record.timeStamp;\n\t\t\t\t\t\t} else if (typeof record.timeStamp === \"number\") timeStamp = new Date(record.timeStamp).toISOString();\n\t\t\t\t\t\telse return;\n\t\t\t\t\t\tallRecords.push({\n\t\t\t\t\t\t\ttimeStamp,\n\t\t\t\t\t\t\tcourseID: record.courseID || \"unknown\",\n\t\t\t\t\t\t\tcardID: record.cardID || \"unknown\",\n\t\t\t\t\t\t\ttimeSpent: record.timeSpent || 0,\n\t\t\t\t\t\t\ttype: \"card_view\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (err) {}\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tlogger.error(\"Error processing history item:\", err);\n\t\t\t}\n\t\t\tlogger.debug(`Found ${allRecords.length} activity records`);\n\t\t\treturn allRecords;\n\t\t} catch (err) {\n\t\t\tlogger.error(\"Error in getActivityRecords:\", err);\n\t\t\treturn [];\n\t\t}\n\t}\n\tasync getReviewstoDate(targetDate, course_id) {\n\t\tconst keys = getStartAndEndKeys(DocTypePrefixes[DocType.SCHEDULED_CARD]);\n\t\tconst reviews = await this.remoteDB.allDocs({\n\t\t\tstartkey: keys.startkey,\n\t\t\tendkey: keys.endkey,\n\t\t\tinclude_docs: true\n\t\t});\n\t\tlog(`Fetching ${this._username}'s scheduled reviews${course_id ? ` for course ${course_id}` : \"\"}.`);\n\t\treturn reviews.rows.filter((r) => {\n\t\t\tif (r.id.startsWith(DocTypePrefixes[DocType.SCHEDULED_CARD])) {\n\t\t\t\tconst date = moment.utc(r.id.substr(DocTypePrefixes[DocType.SCHEDULED_CARD].length), REVIEW_TIME_FORMAT);\n\t\t\t\tif (targetDate.isAfter(date)) {\n\t\t\t\t\tif (course_id === void 0 || r.doc.courseId === course_id) return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}).map((r) => r.doc);\n\t}\n\tasync getReviewsForcast(daysCount, course_id) {\n\t\tconst time = moment.utc().add(daysCount, \"days\");\n\t\treturn this.getReviewstoDate(time, course_id);\n\t}\n\tasync getPendingReviews(course_id) {\n\t\tconst now = moment.utc();\n\t\treturn this.getReviewstoDate(now, course_id);\n\t}\n\tasync getScheduledReviewCount(course_id) {\n\t\treturn (await this.getPendingReviews(course_id)).length;\n\t}\n\tasync getRegisteredCourses() {\n\t\treturn (await this.getCourseRegistrationsDoc()).courses.filter((c) => {\n\t\t\treturn !c.status || c.status === \"active\" || c.status === \"maintenance-mode\";\n\t\t});\n\t}\n\tasync getCourseRegDoc(courseID) {\n\t\tconst ret = (await this.getCourseRegistrationsDoc()).courses.find((c) => c.courseID === courseID);\n\t\tif (ret) return ret;\n\t\telse throw new Error(`Course registration not found for course ID: ${courseID}`);\n\t}\n\tasync registerForCourse(course_id, previewMode = false) {\n\t\treturn this.getCourseRegistrationsDoc().then((doc) => {\n\t\t\tconst status = previewMode ? \"preview\" : \"active\";\n\t\t\tlogger.debug(`Registering for ${course_id} with status: ${status}`);\n\t\t\tconst regItem = {\n\t\t\t\tstatus,\n\t\t\t\tcourseID: course_id,\n\t\t\t\tuser: true,\n\t\t\t\tadmin: false,\n\t\t\t\tmoderator: false,\n\t\t\t\telo: {\n\t\t\t\t\tglobal: {\n\t\t\t\t\t\tscore: 1e3,\n\t\t\t\t\t\tcount: 0\n\t\t\t\t\t},\n\t\t\t\t\ttags: {},\n\t\t\t\t\tmisc: {}\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (doc.courses.filter((course) => {\n\t\t\t\treturn course.courseID === regItem.courseID;\n\t\t\t}).length === 0) {\n\t\t\t\tlog(`It's a new course registration!`);\n\t\t\t\tdoc.courses.push(regItem);\n\t\t\t\tdoc.studyWeight[course_id] = 1;\n\t\t\t} else doc.courses.forEach((c) => {\n\t\t\t\tlog(`Found the previously registered course!`);\n\t\t\t\tif (c.courseID === course_id) c.status = status;\n\t\t\t});\n\t\t\treturn this.localDB.put(doc);\n\t\t}).catch((e) => {\n\t\t\tlog(`Registration failed because of: ${JSON.stringify(e)}`);\n\t\t\tthrow e;\n\t\t});\n\t}\n\tasync dropCourse(course_id, dropStatus = \"dropped\") {\n\t\treturn this.getCourseRegistrationsDoc().then((doc) => {\n\t\t\tlet index = -1;\n\t\t\tfor (let i = 0; i < doc.courses.length; i++) if (doc.courses[i].courseID === course_id) index = i;\n\t\t\tif (index !== -1) {\n\t\t\t\tdelete doc.studyWeight[course_id];\n\t\t\t\tdoc.courses[index].status = dropStatus;\n\t\t\t} else throw new Error(`User ${this.getUsername()} is not currently registered for course ${course_id}`);\n\t\t\treturn this.localDB.put(doc);\n\t\t});\n\t}\n\tasync getCourseInterface(courseId) {\n\t\treturn new UsrCrsData(this, courseId);\n\t}\n\tasync getUserEditableCourses() {\n\t\tlet courseIDs = [];\n\t\tconst registeredCourses = await this.getCourseRegistrationsDoc();\n\t\tcourseIDs = courseIDs.concat(registeredCourses.courses.map((course) => {\n\t\t\treturn course.courseID;\n\t\t}));\n\t\treturn await Promise.all(courseIDs.map(async (id) => {\n\t\t\treturn await getCredentialledCourseConfig(id);\n\t\t}));\n\t}\n\tasync getConfig() {\n\t\tconst defaultConfig = {\n\t\t\t_id: BaseUser.DOC_IDS.CONFIG,\n\t\t\tdarkMode: false,\n\t\t\tlikesConfetti: false,\n\t\t\tsessionTimeLimit: 5\n\t\t};\n\t\ttry {\n\t\t\tconst cfg = await this.localDB.get(BaseUser.DOC_IDS.CONFIG);\n\t\t\tlogger.debug(\"Raw config from DB:\", cfg);\n\t\t\treturn cfg;\n\t\t} catch (e) {\n\t\t\tconst err = e;\n\t\t\tif (err.name && err.name === \"not_found\") {\n\t\t\t\tif (!this.canMaterializeDefaults()) throw new Error(`Cannot read config for ${this._username}: the local mirror is unavailable (hydration state '${this._hydration.state}'). Refusing to write a default config over what may be an existing one.`);\n\t\t\t\tawait this.localDB.put(defaultConfig);\n\t\t\t\treturn this.getConfig();\n\t\t\t} else {\n\t\t\t\tlogger.error(`Error setting user default config:`, e);\n\t\t\t\tthrow new Error(`Error returning the user's configuration: ${JSON.stringify(e)}`);\n\t\t\t}\n\t\t}\n\t}\n\tasync setConfig(items) {\n\t\tlogger.debug(`Setting Config items ${JSON.stringify(items)}`);\n\t\tconst c = await this.getConfig();\n\t\tconst put = await this.localDB.put({\n\t\t\t...c,\n\t\t\t...items\n\t\t});\n\t\tif (put.ok) logger.debug(`Config items set: ${JSON.stringify(items)}`);\n\t\telse logger.error(`Error setting config items: ${JSON.stringify(put)}`);\n\t}\n\t/**\n\t*\n\t* This function should be called *only* by the pouchdb datalayer provider\n\t* auth store.\n\t*\n\t*\n\t* Anyone else seeking the current user should use the auth store's\n\t* exported `getCurrentUser` method.\n\t*\n\t*/\n\tstatic async instance(syncStrategy, username) {\n\t\tif (username) {\n\t\t\tBaseUser._instance = new BaseUser(username, syncStrategy);\n\t\t\tawait BaseUser._instance.init();\n\t\t\treturn BaseUser._instance;\n\t\t} else if (BaseUser._instance && BaseUser._initialized) return BaseUser._instance;\n\t\telse if (BaseUser._instance) return new Promise((resolve) => {\n\t\t\t(function waitForUser() {\n\t\t\t\tif (BaseUser._initialized) return resolve(BaseUser._instance);\n\t\t\t\telse setTimeout(waitForUser, 50);\n\t\t\t})();\n\t\t});\n\t\telse {\n\t\t\tBaseUser._instance = new BaseUser(await syncStrategy.getCurrentUsername(), syncStrategy);\n\t\t\tawait BaseUser._instance.init();\n\t\t\treturn BaseUser._instance;\n\t\t}\n\t}\n\tconstructor(username, syncStrategy) {\n\t\tBaseUser._initialized = false;\n\t\tthis._username = username;\n\t\tthis.syncStrategy = syncStrategy;\n\t\tthis.setDBandQ();\n\t}\n\tsetDBandQ() {\n\t\tthis.localDB = getLocalUserDB(this._username);\n\t\tthis.remoteDB = this.syncStrategy.setupRemoteDB(this._username);\n\t\tthis.writeDB = this.syncStrategy.getWriteDB ? this.syncStrategy.getWriteDB(this._username) : this.localDB;\n\t\tthis.updateQueue = new UpdateQueue(this.localDB, this.writeDB);\n\t}\n\tasync init() {\n\t\tBaseUser._initialized = false;\n\t\tif (this._username === \"admin\") {\n\t\t\tBaseUser._initialized = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.syncStrategy.stopSync?.();\n\t\tthis.setDBandQ();\n\t\tthis._hydrationPromise = this.hydrateLocalMirror();\n\t\tawait this._hydrationPromise;\n\t\tthis.syncStrategy.startSync(this.localDB, this.remoteDB, this._hydratedSeq);\n\t\tthis.applyDesignDocs().catch((error) => {\n\t\t\tlog(`Error in applyDesignDocs background task: ${error}`);\n\t\t\tif (error && typeof error === \"object\") log(`Full error details in applyDesignDocs: ${JSON.stringify(error)}`);\n\t\t});\n\t\tthis.deduplicateReviews().catch((error) => {\n\t\t\tlog(`Error in deduplicateReviews background task: ${error}`);\n\t\t\tif (error && typeof error === \"object\") log(`Full error details in background task: ${JSON.stringify(error)}`);\n\t\t});\n\t\tBaseUser._initialized = true;\n\t}\n\t/**\n\t* Pull this account's documents into the local mirror, if that hasn't\n\t* happened on this device before.\n\t*\n\t* Runs between setDBandQ() and startSync() — after the handles exist, before\n\t* anything can observe an empty local DB or replicate one upward.\n\t*\n\t* Never throws: a failure is recorded as `failed` state and reported through\n\t* hydrationStatus(), because throwing here would abort init() and leave\n\t* BaseUser._initialized false forever (BaseUser.instance() polls it with no\n\t* ceiling). Callers decide what a failure means for them.\n\t*/\n\tasync hydrateLocalMirror() {\n\t\tthis._hydratedSeq = void 0;\n\t\tif (this.localDB.name === this.remoteDB.name || !this.syncStrategy.hydrate) {\n\t\t\tthis._hydration = { state: \"not-required\" };\n\t\t\treturn;\n\t\t}\n\t\tif (await this.hasHydrationMarker()) {\n\t\t\tthis._hydration = { state: \"stale\" };\n\t\t\treturn;\n\t\t}\n\t\tthis._hydration = { state: \"hydrating\" };\n\t\tconst start = Date.now();\n\t\ttry {\n\t\t\tconst { docsWritten, lastSeq } = await withTimeout(this.syncStrategy.hydrate(this.localDB, this.remoteDB), HYDRATION_TIMEOUT_MS, `Hydration of local mirror for ${this._username}`);\n\t\t\tthis._hydratedSeq = lastSeq;\n\t\t\tawait this.writeHydrationMarker();\n\t\t\tthis._hydration = {\n\t\t\t\tstate: \"hydrated\",\n\t\t\t\tdocsWritten,\n\t\t\t\tdurationMs: Date.now() - start\n\t\t\t};\n\t\t\tlog(`Hydrated local mirror for ${this._username}: ${docsWritten} docs in ${this._hydration.durationMs}ms`);\n\t\t} catch (e) {\n\t\t\tthis.syncStrategy.stopSync?.();\n\t\t\tthis._hydration = {\n\t\t\t\tstate: \"failed\",\n\t\t\t\tdurationMs: Date.now() - start,\n\t\t\t\terror: e instanceof Error ? e.message : String(e)\n\t\t\t};\n\t\t\tlogger.error(`Failed to hydrate local mirror for ${this._username}:`, e);\n\t\t}\n\t}\n\t/**\n\t* Has a full pull completed on this device for the CURRENT account?\n\t*\n\t* The marker is a `_local/` document, which never replicates — so its\n\t* presence describes this device's mirror and cannot arrive from elsewhere.\n\t*/\n\tasync hasHydrationMarker() {\n\t\ttry {\n\t\t\treturn (await this.localDB.get(HYDRATION_MARKER_ID)).username === this._username;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tasync writeHydrationMarker() {\n\t\ttry {\n\t\t\tlet existingRev;\n\t\t\ttry {\n\t\t\t\texistingRev = (await this.localDB.get(HYDRATION_MARKER_ID))._rev;\n\t\t\t} catch {}\n\t\t\tawait this.localDB.put({\n\t\t\t\t_id: HYDRATION_MARKER_ID,\n\t\t\t\t_rev: existingRev,\n\t\t\t\tusername: this._username,\n\t\t\t\thydratedAt: (/* @__PURE__ */ new Date()).toISOString()\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tlogger.warn(`Could not write hydration marker for ${this._username}: ${e}`);\n\t\t}\n\t}\n\tstatic designDocs = [{\n\t\t_id: \"_design/reviewCards\",\n\t\tviews: { reviewCards: { map: `function (doc) {\n if (doc._id && doc._id.indexOf('card_review') === 0 && doc.courseId && doc.cardId) {\n emit(doc._id, doc.courseId + '-' + doc.cardId);\n }\n }` } }\n\t}];\n\tasync applyDesignDocs() {\n\t\tlog(`Starting applyDesignDocs for user: ${this._username}`);\n\t\tlog(`Remote DB name: ${this.remoteDB.name || \"unknown\"}`);\n\t\tif (this._username === \"admin\") {\n\t\t\tlog(\"Skipping design docs for admin user\");\n\t\t\treturn;\n\t\t}\n\t\tlog(`Applying ${BaseUser.designDocs.length} design docs`);\n\t\tfor (const doc of BaseUser.designDocs) {\n\t\t\tlog(`Applying design doc: ${doc._id}`);\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tconst existingDoc = await this.remoteDB.get(doc._id);\n\t\t\t\t\tawait this.remoteDB.put({\n\t\t\t\t\t\t...doc,\n\t\t\t\t\t\t_rev: existingDoc._rev\n\t\t\t\t\t});\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e?.name === \"not_found\") await this.remoteDB.put(doc);\n\t\t\t\t\telse throw e;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (error.name && error.name === \"conflict\") {\n\t\t\t\t\tlogger.warn(`Design doc ${doc._id} update conflict - will retry`);\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1e3));\n\t\t\t\t\tawait this.applyDesignDoc(doc);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.error(`Failed to apply design doc ${doc._id}:`, error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tasync applyDesignDoc(doc, retries = 3) {\n\t\ttry {\n\t\t\tconst existingDoc = await this.remoteDB.get(doc._id);\n\t\t\tawait this.remoteDB.put({\n\t\t\t\t...doc,\n\t\t\t\t_rev: existingDoc._rev\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tif (e?.name === \"conflict\" && retries > 0) {\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1e3));\n\t\t\t\treturn this.applyDesignDoc(doc, retries - 1);\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\t/**\n\t* Logs a record of the user's interaction with the card and returns the card's\n\t* up-to-date history.\n\t*\n\t* **Automatic Initialization:**\n\t* If this is the user's first interaction with the card (CardHistory doesn't exist),\n\t* this method automatically creates the CardHistory document with initial values\n\t* (lapses: 0, streak: 0, bestInterval: 0).\n\t*\n\t* **Error Handling:**\n\t* - Handles 404 errors by creating initial CardHistory document\n\t* - Re-throws all other errors from UpdateQueue\n\t*\n\t* // [ ] #db-refactor extract to a smaller scope - eg, UserStudySession\n\t*\n\t* @param record - The recent recorded interaction between user and card\n\t* @returns The updated state of the card's CardHistory data\n\t* @throws Error if document creation fails or non-404 database error occurs\n\t*/\n\tasync putCardRecord(record) {\n\t\tconst cardHistoryID = getCardHistoryID(record.courseID, record.cardID);\n\t\trecord.timeStamp = moment.utc(record.timeStamp).toString();\n\t\ttry {\n\t\t\tconst cardHistory = await this.update(cardHistoryID, function(h) {\n\t\t\t\th.records.push(record);\n\t\t\t\th.bestInterval = h.bestInterval || 0;\n\t\t\t\tif (areQuestionRecords(h)) {\n\t\t\t\t\th.lapses = getLapses(h.records);\n\t\t\t\t\th.streak = getStreak(h.records);\n\t\t\t\t} else {\n\t\t\t\t\th.lapses = h.lapses || 0;\n\t\t\t\t\th.streak = h.streak || 0;\n\t\t\t\t}\n\t\t\t\treturn h;\n\t\t\t});\n\t\t\tcardHistory.records = cardHistory.records.map((record) => {\n\t\t\t\tconst ret = { ...record };\n\t\t\t\tret.timeStamp = moment.utc(record.timeStamp);\n\t\t\t\treturn ret;\n\t\t\t});\n\t\t\treturn cardHistory;\n\t\t} catch (e) {\n\t\t\tconst reason = e;\n\t\t\tif (reason.status === 404) try {\n\t\t\t\tconst initCardHistory = {\n\t\t\t\t\t_id: cardHistoryID,\n\t\t\t\t\tcardID: record.cardID,\n\t\t\t\t\tcourseID: record.courseID,\n\t\t\t\t\trecords: [record],\n\t\t\t\t\tlapses: 0,\n\t\t\t\t\tstreak: 0,\n\t\t\t\t\tbestInterval: 0\n\t\t\t\t};\n\t\t\t\tconst putResult = await this.writeDB.put(initCardHistory);\n\t\t\t\treturn {\n\t\t\t\t\t...initCardHistory,\n\t\t\t\t\t_rev: putResult.rev\n\t\t\t\t};\n\t\t\t} catch (creationError) {\n\t\t\t\tthrow new Error(`Failed to create CardHistory for ${cardHistoryID}. Reason: ${creationError}`);\n\t\t\t}\n\t\t\telse throw new Error(`putCardRecord failed because of:\n name:${reason.name}\n error: ${reason.error}\n message: ${reason.message}`);\n\t\t}\n\t}\n\tasync deduplicateReviews() {\n\t\ttry {\n\t\t\tlog(\"Starting deduplication of scheduled reviews...\");\n\t\t\tlog(`Remote DB name: ${this.remoteDB.name || \"unknown\"}`);\n\t\t\tlog(`Write DB name: ${this.writeDB.name || \"unknown\"}`);\n\t\t\t/**\n\t\t\t* Maps the qualified-id of a scheduled review card to\n\t\t\t* the docId of the same scheduled review.\n\t\t\t*\n\t\t\t* EG: {\n\t\t\t* courseId-cardId: 'card_review_2021-06--17:12:165'\n\t\t\t* }\n\t\t\t*/\n\t\t\tconst reviewsMap = {};\n\t\t\tconst duplicateDocIds = [];\n\t\t\tlog(`Attempting to query remoteDB for reviewCards/reviewCards. Database: ${this.remoteDB.name || \"unknown\"}`);\n\t\t\tconst scheduledReviews = await this.remoteDB.query(\"reviewCards/reviewCards\");\n\t\t\tlog(`Found ${scheduledReviews.rows.length} scheduled reviews to process`);\n\t\t\tscheduledReviews.rows.forEach((r) => {\n\t\t\t\tconst qualifiedCardId = r.value;\n\t\t\t\tconst docId = r.key;\n\t\t\t\tif (reviewsMap[qualifiedCardId]) {\n\t\t\t\t\tlog(`Found duplicate scheduled review for card: ${qualifiedCardId}`);\n\t\t\t\t\tlog(`Marking earlier review ${reviewsMap[qualifiedCardId]} for deletion, keeping ${docId}`);\n\t\t\t\t\tduplicateDocIds.push(reviewsMap[qualifiedCardId]);\n\t\t\t\t\treviewsMap[qualifiedCardId] = docId;\n\t\t\t\t} else reviewsMap[qualifiedCardId] = docId;\n\t\t\t});\n\t\t\tif (duplicateDocIds.length > 0) {\n\t\t\t\tlog(`Removing ${duplicateDocIds.length} duplicate reviews...`);\n\t\t\t\tconst deletePromises = duplicateDocIds.map(async (docId) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst doc = await this.remoteDB.get(docId);\n\t\t\t\t\t\tawait this.writeDB.remove(doc);\n\t\t\t\t\t\tlog(`Successfully removed duplicate review: ${docId}`);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlog(`Failed to remove duplicate review ${docId}: ${error}`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tawait Promise.all(deletePromises);\n\t\t\t\tlog(`Deduplication complete. Processed ${duplicateDocIds.length} duplicates`);\n\t\t\t} else log(\"No duplicate reviews found\");\n\t\t} catch (error) {\n\t\t\tlog(`Error during review deduplication: ${error}`);\n\t\t\tif (error && typeof error === \"object\" && \"status\" in error && error.status === 404) {\n\t\t\t\tlog(`Database not found (404) during review deduplication. Database: ${this.remoteDB.name || \"unknown\"}`);\n\t\t\t\tlog(`This might indicate the user database doesn't exist or the reviewCards view isn't available`);\n\t\t\t}\n\t\t\tif (error && typeof error === \"object\") log(`Full error details: ${JSON.stringify(error)}`);\n\t\t}\n\t}\n\t/**\n\t* Returns a promise of the card IDs that the user has\n\t* encountered in the past.\n\t*\n\t* @param course_id optional specification of individual course\n\t*/\n\tasync getSeenCards(course_id) {\n\t\tlet filterPrefix = DocTypePrefixes[DocType.CARDRECORD];\n\t\tif (course_id) filterPrefix += `-${course_id}-`;\n\t\tconst docs = await filterAllDocsByPrefix(this.localDB, filterPrefix, { include_docs: false });\n\t\tconst ret = [];\n\t\tdocs.rows.forEach((row) => {\n\t\t\tif (row.id.startsWith(filterPrefix)) ret.push(row.id.substr(filterPrefix.length));\n\t\t});\n\t\treturn ret;\n\t}\n\t/**\n\t*\n\t* @returns A promise of the cards that the user has seen in the past.\n\t*/\n\tasync getHistory() {\n\t\treturn (await filterAllDocsByPrefix(this.remoteDB, DocTypePrefixes[DocType.CARDRECORD], {\n\t\t\tinclude_docs: true,\n\t\t\tattachments: false\n\t\t})).rows.map((r) => r.doc);\n\t}\n\tasync updateCourseSettings(course_id, settings) {\n\t\tthis.getCourseRegistrationsDoc().then((doc) => {\n\t\t\tconst crs = doc.courses.find((c) => c.courseID === course_id);\n\t\t\tif (crs) {\n\t\t\t\tif (crs.settings === null || crs.settings === void 0) crs.settings = {};\n\t\t\t\tsettings.forEach((setting) => {\n\t\t\t\t\tcrs.settings[setting.key] = setting.value;\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this.localDB.put(doc);\n\t\t});\n\t}\n\tasync getCourseSettings(course_id) {\n\t\tconst crsDoc = (await this.getCourseRegistrationsDoc()).courses.find((c) => c.courseID === course_id);\n\t\tif (crsDoc) return crsDoc.settings;\n\t\telse throw new Error(`getCourseSettings Failed:\n User is not registered for course ${course_id}`);\n\t}\n\tasync getOrCreateClassroomRegistrationsDoc() {\n\t\tlet ret;\n\t\ttry {\n\t\t\tret = await this.remoteDB.get(BaseUser.DOC_IDS.CLASSROOM_REGISTRATIONS);\n\t\t} catch (e) {\n\t\t\tconst err = e;\n\t\t\tif (err.status === 404) {\n\t\t\t\tawait this.writeDB.put({\n\t\t\t\t\t_id: BaseUser.DOC_IDS.CLASSROOM_REGISTRATIONS,\n\t\t\t\t\tregistrations: []\n\t\t\t\t});\n\t\t\t\tret = await this.getOrCreateClassroomRegistrationsDoc();\n\t\t\t} else {\n\t\t\t\tconst errorDetails = {\n\t\t\t\t\tname: err.name,\n\t\t\t\t\tstatus: err.status,\n\t\t\t\t\tmessage: err.message,\n\t\t\t\t\treason: err.reason,\n\t\t\t\t\terror: err.error\n\t\t\t\t};\n\t\t\t\tlogger.error(\"Database error in getOrCreateClassroomRegistrationsDoc (private method):\", errorDetails);\n\t\t\t\tthrow new Error(`Database error accessing classroom registrations: ${err.message || err.name || \"Unknown error\"} (status: ${err.status})`);\n\t\t\t}\n\t\t}\n\t\tlogger.debug(`Returning classroom registrations doc: ${JSON.stringify(ret)}`);\n\t\treturn ret;\n\t}\n\t/**\n\t* Retrieves the list of active classroom IDs where the user is registered as a student.\n\t*\n\t* @returns Promise<string[]> - Array of classroom IDs, or empty array if classroom\n\t* registration document is unavailable due to database errors\n\t*\n\t* @description This method gracefully handles database connectivity issues by returning\n\t* an empty array when the classroom registrations document cannot be accessed.\n\t* This ensures that users can still access other application features even\n\t* when classroom functionality is temporarily unavailable.\n\t*/\n\tasync getActiveClasses() {\n\t\ttry {\n\t\t\treturn (await this.getOrCreateClassroomRegistrationsDoc()).registrations.filter((c) => c.registeredAs === \"student\").map((c) => c.classID);\n\t\t} catch (error) {\n\t\t\tlogger.warn(\"Failed to load classroom registrations, continuing without classroom data:\", error);\n\t\t\treturn [];\n\t\t}\n\t}\n\tasync scheduleCardReview(review) {\n\t\treturn scheduleCardReviewLocal(this.writeDB, review);\n\t}\n\tasync removeScheduledCardReview(reviewId) {\n\t\treturn removeScheduledCardReviewLocal(this.writeDB, reviewId);\n\t}\n\tasync registerForClassroom(_classId, _registerAs) {\n\t\treturn registerUserForClassroom(this._username, _classId, _registerAs);\n\t}\n\tasync dropFromClassroom(classId) {\n\t\treturn dropUserFromClassroom(this._username, classId);\n\t}\n\tasync getUserClassrooms() {\n\t\treturn getUserClassrooms(this._username);\n\t}\n\tasync updateUserElo(courseId, elo) {\n\t\treturn updateUserElo(this._username, courseId, elo);\n\t}\n\tasync getStrategyState(courseId, strategyKey) {\n\t\tconst docId = buildStrategyStateId(courseId, strategyKey);\n\t\ttry {\n\t\t\treturn (await this.localDB.get(docId)).data;\n\t\t} catch (e) {\n\t\t\tif (e.status === 404) {\n\t\t\t\tif (!this.canMaterializeDefaults()) throw new Error(`Cannot read strategy state '${strategyKey}' for ${this._username}: the local mirror is unavailable (hydration state '${this._hydration.state}').`);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\tasync putStrategyState(courseId, strategyKey, data) {\n\t\tconst docId = buildStrategyStateId(courseId, strategyKey);\n\t\tlet existingRev;\n\t\ttry {\n\t\t\texistingRev = (await this.localDB.get(docId))._rev;\n\t\t} catch (e) {\n\t\t\tif (e.status !== 404) throw e;\n\t\t}\n\t\tconst doc = {\n\t\t\t_id: docId,\n\t\t\t_rev: existingRev,\n\t\t\tdocType: DocType.STRATEGY_STATE,\n\t\t\tcourseId,\n\t\t\tstrategyKey,\n\t\t\tdata,\n\t\t\tupdatedAt: (/* @__PURE__ */ new Date()).toISOString()\n\t\t};\n\t\tawait this.localDB.put(doc);\n\t}\n\t/**\n\t* Open and close write the same `_id`, so the 409 path is the expected\n\t* route for the second write, not an error case.\n\t*/\n\tasync putStudySession(doc) {\n\t\ttry {\n\t\t\tawait this.localDB.put(doc);\n\t\t} catch (err) {\n\t\t\tif (err.status === 409) {\n\t\t\t\tconst existing = await this.localDB.get(doc._id);\n\t\t\t\tawait this.localDB.put({\n\t\t\t\t\t...doc,\n\t\t\t\t\t_rev: existing._rev\n\t\t\t\t});\n\t\t\t} else throw err;\n\t\t}\n\t}\n\tasync getStudySessions(courseId) {\n\t\tconst keys = getStartAndEndKeys(courseId ? `${DocTypePrefixes[DocType.STUDY_SESSION]}::${courseId}::` : `${DocTypePrefixes[DocType.STUDY_SESSION]}::`);\n\t\treturn (await this.localDB.allDocs({\n\t\t\tstartkey: keys.startkey,\n\t\t\tendkey: keys.endkey,\n\t\t\tinclude_docs: true\n\t\t})).rows.map((r) => r.doc).filter((d) => !!d).sort((a, b) => b.startTime.localeCompare(a.startTime));\n\t}\n\tasync putUserOutcome(record) {\n\t\ttry {\n\t\t\tawait this.localDB.put(record);\n\t\t} catch (err) {\n\t\t\tif (err.status === 409) {\n\t\t\t\trecord._rev = (await this.localDB.get(record._id))._rev;\n\t\t\t\tawait this.localDB.put(record);\n\t\t\t} else throw err;\n\t\t}\n\t}\n\tasync deleteStrategyState(courseId, strategyKey) {\n\t\tconst docId = buildStrategyStateId(courseId, strategyKey);\n\t\ttry {\n\t\t\tconst doc = await this.localDB.get(docId);\n\t\t\tawait this.localDB.remove(doc);\n\t\t} catch (e) {\n\t\t\tif (e.status === 404) return;\n\t\t\tthrow e;\n\t\t}\n\t}\n};\nfunction accomodateGuest() {\n\tlogger.log(\"[funnel] accomodateGuest() called\");\n\tif (typeof localStorage === \"undefined\") {\n\t\tlogger.log(\"[funnel] localStorage not available (Node.js environment), returning default guest\");\n\t\treturn {\n\t\t\tusername: GuestUsername + \"nodejs-test\",\n\t\t\tfirstVisit: true\n\t\t};\n\t}\n\tconst dbUUID = \"sk-guest-uuid\";\n\tlet firstVisit;\n\tconst existingUUID = localStorage.getItem(dbUUID);\n\tlogger.log(\"[funnel] Checking localStorage for key:\", dbUUID);\n\tlogger.log(\"[funnel] Existing UUID value:\", existingUUID);\n\tlogger.log(\"[funnel] existingUUID !== null:\", existingUUID !== null);\n\tif (existingUUID !== null) {\n\t\tfirstVisit = false;\n\t\tlogger.log(`[funnel] Returning guest ${existingUUID} \"logging in\".`);\n\t} else {\n\t\tfirstVisit = true;\n\t\tlogger.log(\"[funnel] No existing UUID, generating new one...\");\n\t\tconst uuid = generateUUID();\n\t\tlogger.log(\"[funnel] Generated UUID:\", uuid);\n\t\tlogger.log(\"[funnel] UUID length:\", uuid.length);\n\t\ttry {\n\t\t\tlocalStorage.setItem(dbUUID, uuid);\n\t\t\tlogger.log(\"[funnel] Successfully stored UUID in localStorage\");\n\t\t\tconst verification = localStorage.getItem(dbUUID);\n\t\t\tlogger.log(\"[funnel] Verification read from localStorage:\", verification);\n\t\t} catch (e) {\n\t\t\tlogger.error(\"[funnel] ERROR storing UUID:\", e);\n\t\t}\n\t\tlogger.log(`[funnel] Accommodating a new guest with account: ${uuid}`);\n\t}\n\tconst finalUUID = localStorage.getItem(dbUUID);\n\tconst finalUsername = GuestUsername + finalUUID;\n\tlogger.log(\"[funnel] Final UUID from localStorage:\", finalUUID);\n\tlogger.log(\"[funnel] GuestUsername constant:\", GuestUsername);\n\tlogger.log(\"[funnel] Final username to return:\", finalUsername);\n\treturn {\n\t\tusername: finalUsername,\n\t\tfirstVisit\n\t};\n\tfunction generateUUID() {\n\t\tlogger.log(\"[funnel] Inside generateUUID()\");\n\t\tif (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n\t\t\tconst uuid = crypto.randomUUID();\n\t\t\tlogger.log(\"[funnel] Generated UUID using crypto.randomUUID():\", uuid);\n\t\t\treturn uuid;\n\t\t}\n\t\tif (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n\t\t\tconst bytes = new Uint8Array(16);\n\t\t\tcrypto.getRandomValues(bytes);\n\t\t\tbytes[6] = bytes[6] & 15 | 64;\n\t\t\tbytes[8] = bytes[8] & 63 | 128;\n\t\t\tconst uuid = [\n\t\t\t\tArray.from(bytes.slice(0, 4)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n\t\t\t\tArray.from(bytes.slice(4, 6)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n\t\t\t\tArray.from(bytes.slice(6, 8)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n\t\t\t\tArray.from(bytes.slice(8, 10)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\"),\n\t\t\t\tArray.from(bytes.slice(10, 16)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n\t\t\t].join(\"-\");\n\t\t\tlogger.log(\"[funnel] Generated UUID using crypto.getRandomValues():\", uuid);\n\t\t\treturn uuid;\n\t\t}\n\t\tlogger.warn(\"[funnel] crypto API not available, using timestamp-based UUID (NOT SECURE)\");\n\t\tlet d = (/* @__PURE__ */ new Date()).getTime();\n\t\tif (typeof performance !== \"undefined\" && typeof performance.now === \"function\") d += performance.now();\n\t\tconst uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n\t\t\tconst r = (d + Math.random() * 16) % 16 | 0;\n\t\t\td = Math.floor(d / 16);\n\t\t\treturn (c === \"x\" ? r : r & 3 | 8).toString(16);\n\t\t});\n\t\tlogger.log(\"[funnel] Generated UUID (fallback):\", uuid);\n\t\treturn uuid;\n\t}\n}\nconst userCoursesDoc = \"CourseRegistrations\";\nconst userClassroomsDoc = \"ClassroomRegistrations\";\nasync function getOrCreateClassroomRegistrationsDoc(user) {\n\tlet ret;\n\ttry {\n\t\tret = await getLocalUserDB(user).get(userClassroomsDoc);\n\t} catch (e) {\n\t\tconst err = e;\n\t\tif (err.status === 404) {\n\t\t\tawait getLocalUserDB(user).put({\n\t\t\t\t_id: userClassroomsDoc,\n\t\t\t\tregistrations: []\n\t\t\t});\n\t\t\tret = await getOrCreateClassroomRegistrationsDoc(user);\n\t\t} else {\n\t\t\tconst errorDetails = {\n\t\t\t\tname: err.name,\n\t\t\t\tstatus: err.status,\n\t\t\t\tmessage: err.message,\n\t\t\t\treason: err.reason,\n\t\t\t\terror: err.error\n\t\t\t};\n\t\t\tlogger.error(\"Database error in getOrCreateClassroomRegistrationsDoc (standalone function):\", errorDetails);\n\t\t\tthrow new Error(`Database error accessing classroom registrations: ${err.message || err.name || \"Unknown error\"} (status: ${err.status})`);\n\t\t}\n\t}\n\treturn ret;\n}\nasync function getOrCreateCourseRegistrationsDoc(user) {\n\tlet ret;\n\ttry {\n\t\tret = await getLocalUserDB(user).get(userCoursesDoc);\n\t} catch (e) {\n\t\tif (e.status === 404) {\n\t\t\tawait getLocalUserDB(user).put({\n\t\t\t\t_id: userCoursesDoc,\n\t\t\t\tcourses: [],\n\t\t\t\tstudyWeight: {}\n\t\t\t});\n\t\t\tret = await getOrCreateCourseRegistrationsDoc(user);\n\t\t} else throw new Error(`Unexpected error ${JSON.stringify(e)} in getOrCreateCourseRegistrationDoc...`);\n\t}\n\treturn ret;\n}\nasync function updateUserElo(user, course_id, elo) {\n\tconst regDoc = await getOrCreateCourseRegistrationsDoc(user);\n\tconst course = regDoc.courses.find((c) => c.courseID === course_id);\n\tcourse.elo = elo;\n\treturn getLocalUserDB(user).put(regDoc);\n}\nasync function registerUserForClassroom(user, classID, registerAs) {\n\tlog(`Registering user: ${user} in course: ${classID}`);\n\treturn getOrCreateClassroomRegistrationsDoc(user).then((doc) => {\n\t\tconst regItem = {\n\t\t\tclassID,\n\t\t\tregisteredAs: registerAs\n\t\t};\n\t\tif (doc.registrations.filter((reg) => {\n\t\t\treturn reg.classID === regItem.classID && reg.registeredAs === regItem.registeredAs;\n\t\t}).length === 0) doc.registrations.push(regItem);\n\t\telse log(`User ${user} is already registered for class ${classID}`);\n\t\treturn getLocalUserDB(user).put(doc);\n\t});\n}\nasync function dropUserFromClassroom(user, classID) {\n\treturn getOrCreateClassroomRegistrationsDoc(user).then((doc) => {\n\t\tlet index = -1;\n\t\tfor (let i = 0; i < doc.registrations.length; i++) if (doc.registrations[i].classID === classID) index = i;\n\t\tif (index !== -1) doc.registrations.splice(index, 1);\n\t\treturn getLocalUserDB(user).put(doc);\n\t});\n}\nasync function getUserClassrooms(user) {\n\treturn getOrCreateClassroomRegistrationsDoc(user);\n}\n//#endregion\nexport { BaseUser, accomodateGuest };\n\n//# sourceMappingURL=BaseUserDB.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\nimport { CourseDB, getTag } from \"./courseDB.mjs\";\nimport { REVIEW_TIME_FORMAT, createPouchDBConfig, getStartAndEndKeys } from \"./index.mjs\";\nimport moment from \"moment\";\n//#region src/impl/couch/classroomDB.ts\nconst classroomLookupDBTitle = \"classdb-lookup\";\nconst CLASSROOM_CONFIG = \"ClassroomConfig\";\nvar ClassroomDBBase = class {\n\t_id;\n\t_db;\n\t_cfg;\n\t_initComplete = false;\n\t_content_prefix = \"content\";\n\tget _content_searchkeys() {\n\t\treturn getStartAndEndKeys(this._content_prefix);\n\t}\n\tasync getAssignedContent() {\n\t\tlogger.info(`Getting assigned content...`);\n\t\treturn (await this._db.allDocs({\n\t\t\tstartkey: this._content_prefix,\n\t\t\tendkey: this._content_prefix + `\\ufff0`,\n\t\t\tinclude_docs: true\n\t\t})).rows.map((row) => {\n\t\t\treturn row.doc;\n\t\t});\n\t}\n\tgetContentId(content) {\n\t\tif (content.type === \"tag\") return `${this._content_prefix}-${content.courseID}-${content.tagID}`;\n\t\telse return `${this._content_prefix}-${content.courseID}`;\n\t}\n\tget ready() {\n\t\treturn this._initComplete;\n\t}\n\tgetConfig() {\n\t\treturn this._cfg;\n\t}\n};\nvar StudentClassroomDB = class StudentClassroomDB extends ClassroomDBBase {\n\tuserMessages;\n\t_user;\n\tconstructor(classID, user) {\n\t\tsuper();\n\t\tthis._id = classID;\n\t\tthis._user = user;\n\t}\n\tasync init() {\n\t\tconst dbName = `classdb-student-${this._id}`;\n\t\tthis._db = new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n\t\ttry {\n\t\t\tthis._cfg = await this._db.get(CLASSROOM_CONFIG);\n\t\t\tthis.userMessages = this._db.changes({\n\t\t\t\tsince: \"now\",\n\t\t\t\tlive: true,\n\t\t\t\tinclude_docs: true\n\t\t\t});\n\t\t\tthis._initComplete = true;\n\t\t\treturn;\n\t\t} catch (e) {\n\t\t\tthrow new Error(`Error in StudentClassroomDB constructor: ${JSON.stringify(e)}`);\n\t\t}\n\t}\n\tstatic async factory(classID, user) {\n\t\tconst ret = new StudentClassroomDB(classID, user);\n\t\tawait ret.init();\n\t\treturn ret;\n\t}\n\tsetChangeFcn(f) {\n\t\tthis.userMessages.on(\"change\", f);\n\t}\n\t/**\n\t* Get cards with suitability scores for presentation.\n\t*\n\t* Gathers new cards from assigned content (courses, tags, cards) and\n\t* pending reviews scheduled for this classroom. Assigns score=1.0 to all.\n\t*\n\t* @param limit - Maximum number of cards to return\n\t* @returns Cards sorted by score descending (all scores = 1.0)\n\t*/\n\tasync getWeightedCards(limit) {\n\t\tconst weighted = [];\n\t\tconst classroomReviews = (await this._user.getPendingReviews()).filter((r) => r.scheduledFor === \"classroom\" && r.schedulingAgentId === this._id);\n\t\tfor (const r of classroomReviews) weighted.push({\n\t\t\tcardId: r.cardId,\n\t\t\tcourseId: r.courseId,\n\t\t\tscore: 1,\n\t\t\treviewID: r._id,\n\t\t\tprovenance: [{\n\t\t\t\tstrategy: \"classroom\",\n\t\t\t\tstrategyName: \"Classroom\",\n\t\t\t\tstrategyId: \"CLASSROOM\",\n\t\t\t\taction: \"generated\",\n\t\t\t\tscore: 1,\n\t\t\t\treason: \"Classroom scheduled review\"\n\t\t\t}]\n\t\t});\n\t\tconst activeCards = await this._user.getActiveCards();\n\t\tconst activeCardIds = new Set(activeCards.map((ac) => ac.cardID));\n\t\tconst now = moment.utc();\n\t\tconst due = (await this.getAssignedContent()).filter((c) => now.isAfter(moment.utc(c.activeOn, REVIEW_TIME_FORMAT)));\n\t\tlogger.info(`[StudentClassroomDB] Due content: ${JSON.stringify(due)}`);\n\t\tfor (const content of due) if (content.type === \"course\") {\n\t\t\tconst { cards: courseCards } = await new CourseDB(content.courseID, async () => this._user).getWeightedCards(limit);\n\t\t\tfor (const card of courseCards) if (!activeCardIds.has(card.cardId)) weighted.push({\n\t\t\t\t...card,\n\t\t\t\tprovenance: [...card.provenance, {\n\t\t\t\t\tstrategy: \"classroom\",\n\t\t\t\t\tstrategyName: \"Classroom\",\n\t\t\t\t\tstrategyId: \"CLASSROOM\",\n\t\t\t\t\taction: \"passed\",\n\t\t\t\t\tscore: card.score,\n\t\t\t\t\treason: `Assigned via classroom from course ${content.courseID}`\n\t\t\t\t}]\n\t\t\t});\n\t\t} else if (content.type === \"tag\") {\n\t\t\tconst tagDoc = await getTag(content.courseID, content.tagID);\n\t\t\tfor (const cardId of tagDoc.taggedCards) if (!activeCardIds.has(cardId)) weighted.push({\n\t\t\t\tcardId,\n\t\t\t\tcourseId: content.courseID,\n\t\t\t\tscore: 1,\n\t\t\t\tprovenance: [{\n\t\t\t\t\tstrategy: \"classroom\",\n\t\t\t\t\tstrategyName: \"Classroom\",\n\t\t\t\t\tstrategyId: \"CLASSROOM\",\n\t\t\t\t\taction: \"generated\",\n\t\t\t\t\tscore: 1,\n\t\t\t\t\treason: `Classroom assigned tag: ${content.tagID}, new card`\n\t\t\t\t}]\n\t\t\t});\n\t\t} else if (content.type === \"card\") {\n\t\t\tif (!activeCardIds.has(content.cardID)) weighted.push({\n\t\t\t\tcardId: content.cardID,\n\t\t\t\tcourseId: content.courseID,\n\t\t\t\tscore: 1,\n\t\t\t\tprovenance: [{\n\t\t\t\t\tstrategy: \"classroom\",\n\t\t\t\t\tstrategyName: \"Classroom\",\n\t\t\t\t\tstrategyId: \"CLASSROOM\",\n\t\t\t\t\taction: \"generated\",\n\t\t\t\t\tscore: 1,\n\t\t\t\t\treason: \"Classroom assigned card, new card\"\n\t\t\t\t}]\n\t\t\t});\n\t\t}\n\t\tlogger.info(`[StudentClassroomDB] New cards from classroom ${this._cfg.name}: ${weighted.length} total (reviews + new)`);\n\t\treturn { cards: weighted.sort((a, b) => b.score - a.score).slice(0, limit) };\n\t}\n};\n/**\n* Interface for managing a classroom.\n*/\nvar TeacherClassroomDB = class TeacherClassroomDB extends ClassroomDBBase {\n\t_stuDb;\n\tconstructor(classID) {\n\t\tsuper();\n\t\tthis._id = classID;\n\t}\n\tasync init() {\n\t\tconst dbName = `classdb-teacher-${this._id}`;\n\t\tconst stuDbName = `classdb-student-${this._id}`;\n\t\tthis._db = new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n\t\tthis._stuDb = new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + stuDbName, createPouchDBConfig());\n\t\ttry {\n\t\t\treturn this._db.get(CLASSROOM_CONFIG).then((cfg) => {\n\t\t\t\tthis._cfg = cfg;\n\t\t\t\tthis._initComplete = true;\n\t\t\t}).then(() => {});\n\t\t} catch (e) {\n\t\t\tthrow new Error(`Error in TeacherClassroomDB constructor: ${JSON.stringify(e)}`);\n\t\t}\n\t}\n\tstatic async factory(classID) {\n\t\tconst ret = new TeacherClassroomDB(classID);\n\t\tawait ret.init();\n\t\treturn ret;\n\t}\n\tasync removeContent(content) {\n\t\tconst contentID = this.getContentId(content);\n\t\ttry {\n\t\t\tconst doc = await this._db.get(contentID);\n\t\t\tawait this._db.remove(doc);\n\t\t\tthis._db.replicate.to(this._stuDb, { doc_ids: [contentID] });\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to remove content:\", contentID, error);\n\t\t}\n\t}\n\tasync assignContent(content) {\n\t\tlet put;\n\t\tconst id = this.getContentId(content);\n\t\tif (content.type === \"tag\") put = await this._db.put({\n\t\t\tcourseID: content.courseID,\n\t\t\ttagID: content.tagID,\n\t\t\ttype: \"tag\",\n\t\t\t_id: id,\n\t\t\tassignedBy: content.assignedBy,\n\t\t\tassignedOn: moment.utc(),\n\t\t\tactiveOn: content.activeOn || moment.utc()\n\t\t});\n\t\telse put = await this._db.put({\n\t\t\tcourseID: content.courseID,\n\t\t\ttype: \"course\",\n\t\t\t_id: id,\n\t\t\tassignedBy: content.assignedBy,\n\t\t\tassignedOn: moment.utc(),\n\t\t\tactiveOn: content.activeOn || moment.utc()\n\t\t});\n\t\tif (put.ok) {\n\t\t\tthis._db.replicate.to(this._stuDb, { doc_ids: [id] });\n\t\t\treturn true;\n\t\t} else return false;\n\t}\n};\nconst ClassroomLookupDB = () => new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + classroomLookupDBTitle, { skip_setup: true });\nfunction getClassroomDB(classID, version) {\n\tconst dbName = `classdb-${version}-${classID}`;\n\tlogger.info(`Retrieving classroom db: ${dbName}`);\n\treturn new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n}\nasync function getClassroomConfig(classID) {\n\treturn await getClassroomDB(classID, \"student\").get(CLASSROOM_CONFIG);\n}\n//#endregion\nexport { CLASSROOM_CONFIG, ClassroomLookupDB, StudentClassroomDB, TeacherClassroomDB, getClassroomConfig, getClassroomDB };\n\n//# sourceMappingURL=classroomDB.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\nimport CourseLookup from \"./courseLookupDB.mjs\";\nimport { updateCredentialledCourseConfig } from \"./courseDB.mjs\";\nimport { getCredentialledCourseConfig } from \"./courseAPI.mjs\";\nimport { createPouchDBConfig, getStartAndEndKeys } from \"./index.mjs\";\nimport { ClassroomLookupDB, TeacherClassroomDB } from \"./classroomDB.mjs\";\n//#region src/impl/couch/adminDB.ts\nvar AdminDB = class {\n\tusersDB;\n\tconstructor() {\n\t\tthis.usersDB = new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + \"_users\", createPouchDBConfig());\n\t}\n\tasync getUsers() {\n\t\treturn (await this.usersDB.allDocs({\n\t\t\tinclude_docs: true,\n\t\t\t...getStartAndEndKeys(\"org.couchdb.user:\")\n\t\t})).rows.map((r) => r.doc);\n\t}\n\tasync getCourses() {\n\t\tconst list = await CourseLookup.allCourseWare();\n\t\treturn await Promise.all(list.map((c) => {\n\t\t\treturn getCredentialledCourseConfig(c._id);\n\t\t}));\n\t}\n\tasync removeCourse(id) {\n\t\tconst delResp = await CourseLookup.delete(id);\n\t\tconst cfg = await getCredentialledCourseConfig(id);\n\t\tcfg.deleted = true;\n\t\tconst isDeletedResp = await updateCredentialledCourseConfig(id, cfg);\n\t\treturn {\n\t\t\tok: delResp.ok && isDeletedResp.ok,\n\t\t\tid: delResp.id,\n\t\t\trev: delResp.rev\n\t\t};\n\t}\n\tasync getClassrooms() {\n\t\tconst uuids = (await ClassroomLookupDB().allDocs({ include_docs: true })).rows.map((r) => r.doc.uuid);\n\t\tlogger.debug(uuids.join(\", \"));\n\t\tconst promisedCRDbs = [];\n\t\tfor (let i = 0; i < uuids.length; i++) try {\n\t\t\tconst db = await TeacherClassroomDB.factory(uuids[i]);\n\t\t\tpromisedCRDbs.push(db);\n\t\t} catch (e) {\n\t\t\tconst err = e;\n\t\t\tif (err.error && err.error === \"not_found\") logger.warn(`db ${uuids[i]} not found`);\n\t\t}\n\t\treturn promisedCRDbs.map((db) => {\n\t\t\treturn {\n\t\t\t\t...db.getConfig(),\n\t\t\t\t_id: db._id\n\t\t\t};\n\t\t});\n\t}\n};\n//#endregion\nexport { AdminDB };\n\n//# sourceMappingURL=adminDB.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\nimport { getCourseDB } from \"./index.mjs\";\n//#region src/impl/couch/CourseSyncService.ts\nconst DEFAULT_REPLICATION = {\n\tbatchSize: 1e3,\n\tbatchesLimit: 5\n};\nvar CourseSyncService = class CourseSyncService {\n\tstatic instance = null;\n\tentries = /* @__PURE__ */ new Map();\n\treplicationOptions = DEFAULT_REPLICATION;\n\tconstructor() {}\n\tstatic getInstance() {\n\t\tif (!CourseSyncService.instance) CourseSyncService.instance = new CourseSyncService();\n\t\treturn CourseSyncService.instance;\n\t}\n\t/**\n\t* Apply replication tuning. Typically called once from `initializeDataLayer`.\n\t* Partial overrides merge with defaults.\n\t*/\n\tconfigure(opts) {\n\t\tif (opts.replication) {\n\t\t\tthis.replicationOptions = {\n\t\t\t\t...DEFAULT_REPLICATION,\n\t\t\t\t...opts.replication\n\t\t\t};\n\t\t\tlogger.info(`[CourseSyncService] Replication configured: batch_size=${this.replicationOptions.batchSize}, batches_limit=${this.replicationOptions.batchesLimit}`);\n\t\t}\n\t}\n\t/**\n\t* Reset the singleton (for testing).\n\t*/\n\tstatic resetInstance() {\n\t\tif (CourseSyncService.instance) {\n\t\t\tfor (const [, entry] of CourseSyncService.instance.entries) if (entry.localDB) entry.localDB.close().catch(() => {});\n\t\t\tCourseSyncService.instance.entries.clear();\n\t\t}\n\t\tCourseSyncService.instance = null;\n\t}\n\t/**\n\t* Ensure a course's local replica is synced.\n\t*\n\t* On first call for a course:\n\t* 1. Fetches CourseConfig from remote to check localSync.enabled\n\t* 2. If enabled, performs one-shot replication remote → local\n\t* 3. Pre-warms PouchDB view indices (elo, getTags)\n\t*\n\t* On subsequent calls: returns immediately if already synced, or awaits\n\t* the in-flight sync if one is in progress.\n\t*\n\t* Safe to call multiple times — concurrent calls coalesce to one sync.\n\t*\n\t* @param courseId - The course to sync\n\t* @param forceEnabled - Skip the CourseConfig check and sync regardless.\n\t* Useful when the caller already knows local sync is desired (e.g.,\n\t* LettersPractice hardcodes this).\n\t*/\n\tasync ensureSynced(courseId, forceEnabled) {\n\t\tconst existing = this.entries.get(courseId);\n\t\tif (existing?.status.state === \"ready\" && existing.localDB) {\n\t\t\tif (!await this.isLocalEpochStale(courseId, existing.localDB)) return;\n\t\t\tlogger.info(`[CourseSyncService] Remote DB epoch changed for course ${courseId} — destroying stale local replica`);\n\t\t\ttry {\n\t\t\t\tawait existing.localDB.destroy();\n\t\t\t} catch {}\n\t\t\texisting.localDB = null;\n\t\t\texisting.readyPromise = null;\n\t\t}\n\t\tif (existing?.status.state === \"disabled\") return;\n\t\tif (existing?.readyPromise) return existing.readyPromise;\n\t\tconst entry = {\n\t\t\tlocalDB: null,\n\t\t\tstatus: { state: \"not-started\" },\n\t\t\treadyPromise: null\n\t\t};\n\t\tthis.entries.set(courseId, entry);\n\t\tentry.readyPromise = this.performSync(courseId, entry, forceEnabled);\n\t\treturn entry.readyPromise;\n\t}\n\t/**\n\t* Get the local PouchDB for a course, or null if not available.\n\t*\n\t* Returns null when:\n\t* - Local sync is not enabled for this course\n\t* - Sync has not been triggered yet\n\t* - Sync is still in progress\n\t* - Sync failed\n\t*/\n\tgetLocalDB(courseId) {\n\t\tconst entry = this.entries.get(courseId);\n\t\tif (entry?.status.state === \"ready\" && entry.localDB) return entry.localDB;\n\t\treturn null;\n\t}\n\t/**\n\t* Check whether a course has a ready local replica.\n\t*/\n\tisReady(courseId) {\n\t\treturn this.entries.get(courseId)?.status.state === \"ready\";\n\t}\n\t/**\n\t* Get detailed sync status for a course.\n\t*/\n\tgetStatus(courseId) {\n\t\treturn this.entries.get(courseId)?.status ?? { state: \"not-started\" };\n\t}\n\tasync performSync(courseId, entry, forceEnabled) {\n\t\ttry {\n\t\t\tif (!forceEnabled) {\n\t\t\t\tentry.status = { state: \"checking-config\" };\n\t\t\t\tif (!await this.checkLocalSyncEnabled(courseId)) {\n\t\t\t\t\tentry.status = { state: \"disabled\" };\n\t\t\t\t\tentry.readyPromise = null;\n\t\t\t\t\tlogger.debug(`[CourseSyncService] Local sync disabled for course ${courseId}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tentry.status = { state: \"syncing\" };\n\t\t\tconst localDBName = this.localDBName(courseId);\n\t\t\tlet localDB = new pouchdb_setup_default(localDBName);\n\t\t\tif (await this.isLocalEpochStale(courseId, localDB)) {\n\t\t\t\tlogger.info(`[CourseSyncService] Stale local DB detected for course ${courseId} — destroying before sync`);\n\t\t\t\tawait localDB.destroy();\n\t\t\t\tlocalDB = new pouchdb_setup_default(localDBName);\n\t\t\t}\n\t\t\tentry.localDB = localDB;\n\t\t\tconst remoteDB = this.getRemoteDB(courseId);\n\t\t\tconst syncStart = Date.now();\n\t\t\tlogger.info(`[CourseSyncService] Starting one-shot replication for course ${courseId} (batch_size=${this.replicationOptions.batchSize}, batches_limit=${this.replicationOptions.batchesLimit})`);\n\t\t\tconst result = await this.replicate(remoteDB, localDB);\n\t\t\tconst syncTimeMs = Date.now() - syncStart;\n\t\t\tlogger.info(`[CourseSyncService] Replication complete for course ${courseId}: ${result.docs_written} docs in ${syncTimeMs}ms`);\n\t\t\tentry.status = { state: \"warming-views\" };\n\t\t\tconst warmStart = Date.now();\n\t\t\tawait this.warmViewIndices(localDB);\n\t\t\tconst viewWarmTimeMs = Date.now() - warmStart;\n\t\t\tlogger.info(`[CourseSyncService] View indices warmed for course ${courseId} in ${viewWarmTimeMs}ms`);\n\t\t\tentry.status = {\n\t\t\t\tstate: \"ready\",\n\t\t\t\tdocsReplicated: result.docs_written,\n\t\t\t\tsyncTimeMs,\n\t\t\t\tviewWarmTimeMs\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconst errorMsg = e instanceof Error ? e.message : String(e);\n\t\t\tlogger.error(`[CourseSyncService] Sync failed for course ${courseId}: ${errorMsg}`);\n\t\t\tentry.status = {\n\t\t\t\tstate: \"error\",\n\t\t\t\terror: errorMsg\n\t\t\t};\n\t\t\tentry.readyPromise = null;\n\t\t\tif (entry.localDB) {\n\t\t\t\ttry {\n\t\t\t\t\tawait entry.localDB.destroy();\n\t\t\t\t} catch {}\n\t\t\t\tentry.localDB = null;\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Check CourseConfig.localSync.enabled on the remote DB.\n\t*/\n\tasync checkLocalSyncEnabled(courseId) {\n\t\ttry {\n\t\t\treturn (await this.getRemoteDB(courseId).get(\"CourseConfig\")).localSync?.enabled === true;\n\t\t} catch (e) {\n\t\t\tlogger.warn(`[CourseSyncService] Could not read CourseConfig for ${courseId}, assuming local sync disabled: ${e}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\t/**\n\t* One-shot replication from remote to local.\n\t*/\n\treplicate(source, target) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tpouchdb_setup_default.replicate(source, target, {\n\t\t\t\tbatch_size: this.replicationOptions.batchSize,\n\t\t\t\tbatches_limit: this.replicationOptions.batchesLimit\n\t\t\t}).on(\"complete\", (info) => {\n\t\t\t\tresolve(info);\n\t\t\t}).on(\"error\", (err) => {\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\t/**\n\t* Pre-warm PouchDB view indices by running a minimal query against each\n\t* design doc. This forces PouchDB to build the MapReduce index now\n\t* (during a loading phase) rather than on first pipeline query.\n\t*/\n\tasync warmViewIndices(localDB) {\n\t\tfor (const viewName of [\"elo\", \"getTags\"]) try {\n\t\t\tawait localDB.query(viewName, { limit: 1 });\n\t\t\tlogger.debug(`[CourseSyncService] Warmed view index: ${viewName}`);\n\t\t} catch (e) {\n\t\t\tlogger.debug(`[CourseSyncService] Could not warm view ${viewName}: ${e}`);\n\t\t}\n\t}\n\t/**\n\t* Check whether the local replica's `db-epoch` doc matches the remote.\n\t*\n\t* The seed script (and optionally upload-cards) writes a `db-epoch`\n\t* document with a numeric timestamp. If the remote epoch differs from\n\t* the local copy, the remote DB was recreated (e.g., `yarn db:seed`)\n\t* and the local PouchDB is stale.\n\t*\n\t* Returns `true` if stale (epoch mismatch or remote has epoch but local\n\t* doesn't). Returns `false` (not stale) if epochs match, or if the\n\t* remote doesn't have an epoch doc at all (backwards compat).\n\t*/\n\tasync isLocalEpochStale(courseId, localDB) {\n\t\ttry {\n\t\t\tconst remoteEpoch = await this.getRemoteDB(courseId).get(\"db-epoch\");\n\t\t\tlet localEpoch = null;\n\t\t\ttry {\n\t\t\t\tlocalEpoch = await localDB.get(\"db-epoch\");\n\t\t\t} catch {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn remoteEpoch.epoch !== localEpoch.epoch;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\t/**\n\t* Get a remote PouchDB handle for a course.\n\t*/\n\tgetRemoteDB(courseId) {\n\t\treturn getCourseDB(courseId);\n\t}\n\t/**\n\t* Local DB naming convention.\n\t*/\n\tlocalDBName(courseId) {\n\t\treturn `coursedb-local-${courseId}`;\n\t}\n};\n//#endregion\nexport { CourseSyncService };\n\n//# sourceMappingURL=CourseSyncService.mjs.map","// Save global object in a variable\nvar __global__ =\n(typeof globalThis !== 'undefined' && globalThis) ||\n(typeof self !== 'undefined' && self) ||\n(typeof global !== 'undefined' && global);\n// Create an object that extends from __global__ without the fetch function\nvar __globalThis__ = (function () {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = __global__.DOMException\n}\nF.prototype = __global__; // Needed for feature detection on whatwg-fetch's code\nreturn new F();\n})();\n// Wraps whatwg-fetch with a function scope to hijack the global object\n// \"globalThis\" that's going to be patched\n(function(globalThis) {\n\nvar irrelevant = (function (exports) {\n\n /* eslint-disable no-prototype-builtins */\n var g =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n // eslint-disable-next-line no-undef\n (typeof global !== 'undefined' && global) ||\n {};\n\n var support = {\n searchParams: 'URLSearchParams' in g,\n iterable: 'Symbol' in g && 'iterator' in Symbol,\n blob:\n 'FileReader' in g &&\n 'Blob' in g &&\n (function() {\n try {\n new Blob();\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in g,\n arrayBuffer: 'ArrayBuffer' in g\n };\n\n function isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ];\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n };\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name);\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value);\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift();\n return {done: value === undefined, value: value}\n }\n };\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n };\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {};\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value);\n }, this);\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n if (header.length != 2) {\n throw new TypeError('Headers constructor: expected name/value pair to be length 2, found' + header.length)\n }\n this.append(header[0], header[1]);\n }, this);\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name]);\n }, this);\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name);\n value = normalizeValue(value);\n var oldValue = this.map[name];\n this.map[name] = oldValue ? oldValue + ', ' + value : value;\n };\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)];\n };\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name);\n return this.has(name) ? this.map[name] : null\n };\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n };\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value);\n };\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this);\n }\n }\n };\n\n Headers.prototype.keys = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push(name);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.values = function() {\n var items = [];\n this.forEach(function(value) {\n items.push(value);\n });\n return iteratorFor(items)\n };\n\n Headers.prototype.entries = function() {\n var items = [];\n this.forEach(function(value, name) {\n items.push([name, value]);\n });\n return iteratorFor(items)\n };\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n }\n\n function consumed(body) {\n if (body._noBody) return\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true;\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result);\n };\n reader.onerror = function() {\n reject(reader.error);\n };\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n reader.readAsArrayBuffer(blob);\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader();\n var promise = fileReaderReady(reader);\n var match = /charset=([A-Za-z0-9_-]+)/.exec(blob.type);\n var encoding = match ? match[1] : 'utf-8';\n reader.readAsText(blob, encoding);\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf);\n var chars = new Array(view.length);\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i]);\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength);\n view.set(new Uint8Array(buf));\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false;\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n // eslint-disable-next-line no-self-assign\n this.bodyUsed = this.bodyUsed;\n this._bodyInit = body;\n if (!body) {\n this._noBody = true;\n this._bodyText = '';\n } else if (typeof body === 'string') {\n this._bodyText = body;\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body;\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body;\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString();\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer);\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer]);\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body);\n } else {\n this._bodyText = body = Object.prototype.toString.call(body);\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8');\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type);\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n }\n };\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n };\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this);\n if (isConsumed) {\n return isConsumed\n } else if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else if (support.blob) {\n return this.blob().then(readBlobAsArrayBuffer)\n } else {\n throw new Error('could not read as ArrayBuffer')\n }\n };\n\n this.text = function() {\n var rejected = consumed(this);\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n };\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n };\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n };\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['CONNECT', 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'TRACE'];\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase();\n return methods.indexOf(upcased) > -1 ? upcased : method\n }\n\n function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {};\n var body = options.body;\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url;\n this.credentials = input.credentials;\n if (!options.headers) {\n this.headers = new Headers(input.headers);\n }\n this.method = input.method;\n this.mode = input.mode;\n this.signal = input.signal;\n if (!body && input._bodyInit != null) {\n body = input._bodyInit;\n input.bodyUsed = true;\n }\n } else {\n this.url = String(input);\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin';\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers);\n }\n this.method = normalizeMethod(options.method || this.method || 'GET');\n this.mode = options.mode || this.mode || null;\n this.signal = options.signal || this.signal || (function () {\n if ('AbortController' in g) {\n var ctrl = new AbortController();\n return ctrl.signal;\n }\n }());\n this.referrer = null;\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body);\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/;\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/;\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n }\n }\n }\n }\n\n Request.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n };\n\n function decode(body) {\n var form = new FormData();\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=');\n var name = split.shift().replace(/\\+/g, ' ');\n var value = split.join('=').replace(/\\+/g, ' ');\n form.append(decodeURIComponent(name), decodeURIComponent(value));\n }\n });\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers();\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':');\n var key = parts.shift().trim();\n if (key) {\n var value = parts.join(':').trim();\n try {\n headers.append(key, value);\n } catch (error) {\n console.warn('Response ' + error.message);\n }\n }\n });\n return headers\n }\n\n Body.call(Request.prototype);\n\n function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {};\n }\n\n this.type = 'default';\n this.status = options.status === undefined ? 200 : options.status;\n if (this.status < 200 || this.status > 599) {\n throw new RangeError(\"Failed to construct 'Response': The status provided (0) is outside the range [200, 599].\")\n }\n this.ok = this.status >= 200 && this.status < 300;\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n this.headers = new Headers(options.headers);\n this.url = options.url || '';\n this._initBody(bodyInit);\n }\n\n Body.call(Response.prototype);\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n };\n\n Response.error = function() {\n var response = new Response(null, {status: 200, statusText: ''});\n response.ok = false;\n response.status = 0;\n response.type = 'error';\n return response\n };\n\n var redirectStatuses = [301, 302, 303, 307, 308];\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n };\n\n exports.DOMException = g.DOMException;\n try {\n new exports.DOMException();\n } catch (err) {\n exports.DOMException = function(message, name) {\n this.message = message;\n this.name = name;\n var error = Error(message);\n this.stack = error.stack;\n };\n exports.DOMException.prototype = Object.create(Error.prototype);\n exports.DOMException.prototype.constructor = exports.DOMException;\n }\n\n function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init);\n\n if (request.signal && request.signal.aborted) {\n return reject(new exports.DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest();\n\n function abortXhr() {\n xhr.abort();\n }\n\n xhr.onload = function() {\n var options = {\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n };\n // This check if specifically for when a user fetches a file locally from the file system\n // Only if the status is out of a normal range\n if (request.url.indexOf('file://') === 0 && (xhr.status < 200 || xhr.status > 599)) {\n options.status = 200;\n } else {\n options.status = xhr.status;\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n var body = 'response' in xhr ? xhr.response : xhr.responseText;\n setTimeout(function() {\n resolve(new Response(body, options));\n }, 0);\n };\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'));\n }, 0);\n };\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request timed out'));\n }, 0);\n };\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new exports.DOMException('Aborted', 'AbortError'));\n }, 0);\n };\n\n function fixUrl(url) {\n try {\n return url === '' && g.location.href ? g.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true);\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true;\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false;\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob';\n } else if (\n support.arrayBuffer\n ) {\n xhr.responseType = 'arraybuffer';\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers || (g.Headers && init.headers instanceof g.Headers))) {\n var names = [];\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n names.push(normalizeName(name));\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n });\n request.headers.forEach(function(value, name) {\n if (names.indexOf(name) === -1) {\n xhr.setRequestHeader(name, value);\n }\n });\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value);\n });\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr);\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr);\n }\n };\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n })\n }\n\n fetch.polyfill = true;\n\n if (!g.fetch) {\n g.fetch = fetch;\n g.Headers = Headers;\n g.Request = Request;\n g.Response = Response;\n }\n\n exports.Headers = Headers;\n exports.Request = Request;\n exports.Response = Response;\n exports.fetch = fetch;\n\n return exports;\n\n})({});\n})(__globalThis__);\n// This is a ponyfill, so...\n__globalThis__.fetch.ponyfill = true;\ndelete __globalThis__.fetch.polyfill;\n// Choose between native implementation (__global__) or custom implementation (__globalThis__)\nvar ctx = __global__.fetch ? __global__ : __globalThis__;\nexports = ctx.fetch // To enable: import fetch from 'cross-fetch'\nexports.default = ctx.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = ctx.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = ctx.Headers\nexports.Request = ctx.Request\nexports.Response = ctx.Response\nmodule.exports = exports\n","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport fetch from \"cross-fetch\";\n//#region src/impl/couch/auth.ts\nasync function getCurrentSession() {\n\ttry {\n\t\tif (ENV.COUCHDB_SERVER_URL === \"NOT_SET\" || ENV.COUCHDB_SERVER_PROTOCOL === \"NOT_SET\") throw new Error(`CouchDB server configuration not properly initialized. Protocol: \"${ENV.COUCHDB_SERVER_PROTOCOL}\", URL: \"${ENV.COUCHDB_SERVER_URL}\"`);\n\t\tconst baseUrl = ENV.COUCHDB_SERVER_URL.endsWith(\"/\") ? ENV.COUCHDB_SERVER_URL.slice(0, -1) : ENV.COUCHDB_SERVER_URL;\n\t\tconst url = `${ENV.COUCHDB_SERVER_PROTOCOL}://${baseUrl}/_session`;\n\t\tlogger.debug(`Attempting session check at: ${url}`);\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"GET\",\n\t\t\tcredentials: \"include\"\n\t\t});\n\t\tif (!response.ok) throw new Error(`Session check failed: ${response.status}`);\n\t\treturn await response.json();\n\t} catch (error) {\n\t\tconst baseUrl = ENV.COUCHDB_SERVER_URL.endsWith(\"/\") ? ENV.COUCHDB_SERVER_URL.slice(0, -1) : ENV.COUCHDB_SERVER_URL;\n\t\tconst url = `${ENV.COUCHDB_SERVER_PROTOCOL}://${baseUrl}/_session`;\n\t\tlogger.error(`Session check error attempting to connect to: ${url} - ${error}`);\n\t\tthrow new Error(`Session check failed connecting to ${url}: ${error}`);\n\t}\n}\nasync function getLoggedInUsername() {\n\tconst session = await getCurrentSession();\n\tif (session.userCtx.name && session.userCtx.name !== \"\") return session.userCtx.name;\n\tthrow new Error(\"No logged in user\");\n}\n//#endregion\nexport { getLoggedInUsername };\n\n//# sourceMappingURL=auth.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\nimport { GuestUsername } from \"../../core/types/types-legacy.mjs\";\nimport { hexEncode } from \"../common/userDBKeys.mjs\";\nimport { getLocalUserDB } from \"../common/userDBHelpers.mjs\";\nimport { accomodateGuest } from \"../common/BaseUserDB.mjs\";\nimport { getLoggedInUsername } from \"./auth.mjs\";\nimport { createPouchDBConfig } from \"./index.mjs\";\nimport { Status } from \"@vue-skuilder/common\";\n//#region src/impl/couch/CouchDBSyncStrategy.ts\nconst log = (s) => {\n\tlogger.info(s);\n};\n/**\n* Sync strategy that implements full CouchDB remote synchronization\n* Handles account creation, authentication, and live sync with remote CouchDB server\n*/\nvar CouchDBSyncStrategy = class {\n\tsyncHandle;\n\t/** In-flight one-shot hydration pull, so a timed-out pull can be abandoned. */\n\thydrationHandle;\n\tsetupRemoteDB(username) {\n\t\tif (username === \"sk-guest-\" || username.startsWith(\"sk-guest-\")) return getLocalUserDB(username);\n\t\telse return this.getUserDB(username);\n\t}\n\tgetWriteDB(username) {\n\t\tif (username === \"sk-guest-\" || username.startsWith(\"sk-guest-\")) return getLocalUserDB(username);\n\t\telse return this.getUserDB(username);\n\t}\n\t/**\n\t* One-shot remote → local pull. Resolves once the local mirror is caught up.\n\t*\n\t* Pull only: pushing here would upload whatever the local DB happens to hold\n\t* before we know what the remote already has, which is the conflict-leaf\n\t* problem hydration exists to avoid. Local changes go up when startSync()\n\t* takes over.\n\t*\n\t* Into an EMPTY local DB this skips deleted documents, because a mirror that\n\t* never held a document does not need to be told it was removed. That\n\t* matters more than it sounds: scheduled reviews (`card_review_*`) are\n\t* created and deleted once per review completed, so the changes feed is\n\t* dominated by tombstones and grows without bound, while the durable record\n\t* lives in card history. One real account measured 385 live documents behind\n\t* 8,370 deletions — an unfiltered pull moved 9,520 documents and took ~20s,\n\t* blowing the hydration timeout on a phone; filtered, the same pull moves\n\t* 404 and takes ~2s, reaching a byte-identical local state.\n\t*\n\t* The filter runs server-side, so `last_seq` still reports the source's true\n\t* sequence. Returning it lets startSync() begin the live pull from there\n\t* instead of re-walking the same history in the background — without that,\n\t* the cost is merely deferred, not removed.\n\t*/\n\tasync hydrate(localDB, remoteDB) {\n\t\tconst pristine = (await localDB.info()).doc_count === 0;\n\t\tconst replication = pouchdb_setup_default.replicate(remoteDB, localDB, pristine ? { selector: { _deleted: { $exists: false } } } : {});\n\t\tthis.hydrationHandle = replication;\n\t\ttry {\n\t\t\tconst info = await replication;\n\t\t\treturn {\n\t\t\t\tdocsWritten: info.docs_written,\n\t\t\t\tlastSeq: pristine ? info.last_seq : void 0\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.hydrationHandle = void 0;\n\t\t}\n\t}\n\tstartSync(localDB, remoteDB, since) {\n\t\tif (localDB.name !== remoteDB.name) this.syncHandle = pouchdb_setup_default.sync(localDB, remoteDB, {\n\t\t\tlive: true,\n\t\t\tretry: true,\n\t\t\t...since !== void 0 ? { pull: { since } } : {}\n\t\t});\n\t}\n\tstopSync() {\n\t\tif (this.hydrationHandle) {\n\t\t\ttry {\n\t\t\t\tthis.hydrationHandle.cancel();\n\t\t\t} catch (e) {\n\t\t\t\tlogger.warn(`Failed to cancel hydration pull (continuing anyway): ${e}`);\n\t\t\t}\n\t\t\tthis.hydrationHandle = void 0;\n\t\t}\n\t\tif (this.syncHandle) {\n\t\t\ttry {\n\t\t\t\tthis.syncHandle.cancel();\n\t\t\t} catch (e) {\n\t\t\t\tlogger.warn(`Failed to cancel user sync (continuing anyway): ${e}`);\n\t\t\t}\n\t\t\tthis.syncHandle = void 0;\n\t\t}\n\t}\n\tcanCreateAccount() {\n\t\treturn true;\n\t}\n\tcanAuthenticate() {\n\t\treturn true;\n\t}\n\tasync createAccount(username, password) {\n\t\tconst funnelUsername = await this.getCurrentUsername();\n\t\tconst isFunnelAccount = funnelUsername.startsWith(GuestUsername);\n\t\tif (isFunnelAccount) logger.info(`Creating account for funnel user ${funnelUsername} -> ${username}`);\n\t\ttry {\n\t\t\tconst signupRequest = await this.getRemoteCouchRootDB().signUp(username, password);\n\t\t\tif (signupRequest.ok) {\n\t\t\t\tlog(`CREATEACCOUNT: Successfully created account for ${username}`);\n\t\t\t\ttry {\n\t\t\t\t\tlog(`CREATEACCOUNT: logged out: ${(await this.getRemoteCouchRootDB().logOut()).ok}`);\n\t\t\t\t} catch {}\n\t\t\t\tconst loginResult = await this.getRemoteCouchRootDB().logIn(username, password);\n\t\t\t\tlog(`CREATEACCOUNT: logged in as new user: ${loginResult.ok}`);\n\t\t\t\tif (loginResult.ok) {\n\t\t\t\t\tif (isFunnelAccount) {\n\t\t\t\t\t\tlogger.info(`Migrating data from funnel account ${funnelUsername} to ${username}`);\n\t\t\t\t\t\tconst migrationResult = await this.migrateFunnelData(funnelUsername, username);\n\t\t\t\t\t\tif (!migrationResult.success) logger.warn(`Migration failed: ${migrationResult.error}`);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: Status.ok,\n\t\t\t\t\t\terror: void 0\n\t\t\t\t\t};\n\t\t\t\t} else return {\n\t\t\t\t\tstatus: Status.error,\n\t\t\t\t\terror: \"Failed to log in after account creation\"\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tlogger.warn(`Signup not OK: ${JSON.stringify(signupRequest)}`);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: Status.error,\n\t\t\t\t\terror: \"Account creation failed\"\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tif (e.reason === \"Document update conflict.\") return {\n\t\t\t\tstatus: Status.error,\n\t\t\t\terror: \"This username is taken!\"\n\t\t\t};\n\t\t\tlogger.error(`Error on signup: ${JSON.stringify(e)}`);\n\t\t\treturn {\n\t\t\t\tstatus: Status.error,\n\t\t\t\terror: e.message || \"Unknown error during account creation\"\n\t\t\t};\n\t\t}\n\t}\n\tasync authenticate(username, password) {\n\t\ttry {\n\t\t\tif ((await this.getRemoteCouchRootDB().logIn(username, password)).ok) {\n\t\t\t\tlog(`Successfully logged in as ${username}`);\n\t\t\t\treturn { ok: true };\n\t\t\t} else {\n\t\t\t\tlog(`Login failed for ${username}`);\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\terror: \"Invalid username or password\"\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(`Authentication error for ${username}:`, error);\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: error.message || \"Authentication failed\"\n\t\t\t};\n\t\t}\n\t}\n\tasync adoptSession(migrateFromGuest) {\n\t\tlet username;\n\t\ttry {\n\t\t\tusername = await getLoggedInUsername();\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: \"No session to adopt\"\n\t\t\t};\n\t\t}\n\t\tif (migrateFromGuest?.startsWith(\"sk-guest-\")) {\n\t\t\tlogger.info(`Migrating data from funnel account ${migrateFromGuest} to ${username}`);\n\t\t\tconst migrationResult = await this.migrateFunnelData(migrateFromGuest, username);\n\t\t\tif (!migrationResult.success) logger.warn(`Migration failed: ${migrationResult.error}`);\n\t\t}\n\t\treturn {\n\t\t\tok: true,\n\t\t\tusername\n\t\t};\n\t}\n\tasync logout() {\n\t\ttry {\n\t\t\tconst result = await this.getRemoteCouchRootDB().logOut();\n\t\t\treturn {\n\t\t\t\tok: result.ok,\n\t\t\t\terror: result.ok ? void 0 : \"Logout failed\"\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Logout error:\", error);\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror: error.message || \"Logout failed\"\n\t\t\t};\n\t\t}\n\t}\n\tasync getCurrentUsername() {\n\t\tlogger.log(\"[funnel] CouchDBSyncStrategy.getCurrentUsername() called\");\n\t\ttry {\n\t\t\tconst loggedInUsername = await getLoggedInUsername();\n\t\t\tlogger.log(\"[funnel] getLoggedInUsername() returned:\", loggedInUsername);\n\t\t\treturn loggedInUsername;\n\t\t} catch (e) {\n\t\t\tlogger.log(\"[funnel] getLoggedInUsername() failed, calling accomodateGuest()\");\n\t\t\tlogger.log(\"[funnel] Error was:\", e);\n\t\t\tconst guestInfo = accomodateGuest();\n\t\t\tlogger.log(\"[funnel] accomodateGuest() returned:\", guestInfo);\n\t\t\treturn guestInfo.username;\n\t\t}\n\t}\n\t/**\n\t* Migrate data from funnel account to real account\n\t*/\n\tasync migrateFunnelData(oldUsername, newUsername) {\n\t\ttry {\n\t\t\tlogger.info(`Starting data migration from ${oldUsername} to ${newUsername}`);\n\t\t\tconst oldLocalDB = getLocalUserDB(oldUsername);\n\t\t\tconst newLocalDB = getLocalUserDB(newUsername);\n\t\t\tconst allDocs = await oldLocalDB.allDocs({ include_docs: true });\n\t\t\tlogger.info(`Found ${allDocs.rows.length} documents in funnel account`);\n\t\t\tconst docsToMigrate = allDocs.rows.filter((row) => !row.id.startsWith(\"_design/\")).map((row) => ({\n\t\t\t\t...row.doc,\n\t\t\t\t_rev: void 0\n\t\t\t}));\n\t\t\tif (docsToMigrate.length > 0) {\n\t\t\t\tawait newLocalDB.bulkDocs(docsToMigrate);\n\t\t\t\tlogger.info(`Successfully migrated ${docsToMigrate.length} documents from ${oldUsername} to ${newUsername}`);\n\t\t\t} else logger.info(\"No documents to migrate from funnel account\");\n\t\t\ttry {\n\t\t\t\tawait oldLocalDB.destroy();\n\t\t\t\tlogger.info(`Destroyed consumed guest DB for ${oldUsername}`);\n\t\t\t} catch (destroyErr) {\n\t\t\t\tlogger.warn(`Failed to destroy consumed guest DB for ${oldUsername} (non-fatal): ${destroyErr instanceof Error ? destroyErr.message : String(destroyErr)}`);\n\t\t\t}\n\t\t\treturn { success: true };\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Migration failed:\", error);\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: error instanceof Error ? error.message : \"Unknown error\"\n\t\t\t};\n\t\t}\n\t}\n\t/**\n\t* Get remote CouchDB root database for authentication operations\n\t*/\n\tgetRemoteCouchRootDB() {\n\t\tconst remoteStr = ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + \"skuilder\";\n\t\ttry {\n\t\t\treturn new pouchdb_setup_default(remoteStr, { skip_setup: true });\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize remote CouchDB connection:\", error);\n\t\t\tthrow new Error(`Failed to initialize CouchDB: ${JSON.stringify(error)}`);\n\t\t}\n\t}\n\t/**\n\t* Get remote user database for a specific user\n\t*/\n\tgetUserDB(username) {\n\t\tconst dbName = `userdb-${hexEncode(username)}`;\n\t\tlog(`Fetching user database: ${dbName} (${username})`);\n\t\treturn new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n\t}\n};\n//#endregion\nexport { CouchDBSyncStrategy };\n\n//# sourceMappingURL=CouchDBSyncStrategy.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\nimport { DocType, DocTypePrefixes, GuestUsername, log } from \"../../core/types/types-legacy.mjs\";\nimport { hexEncode } from \"../common/userDBKeys.mjs\";\nimport { AdminDB } from \"./adminDB.mjs\";\nimport { CourseDB, CoursesDB, createTag, deleteTag, getAncestorTagIDs, getAppliedTags, getChildTagStubs, getCourseDataShapes, getCourseQuestionTypes, getCourseTagStubs, getCredentialledDataShapes, getTag, removeTagFromCard, updateCardElo, updateCredentialledCourseConfig, updateTag } from \"./courseDB.mjs\";\nimport { addNote55, addTagToCard, getCredentialledCourseConfig, getTagID } from \"./courseAPI.mjs\";\nimport { CourseSyncService } from \"./CourseSyncService.mjs\";\nimport { CouchDBSyncStrategy } from \"./CouchDBSyncStrategy.mjs\";\nimport { CLASSROOM_CONFIG, ClassroomLookupDB, StudentClassroomDB, TeacherClassroomDB, getClassroomConfig, getClassroomDB } from \"./classroomDB.mjs\";\nimport { getStudySource, isReview } from \"../../core/interfaces/contentSource.mjs\";\nimport moment from \"moment\";\nimport fetch from \"cross-fetch\";\n//#region src/impl/couch/index.ts\nconst expiryDocID = \"GuestAccountExpirationDate\";\nconst localUserDB = new pouchdb_setup_default(`userdb-${GuestUsername}`);\nconst pouchDBincludeCredentialsConfig = { fetch(url, opts) {\n\topts.credentials = \"include\";\n\treturn pouchdb_setup_default.fetch(url, opts);\n} };\n/**\n* Creates PouchDB configuration with appropriate authentication method\n* - Uses HTTP Basic Auth when credentials are available (Node.js/MCP)\n* - Falls back to cookie auth for browser environments\n*/\nfunction createPouchDBConfig() {\n\tif (ENV.COUCHDB_USERNAME && ENV.COUCHDB_PASSWORD && typeof window === \"undefined\") return { fetch(url, opts = {}) {\n\t\tconst basicAuth = btoa(`${ENV.COUCHDB_USERNAME}:${ENV.COUCHDB_PASSWORD}`);\n\t\tconst headers = new Headers(opts.headers || {});\n\t\theaders.set(\"Authorization\", `Basic ${basicAuth}`);\n\t\tconst newOpts = {\n\t\t\t...opts,\n\t\t\theaders\n\t\t};\n\t\treturn pouchdb_setup_default.fetch(url, newOpts);\n\t} };\n\treturn pouchDBincludeCredentialsConfig;\n}\nfunction getCouchDB(dbName) {\n\treturn new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n}\nfunction getCourseDB(courseID) {\n\treturn new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + \"coursedb-\" + courseID, createPouchDBConfig());\n}\nasync function getLatestVersion() {\n\ttry {\n\t\tconst docs = await getCouchDB(\"version\").allDocs({\n\t\t\tdescending: true,\n\t\t\tlimit: 1\n\t\t});\n\t\tif (docs && docs.rows && docs.rows[0]) return docs.rows[0].id;\n\t\telse return \"0.0.0\";\n\t} catch {\n\t\treturn \"-1\";\n\t}\n}\n/**\n* Checks the remote couchdb to see if a given username is available\n* @param username The username to be checked\n*/\nasync function usernameIsAvailable(username) {\n\tlog(`Checking availability of ${username}`);\n\ttry {\n\t\treturn (await fetch(ENV.COUCHDB_SERVER_URL + \"userdb-\" + hexEncode(username), { method: \"HEAD\" })).status === 404;\n\t} catch (error) {\n\t\tlog(`Error checking username availability: ${error}`);\n\t\treturn false;\n\t}\n}\nfunction updateGuestAccountExpirationDate(guestDB) {\n\tconst expirationDate = moment.utc().add(2, \"months\").toISOString();\n\tguestDB.get(expiryDocID).then((doc) => {\n\t\treturn guestDB.put({\n\t\t\t_id: expiryDocID,\n\t\t\t_rev: doc._rev,\n\t\t\tdate: expirationDate\n\t\t});\n\t}).catch(() => {\n\t\treturn guestDB.put({\n\t\t\t_id: expiryDocID,\n\t\t\tdate: expirationDate\n\t\t});\n\t});\n}\nfunction getCourseDocs(courseID, docIDs, options = {}) {\n\treturn getCourseDB(courseID).allDocs({\n\t\t...options,\n\t\tkeys: docIDs\n\t});\n}\nfunction getCourseDoc(courseID, docID, options = {}) {\n\treturn getCourseDB(courseID).get(docID, options);\n}\n/**\n* Returns *all* cards from the parameter courses, in\n* 'qualified' card format (\"courseid-cardid\")\n*\n* @param courseIDs A list of all course_ids to get cards from\n*/\nasync function getRandomCards(courseIDs) {\n\tif (courseIDs.length === 0) throw new Error(`getRandomCards:\\n\\tAttempted to get all cards from no courses!`);\n\telse {\n\t\tconst courseResults = await Promise.all(courseIDs.map((course) => {\n\t\t\treturn getCourseDB(course).find({\n\t\t\t\tselector: { docType: DocType.CARD },\n\t\t\t\tlimit: 1e3\n\t\t\t});\n\t\t}));\n\t\tconst ret = [];\n\t\tcourseResults.forEach((courseCards, index) => {\n\t\t\tcourseCards.docs.forEach((doc) => {\n\t\t\t\tret.push(`${courseIDs[index]}-${doc._id}`);\n\t\t\t});\n\t\t});\n\t\treturn ret;\n\t}\n}\nconst REVIEW_TIME_FORMAT = \"YYYY-MM-DD--kk:mm:ss-SSS\";\nfunction getCouchUserDB(username) {\n\tconst dbName = `userdb-${hexEncode(username)}`;\n\tlog(`Fetching user database: ${dbName} (${username})`);\n\treturn new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n}\nfunction scheduleCardReview(review) {\n\tconst now = moment.utc();\n\tlogger.info(`Scheduling for review in: ${review.time.diff(now, \"h\") / 24} days`);\n\tgetCouchUserDB(review.user).put({\n\t\t_id: DocTypePrefixes[DocType.SCHEDULED_CARD] + review.time.format(REVIEW_TIME_FORMAT),\n\t\tcardId: review.card_id,\n\t\treviewTime: review.time.toISOString(),\n\t\tcourseId: review.course_id,\n\t\tscheduledAt: now.toISOString(),\n\t\tscheduledFor: review.scheduledFor,\n\t\tschedulingAgentId: review.schedulingAgentId\n\t});\n}\nfunction filterAllDocsByPrefix(db, prefix, opts) {\n\tconst options = {\n\t\tstartkey: prefix,\n\t\tendkey: prefix + \"\",\n\t\tinclude_docs: true\n\t};\n\tif (opts) Object.assign(options, opts);\n\treturn db.allDocs(options);\n}\nfunction getStartAndEndKeys(key) {\n\treturn {\n\t\tstartkey: key,\n\t\tendkey: key + \"\"\n\t};\n}\n//#endregion\nexport { AdminDB, CLASSROOM_CONFIG, ClassroomLookupDB, CouchDBSyncStrategy, CourseDB, CourseSyncService, CoursesDB, REVIEW_TIME_FORMAT, StudentClassroomDB, TeacherClassroomDB, addNote55, addTagToCard, createPouchDBConfig, createTag, deleteTag, filterAllDocsByPrefix, getAncestorTagIDs, getAppliedTags, getChildTagStubs, getClassroomConfig, getClassroomDB, getCouchUserDB, getCourseDB, getCourseDataShapes, getCourseDoc, getCourseDocs, getCourseQuestionTypes, getCourseTagStubs, getCredentialledCourseConfig, getCredentialledDataShapes, getLatestVersion, getRandomCards, getStartAndEndKeys, getStudySource, getTag, getTagID, hexEncode, isReview, localUserDB, removeTagFromCard, scheduleCardReview, updateCardElo, updateCredentialledCourseConfig, updateGuestAccountExpirationDate, updateTag, usernameIsAvailable };\n\n//# sourceMappingURL=index.mjs.map","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { ENV } from \"../../factory.mjs\";\nimport pouchdb_setup_default from \"./pouchdb-setup.mjs\";\nimport { DocType, DocTypePrefixes } from \"../../core/types/types-legacy.mjs\";\nimport { CourseDB, createTag } from \"./courseDB.mjs\";\nimport { BaseUser } from \"../common/BaseUserDB.mjs\";\nimport { createPouchDBConfig } from \"./index.mjs\";\nimport { NameSpacer, blankCourseElo, prepareNote55, toCourseElo } from \"@vue-skuilder/common\";\nimport { v4 } from \"uuid\";\n//#region src/impl/couch/courseAPI.ts\n/**\n*\n* @param courseID id of the course (quilt) being added to\n* @param codeCourse\n* @param shape\n* @param data the datashape data - data required for this shape\n* @param author\n* @param uploads optional additional media uploads: img0, img1, ..., aud0, aud1,...\n* @returns\n*/\nasync function addNote55(courseID, codeCourse, shape, data, author, tags, uploads, elo = blankCourseElo()) {\n\tconst db = getCourseDB(courseID);\n\tconst payload = prepareNote55(courseID, codeCourse, shape, data, author, tags, uploads);\n\tconst _id = `${DocTypePrefixes[DocType.DISPLAYABLE_DATA]}-${v4()}`;\n\tconst result = await db.put({\n\t\t...payload,\n\t\t_id\n\t});\n\tconst dataShapeId = NameSpacer.getDataShapeString({\n\t\tcourse: codeCourse,\n\t\tdataShape: shape.name\n\t});\n\tif (result.ok) try {\n\t\tawait createCards(courseID, dataShapeId, result.id, tags, elo, author);\n\t} catch (error) {\n\t\tlet errorMessage = \"Unknown error\";\n\t\tif (error instanceof Error) errorMessage = error.message;\n\t\telse if (error && typeof error === \"object\" && \"reason\" in error) errorMessage = error.reason;\n\t\telse if (error && typeof error === \"object\" && \"message\" in error) errorMessage = error.message;\n\t\telse errorMessage = String(error);\n\t\tlogger.error(`[addNote55] Failed to create cards for note ${result.id}: ${errorMessage}`);\n\t\tresult.cardCreationFailed = true;\n\t\tresult.cardCreationError = errorMessage;\n\t}\n\telse logger.error(`[addNote55] Error adding note. Result: ${JSON.stringify(result)}`);\n\treturn result;\n}\nasync function createCards(courseID, datashapeID, noteID, tags, elo = blankCourseElo(), author) {\n\tconst cfg = await getCredentialledCourseConfig(courseID);\n\tconst dsDescriptor = NameSpacer.getDataShapeDescriptor(datashapeID);\n\tlet questionViewTypes = [];\n\tfor (const ds of cfg.dataShapes) if (ds.name === datashapeID) questionViewTypes = ds.questionTypes;\n\tif (questionViewTypes.length === 0) {\n\t\tconst errorMsg = `No questionViewTypes found for datashapeID: ${datashapeID} in course config. Cards cannot be created.`;\n\t\tlogger.error(errorMsg);\n\t\tthrow new Error(errorMsg);\n\t}\n\tfor (const questionView of questionViewTypes) await createCard(questionView, courseID, dsDescriptor, noteID, tags, elo, author);\n}\nasync function createCard(questionViewName, courseID, dsDescriptor, noteID, tags, elo = blankCourseElo(), author) {\n\tconst qDescriptor = NameSpacer.getQuestionDescriptor(questionViewName);\n\tconst cfg = await getCredentialledCourseConfig(courseID);\n\tfor (const rQ of cfg.questionTypes) if (rQ.name === questionViewName) for (const view of rQ.viewList) await addCard(courseID, dsDescriptor.course, [noteID], NameSpacer.getViewString({\n\t\tcourse: qDescriptor.course,\n\t\tquestionType: qDescriptor.questionType,\n\t\tview\n\t}), elo, tags, author);\n}\n/**\n*\n* Adds a card to the DB. This function is called\n* as a side effect of adding either a View or\n* DisplayableData item.\n* @param course The name of the course that the card belongs to\n* @param id_displayable_data C/PouchDB ID of the data used to hydrate the view\n* @param id_view C/PouchDB ID of the view used to display the card\n*\n* @package\n*/\nasync function addCard(courseID, course, id_displayable_data, id_view, elo, tags, author) {\n\tconst db = getCourseDB(courseID);\n\tconst _id = `${DocTypePrefixes[DocType.CARD]}-${v4()}`;\n\tconst card = await db.put({\n\t\t_id,\n\t\tcourse,\n\t\tid_displayable_data,\n\t\tid_view,\n\t\tdocType: DocType.CARD,\n\t\telo: elo || toCourseElo(990 + Math.round(20 * Math.random())),\n\t\tauthor\n\t});\n\tfor (const tag of tags) {\n\t\tlogger.info(`adding tag: ${tag} to card ${card.id}`);\n\t\tawait addTagToCard(courseID, card.id, tag, author, false);\n\t}\n\treturn card;\n}\nasync function getCredentialledCourseConfig(courseID) {\n\ttry {\n\t\tconst ret = await getCourseDB(courseID).get(\"CourseConfig\");\n\t\tret.courseID = courseID;\n\t\tlogger.info(`Returning course config: ${JSON.stringify(ret)}`);\n\t\treturn ret;\n\t} catch (e) {\n\t\tlogger.error(`Error fetching config for ${courseID}:`, e);\n\t\tthrow e;\n\t}\n}\n/**\nAssciates a tag with a card.\n\nNB: DB stores tags as separate documents, with a list of card IDs.\nConsider renaming to `addCardToTag` to reflect this.\n\nNB: tags are created if they don't already exist\n\n@param updateELO whether to update the ELO of the card with the new tag. Default true.\n@package\n*/\nasync function addTagToCard(courseID, cardID, tagID, author, updateELO = true) {\n\tconst prefixedTagID = getTagID(tagID);\n\tconst courseDB = getCourseDB(courseID);\n\tconst courseApi = new CourseDB(courseID, async () => {\n\t\treturn BaseUser.Dummy({\n\t\t\tsetupRemoteDB: () => null,\n\t\t\tstartSync: () => {},\n\t\t\tcanCreateAccount: () => false,\n\t\t\tcanAuthenticate: () => false,\n\t\t\tgetCurrentUsername: async () => \"DummyUser\"\n\t\t});\n\t});\n\ttry {\n\t\tlogger.info(`Applying tag ${tagID} to card ${courseID + \"-\" + cardID}...`);\n\t\tconst tag = await courseDB.get(prefixedTagID);\n\t\tif (!tag.taggedCards.includes(cardID)) {\n\t\t\ttag.taggedCards.push(cardID);\n\t\t\tif (updateELO) try {\n\t\t\t\tconst elo = (await courseApi.getCardEloData([cardID]))[0];\n\t\t\t\telo.tags[tagID] = {\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tscore: elo.global.score\n\t\t\t\t};\n\t\t\t\tawait updateCardElo(courseID, cardID, elo);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Failed to update ELO data for card:\", cardID, error);\n\t\t\t}\n\t\t\treturn courseDB.put(tag);\n\t\t} else throw new AlreadyTaggedErr(`Card ${cardID} is already tagged with ${tagID}`);\n\t} catch (e) {\n\t\tif (e instanceof AlreadyTaggedErr) throw e;\n\t\tawait createTag(courseID, tagID, author);\n\t\treturn addTagToCard(courseID, cardID, tagID, author, updateELO);\n\t}\n}\nasync function updateCardElo(courseID, cardID, elo) {\n\tif (elo) {\n\t\tconst cDB = getCourseDB(courseID);\n\t\tconst card = await cDB.get(cardID);\n\t\tlogger.debug(`Replacing ${JSON.stringify(card.elo)} with ${JSON.stringify(elo)}`);\n\t\tcard.elo = elo;\n\t\treturn cDB.put(card);\n\t}\n}\nvar AlreadyTaggedErr = class extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = \"AlreadyTaggedErr\";\n\t}\n};\nfunction getTagID(tagName) {\n\tconst tagPrefix = DocType.TAG.valueOf() + \"-\";\n\tif (tagName.indexOf(tagPrefix) === 0) return tagName;\n\telse return tagPrefix + tagName;\n}\nfunction getCourseDB(courseID) {\n\tconst dbName = `coursedb-${courseID}`;\n\treturn new pouchdb_setup_default(ENV.COUCHDB_SERVER_PROTOCOL + \"://\" + ENV.COUCHDB_SERVER_URL + dbName, createPouchDBConfig());\n}\n//#endregion\nexport { addNote55, addTagToCard, getCredentialledCourseConfig, getTagID };\n\n//# sourceMappingURL=courseAPI.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../../util/logger.mjs\";\nimport { Navigators } from \"../../core/navigators/index.mjs\";\nimport { DocType, DocTypePrefixes } from \"../../core/types/types-legacy.mjs\";\nimport CourseLookup from \"./courseLookupDB.mjs\";\nimport UpdateQueue from \"./updateQueue.mjs\";\nimport { GET_CACHED } from \"./clientCache.mjs\";\nimport { createDefaultPipeline } from \"../../core/navigators/defaults.mjs\";\nimport { PipelineAssembler } from \"../../core/navigators/PipelineAssembler.mjs\";\nimport { addNote55, addTagToCard, getCredentialledCourseConfig, getTagID } from \"./courseAPI.mjs\";\nimport { filterAllDocsByPrefix, getCourseDB } from \"./index.mjs\";\nimport { EloToNumber, Status, blankCourseElo, toCourseElo } from \"@vue-skuilder/common\";\n//#region src/impl/couch/courseDB.ts\nvar CoursesDB = class {\n\t_courseIDs;\n\tconstructor(courseIDs) {\n\t\tif (courseIDs && courseIDs.length > 0) this._courseIDs = courseIDs;\n\t\telse this._courseIDs = void 0;\n\t}\n\tasync getCourseList() {\n\t\tlet crsList = await CourseLookup.allCourseWare();\n\t\tlogger.debug(`AllCourses: ${crsList.map((c) => c.name + \", \" + c._id + \"\\n\t\")}`);\n\t\tif (this._courseIDs) crsList = crsList.filter((c) => this._courseIDs.includes(c._id));\n\t\tlogger.debug(`AllCourses.filtered: ${crsList.map((c) => c.name + \", \" + c._id + \"\\n\t\")}`);\n\t\treturn (await Promise.all(crsList.map(async (c) => {\n\t\t\ttry {\n\t\t\t\tconst cfg = await getCredentialledCourseConfig(c._id);\n\t\t\t\tlogger.debug(`Found cfg: ${JSON.stringify(cfg)}`);\n\t\t\t\treturn cfg;\n\t\t\t} catch (e) {\n\t\t\t\tlogger.warn(`Error fetching cfg for course ${c.name}, ${c._id}: ${e}`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}))).filter((c) => !!c);\n\t}\n\tasync getCourseConfig(courseId) {\n\t\tif (this._courseIDs && this._courseIDs.length && !this._courseIDs.includes(courseId)) throw new Error(`Course ${courseId} not in course list`);\n\t\tconst cfg = await getCredentialledCourseConfig(courseId);\n\t\tif (cfg === void 0) throw new Error(`Error fetching cfg for course ${courseId}`);\n\t\telse return cfg;\n\t}\n\tasync disambiguateCourse(courseId, disambiguator) {\n\t\tawait CourseLookup.updateDisambiguator(courseId, disambiguator);\n\t}\n};\nfunction randIntWeightedTowardZero(n) {\n\treturn Math.floor(Math.random() * Math.random() * Math.random() * n);\n}\nvar CourseDB = class {\n\t/**\n\t* Primary database handle used for all **read** operations (queries, gets).\n\t*\n\t* When local sync is active, this points to the local PouchDB replica for\n\t* fast, network-free reads. Otherwise it points to the remote CouchDB.\n\t*/\n\tdb;\n\t/**\n\t* Remote database handle used for all **write** operations.\n\t*\n\t* Always points to the remote CouchDB so that writes (ELO updates, tag\n\t* mutations, admin operations) aggregate on the server. The local replica\n\t* is a read-only snapshot that refreshes on the next page load.\n\t*\n\t* When local sync is NOT active, this is the same instance as `this.db`.\n\t*/\n\tremoteDB;\n\tid;\n\t_getCurrentUser;\n\tupdateQueue;\n\t/**\n\t* @param id - Course ID\n\t* @param userLookup - Async function returning the current user DB\n\t* @param localDB - Optional local PouchDB replica for reads. When provided,\n\t* `this.db` uses the local replica and `this.remoteDB` stays remote.\n\t* The UpdateQueue reads from remote and writes to remote (local `_rev`\n\t* values may be stale, so read-modify-write cycles must go through\n\t* the remote DB to avoid conflicts).\n\t*/\n\tconstructor(id, userLookup, localDB) {\n\t\tthis.id = id;\n\t\tconst remote = getCourseDB(this.id);\n\t\tthis.remoteDB = remote;\n\t\tthis.db = localDB ?? remote;\n\t\tthis._getCurrentUser = userLookup;\n\t\tthis.updateQueue = new UpdateQueue(this.remoteDB, this.remoteDB);\n\t}\n\tgetCourseID() {\n\t\treturn this.id;\n\t}\n\tasync getCourseInfo() {\n\t\treturn {\n\t\t\tcardCount: (await this.db.find({\n\t\t\t\tselector: { docType: DocType.CARD },\n\t\t\t\tlimit: 1e3\n\t\t\t})).docs.length,\n\t\t\tregisteredUsers: 0\n\t\t};\n\t}\n\tasync getInexperiencedCards(limit = 2) {\n\t\treturn (await this.db.query(\"cardsByInexperience\", { limit })).rows.map((r) => {\n\t\t\treturn {\n\t\t\t\tcourseId: this.id,\n\t\t\t\tcardId: r.id,\n\t\t\t\tcount: r.key,\n\t\t\t\telo: r.value\n\t\t\t};\n\t\t});\n\t}\n\tasync getCardsByEloLimits(options = {\n\t\tlow: 0,\n\t\thigh: Number.MIN_SAFE_INTEGER,\n\t\tlimit: 25,\n\t\tpage: 0\n\t}) {\n\t\treturn (await this.db.query(\"elo\", {\n\t\t\tstartkey: options.low,\n\t\t\tendkey: options.high,\n\t\t\tlimit: options.limit,\n\t\t\tskip: options.limit * options.page\n\t\t})).rows.map((r) => {\n\t\t\treturn `${this.id}-${r.id}-${r.key}`;\n\t\t});\n\t}\n\tasync getCardEloData(id) {\n\t\tconst docs = await this.db.allDocs({\n\t\t\tkeys: id,\n\t\t\tinclude_docs: true\n\t\t});\n\t\tconst ret = [];\n\t\tdocs.rows.forEach((r) => {\n\t\t\tif (isSuccessRow(r)) if (r.doc && r.doc.elo) ret.push(toCourseElo(r.doc.elo));\n\t\t\telse {\n\t\t\t\tlogger.warn(\"no elo data for card: \" + r.id);\n\t\t\t\tret.push(blankCourseElo());\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlogger.warn(\"no elo data for card: \" + JSON.stringify(r));\n\t\t\t\tret.push(blankCourseElo());\n\t\t\t}\n\t\t});\n\t\treturn ret;\n\t}\n\t/**\n\t* Returns the lowest and highest `global` ELO ratings in the course\n\t*/\n\tasync getELOBounds() {\n\t\tconst [low, high] = await Promise.all([(await this.db.query(\"elo\", {\n\t\t\tstartkey: 0,\n\t\t\tlimit: 1,\n\t\t\tinclude_docs: false\n\t\t})).rows[0].key, (await this.db.query(\"elo\", {\n\t\t\tlimit: 1,\n\t\t\tdescending: true,\n\t\t\tstartkey: 1e5\n\t\t})).rows[0].key]);\n\t\treturn {\n\t\t\tlow,\n\t\t\thigh\n\t\t};\n\t}\n\tasync removeCard(id) {\n\t\tconst doc = await this.remoteDB.get(id);\n\t\tif (!doc.docType || !(doc.docType === DocType.CARD)) throw new Error(`failed to remove ${id} from course ${this.id}. id does not point to a card`);\n\t\ttry {\n\t\t\tconst appliedTags = await this.getAppliedTags(id);\n\t\t\t(await Promise.allSettled(appliedTags.rows.map(async (tagRow) => {\n\t\t\t\tconst tagId = tagRow.id;\n\t\t\t\tawait this.removeTagFromCard(id, tagId);\n\t\t\t}))).forEach((result, index) => {\n\t\t\t\tif (result.status === \"rejected\") {\n\t\t\t\t\tconst tagId = appliedTags.rows[index].id;\n\t\t\t\t\tlogger.error(`Failed to remove card ${id} from tag ${tagId}: ${result.reason}`);\n\t\t\t\t}\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(`Error removing card ${id} from tags: ${error}`);\n\t\t}\n\t\treturn this.remoteDB.remove(doc);\n\t}\n\tasync getCardDisplayableDataIDs(id) {\n\t\tlogger.debug(id.join(\", \"));\n\t\tconst cards = await this.db.allDocs({\n\t\t\tkeys: id,\n\t\t\tinclude_docs: true\n\t\t});\n\t\tconst ret = {};\n\t\tcards.rows.forEach((r) => {\n\t\t\tif (isSuccessRow(r)) ret[r.id] = r.doc.id_displayable_data;\n\t\t});\n\t\treturn ret;\n\t}\n\tasync getCardsByELO(elo, cardLimit) {\n\t\telo = parseInt(elo);\n\t\tconst limit = cardLimit ? cardLimit : 25;\n\t\tconst below = await this.db.query(\"elo\", {\n\t\t\tlimit: Math.ceil(limit / 2),\n\t\t\tstartkey: elo,\n\t\t\tdescending: true\n\t\t});\n\t\tconst aboveLimit = limit - below.rows.length;\n\t\tconst above = await this.db.query(\"elo\", {\n\t\t\tlimit: aboveLimit,\n\t\t\tstartkey: elo + 1\n\t\t});\n\t\tlet cards = below.rows;\n\t\tcards = cards.concat(above.rows);\n\t\tconst ret = cards.sort((a, b) => {\n\t\t\tconst s = Math.abs(a.key - elo) - Math.abs(b.key - elo);\n\t\t\tif (s === 0) return Math.random() - .5;\n\t\t\telse return s;\n\t\t}).map((c) => {\n\t\t\treturn {\n\t\t\t\tcourseID: this.id,\n\t\t\t\tcardID: c.id,\n\t\t\t\telo: c.key\n\t\t\t};\n\t\t});\n\t\tconst str = `below:\\n${below.rows.map((r) => `\\t${r.id}-${r.key}\\n`)}\n\nabove:\\n${above.rows.map((r) => `\\t${r.id}-${r.key}\\n`)}`;\n\t\tlogger.debug(`Getting ${limit} cards centered around elo: ${elo}:\\n\\n` + str);\n\t\treturn ret;\n\t}\n\tasync getCourseConfig() {\n\t\tconst ret = await getCredentialledCourseConfig(this.id);\n\t\tif (ret) return ret;\n\t\telse throw new Error(`Course config not found for course ID: ${this.id}`);\n\t}\n\tasync updateCourseConfig(cfg) {\n\t\tlogger.debug(`Updating: ${JSON.stringify(cfg)}`);\n\t\ttry {\n\t\t\treturn await updateCredentialledCourseConfig(this.id, cfg);\n\t\t} catch (error) {\n\t\t\tlogger.error(`Error updating course config in course DB: ${error}`);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync updateCardElo(cardId, elo) {\n\t\tif (!elo) throw new Error(`Cannot update card elo with null or undefined value for card ID: ${cardId}`);\n\t\ttry {\n\t\t\treturn {\n\t\t\t\tok: true,\n\t\t\t\tid: cardId,\n\t\t\t\trev: (await this.updateQueue.update(cardId, (card) => {\n\t\t\t\t\tlogger.debug(`Replacing ${JSON.stringify(card.elo)} with ${JSON.stringify(elo)}`);\n\t\t\t\t\tcard.elo = elo;\n\t\t\t\t\treturn card;\n\t\t\t\t}))._rev\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlogger.error(`Failed to update card elo for card ID: ${cardId}`, error);\n\t\t\tthrow new Error(`Failed to update card elo for card ID: ${cardId}`);\n\t\t}\n\t}\n\tasync getAppliedTags(cardId) {\n\t\tconst ret = await getAppliedTags(this.id, cardId);\n\t\tif (ret) return ret;\n\t\telse throw new Error(`Failed to find tags for card ${this.id}-${cardId}`);\n\t}\n\tasync getAppliedTagsBatch(cardIds) {\n\t\tif (cardIds.length === 0) return /* @__PURE__ */ new Map();\n\t\tconst result = await this.db.query(\"getTags\", {\n\t\t\tkeys: cardIds,\n\t\t\tinclude_docs: false\n\t\t});\n\t\tconst tagsByCard = /* @__PURE__ */ new Map();\n\t\tfor (const cardId of cardIds) tagsByCard.set(cardId, []);\n\t\tfor (const row of result.rows) {\n\t\t\tconst cardId = row.key;\n\t\t\tconst tagName = row.value?.name;\n\t\t\tif (tagName && tagsByCard.has(cardId)) tagsByCard.get(cardId).push(tagName);\n\t\t}\n\t\treturn tagsByCard;\n\t}\n\tasync getAllCardIds() {\n\t\tconst prefix = `${DocTypePrefixes[DocType.CARD]}-`;\n\t\treturn (await this.db.allDocs({\n\t\t\tstartkey: prefix,\n\t\t\tendkey: `${prefix}\\ufff0`,\n\t\t\tinclude_docs: false\n\t\t})).rows.map((row) => row.id);\n\t}\n\tasync addTagToCard(cardId, tagId, updateELO) {\n\t\treturn await addTagToCard(this.id, cardId, tagId, (await this._getCurrentUser()).getUsername(), updateELO);\n\t}\n\tasync removeTagFromCard(cardId, tagId) {\n\t\treturn await removeTagFromCard(this.id, cardId, tagId);\n\t}\n\tasync createTag(name, author) {\n\t\treturn await createTag(this.id, name, author);\n\t}\n\tasync getTag(tagId) {\n\t\treturn await getTag(this.id, tagId);\n\t}\n\tasync updateTag(tag) {\n\t\tif (tag.course !== this.id) throw new Error(`Tag ${JSON.stringify(tag)} does not belong to course ${this.id}`);\n\t\treturn await updateTag(tag);\n\t}\n\tasync getCourseTagStubs() {\n\t\treturn getCourseTagStubs(this.id);\n\t}\n\tasync addNote(codeCourse, shape, data, author, tags, uploads, elo = blankCourseElo()) {\n\t\ttry {\n\t\t\tconst resp = await addNote55(this.id, codeCourse, shape, data, author, tags, uploads, elo);\n\t\t\tif (resp.ok) {\n\t\t\t\tif (resp.cardCreationFailed) {\n\t\t\t\t\tlogger.warn(`[courseDB.addNote] Note added but card creation failed: ${resp.cardCreationError}`);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: Status.error,\n\t\t\t\t\t\tmessage: `Note was added but no cards were created: ${resp.cardCreationError}`,\n\t\t\t\t\t\tid: resp.id\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tstatus: Status.ok,\n\t\t\t\t\tmessage: \"\",\n\t\t\t\t\tid: resp.id\n\t\t\t\t};\n\t\t\t} else return {\n\t\t\t\tstatus: Status.error,\n\t\t\t\tmessage: \"Unexpected error adding note\"\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tconst err = e;\n\t\t\tlogger.error(`[addNote] error ${err.name}\\n\\treason: ${err.reason}\\n\\tmessage: ${err.message}`);\n\t\t\treturn {\n\t\t\t\tstatus: Status.error,\n\t\t\t\tmessage: `Error adding note to course. ${e.reason || err.message}`\n\t\t\t};\n\t\t}\n\t}\n\tasync getCourseDoc(id, options) {\n\t\treturn await this.db.get(id, options ?? {});\n\t}\n\tasync getCourseDocs(ids, options = {}) {\n\t\treturn await this.db.allDocs({\n\t\t\t...options,\n\t\t\tkeys: ids\n\t\t});\n\t}\n\tgetNavigationStrategy(id) {\n\t\tlogger.debug(`[courseDB] Getting navigation strategy: ${id}`);\n\t\tif (id == \"\") {\n\t\t\tconst strategy = {\n\t\t\t\t_id: \"NAVIGATION_STRATEGY-ELO\",\n\t\t\t\tdocType: DocType.NAVIGATION_STRATEGY,\n\t\t\t\tname: \"ELO\",\n\t\t\t\tdescription: \"ELO-based navigation strategy for ordering content by difficulty\",\n\t\t\t\timplementingClass: Navigators.ELO,\n\t\t\t\tcourse: this.id,\n\t\t\t\tserializedData: \"\"\n\t\t\t};\n\t\t\treturn Promise.resolve(strategy);\n\t\t} else return this.db.get(id);\n\t}\n\tasync getAllNavigationStrategies() {\n\t\tconst prefix = DocTypePrefixes[DocType.NAVIGATION_STRATEGY];\n\t\treturn (await this.db.allDocs({\n\t\t\tstartkey: prefix,\n\t\t\tendkey: `${prefix}\\ufff0`,\n\t\t\tinclude_docs: true\n\t\t})).rows.map((row) => row.doc);\n\t}\n\tasync addNavigationStrategy(data) {\n\t\tlogger.debug(`[courseDB] Adding navigation strategy: ${data._id}`);\n\t\tthis.invalidateNavigatorCache();\n\t\treturn this.remoteDB.put(data).then(() => {});\n\t}\n\tupdateNavigationStrategy(id, data) {\n\t\tlogger.debug(`[courseDB] Updating navigation strategy: ${id}`);\n\t\tlogger.debug(JSON.stringify(data));\n\t\treturn Promise.resolve();\n\t}\n\t/**\n\t* Creates an instantiated navigator for this course.\n\t*\n\t* Handles multiple generators by wrapping them in CompositeGenerator.\n\t* This is the preferred method for getting a ready-to-use navigator.\n\t*\n\t* @param user - User database interface\n\t* @returns Instantiated ContentNavigator ready for use\n\t*/\n\tasync createNavigator(user) {\n\t\ttry {\n\t\t\tconst allStrategies = await this.getAllNavigationStrategies();\n\t\t\tif (allStrategies.length === 0) {\n\t\t\t\tlogger.debug(\"[courseDB] No strategy documents found, using default Pipeline(Composite(ELO, SRS), [eloDistanceFilter])\");\n\t\t\t\treturn createDefaultPipeline(user, this);\n\t\t\t}\n\t\t\tconst { pipeline, generatorStrategies, filterStrategies, warnings } = await new PipelineAssembler().assemble({\n\t\t\t\tstrategies: allStrategies,\n\t\t\t\tuser,\n\t\t\t\tcourse: this\n\t\t\t});\n\t\t\tfor (const warning of warnings) logger.warn(`[PipelineAssembler] ${warning}`);\n\t\t\tif (!pipeline) {\n\t\t\t\tlogger.debug(\"[courseDB] Pipeline assembly failed, using default pipeline\");\n\t\t\t\treturn createDefaultPipeline(user, this);\n\t\t\t}\n\t\t\tlogger.debug(`[courseDB] Using assembled pipeline with ${generatorStrategies.length} generator(s) and ${filterStrategies.length} filter(s)`);\n\t\t\treturn pipeline;\n\t\t} catch (e) {\n\t\t\tconst msg = e instanceof Error ? `${e.message}\\n${e.stack}` : JSON.stringify(e);\n\t\t\tlogger.error(`[courseDB] Error creating navigator: ${msg}`);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t/**\n\t* Get cards with suitability scores for presentation.\n\t*\n\t* This is the PRIMARY API for content sources going forward. Delegates to the\n\t* course's configured NavigationStrategy to get scored candidates.\n\t*\n\t* @param limit - Maximum number of cards to return\n\t* @returns Cards sorted by score descending\n\t*/\n\t_pendingHints = null;\n\t/**\n\t* Session-scoped cache of the broad ELO-neighbor pool used by\n\t* getCardsCenteredAtELO. The `elo` view query re-indexes on first touch per\n\t* call (PouchDB 9 ignores `stale`), so without this each plan/replan pays\n\t* ~1.5-2s. The pool is fetched once and re-ranked against the live (roaming)\n\t* ELO in memory on subsequent calls.\n\t*/\n\t_eloPoolCache = null;\n\t_eloPoolTtlMs = 300 * 1e3;\n\t/**\n\t* How far the target may move from the pool's centre before the pool is\n\t* refetched. Well above a learner's in-session roam; a different learner (or\n\t* a far-off explicit ELO) on the same CourseDB gets a pool of their own.\n\t*/\n\t_eloPoolMaxDrift = 200;\n\t/**\n\t* Cached assembled navigator (Pipeline). createNavigator() reads strategy\n\t* docs and builds a fresh Pipeline every call — whose internal `_tagCache`\n\t* and `_cachedOrchestration` are designed to make replans cheap but never\n\t* survive, because the instance is discarded each run. Caching it lets those\n\t* caches persist across plan/replan within a session (SessionController holds\n\t* one CourseDB instance for the session's lifetime). Rebuilt on user change,\n\t* TTL expiry, or explicit invalidation after a strategy-doc write.\n\t*/\n\t_cachedNavigator = null;\n\t_navigatorTtlMs = 300 * 1e3;\n\tsetEphemeralHints(hints) {\n\t\tthis._pendingHints = hints;\n\t}\n\t/**\n\t* Forward a presentation to the navigator (a new card restarts its intake\n\t* clock). Builds the navigator if the cached one has expired.\n\t*/\n\tnotePresented(card) {\n\t\tif (card.status !== \"new\") return;\n\t\tthis._getCurrentUser().then((u) => this._getCachedNavigator(u)).then(({ navigator }) => navigator.notePresented?.(card)).catch((e) => logger.warn(`[courseDB] Could not note a presentation: ${e}`));\n\t}\n\tasync getWeightedCards(limit) {\n\t\tconst u = await this._getCurrentUser();\n\t\ttry {\n\t\t\tconst { navigator } = await this._getCachedNavigator(u);\n\t\t\tif (this._pendingHints) {\n\t\t\t\tnavigator.setEphemeralHints(this._pendingHints);\n\t\t\t\tthis._pendingHints = null;\n\t\t\t}\n\t\t\treturn await navigator.getWeightedCards(limit);\n\t\t} catch (e) {\n\t\t\tlogger.error(`[courseDB] Error getting weighted cards: ${e}`);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t/**\n\t* Return the assembled navigator, reusing the cached instance when possible.\n\t* Reuse preserves the Pipeline's per-session caches (tags, orchestration\n\t* context) across replans, which is the dominant per-replan cost once the\n\t* ELO-pool cost is removed. Rebuilds on user change or TTL expiry.\n\t*/\n\tasync _getCachedNavigator(user) {\n\t\tconst userId = user.getUsername();\n\t\tconst now = Date.now();\n\t\tif (this._cachedNavigator && this._cachedNavigator.userId === userId && now - this._cachedNavigator.builtAt < this._navigatorTtlMs) return {\n\t\t\tnavigator: this._cachedNavigator.navigator,\n\t\t\tcacheStatus: \"hit\"\n\t\t};\n\t\tconst navigator = await this.createNavigator(user);\n\t\tthis._cachedNavigator = {\n\t\t\tnavigator,\n\t\t\tuserId,\n\t\t\tbuiltAt: now\n\t\t};\n\t\treturn {\n\t\t\tnavigator,\n\t\t\tcacheStatus: \"miss\"\n\t\t};\n\t}\n\t/**\n\t* Drop the cached navigator so the next getWeightedCards() rebuilds it.\n\t* Call after mutating this course's navigation strategy documents.\n\t*/\n\tinvalidateNavigatorCache() {\n\t\tthis._cachedNavigator = null;\n\t}\n\tasync getCardsCenteredAtELO(options = {\n\t\tlimit: 99,\n\t\telo: \"user\"\n\t}, filter) {\n\t\tlet targetElo;\n\t\tif (options.elo === \"user\") {\n\t\t\tconst u = await this._getCurrentUser();\n\t\t\ttargetElo = -1;\n\t\t\ttry {\n\t\t\t\ttargetElo = EloToNumber((await u.getCourseRegistrationsDoc()).courses.find((c) => {\n\t\t\t\t\treturn c.courseID === this.id;\n\t\t\t\t}).elo);\n\t\t\t} catch {\n\t\t\t\ttargetElo = 1e3;\n\t\t\t}\n\t\t} else if (options.elo === \"random\") {\n\t\t\tconst bounds = await GET_CACHED(`elo-bounds-${this.id}`, () => this.getELOBounds());\n\t\t\ttargetElo = Math.round(bounds.low + Math.random() * (bounds.high - bounds.low));\n\t\t} else targetElo = options.elo;\n\t\tconst POOL_SIZE = Math.max(2e3, options.limit * 4);\n\t\tconst nowMs = Date.now();\n\t\tlet cacheStatus = \"hit\";\n\t\tif (!this._eloPoolCache || nowMs - this._eloPoolCache.fetchedAt > this._eloPoolTtlMs || Math.abs(targetElo - this._eloPoolCache.centerElo) > this._eloPoolMaxDrift) {\n\t\t\tconst fetched = await this.getCardsByELO(targetElo, POOL_SIZE);\n\t\t\tif (fetched.length > 0) this._eloPoolCache = {\n\t\t\t\trows: fetched,\n\t\t\t\tfetchedAt: nowMs,\n\t\t\t\tcenterElo: targetElo\n\t\t\t};\n\t\t\tcacheStatus = \"miss\";\n\t\t}\n\t\tconst rankAgainstCurrentElo = () => {\n\t\t\tconst raw = this._eloPoolCache?.rows ?? [];\n\t\t\treturn (filter ? raw.filter((c) => filter(c)) : raw).map((c) => ({ ...c })).sort((a, b) => Math.abs((a.elo ?? targetElo) - targetElo) - Math.abs((b.elo ?? targetElo) - targetElo));\n\t\t};\n\t\tlet cards = rankAgainstCurrentElo();\n\t\tif (cards.length < options.limit && (cacheStatus === \"hit\" || !this._eloPoolCache)) {\n\t\t\tconst fetched = await this.getCardsByELO(targetElo, POOL_SIZE);\n\t\t\tif (fetched.length > 0) this._eloPoolCache = {\n\t\t\t\trows: fetched,\n\t\t\t\tfetchedAt: nowMs,\n\t\t\t\tcenterElo: targetElo\n\t\t\t};\n\t\t\tcards = rankAgainstCurrentElo();\n\t\t\tcacheStatus = \"refresh\";\n\t\t}\n\t\tconst selectedCards = [];\n\t\twhile (selectedCards.length < options.limit && cards.length > 0) {\n\t\t\tconst index = randIntWeightedTowardZero(cards.length);\n\t\t\tconst card = cards.splice(index, 1)[0];\n\t\t\tselectedCards.push(card);\n\t\t}\n\t\treturn selectedCards.map((c) => {\n\t\t\treturn {\n\t\t\t\tcourseID: this.id,\n\t\t\t\tcardID: c.cardID,\n\t\t\t\tcontentSourceType: \"course\",\n\t\t\t\tcontentSourceID: this.id,\n\t\t\t\telo: c.elo,\n\t\t\t\tstatus: \"new\"\n\t\t\t};\n\t\t});\n\t}\n\tasync searchCards(query) {\n\t\tlogger.log(`[CourseDB ${this.id}] Searching for: \"${query}\"`);\n\t\tlet displayableData;\n\t\ttry {\n\t\t\tdisplayableData = await this.db.find({ selector: {\n\t\t\t\tdocType: \"DISPLAYABLE_DATA\",\n\t\t\t\t\"data.0.data\": { $regex: `.*${query}.*` }\n\t\t\t} });\n\t\t\tlogger.log(`[CourseDB ${this.id}] Regex search on data[0].data successful`);\n\t\t} catch (regexError) {\n\t\t\tlogger.log(`[CourseDB ${this.id}] Regex search failed, falling back to manual search:`, regexError);\n\t\t\tconst allDisplayable = await this.db.find({ selector: { docType: \"DISPLAYABLE_DATA\" } });\n\t\t\tlogger.log(`[CourseDB ${this.id}] Retrieved ${allDisplayable.docs.length} documents for manual filtering`);\n\t\t\tdisplayableData = { docs: allDisplayable.docs.filter((doc) => {\n\t\t\t\tconst match = JSON.stringify(doc).toLowerCase().includes(query.toLowerCase());\n\t\t\t\tif (match) logger.log(`[CourseDB ${this.id}] Manual match found in document: ${doc._id}`);\n\t\t\t\treturn match;\n\t\t\t}) };\n\t\t}\n\t\tlogger.log(`[CourseDB ${this.id}] Found ${displayableData.docs.length} displayable data documents`);\n\t\tif (displayableData.docs.length === 0) {\n\t\t\tconst allDisplayableData = await this.db.find({\n\t\t\t\tselector: { docType: \"DISPLAYABLE_DATA\" },\n\t\t\t\tlimit: 5\n\t\t\t});\n\t\t\tlogger.log(`[CourseDB ${this.id}] Sample displayable data:`, allDisplayableData.docs.map((d) => ({\n\t\t\t\tid: d._id,\n\t\t\t\tdocType: d.docType,\n\t\t\t\tdataStructure: d.data ? Object.keys(d.data) : \"no data field\",\n\t\t\t\tdataContent: d.data,\n\t\t\t\tfullDoc: d\n\t\t\t})));\n\t\t}\n\t\tconst allResults = [];\n\t\tfor (const dd of displayableData.docs) {\n\t\t\tconst cards = await this.db.find({ selector: {\n\t\t\t\tdocType: \"CARD\",\n\t\t\t\tid_displayable_data: { $in: [dd._id] }\n\t\t\t} });\n\t\t\tlogger.log(`[CourseDB ${this.id}] Displayable data ${dd._id} linked to ${cards.docs.length} cards`);\n\t\t\tallResults.push(...cards.docs);\n\t\t}\n\t\tlogger.log(`[CourseDB ${this.id}] Total cards found: ${allResults.length}`);\n\t\treturn allResults;\n\t}\n\tasync find(request) {\n\t\treturn this.db.find(request);\n\t}\n};\n/**\n* Returns a list of registered datashapes for the specified\n* course.\n* @param courseID The ID of the course\n*/\nasync function getCourseDataShapes(courseID) {\n\treturn (await getCredentialledCourseConfig(courseID)).dataShapes;\n}\nasync function getCredentialledDataShapes(courseID) {\n\treturn (await getCredentialledCourseConfig(courseID)).dataShapes;\n}\nasync function getCourseQuestionTypes(courseID) {\n\treturn (await getCredentialledCourseConfig(courseID)).questionTypes;\n}\nasync function getCourseTagStubs(courseID) {\n\tlogger.debug(`Getting tag stubs for course: ${courseID}`);\n\tconst stubs = await filterAllDocsByPrefix(getCourseDB(courseID), DocType.TAG.valueOf() + \"-\");\n\tstubs.rows.forEach((row) => {\n\t\tlogger.debug(`\\tTag stub for doc: ${row.id}`);\n\t});\n\treturn stubs;\n}\nasync function deleteTag(courseID, tagName) {\n\ttagName = getTagID(tagName);\n\tconst courseDB = getCourseDB(courseID);\n\tconst doc = await courseDB.get(DocType.TAG.valueOf() + \"-\" + tagName);\n\treturn await courseDB.remove(doc);\n}\nasync function createTag(courseID, tagName, author) {\n\tlogger.debug(`Creating tag: ${tagName}...`);\n\tconst tagID = getTagID(tagName);\n\treturn await getCourseDB(courseID).put({\n\t\tcourse: courseID,\n\t\tdocType: DocType.TAG,\n\t\tname: tagName,\n\t\tsnippet: \"\",\n\t\ttaggedCards: [],\n\t\twiki: \"\",\n\t\tauthor,\n\t\t_id: tagID\n\t});\n}\nasync function updateTag(tag) {\n\tconst prior = await getTag(tag.course, tag.name);\n\treturn await getCourseDB(tag.course).put({\n\t\t...tag,\n\t\t_rev: prior._rev\n\t});\n}\nasync function getTag(courseID, tagName) {\n\tconst tagID = getTagID(tagName);\n\treturn getCourseDB(courseID).get(tagID);\n}\nasync function removeTagFromCard(courseID, cardID, tagID) {\n\ttagID = getTagID(tagID);\n\tconst courseDB = getCourseDB(courseID);\n\tconst tag = await courseDB.get(tagID);\n\ttag.taggedCards = tag.taggedCards.filter((taggedID) => {\n\t\treturn cardID !== taggedID;\n\t});\n\treturn courseDB.put(tag);\n}\n/**\n* Returns an array of ancestor tag IDs, where:\n* return[0] = parent,\n* return[1] = grandparent,\n* return[2] = great grandparent,\n* etc.\n*\n* If ret is empty, the tag itself is a root\n*/\nfunction getAncestorTagIDs(courseID, tagID) {\n\ttagID = getTagID(tagID);\n\tconst split = tagID.split(\">\");\n\tif (split.length === 1) return [];\n\telse {\n\t\tsplit.pop();\n\t\tconst parent = split.join(\">\");\n\t\treturn [parent].concat(getAncestorTagIDs(courseID, parent));\n\t}\n}\nasync function getChildTagStubs(courseID, tagID) {\n\treturn await filterAllDocsByPrefix(getCourseDB(courseID), tagID + \">\");\n}\nasync function getAppliedTags(id_course, id_card) {\n\treturn await getCourseDB(id_course).query(\"getTags\", {\n\t\tstartkey: id_card,\n\t\tendkey: id_card\n\t});\n}\nasync function updateCardElo(courseID, cardID, elo) {\n\tif (elo) {\n\t\tconst cDB = getCourseDB(courseID);\n\t\tconst card = await cDB.get(cardID);\n\t\tlogger.debug(`Replacing ${JSON.stringify(card.elo)} with ${JSON.stringify(elo)}`);\n\t\tcard.elo = elo;\n\t\treturn cDB.put(card);\n\t}\n}\nasync function updateCredentialledCourseConfig(courseID, config) {\n\tlogger.debug(`Updating course config:\n\n${JSON.stringify(config)}\n`);\n\tconst db = getCourseDB(courseID);\n\tconst old = await getCredentialledCourseConfig(courseID);\n\treturn await db.put({\n\t\t...config,\n\t\t_rev: old._rev\n\t});\n}\nfunction isSuccessRow(row) {\n\treturn \"doc\" in row && row.doc !== null && row.doc !== void 0;\n}\n//#endregion\nexport { CourseDB, CoursesDB, createTag, deleteTag, getAncestorTagIDs, getAppliedTags, getChildTagStubs, getCourseDataShapes, getCourseQuestionTypes, getCourseTagStubs, getCredentialledDataShapes, getTag, removeTagFromCard, updateCardElo, updateCredentialledCourseConfig, updateTag };\n\n//# sourceMappingURL=courseDB.mjs.map","import \"../_virtual/_rolldown/runtime.mjs\";\nimport { logger } from \"../util/logger.mjs\";\nimport { getTag } from \"../impl/couch/courseDB.mjs\";\nimport { hasActiveFilter } from \"@vue-skuilder/common\";\n//#region src/study/TagFilteredContentSource.ts\n/**\n* A StudyContentSource that filters cards based on tag inclusion/exclusion.\n*\n* This enables ephemeral, tag-scoped study sessions where users can focus\n* on specific topics within a course without permanent configuration.\n*\n* Filter logic:\n* - If `include` is non-empty: card must have at least one of the included tags\n* - If `exclude` is non-empty: card must not have any of the excluded tags\n* - Both filters are applied (include first, then exclude)\n*/\nvar TagFilteredContentSource = class {\n\tcourseId;\n\tfilter;\n\tuser;\n\tresolvedCardIds = null;\n\tconstructor(courseId, filter, user) {\n\t\tthis.courseId = courseId;\n\t\tthis.filter = filter;\n\t\tthis.user = user;\n\t\tlogger.info(`[TagFilteredContentSource] Created for course \"${courseId}\" with filter:`, JSON.stringify(filter));\n\t}\n\t/**\n\t* Resolves the TagFilter to a set of eligible card IDs.\n\t*\n\t* - Cards in `include` tags are OR'd together (card needs at least one)\n\t* - Cards in `exclude` tags are removed from the result\n\t*/\n\tasync resolveFilteredCardIds() {\n\t\tif (this.resolvedCardIds !== null) return this.resolvedCardIds;\n\t\tconst includedCardIds = /* @__PURE__ */ new Set();\n\t\tif (this.filter.include.length > 0) for (const tagName of this.filter.include) try {\n\t\t\t(await getTag(this.courseId, tagName)).taggedCards.forEach((cardId) => includedCardIds.add(cardId));\n\t\t} catch (error) {\n\t\t\tlogger.warn(`[TagFilteredContentSource] Could not resolve tag \"${tagName}\" for inclusion:`, error);\n\t\t}\n\t\tif (includedCardIds.size === 0 && this.filter.include.length > 0) {\n\t\t\tlogger.warn(`[TagFilteredContentSource] No cards found for include tags: ${this.filter.include.join(\", \")}`);\n\t\t\tthis.resolvedCardIds = /* @__PURE__ */ new Set();\n\t\t\treturn this.resolvedCardIds;\n\t\t}\n\t\tconst excludedCardIds = /* @__PURE__ */ new Set();\n\t\tif (this.filter.exclude.length > 0) for (const tagName of this.filter.exclude) try {\n\t\t\t(await getTag(this.courseId, tagName)).taggedCards.forEach((cardId) => excludedCardIds.add(cardId));\n\t\t} catch (error) {\n\t\t\tlogger.warn(`[TagFilteredContentSource] Could not resolve tag \"${tagName}\" for exclusion:`, error);\n\t\t}\n\t\tconst finalCardIds = /* @__PURE__ */ new Set();\n\t\tfor (const cardId of includedCardIds) if (!excludedCardIds.has(cardId)) finalCardIds.add(cardId);\n\t\tlogger.info(`[TagFilteredContentSource] Resolved ${finalCardIds.size} cards (included: ${includedCardIds.size}, excluded: ${excludedCardIds.size})`);\n\t\tthis.resolvedCardIds = finalCardIds;\n\t\treturn finalCardIds;\n\t}\n\t/**\n\t* Get cards with suitability scores for presentation.\n\t*\n\t* Filters cards by tag inclusion/exclusion and assigns score=1.0 to all.\n\t* TagFilteredContentSource does not currently support pluggable navigation\n\t* strategies - it returns flat-scored candidates.\n\t*\n\t* @param limit - Maximum number of cards to return\n\t* @returns Cards sorted by score descending (all scores = 1.0)\n\t*/\n\tasync getWeightedCards(limit) {\n\t\tif (!hasActiveFilter(this.filter)) {\n\t\t\tlogger.warn(\"[TagFilteredContentSource] getWeightedCards called with no active filter\");\n\t\t\treturn { cards: [] };\n\t\t}\n\t\tconst eligibleCardIds = await this.resolveFilteredCardIds();\n\t\tconst activeCards = await this.user.getActiveCards();\n\t\tconst activeCardIds = new Set(activeCards.map((c) => c.cardID));\n\t\tconst newCardWeighted = [];\n\t\tfor (const cardId of eligibleCardIds) {\n\t\t\tif (!activeCardIds.has(cardId)) newCardWeighted.push({\n\t\t\t\tcardId,\n\t\t\t\tcourseId: this.courseId,\n\t\t\t\tscore: 1,\n\t\t\t\tprovenance: [{\n\t\t\t\t\tstrategy: \"tagFilter\",\n\t\t\t\t\tstrategyName: \"Tag Filter\",\n\t\t\t\t\tstrategyId: \"TAG_FILTER\",\n\t\t\t\t\taction: \"generated\",\n\t\t\t\t\tscore: 1,\n\t\t\t\t\treason: `Tag-filtered new card (tags: ${this.filter.include.join(\", \")})`\n\t\t\t\t}]\n\t\t\t});\n\t\t\tif (newCardWeighted.length >= limit) break;\n\t\t}\n\t\tlogger.info(`[TagFilteredContentSource] Found ${newCardWeighted.length} new cards matching filter`);\n\t\tconst allReviews = await this.user.getPendingReviews(this.courseId);\n\t\tconst filteredReviews = allReviews.filter((review) => eligibleCardIds.has(review.cardId));\n\t\tlogger.info(`[TagFilteredContentSource] Found ${filteredReviews.length} pending reviews matching filter (of ${allReviews.length} total)`);\n\t\treturn { cards: [...filteredReviews.map((r) => ({\n\t\t\tcardId: r.cardId,\n\t\t\tcourseId: r.courseId,\n\t\t\tscore: 1,\n\t\t\treviewID: r._id,\n\t\t\tprovenance: [{\n\t\t\t\tstrategy: \"tagFilter\",\n\t\t\t\tstrategyName: \"Tag Filter\",\n\t\t\t\tstrategyId: \"TAG_FILTER\",\n\t\t\t\taction: \"generated\",\n\t\t\t\tscore: 1,\n\t\t\t\treason: `Tag-filtered review (tags: ${this.filter.include.join(\", \")})`\n\t\t\t}]\n\t\t})), ...newCardWeighted].slice(0, limit) };\n\t}\n\t/**\n\t* Clears the cached resolved card IDs.\n\t* Call this if the underlying tag data may have changed during a session.\n\t*/\n\tclearCache() {\n\t\tthis.resolvedCardIds = null;\n\t}\n\t/**\n\t* Returns the course ID this source is filtering.\n\t*/\n\tgetCourseId() {\n\t\treturn this.courseId;\n\t}\n\t/**\n\t* Returns the active tag filter.\n\t*/\n\tgetFilter() {\n\t\treturn this.filter;\n\t}\n};\n//#endregion\nexport { TagFilteredContentSource };\n\n//# sourceMappingURL=TagFilteredContentSource.mjs.map","import \"../../_virtual/_rolldown/runtime.mjs\";\nimport { getDataLayer } from \"../../factory.mjs\";\nimport { TagFilteredContentSource } from \"../../study/TagFilteredContentSource.mjs\";\nimport { StudentClassroomDB } from \"../../impl/couch/classroomDB.mjs\";\nimport { hasActiveFilter } from \"@vue-skuilder/common\";\n//#region src/core/interfaces/contentSource.ts\nfunction isReview(item) {\n\treturn item.status === \"review\" || item.status === \"failed-review\" || \"reviewID\" in item;\n}\nasync function getStudySource(source, user) {\n\tif (source.type === \"classroom\") return await StudentClassroomDB.factory(source.id, user);\n\telse {\n\t\tif (hasActiveFilter(source.tagFilter)) return new TagFilteredContentSource(source.id, source.tagFilter, user);\n\t\treturn getDataLayer().getCourseDB(source.id);\n\t}\n}\n//#endregion\nexport { getStudySource, isReview };\n\n//# sourceMappingURL=contentSource.mjs.map"],"x_google_ignoreList":[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,54,58,59,60,61],"mappings":"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"}
|