From d89783a205a0435330f489675d843378ee5af246 Mon Sep 17 00:00:00 2001 From: Hannes Moser Date: Wed, 16 Oct 2024 14:54:18 +0200 Subject: [PATCH] Hannes tries different build --- dist/cjs/change-event-buffer.js.map | 2 +- dist/cjs/doc-cache.js.map | 2 +- dist/cjs/incremental-write.js.map | 2 +- dist/cjs/plugins/attachments/index.js.map | 2 +- dist/cjs/plugins/backup/index.js.map | 2 +- dist/cjs/plugins/migration-schema/rx-migration-state.js.map | 2 +- dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js | 2 -- .../plugins/query-builder/mquery/nosql-query-builder.js.map | 2 +- dist/cjs/plugins/replication-graphql/index.js.map | 2 +- dist/cjs/plugins/replication-webrtc/index.js.map | 2 +- dist/cjs/plugins/replication/index.js.map | 2 +- dist/cjs/plugins/state/rx-state.js.map | 2 +- dist/cjs/plugins/storage-denokv/index.js.map | 2 +- .../plugins/storage-denokv/rx-storage-instance-denokv.js.map | 2 +- dist/cjs/plugins/storage-dexie/rx-storage-dexie.js.map | 2 +- .../plugins/storage-dexie/rx-storage-instance-dexie.js.map | 2 +- .../rx-storage-instance-foundationdb.js.map | 2 +- dist/cjs/plugins/storage-lokijs/loki-save-queue.js.map | 2 +- dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js | 2 -- .../plugins/storage-lokijs/rx-storage-instance-loki.js.map | 2 +- dist/cjs/plugins/storage-lokijs/rx-storage-lokijs.js.map | 2 +- dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js | 2 -- .../plugins/storage-memory/rx-storage-instance-memory.js.map | 2 +- .../plugins/storage-mongodb/rx-storage-instance-mongodb.js | 2 -- .../storage-mongodb/rx-storage-instance-mongodb.js.map | 2 +- dist/cjs/plugins/storage-mongodb/rx-storage-mongodb.js.map | 2 +- dist/cjs/plugins/storage-remote/rx-storage-remote.js.map | 2 +- dist/cjs/query-cache.js.map | 2 +- dist/cjs/rx-collection.js.map | 2 +- dist/cjs/rx-database.js.map | 2 +- dist/cjs/rx-error.js | 4 ++-- dist/cjs/rx-error.js.map | 2 +- dist/cjs/rx-query.js.map | 2 +- dist/cjs/rx-schema.js.map | 2 +- dist/esm/change-event-buffer.js.map | 2 +- dist/esm/doc-cache.js.map | 2 +- dist/esm/incremental-write.js.map | 2 +- dist/esm/plugins/attachments/index.js.map | 2 +- dist/esm/plugins/backup/index.js.map | 2 +- dist/esm/plugins/migration-schema/rx-migration-state.js.map | 2 +- dist/esm/plugins/query-builder/mquery/nosql-query-builder.js | 1 - .../plugins/query-builder/mquery/nosql-query-builder.js.map | 2 +- dist/esm/plugins/replication-graphql/index.js.map | 2 +- dist/esm/plugins/replication-webrtc/index.js.map | 2 +- dist/esm/plugins/replication/index.js.map | 2 +- dist/esm/plugins/state/rx-state.js.map | 2 +- dist/esm/plugins/storage-denokv/index.js.map | 2 +- .../plugins/storage-denokv/rx-storage-instance-denokv.js.map | 2 +- dist/esm/plugins/storage-dexie/rx-storage-dexie.js.map | 2 +- .../plugins/storage-dexie/rx-storage-instance-dexie.js.map | 2 +- .../rx-storage-instance-foundationdb.js.map | 2 +- dist/esm/plugins/storage-lokijs/loki-save-queue.js.map | 2 +- dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js | 1 - .../plugins/storage-lokijs/rx-storage-instance-loki.js.map | 2 +- dist/esm/plugins/storage-lokijs/rx-storage-lokijs.js.map | 2 +- dist/esm/plugins/storage-memory/rx-storage-instance-memory.js | 1 - .../plugins/storage-memory/rx-storage-instance-memory.js.map | 2 +- .../plugins/storage-mongodb/rx-storage-instance-mongodb.js | 1 - .../storage-mongodb/rx-storage-instance-mongodb.js.map | 2 +- dist/esm/plugins/storage-mongodb/rx-storage-mongodb.js.map | 2 +- dist/esm/plugins/storage-remote/rx-storage-remote.js.map | 2 +- dist/esm/query-cache.js.map | 2 +- dist/esm/rx-collection.js.map | 2 +- dist/esm/rx-database.js.map | 2 +- dist/esm/rx-error.js | 4 ++-- dist/esm/rx-error.js.map | 2 +- dist/esm/rx-query.js.map | 2 +- dist/esm/rx-schema.js.map | 2 +- examples/vite-vanilla-ts/package.json | 1 + 69 files changed, 63 insertions(+), 74 deletions(-) diff --git a/dist/cjs/change-event-buffer.js.map b/dist/cjs/change-event-buffer.js.map index 3455b8cba9c..8afab5ef72f 100644 --- a/dist/cjs/change-event-buffer.js.map +++ b/dist/cjs/change-event-buffer.js.map @@ -1 +1 @@ -{"version":3,"file":"change-event-buffer.js","names":["_operators","require","_index","ChangeEventBuffer","exports","collection","subs","counter","eventCounterMap","WeakMap","buffer","limit","tasks","Set","push","database","eventBulks$","pipe","filter","changeEventBulk","collectionName","name","bulk","first","events","isLocal","subscribe","eventBulk","add","_handleChangeEvents","size","requestIdlePromiseNoQueue","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","counterBefore","length","slice","appendToArray","counterBase","index","event","set","getCounter","getBuffer","getArrayIndexByPointer","pointer","oldestEvent","oldestCounter","get","rest","getFrom","ret","currentIndex","nextEvent","runFrom","fn","Error","cE","reduceByLastOfDoc","changeEvents","docEventMap","changeEvent","documentId","Object","values","destroy","sub","unsubscribe","createChangeEventBuffer"],"sources":["../../src/change-event-buffer.ts"],"sourcesContent":["/**\n * a buffer-cache which holds the last X changeEvents of the collection\n */\nimport {\n Subscription\n} from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type {\n RxChangeEvent,\n RxCollection\n} from './types/index.d.ts';\nimport { appendToArray, requestIdlePromiseNoQueue } from './plugins/utils/index.ts';\n\n/**\n * This buffer rembemers previous change events\n * so that queries can use them on .exec()\n * to calculate the new result set via event-reduce instead\n * of running the query against the storage.\n */\nexport class ChangeEventBuffer {\n /**\n * These properties are private to ensure they cannot\n * be read without first processing the lazy tasks.\n */\n private subs: Subscription[] = [];\n public counter: number = 0;\n private eventCounterMap: WeakMap<\n RxChangeEvent, number\n > = new WeakMap();\n /**\n * array with changeEvents\n * starts with oldest known event, ends with newest\n */\n private buffer: RxChangeEvent[] = [];\n\n public limit: number = 100;\n\n\n\n private tasks = new Set();\n\n constructor(\n public collection: RxCollection\n ) {\n this.subs.push(\n this.collection.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.collection.name),\n filter(bulk => {\n const first = bulk.events[0];\n return !first.isLocal;\n })\n ).subscribe(eventBulk => {\n this.tasks.add(() => this._handleChangeEvents(eventBulk.events));\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n })\n );\n }\n\n private processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n private _handleChangeEvents(events: RxChangeEvent[]) {\n const counterBefore = this.counter;\n this.counter = this.counter + events.length;\n if (events.length > this.limit) {\n this.buffer = events.slice(events.length * -1);\n } else {\n appendToArray(this.buffer, events);\n this.buffer = this.buffer.slice(this.limit * -1);\n }\n const counterBase = counterBefore + 1;\n const eventCounterMap = this.eventCounterMap;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n eventCounterMap.set(event, counterBase + index);\n }\n }\n\n getCounter() {\n this.processTasks();\n return this.counter;\n }\n getBuffer() {\n this.processTasks();\n return this.buffer;\n }\n\n /**\n * gets the array-index for the given pointer\n * @return arrayIndex which can be used to iterate from there. If null, pointer is out of lower bound\n */\n getArrayIndexByPointer(pointer: number): number | null {\n this.processTasks();\n const oldestEvent = this.buffer[0];\n const oldestCounter = this.eventCounterMap.get(\n oldestEvent\n ) as number;\n\n if (pointer < oldestCounter)\n return null; // out of bounds\n\n const rest = pointer - oldestCounter;\n return rest;\n }\n\n /**\n * get all changeEvents which came in later than the pointer-event\n * @return array with change-events. If null, pointer out of bounds\n */\n getFrom(pointer: number): RxChangeEvent[] | null {\n this.processTasks();\n const ret = [];\n let currentIndex = this.getArrayIndexByPointer(pointer);\n if (currentIndex === null) // out of bounds\n return null;\n\n while (true) {\n const nextEvent = this.buffer[currentIndex];\n currentIndex++;\n if (!nextEvent) {\n return ret;\n } else {\n ret.push(nextEvent);\n }\n }\n }\n\n runFrom(pointer: number, fn: Function) {\n this.processTasks();\n const ret = this.getFrom(pointer);\n if (ret === null) {\n throw new Error('out of bounds');\n } else {\n ret.forEach(cE => fn(cE));\n }\n }\n\n /**\n * no matter how many operations are done on one document,\n * only the last operation has to be checked to calculate the new state\n * this function reduces the events to the last ChangeEvent of each doc\n */\n reduceByLastOfDoc(changeEvents: RxChangeEvent[]): RxChangeEvent[] {\n this.processTasks();\n return changeEvents.slice(0);\n // TODO the old implementation was wrong\n // because it did not correctly reassigned the previousData of the changeevents\n // this should be added to the event-reduce library and not be done in RxDB\n const docEventMap: any = {};\n changeEvents.forEach(changeEvent => {\n docEventMap[changeEvent.documentId] = changeEvent;\n });\n return Object.values(docEventMap);\n }\n\n destroy() {\n this.tasks.clear();\n this.subs.forEach(sub => sub.unsubscribe());\n }\n}\n\nexport function createChangeEventBuffer(\n collection: RxCollection\n) {\n return new ChangeEventBuffer(collection);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"change-event-buffer.js","names":["_operators","require","_index","ChangeEventBuffer","exports","collection","subs","counter","eventCounterMap","WeakMap","buffer","limit","tasks","Set","push","database","eventBulks$","pipe","filter","changeEventBulk","collectionName","name","bulk","first","events","isLocal","subscribe","eventBulk","add","_handleChangeEvents","size","requestIdlePromiseNoQueue","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","counterBefore","length","slice","appendToArray","counterBase","index","event","set","getCounter","getBuffer","getArrayIndexByPointer","pointer","oldestEvent","oldestCounter","get","rest","getFrom","ret","currentIndex","nextEvent","runFrom","fn","Error","cE","reduceByLastOfDoc","changeEvents","docEventMap","changeEvent","documentId","Object","values","destroy","sub","unsubscribe","createChangeEventBuffer"],"sources":["../../src/change-event-buffer.ts"],"sourcesContent":["/**\n * a buffer-cache which holds the last X changeEvents of the collection\n */\nimport {\n Subscription\n} from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type {\n RxChangeEvent,\n RxCollection\n} from './types/index.d.ts';\nimport { appendToArray, requestIdlePromiseNoQueue } from './plugins/utils/index.ts';\n\n/**\n * This buffer rembemers previous change events\n * so that queries can use them on .exec()\n * to calculate the new result set via event-reduce instead\n * of running the query against the storage.\n */\nexport class ChangeEventBuffer {\n /**\n * These properties are private to ensure they cannot\n * be read without first processing the lazy tasks.\n */\n private subs: Subscription[] = [];\n public counter: number = 0;\n private eventCounterMap: WeakMap<\n RxChangeEvent, number\n > = new WeakMap();\n /**\n * array with changeEvents\n * starts with oldest known event, ends with newest\n */\n private buffer: RxChangeEvent[] = [];\n\n public limit: number = 100;\n\n\n\n private tasks = new Set();\n\n constructor(\n public collection: RxCollection\n ) {\n this.subs.push(\n this.collection.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.collection.name),\n filter(bulk => {\n const first = bulk.events[0];\n return !first.isLocal;\n })\n ).subscribe(eventBulk => {\n this.tasks.add(() => this._handleChangeEvents(eventBulk.events));\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n })\n );\n }\n\n private processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n private _handleChangeEvents(events: RxChangeEvent[]) {\n const counterBefore = this.counter;\n this.counter = this.counter + events.length;\n if (events.length > this.limit) {\n this.buffer = events.slice(events.length * -1);\n } else {\n appendToArray(this.buffer, events);\n this.buffer = this.buffer.slice(this.limit * -1);\n }\n const counterBase = counterBefore + 1;\n const eventCounterMap = this.eventCounterMap;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n eventCounterMap.set(event, counterBase + index);\n }\n }\n\n getCounter() {\n this.processTasks();\n return this.counter;\n }\n getBuffer() {\n this.processTasks();\n return this.buffer;\n }\n\n /**\n * gets the array-index for the given pointer\n * @return arrayIndex which can be used to iterate from there. If null, pointer is out of lower bound\n */\n getArrayIndexByPointer(pointer: number): number | null {\n this.processTasks();\n const oldestEvent = this.buffer[0];\n const oldestCounter = this.eventCounterMap.get(\n oldestEvent\n ) as number;\n\n if (pointer < oldestCounter)\n return null; // out of bounds\n\n const rest = pointer - oldestCounter;\n return rest;\n }\n\n /**\n * get all changeEvents which came in later than the pointer-event\n * @return array with change-events. If null, pointer out of bounds\n */\n getFrom(pointer: number): RxChangeEvent[] | null {\n this.processTasks();\n const ret = [];\n let currentIndex = this.getArrayIndexByPointer(pointer);\n if (currentIndex === null) // out of bounds\n return null;\n\n while (true) {\n const nextEvent = this.buffer[currentIndex];\n currentIndex++;\n if (!nextEvent) {\n return ret;\n } else {\n ret.push(nextEvent);\n }\n }\n }\n\n runFrom(pointer: number, fn: Function) {\n this.processTasks();\n const ret = this.getFrom(pointer);\n if (ret === null) {\n throw new Error('out of bounds');\n } else {\n ret.forEach(cE => fn(cE));\n }\n }\n\n /**\n * no matter how many operations are done on one document,\n * only the last operation has to be checked to calculate the new state\n * this function reduces the events to the last ChangeEvent of each doc\n */\n reduceByLastOfDoc(changeEvents: RxChangeEvent[]): RxChangeEvent[] {\n this.processTasks();\n return changeEvents.slice(0);\n // TODO the old implementation was wrong\n // because it did not correctly reassigned the previousData of the changeevents\n // this should be added to the event-reduce library and not be done in RxDB\n const docEventMap: any = {};\n changeEvents.forEach(changeEvent => {\n docEventMap[changeEvent.documentId] = changeEvent;\n });\n return Object.values(docEventMap);\n }\n\n destroy() {\n this.tasks.clear();\n this.subs.forEach(sub => sub.unsubscribe());\n }\n}\n\nexport function createChangeEventBuffer(\n collection: RxCollection\n) {\n return new ChangeEventBuffer(collection);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/doc-cache.js.map b/dist/cjs/doc-cache.js.map index 0fdca7bc5ed..77bc25debea 100644 --- a/dist/cjs/doc-cache.js.map +++ b/dist/cjs/doc-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"doc-cache.js","names":["_index2","require","_overwritable","DocumentCache","exports","primaryPath","changes$","documentCreator","cacheItemByDocId","Map","tasks","Set","registry","FinalizationRegistry","docMeta","docId","cacheItem","get","delete","revisionHeight","size","undefined","subscribe","events","add","index","length","event","documentId","documentData","previousDocumentData","requestIdlePromiseNoQueue","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","getLatestDocumentData","getFromMapOrThrow","getLatestDocumentDataIfExists","_createClass2","default","key","fn","getCachedRxDocumentMonad","overwriteGetterForCaching","doc","docCache","deepFreezeWhenDevMode","overwritable","docsData","ret","registryTasks","docData","getHeightOfRevision","_rev","byRev","cachedRxDocumentWeakRef","set","cachedRxDocument","deref","createWeakRefWithFallback","push","register","primary","revision","mapDocumentsDataToCacheDocs","getCachedRxDocuments","HAS_WEAK_REF","WeakRef","createWeakRef","createWeakRefFallback","obj"],"sources":["../../src/doc-cache.ts"],"sourcesContent":["import type {\n RxChangeEvent,\n RxDocument,\n RxDocumentData\n} from './types/index.d.ts';\nimport {\n getFromMapOrThrow,\n getHeightOfRevision,\n overwriteGetterForCaching,\n requestIdlePromiseNoQueue\n} from './plugins/utils/index.ts';\nimport {\n overwritable\n} from './overwritable.ts';\nimport { Observable } from 'rxjs';\n\n/**\n * Because we have to create many cache items,\n * we use an array instead of an object with properties\n * for better performance and less memory usage.\n * @link https://stackoverflow.com/questions/17295056/array-vs-object-efficiency-in-javascript\n */\ndeclare type CacheItem = [\n /**\n * Store the different document states of time\n * based on their revision height (rev height = array index).\n * We store WeakRefs so that we can later clean up\n * document states that are no longer needed.\n */\n Map>>,\n\n /**\n * Store the latest known document state.\n * As long as any state of the document is in the cache,\n * we observe the changestream and update the latestDoc accordingly.\n * This makes it easier to optimize performance on other parts\n * because for each known document we can always get the current state\n * in the storage.\n * Also it makes it possible to call RxDocument.latest() in a non-async way\n * to retrieve the latest document state or to observe$ some property.\n *\n * To not prevent the whole cacheItem from being garbage collected,\n * we store only the document data here, but not the RxDocument.\n */\n RxDocumentData\n];\n\n\n/**\n * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n */\ndeclare type FinalizationRegistryValue = {\n docId: string;\n revisionHeight: number;\n};\n\n/**\n * The DocumentCache stores RxDocument objects\n * by their primary key and revision.\n * This is useful on client side applications where\n * it is not known how much memory can be used, so\n * we de-duplicate RxDocument states to save memory.\n * To not fill up the memory with old document states, the DocumentCache\n * only contains weak references to the RxDocuments themself.\n * @link https://caniuse.com/?search=weakref\n */\nexport class DocumentCache {\n public readonly cacheItemByDocId = new Map>();\n\n /**\n * Process stuff lazy to not block the CPU\n * on critical paths.\n */\n public readonly tasks = new Set();\n\n /**\n * Some JavaScript runtimes like QuickJS,\n * so not have a FinalizationRegistry or WeakRef.\n * Therefore we need a workaround which might waste a lot of memory,\n * but at least works.\n */\n public readonly registry?: FinalizationRegistry = typeof FinalizationRegistry === 'function' ?\n new FinalizationRegistry(docMeta => {\n const docId = docMeta.docId;\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n cacheItem[0].delete(docMeta.revisionHeight);\n if (cacheItem[0].size === 0) {\n /**\n * No state of the document is cached anymore,\n * so we can clean up.\n */\n this.cacheItemByDocId.delete(docId);\n }\n }\n }) :\n undefined;\n\n constructor(\n public readonly primaryPath: string,\n public readonly changes$: Observable[]>,\n /**\n * A method that can create a RxDocument by the given document data.\n */\n public documentCreator: (docData: RxDocumentData) => RxDocument\n ) {\n changes$.subscribe(events => {\n this.tasks.add(() => {\n const cacheItemByDocId = this.cacheItemByDocId;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n const cacheItem = cacheItemByDocId.get(event.documentId);\n if (cacheItem) {\n let documentData = event.documentData;\n if (!documentData) {\n documentData = event.previousDocumentData as any;\n }\n cacheItem[1] = documentData;\n }\n }\n });\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n });\n }\n\n public processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n /**\n * Get the RxDocument from the cache\n * and create a new one if not exits before.\n * @overwrites itself with the actual function\n * because this is @performance relevant.\n * It is called on each document row for each write and read.\n */\n get getCachedRxDocuments(): (docsData: RxDocumentData[]) => RxDocument[] {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocuments',\n fn\n );\n }\n\n get getCachedRxDocument(): (docData: RxDocumentData) => RxDocument {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocument',\n doc => fn([doc])[0]\n );\n }\n\n /**\n * Throws if not exists\n */\n public getLatestDocumentData(docId: string): RxDocumentData {\n this.processTasks();\n const cacheItem = getFromMapOrThrow(this.cacheItemByDocId, docId);\n return cacheItem[1];\n }\n\n public getLatestDocumentDataIfExists(docId: string): RxDocumentData | undefined {\n this.processTasks();\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n return cacheItem[1];\n }\n }\n}\n\n/**\n * This function is called very very often.\n * This is likely the most important function for RxDB overall performance\n * @hotPath This is one of the most important methods for performance.\n * It is used in many places to transform the raw document data into RxDocuments.\n */\nfunction getCachedRxDocumentMonad(\n docCache: DocumentCache\n): (docsData: RxDocumentData[]) => RxDocument[] {\n const primaryPath = docCache.primaryPath;\n const cacheItemByDocId = docCache.cacheItemByDocId;\n const registry = docCache.registry;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n const documentCreator = docCache.documentCreator;\n const fn: (docsData: RxDocumentData[]) => RxDocument[] = (docsData: RxDocumentData[]) => {\n const ret: RxDocument[] = new Array(docsData.length);\n const registryTasks: RxDocument[] = [];\n for (let index = 0; index < docsData.length; index++) {\n let docData = docsData[index];\n const docId: string = (docData as any)[primaryPath];\n const revisionHeight = getHeightOfRevision(docData._rev);\n\n let byRev: Map>>;\n let cachedRxDocumentWeakRef: WeakRef> | undefined;\n let cacheItem = cacheItemByDocId.get(docId);\n if (!cacheItem) {\n byRev = new Map();\n cacheItem = [\n byRev,\n docData\n ];\n cacheItemByDocId.set(docId, cacheItem);\n } else {\n byRev = cacheItem[0];\n cachedRxDocumentWeakRef = byRev.get(revisionHeight);\n }\n let cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;\n if (!cachedRxDocument) {\n docData = deepFreezeWhenDevMode(docData) as any;\n cachedRxDocument = documentCreator(docData) as RxDocument;\n byRev.set(revisionHeight, createWeakRefWithFallback(cachedRxDocument));\n if (registry) {\n registryTasks.push(cachedRxDocument);\n }\n }\n ret[index] = cachedRxDocument;\n }\n if (registryTasks.length > 0 && registry) {\n /**\n * Calling registry.register() has shown to have\n * really bad performance. So we add the cached documents\n * lazily.\n */\n docCache.tasks.add(() => {\n for (let index = 0; index < registryTasks.length; index++) {\n const doc = registryTasks[index];\n registry.register(doc, {\n docId: doc.primary,\n revisionHeight: getHeightOfRevision(doc.revision)\n });\n }\n });\n if (docCache.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n docCache.processTasks();\n });\n }\n }\n return ret;\n };\n return fn;\n}\n\nexport function mapDocumentsDataToCacheDocs(\n docCache: DocumentCache,\n docsData: RxDocumentData[]\n) {\n const getCachedRxDocuments = docCache.getCachedRxDocuments;\n return getCachedRxDocuments(docsData);\n}\n\n/**\n * Fallback for JavaScript runtimes that do not support WeakRef.\n * The fallback will keep the items in cache forever,\n * but at least works.\n */\nconst HAS_WEAK_REF = typeof WeakRef === 'function';\nconst createWeakRefWithFallback = HAS_WEAK_REF ? createWeakRef : createWeakRefFallback;\nfunction createWeakRef(obj: T): WeakRef {\n return new WeakRef(obj) as any;\n}\nfunction createWeakRefFallback(obj: T): WeakRef {\n return {\n deref() {\n return obj;\n }\n } as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"doc-cache.js","names":["_index2","require","_overwritable","DocumentCache","exports","primaryPath","changes$","documentCreator","cacheItemByDocId","Map","tasks","Set","registry","FinalizationRegistry","docMeta","docId","cacheItem","get","delete","revisionHeight","size","undefined","subscribe","events","add","index","length","event","documentId","documentData","previousDocumentData","requestIdlePromiseNoQueue","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","getLatestDocumentData","getFromMapOrThrow","getLatestDocumentDataIfExists","_createClass2","default","key","fn","getCachedRxDocumentMonad","overwriteGetterForCaching","doc","docCache","deepFreezeWhenDevMode","overwritable","docsData","ret","registryTasks","docData","getHeightOfRevision","_rev","byRev","cachedRxDocumentWeakRef","set","cachedRxDocument","deref","createWeakRefWithFallback","push","register","primary","revision","mapDocumentsDataToCacheDocs","getCachedRxDocuments","HAS_WEAK_REF","WeakRef","createWeakRef","createWeakRefFallback","obj"],"sources":["../../src/doc-cache.ts"],"sourcesContent":["import type {\n RxChangeEvent,\n RxDocument,\n RxDocumentData\n} from './types/index.d.ts';\nimport {\n getFromMapOrThrow,\n getHeightOfRevision,\n overwriteGetterForCaching,\n requestIdlePromiseNoQueue\n} from './plugins/utils/index.ts';\nimport {\n overwritable\n} from './overwritable.ts';\nimport { Observable } from 'rxjs';\n\n/**\n * Because we have to create many cache items,\n * we use an array instead of an object with properties\n * for better performance and less memory usage.\n * @link https://stackoverflow.com/questions/17295056/array-vs-object-efficiency-in-javascript\n */\ndeclare type CacheItem = [\n /**\n * Store the different document states of time\n * based on their revision height (rev height = array index).\n * We store WeakRefs so that we can later clean up\n * document states that are no longer needed.\n */\n Map>>,\n\n /**\n * Store the latest known document state.\n * As long as any state of the document is in the cache,\n * we observe the changestream and update the latestDoc accordingly.\n * This makes it easier to optimize performance on other parts\n * because for each known document we can always get the current state\n * in the storage.\n * Also it makes it possible to call RxDocument.latest() in a non-async way\n * to retrieve the latest document state or to observe$ some property.\n *\n * To not prevent the whole cacheItem from being garbage collected,\n * we store only the document data here, but not the RxDocument.\n */\n RxDocumentData\n];\n\n\n/**\n * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n */\ndeclare type FinalizationRegistryValue = {\n docId: string;\n revisionHeight: number;\n};\n\n/**\n * The DocumentCache stores RxDocument objects\n * by their primary key and revision.\n * This is useful on client side applications where\n * it is not known how much memory can be used, so\n * we de-duplicate RxDocument states to save memory.\n * To not fill up the memory with old document states, the DocumentCache\n * only contains weak references to the RxDocuments themself.\n * @link https://caniuse.com/?search=weakref\n */\nexport class DocumentCache {\n public readonly cacheItemByDocId = new Map>();\n\n /**\n * Process stuff lazy to not block the CPU\n * on critical paths.\n */\n public readonly tasks = new Set();\n\n /**\n * Some JavaScript runtimes like QuickJS,\n * so not have a FinalizationRegistry or WeakRef.\n * Therefore we need a workaround which might waste a lot of memory,\n * but at least works.\n */\n public readonly registry?: FinalizationRegistry = typeof FinalizationRegistry === 'function' ?\n new FinalizationRegistry(docMeta => {\n const docId = docMeta.docId;\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n cacheItem[0].delete(docMeta.revisionHeight);\n if (cacheItem[0].size === 0) {\n /**\n * No state of the document is cached anymore,\n * so we can clean up.\n */\n this.cacheItemByDocId.delete(docId);\n }\n }\n }) :\n undefined;\n\n constructor(\n public readonly primaryPath: string,\n public readonly changes$: Observable[]>,\n /**\n * A method that can create a RxDocument by the given document data.\n */\n public documentCreator: (docData: RxDocumentData) => RxDocument\n ) {\n changes$.subscribe(events => {\n this.tasks.add(() => {\n const cacheItemByDocId = this.cacheItemByDocId;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n const cacheItem = cacheItemByDocId.get(event.documentId);\n if (cacheItem) {\n let documentData = event.documentData;\n if (!documentData) {\n documentData = event.previousDocumentData as any;\n }\n cacheItem[1] = documentData;\n }\n }\n });\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n });\n }\n\n public processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n /**\n * Get the RxDocument from the cache\n * and create a new one if not exits before.\n * @overwrites itself with the actual function\n * because this is @performance relevant.\n * It is called on each document row for each write and read.\n */\n get getCachedRxDocuments(): (docsData: RxDocumentData[]) => RxDocument[] {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocuments',\n fn\n );\n }\n\n get getCachedRxDocument(): (docData: RxDocumentData) => RxDocument {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocument',\n doc => fn([doc])[0]\n );\n }\n\n /**\n * Throws if not exists\n */\n public getLatestDocumentData(docId: string): RxDocumentData {\n this.processTasks();\n const cacheItem = getFromMapOrThrow(this.cacheItemByDocId, docId);\n return cacheItem[1];\n }\n\n public getLatestDocumentDataIfExists(docId: string): RxDocumentData | undefined {\n this.processTasks();\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n return cacheItem[1];\n }\n }\n}\n\n/**\n * This function is called very very often.\n * This is likely the most important function for RxDB overall performance\n * @hotPath This is one of the most important methods for performance.\n * It is used in many places to transform the raw document data into RxDocuments.\n */\nfunction getCachedRxDocumentMonad(\n docCache: DocumentCache\n): (docsData: RxDocumentData[]) => RxDocument[] {\n const primaryPath = docCache.primaryPath;\n const cacheItemByDocId = docCache.cacheItemByDocId;\n const registry = docCache.registry;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n const documentCreator = docCache.documentCreator;\n const fn: (docsData: RxDocumentData[]) => RxDocument[] = (docsData: RxDocumentData[]) => {\n const ret: RxDocument[] = new Array(docsData.length);\n const registryTasks: RxDocument[] = [];\n for (let index = 0; index < docsData.length; index++) {\n let docData = docsData[index];\n const docId: string = (docData as any)[primaryPath];\n const revisionHeight = getHeightOfRevision(docData._rev);\n\n let byRev: Map>>;\n let cachedRxDocumentWeakRef: WeakRef> | undefined;\n let cacheItem = cacheItemByDocId.get(docId);\n if (!cacheItem) {\n byRev = new Map();\n cacheItem = [\n byRev,\n docData\n ];\n cacheItemByDocId.set(docId, cacheItem);\n } else {\n byRev = cacheItem[0];\n cachedRxDocumentWeakRef = byRev.get(revisionHeight);\n }\n let cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;\n if (!cachedRxDocument) {\n docData = deepFreezeWhenDevMode(docData) as any;\n cachedRxDocument = documentCreator(docData) as RxDocument;\n byRev.set(revisionHeight, createWeakRefWithFallback(cachedRxDocument));\n if (registry) {\n registryTasks.push(cachedRxDocument);\n }\n }\n ret[index] = cachedRxDocument;\n }\n if (registryTasks.length > 0 && registry) {\n /**\n * Calling registry.register() has shown to have\n * really bad performance. So we add the cached documents\n * lazily.\n */\n docCache.tasks.add(() => {\n for (let index = 0; index < registryTasks.length; index++) {\n const doc = registryTasks[index];\n registry.register(doc, {\n docId: doc.primary,\n revisionHeight: getHeightOfRevision(doc.revision)\n });\n }\n });\n if (docCache.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n docCache.processTasks();\n });\n }\n }\n return ret;\n };\n return fn;\n}\n\nexport function mapDocumentsDataToCacheDocs(\n docCache: DocumentCache,\n docsData: RxDocumentData[]\n) {\n const getCachedRxDocuments = docCache.getCachedRxDocuments;\n return getCachedRxDocuments(docsData);\n}\n\n/**\n * Fallback for JavaScript runtimes that do not support WeakRef.\n * The fallback will keep the items in cache forever,\n * but at least works.\n */\nconst HAS_WEAK_REF = typeof WeakRef === 'function';\nconst createWeakRefWithFallback = HAS_WEAK_REF ? createWeakRef : createWeakRefFallback;\nfunction createWeakRef(obj: T): WeakRef {\n return new WeakRef(obj) as any;\n}\nfunction createWeakRefFallback(obj: T): WeakRef {\n return {\n deref() {\n return obj;\n }\n } as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/incremental-write.js.map b/dist/cjs/incremental-write.js.map index 10a59340936..e7f46c3841b 100644 --- a/dist/cjs/incremental-write.js.map +++ b/dist/cjs/incremental-write.js.map @@ -1 +1 @@ -{"version":3,"file":"incremental-write.js","names":["_rxError","require","_index","IncrementalWriteQueue","exports","storageInstance","primaryPath","preWrite","postWrite","queueByDocId","Map","isRunning","_proto","prototype","addWrite","lastKnownDocumentState","modifier","docId","ar","getFromMapOrCreate","ret","Promise","resolve","reject","item","ensureNotFalsy","push","triggerRun","size","writeRows","itemsById","all","Array","from","entries","map","_docId","items","oldData","findNewestOfDocumentStates","i","newData","clone","err","forEach","previous","document","writeResult","length","bulkWrite","error","success","result","getFromMapOrThrow","documentId","isConflict","isBulkWriteConflictError","reverse","documentInDb","unshift","rxError","rxStorageWriteErrorToRxError","modifierFromPublicToInternal","publicModifier","docData","withoutMeta","stripMetaDataFromDocument","_deleted","modified","reattachedMeta","Object","assign","_meta","_attachments","_rev","docs","newest","newestRevisionHeight","getHeightOfRevision","doc","height"],"sources":["../../src/incremental-write.ts"],"sourcesContent":["import {\n isBulkWriteConflictError,\n rxStorageWriteErrorToRxError\n} from './rx-error.ts';\nimport type {\n ModifyFunction,\n BulkWriteRow,\n MaybePromise,\n RxDocumentData,\n RxDocumentWriteData,\n RxError,\n RxStorageBulkWriteResponse,\n RxStorageInstance,\n StringKeys,\n WithDeleted\n} from './types/index.d.ts';\nimport {\n clone,\n ensureNotFalsy,\n getFromMapOrCreate,\n getFromMapOrThrow,\n getHeightOfRevision,\n stripMetaDataFromDocument\n} from './plugins/utils/index.ts';\n\n\n\nexport type IncrementalWriteModifier = (\n doc: RxDocumentData\n) => MaybePromise> | MaybePromise>;\n\n\ntype IncrementalWriteQueueItem = {\n lastKnownDocumentState: RxDocumentData;\n modifier: IncrementalWriteModifier;\n resolve: (d: RxDocumentData) => void;\n reject: (error: RxError) => void;\n};\n\n/**\n * The incremental write queue\n * batches up all incremental writes to a collection\n * so that performance can be improved by:\n * - Running only one write even when there are multiple modifications to the same document.\n * - Run all writes ins a single bulkWrite() call even when there are writes to many documents.\n */\nexport class IncrementalWriteQueue {\n public queueByDocId = new Map[]>();\n public isRunning: boolean = false;\n\n constructor(\n public readonly storageInstance: RxStorageInstance,\n public readonly primaryPath: StringKeys>,\n // can be used to run hooks etc.\n public readonly preWrite: (newData: RxDocumentData, oldData: RxDocumentData) => MaybePromise,\n public readonly postWrite: (docData: RxDocumentData) => void\n\n ) { }\n\n addWrite(\n lastKnownDocumentState: RxDocumentData,\n modifier: IncrementalWriteModifier\n ): Promise> {\n const docId: string = lastKnownDocumentState[this.primaryPath] as any;\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n const ret = new Promise>((resolve, reject) => {\n const item: IncrementalWriteQueueItem = {\n lastKnownDocumentState,\n modifier,\n resolve,\n reject\n };\n ensureNotFalsy(ar).push(item);\n this.triggerRun();\n });\n return ret;\n }\n\n async triggerRun(): Promise {\n if (\n this.isRunning === true ||\n this.queueByDocId.size === 0\n ) {\n // already running\n return;\n }\n this.isRunning = true;\n const writeRows: BulkWriteRow[] = [];\n\n /**\n * 'take over' so that while the async functions runs,\n * new incremental updates could be added from the outside.\n */\n const itemsById = this.queueByDocId;\n this.queueByDocId = new Map();\n await Promise.all(\n Array.from(itemsById.entries())\n .map(async ([_docId, items]) => {\n const oldData = findNewestOfDocumentStates(\n items.map(i => i.lastKnownDocumentState)\n );\n let newData = oldData;\n for (const item of items) {\n try {\n newData = await item.modifier(\n /**\n * We have to clone() each time because the modifier\n * might throw while it already changed some properties\n * of the document.\n */\n clone(newData)\n ) as any;\n } catch (err: any) {\n item.reject(err);\n item.reject = () => { };\n item.resolve = () => { };\n }\n }\n\n try {\n await this.preWrite(newData, oldData);\n } catch (err: any) {\n /**\n * If the before-hooks fail,\n * we reject all of the writes because it is\n * not possible to determine which one is to blame.\n */\n items.forEach(item => item.reject(err));\n return;\n }\n writeRows.push({\n previous: oldData,\n document: newData\n });\n })\n );\n const writeResult: RxStorageBulkWriteResponse = writeRows.length > 0 ?\n await this.storageInstance.bulkWrite(writeRows, 'incremental-write') :\n { error: [], success: [] };\n\n // process success\n await Promise.all(\n writeResult.success.map(result => {\n const docId = result[this.primaryPath] as string;\n this.postWrite(result);\n const items = getFromMapOrThrow(itemsById, docId);\n items.forEach(item => item.resolve(result));\n })\n );\n\n // process errors\n writeResult.error\n .forEach(error => {\n const docId = error.documentId;\n const items = getFromMapOrThrow(itemsById, docId);\n const isConflict = isBulkWriteConflictError(error);\n if (isConflict) {\n // had conflict -> retry afterwards\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n /**\n * Add the items back to this.queueByDocId\n * by maintaining the original order.\n */\n items\n .reverse()\n .forEach(item => {\n item.lastKnownDocumentState = ensureNotFalsy(isConflict.documentInDb);\n ensureNotFalsy(ar).unshift(item);\n });\n } else {\n // other error -> must be thrown\n const rxError = rxStorageWriteErrorToRxError(error);\n items.forEach(item => item.reject(rxError));\n }\n });\n this.isRunning = false;\n\n /**\n * Always trigger another run\n * because in between there might be new items\n * been added to the queue.\n */\n return this.triggerRun();\n }\n}\n\n\nexport function modifierFromPublicToInternal(\n publicModifier: ModifyFunction\n): IncrementalWriteModifier {\n const ret = async (docData: RxDocumentData) => {\n const withoutMeta: WithDeleted = stripMetaDataFromDocument(docData) as any;\n withoutMeta._deleted = docData._deleted;\n const modified = await publicModifier(withoutMeta);\n const reattachedMeta: RxDocumentData = Object.assign({}, modified, {\n _meta: docData._meta,\n _attachments: docData._attachments,\n _rev: docData._rev,\n _deleted: typeof (modified as WithDeleted)._deleted !== 'undefined' ?\n (modified as WithDeleted)._deleted :\n docData._deleted\n });\n if (typeof reattachedMeta._deleted === 'undefined') {\n reattachedMeta._deleted = false;\n }\n return reattachedMeta;\n };\n return ret;\n}\n\n\nexport function findNewestOfDocumentStates(\n docs: RxDocumentData[]\n): RxDocumentData {\n\n let newest = docs[0];\n let newestRevisionHeight = getHeightOfRevision(newest._rev);\n docs.forEach(doc => {\n const height = getHeightOfRevision(doc._rev);\n if (height > newestRevisionHeight) {\n newest = doc;\n newestRevisionHeight = height;\n }\n });\n return newest;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"incremental-write.js","names":["_rxError","require","_index","IncrementalWriteQueue","exports","storageInstance","primaryPath","preWrite","postWrite","queueByDocId","Map","isRunning","_proto","prototype","addWrite","lastKnownDocumentState","modifier","docId","ar","getFromMapOrCreate","ret","Promise","resolve","reject","item","ensureNotFalsy","push","triggerRun","size","writeRows","itemsById","all","Array","from","entries","map","_docId","items","oldData","findNewestOfDocumentStates","i","newData","clone","err","forEach","previous","document","writeResult","length","bulkWrite","error","success","result","getFromMapOrThrow","documentId","isConflict","isBulkWriteConflictError","reverse","documentInDb","unshift","rxError","rxStorageWriteErrorToRxError","modifierFromPublicToInternal","publicModifier","docData","withoutMeta","stripMetaDataFromDocument","_deleted","modified","reattachedMeta","Object","assign","_meta","_attachments","_rev","docs","newest","newestRevisionHeight","getHeightOfRevision","doc","height"],"sources":["../../src/incremental-write.ts"],"sourcesContent":["import {\n isBulkWriteConflictError,\n rxStorageWriteErrorToRxError\n} from './rx-error.ts';\nimport type {\n ModifyFunction,\n BulkWriteRow,\n MaybePromise,\n RxDocumentData,\n RxDocumentWriteData,\n RxError,\n RxStorageBulkWriteResponse,\n RxStorageInstance,\n StringKeys,\n WithDeleted\n} from './types/index.d.ts';\nimport {\n clone,\n ensureNotFalsy,\n getFromMapOrCreate,\n getFromMapOrThrow,\n getHeightOfRevision,\n stripMetaDataFromDocument\n} from './plugins/utils/index.ts';\n\n\n\nexport type IncrementalWriteModifier = (\n doc: RxDocumentData\n) => MaybePromise> | MaybePromise>;\n\n\ntype IncrementalWriteQueueItem = {\n lastKnownDocumentState: RxDocumentData;\n modifier: IncrementalWriteModifier;\n resolve: (d: RxDocumentData) => void;\n reject: (error: RxError) => void;\n};\n\n/**\n * The incremental write queue\n * batches up all incremental writes to a collection\n * so that performance can be improved by:\n * - Running only one write even when there are multiple modifications to the same document.\n * - Run all writes ins a single bulkWrite() call even when there are writes to many documents.\n */\nexport class IncrementalWriteQueue {\n public queueByDocId = new Map[]>();\n public isRunning: boolean = false;\n\n constructor(\n public readonly storageInstance: RxStorageInstance,\n public readonly primaryPath: StringKeys>,\n // can be used to run hooks etc.\n public readonly preWrite: (newData: RxDocumentData, oldData: RxDocumentData) => MaybePromise,\n public readonly postWrite: (docData: RxDocumentData) => void\n\n ) { }\n\n addWrite(\n lastKnownDocumentState: RxDocumentData,\n modifier: IncrementalWriteModifier\n ): Promise> {\n const docId: string = lastKnownDocumentState[this.primaryPath] as any;\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n const ret = new Promise>((resolve, reject) => {\n const item: IncrementalWriteQueueItem = {\n lastKnownDocumentState,\n modifier,\n resolve,\n reject\n };\n ensureNotFalsy(ar).push(item);\n this.triggerRun();\n });\n return ret;\n }\n\n async triggerRun(): Promise {\n if (\n this.isRunning === true ||\n this.queueByDocId.size === 0\n ) {\n // already running\n return;\n }\n this.isRunning = true;\n const writeRows: BulkWriteRow[] = [];\n\n /**\n * 'take over' so that while the async functions runs,\n * new incremental updates could be added from the outside.\n */\n const itemsById = this.queueByDocId;\n this.queueByDocId = new Map();\n await Promise.all(\n Array.from(itemsById.entries())\n .map(async ([_docId, items]) => {\n const oldData = findNewestOfDocumentStates(\n items.map(i => i.lastKnownDocumentState)\n );\n let newData = oldData;\n for (const item of items) {\n try {\n newData = await item.modifier(\n /**\n * We have to clone() each time because the modifier\n * might throw while it already changed some properties\n * of the document.\n */\n clone(newData)\n ) as any;\n } catch (err: any) {\n item.reject(err);\n item.reject = () => { };\n item.resolve = () => { };\n }\n }\n\n try {\n await this.preWrite(newData, oldData);\n } catch (err: any) {\n /**\n * If the before-hooks fail,\n * we reject all of the writes because it is\n * not possible to determine which one is to blame.\n */\n items.forEach(item => item.reject(err));\n return;\n }\n writeRows.push({\n previous: oldData,\n document: newData\n });\n })\n );\n const writeResult: RxStorageBulkWriteResponse = writeRows.length > 0 ?\n await this.storageInstance.bulkWrite(writeRows, 'incremental-write') :\n { error: [], success: [] };\n\n // process success\n await Promise.all(\n writeResult.success.map(result => {\n const docId = result[this.primaryPath] as string;\n this.postWrite(result);\n const items = getFromMapOrThrow(itemsById, docId);\n items.forEach(item => item.resolve(result));\n })\n );\n\n // process errors\n writeResult.error\n .forEach(error => {\n const docId = error.documentId;\n const items = getFromMapOrThrow(itemsById, docId);\n const isConflict = isBulkWriteConflictError(error);\n if (isConflict) {\n // had conflict -> retry afterwards\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n /**\n * Add the items back to this.queueByDocId\n * by maintaining the original order.\n */\n items\n .reverse()\n .forEach(item => {\n item.lastKnownDocumentState = ensureNotFalsy(isConflict.documentInDb);\n ensureNotFalsy(ar).unshift(item);\n });\n } else {\n // other error -> must be thrown\n const rxError = rxStorageWriteErrorToRxError(error);\n items.forEach(item => item.reject(rxError));\n }\n });\n this.isRunning = false;\n\n /**\n * Always trigger another run\n * because in between there might be new items\n * been added to the queue.\n */\n return this.triggerRun();\n }\n}\n\n\nexport function modifierFromPublicToInternal(\n publicModifier: ModifyFunction\n): IncrementalWriteModifier {\n const ret = async (docData: RxDocumentData) => {\n const withoutMeta: WithDeleted = stripMetaDataFromDocument(docData) as any;\n withoutMeta._deleted = docData._deleted;\n const modified = await publicModifier(withoutMeta);\n const reattachedMeta: RxDocumentData = Object.assign({}, modified, {\n _meta: docData._meta,\n _attachments: docData._attachments,\n _rev: docData._rev,\n _deleted: typeof (modified as WithDeleted)._deleted !== 'undefined' ?\n (modified as WithDeleted)._deleted :\n docData._deleted\n });\n if (typeof reattachedMeta._deleted === 'undefined') {\n reattachedMeta._deleted = false;\n }\n return reattachedMeta;\n };\n return ret;\n}\n\n\nexport function findNewestOfDocumentStates(\n docs: RxDocumentData[]\n): RxDocumentData {\n\n let newest = docs[0];\n let newestRevisionHeight = getHeightOfRevision(newest._rev);\n docs.forEach(doc => {\n const height = getHeightOfRevision(doc._rev);\n if (height > newestRevisionHeight) {\n newest = doc;\n newestRevisionHeight = height;\n }\n });\n return newest;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/attachments/index.js.map b/dist/cjs/plugins/attachments/index.js.map index 63c0705835d..602dd8d0df6 100644 --- a/dist/cjs/plugins/attachments/index.js.map +++ b/dist/cjs/plugins/attachments/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["_rxjs","require","_index","_attachmentsUtils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","RxAttachment","doc","id","type","length","digest","assignMethodsToAttachment","_proto","remove","collection","incrementalWriteQueue","addWrite","_data","docWriteData","_attachments","then","getData","plainDataBase64","storageInstance","getAttachmentData","primary","ret","createBlobFromBase64","getStringData","data","asString","blobToString","fromStorageInstanceResult","attachmentData","rxDocument","putAttachment","ensureSchemaSupportsAttachments","dataSize","getBlobSize","dataString","blobToBase64String","database","hashFunction","flatClone","writeResult","newDocument","_docCache","getCachedRxDocument","attachmentDataOfId","attachment","getAttachment","docData","allAttachments","map","preMigrateDocument","attachments","newAttachments","Promise","all","attachmentId","docPrimary","oldCollection","schema","primaryPath","rawAttachmentData","postMigrateDocument","_action","PROMISE_RESOLVE_VOID","RxDBAttachmentsPlugin","name","rxdb","prototypes","RxDocument","proto","allAttachments$","$","pipe","entries","toJSON","overwritable","hooks","after"],"sources":["../../../../src/plugins/attachments/index.ts"],"sourcesContent":["import {\n map\n} from 'rxjs';\n\nimport {\n blobToBase64String,\n blobToString,\n createBlobFromBase64,\n flatClone,\n getBlobSize,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport type {\n RxDocument,\n RxPlugin,\n RxDocumentWriteData,\n RxAttachmentData,\n RxDocumentData,\n RxAttachmentCreator,\n RxAttachmentWriteData\n} from '../../types/index.ts';\nimport { assignMethodsToAttachment, ensureSchemaSupportsAttachments } from './attachments-utils.ts';\n\n\n\n/**\n * an RxAttachment is basically just the attachment-stub\n * wrapped so that you can access the attachment-data\n */\nexport class RxAttachment {\n public doc: RxDocument;\n public id: string;\n public type: string;\n public length: number;\n public digest: string;\n constructor({\n doc,\n id,\n type,\n length,\n digest\n }: any) {\n this.doc = doc;\n this.id = id;\n this.type = type;\n this.length = length;\n this.digest = digest;\n\n assignMethodsToAttachment(this);\n }\n\n remove(): Promise {\n return this.doc.collection.incrementalWriteQueue.addWrite(\n this.doc._data,\n docWriteData => {\n delete docWriteData._attachments[this.id];\n return docWriteData;\n }\n ).then(() => { });\n }\n\n /**\n * returns the data for the attachment\n */\n async getData(): Promise {\n const plainDataBase64 = await this.doc.collection.storageInstance.getAttachmentData(\n this.doc.primary,\n this.id,\n this.digest\n );\n const ret = await createBlobFromBase64(\n plainDataBase64,\n this.type as any\n );\n return ret;\n }\n\n async getStringData(): Promise {\n const data = await this.getData();\n const asString = await blobToString(data);\n return asString;\n }\n}\n\nexport function fromStorageInstanceResult(\n id: string,\n attachmentData: RxAttachmentData,\n rxDocument: RxDocument\n) {\n return new RxAttachment({\n doc: rxDocument,\n id,\n type: attachmentData.type,\n length: attachmentData.length,\n digest: attachmentData.digest\n });\n}\n\n\n\nexport async function putAttachment(\n this: RxDocument,\n attachmentData: RxAttachmentCreator\n): Promise {\n ensureSchemaSupportsAttachments(this);\n\n const dataSize = getBlobSize(attachmentData.data);\n const dataString = await blobToBase64String(attachmentData.data);\n const digest = await this.collection.database.hashFunction(dataString);\n\n const id = attachmentData.id;\n const type = attachmentData.type;\n const data = dataString;\n\n return this.collection.incrementalWriteQueue.addWrite(\n this._data,\n (docWriteData: RxDocumentWriteData) => {\n docWriteData = flatClone(docWriteData);\n docWriteData._attachments = flatClone(docWriteData._attachments);\n docWriteData._attachments[id] = {\n length: dataSize,\n type,\n data,\n digest\n };\n return docWriteData;\n }).then(writeResult => {\n const newDocument = this.collection._docCache.getCachedRxDocument(writeResult);\n const attachmentDataOfId = writeResult._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentDataOfId,\n newDocument\n );\n return attachment;\n });\n}\n\n/**\n * get an attachment of the document by its id\n */\nexport function getAttachment(\n this: RxDocument,\n id: string\n): RxAttachment | null {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n if (!docData._attachments || !docData._attachments[id])\n return null;\n\n const attachmentData = docData._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n return attachment;\n}\n\n/**\n * returns all attachments of the document\n */\nexport function allAttachments(\n this: RxDocument\n): RxAttachment[] {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n\n // if there are no attachments, the field is missing\n if (!docData._attachments) {\n return [];\n }\n return Object.keys(docData._attachments)\n .map(id => {\n return fromStorageInstanceResult(\n id,\n docData._attachments[id],\n this\n );\n });\n}\n\nexport async function preMigrateDocument(\n data: {\n docData: RxDocumentData;\n oldCollection: any; // TODO\n }\n): Promise {\n const attachments = data.docData._attachments;\n if (attachments) {\n const newAttachments: { [attachmentId: string]: RxAttachmentWriteData; } = {};\n await Promise.all(\n Object.keys(attachments).map(async (attachmentId) => {\n const attachment: RxAttachmentData = attachments[attachmentId];\n const docPrimary: string = (data.docData as any)[data.oldCollection.schema.primaryPath];\n const rawAttachmentData = await data.oldCollection.storageInstance.getAttachmentData(\n docPrimary,\n attachmentId,\n attachment.digest\n );\n const digest = await data.oldCollection.database.hashFunction(rawAttachmentData);\n newAttachments[attachmentId] = {\n length: attachment.length,\n type: attachment.type,\n data: rawAttachmentData,\n digest\n };\n })\n );\n\n /**\n * Hooks mutate the input\n * instead of returning stuff\n */\n (data.docData as RxDocumentWriteData)._attachments = newAttachments;\n }\n}\n\nexport function postMigrateDocument(_action: any): Promise {\n /**\n * No longer needed because\n * we store the attachments data buffers directly in the document.\n */\n return PROMISE_RESOLVE_VOID;\n}\n\nexport const RxDBAttachmentsPlugin: RxPlugin = {\n name: 'attachments',\n rxdb: true,\n prototypes: {\n RxDocument: (proto: any) => {\n proto.putAttachment = putAttachment;\n proto.getAttachment = getAttachment;\n proto.allAttachments = allAttachments;\n Object.defineProperty(proto, 'allAttachments$', {\n get: function allAttachments$(this: RxDocument) {\n return this.$\n .pipe(\n map(rxDocument => Object.entries(\n rxDocument.toJSON(true)._attachments\n )),\n map(entries => {\n return (entries as any)\n .map(([id, attachmentData]: any) => {\n return fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n });\n })\n );\n }\n });\n }\n },\n overwritable: {},\n hooks: {\n preMigrateDocument: {\n after: preMigrateDocument\n },\n postMigrateDocument: {\n after: postMigrateDocument\n }\n }\n};\n\n\nexport * from './attachments-utils.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["_rxjs","require","_index","_attachmentsUtils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","RxAttachment","doc","id","type","length","digest","assignMethodsToAttachment","_proto","remove","collection","incrementalWriteQueue","addWrite","_data","docWriteData","_attachments","then","getData","plainDataBase64","storageInstance","getAttachmentData","primary","ret","createBlobFromBase64","getStringData","data","asString","blobToString","fromStorageInstanceResult","attachmentData","rxDocument","putAttachment","ensureSchemaSupportsAttachments","dataSize","getBlobSize","dataString","blobToBase64String","database","hashFunction","flatClone","writeResult","newDocument","_docCache","getCachedRxDocument","attachmentDataOfId","attachment","getAttachment","docData","allAttachments","map","preMigrateDocument","attachments","newAttachments","Promise","all","attachmentId","docPrimary","oldCollection","schema","primaryPath","rawAttachmentData","postMigrateDocument","_action","PROMISE_RESOLVE_VOID","RxDBAttachmentsPlugin","name","rxdb","prototypes","RxDocument","proto","allAttachments$","$","pipe","entries","toJSON","overwritable","hooks","after"],"sources":["../../../../src/plugins/attachments/index.ts"],"sourcesContent":["import {\n map\n} from 'rxjs';\n\nimport {\n blobToBase64String,\n blobToString,\n createBlobFromBase64,\n flatClone,\n getBlobSize,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport type {\n RxDocument,\n RxPlugin,\n RxDocumentWriteData,\n RxAttachmentData,\n RxDocumentData,\n RxAttachmentCreator,\n RxAttachmentWriteData\n} from '../../types/index.ts';\nimport { assignMethodsToAttachment, ensureSchemaSupportsAttachments } from './attachments-utils.ts';\n\n\n\n/**\n * an RxAttachment is basically just the attachment-stub\n * wrapped so that you can access the attachment-data\n */\nexport class RxAttachment {\n public doc: RxDocument;\n public id: string;\n public type: string;\n public length: number;\n public digest: string;\n constructor({\n doc,\n id,\n type,\n length,\n digest\n }: any) {\n this.doc = doc;\n this.id = id;\n this.type = type;\n this.length = length;\n this.digest = digest;\n\n assignMethodsToAttachment(this);\n }\n\n remove(): Promise {\n return this.doc.collection.incrementalWriteQueue.addWrite(\n this.doc._data,\n docWriteData => {\n delete docWriteData._attachments[this.id];\n return docWriteData;\n }\n ).then(() => { });\n }\n\n /**\n * returns the data for the attachment\n */\n async getData(): Promise {\n const plainDataBase64 = await this.doc.collection.storageInstance.getAttachmentData(\n this.doc.primary,\n this.id,\n this.digest\n );\n const ret = await createBlobFromBase64(\n plainDataBase64,\n this.type as any\n );\n return ret;\n }\n\n async getStringData(): Promise {\n const data = await this.getData();\n const asString = await blobToString(data);\n return asString;\n }\n}\n\nexport function fromStorageInstanceResult(\n id: string,\n attachmentData: RxAttachmentData,\n rxDocument: RxDocument\n) {\n return new RxAttachment({\n doc: rxDocument,\n id,\n type: attachmentData.type,\n length: attachmentData.length,\n digest: attachmentData.digest\n });\n}\n\n\n\nexport async function putAttachment(\n this: RxDocument,\n attachmentData: RxAttachmentCreator\n): Promise {\n ensureSchemaSupportsAttachments(this);\n\n const dataSize = getBlobSize(attachmentData.data);\n const dataString = await blobToBase64String(attachmentData.data);\n const digest = await this.collection.database.hashFunction(dataString);\n\n const id = attachmentData.id;\n const type = attachmentData.type;\n const data = dataString;\n\n return this.collection.incrementalWriteQueue.addWrite(\n this._data,\n (docWriteData: RxDocumentWriteData) => {\n docWriteData = flatClone(docWriteData);\n docWriteData._attachments = flatClone(docWriteData._attachments);\n docWriteData._attachments[id] = {\n length: dataSize,\n type,\n data,\n digest\n };\n return docWriteData;\n }).then(writeResult => {\n const newDocument = this.collection._docCache.getCachedRxDocument(writeResult);\n const attachmentDataOfId = writeResult._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentDataOfId,\n newDocument\n );\n return attachment;\n });\n}\n\n/**\n * get an attachment of the document by its id\n */\nexport function getAttachment(\n this: RxDocument,\n id: string\n): RxAttachment | null {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n if (!docData._attachments || !docData._attachments[id])\n return null;\n\n const attachmentData = docData._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n return attachment;\n}\n\n/**\n * returns all attachments of the document\n */\nexport function allAttachments(\n this: RxDocument\n): RxAttachment[] {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n\n // if there are no attachments, the field is missing\n if (!docData._attachments) {\n return [];\n }\n return Object.keys(docData._attachments)\n .map(id => {\n return fromStorageInstanceResult(\n id,\n docData._attachments[id],\n this\n );\n });\n}\n\nexport async function preMigrateDocument(\n data: {\n docData: RxDocumentData;\n oldCollection: any; // TODO\n }\n): Promise {\n const attachments = data.docData._attachments;\n if (attachments) {\n const newAttachments: { [attachmentId: string]: RxAttachmentWriteData; } = {};\n await Promise.all(\n Object.keys(attachments).map(async (attachmentId) => {\n const attachment: RxAttachmentData = attachments[attachmentId];\n const docPrimary: string = (data.docData as any)[data.oldCollection.schema.primaryPath];\n const rawAttachmentData = await data.oldCollection.storageInstance.getAttachmentData(\n docPrimary,\n attachmentId,\n attachment.digest\n );\n const digest = await data.oldCollection.database.hashFunction(rawAttachmentData);\n newAttachments[attachmentId] = {\n length: attachment.length,\n type: attachment.type,\n data: rawAttachmentData,\n digest\n };\n })\n );\n\n /**\n * Hooks mutate the input\n * instead of returning stuff\n */\n (data.docData as RxDocumentWriteData)._attachments = newAttachments;\n }\n}\n\nexport function postMigrateDocument(_action: any): Promise {\n /**\n * No longer needed because\n * we store the attachments data buffers directly in the document.\n */\n return PROMISE_RESOLVE_VOID;\n}\n\nexport const RxDBAttachmentsPlugin: RxPlugin = {\n name: 'attachments',\n rxdb: true,\n prototypes: {\n RxDocument: (proto: any) => {\n proto.putAttachment = putAttachment;\n proto.getAttachment = getAttachment;\n proto.allAttachments = allAttachments;\n Object.defineProperty(proto, 'allAttachments$', {\n get: function allAttachments$(this: RxDocument) {\n return this.$\n .pipe(\n map(rxDocument => Object.entries(\n rxDocument.toJSON(true)._attachments\n )),\n map(entries => {\n return (entries as any)\n .map(([id, attachmentData]: any) => {\n return fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n });\n })\n );\n }\n });\n }\n },\n overwritable: {},\n hooks: {\n preMigrateDocument: {\n after: preMigrateDocument\n },\n postMigrateDocument: {\n after: postMigrateDocument\n }\n }\n};\n\n\nexport * from './attachments-utils.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/backup/index.js.map b/dist/cjs/plugins/backup/index.js.map index 91a1d8b35d6..86627b9be54 100644 --- a/dist/cjs/plugins/backup/index.js.map +++ b/dist/cjs/plugins/backup/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["path","_interopRequireWildcard","require","_rxjs","_index","_fileUtil","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_rxStorageHelper","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","backupSingleDocument","rxDocument","options","data","toJSON","writtenFiles","docFolder","documentFolder","primary","clearFolder","fileLocation","join","writeJsonToFile","push","attachments","attachmentsFolder","ensureFolderExists","allAttachments","Promise","all","map","attachment","content","getData","attachmentFileLocation","id","writeToFile","BACKUP_STATES_BY_DB","addToBackupStates","db","state","ar","getFromMapOrCreate","RxBackupState","database","isStopped","subs","persistRunning","PROMISE_RESOLVE_VOID","initialReplicationDone$","BehaviorSubject","internalWriteEvents$","Subject","writeEvents$","asObservable","batchSize","prepareFolders","_proto","persistOnce","then","_persistOnce","_this","meta","getMeta","entries","collections","collectionName","collection","primaryKey","schema","primaryPath","processedDocuments","Set","requestIdlePromise","collectionStates","lastCheckpoint","checkpoint","hasMore","_loop","changesResult","getChangedDocumentsSince","storageInstance","documents","length","docIds","doc","filter","add","elem","pos","arr","indexOf","docs","findByIds","exec","size","Array","from","values","next","name","documentId","files","deleted","docId","deleteFolder","setMeta","getValue","watchForChanges","changes$","changeStream","sub","subscribe","awaitInitialBackup","firstValueFrom","pipe","v","cancel","PROMISE_RESOLVE_FALSE","unsubscribe","PROMISE_RESOLVE_TRUE","backup","backupState","live","RxDBBackupPlugin","rxdb","prototypes","RxDatabase","proto","hooks","preDestroyRxDatabase","after","states"],"sources":["../../../../src/plugins/backup/index.ts"],"sourcesContent":["import * as path from 'node:path';\nimport {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport {\n filter,\n map\n} from 'rxjs';\nimport type {\n BackupOptions,\n RxBackupWriteEvent,\n RxCollection,\n RxDatabase,\n RxDocument,\n RxPlugin\n} from '../../types/index.d.ts';\nimport {\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport {\n clearFolder,\n deleteFolder,\n documentFolder,\n ensureFolderExists,\n getMeta,\n prepareFolders,\n setMeta,\n writeJsonToFile,\n writeToFile\n} from './file-util.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\n\n\n/**\n * Backups a single documents,\n * returns the paths to all written files\n */\nexport async function backupSingleDocument(\n rxDocument: RxDocument,\n options: BackupOptions\n): Promise {\n const data = rxDocument.toJSON(true);\n const writtenFiles: string[] = [];\n\n const docFolder = documentFolder(options, rxDocument.primary);\n await clearFolder(docFolder);\n\n const fileLocation = path.join(\n docFolder,\n 'document.json'\n );\n await writeJsonToFile(fileLocation, data);\n writtenFiles.push(fileLocation);\n\n if (options.attachments) {\n const attachmentsFolder = path.join(\n docFolder,\n 'attachments'\n );\n ensureFolderExists(attachmentsFolder);\n const attachments = (rxDocument as RxDocument).allAttachments();\n await Promise.all(\n attachments\n .map(async (attachment) => {\n const content = await attachment.getData();\n const attachmentFileLocation = path.join(\n attachmentsFolder,\n attachment.id\n );\n await writeToFile(attachmentFileLocation, content);\n writtenFiles.push(attachmentFileLocation);\n })\n );\n }\n\n return writtenFiles;\n}\n\nconst BACKUP_STATES_BY_DB: WeakMap = new WeakMap();\nfunction addToBackupStates(db: RxDatabase, state: RxBackupState) {\n const ar = getFromMapOrCreate(\n BACKUP_STATES_BY_DB,\n db,\n () => []\n );\n ar.push(state);\n}\n\nexport class RxBackupState {\n public isStopped: boolean = false;\n private subs: Subscription[] = [];\n private persistRunning: Promise = PROMISE_RESOLVE_VOID;\n private initialReplicationDone$: BehaviorSubject = new BehaviorSubject(false as any);\n\n private readonly internalWriteEvents$: Subject = new Subject();\n public readonly writeEvents$: Observable = this.internalWriteEvents$.asObservable();\n\n constructor(\n public readonly database: RxDatabase,\n public readonly options: BackupOptions\n ) {\n if (!this.options.batchSize) {\n this.options.batchSize = 10;\n }\n addToBackupStates(database, this);\n prepareFolders(database, options);\n }\n\n /**\n * Persists all data from all collections,\n * beginning from the oldest sequence checkpoint\n * to the newest one.\n * Do not call this while it is already running.\n * Returns true if there are more documents to process\n */\n public persistOnce() {\n return this.persistRunning = this.persistRunning.then(() => this._persistOnce());\n }\n\n public async _persistOnce() {\n const meta = await getMeta(this.options);\n\n await Promise.all(\n Object\n .entries(this.database.collections)\n .map(async ([collectionName, collection]) => {\n const primaryKey = collection.schema.primaryPath;\n const processedDocuments: Set = new Set();\n\n await this.database.requestIdlePromise();\n\n if (!meta.collectionStates[collectionName]) {\n meta.collectionStates[collectionName] = {};\n }\n let lastCheckpoint = meta.collectionStates[collectionName].checkpoint;\n\n let hasMore = true;\n while (hasMore && !this.isStopped) {\n await this.database.requestIdlePromise();\n const changesResult = await getChangedDocumentsSince(\n collection.storageInstance,\n this.options.batchSize ? this.options.batchSize : 0,\n lastCheckpoint\n );\n lastCheckpoint = changesResult.documents.length > 0 ? changesResult.checkpoint : lastCheckpoint;\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n\n const docIds: string[] = changesResult.documents\n .map(doc => doc[primaryKey])\n .filter(id => {\n if (\n processedDocuments.has(id)\n ) {\n return false;\n } else {\n processedDocuments.add(id);\n return true;\n }\n })\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos); // unique\n await this.database.requestIdlePromise();\n\n const docs: Map = await collection.findByIds(docIds).exec();\n if (docs.size === 0) {\n hasMore = false;\n continue;\n }\n await Promise.all(\n Array\n .from(docs.values())\n .map(async (doc) => {\n const writtenFiles = await backupSingleDocument(doc, this.options);\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: doc.primary,\n files: writtenFiles,\n deleted: false\n });\n })\n );\n // handle deleted documents\n await Promise.all(\n docIds\n .filter(docId => !docs.has(docId))\n .map(async (docId) => {\n await deleteFolder(documentFolder(this.options, docId));\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: docId,\n files: [],\n deleted: true\n });\n })\n );\n }\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n await setMeta(this.options, meta);\n })\n );\n\n if (!this.initialReplicationDone$.getValue()) {\n this.initialReplicationDone$.next(true);\n }\n }\n\n public watchForChanges() {\n const collections: RxCollection[] = Object.values(this.database.collections);\n collections.forEach(collection => {\n const changes$ = collection.storageInstance.changeStream();\n const sub = changes$.subscribe(() => {\n this.persistOnce();\n });\n this.subs.push(sub);\n });\n }\n\n /**\n * Returns a promise that resolves when the initial backup is done\n * and the filesystem is in sync with the database state\n */\n public awaitInitialBackup(): Promise {\n return firstValueFrom(\n this.initialReplicationDone$.pipe(\n filter(v => !!v),\n map(() => true)\n )\n );\n }\n\n cancel(): Promise {\n if (this.isStopped) {\n return PROMISE_RESOLVE_FALSE;\n }\n this.isStopped = true;\n this.subs.forEach(sub => sub.unsubscribe());\n return PROMISE_RESOLVE_TRUE;\n }\n}\n\n\nexport function backup(\n this: RxDatabase,\n options: BackupOptions\n): RxBackupState {\n const backupState = new RxBackupState(this, options);\n backupState.persistOnce();\n\n if (options.live) {\n backupState.watchForChanges();\n }\n\n return backupState;\n}\n\nexport * from './file-util.ts';\nexport const RxDBBackupPlugin: RxPlugin = {\n name: 'backup',\n rxdb: true,\n prototypes: {\n RxDatabase(proto: any) {\n proto.backup = backup;\n }\n },\n hooks: {\n preDestroyRxDatabase: {\n after: function preDestroyRxDatabase(db: RxDatabase) {\n const states = BACKUP_STATES_BY_DB.get(db);\n if (states) {\n states.forEach(state => state.cancel());\n }\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["path","_interopRequireWildcard","require","_rxjs","_index","_fileUtil","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_rxStorageHelper","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","backupSingleDocument","rxDocument","options","data","toJSON","writtenFiles","docFolder","documentFolder","primary","clearFolder","fileLocation","join","writeJsonToFile","push","attachments","attachmentsFolder","ensureFolderExists","allAttachments","Promise","all","map","attachment","content","getData","attachmentFileLocation","id","writeToFile","BACKUP_STATES_BY_DB","addToBackupStates","db","state","ar","getFromMapOrCreate","RxBackupState","database","isStopped","subs","persistRunning","PROMISE_RESOLVE_VOID","initialReplicationDone$","BehaviorSubject","internalWriteEvents$","Subject","writeEvents$","asObservable","batchSize","prepareFolders","_proto","persistOnce","then","_persistOnce","_this","meta","getMeta","entries","collections","collectionName","collection","primaryKey","schema","primaryPath","processedDocuments","Set","requestIdlePromise","collectionStates","lastCheckpoint","checkpoint","hasMore","_loop","changesResult","getChangedDocumentsSince","storageInstance","documents","length","docIds","doc","filter","add","elem","pos","arr","indexOf","docs","findByIds","exec","size","Array","from","values","next","name","documentId","files","deleted","docId","deleteFolder","setMeta","getValue","watchForChanges","changes$","changeStream","sub","subscribe","awaitInitialBackup","firstValueFrom","pipe","v","cancel","PROMISE_RESOLVE_FALSE","unsubscribe","PROMISE_RESOLVE_TRUE","backup","backupState","live","RxDBBackupPlugin","rxdb","prototypes","RxDatabase","proto","hooks","preDestroyRxDatabase","after","states"],"sources":["../../../../src/plugins/backup/index.ts"],"sourcesContent":["import * as path from 'node:path';\nimport {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport {\n filter,\n map\n} from 'rxjs';\nimport type {\n BackupOptions,\n RxBackupWriteEvent,\n RxCollection,\n RxDatabase,\n RxDocument,\n RxPlugin\n} from '../../types/index.d.ts';\nimport {\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport {\n clearFolder,\n deleteFolder,\n documentFolder,\n ensureFolderExists,\n getMeta,\n prepareFolders,\n setMeta,\n writeJsonToFile,\n writeToFile\n} from './file-util.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\n\n\n/**\n * Backups a single documents,\n * returns the paths to all written files\n */\nexport async function backupSingleDocument(\n rxDocument: RxDocument,\n options: BackupOptions\n): Promise {\n const data = rxDocument.toJSON(true);\n const writtenFiles: string[] = [];\n\n const docFolder = documentFolder(options, rxDocument.primary);\n await clearFolder(docFolder);\n\n const fileLocation = path.join(\n docFolder,\n 'document.json'\n );\n await writeJsonToFile(fileLocation, data);\n writtenFiles.push(fileLocation);\n\n if (options.attachments) {\n const attachmentsFolder = path.join(\n docFolder,\n 'attachments'\n );\n ensureFolderExists(attachmentsFolder);\n const attachments = (rxDocument as RxDocument).allAttachments();\n await Promise.all(\n attachments\n .map(async (attachment) => {\n const content = await attachment.getData();\n const attachmentFileLocation = path.join(\n attachmentsFolder,\n attachment.id\n );\n await writeToFile(attachmentFileLocation, content);\n writtenFiles.push(attachmentFileLocation);\n })\n );\n }\n\n return writtenFiles;\n}\n\nconst BACKUP_STATES_BY_DB: WeakMap = new WeakMap();\nfunction addToBackupStates(db: RxDatabase, state: RxBackupState) {\n const ar = getFromMapOrCreate(\n BACKUP_STATES_BY_DB,\n db,\n () => []\n );\n ar.push(state);\n}\n\nexport class RxBackupState {\n public isStopped: boolean = false;\n private subs: Subscription[] = [];\n private persistRunning: Promise = PROMISE_RESOLVE_VOID;\n private initialReplicationDone$: BehaviorSubject = new BehaviorSubject(false as any);\n\n private readonly internalWriteEvents$: Subject = new Subject();\n public readonly writeEvents$: Observable = this.internalWriteEvents$.asObservable();\n\n constructor(\n public readonly database: RxDatabase,\n public readonly options: BackupOptions\n ) {\n if (!this.options.batchSize) {\n this.options.batchSize = 10;\n }\n addToBackupStates(database, this);\n prepareFolders(database, options);\n }\n\n /**\n * Persists all data from all collections,\n * beginning from the oldest sequence checkpoint\n * to the newest one.\n * Do not call this while it is already running.\n * Returns true if there are more documents to process\n */\n public persistOnce() {\n return this.persistRunning = this.persistRunning.then(() => this._persistOnce());\n }\n\n public async _persistOnce() {\n const meta = await getMeta(this.options);\n\n await Promise.all(\n Object\n .entries(this.database.collections)\n .map(async ([collectionName, collection]) => {\n const primaryKey = collection.schema.primaryPath;\n const processedDocuments: Set = new Set();\n\n await this.database.requestIdlePromise();\n\n if (!meta.collectionStates[collectionName]) {\n meta.collectionStates[collectionName] = {};\n }\n let lastCheckpoint = meta.collectionStates[collectionName].checkpoint;\n\n let hasMore = true;\n while (hasMore && !this.isStopped) {\n await this.database.requestIdlePromise();\n const changesResult = await getChangedDocumentsSince(\n collection.storageInstance,\n this.options.batchSize ? this.options.batchSize : 0,\n lastCheckpoint\n );\n lastCheckpoint = changesResult.documents.length > 0 ? changesResult.checkpoint : lastCheckpoint;\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n\n const docIds: string[] = changesResult.documents\n .map(doc => doc[primaryKey])\n .filter(id => {\n if (\n processedDocuments.has(id)\n ) {\n return false;\n } else {\n processedDocuments.add(id);\n return true;\n }\n })\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos); // unique\n await this.database.requestIdlePromise();\n\n const docs: Map = await collection.findByIds(docIds).exec();\n if (docs.size === 0) {\n hasMore = false;\n continue;\n }\n await Promise.all(\n Array\n .from(docs.values())\n .map(async (doc) => {\n const writtenFiles = await backupSingleDocument(doc, this.options);\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: doc.primary,\n files: writtenFiles,\n deleted: false\n });\n })\n );\n // handle deleted documents\n await Promise.all(\n docIds\n .filter(docId => !docs.has(docId))\n .map(async (docId) => {\n await deleteFolder(documentFolder(this.options, docId));\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: docId,\n files: [],\n deleted: true\n });\n })\n );\n }\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n await setMeta(this.options, meta);\n })\n );\n\n if (!this.initialReplicationDone$.getValue()) {\n this.initialReplicationDone$.next(true);\n }\n }\n\n public watchForChanges() {\n const collections: RxCollection[] = Object.values(this.database.collections);\n collections.forEach(collection => {\n const changes$ = collection.storageInstance.changeStream();\n const sub = changes$.subscribe(() => {\n this.persistOnce();\n });\n this.subs.push(sub);\n });\n }\n\n /**\n * Returns a promise that resolves when the initial backup is done\n * and the filesystem is in sync with the database state\n */\n public awaitInitialBackup(): Promise {\n return firstValueFrom(\n this.initialReplicationDone$.pipe(\n filter(v => !!v),\n map(() => true)\n )\n );\n }\n\n cancel(): Promise {\n if (this.isStopped) {\n return PROMISE_RESOLVE_FALSE;\n }\n this.isStopped = true;\n this.subs.forEach(sub => sub.unsubscribe());\n return PROMISE_RESOLVE_TRUE;\n }\n}\n\n\nexport function backup(\n this: RxDatabase,\n options: BackupOptions\n): RxBackupState {\n const backupState = new RxBackupState(this, options);\n backupState.persistOnce();\n\n if (options.live) {\n backupState.watchForChanges();\n }\n\n return backupState;\n}\n\nexport * from './file-util.ts';\nexport const RxDBBackupPlugin: RxPlugin = {\n name: 'backup',\n rxdb: true,\n prototypes: {\n RxDatabase(proto: any) {\n proto.backup = backup;\n }\n },\n hooks: {\n preDestroyRxDatabase: {\n after: function preDestroyRxDatabase(db: RxDatabase) {\n const states = BACKUP_STATES_BY_DB.get(db);\n if (states) {\n states.forEach(state => state.cancel());\n }\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/migration-schema/rx-migration-state.js.map b/dist/cjs/plugins/migration-schema/rx-migration-state.js.map index cd76131b205..d83b926c0d4 100644 --- a/dist/cjs/plugins/migration-schema/rx-migration-state.js.map +++ b/dist/cjs/plugins/migration-schema/rx-migration-state.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-migration-state.js","names":["_rxjs","require","_rxError","_migrationHelpers","_index","_rxStorageHelper","_broadcastChannel","_index2","_overwritable","_rxDatabaseInternalStore","_rxQuery","_rxQueryHelper","RxMigrationState","exports","collection","migrationStrategies","statusDocKey","name","schema","version","join","started","updateStatusHandlers","updateStatusQueue","PROMISE_RESOLVE_TRUE","database","oldCollectionMeta","getOldCollectionMeta","mustMigrate","statusDocId","getPrimaryKeyOfInternalDocument","INTERNAL_CONTEXT_MIGRATION_STATUS","addMigrationStateToDatabase","$","observeSingle","internalStore","pipe","filter","d","map","ensureNotFalsy","data","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","_proto","prototype","getStatus","firstValueFrom","startMigration","batchSize","MIGRATION_DEFAULT_BATCH_SIZE","must","newRxError","broadcastChannel","undefined","multiInstance","BroadcastChannel","leaderElector","createLeaderElection","awaitLeadership","oldStorageInstance","storage","createStorageInstance","databaseName","collectionName","databaseInstanceToken","token","options","password","devMode","overwritable","isDevMode","connectedInstances","getConnectedStorageInstances","totalCount","countAllDoucments","concat","r","oldStorage","updateStatus","s","count","total","Promise","all","connectedInstance","addConnectedStorageToCollection","newStorage","migrateStorage","close","storageInstance","originalStorageInstance","err","status","error","errorToPlainJson","writeSingle","previous","document","Object","assign","_deleted","handler","push","then","length","useHandlers","getSingleDocument","newDoc","clone","id","key","context","handled","percent","_meta","getDefaultRxDocumentMeta","_rev","getDefaultRevision","_attachments","oneHandler","Math","round","deepEqual","isBulkWriteConflictError","replicationMetaStorageInstance","getRxReplicationMetaInstanceSchema","hasEncryption","replicationHandlerBase","rxStorageInstanceToReplicationHandler","defaultConflictHandler","replicationState","replicateRxStorageInstance","keepMeta","identifier","replicationHandler","masterChangesSince","resolve","checkpoint","documents","masterWrite","rows","row","newDocData","newDocumentState","title","META_INSTANCE_SCHEMA_TITLE","docData","isCheckpoint","assumedMasterState","migratedDocData","migrateDocumentData","newRow","result","masterChangeStream$","Subject","asObservable","forkInstance","metaInstance","pushBatchSize","pullBatchSize","conflictHandler","hashFunction","hasError","events","subscribe","processed","up","awaitRxStorageReplicationFirstInSync","cancelRxStorageReplication","remove","storageInstances","ret","instance","preparedQuery","prepareQuery","normalizeMangoQuery","selector","countResult","connectedStorages","connectedStorage","Error","newSchema","jsonSchema","migratePromise","race"],"sources":["../../../../src/plugins/migration-schema/rx-migration-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n filter,\n firstValueFrom,\n map,\n shareReplay\n} from 'rxjs';\nimport {\n isBulkWriteConflictError,\n newRxError\n} from '../../rx-error.ts';\nimport type {\n NumberFunctionMap,\n RxCollection,\n RxDatabase,\n RxError,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n MIGRATION_DEFAULT_BATCH_SIZE,\n addMigrationStateToDatabase,\n getOldCollectionMeta,\n migrateDocumentData,\n mustMigrate\n} from './migration-helpers.ts';\nimport {\n PROMISE_RESOLVE_TRUE,\n RXJS_SHARE_REPLAY_DEFAULTS,\n clone,\n deepEqual,\n ensureNotFalsy,\n errorToPlainJson,\n getDefaultRevision,\n getDefaultRxDocumentMeta\n} from '../utils/index.ts';\nimport type {\n MigrationStatusUpdate,\n RxMigrationStatus,\n RxMigrationStatusDocument\n} from './migration-types.ts';\nimport {\n getSingleDocument,\n hasEncryption,\n observeSingle,\n writeSingle\n} from '../../rx-storage-helper.ts';\nimport {\n BroadcastChannel,\n createLeaderElection\n} from 'broadcast-channel';\nimport {\n META_INSTANCE_SCHEMA_TITLE,\n awaitRxStorageReplicationFirstInSync,\n cancelRxStorageReplication,\n defaultConflictHandler,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance,\n rxStorageInstanceToReplicationHandler\n} from '../../replication-protocol/index.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n INTERNAL_CONTEXT_MIGRATION_STATUS,\n addConnectedStorageToCollection,\n getPrimaryKeyOfInternalDocument\n} from '../../rx-database-internal-store.ts';\nimport { prepareQuery } from '../../rx-query.ts';\nimport { normalizeMangoQuery } from '../../rx-query-helper.ts';\n\n\n\nexport class RxMigrationState {\n\n public database: RxDatabase;\n\n\n private started: boolean = false;\n public readonly oldCollectionMeta: ReturnType;\n public readonly mustMigrate: ReturnType;\n public readonly statusDocId: string;\n public readonly $: Observable;\n\n constructor(\n public readonly collection: RxCollection,\n public readonly migrationStrategies: NumberFunctionMap,\n public readonly statusDocKey = [\n collection.name,\n 'v',\n collection.schema.version\n ].join('-'),\n ) {\n this.database = collection.database;\n this.oldCollectionMeta = getOldCollectionMeta(this);\n this.mustMigrate = mustMigrate(this);\n this.statusDocId = getPrimaryKeyOfInternalDocument(\n this.statusDocKey,\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n addMigrationStateToDatabase(this);\n\n this.$ = observeSingle(\n this.database.internalStore,\n this.statusDocId\n ).pipe(\n filter(d => !!d),\n map(d => ensureNotFalsy(d).data),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\n );\n }\n\n getStatus() {\n return firstValueFrom(this.$);\n }\n\n\n /**\n * Starts the migration.\n * Returns void so that people to not get the idea to await\n * this function.\n * Instead use migratePromise() if you want to await\n * the migration. This ensures it works even if the migration\n * is run on a different browser tab.\n */\n async startMigration(batchSize: number = MIGRATION_DEFAULT_BATCH_SIZE): Promise {\n const must = await this.mustMigrate;\n if (!must) {\n return;\n }\n if (this.started) {\n throw newRxError('DM1');\n }\n this.started = true;\n\n\n let broadcastChannel: BroadcastChannel | undefined = undefined;\n /**\n * To ensure that multiple tabs do not migrate the same collection,\n * we use a new broadcastChannel/leaderElector for each collection.\n * This is required because collections can be added dynamically and\n * not all tabs might know about this collection.\n */\n if (this.database.multiInstance) {\n broadcastChannel = new BroadcastChannel([\n 'rx-migration-state',\n this.database.name,\n this.collection.name,\n this.collection.schema.version\n ].join('|'));\n const leaderElector = createLeaderElection(broadcastChannel);\n await leaderElector.awaitLeadership();\n }\n\n /**\n * Instead of writing a custom migration protocol,\n * we do a push-only replication from the old collection data to the new one.\n * This also ensure that restarting the replication works without problems.\n */\n const oldCollectionMeta = await this.oldCollectionMeta;\n const oldStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: this.collection.name,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: oldCollectionMeta.data.schema,\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n\n const connectedInstances = await this.getConnectedStorageInstances();\n\n\n /**\n * Initially write the migration status into a meta document.\n */\n const totalCount = await this.countAllDoucments(\n [oldStorageInstance].concat(connectedInstances.map(r => r.oldStorage))\n );\n await this.updateStatus(s => {\n s.count.total = totalCount;\n return s;\n });\n\n\n try {\n /**\n * First migrate the connected storages,\n * afterwards migrate the normal collection.\n */\n await Promise.all(\n connectedInstances.map(async (connectedInstance) => {\n await addConnectedStorageToCollection(\n this.collection,\n connectedInstance.newStorage.collectionName,\n connectedInstance.newStorage.schema\n );\n await this.migrateStorage(\n connectedInstance.oldStorage,\n connectedInstance.newStorage,\n batchSize\n );\n await connectedInstance.newStorage.close();\n })\n );\n\n await this.migrateStorage(\n oldStorageInstance,\n /**\n * Use the originalStorageInstance here\n * so that the _meta.lwt time keeps the same\n * and our replication checkpoints still point to the\n * correct checkpoint.\n */\n this.collection.storageInstance.originalStorageInstance,\n batchSize\n );\n } catch (err) {\n await oldStorageInstance.close();\n await this.updateStatus(s => {\n s.status = 'ERROR';\n s.error = errorToPlainJson(err as Error);\n return s;\n });\n return;\n }\n\n\n // remove old collection meta doc\n await writeSingle(\n this.database.internalStore,\n {\n previous: oldCollectionMeta,\n document: Object.assign(\n {},\n oldCollectionMeta,\n {\n _deleted: true\n }\n )\n },\n 'rx-migration-remove-collection-meta'\n );\n\n await this.updateStatus(s => {\n s.status = 'DONE';\n return s;\n });\n if (broadcastChannel) {\n await broadcastChannel.close();\n }\n }\n\n public updateStatusHandlers: MigrationStatusUpdate[] = [];\n public updateStatusQueue: Promise = PROMISE_RESOLVE_TRUE;\n public updateStatus(\n handler: MigrationStatusUpdate\n ) {\n this.updateStatusHandlers.push(handler);\n this.updateStatusQueue = this.updateStatusQueue.then(async () => {\n if (this.updateStatusHandlers.length === 0) {\n return;\n }\n // re-run until no conflict\n const useHandlers = this.updateStatusHandlers;\n this.updateStatusHandlers = [];\n while (true) {\n const previous = await getSingleDocument(\n this.database.internalStore,\n this.statusDocId\n );\n let newDoc = clone(previous);\n if (!previous) {\n newDoc = {\n id: this.statusDocId,\n key: this.statusDocKey,\n context: INTERNAL_CONTEXT_MIGRATION_STATUS,\n data: {\n collectionName: this.collection.name,\n status: 'RUNNING',\n count: {\n total: 0,\n handled: 0,\n percent: 0\n }\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n }\n\n let status = ensureNotFalsy(newDoc).data;\n for (const oneHandler of useHandlers) {\n status = oneHandler(status);\n }\n status.count.percent = Math.round((status.count.handled / status.count.total) * 100);\n\n if (\n newDoc && previous &&\n deepEqual(newDoc.data, previous.data)\n ) {\n break;\n }\n\n\n try {\n await writeSingle(\n this.database.internalStore,\n {\n previous,\n document: ensureNotFalsy(newDoc)\n },\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n\n // write successful\n break;\n } catch (err) {\n // ignore conflicts\n if (!isBulkWriteConflictError(err)) {\n throw err;\n }\n }\n }\n });\n return this.updateStatusQueue;\n }\n\n\n public async migrateStorage(\n oldStorage: RxStorageInstance,\n newStorage: RxStorageInstance,\n batchSize: number\n ) {\n const replicationMetaStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: 'rx-migration-state-meta-' + this.collection.name + '-' + this.collection.schema.version,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: getRxReplicationMetaInstanceSchema(oldStorage.schema, hasEncryption(oldStorage.schema)),\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n const replicationHandlerBase = rxStorageInstanceToReplicationHandler(\n newStorage,\n /**\n * Ignore push-conflicts.\n * If this happens we drop the 'old' document state.\n */\n defaultConflictHandler,\n this.database.token,\n true\n );\n\n const replicationState = replicateRxStorageInstance({\n keepMeta: true,\n identifier: [\n 'rx-migration-state',\n this.collection.name,\n oldStorage.schema.version,\n this.collection.schema.version\n ].join('-'),\n replicationHandler: {\n masterChangesSince() {\n return Promise.resolve({\n checkpoint: null,\n documents: []\n });\n },\n masterWrite: async (rows) => {\n rows = await Promise.all(\n rows\n .map(async (row) => {\n let newDocData = row.newDocumentState;\n if (newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE) {\n newDocData = row.newDocumentState.docData;\n if (row.newDocumentState.isCheckpoint === '1') {\n return {\n assumedMasterState: undefined,\n newDocumentState: row.newDocumentState\n };\n }\n }\n const migratedDocData: RxReplicationWriteToMasterRow = await migrateDocumentData(\n this.collection,\n oldStorage.schema.version,\n newDocData\n );\n const newRow: RxReplicationWriteToMasterRow = {\n // drop the assumed master state, we do not have to care about conflicts here.\n assumedMasterState: undefined,\n newDocumentState: newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE\n ? Object.assign({}, row.newDocumentState, { docData: migratedDocData })\n : migratedDocData\n };\n return newRow;\n })\n );\n\n // filter out the documents where the migration strategy returned null\n rows = rows.filter(row => !!row.newDocumentState);\n\n const result = await replicationHandlerBase.masterWrite(rows);\n return result;\n },\n masterChangeStream$: new Subject().asObservable()\n },\n forkInstance: oldStorage,\n metaInstance: replicationMetaStorageInstance,\n pushBatchSize: batchSize,\n pullBatchSize: 0,\n conflictHandler: defaultConflictHandler,\n hashFunction: this.database.hashFunction\n });\n\n\n let hasError: RxError | RxTypeError | false = false;\n replicationState.events.error.subscribe(err => hasError = err);\n\n // update replication status on each change\n replicationState.events.processed.up.subscribe(() => {\n this.updateStatus(status => {\n status.count.handled = status.count.handled + 1;\n return status;\n });\n });\n\n await awaitRxStorageReplicationFirstInSync(replicationState);\n await cancelRxStorageReplication(replicationState);\n\n await this.updateStatusQueue;\n if (hasError) {\n await replicationMetaStorageInstance.close();\n throw hasError;\n }\n\n // cleanup old storages\n await Promise.all([\n oldStorage.remove(),\n replicationMetaStorageInstance.remove()\n ]);\n }\n\n public async countAllDoucments(\n storageInstances: RxStorageInstance[]\n ): Promise {\n let ret = 0;\n await Promise.all(\n storageInstances.map(async (instance) => {\n\n const preparedQuery = prepareQuery(\n instance.schema,\n normalizeMangoQuery(\n instance.schema,\n {\n selector: {}\n }\n )\n );\n const countResult = await instance.count(preparedQuery);\n ret += countResult.count;\n })\n );\n return ret;\n }\n\n public async getConnectedStorageInstances() {\n const oldCollectionMeta = await this.oldCollectionMeta;\n const ret: {\n oldStorage: RxStorageInstance;\n newStorage: RxStorageInstance;\n }[] = [];\n\n await Promise.all(\n await Promise.all(\n oldCollectionMeta\n .data\n .connectedStorages\n .map(async (connectedStorage) => {\n\n // atm we can only migrate replication states.\n if (connectedStorage.schema.title !== META_INSTANCE_SCHEMA_TITLE) {\n throw new Error('unknown migration handling for schema');\n }\n\n const newSchema = getRxReplicationMetaInstanceSchema(\n clone(this.collection.schema.jsonSchema),\n hasEncryption(connectedStorage.schema)\n );\n newSchema.version = this.collection.schema.version;\n const [oldStorage, newStorage] = await Promise.all([\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: connectedStorage.schema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n }),\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: newSchema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n })\n ]);\n ret.push({ oldStorage, newStorage });\n })\n )\n );\n\n return ret;\n }\n\n\n\n async migratePromise(batchSize?: number): Promise {\n this.startMigration(batchSize);\n const must = await this.mustMigrate;\n if (!must) {\n return {\n status: 'DONE',\n collectionName: this.collection.name,\n count: {\n handled: 0,\n percent: 0,\n total: 0\n }\n };\n }\n\n const result = await Promise.race([\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'DONE')\n )\n ),\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'ERROR')\n )\n )\n ]);\n\n if (result.status === 'ERROR') {\n throw newRxError('DM4', {\n collection: this.collection.name,\n error: result.error\n });\n } else {\n return result;\n }\n\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-migration-state.js","names":["_rxjs","require","_rxError","_migrationHelpers","_index","_rxStorageHelper","_broadcastChannel","_index2","_overwritable","_rxDatabaseInternalStore","_rxQuery","_rxQueryHelper","RxMigrationState","exports","collection","migrationStrategies","statusDocKey","name","schema","version","join","started","updateStatusHandlers","updateStatusQueue","PROMISE_RESOLVE_TRUE","database","oldCollectionMeta","getOldCollectionMeta","mustMigrate","statusDocId","getPrimaryKeyOfInternalDocument","INTERNAL_CONTEXT_MIGRATION_STATUS","addMigrationStateToDatabase","$","observeSingle","internalStore","pipe","filter","d","map","ensureNotFalsy","data","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","_proto","prototype","getStatus","firstValueFrom","startMigration","batchSize","MIGRATION_DEFAULT_BATCH_SIZE","must","newRxError","broadcastChannel","undefined","multiInstance","BroadcastChannel","leaderElector","createLeaderElection","awaitLeadership","oldStorageInstance","storage","createStorageInstance","databaseName","collectionName","databaseInstanceToken","token","options","password","devMode","overwritable","isDevMode","connectedInstances","getConnectedStorageInstances","totalCount","countAllDoucments","concat","r","oldStorage","updateStatus","s","count","total","Promise","all","connectedInstance","addConnectedStorageToCollection","newStorage","migrateStorage","close","storageInstance","originalStorageInstance","err","status","error","errorToPlainJson","writeSingle","previous","document","Object","assign","_deleted","handler","push","then","length","useHandlers","getSingleDocument","newDoc","clone","id","key","context","handled","percent","_meta","getDefaultRxDocumentMeta","_rev","getDefaultRevision","_attachments","oneHandler","Math","round","deepEqual","isBulkWriteConflictError","replicationMetaStorageInstance","getRxReplicationMetaInstanceSchema","hasEncryption","replicationHandlerBase","rxStorageInstanceToReplicationHandler","defaultConflictHandler","replicationState","replicateRxStorageInstance","keepMeta","identifier","replicationHandler","masterChangesSince","resolve","checkpoint","documents","masterWrite","rows","row","newDocData","newDocumentState","title","META_INSTANCE_SCHEMA_TITLE","docData","isCheckpoint","assumedMasterState","migratedDocData","migrateDocumentData","newRow","result","masterChangeStream$","Subject","asObservable","forkInstance","metaInstance","pushBatchSize","pullBatchSize","conflictHandler","hashFunction","hasError","events","subscribe","processed","up","awaitRxStorageReplicationFirstInSync","cancelRxStorageReplication","remove","storageInstances","ret","instance","preparedQuery","prepareQuery","normalizeMangoQuery","selector","countResult","connectedStorages","connectedStorage","Error","newSchema","jsonSchema","migratePromise","race"],"sources":["../../../../src/plugins/migration-schema/rx-migration-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n filter,\n firstValueFrom,\n map,\n shareReplay\n} from 'rxjs';\nimport {\n isBulkWriteConflictError,\n newRxError\n} from '../../rx-error.ts';\nimport type {\n NumberFunctionMap,\n RxCollection,\n RxDatabase,\n RxError,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n MIGRATION_DEFAULT_BATCH_SIZE,\n addMigrationStateToDatabase,\n getOldCollectionMeta,\n migrateDocumentData,\n mustMigrate\n} from './migration-helpers.ts';\nimport {\n PROMISE_RESOLVE_TRUE,\n RXJS_SHARE_REPLAY_DEFAULTS,\n clone,\n deepEqual,\n ensureNotFalsy,\n errorToPlainJson,\n getDefaultRevision,\n getDefaultRxDocumentMeta\n} from '../utils/index.ts';\nimport type {\n MigrationStatusUpdate,\n RxMigrationStatus,\n RxMigrationStatusDocument\n} from './migration-types.ts';\nimport {\n getSingleDocument,\n hasEncryption,\n observeSingle,\n writeSingle\n} from '../../rx-storage-helper.ts';\nimport {\n BroadcastChannel,\n createLeaderElection\n} from 'broadcast-channel';\nimport {\n META_INSTANCE_SCHEMA_TITLE,\n awaitRxStorageReplicationFirstInSync,\n cancelRxStorageReplication,\n defaultConflictHandler,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance,\n rxStorageInstanceToReplicationHandler\n} from '../../replication-protocol/index.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n INTERNAL_CONTEXT_MIGRATION_STATUS,\n addConnectedStorageToCollection,\n getPrimaryKeyOfInternalDocument\n} from '../../rx-database-internal-store.ts';\nimport { prepareQuery } from '../../rx-query.ts';\nimport { normalizeMangoQuery } from '../../rx-query-helper.ts';\n\n\n\nexport class RxMigrationState {\n\n public database: RxDatabase;\n\n\n private started: boolean = false;\n public readonly oldCollectionMeta: ReturnType;\n public readonly mustMigrate: ReturnType;\n public readonly statusDocId: string;\n public readonly $: Observable;\n\n constructor(\n public readonly collection: RxCollection,\n public readonly migrationStrategies: NumberFunctionMap,\n public readonly statusDocKey = [\n collection.name,\n 'v',\n collection.schema.version\n ].join('-'),\n ) {\n this.database = collection.database;\n this.oldCollectionMeta = getOldCollectionMeta(this);\n this.mustMigrate = mustMigrate(this);\n this.statusDocId = getPrimaryKeyOfInternalDocument(\n this.statusDocKey,\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n addMigrationStateToDatabase(this);\n\n this.$ = observeSingle(\n this.database.internalStore,\n this.statusDocId\n ).pipe(\n filter(d => !!d),\n map(d => ensureNotFalsy(d).data),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\n );\n }\n\n getStatus() {\n return firstValueFrom(this.$);\n }\n\n\n /**\n * Starts the migration.\n * Returns void so that people to not get the idea to await\n * this function.\n * Instead use migratePromise() if you want to await\n * the migration. This ensures it works even if the migration\n * is run on a different browser tab.\n */\n async startMigration(batchSize: number = MIGRATION_DEFAULT_BATCH_SIZE): Promise {\n const must = await this.mustMigrate;\n if (!must) {\n return;\n }\n if (this.started) {\n throw newRxError('DM1');\n }\n this.started = true;\n\n\n let broadcastChannel: BroadcastChannel | undefined = undefined;\n /**\n * To ensure that multiple tabs do not migrate the same collection,\n * we use a new broadcastChannel/leaderElector for each collection.\n * This is required because collections can be added dynamically and\n * not all tabs might know about this collection.\n */\n if (this.database.multiInstance) {\n broadcastChannel = new BroadcastChannel([\n 'rx-migration-state',\n this.database.name,\n this.collection.name,\n this.collection.schema.version\n ].join('|'));\n const leaderElector = createLeaderElection(broadcastChannel);\n await leaderElector.awaitLeadership();\n }\n\n /**\n * Instead of writing a custom migration protocol,\n * we do a push-only replication from the old collection data to the new one.\n * This also ensure that restarting the replication works without problems.\n */\n const oldCollectionMeta = await this.oldCollectionMeta;\n const oldStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: this.collection.name,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: oldCollectionMeta.data.schema,\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n\n const connectedInstances = await this.getConnectedStorageInstances();\n\n\n /**\n * Initially write the migration status into a meta document.\n */\n const totalCount = await this.countAllDoucments(\n [oldStorageInstance].concat(connectedInstances.map(r => r.oldStorage))\n );\n await this.updateStatus(s => {\n s.count.total = totalCount;\n return s;\n });\n\n\n try {\n /**\n * First migrate the connected storages,\n * afterwards migrate the normal collection.\n */\n await Promise.all(\n connectedInstances.map(async (connectedInstance) => {\n await addConnectedStorageToCollection(\n this.collection,\n connectedInstance.newStorage.collectionName,\n connectedInstance.newStorage.schema\n );\n await this.migrateStorage(\n connectedInstance.oldStorage,\n connectedInstance.newStorage,\n batchSize\n );\n await connectedInstance.newStorage.close();\n })\n );\n\n await this.migrateStorage(\n oldStorageInstance,\n /**\n * Use the originalStorageInstance here\n * so that the _meta.lwt time keeps the same\n * and our replication checkpoints still point to the\n * correct checkpoint.\n */\n this.collection.storageInstance.originalStorageInstance,\n batchSize\n );\n } catch (err) {\n await oldStorageInstance.close();\n await this.updateStatus(s => {\n s.status = 'ERROR';\n s.error = errorToPlainJson(err as Error);\n return s;\n });\n return;\n }\n\n\n // remove old collection meta doc\n await writeSingle(\n this.database.internalStore,\n {\n previous: oldCollectionMeta,\n document: Object.assign(\n {},\n oldCollectionMeta,\n {\n _deleted: true\n }\n )\n },\n 'rx-migration-remove-collection-meta'\n );\n\n await this.updateStatus(s => {\n s.status = 'DONE';\n return s;\n });\n if (broadcastChannel) {\n await broadcastChannel.close();\n }\n }\n\n public updateStatusHandlers: MigrationStatusUpdate[] = [];\n public updateStatusQueue: Promise = PROMISE_RESOLVE_TRUE;\n public updateStatus(\n handler: MigrationStatusUpdate\n ) {\n this.updateStatusHandlers.push(handler);\n this.updateStatusQueue = this.updateStatusQueue.then(async () => {\n if (this.updateStatusHandlers.length === 0) {\n return;\n }\n // re-run until no conflict\n const useHandlers = this.updateStatusHandlers;\n this.updateStatusHandlers = [];\n while (true) {\n const previous = await getSingleDocument(\n this.database.internalStore,\n this.statusDocId\n );\n let newDoc = clone(previous);\n if (!previous) {\n newDoc = {\n id: this.statusDocId,\n key: this.statusDocKey,\n context: INTERNAL_CONTEXT_MIGRATION_STATUS,\n data: {\n collectionName: this.collection.name,\n status: 'RUNNING',\n count: {\n total: 0,\n handled: 0,\n percent: 0\n }\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n }\n\n let status = ensureNotFalsy(newDoc).data;\n for (const oneHandler of useHandlers) {\n status = oneHandler(status);\n }\n status.count.percent = Math.round((status.count.handled / status.count.total) * 100);\n\n if (\n newDoc && previous &&\n deepEqual(newDoc.data, previous.data)\n ) {\n break;\n }\n\n\n try {\n await writeSingle(\n this.database.internalStore,\n {\n previous,\n document: ensureNotFalsy(newDoc)\n },\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n\n // write successful\n break;\n } catch (err) {\n // ignore conflicts\n if (!isBulkWriteConflictError(err)) {\n throw err;\n }\n }\n }\n });\n return this.updateStatusQueue;\n }\n\n\n public async migrateStorage(\n oldStorage: RxStorageInstance,\n newStorage: RxStorageInstance,\n batchSize: number\n ) {\n const replicationMetaStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: 'rx-migration-state-meta-' + this.collection.name + '-' + this.collection.schema.version,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: getRxReplicationMetaInstanceSchema(oldStorage.schema, hasEncryption(oldStorage.schema)),\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n const replicationHandlerBase = rxStorageInstanceToReplicationHandler(\n newStorage,\n /**\n * Ignore push-conflicts.\n * If this happens we drop the 'old' document state.\n */\n defaultConflictHandler,\n this.database.token,\n true\n );\n\n const replicationState = replicateRxStorageInstance({\n keepMeta: true,\n identifier: [\n 'rx-migration-state',\n this.collection.name,\n oldStorage.schema.version,\n this.collection.schema.version\n ].join('-'),\n replicationHandler: {\n masterChangesSince() {\n return Promise.resolve({\n checkpoint: null,\n documents: []\n });\n },\n masterWrite: async (rows) => {\n rows = await Promise.all(\n rows\n .map(async (row) => {\n let newDocData = row.newDocumentState;\n if (newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE) {\n newDocData = row.newDocumentState.docData;\n if (row.newDocumentState.isCheckpoint === '1') {\n return {\n assumedMasterState: undefined,\n newDocumentState: row.newDocumentState\n };\n }\n }\n const migratedDocData: RxReplicationWriteToMasterRow = await migrateDocumentData(\n this.collection,\n oldStorage.schema.version,\n newDocData\n );\n const newRow: RxReplicationWriteToMasterRow = {\n // drop the assumed master state, we do not have to care about conflicts here.\n assumedMasterState: undefined,\n newDocumentState: newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE\n ? Object.assign({}, row.newDocumentState, { docData: migratedDocData })\n : migratedDocData\n };\n return newRow;\n })\n );\n\n // filter out the documents where the migration strategy returned null\n rows = rows.filter(row => !!row.newDocumentState);\n\n const result = await replicationHandlerBase.masterWrite(rows);\n return result;\n },\n masterChangeStream$: new Subject().asObservable()\n },\n forkInstance: oldStorage,\n metaInstance: replicationMetaStorageInstance,\n pushBatchSize: batchSize,\n pullBatchSize: 0,\n conflictHandler: defaultConflictHandler,\n hashFunction: this.database.hashFunction\n });\n\n\n let hasError: RxError | RxTypeError | false = false;\n replicationState.events.error.subscribe(err => hasError = err);\n\n // update replication status on each change\n replicationState.events.processed.up.subscribe(() => {\n this.updateStatus(status => {\n status.count.handled = status.count.handled + 1;\n return status;\n });\n });\n\n await awaitRxStorageReplicationFirstInSync(replicationState);\n await cancelRxStorageReplication(replicationState);\n\n await this.updateStatusQueue;\n if (hasError) {\n await replicationMetaStorageInstance.close();\n throw hasError;\n }\n\n // cleanup old storages\n await Promise.all([\n oldStorage.remove(),\n replicationMetaStorageInstance.remove()\n ]);\n }\n\n public async countAllDoucments(\n storageInstances: RxStorageInstance[]\n ): Promise {\n let ret = 0;\n await Promise.all(\n storageInstances.map(async (instance) => {\n\n const preparedQuery = prepareQuery(\n instance.schema,\n normalizeMangoQuery(\n instance.schema,\n {\n selector: {}\n }\n )\n );\n const countResult = await instance.count(preparedQuery);\n ret += countResult.count;\n })\n );\n return ret;\n }\n\n public async getConnectedStorageInstances() {\n const oldCollectionMeta = await this.oldCollectionMeta;\n const ret: {\n oldStorage: RxStorageInstance;\n newStorage: RxStorageInstance;\n }[] = [];\n\n await Promise.all(\n await Promise.all(\n oldCollectionMeta\n .data\n .connectedStorages\n .map(async (connectedStorage) => {\n\n // atm we can only migrate replication states.\n if (connectedStorage.schema.title !== META_INSTANCE_SCHEMA_TITLE) {\n throw new Error('unknown migration handling for schema');\n }\n\n const newSchema = getRxReplicationMetaInstanceSchema(\n clone(this.collection.schema.jsonSchema),\n hasEncryption(connectedStorage.schema)\n );\n newSchema.version = this.collection.schema.version;\n const [oldStorage, newStorage] = await Promise.all([\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: connectedStorage.schema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n }),\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: newSchema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n })\n ]);\n ret.push({ oldStorage, newStorage });\n })\n )\n );\n\n return ret;\n }\n\n\n\n async migratePromise(batchSize?: number): Promise {\n this.startMigration(batchSize);\n const must = await this.mustMigrate;\n if (!must) {\n return {\n status: 'DONE',\n collectionName: this.collection.name,\n count: {\n handled: 0,\n percent: 0,\n total: 0\n }\n };\n }\n\n const result = await Promise.race([\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'DONE')\n )\n ),\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'ERROR')\n )\n )\n ]);\n\n if (result.status === 'ERROR') {\n throw newRxError('DM4', {\n collection: this.collection.name,\n error: result.error\n });\n } else {\n return result;\n }\n\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js b/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js index a1f538fee3a..dfa63b6c730 100644 --- a/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js +++ b/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js @@ -1,6 +1,5 @@ "use strict"; -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); @@ -8,7 +7,6 @@ exports.OTHER_MANGO_OPERATORS = exports.OTHER_MANGO_ATTRIBUTES = exports.NoSqlQu exports.canMerge = canMerge; exports.createQueryBuilder = createQueryBuilder; exports.mQuerySortToRxDBSort = mQuerySortToRxDBSort; -var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError")); var _mqueryUtils = require("./mquery-utils.js"); var _rxError = require("../../../rx-error.js"); /** diff --git a/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map b/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map index d7468767121..d9d5ec3ab49 100644 --- a/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map +++ b/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map @@ -1 +1 @@ -{"version":3,"file":"nosql-query-builder.js","names":["_mqueryUtils","require","_rxError","NoSqlQueryBuilderClass","exports","mangoQuery","_path","options","_conditions","_fields","queryBuilder","selector","find","limit","skip","sort","forEach","s","_proto","prototype","where","_val","arguments","length","type","Array","isArray","merge","newRxTypeError","path","equals","val","_ensurePath","eq","or","array","$or","push","apply","nor","$nor","and","$and","mod","slice","conds","$mod","exists","$exists","elemMatch","_criteria","fn","criteria","isObject","$elemMatch","arg","len","i","_pushArr","split","field","ascend","substring","keys","Object","args","source","canMerge","_distinct","method","newRxError","toJSON","query","mQuerySortToRxDBSort","entries","map","k","v","direction","part","OTHER_MANGO_ATTRIBUTES","OTHER_MANGO_OPERATORS","$conditional","RegExp","$regex","$options","opts","value","$meta","String","toLowerCase","test","valueStr","toString","replace","parseInt","createQueryBuilder"],"sources":["../../../../../src/plugins/query-builder/mquery/nosql-query-builder.ts"],"sourcesContent":["/**\n * this is based on\n * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js\n */\nimport {\n isObject,\n merge\n} from './mquery-utils.ts';\nimport {\n newRxTypeError,\n newRxError\n} from '../../../rx-error.ts';\nimport type {\n MangoQuery,\n MangoQuerySelector,\n MangoQuerySortPart,\n MangoQuerySortDirection\n} from '../../../types/index.d.ts';\n\n\ndeclare type MQueryOptions = {\n limit?: number;\n skip?: number;\n sort?: any;\n};\n\nexport class NoSqlQueryBuilderClass {\n\n public options: MQueryOptions = {};\n public _conditions: MangoQuerySelector = {};\n public _fields: any = {};\n private _distinct: any;\n\n /**\n * MQuery constructor used for building queries.\n *\n * ####Example:\n * var query = new MQuery({ name: 'mquery' });\n * query.where('age').gte(21).exec(callback);\n *\n */\n constructor(\n mangoQuery?: MangoQuery,\n public _path?: any\n ) {\n if (mangoQuery) {\n const queryBuilder: NoSqlQueryBuilder = this as any;\n\n if (mangoQuery.selector) {\n queryBuilder.find(mangoQuery.selector);\n }\n if (mangoQuery.limit) {\n queryBuilder.limit(mangoQuery.limit);\n }\n if (mangoQuery.skip) {\n queryBuilder.skip(mangoQuery.skip);\n }\n if (mangoQuery.sort) {\n mangoQuery.sort.forEach(s => queryBuilder.sort(s));\n }\n }\n }\n\n /**\n * Specifies a `path` for use with chaining.\n */\n where(_path: string, _val?: MangoQuerySelector): NoSqlQueryBuilder {\n if (!arguments.length) return this as any;\n const type = typeof arguments[0];\n if ('string' === type) {\n this._path = arguments[0];\n if (2 === arguments.length) {\n (this._conditions as any)[this._path] = arguments[1];\n }\n return this as any;\n }\n\n if ('object' === type && !Array.isArray(arguments[0])) {\n return this.merge(arguments[0]);\n }\n\n throw newRxTypeError('MQ1', {\n path: arguments[0]\n });\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * ####Example\n * User.where('age').equals(49);\n */\n equals(val: any): NoSqlQueryBuilder {\n this._ensurePath('equals');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * This is alias of `equals`\n */\n eq(val: any): NoSqlQueryBuilder {\n this._ensurePath('eq');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies arguments for an `$or` condition.\n * ####Example\n * query.or([{ color: 'red' }, { status: 'emergency' }])\n */\n or(array: any[]): NoSqlQueryBuilder {\n const or = this._conditions.$or || (this._conditions.$or = []);\n if (!Array.isArray(array)) array = [array];\n or.push.apply(or, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$nor` condition.\n * ####Example\n * query.nor([{ color: 'green' }, { status: 'ok' }])\n */\n nor(array: any[]): NoSqlQueryBuilder {\n const nor = this._conditions.$nor || (this._conditions.$nor = []);\n if (!Array.isArray(array)) array = [array];\n nor.push.apply(nor, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$and` condition.\n * ####Example\n * query.and([{ color: 'green' }, { status: 'ok' }])\n * @see $and http://docs.mongodb.org/manual/reference/operator/and/\n */\n and(array: any[]): NoSqlQueryBuilder {\n const and = this._conditions.$and || (this._conditions.$and = []);\n if (!Array.isArray(array)) array = [array];\n and.push.apply(and, array);\n return this as any;\n }\n\n /**\n * Specifies a `$mod` condition\n */\n mod(_path: string, _val: number): NoSqlQueryBuilder {\n let val;\n let path;\n\n if (1 === arguments.length) {\n this._ensurePath('mod');\n val = arguments[0];\n path = this._path;\n } else if (2 === arguments.length && !Array.isArray(arguments[1])) {\n this._ensurePath('mod');\n val = (arguments as any).slice();\n path = this._path;\n } else if (3 === arguments.length) {\n val = (arguments as any).slice(1);\n path = arguments[0];\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$mod = val;\n return this as any;\n }\n\n /**\n * Specifies an `$exists` condition\n * ####Example\n * // { name: { $exists: true }}\n * Thing.where('name').exists()\n * Thing.where('name').exists(true)\n * Thing.find().exists('name')\n */\n exists(_path: string, _val: number): NoSqlQueryBuilder {\n let path;\n let val;\n if (0 === arguments.length) {\n this._ensurePath('exists');\n path = this._path;\n val = true;\n } else if (1 === arguments.length) {\n if ('boolean' === typeof arguments[0]) {\n this._ensurePath('exists');\n path = this._path;\n val = arguments[0];\n } else {\n path = arguments[0];\n val = true;\n }\n } else if (2 === arguments.length) {\n path = arguments[0];\n val = arguments[1];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$exists = val;\n return this as any;\n }\n\n /**\n * Specifies an `$elemMatch` condition\n * ####Example\n * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})\n * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})\n * query.elemMatch('comment', function (elem) {\n * elem.where('author').equals('autobot');\n * elem.where('votes').gte(5);\n * })\n * query.where('comment').elemMatch(function (elem) {\n * elem.where({ author: 'autobot' });\n * elem.where('votes').gte(5);\n * })\n */\n elemMatch(_path: string, _criteria: any): NoSqlQueryBuilder {\n if (null === arguments[0])\n throw newRxTypeError('MQ2');\n\n let fn;\n let path;\n let criteria;\n\n if ('function' === typeof arguments[0]) {\n this._ensurePath('elemMatch');\n path = this._path;\n fn = arguments[0];\n } else if (isObject(arguments[0])) {\n this._ensurePath('elemMatch');\n path = this._path;\n criteria = arguments[0];\n } else if ('function' === typeof arguments[1]) {\n path = arguments[0];\n fn = arguments[1];\n } else if (arguments[1] && isObject(arguments[1])) {\n path = arguments[0];\n criteria = arguments[1];\n } else\n throw newRxTypeError('MQ2');\n\n if (fn) {\n criteria = new NoSqlQueryBuilderClass;\n fn(criteria);\n criteria = criteria._conditions;\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$elemMatch = criteria;\n return this as any;\n }\n\n /**\n * Sets the sort order\n * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1.\n * If a string is passed, it must be a space delimited list of path names.\n * The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.\n * ####Example\n * query.sort({ field: 'asc', test: -1 });\n * query.sort('field -test');\n * query.sort([['field', 1], ['test', -1]]);\n */\n sort(arg: any): NoSqlQueryBuilder {\n if (!arg) return this as any;\n let len;\n const type = typeof arg;\n // .sort([['field', 1], ['test', -1]])\n if (Array.isArray(arg)) {\n len = arg.length;\n for (let i = 0; i < arg.length; ++i) {\n _pushArr(this.options, arg[i][0], arg[i][1]);\n }\n\n return this as any;\n }\n\n // .sort('field -test')\n if (1 === arguments.length && 'string' === type) {\n arg = arg.split(/\\s+/);\n len = arg.length;\n for (let i = 0; i < len; ++i) {\n let field = arg[i];\n if (!field) continue;\n const ascend = '-' === field[0] ? -1 : 1;\n if (ascend === -1) field = field.substring(1);\n push(this.options, field, ascend);\n }\n\n return this as any;\n }\n\n // .sort({ field: 1, test: -1 })\n if (isObject(arg)) {\n const keys = Object.keys(arg);\n keys.forEach(field => push(this.options, field, arg[field]));\n return this as any;\n }\n\n throw newRxTypeError('MQ3', {\n args: arguments\n });\n }\n\n /**\n * Merges another MQuery or conditions object into this one.\n *\n * When a MQuery is passed, conditions, field selection and options are merged.\n *\n */\n merge(source: any): NoSqlQueryBuilder {\n if (!source) {\n return this as any;\n }\n\n if (!canMerge(source)) {\n throw newRxTypeError('MQ4', {\n source\n });\n }\n\n if (source instanceof NoSqlQueryBuilderClass) {\n // if source has a feature, apply it to ourselves\n\n if (source._conditions)\n merge(this._conditions, source._conditions);\n\n if (source._fields) {\n if (!this._fields) this._fields = {};\n merge(this._fields, source._fields);\n }\n\n if (source.options) {\n if (!this.options) this.options = {};\n merge(this.options, source.options);\n }\n\n if (source._distinct)\n this._distinct = source._distinct;\n\n return this as any;\n }\n\n // plain object\n merge(this._conditions, source);\n\n return this as any;\n }\n\n /**\n * Finds documents.\n * ####Example\n * query.find()\n * query.find({ name: 'Burning Lights' })\n */\n find(criteria: any): NoSqlQueryBuilder {\n if (canMerge(criteria)) {\n this.merge(criteria);\n }\n\n return this as any;\n }\n\n /**\n * Make sure _path is set.\n *\n * @param {String} method\n */\n _ensurePath(method: any) {\n if (!this._path) {\n throw newRxError('MQ5', {\n method\n });\n }\n }\n\n toJSON(): {\n query: MangoQuery;\n path?: string;\n } {\n const query: MangoQuery = {\n selector: this._conditions,\n };\n\n if (this.options.skip) {\n query.skip = this.options.skip;\n }\n if (this.options.limit) {\n query.limit = this.options.limit;\n }\n if (this.options.sort) {\n query.sort = mQuerySortToRxDBSort(this.options.sort);\n }\n\n return {\n query,\n path: this._path\n };\n }\n}\n\nexport function mQuerySortToRxDBSort(\n sort: { [k: string]: 1 | -1; }\n): MangoQuerySortPart[] {\n return Object.entries(sort).map(([k, v]) => {\n const direction: MangoQuerySortDirection = v === 1 ? 'asc' : 'desc';\n const part: MangoQuerySortPart = { [k]: direction } as any;\n return part;\n });\n}\n\n/**\n * Because some prototype-methods are generated,\n * we have to define the type of NoSqlQueryBuilder here\n */\n\nexport interface NoSqlQueryBuilder extends NoSqlQueryBuilderClass {\n maxScan: ReturnSelfNumberFunction;\n batchSize: ReturnSelfNumberFunction;\n limit: ReturnSelfNumberFunction;\n skip: ReturnSelfNumberFunction;\n comment: ReturnSelfFunction;\n\n gt: ReturnSelfFunction;\n gte: ReturnSelfFunction;\n lt: ReturnSelfFunction;\n lte: ReturnSelfFunction;\n ne: ReturnSelfFunction;\n in: ReturnSelfFunction;\n nin: ReturnSelfFunction;\n all: ReturnSelfFunction;\n regex: ReturnSelfFunction;\n size: ReturnSelfFunction;\n\n}\n\ndeclare type ReturnSelfFunction = (v: any) => NoSqlQueryBuilder;\ndeclare type ReturnSelfNumberFunction = (v: number | null) => NoSqlQueryBuilder;\n\n/**\n * limit, skip, maxScan, batchSize, comment\n *\n * Sets these associated options.\n *\n * query.comment('feed query');\n */\nexport const OTHER_MANGO_ATTRIBUTES = ['limit', 'skip', 'maxScan', 'batchSize', 'comment'];\nOTHER_MANGO_ATTRIBUTES.forEach(function (method) {\n (NoSqlQueryBuilderClass.prototype as any)[method] = function (v: any) {\n this.options[method] = v;\n return this;\n };\n});\n\n\n/**\n * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance\n *\n * Thing.where('type').nin(array)\n */\nexport const OTHER_MANGO_OPERATORS = [\n 'gt', 'gte', 'lt', 'lte', 'ne',\n 'in', 'nin', 'all', 'regex', 'size'\n];\nOTHER_MANGO_OPERATORS.forEach(function ($conditional) {\n (NoSqlQueryBuilderClass.prototype as any)[$conditional] = function () {\n let path;\n let val;\n\n if (1 === arguments.length) {\n this._ensurePath($conditional);\n val = arguments[0];\n path = this._path;\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = this._conditions[path] === null || typeof this._conditions[path] === 'object' ?\n this._conditions[path] :\n (this._conditions[path] = {});\n\n\n\n if ($conditional === 'regex') {\n if (val instanceof RegExp) {\n throw newRxError('QU16', {\n field: path,\n query: this._conditions,\n });\n }\n if (typeof val === 'string') {\n conds['$' + $conditional] = val;\n } else {\n conds['$' + $conditional] = val.$regex;\n if (val.$options) {\n conds.$options = val.$options;\n }\n }\n } else {\n conds['$' + $conditional] = val;\n }\n\n return this;\n };\n});\n\n\nfunction push(opts: any, field: string, value: any) {\n if (Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ6', {\n opts,\n field,\n value\n });\n }\n\n if (value && value.$meta) {\n const sort = opts.sort || (opts.sort = {});\n sort[field] = {\n $meta: value.$meta\n };\n return;\n }\n\n const val = String(value || 1).toLowerCase();\n if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) {\n if (Array.isArray(value)) value = '[' + value + ']';\n throw newRxTypeError('MQ7', {\n field,\n value\n });\n }\n // store `sort` in a sane format\n const s = opts.sort || (opts.sort = {});\n const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');\n s[field] = parseInt(valueStr, 10);\n}\n\nfunction _pushArr(opts: any, field: string, value: any) {\n opts.sort = opts.sort || [];\n if (!Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ8', {\n opts,\n field,\n value\n });\n }\n\n /* const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');*/\n opts.sort.push([field, value]);\n}\n\n\n/**\n * Determines if `conds` can be merged using `mquery().merge()`\n */\nexport function canMerge(conds: any): boolean {\n return conds instanceof NoSqlQueryBuilderClass || isObject(conds);\n}\n\n\nexport function createQueryBuilder(query?: MangoQuery, path?: any): NoSqlQueryBuilder {\n return new NoSqlQueryBuilderClass(query, path) as NoSqlQueryBuilder;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"nosql-query-builder.js","names":["_mqueryUtils","require","_rxError","NoSqlQueryBuilderClass","exports","mangoQuery","_path","options","_conditions","_fields","queryBuilder","selector","find","limit","skip","sort","forEach","s","_proto","prototype","where","_val","arguments","length","type","Array","isArray","merge","newRxTypeError","path","equals","val","_ensurePath","eq","or","array","$or","push","apply","nor","$nor","and","$and","mod","slice","conds","$mod","exists","$exists","elemMatch","_criteria","fn","criteria","isObject","$elemMatch","arg","len","i","_pushArr","split","field","ascend","substring","keys","Object","args","source","canMerge","_distinct","method","newRxError","toJSON","query","mQuerySortToRxDBSort","entries","map","k","v","direction","part","OTHER_MANGO_ATTRIBUTES","OTHER_MANGO_OPERATORS","$conditional","RegExp","$regex","$options","opts","value","$meta","String","toLowerCase","test","valueStr","toString","replace","parseInt","createQueryBuilder"],"sources":["../../../../../src/plugins/query-builder/mquery/nosql-query-builder.ts"],"sourcesContent":["/**\n * this is based on\n * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js\n */\nimport {\n isObject,\n merge\n} from './mquery-utils.ts';\nimport {\n newRxTypeError,\n newRxError\n} from '../../../rx-error.ts';\nimport type {\n MangoQuery,\n MangoQuerySelector,\n MangoQuerySortPart,\n MangoQuerySortDirection\n} from '../../../types/index.d.ts';\n\n\ndeclare type MQueryOptions = {\n limit?: number;\n skip?: number;\n sort?: any;\n};\n\nexport class NoSqlQueryBuilderClass {\n\n public options: MQueryOptions = {};\n public _conditions: MangoQuerySelector = {};\n public _fields: any = {};\n private _distinct: any;\n\n /**\n * MQuery constructor used for building queries.\n *\n * ####Example:\n * var query = new MQuery({ name: 'mquery' });\n * query.where('age').gte(21).exec(callback);\n *\n */\n constructor(\n mangoQuery?: MangoQuery,\n public _path?: any\n ) {\n if (mangoQuery) {\n const queryBuilder: NoSqlQueryBuilder = this as any;\n\n if (mangoQuery.selector) {\n queryBuilder.find(mangoQuery.selector);\n }\n if (mangoQuery.limit) {\n queryBuilder.limit(mangoQuery.limit);\n }\n if (mangoQuery.skip) {\n queryBuilder.skip(mangoQuery.skip);\n }\n if (mangoQuery.sort) {\n mangoQuery.sort.forEach(s => queryBuilder.sort(s));\n }\n }\n }\n\n /**\n * Specifies a `path` for use with chaining.\n */\n where(_path: string, _val?: MangoQuerySelector): NoSqlQueryBuilder {\n if (!arguments.length) return this as any;\n const type = typeof arguments[0];\n if ('string' === type) {\n this._path = arguments[0];\n if (2 === arguments.length) {\n (this._conditions as any)[this._path] = arguments[1];\n }\n return this as any;\n }\n\n if ('object' === type && !Array.isArray(arguments[0])) {\n return this.merge(arguments[0]);\n }\n\n throw newRxTypeError('MQ1', {\n path: arguments[0]\n });\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * ####Example\n * User.where('age').equals(49);\n */\n equals(val: any): NoSqlQueryBuilder {\n this._ensurePath('equals');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * This is alias of `equals`\n */\n eq(val: any): NoSqlQueryBuilder {\n this._ensurePath('eq');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies arguments for an `$or` condition.\n * ####Example\n * query.or([{ color: 'red' }, { status: 'emergency' }])\n */\n or(array: any[]): NoSqlQueryBuilder {\n const or = this._conditions.$or || (this._conditions.$or = []);\n if (!Array.isArray(array)) array = [array];\n or.push.apply(or, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$nor` condition.\n * ####Example\n * query.nor([{ color: 'green' }, { status: 'ok' }])\n */\n nor(array: any[]): NoSqlQueryBuilder {\n const nor = this._conditions.$nor || (this._conditions.$nor = []);\n if (!Array.isArray(array)) array = [array];\n nor.push.apply(nor, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$and` condition.\n * ####Example\n * query.and([{ color: 'green' }, { status: 'ok' }])\n * @see $and http://docs.mongodb.org/manual/reference/operator/and/\n */\n and(array: any[]): NoSqlQueryBuilder {\n const and = this._conditions.$and || (this._conditions.$and = []);\n if (!Array.isArray(array)) array = [array];\n and.push.apply(and, array);\n return this as any;\n }\n\n /**\n * Specifies a `$mod` condition\n */\n mod(_path: string, _val: number): NoSqlQueryBuilder {\n let val;\n let path;\n\n if (1 === arguments.length) {\n this._ensurePath('mod');\n val = arguments[0];\n path = this._path;\n } else if (2 === arguments.length && !Array.isArray(arguments[1])) {\n this._ensurePath('mod');\n val = (arguments as any).slice();\n path = this._path;\n } else if (3 === arguments.length) {\n val = (arguments as any).slice(1);\n path = arguments[0];\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$mod = val;\n return this as any;\n }\n\n /**\n * Specifies an `$exists` condition\n * ####Example\n * // { name: { $exists: true }}\n * Thing.where('name').exists()\n * Thing.where('name').exists(true)\n * Thing.find().exists('name')\n */\n exists(_path: string, _val: number): NoSqlQueryBuilder {\n let path;\n let val;\n if (0 === arguments.length) {\n this._ensurePath('exists');\n path = this._path;\n val = true;\n } else if (1 === arguments.length) {\n if ('boolean' === typeof arguments[0]) {\n this._ensurePath('exists');\n path = this._path;\n val = arguments[0];\n } else {\n path = arguments[0];\n val = true;\n }\n } else if (2 === arguments.length) {\n path = arguments[0];\n val = arguments[1];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$exists = val;\n return this as any;\n }\n\n /**\n * Specifies an `$elemMatch` condition\n * ####Example\n * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})\n * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})\n * query.elemMatch('comment', function (elem) {\n * elem.where('author').equals('autobot');\n * elem.where('votes').gte(5);\n * })\n * query.where('comment').elemMatch(function (elem) {\n * elem.where({ author: 'autobot' });\n * elem.where('votes').gte(5);\n * })\n */\n elemMatch(_path: string, _criteria: any): NoSqlQueryBuilder {\n if (null === arguments[0])\n throw newRxTypeError('MQ2');\n\n let fn;\n let path;\n let criteria;\n\n if ('function' === typeof arguments[0]) {\n this._ensurePath('elemMatch');\n path = this._path;\n fn = arguments[0];\n } else if (isObject(arguments[0])) {\n this._ensurePath('elemMatch');\n path = this._path;\n criteria = arguments[0];\n } else if ('function' === typeof arguments[1]) {\n path = arguments[0];\n fn = arguments[1];\n } else if (arguments[1] && isObject(arguments[1])) {\n path = arguments[0];\n criteria = arguments[1];\n } else\n throw newRxTypeError('MQ2');\n\n if (fn) {\n criteria = new NoSqlQueryBuilderClass;\n fn(criteria);\n criteria = criteria._conditions;\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$elemMatch = criteria;\n return this as any;\n }\n\n /**\n * Sets the sort order\n * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1.\n * If a string is passed, it must be a space delimited list of path names.\n * The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.\n * ####Example\n * query.sort({ field: 'asc', test: -1 });\n * query.sort('field -test');\n * query.sort([['field', 1], ['test', -1]]);\n */\n sort(arg: any): NoSqlQueryBuilder {\n if (!arg) return this as any;\n let len;\n const type = typeof arg;\n // .sort([['field', 1], ['test', -1]])\n if (Array.isArray(arg)) {\n len = arg.length;\n for (let i = 0; i < arg.length; ++i) {\n _pushArr(this.options, arg[i][0], arg[i][1]);\n }\n\n return this as any;\n }\n\n // .sort('field -test')\n if (1 === arguments.length && 'string' === type) {\n arg = arg.split(/\\s+/);\n len = arg.length;\n for (let i = 0; i < len; ++i) {\n let field = arg[i];\n if (!field) continue;\n const ascend = '-' === field[0] ? -1 : 1;\n if (ascend === -1) field = field.substring(1);\n push(this.options, field, ascend);\n }\n\n return this as any;\n }\n\n // .sort({ field: 1, test: -1 })\n if (isObject(arg)) {\n const keys = Object.keys(arg);\n keys.forEach(field => push(this.options, field, arg[field]));\n return this as any;\n }\n\n throw newRxTypeError('MQ3', {\n args: arguments\n });\n }\n\n /**\n * Merges another MQuery or conditions object into this one.\n *\n * When a MQuery is passed, conditions, field selection and options are merged.\n *\n */\n merge(source: any): NoSqlQueryBuilder {\n if (!source) {\n return this as any;\n }\n\n if (!canMerge(source)) {\n throw newRxTypeError('MQ4', {\n source\n });\n }\n\n if (source instanceof NoSqlQueryBuilderClass) {\n // if source has a feature, apply it to ourselves\n\n if (source._conditions)\n merge(this._conditions, source._conditions);\n\n if (source._fields) {\n if (!this._fields) this._fields = {};\n merge(this._fields, source._fields);\n }\n\n if (source.options) {\n if (!this.options) this.options = {};\n merge(this.options, source.options);\n }\n\n if (source._distinct)\n this._distinct = source._distinct;\n\n return this as any;\n }\n\n // plain object\n merge(this._conditions, source);\n\n return this as any;\n }\n\n /**\n * Finds documents.\n * ####Example\n * query.find()\n * query.find({ name: 'Burning Lights' })\n */\n find(criteria: any): NoSqlQueryBuilder {\n if (canMerge(criteria)) {\n this.merge(criteria);\n }\n\n return this as any;\n }\n\n /**\n * Make sure _path is set.\n *\n * @param {String} method\n */\n _ensurePath(method: any) {\n if (!this._path) {\n throw newRxError('MQ5', {\n method\n });\n }\n }\n\n toJSON(): {\n query: MangoQuery;\n path?: string;\n } {\n const query: MangoQuery = {\n selector: this._conditions,\n };\n\n if (this.options.skip) {\n query.skip = this.options.skip;\n }\n if (this.options.limit) {\n query.limit = this.options.limit;\n }\n if (this.options.sort) {\n query.sort = mQuerySortToRxDBSort(this.options.sort);\n }\n\n return {\n query,\n path: this._path\n };\n }\n}\n\nexport function mQuerySortToRxDBSort(\n sort: { [k: string]: 1 | -1; }\n): MangoQuerySortPart[] {\n return Object.entries(sort).map(([k, v]) => {\n const direction: MangoQuerySortDirection = v === 1 ? 'asc' : 'desc';\n const part: MangoQuerySortPart = { [k]: direction } as any;\n return part;\n });\n}\n\n/**\n * Because some prototype-methods are generated,\n * we have to define the type of NoSqlQueryBuilder here\n */\n\nexport interface NoSqlQueryBuilder extends NoSqlQueryBuilderClass {\n maxScan: ReturnSelfNumberFunction;\n batchSize: ReturnSelfNumberFunction;\n limit: ReturnSelfNumberFunction;\n skip: ReturnSelfNumberFunction;\n comment: ReturnSelfFunction;\n\n gt: ReturnSelfFunction;\n gte: ReturnSelfFunction;\n lt: ReturnSelfFunction;\n lte: ReturnSelfFunction;\n ne: ReturnSelfFunction;\n in: ReturnSelfFunction;\n nin: ReturnSelfFunction;\n all: ReturnSelfFunction;\n regex: ReturnSelfFunction;\n size: ReturnSelfFunction;\n\n}\n\ndeclare type ReturnSelfFunction = (v: any) => NoSqlQueryBuilder;\ndeclare type ReturnSelfNumberFunction = (v: number | null) => NoSqlQueryBuilder;\n\n/**\n * limit, skip, maxScan, batchSize, comment\n *\n * Sets these associated options.\n *\n * query.comment('feed query');\n */\nexport const OTHER_MANGO_ATTRIBUTES = ['limit', 'skip', 'maxScan', 'batchSize', 'comment'];\nOTHER_MANGO_ATTRIBUTES.forEach(function (method) {\n (NoSqlQueryBuilderClass.prototype as any)[method] = function (v: any) {\n this.options[method] = v;\n return this;\n };\n});\n\n\n/**\n * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance\n *\n * Thing.where('type').nin(array)\n */\nexport const OTHER_MANGO_OPERATORS = [\n 'gt', 'gte', 'lt', 'lte', 'ne',\n 'in', 'nin', 'all', 'regex', 'size'\n];\nOTHER_MANGO_OPERATORS.forEach(function ($conditional) {\n (NoSqlQueryBuilderClass.prototype as any)[$conditional] = function () {\n let path;\n let val;\n\n if (1 === arguments.length) {\n this._ensurePath($conditional);\n val = arguments[0];\n path = this._path;\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = this._conditions[path] === null || typeof this._conditions[path] === 'object' ?\n this._conditions[path] :\n (this._conditions[path] = {});\n\n\n\n if ($conditional === 'regex') {\n if (val instanceof RegExp) {\n throw newRxError('QU16', {\n field: path,\n query: this._conditions,\n });\n }\n if (typeof val === 'string') {\n conds['$' + $conditional] = val;\n } else {\n conds['$' + $conditional] = val.$regex;\n if (val.$options) {\n conds.$options = val.$options;\n }\n }\n } else {\n conds['$' + $conditional] = val;\n }\n\n return this;\n };\n});\n\n\nfunction push(opts: any, field: string, value: any) {\n if (Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ6', {\n opts,\n field,\n value\n });\n }\n\n if (value && value.$meta) {\n const sort = opts.sort || (opts.sort = {});\n sort[field] = {\n $meta: value.$meta\n };\n return;\n }\n\n const val = String(value || 1).toLowerCase();\n if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) {\n if (Array.isArray(value)) value = '[' + value + ']';\n throw newRxTypeError('MQ7', {\n field,\n value\n });\n }\n // store `sort` in a sane format\n const s = opts.sort || (opts.sort = {});\n const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');\n s[field] = parseInt(valueStr, 10);\n}\n\nfunction _pushArr(opts: any, field: string, value: any) {\n opts.sort = opts.sort || [];\n if (!Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ8', {\n opts,\n field,\n value\n });\n }\n\n /* const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');*/\n opts.sort.push([field, value]);\n}\n\n\n/**\n * Determines if `conds` can be merged using `mquery().merge()`\n */\nexport function canMerge(conds: any): boolean {\n return conds instanceof NoSqlQueryBuilderClass || isObject(conds);\n}\n\n\nexport function createQueryBuilder(query?: MangoQuery, path?: any): NoSqlQueryBuilder {\n return new NoSqlQueryBuilderClass(query, path) as NoSqlQueryBuilder;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/replication-graphql/index.js.map b/dist/cjs/plugins/replication-graphql/index.js.map index e6eb9da021f..e459d430754 100644 --- a/dist/cjs/plugins/replication-graphql/index.js.map +++ b/dist/cjs/plugins/replication-graphql/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["_index","require","_helper","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_index2","_index3","_index4","_graphqlWebsocket","_rxjs","_graphqlSchemaFromRxSchema","_queryBuilderFromRxSchema","RxGraphQLReplicationState","_RxReplicationState","url","clientState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","customFetch","_this","_inheritsLoose2","default","_proto","setHeaders","headers","flatClone","setCredentials","credentials","graphQLRequest","queryParams","fetch","ensureNotFalsy","http","RxReplicationState","replicateGraphQL","waitForLeadership","addRxPlugin","RxDBLeaderElectionPlugin","mutateableClientState","pullStream$","Subject","replicationPrimitivesPull","pullBatchSize","batchSize","handler","lastPulledCheckpoint","pullGraphQL","queryBuilder","result","graphqlReplicationState","errors","dataPath","data","getProperty","responseModifier","docsData","documents","newCheckpoint","checkpoint","modifier","stream$","asObservable","replicationPrimitivesPush","rows","pushObj","mustUseSocket","ws","streamQueryBuilder","startBefore","start","bind","httpHeaders","includeWsHeaders","undefined","wsClient","getGraphQLWebSocket","on","next","query","subscribe","streamResponse","firstField","error","complete","cancelBefore","cancel","isStopped","removeGraphQLWebSocketRef","startReplicationOnLeaderShip"],"sources":["../../../../src/plugins/replication-graphql/index.ts"],"sourcesContent":["/**\n * this plugin adds the RxCollection.syncGraphQl()-function to rxdb\n * you can use it to sync collections with a remote graphql endpoint.\n */\nimport {\n ensureNotFalsy,\n flatClone,\n getProperty\n} from '../../plugins/utils/index.ts';\n\nimport {\n graphQLRequest\n} from './helper.ts';\n\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport type {\n RxCollection,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxReplicationWriteToMasterRow,\n GraphQLServerUrl,\n RxReplicationPullStreamItem,\n RxGraphQLReplicationQueryBuilderResponseObject,\n RxGraphQLReplicationClientState,\n ById\n} from '../../types/index.d.ts';\nimport {\n RxReplicationState,\n startReplicationOnLeaderShip\n} from '../replication/index.ts';\nimport {\n addRxPlugin,\n SyncOptionsGraphQL,\n WithDeleted\n} from '../../index.ts';\n\nimport {\n removeGraphQLWebSocketRef,\n getGraphQLWebSocket\n} from './graphql-websocket.ts';\nimport { Subject } from 'rxjs';\n\n\n\n\nexport class RxGraphQLReplicationState extends RxReplicationState {\n constructor(\n public readonly url: GraphQLServerUrl,\n public readonly clientState: RxGraphQLReplicationClientState,\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n public readonly customFetch?: WindowOrWorkerGlobalScope['fetch']\n ) {\n super(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n }\n\n setHeaders(headers: ById): void {\n this.clientState.headers = flatClone(headers);\n }\n\n setCredentials(credentials: RequestCredentials | undefined) {\n this.clientState.credentials = credentials;\n }\n\n graphQLRequest(\n queryParams: RxGraphQLReplicationQueryBuilderResponseObject\n ) {\n return graphQLRequest(\n this.customFetch ?? fetch,\n ensureNotFalsy(this.url.http),\n this.clientState,\n queryParams\n );\n }\n}\n\nexport function replicateGraphQL(\n {\n collection,\n url,\n headers = {},\n credentials,\n deletedField = '_deleted',\n waitForLeadership = true,\n pull,\n push,\n live = true,\n fetch: customFetch,\n retryTime = 1000 * 5, // in ms\n autoStart = true,\n replicationIdentifier\n }: SyncOptionsGraphQL\n): RxGraphQLReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n /**\n * We use this object to store the GraphQL client\n * so we can later swap out the client inside of the replication handlers.\n */\n const mutateableClientState = {\n headers,\n credentials\n };\n\n\n const pullStream$: Subject> = new Subject();\n\n let replicationPrimitivesPull: ReplicationPullOptions | undefined;\n if (pull) {\n const pullBatchSize = pull.batchSize ? pull.batchSize : 20;\n replicationPrimitivesPull = {\n async handler(\n lastPulledCheckpoint: CheckpointType | undefined\n ) {\n const pullGraphQL = await pull.queryBuilder(lastPulledCheckpoint, pullBatchSize);\n const result = await graphqlReplicationState.graphQLRequest(pullGraphQL);\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = pull.dataPath || ['data', Object.keys(result.data)[0]];\n let data: any = getProperty(result, dataPath);\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'handler',\n lastPulledCheckpoint\n );\n }\n\n const docsData: WithDeleted[] = data.documents;\n const newCheckpoint = data.checkpoint;\n\n return {\n documents: docsData,\n checkpoint: newCheckpoint\n };\n },\n batchSize: pull.batchSize,\n modifier: pull.modifier,\n stream$: pullStream$.asObservable()\n };\n }\n let replicationPrimitivesPush: ReplicationPushOptions | undefined;\n if (push) {\n replicationPrimitivesPush = {\n async handler(\n rows: RxReplicationWriteToMasterRow[]\n ) {\n const pushObj = await push.queryBuilder(rows);\n const result = await graphqlReplicationState.graphQLRequest(pushObj);\n\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = push.dataPath || Object.keys(result.data)[0];\n let data: any = getProperty(result.data, dataPath);\n\n if (push.responseModifier) {\n data = await push.responseModifier(\n data,\n );\n }\n\n return data;\n },\n batchSize: push.batchSize,\n modifier: push.modifier\n };\n }\n\n const graphqlReplicationState = new RxGraphQLReplicationState(\n url,\n mutateableClientState,\n replicationIdentifier,\n collection,\n deletedField,\n replicationPrimitivesPull,\n replicationPrimitivesPush,\n live,\n retryTime,\n autoStart,\n customFetch\n );\n\n const mustUseSocket = url.ws &&\n pull &&\n pull.streamQueryBuilder &&\n live;\n\n const startBefore = graphqlReplicationState.start.bind(graphqlReplicationState);\n graphqlReplicationState.start = () => {\n if (mustUseSocket) {\n const httpHeaders = pull.includeWsHeaders ? mutateableClientState.headers : undefined;\n const wsClient = getGraphQLWebSocket(ensureNotFalsy(url.ws), httpHeaders);\n\n wsClient.on('connected', () => {\n pullStream$.next('RESYNC');\n });\n\n const query: any = ensureNotFalsy(pull.streamQueryBuilder)(mutateableClientState.headers);\n\n wsClient.subscribe(\n query,\n {\n next: async (streamResponse: any) => {\n const firstField = Object.keys(streamResponse.data)[0];\n let data = streamResponse.data[firstField];\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'stream'\n );\n }\n pullStream$.next(data);\n },\n error: (error: any) => {\n pullStream$.error(error);\n },\n complete: () => {\n pullStream$.complete();\n }\n });\n }\n return startBefore();\n };\n\n const cancelBefore = graphqlReplicationState.cancel.bind(graphqlReplicationState);\n graphqlReplicationState.cancel = () => {\n if (!graphqlReplicationState.isStopped()) {\n pullStream$.complete();\n if (mustUseSocket) {\n removeGraphQLWebSocketRef(ensureNotFalsy(url.ws));\n }\n }\n return cancelBefore();\n };\n\n startReplicationOnLeaderShip(waitForLeadership, graphqlReplicationState);\n return graphqlReplicationState;\n}\n\nexport * from './helper.ts';\nexport * from './graphql-schema-from-rx-schema.ts';\nexport * from './query-builder-from-rx-schema.ts';\nexport * from './graphql-websocket.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["_index","require","_helper","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_index2","_index3","_index4","_graphqlWebsocket","_rxjs","_graphqlSchemaFromRxSchema","_queryBuilderFromRxSchema","RxGraphQLReplicationState","_RxReplicationState","url","clientState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","customFetch","_this","_inheritsLoose2","default","_proto","setHeaders","headers","flatClone","setCredentials","credentials","graphQLRequest","queryParams","fetch","ensureNotFalsy","http","RxReplicationState","replicateGraphQL","waitForLeadership","addRxPlugin","RxDBLeaderElectionPlugin","mutateableClientState","pullStream$","Subject","replicationPrimitivesPull","pullBatchSize","batchSize","handler","lastPulledCheckpoint","pullGraphQL","queryBuilder","result","graphqlReplicationState","errors","dataPath","data","getProperty","responseModifier","docsData","documents","newCheckpoint","checkpoint","modifier","stream$","asObservable","replicationPrimitivesPush","rows","pushObj","mustUseSocket","ws","streamQueryBuilder","startBefore","start","bind","httpHeaders","includeWsHeaders","undefined","wsClient","getGraphQLWebSocket","on","next","query","subscribe","streamResponse","firstField","error","complete","cancelBefore","cancel","isStopped","removeGraphQLWebSocketRef","startReplicationOnLeaderShip"],"sources":["../../../../src/plugins/replication-graphql/index.ts"],"sourcesContent":["/**\n * this plugin adds the RxCollection.syncGraphQl()-function to rxdb\n * you can use it to sync collections with a remote graphql endpoint.\n */\nimport {\n ensureNotFalsy,\n flatClone,\n getProperty\n} from '../../plugins/utils/index.ts';\n\nimport {\n graphQLRequest\n} from './helper.ts';\n\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport type {\n RxCollection,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxReplicationWriteToMasterRow,\n GraphQLServerUrl,\n RxReplicationPullStreamItem,\n RxGraphQLReplicationQueryBuilderResponseObject,\n RxGraphQLReplicationClientState,\n ById\n} from '../../types/index.d.ts';\nimport {\n RxReplicationState,\n startReplicationOnLeaderShip\n} from '../replication/index.ts';\nimport {\n addRxPlugin,\n SyncOptionsGraphQL,\n WithDeleted\n} from '../../index.ts';\n\nimport {\n removeGraphQLWebSocketRef,\n getGraphQLWebSocket\n} from './graphql-websocket.ts';\nimport { Subject } from 'rxjs';\n\n\n\n\nexport class RxGraphQLReplicationState extends RxReplicationState {\n constructor(\n public readonly url: GraphQLServerUrl,\n public readonly clientState: RxGraphQLReplicationClientState,\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n public readonly customFetch?: WindowOrWorkerGlobalScope['fetch']\n ) {\n super(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n }\n\n setHeaders(headers: ById): void {\n this.clientState.headers = flatClone(headers);\n }\n\n setCredentials(credentials: RequestCredentials | undefined) {\n this.clientState.credentials = credentials;\n }\n\n graphQLRequest(\n queryParams: RxGraphQLReplicationQueryBuilderResponseObject\n ) {\n return graphQLRequest(\n this.customFetch ?? fetch,\n ensureNotFalsy(this.url.http),\n this.clientState,\n queryParams\n );\n }\n}\n\nexport function replicateGraphQL(\n {\n collection,\n url,\n headers = {},\n credentials,\n deletedField = '_deleted',\n waitForLeadership = true,\n pull,\n push,\n live = true,\n fetch: customFetch,\n retryTime = 1000 * 5, // in ms\n autoStart = true,\n replicationIdentifier\n }: SyncOptionsGraphQL\n): RxGraphQLReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n /**\n * We use this object to store the GraphQL client\n * so we can later swap out the client inside of the replication handlers.\n */\n const mutateableClientState = {\n headers,\n credentials\n };\n\n\n const pullStream$: Subject> = new Subject();\n\n let replicationPrimitivesPull: ReplicationPullOptions | undefined;\n if (pull) {\n const pullBatchSize = pull.batchSize ? pull.batchSize : 20;\n replicationPrimitivesPull = {\n async handler(\n lastPulledCheckpoint: CheckpointType | undefined\n ) {\n const pullGraphQL = await pull.queryBuilder(lastPulledCheckpoint, pullBatchSize);\n const result = await graphqlReplicationState.graphQLRequest(pullGraphQL);\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = pull.dataPath || ['data', Object.keys(result.data)[0]];\n let data: any = getProperty(result, dataPath);\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'handler',\n lastPulledCheckpoint\n );\n }\n\n const docsData: WithDeleted[] = data.documents;\n const newCheckpoint = data.checkpoint;\n\n return {\n documents: docsData,\n checkpoint: newCheckpoint\n };\n },\n batchSize: pull.batchSize,\n modifier: pull.modifier,\n stream$: pullStream$.asObservable()\n };\n }\n let replicationPrimitivesPush: ReplicationPushOptions | undefined;\n if (push) {\n replicationPrimitivesPush = {\n async handler(\n rows: RxReplicationWriteToMasterRow[]\n ) {\n const pushObj = await push.queryBuilder(rows);\n const result = await graphqlReplicationState.graphQLRequest(pushObj);\n\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = push.dataPath || Object.keys(result.data)[0];\n let data: any = getProperty(result.data, dataPath);\n\n if (push.responseModifier) {\n data = await push.responseModifier(\n data,\n );\n }\n\n return data;\n },\n batchSize: push.batchSize,\n modifier: push.modifier\n };\n }\n\n const graphqlReplicationState = new RxGraphQLReplicationState(\n url,\n mutateableClientState,\n replicationIdentifier,\n collection,\n deletedField,\n replicationPrimitivesPull,\n replicationPrimitivesPush,\n live,\n retryTime,\n autoStart,\n customFetch\n );\n\n const mustUseSocket = url.ws &&\n pull &&\n pull.streamQueryBuilder &&\n live;\n\n const startBefore = graphqlReplicationState.start.bind(graphqlReplicationState);\n graphqlReplicationState.start = () => {\n if (mustUseSocket) {\n const httpHeaders = pull.includeWsHeaders ? mutateableClientState.headers : undefined;\n const wsClient = getGraphQLWebSocket(ensureNotFalsy(url.ws), httpHeaders);\n\n wsClient.on('connected', () => {\n pullStream$.next('RESYNC');\n });\n\n const query: any = ensureNotFalsy(pull.streamQueryBuilder)(mutateableClientState.headers);\n\n wsClient.subscribe(\n query,\n {\n next: async (streamResponse: any) => {\n const firstField = Object.keys(streamResponse.data)[0];\n let data = streamResponse.data[firstField];\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'stream'\n );\n }\n pullStream$.next(data);\n },\n error: (error: any) => {\n pullStream$.error(error);\n },\n complete: () => {\n pullStream$.complete();\n }\n });\n }\n return startBefore();\n };\n\n const cancelBefore = graphqlReplicationState.cancel.bind(graphqlReplicationState);\n graphqlReplicationState.cancel = () => {\n if (!graphqlReplicationState.isStopped()) {\n pullStream$.complete();\n if (mustUseSocket) {\n removeGraphQLWebSocketRef(ensureNotFalsy(url.ws));\n }\n }\n return cancelBefore();\n };\n\n startReplicationOnLeaderShip(waitForLeadership, graphqlReplicationState);\n return graphqlReplicationState;\n}\n\nexport * from './helper.ts';\nexport * from './graphql-schema-from-rx-schema.ts';\nexport * from './query-builder-from-rx-schema.ts';\nexport * from './graphql-websocket.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/replication-webrtc/index.js.map b/dist/cjs/plugins/replication-webrtc/index.js.map index 064264443f7..6b71d4ddca4 100644 --- a/dist/cjs/plugins/replication-webrtc/index.js.map +++ b/dist/cjs/plugins/replication-webrtc/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["_rxjs","require","_plugin","_index","_index2","_index3","_index4","_webrtcHelper","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_rxError","_signalingServer","_webrtcTypes","_connectionHandlerSimplePeer","replicateWebRTC","options","collection","addRxPlugin","RxDBLeaderElectionPlugin","pull","batchSize","push","database","multiInstance","waitForLeadership","requestCounter","requestFlag","randomCouchString","getRequestId","count","token","storageToken","pool","RxWebRTCReplicationPool","connectionHandlerCreator","subs","connectionHandler","error$","subscribe","err","next","disconnect$","peer","removePeer","message$","pipe","filter","data","message","method","send","id","result","connectSub","connect$","canceled","isPeerValid","isValid","peerToken","tokenResponse","sendMessageAndAwaitAnswer","params","error","newRxError","isMaster","isMasterInWebRTCReplication","hashFunction","replicationState","masterHandler","masterReplicationHandler","masterChangeStreamSub","masterChangeStream$","ev","streamResponse","p","unsubscribe","messageSub","msgPeer","bind","response","replicateRxCollection","replicationIdentifier","name","topic","join","autoStart","deletedField","live","retryTime","assign","handler","lastPulledCheckpoint","answer","ensureNotFalsy","stream$","response$","m","map","undefined","docs","addPeer","peerStates$","BehaviorSubject","Map","Subject","onDestroy","cancel","rxStorageInstanceToReplicationHandler","storageInstance","conflictHandler","_proto","peerState","getValue","set","getFromMapOrThrow","delete","sub","awaitFirstPeer","firstValueFrom","peerStates","size","Array","from","destroy"],"sources":["../../../../src/plugins/replication-webrtc/index.ts"],"sourcesContent":["import {\n BehaviorSubject,\n filter,\n firstValueFrom,\n map,\n Subject,\n Subscription\n} from 'rxjs';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { rxStorageInstanceToReplicationHandler } from '../../replication-protocol/index.ts';\nimport type {\n RxCollection,\n RxError,\n RxReplicationHandler,\n RxReplicationWriteToMasterRow,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport { replicateRxCollection } from '../replication/index.ts';\nimport {\n isMasterInWebRTCReplication,\n sendMessageAndAwaitAnswer\n} from './webrtc-helper.ts';\nimport type {\n WebRTCConnectionHandler,\n WebRTCPeerState,\n WebRTCReplicationCheckpoint,\n WebRTCResponse,\n RxWebRTCReplicationState,\n SyncOptionsWebRTC\n} from './webrtc-types.ts';\nimport { newRxError } from '../../rx-error.ts';\n\n\nexport async function replicateWebRTC(\n options: SyncOptionsWebRTC\n): Promise> {\n const collection = options.collection;\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n // fill defaults\n if (options.pull) {\n if (!options.pull.batchSize) {\n options.pull.batchSize = 20;\n }\n }\n if (options.push) {\n if (!options.push.batchSize) {\n options.push.batchSize = 20;\n }\n }\n\n if (collection.database.multiInstance) {\n await collection.database.waitForLeadership();\n }\n\n // used to easier debug stuff\n let requestCounter = 0;\n const requestFlag = randomCouchString(10);\n function getRequestId() {\n const count = requestCounter++;\n return collection.database.token + '|' + requestFlag + '|' + count;\n }\n\n const storageToken = await collection.database.storageToken;\n const pool = new RxWebRTCReplicationPool(\n collection,\n options,\n await options.connectionHandlerCreator(options)\n );\n\n\n pool.subs.push(\n pool.connectionHandler.error$.subscribe(err => pool.error$.next(err)),\n pool.connectionHandler.disconnect$.subscribe(peer => pool.removePeer(peer))\n );\n\n /**\n * Answer if someone requests our storage token\n */\n pool.subs.push(\n pool.connectionHandler.message$.pipe(\n filter(data => data.message.method === 'token')\n ).subscribe(data => {\n pool.connectionHandler.send(data.peer, {\n id: data.message.id,\n result: storageToken\n });\n })\n );\n\n const connectSub = pool.connectionHandler.connect$\n .pipe(\n filter(() => !pool.canceled)\n )\n .subscribe(async (peer) => {\n if (options.isPeerValid) {\n const isValid = await options.isPeerValid(peer);\n if (!isValid) {\n return;\n }\n }\n\n let peerToken: string;\n try {\n const tokenResponse = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n id: getRequestId(),\n method: 'token',\n params: []\n }\n );\n peerToken = tokenResponse.result;\n } catch (error: any) {\n /**\n * If could not get the tokenResponse,\n * just ignore that peer.\n */\n pool.error$.next(newRxError('RC_WEBRTC_PEER', {\n error\n }));\n return;\n }\n const isMaster = await isMasterInWebRTCReplication(collection.database.hashFunction, storageToken, peerToken);\n\n let replicationState: RxWebRTCReplicationState | undefined;\n if (isMaster) {\n const masterHandler = pool.masterReplicationHandler;\n const masterChangeStreamSub = masterHandler.masterChangeStream$.subscribe(ev => {\n const streamResponse: WebRTCResponse = {\n id: 'masterChangeStream$',\n result: ev\n };\n pool.connectionHandler.send(peer, streamResponse);\n });\n\n // clean up the subscription\n pool.subs.push(\n masterChangeStreamSub,\n pool.connectionHandler.disconnect$.pipe(\n filter(p => p === peer)\n ).subscribe(() => masterChangeStreamSub.unsubscribe())\n );\n\n const messageSub = pool.connectionHandler.message$\n .pipe(\n filter(data => data.peer === peer),\n filter(data => data.message.method !== 'token')\n )\n .subscribe(async (data) => {\n const { peer: msgPeer, message } = data;\n /**\n * If it is not a function,\n * it means that the client requested the masterChangeStream$\n */\n const method = (masterHandler as any)[message.method].bind(masterHandler);\n const result = await (method as any)(...message.params);\n const response: WebRTCResponse = {\n id: message.id,\n result\n };\n pool.connectionHandler.send(msgPeer, response);\n });\n pool.subs.push(messageSub);\n } else {\n replicationState = replicateRxCollection({\n replicationIdentifier: [collection.name, options.topic, peerToken].join('||'),\n collection: collection,\n autoStart: true,\n deletedField: '_deleted',\n live: true,\n retryTime: options.retryTime,\n waitForLeadership: false,\n pull: options.pull ? Object.assign({}, options.pull, {\n async handler(lastPulledCheckpoint: WebRTCReplicationCheckpoint | undefined) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterChangesSince',\n params: [\n lastPulledCheckpoint,\n ensureNotFalsy(options.pull).batchSize\n ],\n id: getRequestId()\n }\n );\n return answer.result;\n },\n stream$: pool.connectionHandler.response$.pipe(\n filter(m => m.response.id === 'masterChangeStream$'),\n map(m => m.response.result)\n )\n\n }) : undefined,\n push: options.push ? Object.assign({}, options.push, {\n async handler(docs: RxReplicationWriteToMasterRow[]) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterWrite',\n params: [docs],\n id: getRequestId()\n }\n );\n return answer.result;\n }\n }) : undefined\n });\n }\n pool.addPeer(peer, replicationState);\n });\n pool.subs.push(connectSub);\n return pool;\n}\n\n\n/**\n * Because the WebRTC replication runs between many instances,\n * we use a Pool instead of returning a single replication state.\n */\nexport class RxWebRTCReplicationPool {\n peerStates$: BehaviorSubject>> = new BehaviorSubject(new Map());\n canceled: boolean = false;\n masterReplicationHandler: RxReplicationHandler;\n subs: Subscription[] = [];\n\n public error$ = new Subject();\n\n constructor(\n public readonly collection: RxCollection,\n public readonly options: SyncOptionsWebRTC,\n public readonly connectionHandler: WebRTCConnectionHandler\n ) {\n this.collection.onDestroy.push(() => this.cancel());\n this.masterReplicationHandler = rxStorageInstanceToReplicationHandler(\n collection.storageInstance,\n collection.conflictHandler,\n collection.database.token,\n );\n }\n\n addPeer(\n peer: PeerType,\n // only if isMaster=false it has a replicationState\n replicationState?: RxWebRTCReplicationState\n ) {\n const peerState: WebRTCPeerState = {\n peer,\n replicationState,\n subs: []\n };\n this.peerStates$.next(this.peerStates$.getValue().set(peer, peerState));\n if (replicationState) {\n peerState.subs.push(\n replicationState.error$.subscribe(ev => this.error$.next(ev))\n );\n }\n }\n removePeer(peer: PeerType) {\n const peerState = getFromMapOrThrow(this.peerStates$.getValue(), peer);\n this.peerStates$.getValue().delete(peer);\n this.peerStates$.next(this.peerStates$.getValue());\n peerState.subs.forEach(sub => sub.unsubscribe());\n if (peerState.replicationState) {\n peerState.replicationState.cancel();\n }\n }\n\n // often used in unit tests\n awaitFirstPeer() {\n return firstValueFrom(\n this.peerStates$.pipe(\n filter(peerStates => peerStates.size > 0)\n )\n );\n }\n\n public async cancel() {\n if (this.canceled) {\n return;\n }\n this.canceled = true;\n this.subs.forEach(sub => sub.unsubscribe());\n Array.from(this.peerStates$.getValue().keys()).forEach(peer => {\n this.removePeer(peer);\n });\n await this.connectionHandler.destroy();\n }\n}\n\nexport * from './webrtc-helper.ts';\nexport * from './signaling-server.ts';\nexport * from './webrtc-types.ts';\n// export * from './connection-handler-webtorrent';\n// export * from './connection-handler-p2pcf';\nexport * from './connection-handler-simple-peer.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["_rxjs","require","_plugin","_index","_index2","_index3","_index4","_webrtcHelper","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_rxError","_signalingServer","_webrtcTypes","_connectionHandlerSimplePeer","replicateWebRTC","options","collection","addRxPlugin","RxDBLeaderElectionPlugin","pull","batchSize","push","database","multiInstance","waitForLeadership","requestCounter","requestFlag","randomCouchString","getRequestId","count","token","storageToken","pool","RxWebRTCReplicationPool","connectionHandlerCreator","subs","connectionHandler","error$","subscribe","err","next","disconnect$","peer","removePeer","message$","pipe","filter","data","message","method","send","id","result","connectSub","connect$","canceled","isPeerValid","isValid","peerToken","tokenResponse","sendMessageAndAwaitAnswer","params","error","newRxError","isMaster","isMasterInWebRTCReplication","hashFunction","replicationState","masterHandler","masterReplicationHandler","masterChangeStreamSub","masterChangeStream$","ev","streamResponse","p","unsubscribe","messageSub","msgPeer","bind","response","replicateRxCollection","replicationIdentifier","name","topic","join","autoStart","deletedField","live","retryTime","assign","handler","lastPulledCheckpoint","answer","ensureNotFalsy","stream$","response$","m","map","undefined","docs","addPeer","peerStates$","BehaviorSubject","Map","Subject","onDestroy","cancel","rxStorageInstanceToReplicationHandler","storageInstance","conflictHandler","_proto","peerState","getValue","set","getFromMapOrThrow","delete","sub","awaitFirstPeer","firstValueFrom","peerStates","size","Array","from","destroy"],"sources":["../../../../src/plugins/replication-webrtc/index.ts"],"sourcesContent":["import {\n BehaviorSubject,\n filter,\n firstValueFrom,\n map,\n Subject,\n Subscription\n} from 'rxjs';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { rxStorageInstanceToReplicationHandler } from '../../replication-protocol/index.ts';\nimport type {\n RxCollection,\n RxError,\n RxReplicationHandler,\n RxReplicationWriteToMasterRow,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport { replicateRxCollection } from '../replication/index.ts';\nimport {\n isMasterInWebRTCReplication,\n sendMessageAndAwaitAnswer\n} from './webrtc-helper.ts';\nimport type {\n WebRTCConnectionHandler,\n WebRTCPeerState,\n WebRTCReplicationCheckpoint,\n WebRTCResponse,\n RxWebRTCReplicationState,\n SyncOptionsWebRTC\n} from './webrtc-types.ts';\nimport { newRxError } from '../../rx-error.ts';\n\n\nexport async function replicateWebRTC(\n options: SyncOptionsWebRTC\n): Promise> {\n const collection = options.collection;\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n // fill defaults\n if (options.pull) {\n if (!options.pull.batchSize) {\n options.pull.batchSize = 20;\n }\n }\n if (options.push) {\n if (!options.push.batchSize) {\n options.push.batchSize = 20;\n }\n }\n\n if (collection.database.multiInstance) {\n await collection.database.waitForLeadership();\n }\n\n // used to easier debug stuff\n let requestCounter = 0;\n const requestFlag = randomCouchString(10);\n function getRequestId() {\n const count = requestCounter++;\n return collection.database.token + '|' + requestFlag + '|' + count;\n }\n\n const storageToken = await collection.database.storageToken;\n const pool = new RxWebRTCReplicationPool(\n collection,\n options,\n await options.connectionHandlerCreator(options)\n );\n\n\n pool.subs.push(\n pool.connectionHandler.error$.subscribe(err => pool.error$.next(err)),\n pool.connectionHandler.disconnect$.subscribe(peer => pool.removePeer(peer))\n );\n\n /**\n * Answer if someone requests our storage token\n */\n pool.subs.push(\n pool.connectionHandler.message$.pipe(\n filter(data => data.message.method === 'token')\n ).subscribe(data => {\n pool.connectionHandler.send(data.peer, {\n id: data.message.id,\n result: storageToken\n });\n })\n );\n\n const connectSub = pool.connectionHandler.connect$\n .pipe(\n filter(() => !pool.canceled)\n )\n .subscribe(async (peer) => {\n if (options.isPeerValid) {\n const isValid = await options.isPeerValid(peer);\n if (!isValid) {\n return;\n }\n }\n\n let peerToken: string;\n try {\n const tokenResponse = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n id: getRequestId(),\n method: 'token',\n params: []\n }\n );\n peerToken = tokenResponse.result;\n } catch (error: any) {\n /**\n * If could not get the tokenResponse,\n * just ignore that peer.\n */\n pool.error$.next(newRxError('RC_WEBRTC_PEER', {\n error\n }));\n return;\n }\n const isMaster = await isMasterInWebRTCReplication(collection.database.hashFunction, storageToken, peerToken);\n\n let replicationState: RxWebRTCReplicationState | undefined;\n if (isMaster) {\n const masterHandler = pool.masterReplicationHandler;\n const masterChangeStreamSub = masterHandler.masterChangeStream$.subscribe(ev => {\n const streamResponse: WebRTCResponse = {\n id: 'masterChangeStream$',\n result: ev\n };\n pool.connectionHandler.send(peer, streamResponse);\n });\n\n // clean up the subscription\n pool.subs.push(\n masterChangeStreamSub,\n pool.connectionHandler.disconnect$.pipe(\n filter(p => p === peer)\n ).subscribe(() => masterChangeStreamSub.unsubscribe())\n );\n\n const messageSub = pool.connectionHandler.message$\n .pipe(\n filter(data => data.peer === peer),\n filter(data => data.message.method !== 'token')\n )\n .subscribe(async (data) => {\n const { peer: msgPeer, message } = data;\n /**\n * If it is not a function,\n * it means that the client requested the masterChangeStream$\n */\n const method = (masterHandler as any)[message.method].bind(masterHandler);\n const result = await (method as any)(...message.params);\n const response: WebRTCResponse = {\n id: message.id,\n result\n };\n pool.connectionHandler.send(msgPeer, response);\n });\n pool.subs.push(messageSub);\n } else {\n replicationState = replicateRxCollection({\n replicationIdentifier: [collection.name, options.topic, peerToken].join('||'),\n collection: collection,\n autoStart: true,\n deletedField: '_deleted',\n live: true,\n retryTime: options.retryTime,\n waitForLeadership: false,\n pull: options.pull ? Object.assign({}, options.pull, {\n async handler(lastPulledCheckpoint: WebRTCReplicationCheckpoint | undefined) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterChangesSince',\n params: [\n lastPulledCheckpoint,\n ensureNotFalsy(options.pull).batchSize\n ],\n id: getRequestId()\n }\n );\n return answer.result;\n },\n stream$: pool.connectionHandler.response$.pipe(\n filter(m => m.response.id === 'masterChangeStream$'),\n map(m => m.response.result)\n )\n\n }) : undefined,\n push: options.push ? Object.assign({}, options.push, {\n async handler(docs: RxReplicationWriteToMasterRow[]) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterWrite',\n params: [docs],\n id: getRequestId()\n }\n );\n return answer.result;\n }\n }) : undefined\n });\n }\n pool.addPeer(peer, replicationState);\n });\n pool.subs.push(connectSub);\n return pool;\n}\n\n\n/**\n * Because the WebRTC replication runs between many instances,\n * we use a Pool instead of returning a single replication state.\n */\nexport class RxWebRTCReplicationPool {\n peerStates$: BehaviorSubject>> = new BehaviorSubject(new Map());\n canceled: boolean = false;\n masterReplicationHandler: RxReplicationHandler;\n subs: Subscription[] = [];\n\n public error$ = new Subject();\n\n constructor(\n public readonly collection: RxCollection,\n public readonly options: SyncOptionsWebRTC,\n public readonly connectionHandler: WebRTCConnectionHandler\n ) {\n this.collection.onDestroy.push(() => this.cancel());\n this.masterReplicationHandler = rxStorageInstanceToReplicationHandler(\n collection.storageInstance,\n collection.conflictHandler,\n collection.database.token,\n );\n }\n\n addPeer(\n peer: PeerType,\n // only if isMaster=false it has a replicationState\n replicationState?: RxWebRTCReplicationState\n ) {\n const peerState: WebRTCPeerState = {\n peer,\n replicationState,\n subs: []\n };\n this.peerStates$.next(this.peerStates$.getValue().set(peer, peerState));\n if (replicationState) {\n peerState.subs.push(\n replicationState.error$.subscribe(ev => this.error$.next(ev))\n );\n }\n }\n removePeer(peer: PeerType) {\n const peerState = getFromMapOrThrow(this.peerStates$.getValue(), peer);\n this.peerStates$.getValue().delete(peer);\n this.peerStates$.next(this.peerStates$.getValue());\n peerState.subs.forEach(sub => sub.unsubscribe());\n if (peerState.replicationState) {\n peerState.replicationState.cancel();\n }\n }\n\n // often used in unit tests\n awaitFirstPeer() {\n return firstValueFrom(\n this.peerStates$.pipe(\n filter(peerStates => peerStates.size > 0)\n )\n );\n }\n\n public async cancel() {\n if (this.canceled) {\n return;\n }\n this.canceled = true;\n this.subs.forEach(sub => sub.unsubscribe());\n Array.from(this.peerStates$.getValue().keys()).forEach(peer => {\n this.removePeer(peer);\n });\n await this.connectionHandler.destroy();\n }\n}\n\nexport * from './webrtc-helper.ts';\nexport * from './signaling-server.ts';\nexport * from './webrtc-types.ts';\n// export * from './connection-handler-webtorrent';\n// export * from './connection-handler-p2pcf';\nexport * from './connection-handler-simple-peer.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/replication/index.js.map b/dist/cjs/plugins/replication/index.js.map index 0a82ad7f8e2..976c89d3a13 100644 --- a/dist/cjs/plugins/replication/index.js.map +++ b/dist/cjs/plugins/replication/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["_rxjs","require","_index","_index2","_index3","_rxError","_replicationHelper","_rxDatabaseInternalStore","_plugin","_rxStorageHelper","_overwritable","_hooks","REPLICATION_STATE_BY_COLLECTION","exports","WeakMap","RxReplicationState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","subs","subjects","received","Subject","sent","error","canceled","BehaviorSubject","active","received$","asObservable","sent$","error$","canceled$","active$","onCancel","callOnStart","undefined","remoteEvents$","metaInfoPromise","metaInstanceCollectionName","database","hashFunction","name","join","metaInstanceSchema","getRxReplicationMetaInstanceSchema","schema","jsonSchema","hasEncryption","collectionName","replicationStates","getFromMapOrCreate","onDestroy","cancel","Object","keys","forEach","key","defineProperty","get","startPromise","Promise","res","_proto","prototype","start","isStopped","pullModifier","modifier","DEFAULT_MODIFIER","pushModifier","metaInfo","metaInstance","all","storage","createStorageInstance","databaseName","databaseInstanceToken","token","multiInstance","options","password","devMode","overwritable","isDevMode","addConnectedStorageToCollection","internalReplicationState","replicateRxStorageInstance","pushBatchSize","batchSize","pullBatchSize","initialCheckpoint","upstream","downstream","forkInstance","storageInstance","identifier","conflictHandler","replicationHandler","masterChangeStream$","pipe","filter","_v","mergeMap","ev","useEv","flatClone","documents","handlePulledDocuments","map","d","masterChangesSince","checkpoint","done","result","handler","err","emitError","newRxError","errors","toArray","er","errorToPlainJson","direction","next","awaitRetry","ensureNotFalsy","useResult","masterWrite","rows","runAsyncPluginHooks","useRowsOrNull","row","newDocumentState","assumedMasterState","swapDefaultDeletedTodeletedField","useRows","arrayFilterNotEmpty","length","Array","isArray","pushRows","args","rxdb","conflicts","events","subscribe","processed","down","document","up","writeToMasterRow","combineLatest","isActive","stream$","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","getValue","awaitInitialReplication","awaitInSync","t","requestIdlePromise","reSync","emitEvent","PROMISE_RESOLVE_FALSE","promises","fn","toPromise","cancelRxStorageReplication","checkpointQueue","then","close","sub","unsubscribe","complete","remove","removeConnectedStorageFromCollection","replicateRxCollection","waitForLeadership","addRxPlugin","RxDBLeaderElectionPlugin","replicationState","startReplicationOnLeaderShip","mustWaitForLeadership","waitTillRun","PROMISE_RESOLVE_TRUE"],"sources":["../../../../src/plugins/replication/index.ts"],"sourcesContent":["/**\n * This plugin contains the primitives to create\n * a RxDB client-server replication.\n * It is used in the other replication plugins\n * but also can be used as standalone with a custom replication handler.\n */\n\nimport {\n BehaviorSubject,\n combineLatest,\n filter,\n mergeMap,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n ReplicationOptions,\n ReplicationPullHandlerResult,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxCollection,\n RxDocumentData,\n RxError,\n RxJsonSchema,\n RxReplicationPullStreamItem,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxStorageInstanceReplicationState,\n RxStorageReplicationMeta,\n RxTypeError,\n WithDeleted\n} from '../../types/index.d.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport {\n arrayFilterNotEmpty,\n ensureNotFalsy,\n errorToPlainJson,\n flatClone,\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n toArray,\n toPromise\n} from '../../plugins/utils/index.ts';\nimport {\n awaitRxStorageReplicationFirstInSync,\n awaitRxStorageReplicationInSync,\n cancelRxStorageReplication,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance\n} from '../../replication-protocol/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport {\n awaitRetry,\n DEFAULT_MODIFIER,\n swapDefaultDeletedTodeletedField,\n handlePulledDocuments\n} from './replication-helper.ts';\nimport {\n addConnectedStorageToCollection, removeConnectedStorageFromCollection\n} from '../../rx-database-internal-store.ts';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { hasEncryption } from '../../rx-storage-helper.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n runAsyncPluginHooks\n} from '../../hooks.ts';\n\n\nexport const REPLICATION_STATE_BY_COLLECTION: WeakMap[]> = new WeakMap();\n\nexport class RxReplicationState {\n public readonly subs: Subscription[] = [];\n public readonly subjects = {\n received: new Subject>(), // all documents that are received from the endpoint\n sent: new Subject>(), // all documents that are send to the endpoint\n error: new Subject(), // all errors that are received from the endpoint, emits new Error() objects\n canceled: new BehaviorSubject(false), // true when the replication was canceled\n active: new BehaviorSubject(false) // true when something is running, false when not\n };\n\n readonly received$: Observable> = this.subjects.received.asObservable();\n readonly sent$: Observable> = this.subjects.sent.asObservable();\n readonly error$: Observable = this.subjects.error.asObservable();\n readonly canceled$: Observable = this.subjects.canceled.asObservable();\n readonly active$: Observable = this.subjects.active.asObservable();\n\n readonly metaInfoPromise: Promise<{ collectionName: string, schema: RxJsonSchema>> }>;\n\n public startPromise: Promise;\n\n public onCancel: (() => void)[] = [];\n\n constructor(\n /**\n * The identifier, used to flag revisions\n * and to identify which documents state came from the remote.\n */\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n ) {\n this.metaInfoPromise = (async () => {\n const metaInstanceCollectionName = 'rx-replication-meta-' + await collection.database.hashFunction([\n this.collection.name,\n this.replicationIdentifier\n ].join('-'));\n const metaInstanceSchema = getRxReplicationMetaInstanceSchema(\n this.collection.schema.jsonSchema,\n hasEncryption(this.collection.schema.jsonSchema)\n );\n return {\n collectionName: metaInstanceCollectionName,\n schema: metaInstanceSchema\n };\n })();\n const replicationStates = getFromMapOrCreate(\n REPLICATION_STATE_BY_COLLECTION,\n collection,\n () => []\n );\n replicationStates.push(this);\n\n // stop the replication when the collection gets destroyed\n this.collection.onDestroy.push(() => this.cancel());\n\n // create getters for the observables\n Object.keys(this.subjects).forEach(key => {\n Object.defineProperty(this, key + '$', {\n get: function () {\n return this.subjects[key].asObservable();\n }\n });\n });\n const startPromise = new Promise(res => {\n this.callOnStart = res;\n });\n this.startPromise = startPromise;\n }\n\n private callOnStart: () => void = undefined as any;\n\n public internalReplicationState?: RxStorageInstanceReplicationState;\n public metaInstance?: RxStorageInstance, any, {}, any>;\n public remoteEvents$: Subject> = new Subject();\n\n public async start(): Promise {\n if (this.isStopped()) {\n return;\n }\n\n // fill in defaults for pull & push\n const pullModifier = this.pull && this.pull.modifier ? this.pull.modifier : DEFAULT_MODIFIER;\n const pushModifier = this.push && this.push.modifier ? this.push.modifier : DEFAULT_MODIFIER;\n\n const database = this.collection.database;\n\n const metaInfo = await this.metaInfoPromise;\n\n const [metaInstance] = await Promise.all([\n this.collection.database.storage.createStorageInstance>({\n databaseName: database.name,\n collectionName: metaInfo.collectionName,\n databaseInstanceToken: database.token,\n multiInstance: database.multiInstance, // TODO is this always false?\n options: {},\n schema: metaInfo.schema,\n password: database.password,\n devMode: overwritable.isDevMode()\n }),\n addConnectedStorageToCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n )\n ]);\n this.metaInstance = metaInstance;\n\n this.internalReplicationState = replicateRxStorageInstance({\n pushBatchSize: this.push && this.push.batchSize ? this.push.batchSize : 100,\n pullBatchSize: this.pull && this.pull.batchSize ? this.pull.batchSize : 100,\n initialCheckpoint: {\n upstream: this.push ? this.push.initialCheckpoint : undefined,\n downstream: this.pull ? this.pull.initialCheckpoint : undefined\n },\n forkInstance: this.collection.storageInstance,\n metaInstance: this.metaInstance,\n hashFunction: database.hashFunction,\n identifier: 'rxdbreplication' + this.replicationIdentifier,\n conflictHandler: this.collection.conflictHandler,\n replicationHandler: {\n masterChangeStream$: this.remoteEvents$.asObservable().pipe(\n filter(_v => !!this.pull),\n mergeMap(async (ev) => {\n if (ev === 'RESYNC') {\n return ev;\n }\n const useEv = flatClone(ev);\n useEv.documents = handlePulledDocuments(this.collection, this.deletedField, useEv.documents);\n useEv.documents = await Promise.all(\n useEv.documents.map(d => pullModifier(d))\n );\n return useEv;\n })\n ),\n masterChangesSince: async (\n checkpoint: CheckpointType | undefined,\n batchSize: number\n ) => {\n if (!this.pull) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n /**\n * Retries must be done here in the replication primitives plugin,\n * because the replication protocol itself has no\n * error handling.\n */\n let done = false;\n let result: ReplicationPullHandlerResult = {} as any;\n while (!done && !this.isStopped()) {\n try {\n result = await this.pull.handler(\n checkpoint,\n batchSize\n );\n done = true;\n } catch (err: any | Error | Error[]) {\n const emitError = newRxError('RC_PULL', {\n checkpoint,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'pull'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n\n if (this.isStopped()) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n\n const useResult = flatClone(result);\n useResult.documents = handlePulledDocuments(this.collection, this.deletedField, useResult.documents);\n useResult.documents = await Promise.all(\n useResult.documents.map(d => pullModifier(d))\n );\n return useResult;\n },\n masterWrite: async (\n rows: RxReplicationWriteToMasterRow[]\n ) => {\n if (!this.push) {\n return [];\n }\n let done = false;\n\n await runAsyncPluginHooks('preReplicationMasterWrite', {\n rows,\n collection: this.collection\n });\n\n const useRowsOrNull = await Promise.all(\n rows.map(async (row) => {\n row.newDocumentState = await pushModifier(row.newDocumentState);\n if (row.newDocumentState === null) {\n return null;\n }\n if (row.assumedMasterState) {\n row.assumedMasterState = await pushModifier(row.assumedMasterState);\n }\n if (this.deletedField !== '_deleted') {\n row.newDocumentState = swapDefaultDeletedTodeletedField(this.deletedField, row.newDocumentState) as any;\n if (row.assumedMasterState) {\n row.assumedMasterState = swapDefaultDeletedTodeletedField(this.deletedField, row.assumedMasterState) as any;\n }\n }\n return row;\n })\n );\n const useRows: RxReplicationWriteToMasterRow[] = useRowsOrNull.filter(arrayFilterNotEmpty);\n\n let result: WithDeleted[] = null as any;\n\n // In case all the rows have been filtered and nothing has to be sent\n if (useRows.length === 0) {\n done = true;\n result = [];\n }\n\n while (!done && !this.isStopped()) {\n try {\n result = await this.push.handler(useRows);\n /**\n * It is a common problem that people have wrongly behaving backend\n * that do not return an array with the conflicts on push requests.\n * So we run this check here to make it easier to debug.\n * @link https://github.com/pubkey/rxdb/issues/4103\n */\n if (!Array.isArray(result)) {\n throw newRxError(\n 'RC_PUSH_NO_AR',\n {\n pushRows: rows,\n direction: 'push',\n args: { result }\n }\n );\n }\n done = true;\n } catch (err: any | Error | Error[] | RxError) {\n const emitError = (err as RxError).rxdb ? err : newRxError('RC_PUSH', {\n pushRows: rows,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'push'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n if (this.isStopped()) {\n return [];\n }\n\n await runAsyncPluginHooks('preReplicationMasterWriteDocumentsHandle', {\n result,\n collection: this.collection\n });\n\n const conflicts = handlePulledDocuments(this.collection, this.deletedField, ensureNotFalsy(result));\n return conflicts;\n }\n }\n });\n this.subs.push(\n this.internalReplicationState.events.error.subscribe(err => {\n this.subjects.error.next(err);\n }),\n this.internalReplicationState.events.processed.down\n .subscribe(row => this.subjects.received.next(row.document as any)),\n this.internalReplicationState.events.processed.up\n .subscribe(writeToMasterRow => {\n this.subjects.sent.next(writeToMasterRow.newDocumentState);\n }),\n combineLatest([\n this.internalReplicationState.events.active.down,\n this.internalReplicationState.events.active.up\n ]).subscribe(([down, up]) => {\n const isActive = down || up;\n this.subjects.active.next(isActive);\n })\n );\n\n if (\n this.pull &&\n this.pull.stream$ &&\n this.live\n ) {\n this.subs.push(\n this.pull.stream$.subscribe({\n next: ev => {\n this.remoteEvents$.next(ev);\n },\n error: err => {\n this.subjects.error.next(err);\n }\n })\n );\n }\n\n /**\n * Non-live replications run once\n * and then automatically get canceled.\n */\n if (!this.live) {\n await awaitRxStorageReplicationFirstInSync(this.internalReplicationState);\n await awaitRxStorageReplicationInSync(this.internalReplicationState);\n await this.cancel();\n }\n this.callOnStart();\n }\n\n isStopped(): boolean {\n if (this.subjects.canceled.getValue()) {\n return true;\n }\n return false;\n }\n\n async awaitInitialReplication(): Promise {\n await this.startPromise;\n return awaitRxStorageReplicationFirstInSync(\n ensureNotFalsy(this.internalReplicationState)\n );\n }\n\n /**\n * Returns a promise that resolves when:\n * - All local data is replicated with the remote\n * - No replication cycle is running or in retry-state\n *\n * WARNING: USing this function directly in a multi-tab browser application\n * is dangerous because only the leading instance will ever be replicated,\n * so this promise will not resolve in the other tabs.\n * For multi-tab support you should set and observe a flag in a local document.\n */\n async awaitInSync(): Promise {\n await this.startPromise;\n await awaitRxStorageReplicationFirstInSync(ensureNotFalsy(this.internalReplicationState));\n\n /**\n * To reduce the amount of re-renders and make testing\n * and to make the whole behavior more predictable,\n * we await these things multiple times.\n * For example the state might be in sync already and at the\n * exact same time a pull.stream$ event comes in and we want to catch\n * that in the same call to awaitInSync() instead of resolving\n * while actually the state is not in sync.\n */\n let t = 2;\n while (t > 0) {\n t--;\n\n /**\n * Often awaitInSync() is called directly after a document write,\n * like in the unit tests.\n * So we first have to await the idleness to ensure that all RxChangeEvents\n * are processed already.\n */\n await this.collection.database.requestIdlePromise();\n await awaitRxStorageReplicationInSync(ensureNotFalsy(this.internalReplicationState));\n }\n\n return true;\n }\n\n reSync() {\n this.remoteEvents$.next('RESYNC');\n }\n emitEvent(ev: RxReplicationPullStreamItem) {\n this.remoteEvents$.next(ev);\n }\n\n async cancel(): Promise {\n if (this.isStopped()) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n const promises: Promise[] = this.onCancel.map(fn => toPromise(fn()));\n\n if (this.internalReplicationState) {\n await cancelRxStorageReplication(this.internalReplicationState);\n }\n if (this.metaInstance) {\n promises.push(\n ensureNotFalsy(this.internalReplicationState).checkpointQueue\n .then(() => ensureNotFalsy(this.metaInstance).close())\n );\n }\n\n this.subs.forEach(sub => sub.unsubscribe());\n this.subjects.canceled.next(true);\n\n this.subjects.active.complete();\n this.subjects.canceled.complete();\n this.subjects.error.complete();\n this.subjects.received.complete();\n this.subjects.sent.complete();\n\n return Promise.all(promises);\n }\n\n async remove() {\n await ensureNotFalsy(this.metaInstance).remove();\n const metaInfo = await this.metaInfoPromise;\n await this.cancel();\n await removeConnectedStorageFromCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n );\n }\n}\n\n\nexport function replicateRxCollection(\n {\n replicationIdentifier,\n collection,\n deletedField = '_deleted',\n pull,\n push,\n live = true,\n retryTime = 1000 * 5,\n waitForLeadership = true,\n autoStart = true,\n }: ReplicationOptions\n): RxReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n /**\n * It is a common error to forget to add these config\n * objects. So we check here because it makes no sense\n * to start a replication with neither push nor pull.\n */\n if (!pull && !push) {\n throw newRxError('UT3', {\n collection: collection.name,\n args: {\n replicationIdentifier\n }\n });\n }\n\n const replicationState = new RxReplicationState(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n\n\n startReplicationOnLeaderShip(waitForLeadership, replicationState);\n return replicationState as any;\n}\n\n\nexport function startReplicationOnLeaderShip(\n waitForLeadership: boolean,\n replicationState: RxReplicationState\n) {\n /**\n * Always await this Promise to ensure that the current instance\n * is leader when waitForLeadership=true\n */\n const mustWaitForLeadership = waitForLeadership && replicationState.collection.database.multiInstance;\n const waitTillRun: Promise = mustWaitForLeadership ? replicationState.collection.database.waitForLeadership() : PROMISE_RESOLVE_TRUE;\n return waitTillRun.then(() => {\n if (replicationState.isStopped()) {\n return;\n }\n if (replicationState.autoStart) {\n replicationState.start();\n }\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["_rxjs","require","_index","_index2","_index3","_rxError","_replicationHelper","_rxDatabaseInternalStore","_plugin","_rxStorageHelper","_overwritable","_hooks","REPLICATION_STATE_BY_COLLECTION","exports","WeakMap","RxReplicationState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","subs","subjects","received","Subject","sent","error","canceled","BehaviorSubject","active","received$","asObservable","sent$","error$","canceled$","active$","onCancel","callOnStart","undefined","remoteEvents$","metaInfoPromise","metaInstanceCollectionName","database","hashFunction","name","join","metaInstanceSchema","getRxReplicationMetaInstanceSchema","schema","jsonSchema","hasEncryption","collectionName","replicationStates","getFromMapOrCreate","onDestroy","cancel","Object","keys","forEach","key","defineProperty","get","startPromise","Promise","res","_proto","prototype","start","isStopped","pullModifier","modifier","DEFAULT_MODIFIER","pushModifier","metaInfo","metaInstance","all","storage","createStorageInstance","databaseName","databaseInstanceToken","token","multiInstance","options","password","devMode","overwritable","isDevMode","addConnectedStorageToCollection","internalReplicationState","replicateRxStorageInstance","pushBatchSize","batchSize","pullBatchSize","initialCheckpoint","upstream","downstream","forkInstance","storageInstance","identifier","conflictHandler","replicationHandler","masterChangeStream$","pipe","filter","_v","mergeMap","ev","useEv","flatClone","documents","handlePulledDocuments","map","d","masterChangesSince","checkpoint","done","result","handler","err","emitError","newRxError","errors","toArray","er","errorToPlainJson","direction","next","awaitRetry","ensureNotFalsy","useResult","masterWrite","rows","runAsyncPluginHooks","useRowsOrNull","row","newDocumentState","assumedMasterState","swapDefaultDeletedTodeletedField","useRows","arrayFilterNotEmpty","length","Array","isArray","pushRows","args","rxdb","conflicts","events","subscribe","processed","down","document","up","writeToMasterRow","combineLatest","isActive","stream$","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","getValue","awaitInitialReplication","awaitInSync","t","requestIdlePromise","reSync","emitEvent","PROMISE_RESOLVE_FALSE","promises","fn","toPromise","cancelRxStorageReplication","checkpointQueue","then","close","sub","unsubscribe","complete","remove","removeConnectedStorageFromCollection","replicateRxCollection","waitForLeadership","addRxPlugin","RxDBLeaderElectionPlugin","replicationState","startReplicationOnLeaderShip","mustWaitForLeadership","waitTillRun","PROMISE_RESOLVE_TRUE"],"sources":["../../../../src/plugins/replication/index.ts"],"sourcesContent":["/**\n * This plugin contains the primitives to create\n * a RxDB client-server replication.\n * It is used in the other replication plugins\n * but also can be used as standalone with a custom replication handler.\n */\n\nimport {\n BehaviorSubject,\n combineLatest,\n filter,\n mergeMap,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n ReplicationOptions,\n ReplicationPullHandlerResult,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxCollection,\n RxDocumentData,\n RxError,\n RxJsonSchema,\n RxReplicationPullStreamItem,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxStorageInstanceReplicationState,\n RxStorageReplicationMeta,\n RxTypeError,\n WithDeleted\n} from '../../types/index.d.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport {\n arrayFilterNotEmpty,\n ensureNotFalsy,\n errorToPlainJson,\n flatClone,\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n toArray,\n toPromise\n} from '../../plugins/utils/index.ts';\nimport {\n awaitRxStorageReplicationFirstInSync,\n awaitRxStorageReplicationInSync,\n cancelRxStorageReplication,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance\n} from '../../replication-protocol/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport {\n awaitRetry,\n DEFAULT_MODIFIER,\n swapDefaultDeletedTodeletedField,\n handlePulledDocuments\n} from './replication-helper.ts';\nimport {\n addConnectedStorageToCollection, removeConnectedStorageFromCollection\n} from '../../rx-database-internal-store.ts';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { hasEncryption } from '../../rx-storage-helper.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n runAsyncPluginHooks\n} from '../../hooks.ts';\n\n\nexport const REPLICATION_STATE_BY_COLLECTION: WeakMap[]> = new WeakMap();\n\nexport class RxReplicationState {\n public readonly subs: Subscription[] = [];\n public readonly subjects = {\n received: new Subject>(), // all documents that are received from the endpoint\n sent: new Subject>(), // all documents that are send to the endpoint\n error: new Subject(), // all errors that are received from the endpoint, emits new Error() objects\n canceled: new BehaviorSubject(false), // true when the replication was canceled\n active: new BehaviorSubject(false) // true when something is running, false when not\n };\n\n readonly received$: Observable> = this.subjects.received.asObservable();\n readonly sent$: Observable> = this.subjects.sent.asObservable();\n readonly error$: Observable = this.subjects.error.asObservable();\n readonly canceled$: Observable = this.subjects.canceled.asObservable();\n readonly active$: Observable = this.subjects.active.asObservable();\n\n readonly metaInfoPromise: Promise<{ collectionName: string, schema: RxJsonSchema>> }>;\n\n public startPromise: Promise;\n\n public onCancel: (() => void)[] = [];\n\n constructor(\n /**\n * The identifier, used to flag revisions\n * and to identify which documents state came from the remote.\n */\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n ) {\n this.metaInfoPromise = (async () => {\n const metaInstanceCollectionName = 'rx-replication-meta-' + await collection.database.hashFunction([\n this.collection.name,\n this.replicationIdentifier\n ].join('-'));\n const metaInstanceSchema = getRxReplicationMetaInstanceSchema(\n this.collection.schema.jsonSchema,\n hasEncryption(this.collection.schema.jsonSchema)\n );\n return {\n collectionName: metaInstanceCollectionName,\n schema: metaInstanceSchema\n };\n })();\n const replicationStates = getFromMapOrCreate(\n REPLICATION_STATE_BY_COLLECTION,\n collection,\n () => []\n );\n replicationStates.push(this);\n\n // stop the replication when the collection gets destroyed\n this.collection.onDestroy.push(() => this.cancel());\n\n // create getters for the observables\n Object.keys(this.subjects).forEach(key => {\n Object.defineProperty(this, key + '$', {\n get: function () {\n return this.subjects[key].asObservable();\n }\n });\n });\n const startPromise = new Promise(res => {\n this.callOnStart = res;\n });\n this.startPromise = startPromise;\n }\n\n private callOnStart: () => void = undefined as any;\n\n public internalReplicationState?: RxStorageInstanceReplicationState;\n public metaInstance?: RxStorageInstance, any, {}, any>;\n public remoteEvents$: Subject> = new Subject();\n\n public async start(): Promise {\n if (this.isStopped()) {\n return;\n }\n\n // fill in defaults for pull & push\n const pullModifier = this.pull && this.pull.modifier ? this.pull.modifier : DEFAULT_MODIFIER;\n const pushModifier = this.push && this.push.modifier ? this.push.modifier : DEFAULT_MODIFIER;\n\n const database = this.collection.database;\n\n const metaInfo = await this.metaInfoPromise;\n\n const [metaInstance] = await Promise.all([\n this.collection.database.storage.createStorageInstance>({\n databaseName: database.name,\n collectionName: metaInfo.collectionName,\n databaseInstanceToken: database.token,\n multiInstance: database.multiInstance, // TODO is this always false?\n options: {},\n schema: metaInfo.schema,\n password: database.password,\n devMode: overwritable.isDevMode()\n }),\n addConnectedStorageToCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n )\n ]);\n this.metaInstance = metaInstance;\n\n this.internalReplicationState = replicateRxStorageInstance({\n pushBatchSize: this.push && this.push.batchSize ? this.push.batchSize : 100,\n pullBatchSize: this.pull && this.pull.batchSize ? this.pull.batchSize : 100,\n initialCheckpoint: {\n upstream: this.push ? this.push.initialCheckpoint : undefined,\n downstream: this.pull ? this.pull.initialCheckpoint : undefined\n },\n forkInstance: this.collection.storageInstance,\n metaInstance: this.metaInstance,\n hashFunction: database.hashFunction,\n identifier: 'rxdbreplication' + this.replicationIdentifier,\n conflictHandler: this.collection.conflictHandler,\n replicationHandler: {\n masterChangeStream$: this.remoteEvents$.asObservable().pipe(\n filter(_v => !!this.pull),\n mergeMap(async (ev) => {\n if (ev === 'RESYNC') {\n return ev;\n }\n const useEv = flatClone(ev);\n useEv.documents = handlePulledDocuments(this.collection, this.deletedField, useEv.documents);\n useEv.documents = await Promise.all(\n useEv.documents.map(d => pullModifier(d))\n );\n return useEv;\n })\n ),\n masterChangesSince: async (\n checkpoint: CheckpointType | undefined,\n batchSize: number\n ) => {\n if (!this.pull) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n /**\n * Retries must be done here in the replication primitives plugin,\n * because the replication protocol itself has no\n * error handling.\n */\n let done = false;\n let result: ReplicationPullHandlerResult = {} as any;\n while (!done && !this.isStopped()) {\n try {\n result = await this.pull.handler(\n checkpoint,\n batchSize\n );\n done = true;\n } catch (err: any | Error | Error[]) {\n const emitError = newRxError('RC_PULL', {\n checkpoint,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'pull'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n\n if (this.isStopped()) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n\n const useResult = flatClone(result);\n useResult.documents = handlePulledDocuments(this.collection, this.deletedField, useResult.documents);\n useResult.documents = await Promise.all(\n useResult.documents.map(d => pullModifier(d))\n );\n return useResult;\n },\n masterWrite: async (\n rows: RxReplicationWriteToMasterRow[]\n ) => {\n if (!this.push) {\n return [];\n }\n let done = false;\n\n await runAsyncPluginHooks('preReplicationMasterWrite', {\n rows,\n collection: this.collection\n });\n\n const useRowsOrNull = await Promise.all(\n rows.map(async (row) => {\n row.newDocumentState = await pushModifier(row.newDocumentState);\n if (row.newDocumentState === null) {\n return null;\n }\n if (row.assumedMasterState) {\n row.assumedMasterState = await pushModifier(row.assumedMasterState);\n }\n if (this.deletedField !== '_deleted') {\n row.newDocumentState = swapDefaultDeletedTodeletedField(this.deletedField, row.newDocumentState) as any;\n if (row.assumedMasterState) {\n row.assumedMasterState = swapDefaultDeletedTodeletedField(this.deletedField, row.assumedMasterState) as any;\n }\n }\n return row;\n })\n );\n const useRows: RxReplicationWriteToMasterRow[] = useRowsOrNull.filter(arrayFilterNotEmpty);\n\n let result: WithDeleted[] = null as any;\n\n // In case all the rows have been filtered and nothing has to be sent\n if (useRows.length === 0) {\n done = true;\n result = [];\n }\n\n while (!done && !this.isStopped()) {\n try {\n result = await this.push.handler(useRows);\n /**\n * It is a common problem that people have wrongly behaving backend\n * that do not return an array with the conflicts on push requests.\n * So we run this check here to make it easier to debug.\n * @link https://github.com/pubkey/rxdb/issues/4103\n */\n if (!Array.isArray(result)) {\n throw newRxError(\n 'RC_PUSH_NO_AR',\n {\n pushRows: rows,\n direction: 'push',\n args: { result }\n }\n );\n }\n done = true;\n } catch (err: any | Error | Error[] | RxError) {\n const emitError = (err as RxError).rxdb ? err : newRxError('RC_PUSH', {\n pushRows: rows,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'push'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n if (this.isStopped()) {\n return [];\n }\n\n await runAsyncPluginHooks('preReplicationMasterWriteDocumentsHandle', {\n result,\n collection: this.collection\n });\n\n const conflicts = handlePulledDocuments(this.collection, this.deletedField, ensureNotFalsy(result));\n return conflicts;\n }\n }\n });\n this.subs.push(\n this.internalReplicationState.events.error.subscribe(err => {\n this.subjects.error.next(err);\n }),\n this.internalReplicationState.events.processed.down\n .subscribe(row => this.subjects.received.next(row.document as any)),\n this.internalReplicationState.events.processed.up\n .subscribe(writeToMasterRow => {\n this.subjects.sent.next(writeToMasterRow.newDocumentState);\n }),\n combineLatest([\n this.internalReplicationState.events.active.down,\n this.internalReplicationState.events.active.up\n ]).subscribe(([down, up]) => {\n const isActive = down || up;\n this.subjects.active.next(isActive);\n })\n );\n\n if (\n this.pull &&\n this.pull.stream$ &&\n this.live\n ) {\n this.subs.push(\n this.pull.stream$.subscribe({\n next: ev => {\n this.remoteEvents$.next(ev);\n },\n error: err => {\n this.subjects.error.next(err);\n }\n })\n );\n }\n\n /**\n * Non-live replications run once\n * and then automatically get canceled.\n */\n if (!this.live) {\n await awaitRxStorageReplicationFirstInSync(this.internalReplicationState);\n await awaitRxStorageReplicationInSync(this.internalReplicationState);\n await this.cancel();\n }\n this.callOnStart();\n }\n\n isStopped(): boolean {\n if (this.subjects.canceled.getValue()) {\n return true;\n }\n return false;\n }\n\n async awaitInitialReplication(): Promise {\n await this.startPromise;\n return awaitRxStorageReplicationFirstInSync(\n ensureNotFalsy(this.internalReplicationState)\n );\n }\n\n /**\n * Returns a promise that resolves when:\n * - All local data is replicated with the remote\n * - No replication cycle is running or in retry-state\n *\n * WARNING: USing this function directly in a multi-tab browser application\n * is dangerous because only the leading instance will ever be replicated,\n * so this promise will not resolve in the other tabs.\n * For multi-tab support you should set and observe a flag in a local document.\n */\n async awaitInSync(): Promise {\n await this.startPromise;\n await awaitRxStorageReplicationFirstInSync(ensureNotFalsy(this.internalReplicationState));\n\n /**\n * To reduce the amount of re-renders and make testing\n * and to make the whole behavior more predictable,\n * we await these things multiple times.\n * For example the state might be in sync already and at the\n * exact same time a pull.stream$ event comes in and we want to catch\n * that in the same call to awaitInSync() instead of resolving\n * while actually the state is not in sync.\n */\n let t = 2;\n while (t > 0) {\n t--;\n\n /**\n * Often awaitInSync() is called directly after a document write,\n * like in the unit tests.\n * So we first have to await the idleness to ensure that all RxChangeEvents\n * are processed already.\n */\n await this.collection.database.requestIdlePromise();\n await awaitRxStorageReplicationInSync(ensureNotFalsy(this.internalReplicationState));\n }\n\n return true;\n }\n\n reSync() {\n this.remoteEvents$.next('RESYNC');\n }\n emitEvent(ev: RxReplicationPullStreamItem) {\n this.remoteEvents$.next(ev);\n }\n\n async cancel(): Promise {\n if (this.isStopped()) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n const promises: Promise[] = this.onCancel.map(fn => toPromise(fn()));\n\n if (this.internalReplicationState) {\n await cancelRxStorageReplication(this.internalReplicationState);\n }\n if (this.metaInstance) {\n promises.push(\n ensureNotFalsy(this.internalReplicationState).checkpointQueue\n .then(() => ensureNotFalsy(this.metaInstance).close())\n );\n }\n\n this.subs.forEach(sub => sub.unsubscribe());\n this.subjects.canceled.next(true);\n\n this.subjects.active.complete();\n this.subjects.canceled.complete();\n this.subjects.error.complete();\n this.subjects.received.complete();\n this.subjects.sent.complete();\n\n return Promise.all(promises);\n }\n\n async remove() {\n await ensureNotFalsy(this.metaInstance).remove();\n const metaInfo = await this.metaInfoPromise;\n await this.cancel();\n await removeConnectedStorageFromCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n );\n }\n}\n\n\nexport function replicateRxCollection(\n {\n replicationIdentifier,\n collection,\n deletedField = '_deleted',\n pull,\n push,\n live = true,\n retryTime = 1000 * 5,\n waitForLeadership = true,\n autoStart = true,\n }: ReplicationOptions\n): RxReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n /**\n * It is a common error to forget to add these config\n * objects. So we check here because it makes no sense\n * to start a replication with neither push nor pull.\n */\n if (!pull && !push) {\n throw newRxError('UT3', {\n collection: collection.name,\n args: {\n replicationIdentifier\n }\n });\n }\n\n const replicationState = new RxReplicationState(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n\n\n startReplicationOnLeaderShip(waitForLeadership, replicationState);\n return replicationState as any;\n}\n\n\nexport function startReplicationOnLeaderShip(\n waitForLeadership: boolean,\n replicationState: RxReplicationState\n) {\n /**\n * Always await this Promise to ensure that the current instance\n * is leader when waitForLeadership=true\n */\n const mustWaitForLeadership = waitForLeadership && replicationState.collection.database.multiInstance;\n const waitTillRun: Promise = mustWaitForLeadership ? replicationState.collection.database.waitForLeadership() : PROMISE_RESOLVE_TRUE;\n return waitTillRun.then(() => {\n if (replicationState.isStopped()) {\n return;\n }\n if (replicationState.autoStart) {\n replicationState.start();\n }\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/state/rx-state.js.map b/dist/cjs/plugins/state/rx-state.js.map index b8be7702cfa..60f93b05cb7 100644 --- a/dist/cjs/plugins/state/rx-state.js.map +++ b/dist/cjs/plugins/state/rx-state.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-state.js","names":["_rxjs","require","_overwritable","_rxStorageHelper","_index","_helpers","_rxError","_hooks","debugId","RxStateBase","exports","prefix","collection","_id","_state","_nonPersisted","_writeQueue","PROMISE_RESOLVE_VOID","_initDone","_instanceId","randomCouchString","RX_STATE_COLLECTION_SCHEMA","properties","sId","maxLength","_ownEmits$","Subject","onDestroy","push","_lastIdQuery","findOne","sort","id","$","subscribe","merge","pipe","tap","event","operation","documentData","mergeOperationsIntoState","ops","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","map","_proto","prototype","set","path","modifier","_triggerWrite","then","length","useWrites","done","lastIdDoc","exec","appendToArray","nextId","nextRxStateId","undefined","newState","clone","index","writeRow","value","getProperty","newValue","setProperty","k","v","insert","next","err","code","catch","error","newRxError","name","get","overwritable","deepFreezeWhenDevMode","get$","startWith","distinctUntilChanged","deepEqual","get$$","obs","reactivity","database","getReactivityFactory","fromObservable","_cleanup","firstWrite","lastWrite","firstNr","parseInt","lastNr","find","selector","$lte","remove","createRxState","collectionName","addCollections","schema","collections","rxState","checkpoint","result","getChangedDocumentsSince","storageInstance","documents","document","proxy","Proxy","target","property","ret","bind","lastChar","charAt","endsWith","key","slice","receiver","Error","runPluginHooks","state","operations"],"sources":["../../../../src/plugins/state/rx-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n distinctUntilChanged,\n map,\n merge,\n shareReplay,\n startWith,\n tap\n} from 'rxjs';\nimport { overwritable } from '../../overwritable.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\nimport type {\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxError,\n Paths\n} from '../../types';\nimport {\n RXJS_SHARE_REPLAY_DEFAULTS,\n getProperty,\n setProperty,\n PROMISE_RESOLVE_VOID,\n appendToArray,\n clone,\n randomCouchString,\n deepEqual\n} from '../utils/index.ts';\nimport {\n RX_STATE_COLLECTION_SCHEMA,\n nextRxStateId\n} from './helpers.ts';\nimport {\n RxStateDocument,\n RxStateOperation,\n RxStateModifier\n} from './types.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport { runPluginHooks } from '../../hooks.ts';\n\n\nlet debugId = 0;\n\n\n/**\n * RxDB internally used properties are\n * prefixed with lodash _ to make them less\n * likely to clash with actual state properties\n * from the user.\n */\nexport class RxStateBase {\n // used for debugging\n public _id: number = debugId++;\n public _state: T | any = {};\n public $: Observable;\n public _lastIdQuery: RxQuery | null>;\n public _nonPersisted: {\n path: string;\n modifier: RxStateModifier;\n }[] = [];\n public _writeQueue = PROMISE_RESOLVE_VOID;\n public _initDone = false;\n public _instanceId = randomCouchString(RX_STATE_COLLECTION_SCHEMA.properties.sId.maxLength);\n public _ownEmits$ = new Subject();\n\n constructor(\n public readonly prefix: string,\n public readonly collection: RxCollection\n ) {\n this.collection.onDestroy.push(() => this._writeQueue);\n this._lastIdQuery = this.collection.findOne({\n sort: [\n { id: 'desc' }\n ]\n });\n // make it \"hot\" for better write performance\n this._lastIdQuery.$.subscribe();\n\n this.$ = merge(\n this._ownEmits$,\n this.collection.$.pipe(\n tap(event => {\n if (\n this._initDone &&\n event.operation === 'INSERT' &&\n event.documentData.sId !== this._instanceId\n ) {\n mergeOperationsIntoState(this._state, event.documentData.ops);\n }\n })\n )\n ).pipe(\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n map(() => this._state)\n );\n // directly subscribe because of the tap() side effect\n this.$.subscribe();\n }\n\n async set(\n path: Paths | '',\n modifier: RxStateModifier\n ) {\n this._nonPersisted.push({\n path,\n modifier\n });\n return this._triggerWrite();\n }\n\n /**\n * To have deterministic writes,\n * and to ensure that multiple js realms do not overwrite\n * each other, the write happens with incremental ids\n * that would throw conflict errors and trigger a retry.\n */\n _triggerWrite() {\n this._writeQueue = this._writeQueue.then(async () => {\n if (this._nonPersisted.length === 0) {\n return;\n }\n let useWrites: typeof this._nonPersisted = [];\n let done = false;\n while (!done) {\n const lastIdDoc = await this._lastIdQuery.exec();\n appendToArray(useWrites, this._nonPersisted);\n this._nonPersisted = [];\n const nextId = nextRxStateId(lastIdDoc ? lastIdDoc.id : undefined);\n try {\n /**\n * TODO instead of a deep-clone we should\n * only clone the parts where we know that they\n * will be changed. This would improve performance.\n */\n const newState = clone(this._state);\n const ops: RxStateOperation[] = [];\n for (let index = 0; index < useWrites.length; index++) {\n const writeRow = useWrites[index];\n const value = getProperty(newState, writeRow.path);\n const newValue = writeRow.modifier(value);\n setProperty(newState, writeRow.path, newValue);\n ops.push({\n k: writeRow.path,\n /**\n * Here we have to clone the value because\n * some storages like the memory storage\n * make input data deep-frozen in dev-mode.\n */\n v: clone(newValue)\n });\n }\n await this.collection.insert({\n id: nextId,\n sId: this._instanceId,\n ops\n });\n this._state = newState;\n this._ownEmits$.next(this._state);\n done = true;\n } catch (err) {\n if ((err as RxError).code !== 'CONFLICT') {\n throw err;\n }\n }\n }\n }).catch(error => {\n throw newRxError('SNH', {\n name: 'RxState WRITE QUEUE ERROR',\n error\n });\n });\n return this._writeQueue;\n }\n\n get(path?: Paths) {\n if (!path) {\n return overwritable.deepFreezeWhenDevMode(this._state);\n }\n return overwritable.deepFreezeWhenDevMode(\n getProperty(this._state, path)\n );\n }\n get$(path?: Paths): Observable {\n return this.$.pipe(\n map(() => this.get(path)),\n startWith(this.get(path)),\n distinctUntilChanged(deepEqual),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n );\n }\n get$$(path?: Paths): Reactivity {\n const obs = this.get$(path);\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n obs,\n this.get(path),\n this.collection.database\n ) as any;\n }\n\n /**\n * Merges the state operations into a single write row\n * to store space and make recreating the state from\n * disc faster.\n */\n async _cleanup() {\n const firstWrite = await this.collection.findOne({\n sort: [{ id: 'asc' }]\n }).exec();\n const lastWrite = await this._lastIdQuery.exec();\n\n if (!firstWrite || !lastWrite) {\n return;\n }\n\n const firstNr = parseInt(firstWrite.id, 10);\n const lastNr = parseInt(lastWrite.id, 10);\n if ((lastNr - 5) < firstNr) {\n // only run if more then 5 write rows\n return;\n }\n\n // update whole state object\n await this._writeQueue;\n await this.set('', () => this._state);\n\n // delete old ones\n await this.collection.find({\n selector: {\n id: {\n $lte: lastWrite.id\n }\n }\n }).remove();\n }\n}\n\n\nexport async function createRxState(\n database: RxDatabase,\n prefix: string\n): Promise> {\n const collectionName = 'rx-state-' + prefix;\n await database.addCollections({\n [collectionName]: {\n schema: RX_STATE_COLLECTION_SCHEMA as any\n }\n });\n const collection: RxCollection = database.collections[collectionName];\n\n const rxState = new RxStateBase(\n prefix,\n collection\n );\n\n\n /**\n * Directly get the state and put it into memory.\n * This ensures we can do non-async accesses to the\n * correct state.\n */\n let done = false;\n let checkpoint: any = undefined;\n while (!done) {\n const result = await getChangedDocumentsSince(\n collection.storageInstance,\n 1000,\n checkpoint\n );\n checkpoint = result.checkpoint;\n const documents = result.documents;\n if (documents.length === 0) {\n done = true;\n } else {\n for (let index = 0; index < documents.length; index++) {\n const document = documents[index];\n mergeOperationsIntoState(rxState._state, document.ops);\n }\n }\n }\n rxState._initDone = true;\n\n const proxy = new Proxy(\n rxState as any,\n {\n get(target, property: any) {\n if (typeof property !== 'string') {\n return target[property];\n }\n if ((rxState as any)[property]) {\n const ret = (rxState as any)[property];\n if (typeof ret === 'function') {\n return ret.bind(rxState);\n } else {\n return ret;\n }\n }\n const lastChar = property.charAt(property.length - 1);\n if (property.endsWith('$$')) {\n const key = property.slice(0, -2);\n return rxState.get$$(key as any);\n } else if (lastChar === '$') {\n const key = property.slice(0, -1);\n return rxState.get$(key as any);\n } else {\n return rxState.get(property as any);\n }\n },\n set(target, newValue, receiver) {\n throw new Error('Do not write to RxState');\n }\n }\n );\n\n runPluginHooks('createRxState', {\n collection,\n state: proxy\n });\n\n return proxy;\n}\n\n\nexport function mergeOperationsIntoState(\n state: T,\n operations: RxStateOperation[]\n) {\n for (let index = 0; index < operations.length; index++) {\n const operation = operations[index];\n setProperty(state, operation.k, clone(operation.v));\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-state.js","names":["_rxjs","require","_overwritable","_rxStorageHelper","_index","_helpers","_rxError","_hooks","debugId","RxStateBase","exports","prefix","collection","_id","_state","_nonPersisted","_writeQueue","PROMISE_RESOLVE_VOID","_initDone","_instanceId","randomCouchString","RX_STATE_COLLECTION_SCHEMA","properties","sId","maxLength","_ownEmits$","Subject","onDestroy","push","_lastIdQuery","findOne","sort","id","$","subscribe","merge","pipe","tap","event","operation","documentData","mergeOperationsIntoState","ops","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","map","_proto","prototype","set","path","modifier","_triggerWrite","then","length","useWrites","done","lastIdDoc","exec","appendToArray","nextId","nextRxStateId","undefined","newState","clone","index","writeRow","value","getProperty","newValue","setProperty","k","v","insert","next","err","code","catch","error","newRxError","name","get","overwritable","deepFreezeWhenDevMode","get$","startWith","distinctUntilChanged","deepEqual","get$$","obs","reactivity","database","getReactivityFactory","fromObservable","_cleanup","firstWrite","lastWrite","firstNr","parseInt","lastNr","find","selector","$lte","remove","createRxState","collectionName","addCollections","schema","collections","rxState","checkpoint","result","getChangedDocumentsSince","storageInstance","documents","document","proxy","Proxy","target","property","ret","bind","lastChar","charAt","endsWith","key","slice","receiver","Error","runPluginHooks","state","operations"],"sources":["../../../../src/plugins/state/rx-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n distinctUntilChanged,\n map,\n merge,\n shareReplay,\n startWith,\n tap\n} from 'rxjs';\nimport { overwritable } from '../../overwritable.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\nimport type {\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxError,\n Paths\n} from '../../types';\nimport {\n RXJS_SHARE_REPLAY_DEFAULTS,\n getProperty,\n setProperty,\n PROMISE_RESOLVE_VOID,\n appendToArray,\n clone,\n randomCouchString,\n deepEqual\n} from '../utils/index.ts';\nimport {\n RX_STATE_COLLECTION_SCHEMA,\n nextRxStateId\n} from './helpers.ts';\nimport {\n RxStateDocument,\n RxStateOperation,\n RxStateModifier\n} from './types.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport { runPluginHooks } from '../../hooks.ts';\n\n\nlet debugId = 0;\n\n\n/**\n * RxDB internally used properties are\n * prefixed with lodash _ to make them less\n * likely to clash with actual state properties\n * from the user.\n */\nexport class RxStateBase {\n // used for debugging\n public _id: number = debugId++;\n public _state: T | any = {};\n public $: Observable;\n public _lastIdQuery: RxQuery | null>;\n public _nonPersisted: {\n path: string;\n modifier: RxStateModifier;\n }[] = [];\n public _writeQueue = PROMISE_RESOLVE_VOID;\n public _initDone = false;\n public _instanceId = randomCouchString(RX_STATE_COLLECTION_SCHEMA.properties.sId.maxLength);\n public _ownEmits$ = new Subject();\n\n constructor(\n public readonly prefix: string,\n public readonly collection: RxCollection\n ) {\n this.collection.onDestroy.push(() => this._writeQueue);\n this._lastIdQuery = this.collection.findOne({\n sort: [\n { id: 'desc' }\n ]\n });\n // make it \"hot\" for better write performance\n this._lastIdQuery.$.subscribe();\n\n this.$ = merge(\n this._ownEmits$,\n this.collection.$.pipe(\n tap(event => {\n if (\n this._initDone &&\n event.operation === 'INSERT' &&\n event.documentData.sId !== this._instanceId\n ) {\n mergeOperationsIntoState(this._state, event.documentData.ops);\n }\n })\n )\n ).pipe(\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n map(() => this._state)\n );\n // directly subscribe because of the tap() side effect\n this.$.subscribe();\n }\n\n async set(\n path: Paths | '',\n modifier: RxStateModifier\n ) {\n this._nonPersisted.push({\n path,\n modifier\n });\n return this._triggerWrite();\n }\n\n /**\n * To have deterministic writes,\n * and to ensure that multiple js realms do not overwrite\n * each other, the write happens with incremental ids\n * that would throw conflict errors and trigger a retry.\n */\n _triggerWrite() {\n this._writeQueue = this._writeQueue.then(async () => {\n if (this._nonPersisted.length === 0) {\n return;\n }\n let useWrites: typeof this._nonPersisted = [];\n let done = false;\n while (!done) {\n const lastIdDoc = await this._lastIdQuery.exec();\n appendToArray(useWrites, this._nonPersisted);\n this._nonPersisted = [];\n const nextId = nextRxStateId(lastIdDoc ? lastIdDoc.id : undefined);\n try {\n /**\n * TODO instead of a deep-clone we should\n * only clone the parts where we know that they\n * will be changed. This would improve performance.\n */\n const newState = clone(this._state);\n const ops: RxStateOperation[] = [];\n for (let index = 0; index < useWrites.length; index++) {\n const writeRow = useWrites[index];\n const value = getProperty(newState, writeRow.path);\n const newValue = writeRow.modifier(value);\n setProperty(newState, writeRow.path, newValue);\n ops.push({\n k: writeRow.path,\n /**\n * Here we have to clone the value because\n * some storages like the memory storage\n * make input data deep-frozen in dev-mode.\n */\n v: clone(newValue)\n });\n }\n await this.collection.insert({\n id: nextId,\n sId: this._instanceId,\n ops\n });\n this._state = newState;\n this._ownEmits$.next(this._state);\n done = true;\n } catch (err) {\n if ((err as RxError).code !== 'CONFLICT') {\n throw err;\n }\n }\n }\n }).catch(error => {\n throw newRxError('SNH', {\n name: 'RxState WRITE QUEUE ERROR',\n error\n });\n });\n return this._writeQueue;\n }\n\n get(path?: Paths) {\n if (!path) {\n return overwritable.deepFreezeWhenDevMode(this._state);\n }\n return overwritable.deepFreezeWhenDevMode(\n getProperty(this._state, path)\n );\n }\n get$(path?: Paths): Observable {\n return this.$.pipe(\n map(() => this.get(path)),\n startWith(this.get(path)),\n distinctUntilChanged(deepEqual),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n );\n }\n get$$(path?: Paths): Reactivity {\n const obs = this.get$(path);\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n obs,\n this.get(path),\n this.collection.database\n ) as any;\n }\n\n /**\n * Merges the state operations into a single write row\n * to store space and make recreating the state from\n * disc faster.\n */\n async _cleanup() {\n const firstWrite = await this.collection.findOne({\n sort: [{ id: 'asc' }]\n }).exec();\n const lastWrite = await this._lastIdQuery.exec();\n\n if (!firstWrite || !lastWrite) {\n return;\n }\n\n const firstNr = parseInt(firstWrite.id, 10);\n const lastNr = parseInt(lastWrite.id, 10);\n if ((lastNr - 5) < firstNr) {\n // only run if more then 5 write rows\n return;\n }\n\n // update whole state object\n await this._writeQueue;\n await this.set('', () => this._state);\n\n // delete old ones\n await this.collection.find({\n selector: {\n id: {\n $lte: lastWrite.id\n }\n }\n }).remove();\n }\n}\n\n\nexport async function createRxState(\n database: RxDatabase,\n prefix: string\n): Promise> {\n const collectionName = 'rx-state-' + prefix;\n await database.addCollections({\n [collectionName]: {\n schema: RX_STATE_COLLECTION_SCHEMA as any\n }\n });\n const collection: RxCollection = database.collections[collectionName];\n\n const rxState = new RxStateBase(\n prefix,\n collection\n );\n\n\n /**\n * Directly get the state and put it into memory.\n * This ensures we can do non-async accesses to the\n * correct state.\n */\n let done = false;\n let checkpoint: any = undefined;\n while (!done) {\n const result = await getChangedDocumentsSince(\n collection.storageInstance,\n 1000,\n checkpoint\n );\n checkpoint = result.checkpoint;\n const documents = result.documents;\n if (documents.length === 0) {\n done = true;\n } else {\n for (let index = 0; index < documents.length; index++) {\n const document = documents[index];\n mergeOperationsIntoState(rxState._state, document.ops);\n }\n }\n }\n rxState._initDone = true;\n\n const proxy = new Proxy(\n rxState as any,\n {\n get(target, property: any) {\n if (typeof property !== 'string') {\n return target[property];\n }\n if ((rxState as any)[property]) {\n const ret = (rxState as any)[property];\n if (typeof ret === 'function') {\n return ret.bind(rxState);\n } else {\n return ret;\n }\n }\n const lastChar = property.charAt(property.length - 1);\n if (property.endsWith('$$')) {\n const key = property.slice(0, -2);\n return rxState.get$$(key as any);\n } else if (lastChar === '$') {\n const key = property.slice(0, -1);\n return rxState.get$(key as any);\n } else {\n return rxState.get(property as any);\n }\n },\n set(target, newValue, receiver) {\n throw new Error('Do not write to RxState');\n }\n }\n );\n\n runPluginHooks('createRxState', {\n collection,\n state: proxy\n });\n\n return proxy;\n}\n\n\nexport function mergeOperationsIntoState(\n state: T,\n operations: RxStateOperation[]\n) {\n for (let index = 0; index < operations.length; index++) {\n const operation = operations[index];\n setProperty(state, operation.k, clone(operation.v));\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-denokv/index.js.map b/dist/cjs/plugins/storage-denokv/index.js.map index eac5952be1d..67b617d650d 100644 --- a/dist/cjs/plugins/storage-denokv/index.js.map +++ b/dist/cjs/plugins/storage-denokv/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["_rxStorageHelper","require","_denokvHelper","_rxStorageInstanceDenokv","_utilsRxdbVersion","RxStorageDenoKV","exports","settings","name","RX_STORAGE_NAME_DENOKV","rxdbVersion","RXDB_VERSION","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createDenoKVStorageInstance","getRxStorageDenoKV","consistencyLevel","storage"],"sources":["../../../../src/plugins/storage-denokv/index.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport type { DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RX_STORAGE_NAME_DENOKV } from \"./denokv-helper.ts\";\nimport { RxStorageInstanceDenoKV, createDenoKVStorageInstance } from \"./rx-storage-instance-denokv.ts\";\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDenoKV implements RxStorage, DenoKVSettings> {\n public name = RX_STORAGE_NAME_DENOKV;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public settings: DenoKVSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDenoKVStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDenoKV(\n settings: DenoKVSettings = {\n consistencyLevel: 'strong'\n }\n): RxStorageDenoKV {\n const storage = new RxStorageDenoKV(settings);\n return storage;\n}\n"],"mappings":";;;;;;;AAIA,IAAAA,gBAAA,GAAAC,OAAA;AAEA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAIjDI,eAAe,GAAAC,OAAA,CAAAD,eAAA;EAIxB,SAAAA,gBACWE,QAAwB,EACjC;IAAA,KALKC,IAAI,GAAGC,oCAAsB;IAAA,KACpBC,WAAW,GAAGC,8BAAY;IAAA,KAG/BJ,QAAwB,GAAxBA,QAAwB;EAC/B;EAAC,IAAAK,MAAA,GAAAP,eAAA,CAAAQ,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAkE,EACvB;IAC3C,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,oDAA2B,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACR,QAAQ,CAAC;EACnE,CAAC;EAAA,OAAAF,eAAA;AAAA;AAIE,SAASa,kBAAkBA,CAC9BX,QAAwB,GAAG;EACvBY,gBAAgB,EAAE;AACtB,CAAC,EACc;EACf,IAAMC,OAAO,GAAG,IAAIf,eAAe,CAACE,QAAQ,CAAC;EAC7C,OAAOa,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["_rxStorageHelper","require","_denokvHelper","_rxStorageInstanceDenokv","_utilsRxdbVersion","RxStorageDenoKV","exports","settings","name","RX_STORAGE_NAME_DENOKV","rxdbVersion","RXDB_VERSION","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createDenoKVStorageInstance","getRxStorageDenoKV","consistencyLevel","storage"],"sources":["../../../../src/plugins/storage-denokv/index.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport type { DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RX_STORAGE_NAME_DENOKV } from \"./denokv-helper.ts\";\nimport { RxStorageInstanceDenoKV, createDenoKVStorageInstance } from \"./rx-storage-instance-denokv.ts\";\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDenoKV implements RxStorage, DenoKVSettings> {\n public name = RX_STORAGE_NAME_DENOKV;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public settings: DenoKVSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDenoKVStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDenoKV(\n settings: DenoKVSettings = {\n consistencyLevel: 'strong'\n }\n): RxStorageDenoKV {\n const storage = new RxStorageDenoKV(settings);\n return storage;\n}\n"],"mappings":";;;;;;;AAIA,IAAAA,gBAAA,GAAAC,OAAA;AAEA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAIjDI,eAAe,GAAAC,OAAA,CAAAD,eAAA;EAIxB,SAAAA,gBACWE,QAAwB,EACjC;IAAA,KALKC,IAAI,GAAGC,oCAAsB;IAAA,KACpBC,WAAW,GAAGC,8BAAY;IAAA,KAG/BJ,QAAwB,GAAxBA,QAAwB;EAC/B;EAAC,IAAAK,MAAA,GAAAP,eAAA,CAAAQ,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAkE,EACvB;IAC3C,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,oDAA2B,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACR,QAAQ,CAAC;EACnE,CAAC;EAAA,OAAAF,eAAA;AAAA;AAIE,SAASa,kBAAkBA,CAC9BX,QAAwB,GAAG;EACvBY,gBAAgB,EAAE;AACtB,CAAC,EACc;EACf,IAAMC,OAAO,GAAG,IAAIf,eAAe,CAACE,QAAQ,CAAC;EAC7C,OAAOa,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-denokv/rx-storage-instance-denokv.js.map b/dist/cjs/plugins/storage-denokv/rx-storage-instance-denokv.js.map index df9487cefb6..646174d7fd4 100644 --- a/dist/cjs/plugins/storage-denokv/rx-storage-instance-denokv.js.map +++ b/dist/cjs/plugins/storage-denokv/rx-storage-instance-denokv.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-denokv.js","names":["_rxjs","require","_rxSchemaHelper","_rxStorageMultiinstance","_denokvHelper","_customIndex","_utilsArray","_utilsOther","_rxStorageHelper","_utilsTime","_denokvQuery","_queryPlanner","_utilsPromise","_utilsObject","RxStorageInstanceDenoKV","exports","storage","databaseName","collectionName","schema","internals","options","settings","keySpace","version","join","kvOptions","consistency","consistencyLevel","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","kvPromise","getDenoGlobal","openKv","openKvPath","then","kv","set","_proto","prototype","retryUntilNoWriteInBetween","fn","writeBlockKeyBefore","get","writeBlockValueBefore","value","result","writeBlockKeyAfter","writeBlockValueAfter","bulkWrite","documentWrites","context","_this","ret","success","error","batches","batchArray","ensureNotFalsy","batchSize","writeBatch","_loop","writeBlockKey","docsInDB","Map","readManyBatches","Promise","all","map","readManyBatch","docsResult","getMany","writeRow","docId","document","DENOKV_DOCUMENT_ROOT_PATH","row","docData","categorized","categorizeBulkWriteRows","tx","atomic","check","bulkInsertDocs","forEach","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexId","bulkUpdateDocs","oldIndexString","previous","newIndexString","delete","txResult","commit","ok","appendToArray","errors","eventBulk","events","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","now","next","findDocumentsById","ids","withDeleted","kvKey","findSingleResult","docInDb","_deleted","query","preparedQuery","queryDenoKV","count","documents","mode","getAttachmentData","documentId","attachmentId","digest","Error","changeStream","asObservable","cleanup","minimumDeletedTime","_this2","maxDeletionTime","index","CLEANUP_INDEX","indexName","getDenoKVIndexName","lowerBoundString","getStartIndexStringFromLowerBound","upperBoundString","noMoreUndeleted","range","list","start","end","limit","rangeCount","_loop2","docDataResult","indexMetaInner","_ret","close","closed","complete","remove","ensureNotClosed","INDEX_MAX","promises","key","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","PROMISE_RESOLVE_VOID","createDenoKVStorageInstance","params","flatClone","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","toArray","getIndexableStringMonad","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_DENOKV","resolve"],"sources":["../../../../src/plugins/storage-denokv/rx-storage-instance-denokv.ts"],"sourcesContent":["\nimport {\n Subject,\n Observable\n} from 'rxjs';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n RxConflictResultionTask,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport type { DenoKVIndexMeta, DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RxStorageDenoKV } from './index.ts';\nimport { CLEANUP_INDEX, DENOKV_DOCUMENT_ROOT_PATH, RX_STORAGE_NAME_DENOKV, getDenoGlobal, getDenoKVIndexName } from \"./denokv-helper.ts\";\nimport { getIndexableStringMonad, getStartIndexStringFromLowerBound } from \"../../custom-index.ts\";\nimport { appendToArray, batchArray, lastOfArray, toArray } from \"../utils/utils-array.ts\";\nimport { ensureNotFalsy } from \"../utils/utils-other.ts\";\nimport { categorizeBulkWriteRows } from \"../../rx-storage-helper.ts\";\nimport { now } from \"../utils/utils-time.ts\";\nimport { queryDenoKV } from \"./denokv-query.ts\";\nimport { INDEX_MAX } from \"../../query-planner.ts\";\nimport { PROMISE_RESOLVE_VOID } from \"../utils/utils-promise.ts\";\nimport { flatClone } from \"../utils/utils-object.ts\";\n\n\n\nexport class RxStorageInstanceDenoKV implements RxStorageInstance<\n RxDocType,\n DenoKVStorageInternals,\n DenoKVSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public closed?: Promise;\n public readonly kvPromise: Promise;\n\n constructor(\n public readonly storage: RxStorageDenoKV,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DenoKVStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DenoKVSettings,\n public readonly keySpace = ['rxdb', databaseName, collectionName, schema.version].join('|'),\n public readonly kvOptions = { consistency: settings.consistencyLevel }\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.kvPromise = getDenoGlobal().openKv(settings.openKvPath).then(async (kv: any) => {\n // insert writeBlockKey\n await kv.set([this.keySpace], 1);\n return kv;\n });\n }\n\n /**\n * DenoKV has no transactions\n * so we have to ensure that there is no write in between our queries\n * which would confuse RxDB and return wrong query results.\n */\n async retryUntilNoWriteInBetween(\n fn: () => Promise\n ): Promise {\n const kv = await this.kvPromise;\n while (true) {\n const writeBlockKeyBefore = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueBefore = writeBlockKeyBefore ? writeBlockKeyBefore.value : -1;\n const result = await fn();\n const writeBlockKeyAfter = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueAfter = writeBlockKeyAfter ? writeBlockKeyAfter.value : -1;\n\n if (writeBlockValueBefore === writeBlockValueAfter) {\n return result;\n }\n }\n }\n\n async bulkWrite(documentWrites: BulkWriteRow[], context: string): Promise> {\n const kv = await this.kvPromise;\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const batches = batchArray(documentWrites, ensureNotFalsy(this.settings.batchSize));\n\n /**\n * DenoKV does not have transactions\n * so we use a special writeBlock row to ensure\n * atomic writes (per document)\n * and so that we can do bulkWrites\n */\n for (const writeBatch of batches) {\n while (true) {\n const writeBlockKey = await kv.get([this.keySpace], this.kvOptions);\n const docsInDB = new Map>();\n\n /**\n * TODO the max amount for .getMany() is 10 which is defined by deno itself.\n * How can this be increased?\n */\n const readManyBatches = batchArray(writeBatch, 10);\n await Promise.all(\n readManyBatches.map(async (readManyBatch) => {\n const docsResult = await kv.getMany(\n readManyBatch.map(writeRow => {\n const docId: string = writeRow.document[primaryPath] as any;\n return [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n })\n );\n docsResult.map((row: any) => {\n const docData = row.value;\n if (!docData) {\n return;\n }\n const docId: string = docData[primaryPath] as any;\n docsInDB.set(docId, docData);\n });\n })\n );\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n\n let tx = kv.atomic();\n tx = tx.set([this.keySpace], ensureNotFalsy(writeBlockKey.value) + 1);\n tx = tx.check(writeBlockKey);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n tx = tx.set([this.keySpace, indexMeta.indexId, indexString], docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n tx = tx.delete([this.keySpace, indexMeta.indexId, oldIndexString]);\n tx = tx.set([this.keySpace, indexMeta.indexId, newIndexString], docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n const txResult = await tx.commit();\n if (txResult.ok) {\n appendToArray(ret.error, categorized.errors);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n break;\n }\n }\n }\n return ret;\n }\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const kv = await this.kvPromise;\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const kvKey = [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n const findSingleResult = await kv.get(kvKey, this.kvOptions);\n const docInDb = findSingleResult.value;\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return this.retryUntilNoWriteInBetween(\n () => queryDenoKV(this, preparedQuery)\n );\n }\n async count(preparedQuery: PreparedQuery): Promise {\n /**\n * At this point in time (end 2023), DenoKV does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/denoland/deno/issues/18965\n */\n const result = await this.retryUntilNoWriteInBetween(\n () => this.query(preparedQuery)\n );\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n throw new Error(\"Method not implemented.\");\n }\n changeStream() {\n return this.changes$.asObservable();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const maxDeletionTime = now() - minimumDeletedTime;\n const kv = await this.kvPromise;\n const index = CLEANUP_INDEX;\n const indexName = getDenoKVIndexName(index);\n const indexMeta = this.internals.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n\n const range = kv.list({\n start: [this.keySpace, indexMeta.indexId, lowerBoundString],\n end: [this.keySpace, indexMeta.indexId, upperBoundString]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize,\n limit: this.settings.batchSize\n });\n\n let rangeCount = 0;\n for await (const row of range) {\n rangeCount = rangeCount + 1;\n const docId = row.value;\n const docDataResult = await kv.get([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], this.kvOptions);\n if (!docDataResult.value) {\n continue;\n }\n const docData = ensureNotFalsy(docDataResult.value);\n if (\n !docData._deleted ||\n docData._meta.lwt > maxDeletionTime\n ) {\n continue;\n }\n\n\n let tx = kv.atomic();\n tx = tx.check(docDataResult);\n tx = tx.delete([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId]);\n Object\n .values(this.internals.indexes)\n .forEach(indexMetaInner => {\n tx = tx.delete([this.keySpace, indexMetaInner.indexId, docId]);\n });\n await tx.commit();\n }\n return noMoreUndeleted;\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const kv = await this.kvPromise;\n await kv.close();\n })();\n return this.closed;\n }\n async remove(): Promise {\n ensureNotClosed(this);\n const kv = await this.kvPromise;\n const range = kv.list({\n start: [this.keySpace],\n end: [this.keySpace, INDEX_MAX]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize\n });\n let promises: Promise[] = [];\n for await (const row of range) {\n promises.push(kv.delete(row.key));\n }\n\n await Promise.all(promises);\n return this.close();\n }\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\n\n\nexport async function createDenoKVStorageInstance(\n storage: RxStorageDenoKV,\n params: RxStorageInstanceCreationParams,\n settings: DenoKVSettings\n): Promise> {\n settings = flatClone(settings);\n if (!settings.batchSize) {\n settings.batchSize = 100;\n }\n\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const indexDBs: { [indexName: string]: DenoKVIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach((indexAr, indexId) => {\n const indexName = getDenoKVIndexName(indexAr);\n indexDBs[indexName] = {\n indexId: '|' + indexId + '|',\n indexName,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n const internals = {\n indexes: indexDBs\n };\n const instance = new RxStorageInstanceDenoKV(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DENOKV,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDenoKV\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDenoKV is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-denokv.js","names":["_rxjs","require","_rxSchemaHelper","_rxStorageMultiinstance","_denokvHelper","_customIndex","_utilsArray","_utilsOther","_rxStorageHelper","_utilsTime","_denokvQuery","_queryPlanner","_utilsPromise","_utilsObject","RxStorageInstanceDenoKV","exports","storage","databaseName","collectionName","schema","internals","options","settings","keySpace","version","join","kvOptions","consistency","consistencyLevel","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","kvPromise","getDenoGlobal","openKv","openKvPath","then","kv","set","_proto","prototype","retryUntilNoWriteInBetween","fn","writeBlockKeyBefore","get","writeBlockValueBefore","value","result","writeBlockKeyAfter","writeBlockValueAfter","bulkWrite","documentWrites","context","_this","ret","success","error","batches","batchArray","ensureNotFalsy","batchSize","writeBatch","_loop","writeBlockKey","docsInDB","Map","readManyBatches","Promise","all","map","readManyBatch","docsResult","getMany","writeRow","docId","document","DENOKV_DOCUMENT_ROOT_PATH","row","docData","categorized","categorizeBulkWriteRows","tx","atomic","check","bulkInsertDocs","forEach","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexId","bulkUpdateDocs","oldIndexString","previous","newIndexString","delete","txResult","commit","ok","appendToArray","errors","eventBulk","events","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","now","next","findDocumentsById","ids","withDeleted","kvKey","findSingleResult","docInDb","_deleted","query","preparedQuery","queryDenoKV","count","documents","mode","getAttachmentData","documentId","attachmentId","digest","Error","changeStream","asObservable","cleanup","minimumDeletedTime","_this2","maxDeletionTime","index","CLEANUP_INDEX","indexName","getDenoKVIndexName","lowerBoundString","getStartIndexStringFromLowerBound","upperBoundString","noMoreUndeleted","range","list","start","end","limit","rangeCount","_loop2","docDataResult","indexMetaInner","_ret","close","closed","complete","remove","ensureNotClosed","INDEX_MAX","promises","key","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","PROMISE_RESOLVE_VOID","createDenoKVStorageInstance","params","flatClone","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","toArray","getIndexableStringMonad","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_DENOKV","resolve"],"sources":["../../../../src/plugins/storage-denokv/rx-storage-instance-denokv.ts"],"sourcesContent":["\nimport {\n Subject,\n Observable\n} from 'rxjs';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n RxConflictResultionTask,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport type { DenoKVIndexMeta, DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RxStorageDenoKV } from './index.ts';\nimport { CLEANUP_INDEX, DENOKV_DOCUMENT_ROOT_PATH, RX_STORAGE_NAME_DENOKV, getDenoGlobal, getDenoKVIndexName } from \"./denokv-helper.ts\";\nimport { getIndexableStringMonad, getStartIndexStringFromLowerBound } from \"../../custom-index.ts\";\nimport { appendToArray, batchArray, lastOfArray, toArray } from \"../utils/utils-array.ts\";\nimport { ensureNotFalsy } from \"../utils/utils-other.ts\";\nimport { categorizeBulkWriteRows } from \"../../rx-storage-helper.ts\";\nimport { now } from \"../utils/utils-time.ts\";\nimport { queryDenoKV } from \"./denokv-query.ts\";\nimport { INDEX_MAX } from \"../../query-planner.ts\";\nimport { PROMISE_RESOLVE_VOID } from \"../utils/utils-promise.ts\";\nimport { flatClone } from \"../utils/utils-object.ts\";\n\n\n\nexport class RxStorageInstanceDenoKV implements RxStorageInstance<\n RxDocType,\n DenoKVStorageInternals,\n DenoKVSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public closed?: Promise;\n public readonly kvPromise: Promise;\n\n constructor(\n public readonly storage: RxStorageDenoKV,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DenoKVStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DenoKVSettings,\n public readonly keySpace = ['rxdb', databaseName, collectionName, schema.version].join('|'),\n public readonly kvOptions = { consistency: settings.consistencyLevel }\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.kvPromise = getDenoGlobal().openKv(settings.openKvPath).then(async (kv: any) => {\n // insert writeBlockKey\n await kv.set([this.keySpace], 1);\n return kv;\n });\n }\n\n /**\n * DenoKV has no transactions\n * so we have to ensure that there is no write in between our queries\n * which would confuse RxDB and return wrong query results.\n */\n async retryUntilNoWriteInBetween(\n fn: () => Promise\n ): Promise {\n const kv = await this.kvPromise;\n while (true) {\n const writeBlockKeyBefore = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueBefore = writeBlockKeyBefore ? writeBlockKeyBefore.value : -1;\n const result = await fn();\n const writeBlockKeyAfter = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueAfter = writeBlockKeyAfter ? writeBlockKeyAfter.value : -1;\n\n if (writeBlockValueBefore === writeBlockValueAfter) {\n return result;\n }\n }\n }\n\n async bulkWrite(documentWrites: BulkWriteRow[], context: string): Promise> {\n const kv = await this.kvPromise;\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const batches = batchArray(documentWrites, ensureNotFalsy(this.settings.batchSize));\n\n /**\n * DenoKV does not have transactions\n * so we use a special writeBlock row to ensure\n * atomic writes (per document)\n * and so that we can do bulkWrites\n */\n for (const writeBatch of batches) {\n while (true) {\n const writeBlockKey = await kv.get([this.keySpace], this.kvOptions);\n const docsInDB = new Map>();\n\n /**\n * TODO the max amount for .getMany() is 10 which is defined by deno itself.\n * How can this be increased?\n */\n const readManyBatches = batchArray(writeBatch, 10);\n await Promise.all(\n readManyBatches.map(async (readManyBatch) => {\n const docsResult = await kv.getMany(\n readManyBatch.map(writeRow => {\n const docId: string = writeRow.document[primaryPath] as any;\n return [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n })\n );\n docsResult.map((row: any) => {\n const docData = row.value;\n if (!docData) {\n return;\n }\n const docId: string = docData[primaryPath] as any;\n docsInDB.set(docId, docData);\n });\n })\n );\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n\n let tx = kv.atomic();\n tx = tx.set([this.keySpace], ensureNotFalsy(writeBlockKey.value) + 1);\n tx = tx.check(writeBlockKey);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n tx = tx.set([this.keySpace, indexMeta.indexId, indexString], docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n tx = tx.delete([this.keySpace, indexMeta.indexId, oldIndexString]);\n tx = tx.set([this.keySpace, indexMeta.indexId, newIndexString], docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n const txResult = await tx.commit();\n if (txResult.ok) {\n appendToArray(ret.error, categorized.errors);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n break;\n }\n }\n }\n return ret;\n }\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const kv = await this.kvPromise;\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const kvKey = [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n const findSingleResult = await kv.get(kvKey, this.kvOptions);\n const docInDb = findSingleResult.value;\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return this.retryUntilNoWriteInBetween(\n () => queryDenoKV(this, preparedQuery)\n );\n }\n async count(preparedQuery: PreparedQuery): Promise {\n /**\n * At this point in time (end 2023), DenoKV does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/denoland/deno/issues/18965\n */\n const result = await this.retryUntilNoWriteInBetween(\n () => this.query(preparedQuery)\n );\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n throw new Error(\"Method not implemented.\");\n }\n changeStream() {\n return this.changes$.asObservable();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const maxDeletionTime = now() - minimumDeletedTime;\n const kv = await this.kvPromise;\n const index = CLEANUP_INDEX;\n const indexName = getDenoKVIndexName(index);\n const indexMeta = this.internals.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n\n const range = kv.list({\n start: [this.keySpace, indexMeta.indexId, lowerBoundString],\n end: [this.keySpace, indexMeta.indexId, upperBoundString]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize,\n limit: this.settings.batchSize\n });\n\n let rangeCount = 0;\n for await (const row of range) {\n rangeCount = rangeCount + 1;\n const docId = row.value;\n const docDataResult = await kv.get([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], this.kvOptions);\n if (!docDataResult.value) {\n continue;\n }\n const docData = ensureNotFalsy(docDataResult.value);\n if (\n !docData._deleted ||\n docData._meta.lwt > maxDeletionTime\n ) {\n continue;\n }\n\n\n let tx = kv.atomic();\n tx = tx.check(docDataResult);\n tx = tx.delete([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId]);\n Object\n .values(this.internals.indexes)\n .forEach(indexMetaInner => {\n tx = tx.delete([this.keySpace, indexMetaInner.indexId, docId]);\n });\n await tx.commit();\n }\n return noMoreUndeleted;\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const kv = await this.kvPromise;\n await kv.close();\n })();\n return this.closed;\n }\n async remove(): Promise {\n ensureNotClosed(this);\n const kv = await this.kvPromise;\n const range = kv.list({\n start: [this.keySpace],\n end: [this.keySpace, INDEX_MAX]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize\n });\n let promises: Promise[] = [];\n for await (const row of range) {\n promises.push(kv.delete(row.key));\n }\n\n await Promise.all(promises);\n return this.close();\n }\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\n\n\nexport async function createDenoKVStorageInstance(\n storage: RxStorageDenoKV,\n params: RxStorageInstanceCreationParams,\n settings: DenoKVSettings\n): Promise> {\n settings = flatClone(settings);\n if (!settings.batchSize) {\n settings.batchSize = 100;\n }\n\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const indexDBs: { [indexName: string]: DenoKVIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach((indexAr, indexId) => {\n const indexName = getDenoKVIndexName(indexAr);\n indexDBs[indexName] = {\n indexId: '|' + indexId + '|',\n indexName,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n const internals = {\n indexes: indexDBs\n };\n const instance = new RxStorageInstanceDenoKV(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DENOKV,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDenoKV\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDenoKV is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-dexie/rx-storage-dexie.js.map b/dist/cjs/plugins/storage-dexie/rx-storage-dexie.js.map index 280d2924ee7..cc233d17de5 100644 --- a/dist/cjs/plugins/storage-dexie/rx-storage-dexie.js.map +++ b/dist/cjs/plugins/storage-dexie/rx-storage-dexie.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-dexie.js","names":["_dexieHelper","require","_rxStorageInstanceDexie","_rxStorageHelper","_utilsRxdbVersion","RxStorageDexie","exports","settings","name","RX_STORAGE_NAME_DEXIE","rxdbVersion","RXDB_VERSION","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createDexieStorageInstance","getRxStorageDexie","storage"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-dexie.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport {\n createDexieStorageInstance,\n RxStorageInstanceDexie\n} from './rx-storage-instance-dexie.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDexie implements RxStorage {\n public name = RX_STORAGE_NAME_DEXIE;\n public readonly rxdbVersion = RXDB_VERSION;\n constructor(\n public settings: DexieSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDexieStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDexie(\n settings: DexieSettings = {}\n): RxStorageDexie {\n const storage = new RxStorageDexie(settings);\n return storage;\n}\n"],"mappings":";;;;;;;AAIA,IAAAA,YAAA,GAAAC,OAAA;AAOA,IAAAC,uBAAA,GAAAD,OAAA;AAIA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAIjDI,cAAc,GAAAC,OAAA,CAAAD,cAAA;EAGvB,SAAAA,eACWE,QAAuB,EAChC;IAAA,KAJKC,IAAI,GAAGC,kCAAqB;IAAA,KACnBC,WAAW,GAAGC,8BAAY;IAAA,KAE/BJ,QAAuB,GAAvBA,QAAuB;EAC9B;EAAC,IAAAK,MAAA,GAAAP,cAAA,CAAAQ,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAiE,EACvB;IAC1C,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,kDAA0B,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACR,QAAQ,CAAC;EAClE,CAAC;EAAA,OAAAF,cAAA;AAAA;AAIE,SAASa,iBAAiBA,CAC7BX,QAAuB,GAAG,CAAC,CAAC,EACd;EACd,IAAMY,OAAO,GAAG,IAAId,cAAc,CAACE,QAAQ,CAAC;EAC5C,OAAOY,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-dexie.js","names":["_dexieHelper","require","_rxStorageInstanceDexie","_rxStorageHelper","_utilsRxdbVersion","RxStorageDexie","exports","settings","name","RX_STORAGE_NAME_DEXIE","rxdbVersion","RXDB_VERSION","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createDexieStorageInstance","getRxStorageDexie","storage"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-dexie.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport {\n createDexieStorageInstance,\n RxStorageInstanceDexie\n} from './rx-storage-instance-dexie.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDexie implements RxStorage {\n public name = RX_STORAGE_NAME_DEXIE;\n public readonly rxdbVersion = RXDB_VERSION;\n constructor(\n public settings: DexieSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDexieStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDexie(\n settings: DexieSettings = {}\n): RxStorageDexie {\n const storage = new RxStorageDexie(settings);\n return storage;\n}\n"],"mappings":";;;;;;;AAIA,IAAAA,YAAA,GAAAC,OAAA;AAOA,IAAAC,uBAAA,GAAAD,OAAA;AAIA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAIjDI,cAAc,GAAAC,OAAA,CAAAD,cAAA;EAGvB,SAAAA,eACWE,QAAuB,EAChC;IAAA,KAJKC,IAAI,GAAGC,kCAAqB;IAAA,KACnBC,WAAW,GAAGC,8BAAY;IAAA,KAE/BJ,QAAuB,GAAvBA,QAAuB;EAC9B;EAAC,IAAAK,MAAA,GAAAP,cAAA,CAAAQ,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAiE,EACvB;IAC1C,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,kDAA0B,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACR,QAAQ,CAAC;EAClE,CAAC;EAAA,OAAAF,cAAA;AAAA;AAIE,SAASa,iBAAiBA,CAC7BX,QAAuB,GAAG,CAAC,CAAC,EACd;EACd,IAAMY,OAAO,GAAG,IAAId,cAAc,CAACE,QAAQ,CAAC;EAC5C,OAAOY,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map b/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map index c40189e267f..466cf0601d8 100644 --- a/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map +++ b/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-dexie.js","names":["_rxjs","require","_index","_dexieHelper","_dexieQuery","_rxSchemaHelper","_rxStorageHelper","_rxStorageMultiinstance","_rxError","instanceId","now","DEXIE_TEST_META_FIELD","exports","shownNonPremiumLog","RxStorageInstanceDexie","storage","databaseName","collectionName","schema","internals","options","settings","devMode","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensureNotClosed","RXDB_UTILS_GLOBAL","premium","defaultHashSha256","PREMIUM_FLAG_HASH","console","warn","join","forEach","row","document","_rev","previous","newRxError","args","_meta","dir","Error","state","ret","success","error","map","doc","flatCloneDocWithMeta","documentKeys","writeRow","categorized","dexieDb","transaction","dexieTable","dexieAttachmentsTable","docsInDbMap","Map","docsInDbWithInternals","getDocsInDb","docWithDexieInternals","set","categorizeBulkWriteRows","errors","bulkPutDocs","bulkInsertDocs","push","bulkUpdateDocs","d","fromStorageToDexie","booleanIndexes","length","bulkPut","putAttachments","attachmentsAdd","attachment","id","attachmentObjectId","documentId","attachmentId","data","attachmentData","attachmentsUpdate","bulkDelete","attachmentsRemove","ensureNotFalsy","eventBulk","events","lastState","newestRow","checkpoint","lwt","endTime","next","findDocumentsById","ids","deleted","docsInDb","documentInDb","_deleted","query","preparedQuery","dexieQuery","count","queryPlan","selectorSatisfiedByIndex","result","dexieCount","mode","documents","changeStream","asObservable","cleanup","minimumDeletedTime","maxDeletionTime","toRemove","where","below","toArray","removeIds","getAttachmentData","_digest","get","remove","clear","close","closed","complete","closeDexieDb","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createDexieStorageInstance","params","getDexieDbWithTables","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_DEXIE","Promise","resolve"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-instance-dexie.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n now,\n ensureNotFalsy,\n defaultHashSha256,\n RXDB_UTILS_GLOBAL,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n CategorizeBulkWriteRowsOutput,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport { RxStorageDexie } from './rx-storage-dexie.ts';\nimport {\n attachmentObjectId,\n closeDexieDb,\n fromStorageToDexie,\n getDexieDbWithTables,\n getDocsInDb,\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport { dexieCount, dexieQuery } from './dexie-query.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows, flatCloneDocWithMeta } from '../../rx-storage-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport { newRxError } from '../../rx-error.ts';\n\nlet instanceId = now();\nexport const DEXIE_TEST_META_FIELD = 'dexieTestMetaField';\n\nlet shownNonPremiumLog = false;\n\n\nexport class RxStorageInstanceDexie implements RxStorageInstance<\n RxDocType,\n DexieStorageInternals,\n DexieSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n public closed?: Promise;\n\n constructor(\n public readonly storage: RxStorageDexie,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DexieStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DexieSettings,\n public readonly devMode: boolean\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n ensureNotClosed(this);\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=dexie ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n\n /**\n * Check some assumptions to ensure RxDB\n * does not call the storage with an invalid write.\n */\n documentWrites.forEach(row => {\n // ensure revision is set\n if (\n !row.document._rev ||\n (\n row.previous &&\n !row.previous._rev\n )\n ) {\n throw newRxError('SNH', { args: { row } });\n }\n\n // ensure prev-data is set\n if (this.devMode) {\n if (\n row.previous &&\n (\n !row.previous._meta[DEXIE_TEST_META_FIELD] ||\n row.previous._meta[DEXIE_TEST_META_FIELD] !== row.previous._rev\n )\n ) {\n console.dir(row);\n throw new Error('missing or wrong _meta.' + DEXIE_TEST_META_FIELD);\n }\n }\n });\n\n const state = await this.internals;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Some storages might add any _meta fields\n * internally. To ensure RxDB can work with that in the\n * test suite, we add a random field here.\n * To ensure \n */\n if (this.devMode) {\n documentWrites = documentWrites.map(row => {\n const doc = flatCloneDocWithMeta(row.document);\n doc._meta[DEXIE_TEST_META_FIELD] = doc._rev;\n return {\n previous: row.previous,\n document: doc\n }\n })\n }\n\n\n const documentKeys: string[] = documentWrites.map(writeRow => writeRow.document[this.primaryPath] as any);\n let categorized: CategorizeBulkWriteRowsOutput | undefined;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n state.dexieAttachmentsTable,\n async () => {\n const docsInDbMap = new Map>();\n const docsInDbWithInternals = await getDocsInDb(this.internals, documentKeys);\n docsInDbWithInternals.forEach(docWithDexieInternals => {\n const doc = docWithDexieInternals;\n if (doc) {\n docsInDbMap.set((doc as any)[this.primaryPath], doc as any);\n }\n return doc;\n });\n\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDbMap,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n /**\n * Batch up the database operations\n * so we can later run them in bulk.\n */\n let bulkPutDocs: any[] = [];\n categorized.bulkInsertDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n categorized.bulkUpdateDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n bulkPutDocs = bulkPutDocs.map(d => fromStorageToDexie(state.booleanIndexes, d));\n if (bulkPutDocs.length > 0) {\n await state.dexieTable.bulkPut(bulkPutDocs);\n }\n\n // handle attachments\n const putAttachments: { id: string, data: string }[] = [];\n categorized.attachmentsAdd.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n await state.dexieAttachmentsTable.bulkPut(putAttachments);\n await state.dexieAttachmentsTable.bulkDelete(\n categorized.attachmentsRemove.map(attachment => attachmentObjectId(attachment.documentId, attachment.attachmentId))\n );\n\n });\n\n categorized = ensureNotFalsy(categorized);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n\n async findDocumentsById(\n ids: string[],\n deleted: boolean\n ): Promise[]> {\n ensureNotClosed(this);\n const state = await this.internals;\n const ret: RxDocumentData[] = [];\n\n await state.dexieDb.transaction(\n 'r',\n state.dexieTable,\n async () => {\n const docsInDb = await getDocsInDb(this.internals, ids);\n docsInDb.forEach(documentInDb => {\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(documentInDb);\n }\n });\n });\n return ret;\n }\n\n query(preparedQuery: PreparedQuery): Promise> {\n ensureNotClosed(this);\n return dexieQuery(\n this,\n preparedQuery\n );\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n if (preparedQuery.queryPlan.selectorSatisfiedByIndex) {\n const result = await dexieCount(this, preparedQuery);\n return {\n count: result,\n mode: 'fast'\n };\n } else {\n const result = await dexieQuery(this, preparedQuery);\n return {\n count: result.documents.length,\n mode: 'slow'\n };\n }\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotClosed(this);\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n async () => {\n const maxDeletionTime = now() - minimumDeletedTime;\n /**\n * TODO only fetch _deleted=true\n */\n const toRemove = await state.dexieTable\n .where('_meta.lwt')\n .below(maxDeletionTime)\n .toArray();\n const removeIds: string[] = [];\n toRemove.forEach(doc => {\n if (doc._deleted === '1') {\n removeIds.push(doc[this.primaryPath]);\n }\n });\n await state.dexieTable.bulkDelete(removeIds);\n }\n );\n\n /**\n * TODO instead of deleting all deleted docs at once,\n * only clean up some of them and return false if there are more documents to clean up.\n * This ensures that when many documents have to be purged,\n * we do not block the more important tasks too long.\n */\n return true;\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n const id = attachmentObjectId(documentId, attachmentId);\n return await state.dexieDb.transaction(\n 'r',\n state.dexieAttachmentsTable,\n async () => {\n\n const attachment = await state.dexieAttachmentsTable.get(id);\n if (attachment) {\n return attachment.data;\n } else {\n throw new Error('attachment missing documentId: ' + documentId + ' attachmentId: ' + attachmentId);\n }\n });\n }\n\n async remove(): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieTable.clear()\n return this.close();\n }\n\n\n close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n await closeDexieDb(this.internals);\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\n\nexport async function createDexieStorageInstance(\n storage: RxStorageDexie,\n params: RxStorageInstanceCreationParams,\n settings: DexieSettings\n): Promise> {\n const internals = getDexieDbWithTables(\n params.databaseName,\n params.collectionName,\n settings,\n params.schema\n );\n\n const instance = new RxStorageInstanceDexie(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DEXIE,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDexie\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDexie is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-dexie.js","names":["_rxjs","require","_index","_dexieHelper","_dexieQuery","_rxSchemaHelper","_rxStorageHelper","_rxStorageMultiinstance","_rxError","instanceId","now","DEXIE_TEST_META_FIELD","exports","shownNonPremiumLog","RxStorageInstanceDexie","storage","databaseName","collectionName","schema","internals","options","settings","devMode","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensureNotClosed","RXDB_UTILS_GLOBAL","premium","defaultHashSha256","PREMIUM_FLAG_HASH","console","warn","join","forEach","row","document","_rev","previous","newRxError","args","_meta","dir","Error","state","ret","success","error","map","doc","flatCloneDocWithMeta","documentKeys","writeRow","categorized","dexieDb","transaction","dexieTable","dexieAttachmentsTable","docsInDbMap","Map","docsInDbWithInternals","getDocsInDb","docWithDexieInternals","set","categorizeBulkWriteRows","errors","bulkPutDocs","bulkInsertDocs","push","bulkUpdateDocs","d","fromStorageToDexie","booleanIndexes","length","bulkPut","putAttachments","attachmentsAdd","attachment","id","attachmentObjectId","documentId","attachmentId","data","attachmentData","attachmentsUpdate","bulkDelete","attachmentsRemove","ensureNotFalsy","eventBulk","events","lastState","newestRow","checkpoint","lwt","endTime","next","findDocumentsById","ids","deleted","docsInDb","documentInDb","_deleted","query","preparedQuery","dexieQuery","count","queryPlan","selectorSatisfiedByIndex","result","dexieCount","mode","documents","changeStream","asObservable","cleanup","minimumDeletedTime","maxDeletionTime","toRemove","where","below","toArray","removeIds","getAttachmentData","_digest","get","remove","clear","close","closed","complete","closeDexieDb","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createDexieStorageInstance","params","getDexieDbWithTables","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_DEXIE","Promise","resolve"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-instance-dexie.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n now,\n ensureNotFalsy,\n defaultHashSha256,\n RXDB_UTILS_GLOBAL,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n CategorizeBulkWriteRowsOutput,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport { RxStorageDexie } from './rx-storage-dexie.ts';\nimport {\n attachmentObjectId,\n closeDexieDb,\n fromStorageToDexie,\n getDexieDbWithTables,\n getDocsInDb,\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport { dexieCount, dexieQuery } from './dexie-query.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows, flatCloneDocWithMeta } from '../../rx-storage-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport { newRxError } from '../../rx-error.ts';\n\nlet instanceId = now();\nexport const DEXIE_TEST_META_FIELD = 'dexieTestMetaField';\n\nlet shownNonPremiumLog = false;\n\n\nexport class RxStorageInstanceDexie implements RxStorageInstance<\n RxDocType,\n DexieStorageInternals,\n DexieSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n public closed?: Promise;\n\n constructor(\n public readonly storage: RxStorageDexie,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DexieStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DexieSettings,\n public readonly devMode: boolean\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n ensureNotClosed(this);\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=dexie ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n\n /**\n * Check some assumptions to ensure RxDB\n * does not call the storage with an invalid write.\n */\n documentWrites.forEach(row => {\n // ensure revision is set\n if (\n !row.document._rev ||\n (\n row.previous &&\n !row.previous._rev\n )\n ) {\n throw newRxError('SNH', { args: { row } });\n }\n\n // ensure prev-data is set\n if (this.devMode) {\n if (\n row.previous &&\n (\n !row.previous._meta[DEXIE_TEST_META_FIELD] ||\n row.previous._meta[DEXIE_TEST_META_FIELD] !== row.previous._rev\n )\n ) {\n console.dir(row);\n throw new Error('missing or wrong _meta.' + DEXIE_TEST_META_FIELD);\n }\n }\n });\n\n const state = await this.internals;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Some storages might add any _meta fields\n * internally. To ensure RxDB can work with that in the\n * test suite, we add a random field here.\n * To ensure \n */\n if (this.devMode) {\n documentWrites = documentWrites.map(row => {\n const doc = flatCloneDocWithMeta(row.document);\n doc._meta[DEXIE_TEST_META_FIELD] = doc._rev;\n return {\n previous: row.previous,\n document: doc\n }\n })\n }\n\n\n const documentKeys: string[] = documentWrites.map(writeRow => writeRow.document[this.primaryPath] as any);\n let categorized: CategorizeBulkWriteRowsOutput | undefined;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n state.dexieAttachmentsTable,\n async () => {\n const docsInDbMap = new Map>();\n const docsInDbWithInternals = await getDocsInDb(this.internals, documentKeys);\n docsInDbWithInternals.forEach(docWithDexieInternals => {\n const doc = docWithDexieInternals;\n if (doc) {\n docsInDbMap.set((doc as any)[this.primaryPath], doc as any);\n }\n return doc;\n });\n\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDbMap,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n /**\n * Batch up the database operations\n * so we can later run them in bulk.\n */\n let bulkPutDocs: any[] = [];\n categorized.bulkInsertDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n categorized.bulkUpdateDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n bulkPutDocs = bulkPutDocs.map(d => fromStorageToDexie(state.booleanIndexes, d));\n if (bulkPutDocs.length > 0) {\n await state.dexieTable.bulkPut(bulkPutDocs);\n }\n\n // handle attachments\n const putAttachments: { id: string, data: string }[] = [];\n categorized.attachmentsAdd.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n await state.dexieAttachmentsTable.bulkPut(putAttachments);\n await state.dexieAttachmentsTable.bulkDelete(\n categorized.attachmentsRemove.map(attachment => attachmentObjectId(attachment.documentId, attachment.attachmentId))\n );\n\n });\n\n categorized = ensureNotFalsy(categorized);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n\n async findDocumentsById(\n ids: string[],\n deleted: boolean\n ): Promise[]> {\n ensureNotClosed(this);\n const state = await this.internals;\n const ret: RxDocumentData[] = [];\n\n await state.dexieDb.transaction(\n 'r',\n state.dexieTable,\n async () => {\n const docsInDb = await getDocsInDb(this.internals, ids);\n docsInDb.forEach(documentInDb => {\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(documentInDb);\n }\n });\n });\n return ret;\n }\n\n query(preparedQuery: PreparedQuery): Promise> {\n ensureNotClosed(this);\n return dexieQuery(\n this,\n preparedQuery\n );\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n if (preparedQuery.queryPlan.selectorSatisfiedByIndex) {\n const result = await dexieCount(this, preparedQuery);\n return {\n count: result,\n mode: 'fast'\n };\n } else {\n const result = await dexieQuery(this, preparedQuery);\n return {\n count: result.documents.length,\n mode: 'slow'\n };\n }\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotClosed(this);\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n async () => {\n const maxDeletionTime = now() - minimumDeletedTime;\n /**\n * TODO only fetch _deleted=true\n */\n const toRemove = await state.dexieTable\n .where('_meta.lwt')\n .below(maxDeletionTime)\n .toArray();\n const removeIds: string[] = [];\n toRemove.forEach(doc => {\n if (doc._deleted === '1') {\n removeIds.push(doc[this.primaryPath]);\n }\n });\n await state.dexieTable.bulkDelete(removeIds);\n }\n );\n\n /**\n * TODO instead of deleting all deleted docs at once,\n * only clean up some of them and return false if there are more documents to clean up.\n * This ensures that when many documents have to be purged,\n * we do not block the more important tasks too long.\n */\n return true;\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n const id = attachmentObjectId(documentId, attachmentId);\n return await state.dexieDb.transaction(\n 'r',\n state.dexieAttachmentsTable,\n async () => {\n\n const attachment = await state.dexieAttachmentsTable.get(id);\n if (attachment) {\n return attachment.data;\n } else {\n throw new Error('attachment missing documentId: ' + documentId + ' attachmentId: ' + attachmentId);\n }\n });\n }\n\n async remove(): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieTable.clear()\n return this.close();\n }\n\n\n close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n await closeDexieDb(this.internals);\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\n\nexport async function createDexieStorageInstance(\n storage: RxStorageDexie,\n params: RxStorageInstanceCreationParams,\n settings: DexieSettings\n): Promise> {\n const internals = getDexieDbWithTables(\n params.databaseName,\n params.collectionName,\n settings,\n params.schema\n );\n\n const instance = new RxStorageInstanceDexie(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DEXIE,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDexie\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDexie is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map b/dist/cjs/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map index 37835187e4d..cd800ca3235 100644 --- a/dist/cjs/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map +++ b/dist/cjs/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-foundationdb.js","names":["_rxjs","require","_rxSchemaHelper","_rxStorageHelper","_foundationdbHelpers","_customIndex","_index","_foundationdbQuery","_queryPlanner","_index2","RxStorageInstanceFoundationDB","exports","storage","databaseName","collectionName","schema","internals","options","settings","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","dbs","dbsPromise","ret","success","error","writeBatches","batchArray","FOUNDATION_DB_WRITE_BATCH_SIZE","Promise","all","map","writeBatch","categorized","root","doTransaction","tx","ids","row","document","mainTx","at","main","subspace","attachmentTx","attachments","docsInDB","Map","id","doc","get","set","categorizeBulkWriteRows","appendToArray","errors","bulkInsertDocs","forEach","writeRow","docId","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexTx","db","bulkUpdateDocs","oldIndexString","ensureNotFalsy","previous","newIndexString","delete","attachmentsAdd","attachment","attachmentMapKey","documentId","attachmentId","attachmentData","attachmentsUpdate","attachmentsRemove","eventBulk","events","length","lastState","newestRow","checkpoint","lwt","_meta","endTime","now","next","findDocumentsById","withDeleted","docInDb","_deleted","query","preparedQuery","queryFoundationDB","count","result","documents","mode","getAttachmentData","_digest","data","changeStream","asObservable","remove","clearRange","INDEX_MAX","PROMISE_RESOLVE_VOID","close","cleanup","minimumDeletedTime","keySelector","StreamingMode","maxDeletionTime","index","CLEANUP_INDEX","indexName","getFoundationDBIndexName","lowerBoundString","getStartIndexStringFromLowerBound","upperBoundString","getStartIndexStringFromUpperBound","noMoreUndeleted","batchSize","range","getRangeAll","firstGreaterThan","limit","streamingMode","Exact","pop","docIds","docsData","indexMetaInner","subIndexDB","docData","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","closed","complete","createFoundationDBStorageInstance","params","open","directory","encoders","connection","clusterFile","dir","createOrOpen","version","withKeyEncoding","string","withValueEncoding","json","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","toArray","indexDB","getIndexableStringMonad","instance","resolve"],"sources":["../../../../src/plugins/storage-foundationdb/rx-storage-instance-foundationdb.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n RxAttachmentWriteData,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport type {\n FoundationDBDatabase,\n FoundationDBIndexMeta,\n FoundationDBStorageInternals,\n RxStorageFoundationDB,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageFoundationDBSettings\n} from './foundationdb-types.ts';\n// import {\n// open as foundationDBOpen,\n// directory as foundationDBDirectory,\n// encoders as foundationDBEncoders,\n// keySelector as foundationDBKeySelector,\n// StreamingMode as foundationDBStreamingMode\n// } from 'foundationdb';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport {\n\n CLEANUP_INDEX,\n FOUNDATION_DB_WRITE_BATCH_SIZE,\n getFoundationDBIndexName\n} from './foundationdb-helpers.ts';\nimport {\n getIndexableStringMonad,\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport {\n appendToArray,\n batchArray,\n ensureNotFalsy,\n lastOfArray,\n now,\n PROMISE_RESOLVE_VOID,\n toArray\n} from '../../plugins/utils/index.ts';\nimport { queryFoundationDB } from './foundationdb-query.ts';\nimport { INDEX_MAX } from '../../query-planner.ts';\nimport { attachmentMapKey } from '../storage-memory/index.ts';\n\nexport class RxStorageInstanceFoundationDB implements RxStorageInstance<\n RxDocType,\n FoundationDBStorageInternals,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n\n public closed?: Promise;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n\n constructor(\n public readonly storage: RxStorageFoundationDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: FoundationDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageFoundationDBSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n const dbs = await this.internals.dbsPromise;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Doing too many write in a single transaction\n * will throw with a 'Transaction exceeds byte limit'\n * so we have to batch up the writes.\n */\n const writeBatches = batchArray(documentWrites, FOUNDATION_DB_WRITE_BATCH_SIZE);\n await Promise.all(\n writeBatches.map(async (writeBatch) => {\n let categorized: CategorizeBulkWriteRowsOutput | undefined = null as any;\n await dbs.root.doTransaction(async (tx: any) => {\n const ids = writeBatch.map(row => (row.document as any)[this.primaryPath]);\n const mainTx = tx.at(dbs.main.subspace);\n const attachmentTx = tx.at(dbs.attachments.subspace);\n const docsInDB = new Map>();\n /**\n * TODO this might be faster if fdb\n * any time adds a bulk-fetch-by-key method.\n */\n await Promise.all(\n ids.map(async (id) => {\n const doc = await mainTx.get(id);\n docsInDB.set(id, doc);\n })\n );\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n appendToArray(ret.error, categorized.errors);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n mainTx.set(docId, writeRow.document);\n\n // insert secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.set(indexString, docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // overwrite document data\n mainTx.set(docId, writeRow.document);\n\n // update secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.delete(oldIndexString);\n indexTx.set(newIndexString, docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n // attachments\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentTx.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n });\n categorized = ensureNotFalsy(categorized);\n /**\n * The events must be emitted AFTER the transaction\n * has finished.\n * Otherwise an observable changestream might cause a read\n * to a document that does not already exist outside of the transaction.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n })\n );\n\n\n return ret;\n }\n\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const dbs = await this.internals.dbsPromise;\n return dbs.main.doTransaction(async (tx: any) => {\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const docInDb = await tx.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n });\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return queryFoundationDB(this, preparedQuery);\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n /**\n * At this point in time (end 2022), FoundationDB does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/apple/foundationdb/issues/5981\n */\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n const dbs = await this.internals.dbsPromise;\n const attachment = await dbs.attachments.get(attachmentMapKey(documentId, attachmentId));\n return attachment.data;\n }\n changeStream(): Observable, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async remove(): Promise {\n const dbs = await this.internals.dbsPromise;\n await dbs.root.doTransaction((tx: any) => {\n tx.clearRange('', INDEX_MAX);\n return PROMISE_RESOLVE_VOID;\n });\n return this.close();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const {\n keySelector,\n StreamingMode\n } = require('foundationdb');\n const maxDeletionTime = now() - minimumDeletedTime;\n const dbs = await this.internals.dbsPromise;\n const index = CLEANUP_INDEX;\n const indexName = getFoundationDBIndexName(index);\n const indexMeta = dbs.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n await dbs.root.doTransaction(async (tx: any) => {\n const batchSize = ensureNotFalsy(this.settings.batchSize);\n const indexTx = tx.at(indexMeta.db.subspace);\n const mainTx = tx.at(dbs.main.subspace);\n const range = await indexTx.getRangeAll(\n keySelector.firstGreaterThan(lowerBoundString),\n upperBoundString,\n {\n limit: batchSize + 1, // get one more extra to detect what to return from cleanup()\n streamingMode: StreamingMode.Exact\n }\n );\n if (range.length > batchSize) {\n noMoreUndeleted = false;\n range.pop();\n }\n const docIds = range.map((row: string[]) => row[1]);\n const docsData: RxDocumentData[] = await Promise.all(docIds.map((docId: string) => mainTx.get(docId)));\n\n Object\n .values(dbs.indexes)\n .forEach(indexMetaInner => {\n const subIndexDB = tx.at(indexMetaInner.db.subspace);\n docsData.forEach(docData => {\n const indexString = indexMetaInner.getIndexableString(docData);\n subIndexDB.delete(indexString);\n });\n });\n docIds.forEach((id: string) => mainTx.delete(id));\n });\n\n return noMoreUndeleted;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n\n async close() {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const dbs = await this.internals.dbsPromise;\n await dbs.root.close();\n\n // TODO shouldn't we close the index databases?\n // Object.values(dbs.indexes).forEach(db => db.close());\n })();\n return this.closed;\n }\n}\n\n\nexport function createFoundationDBStorageInstance(\n storage: RxStorageFoundationDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageFoundationDBSettings\n): Promise> {\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const {\n open,\n directory,\n encoders\n } = require('foundationdb');\n\n const connection = open(settings.clusterFile);\n const dbsPromise = (async () => {\n const dir = await directory.createOrOpen(connection, 'rxdb');\n\n const root = connection\n .at(dir)\n .at(params.databaseName + '.')\n .at(params.collectionName + '.')\n .at(params.schema.version + '.');\n const main: FoundationDBDatabase = root\n .at('main.')\n .withKeyEncoding(encoders.string) // automatically encode & decode keys using tuples\n .withValueEncoding(encoders.json) as any; // and values using JSON\n\n\n const events: FoundationDBDatabase>, RxStorageDefaultCheckpoint>> = root\n .at('events.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n const attachments: FoundationDBDatabase = root\n .at('attachments.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n\n const indexDBs: { [indexName: string]: FoundationDBIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n // used for `getChangedDocumentsSince()`\n useIndexesFinal.push([\n '_meta.lwt',\n primaryPath\n ]);\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach(indexAr => {\n const indexName = getFoundationDBIndexName(indexAr);\n const indexDB = root.at(indexName + '.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.string);\n indexDBs[indexName] = {\n indexName,\n db: indexDB,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n return {\n root,\n main,\n events,\n attachments,\n indexes: indexDBs\n };\n })();\n\n\n const internals: FoundationDBStorageInternals = {\n connection,\n dbsPromise: dbsPromise\n };\n\n const instance = new RxStorageInstanceFoundationDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-foundationdb.js","names":["_rxjs","require","_rxSchemaHelper","_rxStorageHelper","_foundationdbHelpers","_customIndex","_index","_foundationdbQuery","_queryPlanner","_index2","RxStorageInstanceFoundationDB","exports","storage","databaseName","collectionName","schema","internals","options","settings","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","dbs","dbsPromise","ret","success","error","writeBatches","batchArray","FOUNDATION_DB_WRITE_BATCH_SIZE","Promise","all","map","writeBatch","categorized","root","doTransaction","tx","ids","row","document","mainTx","at","main","subspace","attachmentTx","attachments","docsInDB","Map","id","doc","get","set","categorizeBulkWriteRows","appendToArray","errors","bulkInsertDocs","forEach","writeRow","docId","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexTx","db","bulkUpdateDocs","oldIndexString","ensureNotFalsy","previous","newIndexString","delete","attachmentsAdd","attachment","attachmentMapKey","documentId","attachmentId","attachmentData","attachmentsUpdate","attachmentsRemove","eventBulk","events","length","lastState","newestRow","checkpoint","lwt","_meta","endTime","now","next","findDocumentsById","withDeleted","docInDb","_deleted","query","preparedQuery","queryFoundationDB","count","result","documents","mode","getAttachmentData","_digest","data","changeStream","asObservable","remove","clearRange","INDEX_MAX","PROMISE_RESOLVE_VOID","close","cleanup","minimumDeletedTime","keySelector","StreamingMode","maxDeletionTime","index","CLEANUP_INDEX","indexName","getFoundationDBIndexName","lowerBoundString","getStartIndexStringFromLowerBound","upperBoundString","getStartIndexStringFromUpperBound","noMoreUndeleted","batchSize","range","getRangeAll","firstGreaterThan","limit","streamingMode","Exact","pop","docIds","docsData","indexMetaInner","subIndexDB","docData","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","closed","complete","createFoundationDBStorageInstance","params","open","directory","encoders","connection","clusterFile","dir","createOrOpen","version","withKeyEncoding","string","withValueEncoding","json","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","toArray","indexDB","getIndexableStringMonad","instance","resolve"],"sources":["../../../../src/plugins/storage-foundationdb/rx-storage-instance-foundationdb.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n RxAttachmentWriteData,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport type {\n FoundationDBDatabase,\n FoundationDBIndexMeta,\n FoundationDBStorageInternals,\n RxStorageFoundationDB,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageFoundationDBSettings\n} from './foundationdb-types.ts';\n// import {\n// open as foundationDBOpen,\n// directory as foundationDBDirectory,\n// encoders as foundationDBEncoders,\n// keySelector as foundationDBKeySelector,\n// StreamingMode as foundationDBStreamingMode\n// } from 'foundationdb';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport {\n\n CLEANUP_INDEX,\n FOUNDATION_DB_WRITE_BATCH_SIZE,\n getFoundationDBIndexName\n} from './foundationdb-helpers.ts';\nimport {\n getIndexableStringMonad,\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport {\n appendToArray,\n batchArray,\n ensureNotFalsy,\n lastOfArray,\n now,\n PROMISE_RESOLVE_VOID,\n toArray\n} from '../../plugins/utils/index.ts';\nimport { queryFoundationDB } from './foundationdb-query.ts';\nimport { INDEX_MAX } from '../../query-planner.ts';\nimport { attachmentMapKey } from '../storage-memory/index.ts';\n\nexport class RxStorageInstanceFoundationDB implements RxStorageInstance<\n RxDocType,\n FoundationDBStorageInternals,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n\n public closed?: Promise;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n\n constructor(\n public readonly storage: RxStorageFoundationDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: FoundationDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageFoundationDBSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n const dbs = await this.internals.dbsPromise;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Doing too many write in a single transaction\n * will throw with a 'Transaction exceeds byte limit'\n * so we have to batch up the writes.\n */\n const writeBatches = batchArray(documentWrites, FOUNDATION_DB_WRITE_BATCH_SIZE);\n await Promise.all(\n writeBatches.map(async (writeBatch) => {\n let categorized: CategorizeBulkWriteRowsOutput | undefined = null as any;\n await dbs.root.doTransaction(async (tx: any) => {\n const ids = writeBatch.map(row => (row.document as any)[this.primaryPath]);\n const mainTx = tx.at(dbs.main.subspace);\n const attachmentTx = tx.at(dbs.attachments.subspace);\n const docsInDB = new Map>();\n /**\n * TODO this might be faster if fdb\n * any time adds a bulk-fetch-by-key method.\n */\n await Promise.all(\n ids.map(async (id) => {\n const doc = await mainTx.get(id);\n docsInDB.set(id, doc);\n })\n );\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n appendToArray(ret.error, categorized.errors);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n mainTx.set(docId, writeRow.document);\n\n // insert secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.set(indexString, docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // overwrite document data\n mainTx.set(docId, writeRow.document);\n\n // update secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.delete(oldIndexString);\n indexTx.set(newIndexString, docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n // attachments\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentTx.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n });\n categorized = ensureNotFalsy(categorized);\n /**\n * The events must be emitted AFTER the transaction\n * has finished.\n * Otherwise an observable changestream might cause a read\n * to a document that does not already exist outside of the transaction.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n })\n );\n\n\n return ret;\n }\n\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const dbs = await this.internals.dbsPromise;\n return dbs.main.doTransaction(async (tx: any) => {\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const docInDb = await tx.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n });\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return queryFoundationDB(this, preparedQuery);\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n /**\n * At this point in time (end 2022), FoundationDB does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/apple/foundationdb/issues/5981\n */\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n const dbs = await this.internals.dbsPromise;\n const attachment = await dbs.attachments.get(attachmentMapKey(documentId, attachmentId));\n return attachment.data;\n }\n changeStream(): Observable, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async remove(): Promise {\n const dbs = await this.internals.dbsPromise;\n await dbs.root.doTransaction((tx: any) => {\n tx.clearRange('', INDEX_MAX);\n return PROMISE_RESOLVE_VOID;\n });\n return this.close();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const {\n keySelector,\n StreamingMode\n } = require('foundationdb');\n const maxDeletionTime = now() - minimumDeletedTime;\n const dbs = await this.internals.dbsPromise;\n const index = CLEANUP_INDEX;\n const indexName = getFoundationDBIndexName(index);\n const indexMeta = dbs.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n await dbs.root.doTransaction(async (tx: any) => {\n const batchSize = ensureNotFalsy(this.settings.batchSize);\n const indexTx = tx.at(indexMeta.db.subspace);\n const mainTx = tx.at(dbs.main.subspace);\n const range = await indexTx.getRangeAll(\n keySelector.firstGreaterThan(lowerBoundString),\n upperBoundString,\n {\n limit: batchSize + 1, // get one more extra to detect what to return from cleanup()\n streamingMode: StreamingMode.Exact\n }\n );\n if (range.length > batchSize) {\n noMoreUndeleted = false;\n range.pop();\n }\n const docIds = range.map((row: string[]) => row[1]);\n const docsData: RxDocumentData[] = await Promise.all(docIds.map((docId: string) => mainTx.get(docId)));\n\n Object\n .values(dbs.indexes)\n .forEach(indexMetaInner => {\n const subIndexDB = tx.at(indexMetaInner.db.subspace);\n docsData.forEach(docData => {\n const indexString = indexMetaInner.getIndexableString(docData);\n subIndexDB.delete(indexString);\n });\n });\n docIds.forEach((id: string) => mainTx.delete(id));\n });\n\n return noMoreUndeleted;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n\n async close() {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const dbs = await this.internals.dbsPromise;\n await dbs.root.close();\n\n // TODO shouldn't we close the index databases?\n // Object.values(dbs.indexes).forEach(db => db.close());\n })();\n return this.closed;\n }\n}\n\n\nexport function createFoundationDBStorageInstance(\n storage: RxStorageFoundationDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageFoundationDBSettings\n): Promise> {\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const {\n open,\n directory,\n encoders\n } = require('foundationdb');\n\n const connection = open(settings.clusterFile);\n const dbsPromise = (async () => {\n const dir = await directory.createOrOpen(connection, 'rxdb');\n\n const root = connection\n .at(dir)\n .at(params.databaseName + '.')\n .at(params.collectionName + '.')\n .at(params.schema.version + '.');\n const main: FoundationDBDatabase = root\n .at('main.')\n .withKeyEncoding(encoders.string) // automatically encode & decode keys using tuples\n .withValueEncoding(encoders.json) as any; // and values using JSON\n\n\n const events: FoundationDBDatabase>, RxStorageDefaultCheckpoint>> = root\n .at('events.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n const attachments: FoundationDBDatabase = root\n .at('attachments.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n\n const indexDBs: { [indexName: string]: FoundationDBIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n // used for `getChangedDocumentsSince()`\n useIndexesFinal.push([\n '_meta.lwt',\n primaryPath\n ]);\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach(indexAr => {\n const indexName = getFoundationDBIndexName(indexAr);\n const indexDB = root.at(indexName + '.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.string);\n indexDBs[indexName] = {\n indexName,\n db: indexDB,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n return {\n root,\n main,\n events,\n attachments,\n indexes: indexDBs\n };\n })();\n\n\n const internals: FoundationDBStorageInternals = {\n connection,\n dbsPromise: dbsPromise\n };\n\n const instance = new RxStorageInstanceFoundationDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAmCA,IAAAE,gBAAA,GAAAF,OAAA;AAGA,IAAAG,oBAAA,GAAAH,OAAA;AAMA,IAAAI,YAAA,GAAAJ,OAAA;AAKA,IAAAK,MAAA,GAAAL,OAAA;AASA,IAAAM,kBAAA,GAAAN,OAAA;AACA,IAAAO,aAAA,GAAAP,OAAA;AACA,IAAAQ,OAAA,GAAAR,OAAA;AAhCA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,IA4BaS,6BAA6B,GAAAC,OAAA,CAAAD,6BAAA;EAWtC,SAAAA,8BACoBE,OAA8B,EAC9BC,YAAoB,EACpBC,cAAsB,EACtBC,MAAyD,EACzDC,SAAkD,EAClDC,OAA+D,EAC/DC,QAAuC,EACzD;IAAA,KAVMC,QAAQ,GAAoG,IAAIC,aAAO,CAAC,CAAC;IAAA,KAG7GR,OAA8B,GAA9BA,OAA8B;IAAA,KAC9BC,YAAoB,GAApBA,YAAoB;IAAA,KACpBC,cAAsB,GAAtBA,cAAsB;IAAA,KACtBC,MAAyD,GAAzDA,MAAyD;IAAA,KACzDC,SAAkD,GAAlDA,SAAkD;IAAA,KAClDC,OAA+D,GAA/DA,OAA+D;IAAA,KAC/DC,QAAuC,GAAvCA,QAAuC;IAEvD,IAAI,CAACG,WAAW,GAAG,IAAAC,2CAA2B,EAAC,IAAI,CAACP,MAAM,CAACQ,UAAU,CAAC;EAC1E;EAAC,IAAAC,MAAA,GAAAd,6BAAA,CAAAe,SAAA;EAAAD,MAAA,CAEKE,SAAS,GAAf,eAAAA,UACIC,cAAyC,EACzCC,OAAe,EAC+B;IAC9C,IAAMC,GAAG,GAAG,MAAM,IAAI,CAACb,SAAS,CAACc,UAAU;IAC3C,IAAMC,GAA0C,GAAG;MAC/CC,OAAO,EAAE,EAAE;MACXC,KAAK,EAAE;IACX,CAAC;;IAED;AACR;AACA;AACA;AACA;IACQ,IAAMC,YAAY,GAAG,IAAAC,iBAAU,EAACR,cAAc,EAAES,mDAA8B,CAAC;IAC/E,MAAMC,OAAO,CAACC,GAAG,CACbJ,YAAY,CAACK,GAAG,CAAC,MAAOC,UAAU,IAAK;MACnC,IAAIC,WAAiE,GAAG,IAAW;MACnF,MAAMZ,GAAG,CAACa,IAAI,CAACC,aAAa,CAAC,MAAOC,EAAO,IAAK;QAC5C,IAAMC,GAAG,GAAGL,UAAU,CAACD,GAAG,CAACO,GAAG,IAAKA,GAAG,CAACC,QAAQ,CAAS,IAAI,CAAC1B,WAAW,CAAC,CAAC;QAC1E,IAAM2B,MAAM,GAAGJ,EAAE,CAACK,EAAE,CAACpB,GAAG,CAACqB,IAAI,CAACC,QAAQ,CAAC;QACvC,IAAMC,YAAY,GAAGR,EAAE,CAACK,EAAE,CAACpB,GAAG,CAACwB,WAAW,CAACF,QAAQ,CAAC;QACpD,IAAMG,QAAQ,GAAG,IAAIC,GAAG,CAAoC,CAAC;QAC7D;AACpB;AACA;AACA;QACoB,MAAMlB,OAAO,CAACC,GAAG,CACbO,GAAG,CAACN,GAAG,CAAC,MAAOiB,EAAE,IAAK;UAClB,IAAMC,GAAG,GAAG,MAAMT,MAAM,CAACU,GAAG,CAACF,EAAE,CAAC;UAChCF,QAAQ,CAACK,GAAG,CAACH,EAAE,EAAEC,GAAG,CAAC;QACzB,CAAC,CACL,CAAC;QACDhB,WAAW,GAAG,IAAAmB,wCAAuB,EACjC,IAAI,EACJ,IAAI,CAACvC,WAAW,EAChBiC,QAAQ,EACRd,UAAU,EACVZ,OACJ,CAAC;QACD,IAAAiC,oBAAa,EAAC9B,GAAG,CAACE,KAAK,EAAEQ,WAAW,CAACqB,MAAM,CAAC;;QAE5C;QACArB,WAAW,CAACsB,cAAc,CAACC,OAAO,CAACC,QAAQ,IAAI;UAC3C,IAAMC,KAAa,GAAGD,QAAQ,CAAClB,QAAQ,CAAC,IAAI,CAAC1B,WAAW,CAAQ;UAChEU,GAAG,CAACC,OAAO,CAACmC,IAAI,CAACF,QAAQ,CAAClB,QAAQ,CAAC;;UAEnC;UACAC,MAAM,CAACW,GAAG,CAACO,KAAK,EAAED,QAAQ,CAAClB,QAAQ,CAAC;;UAEpC;UACAqB,MAAM,CAACC,MAAM,CAACxC,GAAG,CAACyC,OAAO,CAAC,CAACN,OAAO,CAACO,SAAS,IAAI;YAC5C,IAAMC,WAAW,GAAGD,SAAS,CAACE,kBAAkB,CAACR,QAAQ,CAAClB,QAAe,CAAC;YAC1E,IAAM2B,OAAO,GAAG9B,EAAE,CAACK,EAAE,CAACsB,SAAS,CAACI,EAAE,CAACxB,QAAQ,CAAC;YAC5CuB,OAAO,CAACf,GAAG,CAACa,WAAW,EAAEN,KAAK,CAAC;UACnC,CAAC,CAAC;QACN,CAAC,CAAC;QACF;QACAzB,WAAW,CAACmC,cAAc,CAACZ,OAAO,CAAEC,QAAiC,IAAK;UACtE,IAAMC,KAAa,GAAGD,QAAQ,CAAClB,QAAQ,CAAC,IAAI,CAAC1B,WAAW,CAAQ;;UAEhE;UACA2B,MAAM,CAACW,GAAG,CAACO,KAAK,EAAED,QAAQ,CAAClB,QAAQ,CAAC;;UAEpC;UACAqB,MAAM,CAACC,MAAM,CAACxC,GAAG,CAACyC,OAAO,CAAC,CAACN,OAAO,CAACO,SAAS,IAAI;YAC5C,IAAMM,cAAc,GAAGN,SAAS,CAACE,kBAAkB,CAAC,IAAAK,qBAAc,EAACb,QAAQ,CAACc,QAAQ,CAAC,CAAC;YACtF,IAAMC,cAAc,GAAGT,SAAS,CAACE,kBAAkB,CAACR,QAAQ,CAAClB,QAAe,CAAC;YAC7E,IAAI8B,cAAc,KAAKG,cAAc,EAAE;cACnC,IAAMN,OAAO,GAAG9B,EAAE,CAACK,EAAE,CAACsB,SAAS,CAACI,EAAE,CAACxB,QAAQ,CAAC;cAC5CuB,OAAO,CAACO,MAAM,CAACJ,cAAc,CAAC;cAC9BH,OAAO,CAACf,GAAG,CAACqB,cAAc,EAAEd,KAAK,CAAC;YACtC;UACJ,CAAC,CAAC;UACFnC,GAAG,CAACC,OAAO,CAACmC,IAAI,CAACF,QAAQ,CAAClB,QAAe,CAAC;QAC9C,CAAC,CAAC;;QAEF;QACAN,WAAW,CAACyC,cAAc,CAAClB,OAAO,CAACmB,UAAU,IAAI;UAC7C/B,YAAY,CAACO,GAAG,CACZ,IAAAyB,wBAAgB,EAACD,UAAU,CAACE,UAAU,EAAEF,UAAU,CAACG,YAAY,CAAC,EAChEH,UAAU,CAACI,cACf,CAAC;QACL,CAAC,CAAC;QACF9C,WAAW,CAAC+C,iBAAiB,CAACxB,OAAO,CAACmB,UAAU,IAAI;UAChD/B,YAAY,CAACO,GAAG,CACZ,IAAAyB,wBAAgB,EAACD,UAAU,CAACE,UAAU,EAAEF,UAAU,CAACG,YAAY,CAAC,EAChEH,UAAU,CAACI,cACf,CAAC;QACL,CAAC,CAAC;QACF9C,WAAW,CAACgD,iBAAiB,CAACzB,OAAO,CAACmB,UAAU,IAAI;UAChD/B,YAAY,CAAC6B,MAAM,CACf,IAAAG,wBAAgB,EAACD,UAAU,CAACE,UAAU,EAAEF,UAAU,CAACG,YAAY,CACnE,CAAC;QACL,CAAC,CAAC;MACN,CAAC,CAAC;MACF7C,WAAW,GAAG,IAAAqC,qBAAc,EAACrC,WAAW,CAAC;MACzC;AAChB;AACA;AACA;AACA;AACA;MACgB,IAAIA,WAAW,CAACiD,SAAS,CAACC,MAAM,CAACC,MAAM,GAAG,CAAC,EAAE;QACzC,IAAMC,SAAS,GAAG,IAAAf,qBAAc,EAACrC,WAAW,CAACqD,SAAS,CAAC,CAAC/C,QAAQ;QAChEN,WAAW,CAACiD,SAAS,CAACK,UAAU,GAAG;UAC/BvC,EAAE,EAAEqC,SAAS,CAAC,IAAI,CAACxE,WAAW,CAAC;UAC/B2E,GAAG,EAAEH,SAAS,CAACI,KAAK,CAACD;QACzB,CAAC;QACDvD,WAAW,CAACiD,SAAS,CAACQ,OAAO,GAAG,IAAAC,UAAG,EAAC,CAAC;QACrC,IAAI,CAAChF,QAAQ,CAACiF,IAAI,CAAC3D,WAAW,CAACiD,SAAS,CAAC;MAC7C;IACJ,CAAC,CACL,CAAC;IAGD,OAAO3D,GAAG;EACd,CAAC;EAAAP,MAAA,CAEK6E,iBAAiB,GAAvB,eAAAA,kBAAwBxD,GAAa,EAAEyD,WAAoB,EAAwC;IAC/F,IAAMzE,GAAG,GAAG,MAAM,IAAI,CAACb,SAAS,CAACc,UAAU;IAC3C,OAAOD,GAAG,CAACqB,IAAI,CAACP,aAAa,CAAC,MAAOC,EAAO,IAAK;MAC7C,IAAMb,GAAgC,GAAG,EAAE;MAC3C,MAAMM,OAAO,CAACC,GAAG,CACbO,GAAG,CAACN,GAAG,CAAC,MAAO2B,KAAK,IAAK;QACrB,IAAMqC,OAAO,GAAG,MAAM3D,EAAE,CAACc,GAAG,CAACQ,KAAK,CAAC;QACnC,IACIqC,OAAO,KAEH,CAACA,OAAO,CAACC,QAAQ,IACjBF,WAAW,CACd,EACH;UACEvE,GAAG,CAACoC,IAAI,CAACoC,OAAO,CAAC;QACrB;MACJ,CAAC,CACL,CAAC;MACD,OAAOxE,GAAG;IACd,CAAC,CAAC;EACN,CAAC;EAAAP,MAAA,CACDiF,KAAK,GAAL,SAAAA,MAAMC,aAAuC,EAA4C;IACrF,OAAO,IAAAC,oCAAiB,EAAC,IAAI,EAAED,aAAa,CAAC;EACjD,CAAC;EAAAlF,MAAA,CACKoF,KAAK,GAAX,eAAAA,MACIF,aAAuC,EACV;IAC7B;AACR;AACA;AACA;AACA;IACQ,IAAMG,MAAM,GAAG,MAAM,IAAI,CAACJ,KAAK,CAACC,aAAa,CAAC;IAC9C,OAAO;MACHE,KAAK,EAAEC,MAAM,CAACC,SAAS,CAAClB,MAAM;MAC9BmB,IAAI,EAAE;IACV,CAAC;EACL,CAAC;EAAAvF,MAAA,CAEKwF,iBAAiB,GAAvB,eAAAA,kBAAwB3B,UAAkB,EAAEC,YAAoB,EAAE2B,OAAe,EAAmB;IAChG,IAAMpF,GAAG,GAAG,MAAM,IAAI,CAACb,SAAS,CAACc,UAAU;IAC3C,IAAMqD,UAAU,GAAG,MAAMtD,GAAG,CAACwB,WAAW,CAACK,GAAG,CAAC,IAAA0B,wBAAgB,EAACC,UAAU,EAAEC,YAAY,CAAC,CAAC;IACxF,OAAOH,UAAU,CAAC+B,IAAI;EAC1B,CAAC;EAAA1F,MAAA,CACD2F,YAAY,GAAZ,SAAAA,aAAA,EAAmG;IAC/F,OAAO,IAAI,CAAChG,QAAQ,CAACiG,YAAY,CAAC,CAAC;EACvC,CAAC;EAAA5F,MAAA,CAEK6F,MAAM,GAAZ,eAAAA,OAAA,EAA8B;IAC1B,IAAMxF,GAAG,GAAG,MAAM,IAAI,CAACb,SAAS,CAACc,UAAU;IAC3C,MAAMD,GAAG,CAACa,IAAI,CAACC,aAAa,CAAEC,EAAO,IAAK;MACtCA,EAAE,CAAC0E,UAAU,CAAC,EAAE,EAAEC,uBAAS,CAAC;MAC5B,OAAOC,2BAAoB;IAC/B,CAAC,CAAC;IACF,OAAO,IAAI,CAACC,KAAK,CAAC,CAAC;EACvB,CAAC;EAAAjG,MAAA,CACKkG,OAAO,GAAb,eAAAA,QAAcC,kBAA0B,EAAoB;IACxD,IAAM;MACFC,WAAW;MACXC;IACJ,CAAC,GAAG5H,OAAO,CAAC,cAAc,CAAC;IAC3B,IAAM6H,eAAe,GAAG,IAAA3B,UAAG,EAAC,CAAC,GAAGwB,kBAAkB;IAClD,IAAM9F,GAAG,GAAG,MAAM,IAAI,CAACb,SAAS,CAACc,UAAU;IAC3C,IAAMiG,KAAK,GAAGC,kCAAa;IAC3B,IAAMC,SAAS,GAAG,IAAAC,6CAAwB,EAACH,KAAK,CAAC;IACjD,IAAMxD,SAAS,GAAG1C,GAAG,CAACyC,OAAO,CAAC2D,SAAS,CAAC;IACxC,IAAME,gBAAgB,GAAG,IAAAC,8CAAiC,EACtD,IAAI,CAACrH,MAAM,EACXgH,KAAK,EACL,CACI,IAAI;IACJ;AAChB;AACA;AACA;IACgB,CAAC,CAET,CAAC;IACD,IAAMM,gBAAgB,GAAG,IAAAC,8CAAiC,EACtD,IAAI,CAACvH,MAAM,EACXgH,KAAK,EACL,CACI,IAAI,EACJD,eAAe,CAEvB,CAAC;IACD,IAAIS,eAAwB,GAAG,IAAI;IACnC,MAAM1G,GAAG,CAACa,IAAI,CAACC,aAAa,CAAC,MAAOC,EAAO,IAAK;MAC5C,IAAM4F,SAAS,GAAG,IAAA1D,qBAAc,EAAC,IAAI,CAAC5D,QAAQ,CAACsH,SAAS,CAAC;MACzD,IAAM9D,OAAO,GAAG9B,EAAE,CAACK,EAAE,CAACsB,SAAS,CAACI,EAAE,CAACxB,QAAQ,CAAC;MAC5C,IAAMH,MAAM,GAAGJ,EAAE,CAACK,EAAE,CAACpB,GAAG,CAACqB,IAAI,CAACC,QAAQ,CAAC;MACvC,IAAMsF,KAAK,GAAG,MAAM/D,OAAO,CAACgE,WAAW,CACnCd,WAAW,CAACe,gBAAgB,CAACR,gBAAgB,CAAC,EAC9CE,gBAAgB,EAChB;QACIO,KAAK,EAAEJ,SAAS,GAAG,CAAC;QAAE;QACtBK,aAAa,EAAEhB,aAAa,CAACiB;MACjC,CACJ,CAAC;MACD,IAAIL,KAAK,CAAC7C,MAAM,GAAG4C,SAAS,EAAE;QAC1BD,eAAe,GAAG,KAAK;QACvBE,KAAK,CAACM,GAAG,CAAC,CAAC;MACf;MACA,IAAMC,MAAM,GAAGP,KAAK,CAAClG,GAAG,CAAEO,GAAa,IAAKA,GAAG,CAAC,CAAC,CAAC,CAAC;MACnD,IAAMmG,QAAqC,GAAG,MAAM5G,OAAO,CAACC,GAAG,CAAC0G,MAAM,CAACzG,GAAG,CAAE2B,KAAa,IAAKlB,MAAM,CAACU,GAAG,CAACQ,KAAK,CAAC,CAAC,CAAC;MAEjHE,MAAM,CACDC,MAAM,CAACxC,GAAG,CAACyC,OAAO,CAAC,CACnBN,OAAO,CAACkF,cAAc,IAAI;QACvB,IAAMC,UAAU,GAAGvG,EAAE,CAACK,EAAE,CAACiG,cAAc,CAACvE,EAAE,CAACxB,QAAQ,CAAC;QACpD8F,QAAQ,CAACjF,OAAO,CAACoF,OAAO,IAAI;UACxB,IAAM5E,WAAW,GAAG0E,cAAc,CAACzE,kBAAkB,CAAC2E,OAAO,CAAC;UAC9DD,UAAU,CAAClE,MAAM,CAACT,WAAW,CAAC;QAClC,CAAC,CAAC;MACN,CAAC,CAAC;MACNwE,MAAM,CAAChF,OAAO,CAAER,EAAU,IAAKR,MAAM,CAACiC,MAAM,CAACzB,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC;IAEF,OAAO+E,eAAe;EAC1B,CAAC;EAAA/G,MAAA,CAED6H,sBAAsB,GAAtB,SAAAA,uBAAA,EAAyE;IACrE,OAAO,IAAIjI,aAAO,CAAM,CAAC,CAACgG,YAAY,CAAC,CAAC;EAC5C,CAAC;EAAA5F,MAAA,CACD8H,4BAA4B,GAA5B,SAAAA,6BAA6BC,aAAyD,EAAiB;IACnG,OAAO/B,2BAAoB;EAC/B,CAAC;EAAAhG,MAAA,CAEKiG,KAAK,GAAX,eAAAA,MAAA,EAAc;IACV,IAAI,IAAI,CAAC+B,MAAM,EAAE;MACb,OAAO,IAAI,CAACA,MAAM;IACtB;IACA,IAAI,CAACA,MAAM,GAAG,CAAC,YAAY;MACvB,IAAI,CAACrI,QAAQ,CAACsI,QAAQ,CAAC,CAAC;MACxB,IAAM5H,GAAG,GAAG,MAAM,IAAI,CAACb,SAAS,CAACc,UAAU;MAC3C,MAAMD,GAAG,CAACa,IAAI,CAAC+E,KAAK,CAAC,CAAC;;MAEtB;MACA;IACJ,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAAC+B,MAAM;EACtB,CAAC;EAAA,OAAA9I,6BAAA;AAAA;AAIE,SAASgJ,iCAAiCA,CAC7C9I,OAA8B,EAC9B+I,MAAgG,EAChGzI,QAAuC,EACU;EACjD,IAAMG,WAAW,GAAG,IAAAC,2CAA2B,EAACqI,MAAM,CAAC5I,MAAM,CAACQ,UAAU,CAAC;EAEzE,IAAM;IACFqI,IAAI;IACJC,SAAS;IACTC;EACJ,CAAC,GAAG7J,OAAO,CAAC,cAAc,CAAC;EAE3B,IAAM8J,UAAU,GAAGH,IAAI,CAAC1I,QAAQ,CAAC8I,WAAW,CAAC;EAC7C,IAAMlI,UAAU,GAAG,CAAC,YAAY;IAC5B,IAAMmI,GAAG,GAAG,MAAMJ,SAAS,CAACK,YAAY,CAACH,UAAU,EAAE,MAAM,CAAC;IAE5D,IAAMrH,IAAI,GAAGqH,UAAU,CAClB9G,EAAE,CAACgH,GAAG,CAAC,CACPhH,EAAE,CAAC0G,MAAM,CAAC9I,YAAY,GAAG,GAAG,CAAC,CAC7BoC,EAAE,CAAC0G,MAAM,CAAC7I,cAAc,GAAG,GAAG,CAAC,CAC/BmC,EAAE,CAAC0G,MAAM,CAAC5I,MAAM,CAACoJ,OAAO,GAAG,GAAG,CAAC;IACpC,IAAMjH,IAAqC,GAAGR,IAAI,CAC7CO,EAAE,CAAC,OAAO,CAAC,CACXmH,eAAe,CAACN,QAAQ,CAACO,MAAM,CAAC,CAAC;IAAA,CACjCC,iBAAiB,CAACR,QAAQ,CAACS,IAAI,CAAQ,CAAC,CAAC;;IAG9C,IAAM5E,MAAoH,GAAGjD,IAAI,CAC5HO,EAAE,CAAC,SAAS,CAAC,CACbmH,eAAe,CAACN,QAAQ,CAACO,MAAM,CAAC,CAChCC,iBAAiB,CAACR,QAAQ,CAACS,IAAI,CAAQ;IAE5C,IAAMlH,WAAwD,GAAGX,IAAI,CAChEO,EAAE,CAAC,cAAc,CAAC,CAClBmH,eAAe,CAACN,QAAQ,CAACO,MAAM,CAAC,CAChCC,iBAAiB,CAACR,QAAQ,CAACS,IAAI,CAAQ;IAG5C,IAAMC,QAAoE,GAAG,CAAC,CAAC;IAC/E,IAAMC,UAAU,GAAGd,MAAM,CAAC5I,MAAM,CAACuD,OAAO,GAAGqF,MAAM,CAAC5I,MAAM,CAACuD,OAAO,CAACoG,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE;IAC9ED,UAAU,CAACtG,IAAI,CAAC,CAAC9C,WAAW,CAAC,CAAC;IAC9B,IAAMsJ,eAAe,GAAGF,UAAU,CAAClI,GAAG,CAACwF,KAAK,IAAI;MAC5C,IAAM6C,OAAO,GAAG,IAAAC,cAAO,EAAC9C,KAAK,CAAC;MAC9B,OAAO6C,OAAO;IAClB,CAAC,CAAC;IACF;IACAD,eAAe,CAACxG,IAAI,CAAC,CACjB,WAAW,EACX9C,WAAW,CACd,CAAC;IACFsJ,eAAe,CAACxG,IAAI,CAAC6D,kCAAa,CAAC;IACnC2C,eAAe,CAAC3G,OAAO,CAAC4G,OAAO,IAAI;MAC/B,IAAM3C,SAAS,GAAG,IAAAC,6CAAwB,EAAC0C,OAAO,CAAC;MACnD,IAAME,OAAO,GAAGpI,IAAI,CAACO,EAAE,CAACgF,SAAS,GAAG,GAAG,CAAC,CACnCmC,eAAe,CAACN,QAAQ,CAACO,MAAM,CAAC,CAChCC,iBAAiB,CAACR,QAAQ,CAACO,MAAM,CAAC;MACvCG,QAAQ,CAACvC,SAAS,CAAC,GAAG;QAClBA,SAAS;QACTtD,EAAE,EAAEmG,OAAO;QACXrG,kBAAkB,EAAE,IAAAsG,oCAAuB,EAACpB,MAAM,CAAC5I,MAAM,EAAE6J,OAAO,CAAC;QACnE7C,KAAK,EAAE6C;MACX,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;MACHlI,IAAI;MACJQ,IAAI;MACJyC,MAAM;MACNtC,WAAW;MACXiB,OAAO,EAAEkG;IACb,CAAC;EACL,CAAC,EAAE,CAAC;EAGJ,IAAMxJ,SAAkD,GAAG;IACvD+I,UAAU;IACVjI,UAAU,EAAEA;EAChB,CAAC;EAED,IAAMkJ,QAAQ,GAAG,IAAItK,6BAA6B,CAC9CE,OAAO,EACP+I,MAAM,CAAC9I,YAAY,EACnB8I,MAAM,CAAC7I,cAAc,EACrB6I,MAAM,CAAC5I,MAAM,EACbC,SAAS,EACT2I,MAAM,CAAC1I,OAAO,EACdC,QACJ,CAAC;EACD,OAAOmB,OAAO,CAAC4I,OAAO,CAACD,QAAQ,CAAC;AACpC","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-lokijs/loki-save-queue.js.map b/dist/cjs/plugins/storage-lokijs/loki-save-queue.js.map index 8f7e1066f8c..f402f4f8ac8 100644 --- a/dist/cjs/plugins/storage-lokijs/loki-save-queue.js.map +++ b/dist/cjs/plugins/storage-lokijs/loki-save-queue.js.map @@ -1 +1 @@ -{"version":3,"file":"loki-save-queue.js","names":["_index","require","LokiSaveQueue","exports","lokiDatabase","databaseSettings","writesSinceLastRun","saveQueue","PROMISE_RESOLVE_VOID","saveQueueC","_proto","prototype","addWrite","run","adapter","then","requestIdlePromise","writeAmount","Promise","res","rej","saveDatabase","err","autosaveCallback","catch"],"sources":["../../../../src/plugins/storage-lokijs/loki-save-queue.ts"],"sourcesContent":["import type { LokiDatabaseSettings } from '../../types/index.d.ts';\nimport {\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../utils/index.ts';\n\n/**\n * The autosave feature of lokijs has strange behaviors\n * and often runs a save in critical moments when other\n * more important tasks are running.\n * So instead we use a custom save queue that ensures we\n * only run loki.saveDatabase() when nothing else is running.\n */\nexport class LokiSaveQueue {\n public writesSinceLastRun: number = 0;\n\n /**\n * Ensures that we do not run multiple saves\n * in parallel\n */\n public saveQueue: Promise = PROMISE_RESOLVE_VOID;\n // track amount of non-finished save calls in the queue.\n public saveQueueC = 0;\n\n constructor(\n public readonly lokiDatabase: any,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n\n }\n\n public addWrite() {\n this.writesSinceLastRun = this.writesSinceLastRun + 1;\n this.run();\n }\n\n public run() {\n if (\n // no persistence adapter given, so we do not need to save\n !this.databaseSettings.adapter ||\n // do not add more then two pending calls to the queue.\n this.saveQueueC > 2\n\n ) {\n return this.saveQueue;\n }\n\n this.saveQueueC = this.saveQueueC + 1;\n this.saveQueue = this.saveQueue\n .then(async () => {\n /**\n * Always wait until the JavaScript process is idle.\n * This ensures that CPU blocking writes are finished\n * before we proceed.\n */\n await requestIdlePromise();\n\n // no write happened since the last save call\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n /**\n * Because LokiJS is a in-memory database,\n * we can just wait until the JavaScript process is idle\n * via requestIdlePromise(). Then we know that nothing important\n * is running at the moment.\n */\n await requestIdlePromise().then(() => requestIdlePromise());\n\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n const writeAmount = this.writesSinceLastRun;\n this.writesSinceLastRun = 0;\n return new Promise((res, rej) => {\n this.lokiDatabase.saveDatabase((err: any) => {\n if (err) {\n this.writesSinceLastRun = this.writesSinceLastRun + writeAmount;\n rej(err);\n } else {\n if (this.databaseSettings.autosaveCallback) {\n this.databaseSettings.autosaveCallback();\n }\n res();\n }\n });\n });\n })\n .catch(() => { })\n .then(() => {\n this.saveQueueC = this.saveQueueC - 1;\n });\n return this.saveQueue;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOaC,aAAa,GAAAC,OAAA,CAAAD,aAAA;EAGtB;AACJ;AACA;AACA;;EAEI;;EAGA,SAAAA,cACoBE,YAAiB,EACjBC,gBAAsC,EACxD;IAAA,KAbKC,kBAAkB,GAAW,CAAC;IAAA,KAM9BC,SAAS,GAAkBC,2BAAoB;IAAA,KAE/CC,UAAU,GAAG,CAAC;IAAA,KAGDL,YAAiB,GAAjBA,YAAiB;IAAA,KACjBC,gBAAsC,GAAtCA,gBAAsC;EAG1D;EAAC,IAAAK,MAAA,GAAAR,aAAA,CAAAS,SAAA;EAAAD,MAAA,CAEME,QAAQ,GAAf,SAAOA,QAAQA,CAAA,EAAG;IACd,IAAI,CAACN,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAG,CAAC;IACrD,IAAI,CAACO,GAAG,CAAC,CAAC;EACd,CAAC;EAAAH,MAAA,CAEMG,GAAG,GAAV,SAAOA,GAAGA,CAAA,EAAG;IACT;IACI;IACA,CAAC,IAAI,CAACR,gBAAgB,CAACS,OAAO;IAC9B;IACA,IAAI,CAACL,UAAU,GAAG,CAAC,EAErB;MACE,OAAO,IAAI,CAACF,SAAS;IACzB;IAEA,IAAI,CAACE,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACrC,IAAI,CAACF,SAAS,GAAG,IAAI,CAACA,SAAS,CAC1BQ,IAAI,CAAC,YAAY;MACd;AAChB;AACA;AACA;AACA;MACgB,MAAM,IAAAC,yBAAkB,EAAC,CAAC;;MAE1B;MACA,IAAI,IAAI,CAACV,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;;MAEA;AAChB;AACA;AACA;AACA;AACA;MACgB,MAAM,IAAAU,yBAAkB,EAAC,CAAC,CAACD,IAAI,CAAC,MAAM,IAAAC,yBAAkB,EAAC,CAAC,CAAC;MAE3D,IAAI,IAAI,CAACV,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;MAEA,IAAMW,WAAW,GAAG,IAAI,CAACX,kBAAkB;MAC3C,IAAI,CAACA,kBAAkB,GAAG,CAAC;MAC3B,OAAO,IAAIY,OAAO,CAAO,CAACC,GAAG,EAAEC,GAAG,KAAK;QACnC,IAAI,CAAChB,YAAY,CAACiB,YAAY,CAAEC,GAAQ,IAAK;UACzC,IAAIA,GAAG,EAAE;YACL,IAAI,CAAChB,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAGW,WAAW;YAC/DG,GAAG,CAACE,GAAG,CAAC;UACZ,CAAC,MAAM;YACH,IAAI,IAAI,CAACjB,gBAAgB,CAACkB,gBAAgB,EAAE;cACxC,IAAI,CAAClB,gBAAgB,CAACkB,gBAAgB,CAAC,CAAC;YAC5C;YACAJ,GAAG,CAAC,CAAC;UACT;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC,CACDK,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAChBT,IAAI,CAAC,MAAM;MACR,IAAI,CAACN,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACzC,CAAC,CAAC;IACN,OAAO,IAAI,CAACF,SAAS;EACzB,CAAC;EAAA,OAAAL,aAAA;AAAA","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"loki-save-queue.js","names":["_index","require","LokiSaveQueue","exports","lokiDatabase","databaseSettings","writesSinceLastRun","saveQueue","PROMISE_RESOLVE_VOID","saveQueueC","_proto","prototype","addWrite","run","adapter","then","requestIdlePromise","writeAmount","Promise","res","rej","saveDatabase","err","autosaveCallback","catch"],"sources":["../../../../src/plugins/storage-lokijs/loki-save-queue.ts"],"sourcesContent":["import type { LokiDatabaseSettings } from '../../types/index.d.ts';\nimport {\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../utils/index.ts';\n\n/**\n * The autosave feature of lokijs has strange behaviors\n * and often runs a save in critical moments when other\n * more important tasks are running.\n * So instead we use a custom save queue that ensures we\n * only run loki.saveDatabase() when nothing else is running.\n */\nexport class LokiSaveQueue {\n public writesSinceLastRun: number = 0;\n\n /**\n * Ensures that we do not run multiple saves\n * in parallel\n */\n public saveQueue: Promise = PROMISE_RESOLVE_VOID;\n // track amount of non-finished save calls in the queue.\n public saveQueueC = 0;\n\n constructor(\n public readonly lokiDatabase: any,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n\n }\n\n public addWrite() {\n this.writesSinceLastRun = this.writesSinceLastRun + 1;\n this.run();\n }\n\n public run() {\n if (\n // no persistence adapter given, so we do not need to save\n !this.databaseSettings.adapter ||\n // do not add more then two pending calls to the queue.\n this.saveQueueC > 2\n\n ) {\n return this.saveQueue;\n }\n\n this.saveQueueC = this.saveQueueC + 1;\n this.saveQueue = this.saveQueue\n .then(async () => {\n /**\n * Always wait until the JavaScript process is idle.\n * This ensures that CPU blocking writes are finished\n * before we proceed.\n */\n await requestIdlePromise();\n\n // no write happened since the last save call\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n /**\n * Because LokiJS is a in-memory database,\n * we can just wait until the JavaScript process is idle\n * via requestIdlePromise(). Then we know that nothing important\n * is running at the moment.\n */\n await requestIdlePromise().then(() => requestIdlePromise());\n\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n const writeAmount = this.writesSinceLastRun;\n this.writesSinceLastRun = 0;\n return new Promise((res, rej) => {\n this.lokiDatabase.saveDatabase((err: any) => {\n if (err) {\n this.writesSinceLastRun = this.writesSinceLastRun + writeAmount;\n rej(err);\n } else {\n if (this.databaseSettings.autosaveCallback) {\n this.databaseSettings.autosaveCallback();\n }\n res();\n }\n });\n });\n })\n .catch(() => { })\n .then(() => {\n this.saveQueueC = this.saveQueueC - 1;\n });\n return this.saveQueue;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,MAAA,GAAAC,OAAA;AAKA;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOaC,aAAa,GAAAC,OAAA,CAAAD,aAAA;EAGtB;AACJ;AACA;AACA;;EAEI;;EAGA,SAAAA,cACoBE,YAAiB,EACjBC,gBAAsC,EACxD;IAAA,KAbKC,kBAAkB,GAAW,CAAC;IAAA,KAM9BC,SAAS,GAAkBC,2BAAoB;IAAA,KAE/CC,UAAU,GAAG,CAAC;IAAA,KAGDL,YAAiB,GAAjBA,YAAiB;IAAA,KACjBC,gBAAsC,GAAtCA,gBAAsC;EAG1D;EAAC,IAAAK,MAAA,GAAAR,aAAA,CAAAS,SAAA;EAAAD,MAAA,CAEME,QAAQ,GAAf,SAAAA,SAAA,EAAkB;IACd,IAAI,CAACN,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAG,CAAC;IACrD,IAAI,CAACO,GAAG,CAAC,CAAC;EACd,CAAC;EAAAH,MAAA,CAEMG,GAAG,GAAV,SAAAA,IAAA,EAAa;IACT;IACI;IACA,CAAC,IAAI,CAACR,gBAAgB,CAACS,OAAO;IAC9B;IACA,IAAI,CAACL,UAAU,GAAG,CAAC,EAErB;MACE,OAAO,IAAI,CAACF,SAAS;IACzB;IAEA,IAAI,CAACE,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACrC,IAAI,CAACF,SAAS,GAAG,IAAI,CAACA,SAAS,CAC1BQ,IAAI,CAAC,YAAY;MACd;AAChB;AACA;AACA;AACA;MACgB,MAAM,IAAAC,yBAAkB,EAAC,CAAC;;MAE1B;MACA,IAAI,IAAI,CAACV,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;;MAEA;AAChB;AACA;AACA;AACA;AACA;MACgB,MAAM,IAAAU,yBAAkB,EAAC,CAAC,CAACD,IAAI,CAAC,MAAM,IAAAC,yBAAkB,EAAC,CAAC,CAAC;MAE3D,IAAI,IAAI,CAACV,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;MAEA,IAAMW,WAAW,GAAG,IAAI,CAACX,kBAAkB;MAC3C,IAAI,CAACA,kBAAkB,GAAG,CAAC;MAC3B,OAAO,IAAIY,OAAO,CAAO,CAACC,GAAG,EAAEC,GAAG,KAAK;QACnC,IAAI,CAAChB,YAAY,CAACiB,YAAY,CAAEC,GAAQ,IAAK;UACzC,IAAIA,GAAG,EAAE;YACL,IAAI,CAAChB,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAGW,WAAW;YAC/DG,GAAG,CAACE,GAAG,CAAC;UACZ,CAAC,MAAM;YACH,IAAI,IAAI,CAACjB,gBAAgB,CAACkB,gBAAgB,EAAE;cACxC,IAAI,CAAClB,gBAAgB,CAACkB,gBAAgB,CAAC,CAAC;YAC5C;YACAJ,GAAG,CAAC,CAAC;UACT;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC,CACDK,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAChBT,IAAI,CAAC,MAAM;MACR,IAAI,CAACN,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACzC,CAAC,CAAC;IACN,OAAO,IAAI,CAACF,SAAS;EACzB,CAAC;EAAA,OAAAL,aAAA;AAAA","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js b/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js index 4256e3192bb..f5deeef5753 100644 --- a/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js +++ b/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js @@ -1,13 +1,11 @@ "use strict"; -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RxStorageInstanceLoki = void 0; exports.createLokiLocalState = createLokiLocalState; exports.createLokiStorageInstance = createLokiStorageInstance; -var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError")); var _rxjs = require("rxjs"); var _index = require("../utils/index.js"); var _rxError = require("../../rx-error.js"); diff --git a/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js.map b/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js.map index de923f6ee8c..c9e6dc76c0f 100644 --- a/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js.map +++ b/dist/cjs/plugins/storage-lokijs/rx-storage-instance-loki.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-loki.js","names":["_rxjs","require","_index","_rxError","_lokijsHelper","_rxSchemaHelper","_rxStorageHelper","_rxStorageMultiinstance","_rxQueryHelper","instanceId","now","shownNonPremiumLog","RxStorageInstanceLoki","exports","databaseInstanceToken","storage","databaseName","collectionName","schema","internals","options","databaseSettings","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","OPEN_LOKIJS_STORAGE_INSTANCES","add","leaderElector","copiedSelf","bulkWrite","bind","changeStream","cleanup","close","query","count","findDocumentsById","conflictResultionTasks","getAttachmentData","remove","resolveConflictResultionTask","awaitLeadership","then","ensureNotFalsy","broadcastChannel","addEventListener","msg","handleRemoteRequest","catch","_proto","prototype","documentWrites","context","RXDB_UTILS_GLOBAL","premium","defaultHashSha256","PREMIUM_FLAG_HASH","console","warn","join","length","newRxError","args","localState","mustUseLocalState","requestRemoteInstance","ret","success","error","docsInDb","Map","docsInDbWithLokiKey","forEach","writeRow","id","document","documentInDb","collection","by","set","stripLokiKey","categorized","categorizeBulkWriteRows","errors","bulkInsertDocs","insert","flatClone","push","bulkUpdateDocs","docId","documentInDbWithLokiKey","getFromMapOrThrow","writeDoc","Object","assign","$loki","update","databaseState","saveQueue","addWrite","eventBulk","events","lastState","newestRow","checkpoint","lwt","_meta","endTime","next","ids","deleted","_deleted","preparedQueryOriginal","preparedQuery","selector","transformRegexToRegExp","skip","limit","Infinity","skipPlusLimit","mustRunMatcher","hasDeepProperty","lokiQuery","chain","find","sort","getLokiSortComparator","foundDocuments","data","map","lokiDoc","queryMatcher","getQueryMatcher","filter","d","slice","documents","result","mode","_documentId","_attachmentId","_digest","Error","asObservable","minimumDeletedTime","deleteAmountPerRun","maxDeletionTime","$lt","closed","complete","delete","dbState","getLokiDatabase","run","closeLokiCollections","database","removeCollection","name","_taskSolution","createLokiLocalState","params","indices","indexes","idx","isMaybeReadonlyArray","lokiCollectionName","version","collectionOptions","unique","LOKIJS_COLLECTION_DEFAULT_OPTIONS","addCollection","collections","createLokiStorageInstance","broadcastChannelRefObject","multiInstance","getLokiLeaderElector","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_LOKIJS","undefined","closeBefore","removeBroadcastChannelReference","removeBefore"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-instance-loki.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n flatClone,\n now,\n ensureNotFalsy,\n isMaybeReadonlyArray,\n getFromMapOrThrow,\n hasDeepProperty,\n RXDB_UTILS_GLOBAL,\n defaultHashSha256,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport type {\n RxStorageInstance,\n LokiSettings,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n MangoQuery,\n LokiStorageInternals,\n RxStorageInstanceCreationParams,\n LokiDatabaseSettings,\n LokiLocalDatabaseState,\n EventBulk,\n StringKeys,\n DeepReadonly,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport {\n closeLokiCollections,\n getLokiDatabase,\n OPEN_LOKIJS_STORAGE_INSTANCES,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS,\n stripLokiKey,\n getLokiSortComparator,\n getLokiLeaderElector,\n requestRemoteInstance,\n mustUseLocalState,\n handleRemoteRequest,\n RX_STORAGE_NAME_LOKIJS,\n transformRegexToRegExp\n} from './lokijs-helper.ts';\nimport type { RxStorageLoki } from './rx-storage-lokijs.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n addRxStorageMultiInstanceSupport,\n removeBroadcastChannelReference\n} from '../../rx-storage-multiinstance.ts';\nimport { getQueryMatcher } from '../../rx-query-helper.ts';\n\nlet instanceId = now();\nlet shownNonPremiumLog = false;\n\nexport class RxStorageInstanceLoki implements RxStorageInstance<\n RxDocType,\n LokiStorageInternals,\n LokiSettings,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n\n public closed?: Promise;\n\n constructor(\n public readonly databaseInstanceToken: string,\n public readonly storage: RxStorageLoki,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: LokiStorageInternals,\n public readonly options: Readonly,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n OPEN_LOKIJS_STORAGE_INSTANCES.add(this);\n if (this.internals.leaderElector) {\n\n\n /**\n * To run handleRemoteRequest(),\n * the instance will call its own methods.\n * But these methods could have already been swapped out by a RxStorageWrapper\n * so we must store the original methods here and use them instead.\n */\n const copiedSelf: RxStorageInstance = {\n bulkWrite: this.bulkWrite.bind(this),\n changeStream: this.changeStream.bind(this),\n cleanup: this.cleanup.bind(this),\n close: this.close.bind(this),\n query: this.query.bind(this),\n count: this.count.bind(this),\n findDocumentsById: this.findDocumentsById.bind(this),\n collectionName: this.collectionName,\n databaseName: this.databaseName,\n conflictResultionTasks: this.conflictResultionTasks.bind(this),\n getAttachmentData: this.getAttachmentData.bind(this),\n internals: this.internals,\n options: this.options,\n remove: this.remove.bind(this),\n resolveConflictResultionTask: this.resolveConflictResultionTask.bind(this),\n schema: this.schema\n };\n\n this.internals.leaderElector.awaitLeadership().then(() => {\n // this instance is leader now, so it has to reply to queries from other instances\n ensureNotFalsy(this.internals.leaderElector).broadcastChannel\n .addEventListener('message', (msg) => handleRemoteRequest(copiedSelf as any, msg));\n }).catch(() => { });\n }\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free LokiJS based RxStorage implementation from RxDB https://rxdb.info/rx-storage-lokijs.html?console=loki ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=loki ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n if (documentWrites.length === 0) {\n throw newRxError('P2', {\n args: {\n documentWrites\n }\n });\n }\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'bulkWrite', [documentWrites]);\n }\n\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const docsInDb: Map[StringKeys], RxDocumentData> = new Map();\n const docsInDbWithLokiKey: Map<\n RxDocumentData[StringKeys],\n RxDocumentData & { $loki: number; }\n > = new Map();\n documentWrites.forEach(writeRow => {\n const id = writeRow.document[this.primaryPath];\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (documentInDb) {\n docsInDbWithLokiKey.set(id as any, documentInDb);\n docsInDb.set(id as any, stripLokiKey(documentInDb));\n }\n });\n\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDb,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n categorized.bulkInsertDocs.forEach(writeRow => {\n localState.collection.insert(flatClone(writeRow.document));\n ret.success.push(writeRow.document);\n });\n categorized.bulkUpdateDocs.forEach(writeRow => {\n const docId = writeRow.document[this.primaryPath];\n const documentInDbWithLokiKey = getFromMapOrThrow(docsInDbWithLokiKey, docId as any);\n const writeDoc: any = Object.assign(\n {},\n writeRow.document,\n {\n $loki: documentInDbWithLokiKey.$loki\n }\n );\n localState.collection.update(writeDoc);\n ret.success.push(writeRow.document);\n });\n localState.databaseState.saveQueue.addWrite();\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n async findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'findDocumentsById', [ids, deleted]);\n }\n\n const ret: RxDocumentData[] = [];\n ids.forEach(id => {\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(stripLokiKey(documentInDb));\n }\n });\n return ret;\n }\n async query(preparedQueryOriginal: PreparedQuery): Promise> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'query', [preparedQueryOriginal]);\n }\n\n let preparedQuery = ensureNotFalsy(preparedQueryOriginal.query);\n if (preparedQuery.selector) {\n preparedQuery = flatClone(preparedQuery);\n preparedQuery.selector = transformRegexToRegExp(preparedQuery.selector);\n }\n\n const query = preparedQueryOriginal.query;\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n /**\n * LokiJS is not able to give correct results for some\n * operators, so we have to check all documents in that case\n * and laster apply skip and limit manually.\n * @link https://github.com/pubkey/rxdb/issues/5320\n */\n let mustRunMatcher = false;\n if (hasDeepProperty(preparedQuery.selector, '$in')) {\n mustRunMatcher = true;\n }\n\n\n let lokiQuery = localState.collection\n .chain()\n .find(mustRunMatcher ? {} : preparedQuery.selector);\n\n if (preparedQuery.sort) {\n lokiQuery = lokiQuery.sort(getLokiSortComparator(this.schema, preparedQuery));\n }\n\n\n let foundDocuments = lokiQuery.data().map((lokiDoc: any) => stripLokiKey(lokiDoc));\n\n\n /**\n * LokiJS returned wrong results on some queries\n * with complex indexes. Therefore we run the query-match\n * over all result docs to patch this bug.\n * TODO create an issue at the LokiJS repository.\n */\n const queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery as any\n );\n foundDocuments = foundDocuments.filter((d: any) => queryMatcher(d));\n\n // always apply offset and limit like this, because\n // sylvieQuery.offset() and sylvieQuery.limit() results were inconsistent\n foundDocuments = foundDocuments.slice(skip, skipPlusLimit);\n\n return {\n documents: foundDocuments\n };\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(_documentId: string, _attachmentId: string, _digest: string): Promise {\n throw new Error('Attachments are not implemented in the lokijs RxStorage. Make a pull request.');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'cleanup', [minimumDeletedTime]);\n }\n\n const deleteAmountPerRun = 10;\n const maxDeletionTime = now() - minimumDeletedTime;\n const query = localState.collection\n .chain()\n .find({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n }).limit(deleteAmountPerRun);\n const foundDocuments = query.data();\n if (foundDocuments.length > 0) {\n localState.collection.remove(foundDocuments);\n localState.databaseState.saveQueue.addWrite();\n }\n\n return foundDocuments.length !== deleteAmountPerRun;\n }\n\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n OPEN_LOKIJS_STORAGE_INSTANCES.delete(this);\n if (this.internals.localState) {\n const localState = await this.internals.localState;\n const dbState = await getLokiDatabase(\n this.databaseName,\n this.databaseSettings\n );\n await dbState.saveQueue.run();\n await closeLokiCollections(\n this.databaseName,\n [\n localState.collection\n ]\n );\n }\n })();\n return this.closed;\n }\n async remove(): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'remove', []);\n }\n localState.databaseState.database.removeCollection(localState.collection.name);\n await localState.databaseState.saveQueue.run();\n return this.close();\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\nexport async function createLokiLocalState(\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise {\n if (!params.options) {\n params.options = {};\n }\n\n const databaseState = await getLokiDatabase(\n params.databaseName,\n databaseSettings\n );\n\n /**\n * Construct loki indexes from RxJsonSchema indexes.\n * TODO what about compound indexes? Are they possible in lokijs?\n */\n const indices: string[] = [];\n if (params.schema.indexes) {\n params.schema.indexes.forEach(idx => {\n if (!isMaybeReadonlyArray(idx)) {\n indices.push(idx);\n }\n });\n }\n /**\n * LokiJS has no concept of custom primary key, they use a number-id that is generated.\n * To be able to query fast by primary key, we always add an index to the primary.\n */\n const primaryKey = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n indices.push(primaryKey as string);\n\n const lokiCollectionName = params.collectionName + '-' + params.schema.version;\n const collectionOptions: Partial = Object.assign(\n {},\n lokiCollectionName,\n {\n indices: indices as string[],\n unique: [primaryKey]\n } as any,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS\n );\n\n const collection: any = databaseState.database.addCollection(\n lokiCollectionName,\n collectionOptions as any\n );\n databaseState.collections[params.collectionName] = collection;\n const ret: LokiLocalDatabaseState = {\n databaseState,\n collection\n };\n\n return ret;\n}\n\n\nexport async function createLokiStorageInstance(\n storage: RxStorageLoki,\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise> {\n const internals: LokiStorageInternals = {};\n\n const broadcastChannelRefObject: DeepReadonly = {};\n\n\n if (params.multiInstance) {\n const leaderElector = getLokiLeaderElector(\n params.databaseInstanceToken,\n broadcastChannelRefObject,\n params.databaseName\n );\n internals.leaderElector = leaderElector;\n } else {\n // optimisation shortcut, directly create db is non multi instance.\n internals.localState = createLokiLocalState(params, databaseSettings);\n await internals.localState;\n }\n\n const instance = new RxStorageInstanceLoki(\n params.databaseInstanceToken,\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n databaseSettings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_LOKIJS,\n params,\n instance,\n internals.leaderElector ? internals.leaderElector.broadcastChannel : undefined\n );\n\n if (params.multiInstance) {\n /**\n * Clean up the broadcast-channel reference on close()\n */\n const closeBefore = instance.close.bind(instance);\n instance.close = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return closeBefore();\n };\n const removeBefore = instance.remove.bind(instance);\n instance.remove = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return removeBefore();\n };\n\n /**\n * Directly create the localState when/if the db becomes leader.\n */\n ensureNotFalsy(internals.leaderElector)\n .awaitLeadership()\n .then(() => {\n if (!instance.closed) {\n mustUseLocalState(instance);\n }\n });\n }\n\n\n return instance;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-loki.js","names":["_rxjs","require","_index","_rxError","_lokijsHelper","_rxSchemaHelper","_rxStorageHelper","_rxStorageMultiinstance","_rxQueryHelper","instanceId","now","shownNonPremiumLog","RxStorageInstanceLoki","exports","databaseInstanceToken","storage","databaseName","collectionName","schema","internals","options","databaseSettings","changes$","Subject","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","OPEN_LOKIJS_STORAGE_INSTANCES","add","leaderElector","copiedSelf","bulkWrite","bind","changeStream","cleanup","close","query","count","findDocumentsById","conflictResultionTasks","getAttachmentData","remove","resolveConflictResultionTask","awaitLeadership","then","ensureNotFalsy","broadcastChannel","addEventListener","msg","handleRemoteRequest","catch","_proto","prototype","documentWrites","context","RXDB_UTILS_GLOBAL","premium","defaultHashSha256","PREMIUM_FLAG_HASH","console","warn","join","length","newRxError","args","localState","mustUseLocalState","requestRemoteInstance","ret","success","error","docsInDb","Map","docsInDbWithLokiKey","forEach","writeRow","id","document","documentInDb","collection","by","set","stripLokiKey","categorized","categorizeBulkWriteRows","errors","bulkInsertDocs","insert","flatClone","push","bulkUpdateDocs","docId","documentInDbWithLokiKey","getFromMapOrThrow","writeDoc","Object","assign","$loki","update","databaseState","saveQueue","addWrite","eventBulk","events","lastState","newestRow","checkpoint","lwt","_meta","endTime","next","ids","deleted","_deleted","preparedQueryOriginal","preparedQuery","selector","transformRegexToRegExp","skip","limit","Infinity","skipPlusLimit","mustRunMatcher","hasDeepProperty","lokiQuery","chain","find","sort","getLokiSortComparator","foundDocuments","data","map","lokiDoc","queryMatcher","getQueryMatcher","filter","d","slice","documents","result","mode","_documentId","_attachmentId","_digest","Error","asObservable","minimumDeletedTime","deleteAmountPerRun","maxDeletionTime","$lt","closed","complete","delete","dbState","getLokiDatabase","run","closeLokiCollections","database","removeCollection","name","_taskSolution","createLokiLocalState","params","indices","indexes","idx","isMaybeReadonlyArray","lokiCollectionName","version","collectionOptions","unique","LOKIJS_COLLECTION_DEFAULT_OPTIONS","addCollection","collections","createLokiStorageInstance","broadcastChannelRefObject","multiInstance","getLokiLeaderElector","instance","addRxStorageMultiInstanceSupport","RX_STORAGE_NAME_LOKIJS","undefined","closeBefore","removeBroadcastChannelReference","removeBefore"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-instance-loki.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n flatClone,\n now,\n ensureNotFalsy,\n isMaybeReadonlyArray,\n getFromMapOrThrow,\n hasDeepProperty,\n RXDB_UTILS_GLOBAL,\n defaultHashSha256,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport type {\n RxStorageInstance,\n LokiSettings,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n MangoQuery,\n LokiStorageInternals,\n RxStorageInstanceCreationParams,\n LokiDatabaseSettings,\n LokiLocalDatabaseState,\n EventBulk,\n StringKeys,\n DeepReadonly,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport {\n closeLokiCollections,\n getLokiDatabase,\n OPEN_LOKIJS_STORAGE_INSTANCES,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS,\n stripLokiKey,\n getLokiSortComparator,\n getLokiLeaderElector,\n requestRemoteInstance,\n mustUseLocalState,\n handleRemoteRequest,\n RX_STORAGE_NAME_LOKIJS,\n transformRegexToRegExp\n} from './lokijs-helper.ts';\nimport type { RxStorageLoki } from './rx-storage-lokijs.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n addRxStorageMultiInstanceSupport,\n removeBroadcastChannelReference\n} from '../../rx-storage-multiinstance.ts';\nimport { getQueryMatcher } from '../../rx-query-helper.ts';\n\nlet instanceId = now();\nlet shownNonPremiumLog = false;\n\nexport class RxStorageInstanceLoki implements RxStorageInstance<\n RxDocType,\n LokiStorageInternals,\n LokiSettings,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n\n public closed?: Promise;\n\n constructor(\n public readonly databaseInstanceToken: string,\n public readonly storage: RxStorageLoki,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: LokiStorageInternals,\n public readonly options: Readonly,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n OPEN_LOKIJS_STORAGE_INSTANCES.add(this);\n if (this.internals.leaderElector) {\n\n\n /**\n * To run handleRemoteRequest(),\n * the instance will call its own methods.\n * But these methods could have already been swapped out by a RxStorageWrapper\n * so we must store the original methods here and use them instead.\n */\n const copiedSelf: RxStorageInstance = {\n bulkWrite: this.bulkWrite.bind(this),\n changeStream: this.changeStream.bind(this),\n cleanup: this.cleanup.bind(this),\n close: this.close.bind(this),\n query: this.query.bind(this),\n count: this.count.bind(this),\n findDocumentsById: this.findDocumentsById.bind(this),\n collectionName: this.collectionName,\n databaseName: this.databaseName,\n conflictResultionTasks: this.conflictResultionTasks.bind(this),\n getAttachmentData: this.getAttachmentData.bind(this),\n internals: this.internals,\n options: this.options,\n remove: this.remove.bind(this),\n resolveConflictResultionTask: this.resolveConflictResultionTask.bind(this),\n schema: this.schema\n };\n\n this.internals.leaderElector.awaitLeadership().then(() => {\n // this instance is leader now, so it has to reply to queries from other instances\n ensureNotFalsy(this.internals.leaderElector).broadcastChannel\n .addEventListener('message', (msg) => handleRemoteRequest(copiedSelf as any, msg));\n }).catch(() => { });\n }\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free LokiJS based RxStorage implementation from RxDB https://rxdb.info/rx-storage-lokijs.html?console=loki ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=loki ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n if (documentWrites.length === 0) {\n throw newRxError('P2', {\n args: {\n documentWrites\n }\n });\n }\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'bulkWrite', [documentWrites]);\n }\n\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const docsInDb: Map[StringKeys], RxDocumentData> = new Map();\n const docsInDbWithLokiKey: Map<\n RxDocumentData[StringKeys],\n RxDocumentData & { $loki: number; }\n > = new Map();\n documentWrites.forEach(writeRow => {\n const id = writeRow.document[this.primaryPath];\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (documentInDb) {\n docsInDbWithLokiKey.set(id as any, documentInDb);\n docsInDb.set(id as any, stripLokiKey(documentInDb));\n }\n });\n\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDb,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n categorized.bulkInsertDocs.forEach(writeRow => {\n localState.collection.insert(flatClone(writeRow.document));\n ret.success.push(writeRow.document);\n });\n categorized.bulkUpdateDocs.forEach(writeRow => {\n const docId = writeRow.document[this.primaryPath];\n const documentInDbWithLokiKey = getFromMapOrThrow(docsInDbWithLokiKey, docId as any);\n const writeDoc: any = Object.assign(\n {},\n writeRow.document,\n {\n $loki: documentInDbWithLokiKey.$loki\n }\n );\n localState.collection.update(writeDoc);\n ret.success.push(writeRow.document);\n });\n localState.databaseState.saveQueue.addWrite();\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n async findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'findDocumentsById', [ids, deleted]);\n }\n\n const ret: RxDocumentData[] = [];\n ids.forEach(id => {\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(stripLokiKey(documentInDb));\n }\n });\n return ret;\n }\n async query(preparedQueryOriginal: PreparedQuery): Promise> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'query', [preparedQueryOriginal]);\n }\n\n let preparedQuery = ensureNotFalsy(preparedQueryOriginal.query);\n if (preparedQuery.selector) {\n preparedQuery = flatClone(preparedQuery);\n preparedQuery.selector = transformRegexToRegExp(preparedQuery.selector);\n }\n\n const query = preparedQueryOriginal.query;\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n /**\n * LokiJS is not able to give correct results for some\n * operators, so we have to check all documents in that case\n * and laster apply skip and limit manually.\n * @link https://github.com/pubkey/rxdb/issues/5320\n */\n let mustRunMatcher = false;\n if (hasDeepProperty(preparedQuery.selector, '$in')) {\n mustRunMatcher = true;\n }\n\n\n let lokiQuery = localState.collection\n .chain()\n .find(mustRunMatcher ? {} : preparedQuery.selector);\n\n if (preparedQuery.sort) {\n lokiQuery = lokiQuery.sort(getLokiSortComparator(this.schema, preparedQuery));\n }\n\n\n let foundDocuments = lokiQuery.data().map((lokiDoc: any) => stripLokiKey(lokiDoc));\n\n\n /**\n * LokiJS returned wrong results on some queries\n * with complex indexes. Therefore we run the query-match\n * over all result docs to patch this bug.\n * TODO create an issue at the LokiJS repository.\n */\n const queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery as any\n );\n foundDocuments = foundDocuments.filter((d: any) => queryMatcher(d));\n\n // always apply offset and limit like this, because\n // sylvieQuery.offset() and sylvieQuery.limit() results were inconsistent\n foundDocuments = foundDocuments.slice(skip, skipPlusLimit);\n\n return {\n documents: foundDocuments\n };\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(_documentId: string, _attachmentId: string, _digest: string): Promise {\n throw new Error('Attachments are not implemented in the lokijs RxStorage. Make a pull request.');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'cleanup', [minimumDeletedTime]);\n }\n\n const deleteAmountPerRun = 10;\n const maxDeletionTime = now() - minimumDeletedTime;\n const query = localState.collection\n .chain()\n .find({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n }).limit(deleteAmountPerRun);\n const foundDocuments = query.data();\n if (foundDocuments.length > 0) {\n localState.collection.remove(foundDocuments);\n localState.databaseState.saveQueue.addWrite();\n }\n\n return foundDocuments.length !== deleteAmountPerRun;\n }\n\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n OPEN_LOKIJS_STORAGE_INSTANCES.delete(this);\n if (this.internals.localState) {\n const localState = await this.internals.localState;\n const dbState = await getLokiDatabase(\n this.databaseName,\n this.databaseSettings\n );\n await dbState.saveQueue.run();\n await closeLokiCollections(\n this.databaseName,\n [\n localState.collection\n ]\n );\n }\n })();\n return this.closed;\n }\n async remove(): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'remove', []);\n }\n localState.databaseState.database.removeCollection(localState.collection.name);\n await localState.databaseState.saveQueue.run();\n return this.close();\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\nexport async function createLokiLocalState(\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise {\n if (!params.options) {\n params.options = {};\n }\n\n const databaseState = await getLokiDatabase(\n params.databaseName,\n databaseSettings\n );\n\n /**\n * Construct loki indexes from RxJsonSchema indexes.\n * TODO what about compound indexes? Are they possible in lokijs?\n */\n const indices: string[] = [];\n if (params.schema.indexes) {\n params.schema.indexes.forEach(idx => {\n if (!isMaybeReadonlyArray(idx)) {\n indices.push(idx);\n }\n });\n }\n /**\n * LokiJS has no concept of custom primary key, they use a number-id that is generated.\n * To be able to query fast by primary key, we always add an index to the primary.\n */\n const primaryKey = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n indices.push(primaryKey as string);\n\n const lokiCollectionName = params.collectionName + '-' + params.schema.version;\n const collectionOptions: Partial = Object.assign(\n {},\n lokiCollectionName,\n {\n indices: indices as string[],\n unique: [primaryKey]\n } as any,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS\n );\n\n const collection: any = databaseState.database.addCollection(\n lokiCollectionName,\n collectionOptions as any\n );\n databaseState.collections[params.collectionName] = collection;\n const ret: LokiLocalDatabaseState = {\n databaseState,\n collection\n };\n\n return ret;\n}\n\n\nexport async function createLokiStorageInstance(\n storage: RxStorageLoki,\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise> {\n const internals: LokiStorageInternals = {};\n\n const broadcastChannelRefObject: DeepReadonly = {};\n\n\n if (params.multiInstance) {\n const leaderElector = getLokiLeaderElector(\n params.databaseInstanceToken,\n broadcastChannelRefObject,\n params.databaseName\n );\n internals.leaderElector = leaderElector;\n } else {\n // optimisation shortcut, directly create db is non multi instance.\n internals.localState = createLokiLocalState(params, databaseSettings);\n await internals.localState;\n }\n\n const instance = new RxStorageInstanceLoki(\n params.databaseInstanceToken,\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n databaseSettings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_LOKIJS,\n params,\n instance,\n internals.leaderElector ? internals.leaderElector.broadcastChannel : undefined\n );\n\n if (params.multiInstance) {\n /**\n * Clean up the broadcast-channel reference on close()\n */\n const closeBefore = instance.close.bind(instance);\n instance.close = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return closeBefore();\n };\n const removeBefore = instance.remove.bind(instance);\n instance.remove = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return removeBefore();\n };\n\n /**\n * Directly create the localState when/if the db becomes leader.\n */\n ensureNotFalsy(internals.leaderElector)\n .awaitLeadership()\n .then(() => {\n if (!instance.closed) {\n mustUseLocalState(instance);\n }\n });\n }\n\n\n return instance;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-lokijs/rx-storage-lokijs.js.map b/dist/cjs/plugins/storage-lokijs/rx-storage-lokijs.js.map index cefce973e5a..17b46bedc91 100644 --- a/dist/cjs/plugins/storage-lokijs/rx-storage-lokijs.js.map +++ b/dist/cjs/plugins/storage-lokijs/rx-storage-lokijs.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-lokijs.js","names":["_rxStorageInstanceLoki","require","_lokijsHelper","_rxStorageHelper","_utilsRxdbVersion","RxStorageLoki","exports","databaseSettings","name","RX_STORAGE_NAME_LOKIJS","rxdbVersion","RXDB_VERSION","leaderElectorByLokiDbName","Map","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createLokiStorageInstance","getRxStorageLoki","storage"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-lokijs.ts"],"sourcesContent":["import type {\n LokiDatabaseSettings,\n LokiSettings,\n LokiStorageInternals,\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n createLokiStorageInstance,\n RxStorageInstanceLoki\n} from './rx-storage-instance-loki.ts';\nimport { RX_STORAGE_NAME_LOKIJS } from './lokijs-helper.ts';\nimport type { LeaderElector } from 'broadcast-channel';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageLoki implements RxStorage {\n public name = RX_STORAGE_NAME_LOKIJS;\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Create one leader elector by db name.\n * This is done inside of the storage, not globally\n * to make it easier to test multi-tab behavior.\n */\n public leaderElectorByLokiDbName: Map = new Map();\n\n constructor(\n public databaseSettings: LokiDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createLokiStorageInstance(this, params, this.databaseSettings);\n }\n}\n\n/**\n * @deprecated The lokijs RxStorage is deprecated, more info at:\n * @link https://rxdb.info/rx-storage-lokijs.html\n */\nexport function getRxStorageLoki(\n databaseSettings: LokiDatabaseSettings = {}\n): RxStorageLoki {\n const storage = new RxStorageLoki(databaseSettings);\n return storage;\n}\n"],"mappings":";;;;;;;AAOA,IAAAA,sBAAA,GAAAC,OAAA;AAIA,IAAAC,aAAA,GAAAD,OAAA;AAGA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAEjDI,aAAa,GAAAC,OAAA,CAAAD,aAAA;EAItB;AACJ;AACA;AACA;AACA;;EAUI,SAAAA,cACWE,gBAAsC,EAC/C;IAAA,KAnBKC,IAAI,GAAGC,oCAAsB;IAAA,KACpBC,WAAW,GAAGC,8BAAY;IAAA,KAOnCC,yBAAyB,GAO3B,IAAIC,GAAG,CAAC,CAAC;IAAA,KAGHN,gBAAsC,GAAtCA,gBAAsC;EAC7C;EAAC,IAAAO,MAAA,GAAAT,aAAA,CAAAU,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAgE,EACvB;IACzC,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,gDAAyB,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACV,gBAAgB,CAAC;EACzE,CAAC;EAAA,OAAAF,aAAA;AAAA;AAGL;AACA;AACA;AACA;AACO,SAASe,gBAAgBA,CAC5Bb,gBAAsC,GAAG,CAAC,CAAC,EAC9B;EACb,IAAMc,OAAO,GAAG,IAAIhB,aAAa,CAACE,gBAAgB,CAAC;EACnD,OAAOc,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-lokijs.js","names":["_rxStorageInstanceLoki","require","_lokijsHelper","_rxStorageHelper","_utilsRxdbVersion","RxStorageLoki","exports","databaseSettings","name","RX_STORAGE_NAME_LOKIJS","rxdbVersion","RXDB_VERSION","leaderElectorByLokiDbName","Map","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createLokiStorageInstance","getRxStorageLoki","storage"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-lokijs.ts"],"sourcesContent":["import type {\n LokiDatabaseSettings,\n LokiSettings,\n LokiStorageInternals,\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n createLokiStorageInstance,\n RxStorageInstanceLoki\n} from './rx-storage-instance-loki.ts';\nimport { RX_STORAGE_NAME_LOKIJS } from './lokijs-helper.ts';\nimport type { LeaderElector } from 'broadcast-channel';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageLoki implements RxStorage {\n public name = RX_STORAGE_NAME_LOKIJS;\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Create one leader elector by db name.\n * This is done inside of the storage, not globally\n * to make it easier to test multi-tab behavior.\n */\n public leaderElectorByLokiDbName: Map = new Map();\n\n constructor(\n public databaseSettings: LokiDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createLokiStorageInstance(this, params, this.databaseSettings);\n }\n}\n\n/**\n * @deprecated The lokijs RxStorage is deprecated, more info at:\n * @link https://rxdb.info/rx-storage-lokijs.html\n */\nexport function getRxStorageLoki(\n databaseSettings: LokiDatabaseSettings = {}\n): RxStorageLoki {\n const storage = new RxStorageLoki(databaseSettings);\n return storage;\n}\n"],"mappings":";;;;;;;AAOA,IAAAA,sBAAA,GAAAC,OAAA;AAIA,IAAAC,aAAA,GAAAD,OAAA;AAGA,IAAAE,gBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAEjDI,aAAa,GAAAC,OAAA,CAAAD,aAAA;EAItB;AACJ;AACA;AACA;AACA;;EAUI,SAAAA,cACWE,gBAAsC,EAC/C;IAAA,KAnBKC,IAAI,GAAGC,oCAAsB;IAAA,KACpBC,WAAW,GAAGC,8BAAY;IAAA,KAOnCC,yBAAyB,GAO3B,IAAIC,GAAG,CAAC,CAAC;IAAA,KAGHN,gBAAsC,GAAtCA,gBAAsC;EAC7C;EAAC,IAAAO,MAAA,GAAAT,aAAA,CAAAU,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAgE,EACvB;IACzC,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,gDAAyB,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACV,gBAAgB,CAAC;EACzE,CAAC;EAAA,OAAAF,aAAA;AAAA;AAGL;AACA;AACA;AACA;AACO,SAASe,gBAAgBA,CAC5Bb,gBAAsC,GAAG,CAAC,CAAC,EAC9B;EACb,IAAMc,OAAO,GAAG,IAAIhB,aAAa,CAACE,gBAAgB,CAAC;EACnD,OAAOc,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js b/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js index a4bbc942fb6..d05411bcd14 100644 --- a/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js +++ b/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js @@ -1,12 +1,10 @@ "use strict"; -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RxStorageInstanceMemory = exports.OPEN_MEMORY_INSTANCES = void 0; exports.createMemoryStorageInstance = createMemoryStorageInstance; -var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError")); var _rxjs = require("rxjs"); var _customIndex = require("../../custom-index.js"); var _rxSchemaHelper = require("../../rx-schema-helper.js"); diff --git a/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map b/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map index 042df16dc77..29414fd4aa5 100644 --- a/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map +++ b/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-memory.js","names":["_rxjs","require","_customIndex","_rxSchemaHelper","_rxStorageHelper","_index","_binarySearchBounds","_memoryHelper","_memoryIndexes","_rxQueryHelper","OPEN_MEMORY_INSTANCES","exports","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","ensureNotRemoved","documentsById","documents","categorized","categorizeBulkWriteRows","error","errors","success","Array","bulkInsertDocs","length","awaitMe","Promise","resolve","i","writeRow","doc","document","bulkUpdateDocs","push","set","ensurePersistenceTask","ensurePersistenceIdlePromise","requestIdlePromiseNoQueue","then","undefined","eventBulk","events","lastState","ensureNotFalsy","newestRow","checkpoint","id","lwt","_meta","endTime","now","changes$","next","stateByIndex","Object","values","byIndex","docId","putWriteRowToState","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","attachmentMapKey","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","_deleted","query","preparedQuery","queryPlan","skip","limit","Infinity","skipPlusLimit","queryMatcher","selectorSatisfiedByIndex","getQueryMatcher","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","getStartIndexStringFromLowerBound","upperBound","endKeys","upperBoundString","getStartIndexStringFromUpperBound","indexName","getMemoryIndexName","Error","docsWithIndex","indexOfLower","inclusiveStart","boundGE","boundGT","compareDocsWithIndex","indexOfUpper","inclusiveEnd","boundLE","boundLT","rows","done","currentRow","currentDoc","sortComparator","getSortComparator","sort","slice","count","result","mode","cleanup","minimumDeletedTime","maxDeletionTime","removeDocFromState","PROMISE_RESOLVE_TRUE","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","getMemoryCollectionKey","version","close","PROMISE_RESOLVE_VOID","refCount","conflictResultionTasks","conflictResultionTasks$","resolveConflictResultionTask","_taskSolution","createMemoryStorageInstance","params","collectionKey","randomCouchString","Map","Subject","addIndexesToInternalsState","deepEqual","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\n Observable,\n Subject\n} from 'rxjs';\nimport {\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n QueryMatcher,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n deepEqual,\n ensureNotFalsy,\n now,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID,\n randomCouchString,\n requestIdlePromiseNoQueue\n} from '../../plugins/utils/index.ts';\nimport {\n boundGE,\n boundGT,\n boundLE,\n boundLT\n} from './binary-search-bounds.ts';\nimport {\n attachmentMapKey,\n compareDocsWithIndex,\n ensureNotRemoved,\n getMemoryCollectionKey,\n putWriteRowToState,\n removeDocFromState\n} from './memory-helper.ts';\nimport {\n addIndexesToInternalsState,\n getMemoryIndexName\n} from './memory-indexes.ts';\nimport type {\n MemoryStorageInternals,\n RxStorageMemory,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageMemorySettings\n} from './memory-types.ts';\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\n\n/**\n * Used in tests to ensure everything\n * is closed correctly\n */\nexport const OPEN_MEMORY_INSTANCES = new Set>();\n\nexport class RxStorageInstanceMemory implements RxStorageInstance<\n RxDocType,\n MemoryStorageInternals,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public closed = false;\n\n /**\n * Used by some plugins and storage wrappers\n * to find out details about the internals of a write operation.\n * For example if you want to know which documents really have been replaced\n * or newly inserted.\n */\n public categorizedByWriteInput = new WeakMap[], CategorizeBulkWriteRowsOutput>();\n\n constructor(\n public readonly storage: RxStorageMemory,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MemoryStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMemorySettings,\n public readonly devMode: boolean\n ) {\n OPEN_MEMORY_INSTANCES.add(this);\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentsById,\n documentWrites,\n context\n );\n const error = categorized.errors;\n let success: RxDocumentData[] = new Array(categorized.bulkInsertDocs.length);\n /**\n * @performance\n * We have to return a Promise but we do not want to wait\n * one tick, so we directly create the promise\n * which makes it likely to be already resolved later.\n */\n const awaitMe = Promise.resolve({ success, error });\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n success[i] = doc;\n }\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n success.push(doc);\n }\n\n this.categorizedByWriteInput.set(documentWrites, categorized);\n this.internals.ensurePersistenceTask = categorized;\n\n if (!this.internals.ensurePersistenceIdlePromise) {\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\n this.internals.ensurePersistenceIdlePromise = undefined;\n this.ensurePersistence();\n });\n }\n\n /**\n * Important: The events must be emitted AFTER the persistence\n * task has been added.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n internals.changes$.next(categorized.eventBulk);\n }\n return awaitMe;\n }\n\n /**\n * Instead of directly inserting the documents into all indexes,\n * we do it lazy in the background. This gives the application time\n * to directly work with the write-result and to do stuff like rendering DOM\n * notes and processing RxDB queries.\n * Then in some later time, or just before the next read/write,\n * it is ensured that the indexes have been written.\n */\n public ensurePersistence() {\n if (\n !this.internals.ensurePersistenceTask\n ) {\n return;\n }\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n const categorized = this.internals.ensurePersistenceTask;\n this.internals.ensurePersistenceTask = undefined;\n\n /**\n * Do inserts/updates\n */\n const stateByIndex = Object.values(this.internals.byIndex);\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n undefined\n );\n }\n\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n documentsById.get(docId as any)\n );\n }\n\n /**\n * Handle attachments\n */\n if (this.schema.attachments) {\n const attachmentsMap = internals.attachments;\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n if (this.schema.attachments) {\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentsMap.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n }\n }\n }\n\n findDocumentsById(\n docIds: string[],\n withDeleted: boolean\n ): Promise[]> {\n this.ensurePersistence();\n const documentsById = this.internals.documents;\n const ret: RxDocumentData[] = [];\n if (documentsById.size === 0) {\n return Promise.resolve(ret);\n }\n for (let i = 0; i < docIds.length; ++i) {\n const docId = docIds[i];\n const docInDb = documentsById.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n }\n return Promise.resolve(ret);\n }\n\n query(\n preparedQuery: PreparedQuery\n ): Promise> {\n this.ensurePersistence();\n\n const queryPlan = preparedQuery.queryPlan;\n const query = preparedQuery.query;\n\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n let queryMatcher: QueryMatcher> | false = false;\n if (!queryPlan.selectorSatisfiedByIndex) {\n queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery.query\n );\n }\n\n const queryPlanFields: string[] = queryPlan.index;\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\n const index: string[] | undefined = queryPlanFields;\n const lowerBound: any[] = queryPlan.startKeys;\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n lowerBound\n );\n\n let upperBound: any[] = queryPlan.endKeys;\n upperBound = upperBound;\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n upperBound\n );\n const indexName = getMemoryIndexName(index);\n\n if (!this.internals.byIndex[indexName]) {\n throw new Error('index does not exist ' + indexName);\n }\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n\n\n let indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\n docsWithIndex,\n [\n upperBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let rows: RxDocumentData[] = [];\n let done = false;\n while (!done) {\n const currentRow = docsWithIndex[indexOfLower];\n if (\n !currentRow ||\n indexOfLower > indexOfUpper\n ) {\n break;\n }\n const currentDoc = currentRow[1];\n\n if (!queryMatcher || queryMatcher(currentDoc)) {\n rows.push(currentDoc);\n }\n\n if (\n (rows.length >= skipPlusLimit && !mustManuallyResort)\n ) {\n done = true;\n }\n\n indexOfLower++;\n }\n\n if (mustManuallyResort) {\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\n rows = rows.sort(sortComparator);\n }\n\n // apply skip and limit boundaries.\n rows = rows.slice(skip, skipPlusLimit);\n return Promise.resolve({\n documents: rows\n });\n }\n\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n this.ensurePersistence();\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n cleanup(minimumDeletedTime: number): Promise {\n this.ensurePersistence();\n const maxDeletionTime = now() - minimumDeletedTime;\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\n const indexName = getMemoryIndexName(index);\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n 0,\n ''\n ]\n );\n\n let indexOfLower = boundGT(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let done = false;\n while (!done) {\n const currentDoc = docsWithIndex[indexOfLower];\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\n done = true;\n } else {\n removeDocFromState(\n this.primaryPath as any,\n this.schema,\n this.internals,\n currentDoc[1]\n );\n indexOfLower++;\n }\n }\n return PROMISE_RESOLVE_TRUE;\n }\n\n getAttachmentData(\n documentId: string,\n attachmentId: string,\n digest: string\n ): Promise {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const key = attachmentMapKey(documentId, attachmentId);\n const data = this.internals.attachments.get(key);\n\n if (\n !digest ||\n !data ||\n data.digest !== digest\n ) {\n throw new Error('attachment does not exist: ' + key);\n }\n return Promise.resolve(data.writeData.data);\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotRemoved(this);\n return this.internals.changes$.asObservable();\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('closed');\n }\n this.ensurePersistence();\n ensureNotRemoved(this);\n\n this.internals.removed = true;\n this.storage.collectionStates.delete(\n getMemoryCollectionKey(\n this.databaseName,\n this.collectionName,\n this.schema.version\n )\n );\n await this.close();\n }\n\n close(): Promise {\n OPEN_MEMORY_INSTANCES.delete(this);\n\n this.ensurePersistence();\n if (this.closed) {\n return PROMISE_RESOLVE_VOID;\n }\n this.closed = true;\n\n this.internals.refCount = this.internals.refCount - 1;\n return PROMISE_RESOLVE_VOID;\n }\n\n conflictResultionTasks(): Observable> {\n return this.internals.conflictResultionTasks$.asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\nexport function createMemoryStorageInstance(\n storage: RxStorageMemory,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMemorySettings\n): Promise> {\n const collectionKey = getMemoryCollectionKey(\n params.databaseName,\n params.collectionName,\n params.schema.version\n );\n\n let internals = storage.collectionStates.get(collectionKey);\n if (!internals) {\n internals = {\n id: randomCouchString(5),\n schema: params.schema,\n removed: false,\n refCount: 1,\n documents: new Map(),\n attachments: params.schema.attachments ? new Map() : undefined as any,\n byIndex: {},\n conflictResultionTasks$: new Subject(),\n changes$: new Subject()\n };\n addIndexesToInternalsState(internals, params.schema);\n storage.collectionStates.set(collectionKey, internals);\n } else {\n /**\n * Ensure that the storage was not already\n * created with a different schema.\n * This is very important because if this check\n * does not exist here, we have hard-to-debug problems\n * downstream.\n */\n if (\n params.devMode &&\n !deepEqual(internals.schema, params.schema)\n ) {\n throw new Error('storage was already created with a different schema');\n }\n internals.refCount = internals.refCount + 1;\n }\n\n const instance = new RxStorageInstanceMemory(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-memory.js","names":["_rxjs","require","_customIndex","_rxSchemaHelper","_rxStorageHelper","_index","_binarySearchBounds","_memoryHelper","_memoryIndexes","_rxQueryHelper","OPEN_MEMORY_INSTANCES","exports","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","ensureNotRemoved","documentsById","documents","categorized","categorizeBulkWriteRows","error","errors","success","Array","bulkInsertDocs","length","awaitMe","Promise","resolve","i","writeRow","doc","document","bulkUpdateDocs","push","set","ensurePersistenceTask","ensurePersistenceIdlePromise","requestIdlePromiseNoQueue","then","undefined","eventBulk","events","lastState","ensureNotFalsy","newestRow","checkpoint","id","lwt","_meta","endTime","now","changes$","next","stateByIndex","Object","values","byIndex","docId","putWriteRowToState","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","attachmentMapKey","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","_deleted","query","preparedQuery","queryPlan","skip","limit","Infinity","skipPlusLimit","queryMatcher","selectorSatisfiedByIndex","getQueryMatcher","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","getStartIndexStringFromLowerBound","upperBound","endKeys","upperBoundString","getStartIndexStringFromUpperBound","indexName","getMemoryIndexName","Error","docsWithIndex","indexOfLower","inclusiveStart","boundGE","boundGT","compareDocsWithIndex","indexOfUpper","inclusiveEnd","boundLE","boundLT","rows","done","currentRow","currentDoc","sortComparator","getSortComparator","sort","slice","count","result","mode","cleanup","minimumDeletedTime","maxDeletionTime","removeDocFromState","PROMISE_RESOLVE_TRUE","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","getMemoryCollectionKey","version","close","PROMISE_RESOLVE_VOID","refCount","conflictResultionTasks","conflictResultionTasks$","resolveConflictResultionTask","_taskSolution","createMemoryStorageInstance","params","collectionKey","randomCouchString","Map","Subject","addIndexesToInternalsState","deepEqual","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\n Observable,\n Subject\n} from 'rxjs';\nimport {\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n QueryMatcher,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n deepEqual,\n ensureNotFalsy,\n now,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID,\n randomCouchString,\n requestIdlePromiseNoQueue\n} from '../../plugins/utils/index.ts';\nimport {\n boundGE,\n boundGT,\n boundLE,\n boundLT\n} from './binary-search-bounds.ts';\nimport {\n attachmentMapKey,\n compareDocsWithIndex,\n ensureNotRemoved,\n getMemoryCollectionKey,\n putWriteRowToState,\n removeDocFromState\n} from './memory-helper.ts';\nimport {\n addIndexesToInternalsState,\n getMemoryIndexName\n} from './memory-indexes.ts';\nimport type {\n MemoryStorageInternals,\n RxStorageMemory,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageMemorySettings\n} from './memory-types.ts';\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\n\n/**\n * Used in tests to ensure everything\n * is closed correctly\n */\nexport const OPEN_MEMORY_INSTANCES = new Set>();\n\nexport class RxStorageInstanceMemory implements RxStorageInstance<\n RxDocType,\n MemoryStorageInternals,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public closed = false;\n\n /**\n * Used by some plugins and storage wrappers\n * to find out details about the internals of a write operation.\n * For example if you want to know which documents really have been replaced\n * or newly inserted.\n */\n public categorizedByWriteInput = new WeakMap[], CategorizeBulkWriteRowsOutput>();\n\n constructor(\n public readonly storage: RxStorageMemory,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MemoryStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMemorySettings,\n public readonly devMode: boolean\n ) {\n OPEN_MEMORY_INSTANCES.add(this);\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentsById,\n documentWrites,\n context\n );\n const error = categorized.errors;\n let success: RxDocumentData[] = new Array(categorized.bulkInsertDocs.length);\n /**\n * @performance\n * We have to return a Promise but we do not want to wait\n * one tick, so we directly create the promise\n * which makes it likely to be already resolved later.\n */\n const awaitMe = Promise.resolve({ success, error });\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n success[i] = doc;\n }\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n success.push(doc);\n }\n\n this.categorizedByWriteInput.set(documentWrites, categorized);\n this.internals.ensurePersistenceTask = categorized;\n\n if (!this.internals.ensurePersistenceIdlePromise) {\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\n this.internals.ensurePersistenceIdlePromise = undefined;\n this.ensurePersistence();\n });\n }\n\n /**\n * Important: The events must be emitted AFTER the persistence\n * task has been added.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n internals.changes$.next(categorized.eventBulk);\n }\n return awaitMe;\n }\n\n /**\n * Instead of directly inserting the documents into all indexes,\n * we do it lazy in the background. This gives the application time\n * to directly work with the write-result and to do stuff like rendering DOM\n * notes and processing RxDB queries.\n * Then in some later time, or just before the next read/write,\n * it is ensured that the indexes have been written.\n */\n public ensurePersistence() {\n if (\n !this.internals.ensurePersistenceTask\n ) {\n return;\n }\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n const categorized = this.internals.ensurePersistenceTask;\n this.internals.ensurePersistenceTask = undefined;\n\n /**\n * Do inserts/updates\n */\n const stateByIndex = Object.values(this.internals.byIndex);\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n undefined\n );\n }\n\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n documentsById.get(docId as any)\n );\n }\n\n /**\n * Handle attachments\n */\n if (this.schema.attachments) {\n const attachmentsMap = internals.attachments;\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n if (this.schema.attachments) {\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentsMap.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n }\n }\n }\n\n findDocumentsById(\n docIds: string[],\n withDeleted: boolean\n ): Promise[]> {\n this.ensurePersistence();\n const documentsById = this.internals.documents;\n const ret: RxDocumentData[] = [];\n if (documentsById.size === 0) {\n return Promise.resolve(ret);\n }\n for (let i = 0; i < docIds.length; ++i) {\n const docId = docIds[i];\n const docInDb = documentsById.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n }\n return Promise.resolve(ret);\n }\n\n query(\n preparedQuery: PreparedQuery\n ): Promise> {\n this.ensurePersistence();\n\n const queryPlan = preparedQuery.queryPlan;\n const query = preparedQuery.query;\n\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n let queryMatcher: QueryMatcher> | false = false;\n if (!queryPlan.selectorSatisfiedByIndex) {\n queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery.query\n );\n }\n\n const queryPlanFields: string[] = queryPlan.index;\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\n const index: string[] | undefined = queryPlanFields;\n const lowerBound: any[] = queryPlan.startKeys;\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n lowerBound\n );\n\n let upperBound: any[] = queryPlan.endKeys;\n upperBound = upperBound;\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n upperBound\n );\n const indexName = getMemoryIndexName(index);\n\n if (!this.internals.byIndex[indexName]) {\n throw new Error('index does not exist ' + indexName);\n }\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n\n\n let indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\n docsWithIndex,\n [\n upperBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let rows: RxDocumentData[] = [];\n let done = false;\n while (!done) {\n const currentRow = docsWithIndex[indexOfLower];\n if (\n !currentRow ||\n indexOfLower > indexOfUpper\n ) {\n break;\n }\n const currentDoc = currentRow[1];\n\n if (!queryMatcher || queryMatcher(currentDoc)) {\n rows.push(currentDoc);\n }\n\n if (\n (rows.length >= skipPlusLimit && !mustManuallyResort)\n ) {\n done = true;\n }\n\n indexOfLower++;\n }\n\n if (mustManuallyResort) {\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\n rows = rows.sort(sortComparator);\n }\n\n // apply skip and limit boundaries.\n rows = rows.slice(skip, skipPlusLimit);\n return Promise.resolve({\n documents: rows\n });\n }\n\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n this.ensurePersistence();\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n cleanup(minimumDeletedTime: number): Promise {\n this.ensurePersistence();\n const maxDeletionTime = now() - minimumDeletedTime;\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\n const indexName = getMemoryIndexName(index);\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n 0,\n ''\n ]\n );\n\n let indexOfLower = boundGT(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let done = false;\n while (!done) {\n const currentDoc = docsWithIndex[indexOfLower];\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\n done = true;\n } else {\n removeDocFromState(\n this.primaryPath as any,\n this.schema,\n this.internals,\n currentDoc[1]\n );\n indexOfLower++;\n }\n }\n return PROMISE_RESOLVE_TRUE;\n }\n\n getAttachmentData(\n documentId: string,\n attachmentId: string,\n digest: string\n ): Promise {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const key = attachmentMapKey(documentId, attachmentId);\n const data = this.internals.attachments.get(key);\n\n if (\n !digest ||\n !data ||\n data.digest !== digest\n ) {\n throw new Error('attachment does not exist: ' + key);\n }\n return Promise.resolve(data.writeData.data);\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotRemoved(this);\n return this.internals.changes$.asObservable();\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('closed');\n }\n this.ensurePersistence();\n ensureNotRemoved(this);\n\n this.internals.removed = true;\n this.storage.collectionStates.delete(\n getMemoryCollectionKey(\n this.databaseName,\n this.collectionName,\n this.schema.version\n )\n );\n await this.close();\n }\n\n close(): Promise {\n OPEN_MEMORY_INSTANCES.delete(this);\n\n this.ensurePersistence();\n if (this.closed) {\n return PROMISE_RESOLVE_VOID;\n }\n this.closed = true;\n\n this.internals.refCount = this.internals.refCount - 1;\n return PROMISE_RESOLVE_VOID;\n }\n\n conflictResultionTasks(): Observable> {\n return this.internals.conflictResultionTasks$.asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\nexport function createMemoryStorageInstance(\n storage: RxStorageMemory,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMemorySettings\n): Promise> {\n const collectionKey = getMemoryCollectionKey(\n params.databaseName,\n params.collectionName,\n params.schema.version\n );\n\n let internals = storage.collectionStates.get(collectionKey);\n if (!internals) {\n internals = {\n id: randomCouchString(5),\n schema: params.schema,\n removed: false,\n refCount: 1,\n documents: new Map(),\n attachments: params.schema.attachments ? new Map() : undefined as any,\n byIndex: {},\n conflictResultionTasks$: new Subject(),\n changes$: new Subject()\n };\n addIndexesToInternalsState(internals, params.schema);\n storage.collectionStates.set(collectionKey, internals);\n } else {\n /**\n * Ensure that the storage was not already\n * created with a different schema.\n * This is very important because if this check\n * does not exist here, we have hard-to-debug problems\n * downstream.\n */\n if (\n params.devMode &&\n !deepEqual(internals.schema, params.schema)\n ) {\n throw new Error('storage was already created with a different schema');\n }\n internals.refCount = internals.refCount + 1;\n }\n\n const instance = new RxStorageInstanceMemory(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js b/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js index 0b2741c1044..b5204794998 100644 --- a/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js +++ b/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js @@ -1,12 +1,10 @@ "use strict"; -var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RxStorageInstanceMongoDB = void 0; exports.createMongoDBStorageInstance = createMongoDBStorageInstance; -var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/readOnlyError")); var _rxjs = require("rxjs"); var _rxSchemaHelper = require("../../rx-schema-helper.js"); var _index = require("../../plugins/utils/index.js"); diff --git a/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map b/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map index f4d027c6aea..75cd56a590f 100644 --- a/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +++ b/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-mongodb.js","names":["_rxjs","require","_rxSchemaHelper","_index","_mongodb","_rxStorageHelper","_mongodbHelper","RxStorageInstanceMongoDB","exports","storage","databaseName","collectionName","schema","internals","options","settings","changes$","Subject","runningOperations","BehaviorSubject","writeQueue","PROMISE_RESOLVE_VOID","mongoObjectIdCache","WeakMap","attachments","Error","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","inMongoPrimaryPath","MONGO_ID_SUBSTITUTE_FIELDNAME","mongoClient","MongoClient","databaseSettings","connection","mongoDatabase","db","version","indexes","slice","map","index","arIndex","isMaybeReadonlyArray","push","mongoCollectionPromise","createCollection","then","mongoCollection","createIndexes","mongoIndex","forEach","field","name","getMongoDBIndexName","key","_proto","prototype","bulkWrite","documentWrites","context","next","getValue","closed","Promise","reject","ret","success","error","docIds","d","document","documentStates","findDocumentsById","documentStatesMap","Map","doc","docId","set","categorized","categorizeBulkWriteRows","changeByDocId","eventBulk","events","change","documentId","errors","all","bulkInsertDocs","writeRow","writeResult","findOneAndUpdate","$setOnInsert","swapRxDocToMongo","upsert","includeResultMetadata","value","conflictError","status","documentInDb","swapMongoToRxDoc","ensureNotFalsy","isError","event","get","bulkUpdateDocs","findOneAndReplace","_rev","previous","returnDocument","ok","currentDocState","currentDoc","getFromMapOrThrow","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","now","withDeleted","session","plainQuery","$in","_deleted","result","queryResult","find","toArray","row","query","originalPreparedQuery","preparedQuery","prepareMongoDBQuery","mongoSelector","skip","limit","sort","mongoSort","resultDocs","documents","count","countDocuments","mode","cleanup","minimumDeletedTime","maxDeletionTime","deleteMany","$lt","getAttachmentData","_documentId","_attachmentId","_digest","changeStream","remove","drop","close","requestIdlePromise","firstValueFrom","pipe","filter","c","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createMongoDBStorageInstance","params","instance","resolve"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts"],"sourcesContent":["import {\n BehaviorSubject,\n Observable,\n Subject,\n filter,\n firstValueFrom\n} from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n EventBulk,\n PreparedQuery,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n RxStorageWriteErrorConflict,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n isMaybeReadonlyArray,\n now,\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../../plugins/utils/index.ts';\nimport {\n MongoDBPreparedQuery,\n MongoDBStorageInternals,\n MongoQuerySelector,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageMongoDBSettings\n} from './mongodb-types.ts';\nimport { RxStorageMongoDB } from './rx-storage-mongodb.ts';\nimport {\n Db as MongoDatabase,\n Collection as MongoCollection,\n MongoClient,\n ObjectId,\n ClientSession\n} from 'mongodb';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n MONGO_ID_SUBSTITUTE_FIELDNAME,\n getMongoDBIndexName,\n prepareMongoDBQuery,\n swapMongoToRxDoc,\n swapRxDocToMongo\n} from './mongodb-helper.ts';\n\nexport class RxStorageInstanceMongoDB implements RxStorageInstance<\n RxDocType,\n MongoDBStorageInternals,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public readonly inMongoPrimaryPath: string;\n public closed?: Promise;\n private readonly changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly mongoClient: MongoClient;\n public readonly mongoDatabase: MongoDatabase;\n public readonly mongoCollectionPromise: Promise | any>>;\n // public mongoChangeStream?: MongoChangeStream>;\n\n\n /**\n * Closing the connection must not happen when\n * an operation is running, otherwise we get an error.\n * So we store all running operations here so that\n * they can be awaited.\n */\n public readonly runningOperations = new BehaviorSubject(0);\n public writeQueue: Promise = PROMISE_RESOLVE_VOID;\n\n /**\n * We use this to be able to still fetch\n * the objectId after transforming the document from mongo-style (with _id)\n * to RxDB\n */\n public readonly mongoObjectIdCache = new WeakMap, ObjectId>();\n\n constructor(\n public readonly storage: RxStorageMongoDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MongoDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMongoDBSettings\n ) {\n if (this.schema.attachments) {\n throw new Error('attachments not supported in mongodb storage, make a PR if you need that');\n }\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.inMongoPrimaryPath = this.primaryPath === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;\n this.mongoClient = new MongoClient(storage.databaseSettings.connection);\n this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);\n\n const indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {\n const arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];\n return arIndex;\n });\n indexes.push([this.inMongoPrimaryPath]);\n\n this.mongoCollectionPromise = this.mongoDatabase.createCollection(collectionName)\n .then(async (mongoCollection) => {\n await mongoCollection.createIndexes(\n indexes.map(index => {\n const mongoIndex: any = {};\n index.forEach(field => mongoIndex[field] = 1);\n return { name: getMongoDBIndexName(index), key: mongoIndex };\n })\n );\n\n /**\n * TODO in a setup where multiple servers run node.js\n * processes that use the mongodb storage, we should propagate\n * events by listening to the mongodb changestream.\n * This maybe should be a premium feature.\n */\n // this.mongoChangeStream = mongoCollection.watch(\n // undefined, {\n // batchSize: 100\n // }\n // ).on('change', change => {\n\n\n // const eventBulkId = randomCouchString(10);\n // const newDocData: RxDocumentData = (change as any).fullDocument;\n // const documentId = newDocData[this.primaryPath] as any;\n\n // const eventBulk: EventBulk>, RxStorageDefaultCheckpoint> = {\n // checkpoint: {\n // id: newDocData[this.primaryPath] as any,\n // lwt: newDocData._meta.lwt\n // },\n // context: 'mongodb-write',\n // id: eventBulkId,\n // events: [{\n // documentData: newDocData,\n // documentId,\n // operation: 'INSERT',\n // previousDocumentData: undefined,\n // }],\n // startTime: now(),\n // endTime: now()\n // };\n\n // this.changes$.next(eventBulk);\n // });\n\n\n return mongoCollection;\n });\n\n\n }\n\n /**\n * Bulk writes on the mongodb storage.\n * Notice that MongoDB does not support cross-document transactions\n * so we have to do a update-if-previous-is-correct like operations.\n * (Similar to what RxDB does with the revision system)\n */\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n this.writeQueue = this.writeQueue.then(async () => {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n\n const mongoCollection = await this.mongoCollectionPromise;\n if (this.closed) {\n return Promise.reject(new Error('already closed'));\n }\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n\n const docIds = documentWrites.map(d => (d.document as any)[primaryPath]);\n const documentStates = await this.findDocumentsById(\n docIds,\n true\n );\n const documentStatesMap = new Map();\n documentStates.forEach(doc => {\n const docId = doc[primaryPath];\n documentStatesMap.set(docId, doc);\n });\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentStatesMap,\n documentWrites,\n context\n );\n\n const changeByDocId = new Map>>();\n categorized.eventBulk.events.forEach(change => {\n changeByDocId.set(change.documentId, change);\n });\n\n\n ret.error = categorized.errors;\n\n /**\n * Reset the event bulk because\n * conflicts can still appear after the categorization\n */\n const eventBulk = categorized.eventBulk;\n eventBulk.events = [];\n\n await Promise.all([\n /**\n * Inserts\n * @link https://sparkbyexamples.com/mongodb/mongodb-insert-if-not-exists/\n */\n Promise.all(\n categorized.bulkInsertDocs.map(async (writeRow) => {\n const docId: string = writeRow.document[primaryPath] as any;\n const writeResult = await mongoCollection.findOneAndUpdate(\n {\n [this.inMongoPrimaryPath]: docId\n },\n {\n $setOnInsert: swapRxDocToMongo(writeRow.document)\n },\n {\n upsert: true,\n includeResultMetadata: true\n }\n );\n if (writeResult.value) {\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: swapMongoToRxDoc(ensureNotFalsy(writeResult.value)),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = changeByDocId.get(docId);\n if (event) {\n eventBulk.events.push(event);\n }\n ret.success.push(writeRow.document);\n }\n })\n ),\n /**\n * Updates\n */\n Promise.all(\n categorized.bulkUpdateDocs.map(async (writeRow) => {\n const docId = writeRow.document[primaryPath] as string;\n const writeResult = await mongoCollection.findOneAndReplace(\n {\n [this.inMongoPrimaryPath]: docId,\n _rev: ensureNotFalsy(writeRow.previous)._rev\n },\n swapRxDocToMongo(writeRow.document),\n {\n includeResultMetadata: true,\n upsert: false,\n returnDocument: 'before'\n }\n );\n if (!writeResult.ok) {\n const currentDocState = await this.findDocumentsById([docId], true);\n const currentDoc = currentDocState[0];\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: ensureNotFalsy(currentDoc),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = getFromMapOrThrow(changeByDocId, docId);\n eventBulk.events.push(event);\n ret.success.push(writeRow.document);\n }\n\n })\n )\n ]);\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return ret;\n });\n return this.writeQueue;\n\n }\n\n async findDocumentsById(\n docIds: string[],\n withDeleted: boolean,\n session?: ClientSession\n ): Promise[]> {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const primaryPath = this.primaryPath;\n\n const plainQuery: MongoQuerySelector = {\n [primaryPath]: {\n $in: docIds\n }\n };\n if (!withDeleted) {\n plainQuery._deleted = false;\n }\n const result: RxDocumentData[] = [];\n const queryResult = await mongoCollection.find(\n plainQuery,\n {\n session\n }\n ).toArray();\n queryResult.forEach(row => {\n result.push(\n swapMongoToRxDoc(\n row as any\n )\n );\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return result;\n }\n\n async query(\n originalPreparedQuery: PreparedQuery\n ): Promise> {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n\n let query = mongoCollection.find(preparedQuery.mongoSelector);\n if (preparedQuery.query.skip) {\n query = query.skip(preparedQuery.query.skip);\n }\n if (preparedQuery.query.limit) {\n query = query.limit(preparedQuery.query.limit);\n }\n if (preparedQuery.query.sort) {\n query = query.sort(preparedQuery.mongoSort);\n }\n const resultDocs = await query.toArray();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n documents: resultDocs.map(d => swapMongoToRxDoc(d))\n };\n }\n\n async count(\n originalPreparedQuery: PreparedQuery\n ): Promise {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n const count = await mongoCollection.countDocuments(preparedQuery.mongoSelector);\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n count,\n mode: 'fast'\n };\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const maxDeletionTime = now() - minimumDeletedTime;\n await mongoCollection.deleteMany({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return true;\n }\n\n async getAttachmentData(\n _documentId: string,\n _attachmentId: string,\n _digest: string\n ): Promise {\n await this.mongoCollectionPromise;\n throw new Error('attachments not implemented, make a PR');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$;\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n await mongoCollection.drop();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n await this.close();\n }\n\n async close(): Promise {\n // TODO without this next-tick we have random fails in the tests\n await requestIdlePromise(200);\n\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n await this.mongoCollectionPromise;\n await firstValueFrom(this.runningOperations.pipe(filter(c => c === 0)));\n // await ensureNotFalsy(this.mongoChangeStream).close();\n await this.mongoClient.close();\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n}\n\nexport function createMongoDBStorageInstance(\n storage: RxStorageMongoDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMongoDBSettings\n): Promise> {\n const instance = new RxStorageInstanceMongoDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n {},\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAOA,IAAAC,eAAA,GAAAD,OAAA;AAmBA,IAAAE,MAAA,GAAAF,OAAA;AAgBA,IAAAG,QAAA,GAAAH,OAAA;AAOA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,cAAA,GAAAL,OAAA;AAM6B,IAEhBM,wBAAwB,GAAAC,OAAA,CAAAD,wBAAA;EAcjC;;EAGA;AACJ;AACA;AACA;AACA;AACA;;EAII;AACJ;AACA;AACA;AACA;;EAGI,SAAAA,yBACoBE,OAAyB,EACzBC,YAAoB,EACpBC,cAAsB,EACtBC,MAAyD,EACzDC,SAAkC,EAClCC,OAA0D,EAC1DC,QAAkC,EACpD;IAAA,KA/BeC,QAAQ,GAAoG,IAAIC,aAAO,CAAC,CAAC;IAAA,KAa1HC,iBAAiB,GAAG,IAAIC,qBAAe,CAAC,CAAC,CAAC;IAAA,KACnDC,UAAU,GAAiBC,2BAAoB;IAAA,KAOtCC,kBAAkB,GAAG,IAAIC,OAAO,CAAsC,CAAC;IAAA,KAGnEd,OAAyB,GAAzBA,OAAyB;IAAA,KACzBC,YAAoB,GAApBA,YAAoB;IAAA,KACpBC,cAAsB,GAAtBA,cAAsB;IAAA,KACtBC,MAAyD,GAAzDA,MAAyD;IAAA,KACzDC,SAAkC,GAAlCA,SAAkC;IAAA,KAClCC,OAA0D,GAA1DA,OAA0D;IAAA,KAC1DC,QAAkC,GAAlCA,QAAkC;IAElD,IAAI,IAAI,CAACH,MAAM,CAACY,WAAW,EAAE;MACzB,MAAM,IAAIC,KAAK,CAAC,0EAA0E,CAAC;IAC/F;IACA,IAAI,CAACC,WAAW,GAAG,IAAAC,2CAA2B,EAAC,IAAI,CAACf,MAAM,CAACgB,UAAU,CAAC;IACtE,IAAI,CAACC,kBAAkB,GAAG,IAAI,CAACH,WAAW,KAAK,KAAK,GAAGI,4CAA6B,GAAG,IAAI,CAACJ,WAAW;IACvG,IAAI,CAACK,WAAW,GAAG,IAAIC,oBAAW,CAACvB,OAAO,CAACwB,gBAAgB,CAACC,UAAU,CAAC;IACvE,IAAI,CAACC,aAAa,GAAG,IAAI,CAACJ,WAAW,CAACK,EAAE,CAAC1B,YAAY,GAAG,IAAI,GAAG,IAAI,CAACE,MAAM,CAACyB,OAAO,CAAC;IAEnF,IAAMC,OAAO,GAAG,CAAC,IAAI,CAAC1B,MAAM,CAAC0B,OAAO,GAAG,IAAI,CAAC1B,MAAM,CAAC0B,OAAO,CAACC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAEC,GAAG,CAACC,KAAK,IAAI;MAClF,IAAMC,OAAO,GAAG,IAAAC,2BAAoB,EAACF,KAAK,CAAC,GAAGA,KAAK,CAACF,KAAK,CAAC,CAAC,CAAC,GAAG,CAACE,KAAK,CAAC;MACtE,OAAOC,OAAO;IAClB,CAAC,CAAC;IACFJ,OAAO,CAACM,IAAI,CAAC,CAAC,IAAI,CAACf,kBAAkB,CAAC,CAAC;IAEvC,IAAI,CAACgB,sBAAsB,GAAG,IAAI,CAACV,aAAa,CAACW,gBAAgB,CAACnC,cAAc,CAAC,CAC5EoC,IAAI,CAAC,MAAOC,eAAe,IAAK;MAC7B,MAAMA,eAAe,CAACC,aAAa,CAC/BX,OAAO,CAACE,GAAG,CAACC,KAAK,IAAI;QACjB,IAAMS,UAAe,GAAG,CAAC,CAAC;QAC1BT,KAAK,CAACU,OAAO,CAACC,KAAK,IAAIF,UAAU,CAACE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO;UAAEC,IAAI,EAAE,IAAAC,kCAAmB,EAACb,KAAK,CAAC;UAAEc,GAAG,EAAEL;QAAW,CAAC;MAChE,CAAC,CACL,CAAC;;MAED;AAChB;AACA;AACA;AACA;AACA;MACgB;MACA;MACA;MACA;MACA;;MAGA;MACA;MACA;;MAEA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;;MAEA;MACA;;MAGA,OAAOF,eAAe;IAC1B,CAAC,CAAC;EAGV;;EAEA;AACJ;AACA;AACA;AACA;AACA;EALI,IAAAQ,MAAA,GAAAjD,wBAAA,CAAAkD,SAAA;EAAAD,MAAA,CAMAE,SAAS,GAAT,SAAAA,SAASA,CACLC,cAAyC,EACzCC,OAAe,EAC+B;IAE9C,IAAI,CAACxC,UAAU,GAAG,IAAI,CAACA,UAAU,CAAC2B,IAAI,CAAC,YAAY;MAC/C,IAAI,CAAC7B,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;MAElE,IAAMd,eAAe,GAAG,MAAM,IAAI,CAACH,sBAAsB;MACzD,IAAI,IAAI,CAACkB,MAAM,EAAE;QACb,OAAOC,OAAO,CAACC,MAAM,CAAC,IAAIxC,KAAK,CAAC,gBAAgB,CAAC,CAAC;MACtD;MACA,IAAMC,WAAW,GAAG,IAAI,CAACA,WAAW;MACpC,IAAMwC,GAA0C,GAAG;QAC/CC,OAAO,EAAE,EAAE;QACXC,KAAK,EAAE;MACX,CAAC;MAGD,IAAMC,MAAM,GAAGV,cAAc,CAACnB,GAAG,CAAC8B,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAS7C,WAAW,CAAC,CAAC;MACxE,IAAM8C,cAAc,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAC/CJ,MAAM,EACN,IACJ,CAAC;MACD,IAAMK,iBAAiB,GAAG,IAAIC,GAAG,CAAC,CAAC;MACnCH,cAAc,CAACrB,OAAO,CAACyB,GAAG,IAAI;QAC1B,IAAMC,KAAK,GAAGD,GAAG,CAAClD,WAAW,CAAC;QAC9BgD,iBAAiB,CAACI,GAAG,CAACD,KAAK,EAAED,GAAG,CAAC;MACrC,CAAC,CAAC;MACF,IAAMG,WAAW,GAAG,IAAAC,wCAAuB,EACvC,IAAI,EACJtD,WAAW,EACXgD,iBAAiB,EACjBf,cAAc,EACdC,OACJ,CAAC;MAED,IAAMqB,aAAa,GAAG,IAAIN,GAAG,CAA0D,CAAC;MACxFI,WAAW,CAACG,SAAS,CAACC,MAAM,CAAChC,OAAO,CAACiC,MAAM,IAAI;QAC3CH,aAAa,CAACH,GAAG,CAACM,MAAM,CAACC,UAAU,EAAED,MAAM,CAAC;MAChD,CAAC,CAAC;MAGFlB,GAAG,CAACE,KAAK,GAAGW,WAAW,CAACO,MAAM;;MAE9B;AACZ;AACA;AACA;MACY,IAAMJ,SAAS,GAAGH,WAAW,CAACG,SAAS;MACvCA,SAAS,CAACC,MAAM,GAAG,EAAE;MAErB,MAAMnB,OAAO,CAACuB,GAAG,CAAC;MACd;AAChB;AACA;AACA;MACgBvB,OAAO,CAACuB,GAAG,CACPR,WAAW,CAACS,cAAc,CAAChD,GAAG,CAAC,MAAOiD,QAAQ,IAAK;QAC/C,IAAMZ,KAAa,GAAGY,QAAQ,CAAClB,QAAQ,CAAC7C,WAAW,CAAQ;QAC3D,IAAMgE,WAAW,GAAG,MAAM1C,eAAe,CAAC2C,gBAAgB,CACtD;UACI,CAAC,IAAI,CAAC9D,kBAAkB,GAAGgD;QAC/B,CAAC,EACD;UACIe,YAAY,EAAE,IAAAC,+BAAgB,EAACJ,QAAQ,CAAClB,QAAQ;QACpD,CAAC,EACD;UACIuB,MAAM,EAAE,IAAI;UACZC,qBAAqB,EAAE;QAC3B,CACJ,CAAC;QACD,IAAIL,WAAW,CAACM,KAAK,EAAE;UACnB;UACA,IAAMC,aAAqD,GAAG;YAC1DC,MAAM,EAAE,GAAG;YACXb,UAAU,EAAER,KAAK;YACjBY,QAAQ;YACRU,YAAY,EAAE,IAAAC,+BAAgB,EAAC,IAAAC,qBAAc,EAACX,WAAW,CAACM,KAAK,CAAC,CAAC;YACjEM,OAAO,EAAE;UACb,CAAC;UACDpC,GAAG,CAACE,KAAK,CAACxB,IAAI,CAACqD,aAAa,CAAC;QACjC,CAAC,MAAM;UACH,IAAMM,KAAK,GAAGtB,aAAa,CAACuB,GAAG,CAAC3B,KAAK,CAAC;UACtC,IAAI0B,KAAK,EAAE;YACPrB,SAAS,CAACC,MAAM,CAACvC,IAAI,CAAC2D,KAAK,CAAC;UAChC;UACArC,GAAG,CAACC,OAAO,CAACvB,IAAI,CAAC6C,QAAQ,CAAClB,QAAQ,CAAC;QACvC;MACJ,CAAC,CACL,CAAC;MACD;AAChB;AACA;MACgBP,OAAO,CAACuB,GAAG,CACPR,WAAW,CAAC0B,cAAc,CAACjE,GAAG,CAAC,MAAOiD,QAAQ,IAAK;QAC/C,IAAMZ,KAAK,GAAGY,QAAQ,CAAClB,QAAQ,CAAC7C,WAAW,CAAW;QACtD,IAAMgE,WAAW,GAAG,MAAM1C,eAAe,CAAC0D,iBAAiB,CACvD;UACI,CAAC,IAAI,CAAC7E,kBAAkB,GAAGgD,KAAK;UAChC8B,IAAI,EAAE,IAAAN,qBAAc,EAACZ,QAAQ,CAACmB,QAAQ,CAAC,CAACD;QAC5C,CAAC,EACD,IAAAd,+BAAgB,EAACJ,QAAQ,CAAClB,QAAQ,CAAC,EACnC;UACIwB,qBAAqB,EAAE,IAAI;UAC3BD,MAAM,EAAE,KAAK;UACbe,cAAc,EAAE;QACpB,CACJ,CAAC;QACD,IAAI,CAACnB,WAAW,CAACoB,EAAE,EAAE;UACjB,IAAMC,eAAe,GAAG,MAAM,IAAI,CAACtC,iBAAiB,CAAC,CAACI,KAAK,CAAC,EAAE,IAAI,CAAC;UACnE,IAAMmC,UAAU,GAAGD,eAAe,CAAC,CAAC,CAAC;UACrC;UACA,IAAMd,aAAqD,GAAG;YAC1DC,MAAM,EAAE,GAAG;YACXb,UAAU,EAAER,KAAK;YACjBY,QAAQ;YACRU,YAAY,EAAE,IAAAE,qBAAc,EAACW,UAAU,CAAC;YACxCV,OAAO,EAAE;UACb,CAAC;UACDpC,GAAG,CAACE,KAAK,CAACxB,IAAI,CAACqD,aAAa,CAAC;QACjC,CAAC,MAAM;UACH,IAAMM,KAAK,GAAG,IAAAU,wBAAiB,EAAChC,aAAa,EAAEJ,KAAK,CAAC;UACrDK,SAAS,CAACC,MAAM,CAACvC,IAAI,CAAC2D,KAAK,CAAC;UAC5BrC,GAAG,CAACC,OAAO,CAACvB,IAAI,CAAC6C,QAAQ,CAAClB,QAAQ,CAAC;QACvC;MAEJ,CAAC,CACL,CAAC,CACJ,CAAC;MAEF,IAAIQ,WAAW,CAACG,SAAS,CAACC,MAAM,CAAC+B,MAAM,GAAG,CAAC,EAAE;QACzC,IAAMC,SAAS,GAAG,IAAAd,qBAAc,EAACtB,WAAW,CAACqC,SAAS,CAAC,CAAC7C,QAAQ;QAChEQ,WAAW,CAACG,SAAS,CAACmC,UAAU,GAAG;UAC/BC,EAAE,EAAEH,SAAS,CAACzF,WAAW,CAAC;UAC1B6F,GAAG,EAAEJ,SAAS,CAACK,KAAK,CAACD;QACzB,CAAC;QACDxC,WAAW,CAACG,SAAS,CAACuC,OAAO,GAAG,IAAAC,UAAG,EAAC,CAAC;QACrC,IAAI,CAAC1G,QAAQ,CAAC6C,IAAI,CAACkB,WAAW,CAACG,SAAS,CAAC;MAC7C;MAEA,IAAI,CAAChE,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;MAClE,OAAOI,GAAG;IACd,CAAC,CAAC;IACF,OAAO,IAAI,CAAC9C,UAAU;EAE1B,CAAC;EAAAoC,MAAA,CAEKiB,iBAAiB,GAAvB,eAAMA,iBAAiBA,CACnBJ,MAAgB,EAChBsD,WAAoB,EACpBC,OAAuB,EACa;IACpC,IAAI,CAAC1G,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,IAAMd,eAAe,GAAG,MAAM,IAAI,CAACH,sBAAsB;IACzD,IAAMnB,WAAW,GAAG,IAAI,CAACA,WAAW;IAEpC,IAAMmG,UAAmC,GAAG;MACxC,CAACnG,WAAW,GAAG;QACXoG,GAAG,EAAEzD;MACT;IACJ,CAAC;IACD,IAAI,CAACsD,WAAW,EAAE;MACdE,UAAU,CAACE,QAAQ,GAAG,KAAK;IAC/B;IACA,IAAMC,MAAmC,GAAG,EAAE;IAC9C,IAAMC,WAAW,GAAG,MAAMjF,eAAe,CAACkF,IAAI,CAC1CL,UAAU,EACV;MACID;IACJ,CACJ,CAAC,CAACO,OAAO,CAAC,CAAC;IACXF,WAAW,CAAC9E,OAAO,CAACiF,GAAG,IAAI;MACvBJ,MAAM,CAACpF,IAAI,CACP,IAAAwD,+BAAgB,EACZgC,GACJ,CACJ,CAAC;IACL,CAAC,CAAC;IACF,IAAI,CAAClH,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,OAAOkE,MAAM;EACjB,CAAC;EAAAxE,MAAA,CAEK6E,KAAK,GAAX,eAAMA,KAAKA,CACPC,qBAA+C,EACP;IACxC,IAAMC,aAAa,GAAG,IAAAC,kCAAmB,EAAC,IAAI,CAAC5H,MAAM,EAAE0H,qBAAqB,CAACD,KAAK,CAAC;IAEnF,IAAI,CAACnH,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,IAAI,CAAC1C,UAAU;IACrB,IAAM4B,eAAe,GAAG,MAAM,IAAI,CAACH,sBAAsB;IAEzD,IAAIwF,KAAK,GAAGrF,eAAe,CAACkF,IAAI,CAACK,aAAa,CAACE,aAAa,CAAC;IAC7D,IAAIF,aAAa,CAACF,KAAK,CAACK,IAAI,EAAE;MAC1BL,KAAK,GAAGA,KAAK,CAACK,IAAI,CAACH,aAAa,CAACF,KAAK,CAACK,IAAI,CAAC;IAChD;IACA,IAAIH,aAAa,CAACF,KAAK,CAACM,KAAK,EAAE;MAC3BN,KAAK,GAAGA,KAAK,CAACM,KAAK,CAACJ,aAAa,CAACF,KAAK,CAACM,KAAK,CAAC;IAClD;IACA,IAAIJ,aAAa,CAACF,KAAK,CAACO,IAAI,EAAE;MAC1BP,KAAK,GAAGA,KAAK,CAACO,IAAI,CAACL,aAAa,CAACM,SAAS,CAAC;IAC/C;IACA,IAAMC,UAAU,GAAG,MAAMT,KAAK,CAACF,OAAO,CAAC,CAAC;IACxC,IAAI,CAACjH,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,OAAO;MACHiF,SAAS,EAAED,UAAU,CAACtG,GAAG,CAAC8B,CAAC,IAAI,IAAA8B,+BAAgB,EAAC9B,CAAC,CAAC;IACtD,CAAC;EACL,CAAC;EAAAd,MAAA,CAEKwF,KAAK,GAAX,eAAMA,KAAKA,CACPV,qBAA+C,EAClB;IAC7B,IAAMC,aAAa,GAAG,IAAAC,kCAAmB,EAAC,IAAI,CAAC5H,MAAM,EAAE0H,qBAAqB,CAACD,KAAK,CAAC;IACnF,IAAI,CAACnH,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,IAAI,CAAC1C,UAAU;IACrB,IAAM4B,eAAe,GAAG,MAAM,IAAI,CAACH,sBAAsB;IACzD,IAAMmG,KAAK,GAAG,MAAMhG,eAAe,CAACiG,cAAc,CAACV,aAAa,CAACE,aAAa,CAAC;IAC/E,IAAI,CAACvH,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,OAAO;MACHkF,KAAK;MACLE,IAAI,EAAE;IACV,CAAC;EACL,CAAC;EAAA1F,MAAA,CAEK2F,OAAO,GAAb,eAAMA,OAAOA,CAACC,kBAA0B,EAAoB;IACxD,IAAI,CAAClI,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,IAAMd,eAAe,GAAG,MAAM,IAAI,CAACH,sBAAsB;IACzD,IAAMwG,eAAe,GAAG,IAAA3B,UAAG,EAAC,CAAC,GAAG0B,kBAAkB;IAClD,MAAMpG,eAAe,CAACsG,UAAU,CAAC;MAC7BvB,QAAQ,EAAE,IAAI;MACd,WAAW,EAAE;QACTwB,GAAG,EAAEF;MACT;IACJ,CAAC,CAAC;IACF,IAAI,CAACnI,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,OAAO,IAAI;EACf,CAAC;EAAAN,MAAA,CAEKgG,iBAAiB,GAAvB,eAAMA,iBAAiBA,CACnBC,WAAmB,EACnBC,aAAqB,EACrBC,OAAe,EACA;IACf,MAAM,IAAI,CAAC9G,sBAAsB;IACjC,MAAM,IAAIpB,KAAK,CAAC,wCAAwC,CAAC;EAC7D,CAAC;EAAA+B,MAAA,CAEDoG,YAAY,GAAZ,SAAAA,YAAYA,CAAA,EAAuG;IAC/G,OAAO,IAAI,CAAC5I,QAAQ;EACxB,CAAC;EAAAwC,MAAA,CAEKqG,MAAM,GAAZ,eAAMA,MAAMA,CAAA,EAAkB;IAC1B,IAAI,IAAI,CAAC9F,MAAM,EAAE;MACb,MAAM,IAAItC,KAAK,CAAC,gBAAgB,CAAC;IACrC;IACA,IAAI,CAACP,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,IAAMd,eAAe,GAAG,MAAM,IAAI,CAACH,sBAAsB;IACzD,MAAMG,eAAe,CAAC8G,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC5I,iBAAiB,CAAC2C,IAAI,CAAC,IAAI,CAAC3C,iBAAiB,CAAC4C,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,IAAI,CAACiG,KAAK,CAAC,CAAC;EACtB,CAAC;EAAAvG,MAAA,CAEKuG,KAAK,GAAX,eAAMA,KAAKA,CAAA,EAAkB;IACzB;IACA,MAAM,IAAAC,yBAAkB,EAAC,GAAG,CAAC;IAE7B,IAAI,IAAI,CAACjG,MAAM,EAAE;MACb,OAAO,IAAI,CAACA,MAAM;IACtB;IACA,IAAI,CAACA,MAAM,GAAG,CAAC,YAAY;MACvB,MAAM,IAAI,CAAClB,sBAAsB;MACjC,MAAM,IAAAoH,oBAAc,EAAC,IAAI,CAAC/I,iBAAiB,CAACgJ,IAAI,CAAC,IAAAC,YAAM,EAACC,CAAC,IAAIA,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;MACvE;MACA,MAAM,IAAI,CAACrI,WAAW,CAACgI,KAAK,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAAChG,MAAM;EACtB,CAAC;EAAAP,MAAA,CAED6G,sBAAsB,GAAtB,SAAAA,sBAAsBA,CAAA,EAAmD;IACrE,OAAO,IAAIpJ,aAAO,CAAC,CAAC;EACxB,CAAC;EAAAuC,MAAA,CACK8G,4BAA4B,GAAlC,eAAMA,4BAA4BA,CAACC,aAAyD,EAAiB,CAAE,CAAC;EAAA,OAAAhK,wBAAA;AAAA;AAG7G,SAASiK,4BAA4BA,CACxC/J,OAAyB,EACzBgK,MAA2F,EAC3F1J,QAAkC,EACU;EAC5C,IAAM2J,QAAQ,GAAG,IAAInK,wBAAwB,CACzCE,OAAO,EACPgK,MAAM,CAAC/J,YAAY,EACnB+J,MAAM,CAAC9J,cAAc,EACrB8J,MAAM,CAAC7J,MAAM,EACb,CAAC,CAAC,EACF6J,MAAM,CAAC3J,OAAO,EACdC,QACJ,CAAC;EACD,OAAOiD,OAAO,CAAC2G,OAAO,CAACD,QAAQ,CAAC;AACpC","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-mongodb.js","names":["_rxjs","require","_rxSchemaHelper","_index","_mongodb","_rxStorageHelper","_mongodbHelper","RxStorageInstanceMongoDB","exports","storage","databaseName","collectionName","schema","internals","options","settings","changes$","Subject","runningOperations","BehaviorSubject","writeQueue","PROMISE_RESOLVE_VOID","mongoObjectIdCache","WeakMap","attachments","Error","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","inMongoPrimaryPath","MONGO_ID_SUBSTITUTE_FIELDNAME","mongoClient","MongoClient","databaseSettings","connection","mongoDatabase","db","version","indexes","slice","map","index","arIndex","isMaybeReadonlyArray","push","mongoCollectionPromise","createCollection","then","mongoCollection","createIndexes","mongoIndex","forEach","field","name","getMongoDBIndexName","key","_proto","prototype","bulkWrite","documentWrites","context","next","getValue","closed","Promise","reject","ret","success","error","docIds","d","document","documentStates","findDocumentsById","documentStatesMap","Map","doc","docId","set","categorized","categorizeBulkWriteRows","changeByDocId","eventBulk","events","change","documentId","errors","all","bulkInsertDocs","writeRow","writeResult","findOneAndUpdate","$setOnInsert","swapRxDocToMongo","upsert","includeResultMetadata","value","conflictError","status","documentInDb","swapMongoToRxDoc","ensureNotFalsy","isError","event","get","bulkUpdateDocs","findOneAndReplace","_rev","previous","returnDocument","ok","currentDocState","currentDoc","getFromMapOrThrow","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","now","withDeleted","session","plainQuery","$in","_deleted","result","queryResult","find","toArray","row","query","originalPreparedQuery","preparedQuery","prepareMongoDBQuery","mongoSelector","skip","limit","sort","mongoSort","resultDocs","documents","count","countDocuments","mode","cleanup","minimumDeletedTime","maxDeletionTime","deleteMany","$lt","getAttachmentData","_documentId","_attachmentId","_digest","changeStream","remove","drop","close","requestIdlePromise","firstValueFrom","pipe","filter","c","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createMongoDBStorageInstance","params","instance","resolve"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts"],"sourcesContent":["import {\n BehaviorSubject,\n Observable,\n Subject,\n filter,\n firstValueFrom\n} from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n EventBulk,\n PreparedQuery,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n RxStorageWriteErrorConflict,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n isMaybeReadonlyArray,\n now,\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../../plugins/utils/index.ts';\nimport {\n MongoDBPreparedQuery,\n MongoDBStorageInternals,\n MongoQuerySelector,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageMongoDBSettings\n} from './mongodb-types.ts';\nimport { RxStorageMongoDB } from './rx-storage-mongodb.ts';\nimport {\n Db as MongoDatabase,\n Collection as MongoCollection,\n MongoClient,\n ObjectId,\n ClientSession\n} from 'mongodb';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n MONGO_ID_SUBSTITUTE_FIELDNAME,\n getMongoDBIndexName,\n prepareMongoDBQuery,\n swapMongoToRxDoc,\n swapRxDocToMongo\n} from './mongodb-helper.ts';\n\nexport class RxStorageInstanceMongoDB implements RxStorageInstance<\n RxDocType,\n MongoDBStorageInternals,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public readonly inMongoPrimaryPath: string;\n public closed?: Promise;\n private readonly changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly mongoClient: MongoClient;\n public readonly mongoDatabase: MongoDatabase;\n public readonly mongoCollectionPromise: Promise | any>>;\n // public mongoChangeStream?: MongoChangeStream>;\n\n\n /**\n * Closing the connection must not happen when\n * an operation is running, otherwise we get an error.\n * So we store all running operations here so that\n * they can be awaited.\n */\n public readonly runningOperations = new BehaviorSubject(0);\n public writeQueue: Promise = PROMISE_RESOLVE_VOID;\n\n /**\n * We use this to be able to still fetch\n * the objectId after transforming the document from mongo-style (with _id)\n * to RxDB\n */\n public readonly mongoObjectIdCache = new WeakMap, ObjectId>();\n\n constructor(\n public readonly storage: RxStorageMongoDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MongoDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMongoDBSettings\n ) {\n if (this.schema.attachments) {\n throw new Error('attachments not supported in mongodb storage, make a PR if you need that');\n }\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.inMongoPrimaryPath = this.primaryPath === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;\n this.mongoClient = new MongoClient(storage.databaseSettings.connection);\n this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);\n\n const indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {\n const arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];\n return arIndex;\n });\n indexes.push([this.inMongoPrimaryPath]);\n\n this.mongoCollectionPromise = this.mongoDatabase.createCollection(collectionName)\n .then(async (mongoCollection) => {\n await mongoCollection.createIndexes(\n indexes.map(index => {\n const mongoIndex: any = {};\n index.forEach(field => mongoIndex[field] = 1);\n return { name: getMongoDBIndexName(index), key: mongoIndex };\n })\n );\n\n /**\n * TODO in a setup where multiple servers run node.js\n * processes that use the mongodb storage, we should propagate\n * events by listening to the mongodb changestream.\n * This maybe should be a premium feature.\n */\n // this.mongoChangeStream = mongoCollection.watch(\n // undefined, {\n // batchSize: 100\n // }\n // ).on('change', change => {\n\n\n // const eventBulkId = randomCouchString(10);\n // const newDocData: RxDocumentData = (change as any).fullDocument;\n // const documentId = newDocData[this.primaryPath] as any;\n\n // const eventBulk: EventBulk>, RxStorageDefaultCheckpoint> = {\n // checkpoint: {\n // id: newDocData[this.primaryPath] as any,\n // lwt: newDocData._meta.lwt\n // },\n // context: 'mongodb-write',\n // id: eventBulkId,\n // events: [{\n // documentData: newDocData,\n // documentId,\n // operation: 'INSERT',\n // previousDocumentData: undefined,\n // }],\n // startTime: now(),\n // endTime: now()\n // };\n\n // this.changes$.next(eventBulk);\n // });\n\n\n return mongoCollection;\n });\n\n\n }\n\n /**\n * Bulk writes on the mongodb storage.\n * Notice that MongoDB does not support cross-document transactions\n * so we have to do a update-if-previous-is-correct like operations.\n * (Similar to what RxDB does with the revision system)\n */\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n this.writeQueue = this.writeQueue.then(async () => {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n\n const mongoCollection = await this.mongoCollectionPromise;\n if (this.closed) {\n return Promise.reject(new Error('already closed'));\n }\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n\n const docIds = documentWrites.map(d => (d.document as any)[primaryPath]);\n const documentStates = await this.findDocumentsById(\n docIds,\n true\n );\n const documentStatesMap = new Map();\n documentStates.forEach(doc => {\n const docId = doc[primaryPath];\n documentStatesMap.set(docId, doc);\n });\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentStatesMap,\n documentWrites,\n context\n );\n\n const changeByDocId = new Map>>();\n categorized.eventBulk.events.forEach(change => {\n changeByDocId.set(change.documentId, change);\n });\n\n\n ret.error = categorized.errors;\n\n /**\n * Reset the event bulk because\n * conflicts can still appear after the categorization\n */\n const eventBulk = categorized.eventBulk;\n eventBulk.events = [];\n\n await Promise.all([\n /**\n * Inserts\n * @link https://sparkbyexamples.com/mongodb/mongodb-insert-if-not-exists/\n */\n Promise.all(\n categorized.bulkInsertDocs.map(async (writeRow) => {\n const docId: string = writeRow.document[primaryPath] as any;\n const writeResult = await mongoCollection.findOneAndUpdate(\n {\n [this.inMongoPrimaryPath]: docId\n },\n {\n $setOnInsert: swapRxDocToMongo(writeRow.document)\n },\n {\n upsert: true,\n includeResultMetadata: true\n }\n );\n if (writeResult.value) {\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: swapMongoToRxDoc(ensureNotFalsy(writeResult.value)),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = changeByDocId.get(docId);\n if (event) {\n eventBulk.events.push(event);\n }\n ret.success.push(writeRow.document);\n }\n })\n ),\n /**\n * Updates\n */\n Promise.all(\n categorized.bulkUpdateDocs.map(async (writeRow) => {\n const docId = writeRow.document[primaryPath] as string;\n const writeResult = await mongoCollection.findOneAndReplace(\n {\n [this.inMongoPrimaryPath]: docId,\n _rev: ensureNotFalsy(writeRow.previous)._rev\n },\n swapRxDocToMongo(writeRow.document),\n {\n includeResultMetadata: true,\n upsert: false,\n returnDocument: 'before'\n }\n );\n if (!writeResult.ok) {\n const currentDocState = await this.findDocumentsById([docId], true);\n const currentDoc = currentDocState[0];\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: ensureNotFalsy(currentDoc),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = getFromMapOrThrow(changeByDocId, docId);\n eventBulk.events.push(event);\n ret.success.push(writeRow.document);\n }\n\n })\n )\n ]);\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return ret;\n });\n return this.writeQueue;\n\n }\n\n async findDocumentsById(\n docIds: string[],\n withDeleted: boolean,\n session?: ClientSession\n ): Promise[]> {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const primaryPath = this.primaryPath;\n\n const plainQuery: MongoQuerySelector = {\n [primaryPath]: {\n $in: docIds\n }\n };\n if (!withDeleted) {\n plainQuery._deleted = false;\n }\n const result: RxDocumentData[] = [];\n const queryResult = await mongoCollection.find(\n plainQuery,\n {\n session\n }\n ).toArray();\n queryResult.forEach(row => {\n result.push(\n swapMongoToRxDoc(\n row as any\n )\n );\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return result;\n }\n\n async query(\n originalPreparedQuery: PreparedQuery\n ): Promise> {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n\n let query = mongoCollection.find(preparedQuery.mongoSelector);\n if (preparedQuery.query.skip) {\n query = query.skip(preparedQuery.query.skip);\n }\n if (preparedQuery.query.limit) {\n query = query.limit(preparedQuery.query.limit);\n }\n if (preparedQuery.query.sort) {\n query = query.sort(preparedQuery.mongoSort);\n }\n const resultDocs = await query.toArray();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n documents: resultDocs.map(d => swapMongoToRxDoc(d))\n };\n }\n\n async count(\n originalPreparedQuery: PreparedQuery\n ): Promise {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n const count = await mongoCollection.countDocuments(preparedQuery.mongoSelector);\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n count,\n mode: 'fast'\n };\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const maxDeletionTime = now() - minimumDeletedTime;\n await mongoCollection.deleteMany({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return true;\n }\n\n async getAttachmentData(\n _documentId: string,\n _attachmentId: string,\n _digest: string\n ): Promise {\n await this.mongoCollectionPromise;\n throw new Error('attachments not implemented, make a PR');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$;\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n await mongoCollection.drop();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n await this.close();\n }\n\n async close(): Promise {\n // TODO without this next-tick we have random fails in the tests\n await requestIdlePromise(200);\n\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n await this.mongoCollectionPromise;\n await firstValueFrom(this.runningOperations.pipe(filter(c => c === 0)));\n // await ensureNotFalsy(this.mongoChangeStream).close();\n await this.mongoClient.close();\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n}\n\nexport function createMongoDBStorageInstance(\n storage: RxStorageMongoDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMongoDBSettings\n): Promise> {\n const instance = new RxStorageInstanceMongoDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n {},\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-mongodb/rx-storage-mongodb.js.map b/dist/cjs/plugins/storage-mongodb/rx-storage-mongodb.js.map index dfcefc2c20a..2ae5549fc84 100644 --- a/dist/cjs/plugins/storage-mongodb/rx-storage-mongodb.js.map +++ b/dist/cjs/plugins/storage-mongodb/rx-storage-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-mongodb.js","names":["_rxStorageHelper","require","_mongodbHelper","_rxStorageInstanceMongodb","_utilsRxdbVersion","RxStorageMongoDB","exports","databaseSettings","name","RX_STORAGE_NAME_MONGODB","rxdbVersion","RXDB_VERSION","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createMongoDBStorageInstance","getRxStorageMongoDB","storage"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-mongodb.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RX_STORAGE_NAME_MONGODB } from './mongodb-helper.ts';\nimport type { MongoDBDatabaseSettings, MongoDBSettings, MongoDBStorageInternals } from './mongodb-types.ts';\nimport { RxStorageInstanceMongoDB, createMongoDBStorageInstance } from './rx-storage-instance-mongodb.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageMongoDB implements RxStorage {\n public name = RX_STORAGE_NAME_MONGODB;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public databaseSettings: MongoDBDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createMongoDBStorageInstance(this, params, this.databaseSettings);\n }\n}\n\nexport function getRxStorageMongoDB(\n databaseSettings: MongoDBDatabaseSettings\n): RxStorageMongoDB {\n const storage = new RxStorageMongoDB(databaseSettings);\n return storage;\n}\n"],"mappings":";;;;;;;AAKA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AAEA,IAAAE,yBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAEjDI,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA;EAIzB,SAAAA,iBACWE,gBAAyC,EAClD;IAAA,KALKC,IAAI,GAAGC,sCAAuB;IAAA,KACrBC,WAAW,GAAGC,8BAAY;IAAA,KAG/BJ,gBAAyC,GAAzCA,gBAAyC;EAChD;EAAC,IAAAK,MAAA,GAAAP,gBAAA,CAAAQ,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAmE,EACvB;IAC5C,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,sDAA4B,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACR,gBAAgB,CAAC;EAC5E,CAAC;EAAA,OAAAF,gBAAA;AAAA;AAGE,SAASa,mBAAmBA,CAC/BX,gBAAyC,EACzB;EAChB,IAAMY,OAAO,GAAG,IAAId,gBAAgB,CAACE,gBAAgB,CAAC;EACtD,OAAOY,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-mongodb.js","names":["_rxStorageHelper","require","_mongodbHelper","_rxStorageInstanceMongodb","_utilsRxdbVersion","RxStorageMongoDB","exports","databaseSettings","name","RX_STORAGE_NAME_MONGODB","rxdbVersion","RXDB_VERSION","_proto","prototype","createStorageInstance","params","ensureRxStorageInstanceParamsAreCorrect","createMongoDBStorageInstance","getRxStorageMongoDB","storage"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-mongodb.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RX_STORAGE_NAME_MONGODB } from './mongodb-helper.ts';\nimport type { MongoDBDatabaseSettings, MongoDBSettings, MongoDBStorageInternals } from './mongodb-types.ts';\nimport { RxStorageInstanceMongoDB, createMongoDBStorageInstance } from './rx-storage-instance-mongodb.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageMongoDB implements RxStorage {\n public name = RX_STORAGE_NAME_MONGODB;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public databaseSettings: MongoDBDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createMongoDBStorageInstance(this, params, this.databaseSettings);\n }\n}\n\nexport function getRxStorageMongoDB(\n databaseSettings: MongoDBDatabaseSettings\n): RxStorageMongoDB {\n const storage = new RxStorageMongoDB(databaseSettings);\n return storage;\n}\n"],"mappings":";;;;;;;AAKA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AAEA,IAAAE,yBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAA8D,IAEjDI,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA;EAIzB,SAAAA,iBACWE,gBAAyC,EAClD;IAAA,KALKC,IAAI,GAAGC,sCAAuB;IAAA,KACrBC,WAAW,GAAGC,8BAAY;IAAA,KAG/BJ,gBAAyC,GAAzCA,gBAAyC;EAChD;EAAC,IAAAK,MAAA,GAAAP,gBAAA,CAAAQ,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAmE,EACvB;IAC5C,IAAAC,wDAAuC,EAACD,MAAM,CAAC;IAC/C,OAAO,IAAAE,sDAA4B,EAAC,IAAI,EAAEF,MAAM,EAAE,IAAI,CAACR,gBAAgB,CAAC;EAC5E,CAAC;EAAA,OAAAF,gBAAA;AAAA;AAGE,SAASa,mBAAmBA,CAC/BX,gBAAyC,EACzB;EAChB,IAAMY,OAAO,GAAG,IAAId,gBAAgB,CAACE,gBAAgB,CAAC;EACtD,OAAOY,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/plugins/storage-remote/rx-storage-remote.js.map b/dist/cjs/plugins/storage-remote/rx-storage-remote.js.map index 24bf077c696..f83a1067766 100644 --- a/dist/cjs/plugins/storage-remote/rx-storage-remote.js.map +++ b/dist/cjs/plugins/storage-remote/rx-storage-remote.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-remote.js","names":["_rxjs","require","_index","_messageChannelCache","RxStorageRemote","exports","settings","name","rxdbVersion","RXDB_VERSION","seed","randomCouchString","lastRequestId","mode","messageChannelIfOneMode","getMessageChannel","_proto","prototype","getRequestId","newId","createStorageInstance","params","connectionId","cacheKeys","push","collectionName","databaseName","messageChannel","requestId","waitForOkPromise","firstValueFrom","messages$","pipe","filter","msg","answerTo","send","method","waitForOkResult","error","closeMessageChannel","Error","JSON","stringify","RxStorageInstanceRemote","schema","options","customRequest","data","messageChannelCreator","waitForAnswerPromise","response","close","return","getMessageReturn","parse","storage","internals","changes$","Subject","conflicts$","subs","subscribe","next","_proto2","requestRemote","methodName","responsePromise","message","bulkWrite","documentWrites","context","findDocumentsById","ids","deleted","query","preparedQuery","count","getAttachmentData","documentId","attachmentId","digest","getChangedDocumentsSince","limit","checkpoint","changeStream","asObservable","cleanup","minDeletedTime","closed","forEach","sub","unsubscribe","complete","remove","conflictResultionTasks","resolveConflictResultionTask","taskSolution","getRxStorageRemote","withDefaults","Object","assign"],"sources":["../../../../src/plugins/storage-remote/rx-storage-remote.ts"],"sourcesContent":["import {\n firstValueFrom,\n filter,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n BulkWriteRow,\n EventBulk,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorage,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult\n} from '../../types/index.d.ts';\nimport {\n RXDB_VERSION,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport type {\n MessageFromRemote,\n MessageToRemote,\n RemoteMessageChannel,\n RxStorageRemoteInternals,\n RxStorageRemoteSettings\n} from './storage-remote-types.ts';\nimport { closeMessageChannel, getMessageChannel } from './message-channel-cache.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\n\n\nexport class RxStorageRemote implements RxStorage {\n public readonly name: string = 'remote';\n public readonly rxdbVersion = RXDB_VERSION;\n\n private seed: string = randomCouchString(10);\n private lastRequestId: number = 0;\n public messageChannelIfOneMode?: Promise;\n constructor(\n public readonly settings: RxStorageRemoteSettings\n ) {\n if (settings.mode === 'one') {\n this.messageChannelIfOneMode = getMessageChannel(\n settings,\n [],\n true\n );\n }\n }\n\n public getRequestId() {\n const newId = this.lastRequestId++;\n return this.seed + '|' + newId;\n }\n\n async createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n const connectionId = 'c|' + this.getRequestId();\n\n const cacheKeys: string[] = [\n 'mode-' + this.settings.mode\n ];\n switch (this.settings.mode) {\n case 'collection':\n cacheKeys.push('collection-' + params.collectionName);\n // eslint-disable-next-line no-fallthrough\n case 'database':\n cacheKeys.push('database-' + params.databaseName);\n // eslint-disable-next-line no-fallthrough\n case 'storage':\n cacheKeys.push('seed-' + this.seed);\n }\n const messageChannel = await (this.messageChannelIfOneMode ?\n this.messageChannelIfOneMode :\n getMessageChannel(\n this.settings,\n cacheKeys\n )\n );\n\n const requestId = this.getRequestId();\n const waitForOkPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'create',\n requestId,\n params\n });\n\n const waitForOkResult = await waitForOkPromise;\n if (waitForOkResult.error) {\n await closeMessageChannel(messageChannel);\n throw new Error('could not create instance ' + JSON.stringify(waitForOkResult.error));\n }\n\n return new RxStorageInstanceRemote(\n this,\n params.databaseName,\n params.collectionName,\n params.schema,\n {\n params,\n connectionId,\n messageChannel\n },\n params.options\n );\n }\n\n async customRequest(data: In): Promise {\n const messageChannel = await this.settings.messageChannelCreator();\n const requestId = this.getRequestId();\n const connectionId = 'custom|request|' + requestId;\n const waitForAnswerPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'custom',\n requestId,\n params: data\n });\n const response = await waitForAnswerPromise;\n if (response.error) {\n await messageChannel.close();\n throw new Error('could not run customRequest(): ' + JSON.stringify({\n data,\n error: response.error\n }));\n } else {\n await messageChannel.close();\n return response.return;\n }\n\n }\n}\n\n/**\n * Because postMessage() can be very slow on complex objects,\n * and some RxStorage implementations do need a JSON-string internally\n * anyway, it is allowed to transfer a string instead of an object\n * which must then be JSON.parse()-ed before RxDB can use it.\n * @link https://surma.dev/things/is-postmessage-slow/\n */\nfunction getMessageReturn(\n msg: MessageFromRemote\n) {\n if (msg.method === 'getAttachmentData') {\n return msg.return;\n } else {\n if (typeof msg.return === 'string') {\n return JSON.parse(msg.return);\n } else {\n return msg.return;\n }\n }\n}\n\nexport class RxStorageInstanceRemote implements RxStorageInstance {\n private changes$: Subject>, any>> = new Subject();\n private conflicts$: Subject> = new Subject();\n private subs: Subscription[] = [];\n\n private closed?: Promise;\n messages$: Observable;\n\n constructor(\n public readonly storage: RxStorageRemote,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: RxStorageRemoteInternals,\n public readonly options: Readonly\n ) {\n this.messages$ = this.internals.messageChannel.messages$.pipe(\n filter(msg => msg.connectionId === this.internals.connectionId)\n );\n this.subs.push(\n this.messages$.subscribe(msg => {\n if (msg.method === 'changeStream') {\n this.changes$.next(getMessageReturn(msg));\n }\n if (msg.method === 'conflictResultionTasks') {\n this.conflicts$.next(msg.return);\n }\n })\n );\n }\n\n private async requestRemote(\n methodName: keyof RxStorageInstance,\n params: any\n ) {\n const requestId = this.storage.getRequestId();\n const responsePromise = firstValueFrom(\n this.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n )\n );\n const message: MessageToRemote = {\n connectionId: this.internals.connectionId,\n requestId,\n method: methodName,\n params\n };\n this.internals.messageChannel.send(message);\n const response = await responsePromise;\n if (response.error) {\n throw new Error('could not requestRemote: ' + JSON.stringify({\n methodName,\n params,\n error: response.error\n }, null, 4));\n } else {\n return getMessageReturn(response);\n }\n }\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n return this.requestRemote('bulkWrite', [documentWrites, context]);\n }\n findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n return this.requestRemote('findDocumentsById', [ids, deleted]);\n }\n query(preparedQuery: any): Promise> {\n return this.requestRemote('query', [preparedQuery]);\n }\n count(preparedQuery: any): Promise {\n return this.requestRemote('count', [preparedQuery]);\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n return this.requestRemote('getAttachmentData', [documentId, attachmentId, digest]);\n }\n getChangedDocumentsSince(\n limit: number,\n checkpoint?: any\n ): Promise<\n {\n documents: RxDocumentData[];\n checkpoint: any;\n }> {\n return this.requestRemote('getChangedDocumentsSince', [limit, checkpoint]);\n }\n changeStream(): Observable>, any>> {\n return this.changes$.asObservable();\n }\n cleanup(minDeletedTime: number): Promise {\n return this.requestRemote('cleanup', [minDeletedTime]);\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.subs.forEach(sub => sub.unsubscribe());\n this.changes$.complete();\n await this.requestRemote('close', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.closed = (async () => {\n await this.requestRemote('remove', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n conflictResultionTasks(): Observable> {\n return this.conflicts$;\n }\n async resolveConflictResultionTask(taskSolution: RxConflictResultionTaskSolution): Promise {\n await this.requestRemote('resolveConflictResultionTask', [taskSolution]);\n }\n}\n\nexport function getRxStorageRemote(settings: RxStorageRemoteSettings): RxStorageRemote {\n const withDefaults = Object.assign({\n mode: 'storage'\n }, settings);\n return new RxStorageRemote(withDefaults);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-remote.js","names":["_rxjs","require","_index","_messageChannelCache","RxStorageRemote","exports","settings","name","rxdbVersion","RXDB_VERSION","seed","randomCouchString","lastRequestId","mode","messageChannelIfOneMode","getMessageChannel","_proto","prototype","getRequestId","newId","createStorageInstance","params","connectionId","cacheKeys","push","collectionName","databaseName","messageChannel","requestId","waitForOkPromise","firstValueFrom","messages$","pipe","filter","msg","answerTo","send","method","waitForOkResult","error","closeMessageChannel","Error","JSON","stringify","RxStorageInstanceRemote","schema","options","customRequest","data","messageChannelCreator","waitForAnswerPromise","response","close","return","getMessageReturn","parse","storage","internals","changes$","Subject","conflicts$","subs","subscribe","next","_proto2","requestRemote","methodName","responsePromise","message","bulkWrite","documentWrites","context","findDocumentsById","ids","deleted","query","preparedQuery","count","getAttachmentData","documentId","attachmentId","digest","getChangedDocumentsSince","limit","checkpoint","changeStream","asObservable","cleanup","minDeletedTime","closed","forEach","sub","unsubscribe","complete","remove","conflictResultionTasks","resolveConflictResultionTask","taskSolution","getRxStorageRemote","withDefaults","Object","assign"],"sources":["../../../../src/plugins/storage-remote/rx-storage-remote.ts"],"sourcesContent":["import {\n firstValueFrom,\n filter,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n BulkWriteRow,\n EventBulk,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorage,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult\n} from '../../types/index.d.ts';\nimport {\n RXDB_VERSION,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport type {\n MessageFromRemote,\n MessageToRemote,\n RemoteMessageChannel,\n RxStorageRemoteInternals,\n RxStorageRemoteSettings\n} from './storage-remote-types.ts';\nimport { closeMessageChannel, getMessageChannel } from './message-channel-cache.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\n\n\nexport class RxStorageRemote implements RxStorage {\n public readonly name: string = 'remote';\n public readonly rxdbVersion = RXDB_VERSION;\n\n private seed: string = randomCouchString(10);\n private lastRequestId: number = 0;\n public messageChannelIfOneMode?: Promise;\n constructor(\n public readonly settings: RxStorageRemoteSettings\n ) {\n if (settings.mode === 'one') {\n this.messageChannelIfOneMode = getMessageChannel(\n settings,\n [],\n true\n );\n }\n }\n\n public getRequestId() {\n const newId = this.lastRequestId++;\n return this.seed + '|' + newId;\n }\n\n async createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n const connectionId = 'c|' + this.getRequestId();\n\n const cacheKeys: string[] = [\n 'mode-' + this.settings.mode\n ];\n switch (this.settings.mode) {\n case 'collection':\n cacheKeys.push('collection-' + params.collectionName);\n // eslint-disable-next-line no-fallthrough\n case 'database':\n cacheKeys.push('database-' + params.databaseName);\n // eslint-disable-next-line no-fallthrough\n case 'storage':\n cacheKeys.push('seed-' + this.seed);\n }\n const messageChannel = await (this.messageChannelIfOneMode ?\n this.messageChannelIfOneMode :\n getMessageChannel(\n this.settings,\n cacheKeys\n )\n );\n\n const requestId = this.getRequestId();\n const waitForOkPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'create',\n requestId,\n params\n });\n\n const waitForOkResult = await waitForOkPromise;\n if (waitForOkResult.error) {\n await closeMessageChannel(messageChannel);\n throw new Error('could not create instance ' + JSON.stringify(waitForOkResult.error));\n }\n\n return new RxStorageInstanceRemote(\n this,\n params.databaseName,\n params.collectionName,\n params.schema,\n {\n params,\n connectionId,\n messageChannel\n },\n params.options\n );\n }\n\n async customRequest(data: In): Promise {\n const messageChannel = await this.settings.messageChannelCreator();\n const requestId = this.getRequestId();\n const connectionId = 'custom|request|' + requestId;\n const waitForAnswerPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'custom',\n requestId,\n params: data\n });\n const response = await waitForAnswerPromise;\n if (response.error) {\n await messageChannel.close();\n throw new Error('could not run customRequest(): ' + JSON.stringify({\n data,\n error: response.error\n }));\n } else {\n await messageChannel.close();\n return response.return;\n }\n\n }\n}\n\n/**\n * Because postMessage() can be very slow on complex objects,\n * and some RxStorage implementations do need a JSON-string internally\n * anyway, it is allowed to transfer a string instead of an object\n * which must then be JSON.parse()-ed before RxDB can use it.\n * @link https://surma.dev/things/is-postmessage-slow/\n */\nfunction getMessageReturn(\n msg: MessageFromRemote\n) {\n if (msg.method === 'getAttachmentData') {\n return msg.return;\n } else {\n if (typeof msg.return === 'string') {\n return JSON.parse(msg.return);\n } else {\n return msg.return;\n }\n }\n}\n\nexport class RxStorageInstanceRemote implements RxStorageInstance {\n private changes$: Subject>, any>> = new Subject();\n private conflicts$: Subject> = new Subject();\n private subs: Subscription[] = [];\n\n private closed?: Promise;\n messages$: Observable;\n\n constructor(\n public readonly storage: RxStorageRemote,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: RxStorageRemoteInternals,\n public readonly options: Readonly\n ) {\n this.messages$ = this.internals.messageChannel.messages$.pipe(\n filter(msg => msg.connectionId === this.internals.connectionId)\n );\n this.subs.push(\n this.messages$.subscribe(msg => {\n if (msg.method === 'changeStream') {\n this.changes$.next(getMessageReturn(msg));\n }\n if (msg.method === 'conflictResultionTasks') {\n this.conflicts$.next(msg.return);\n }\n })\n );\n }\n\n private async requestRemote(\n methodName: keyof RxStorageInstance,\n params: any\n ) {\n const requestId = this.storage.getRequestId();\n const responsePromise = firstValueFrom(\n this.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n )\n );\n const message: MessageToRemote = {\n connectionId: this.internals.connectionId,\n requestId,\n method: methodName,\n params\n };\n this.internals.messageChannel.send(message);\n const response = await responsePromise;\n if (response.error) {\n throw new Error('could not requestRemote: ' + JSON.stringify({\n methodName,\n params,\n error: response.error\n }, null, 4));\n } else {\n return getMessageReturn(response);\n }\n }\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n return this.requestRemote('bulkWrite', [documentWrites, context]);\n }\n findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n return this.requestRemote('findDocumentsById', [ids, deleted]);\n }\n query(preparedQuery: any): Promise> {\n return this.requestRemote('query', [preparedQuery]);\n }\n count(preparedQuery: any): Promise {\n return this.requestRemote('count', [preparedQuery]);\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n return this.requestRemote('getAttachmentData', [documentId, attachmentId, digest]);\n }\n getChangedDocumentsSince(\n limit: number,\n checkpoint?: any\n ): Promise<\n {\n documents: RxDocumentData[];\n checkpoint: any;\n }> {\n return this.requestRemote('getChangedDocumentsSince', [limit, checkpoint]);\n }\n changeStream(): Observable>, any>> {\n return this.changes$.asObservable();\n }\n cleanup(minDeletedTime: number): Promise {\n return this.requestRemote('cleanup', [minDeletedTime]);\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.subs.forEach(sub => sub.unsubscribe());\n this.changes$.complete();\n await this.requestRemote('close', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.closed = (async () => {\n await this.requestRemote('remove', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n conflictResultionTasks(): Observable> {\n return this.conflicts$;\n }\n async resolveConflictResultionTask(taskSolution: RxConflictResultionTaskSolution): Promise {\n await this.requestRemote('resolveConflictResultionTask', [taskSolution]);\n }\n}\n\nexport function getRxStorageRemote(settings: RxStorageRemoteSettings): RxStorageRemote {\n const withDefaults = Object.assign({\n mode: 'storage'\n }, settings);\n return new RxStorageRemote(withDefaults);\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAsBA,IAAAC,MAAA,GAAAD,OAAA;AAWA,IAAAE,oBAAA,GAAAF,OAAA;AAAoF,IAIvEG,eAAe,GAAAC,OAAA,CAAAD,eAAA;EAOxB,SAAAA,gBACoBE,QAAiC,EACnD;IAAA,KARcC,IAAI,GAAW,QAAQ;IAAA,KACvBC,WAAW,GAAGC,mBAAY;IAAA,KAElCC,IAAI,GAAW,IAAAC,wBAAiB,EAAC,EAAE,CAAC;IAAA,KACpCC,aAAa,GAAW,CAAC;IAAA,KAGbN,QAAiC,GAAjCA,QAAiC;IAEjD,IAAIA,QAAQ,CAACO,IAAI,KAAK,KAAK,EAAE;MACzB,IAAI,CAACC,uBAAuB,GAAG,IAAAC,sCAAiB,EAC5CT,QAAQ,EACR,EAAE,EACF,IACJ,CAAC;IACL;EACJ;EAAC,IAAAU,MAAA,GAAAZ,eAAA,CAAAa,SAAA;EAAAD,MAAA,CAEME,YAAY,GAAnB,SAAAA,aAAA,EAAsB;IAClB,IAAMC,KAAK,GAAG,IAAI,CAACP,aAAa,EAAE;IAClC,OAAO,IAAI,CAACF,IAAI,GAAG,GAAG,GAAGS,KAAK;EAClC,CAAC;EAAAH,MAAA,CAEKI,qBAAqB,GAA3B,eAAAA,sBACIC,MAAuD,EACZ;IAC3C,IAAMC,YAAY,GAAG,IAAI,GAAG,IAAI,CAACJ,YAAY,CAAC,CAAC;IAE/C,IAAMK,SAAmB,GAAG,CACxB,OAAO,GAAG,IAAI,CAACjB,QAAQ,CAACO,IAAI,CAC/B;IACD,QAAQ,IAAI,CAACP,QAAQ,CAACO,IAAI;MACtB,KAAK,YAAY;QACbU,SAAS,CAACC,IAAI,CAAC,aAAa,GAAGH,MAAM,CAACI,cAAc,CAAC;MACzD;MACA,KAAK,UAAU;QACXF,SAAS,CAACC,IAAI,CAAC,WAAW,GAAGH,MAAM,CAACK,YAAY,CAAC;MACrD;MACA,KAAK,SAAS;QACVH,SAAS,CAACC,IAAI,CAAC,OAAO,GAAG,IAAI,CAACd,IAAI,CAAC;IAC3C;IACA,IAAMiB,cAAc,GAAG,OAAO,IAAI,CAACb,uBAAuB,GACtD,IAAI,CAACA,uBAAuB,GAC5B,IAAAC,sCAAiB,EACb,IAAI,CAACT,QAAQ,EACbiB,SACJ,CAAC,CACJ;IAED,IAAMK,SAAS,GAAG,IAAI,CAACV,YAAY,CAAC,CAAC;IACrC,IAAMW,gBAAgB,GAAG,IAAAC,oBAAc,EAACH,cAAc,CAACI,SAAS,CAACC,IAAI,CACjE,IAAAC,YAAM,EAACC,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAKP,SAAS,CAC5C,CAAC,CAAC;IACFD,cAAc,CAACS,IAAI,CAAC;MAChBd,YAAY;MACZe,MAAM,EAAE,QAAQ;MAChBT,SAAS;MACTP;IACJ,CAAC,CAAC;IAEF,IAAMiB,eAAe,GAAG,MAAMT,gBAAgB;IAC9C,IAAIS,eAAe,CAACC,KAAK,EAAE;MACvB,MAAM,IAAAC,wCAAmB,EAACb,cAAc,CAAC;MACzC,MAAM,IAAIc,KAAK,CAAC,4BAA4B,GAAGC,IAAI,CAACC,SAAS,CAACL,eAAe,CAACC,KAAK,CAAC,CAAC;IACzF;IAEA,OAAO,IAAIK,uBAAuB,CAC9B,IAAI,EACJvB,MAAM,CAACK,YAAY,EACnBL,MAAM,CAACI,cAAc,EACrBJ,MAAM,CAACwB,MAAM,EACb;MACIxB,MAAM;MACNC,YAAY;MACZK;IACJ,CAAC,EACDN,MAAM,CAACyB,OACX,CAAC;EACL,CAAC;EAAA9B,MAAA,CAEK+B,aAAa,GAAnB,eAAAA,cAA6BC,IAAQ,EAAgB;IACjD,IAAMrB,cAAc,GAAG,MAAM,IAAI,CAACrB,QAAQ,CAAC2C,qBAAqB,CAAC,CAAC;IAClE,IAAMrB,SAAS,GAAG,IAAI,CAACV,YAAY,CAAC,CAAC;IACrC,IAAMI,YAAY,GAAG,iBAAiB,GAAGM,SAAS;IAClD,IAAMsB,oBAAoB,GAAG,IAAApB,oBAAc,EAACH,cAAc,CAACI,SAAS,CAACC,IAAI,CACrE,IAAAC,YAAM,EAACC,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAKP,SAAS,CAC5C,CAAC,CAAC;IACFD,cAAc,CAACS,IAAI,CAAC;MAChBd,YAAY;MACZe,MAAM,EAAE,QAAQ;MAChBT,SAAS;MACTP,MAAM,EAAE2B;IACZ,CAAC,CAAC;IACF,IAAMG,QAAQ,GAAG,MAAMD,oBAAoB;IAC3C,IAAIC,QAAQ,CAACZ,KAAK,EAAE;MAChB,MAAMZ,cAAc,CAACyB,KAAK,CAAC,CAAC;MAC5B,MAAM,IAAIX,KAAK,CAAC,iCAAiC,GAAGC,IAAI,CAACC,SAAS,CAAC;QAC/DK,IAAI;QACJT,KAAK,EAAEY,QAAQ,CAACZ;MACpB,CAAC,CAAC,CAAC;IACP,CAAC,MAAM;MACH,MAAMZ,cAAc,CAACyB,KAAK,CAAC,CAAC;MAC5B,OAAOD,QAAQ,CAACE,MAAM;IAC1B;EAEJ,CAAC;EAAA,OAAAjD,eAAA;AAAA;AAGL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASkD,gBAAgBA,CACrBpB,GAAsB,EACxB;EACE,IAAIA,GAAG,CAACG,MAAM,KAAK,mBAAmB,EAAE;IACpC,OAAOH,GAAG,CAACmB,MAAM;EACrB,CAAC,MAAM;IACH,IAAI,OAAOnB,GAAG,CAACmB,MAAM,KAAK,QAAQ,EAAE;MAChC,OAAOX,IAAI,CAACa,KAAK,CAACrB,GAAG,CAACmB,MAAM,CAAC;IACjC,CAAC,MAAM;MACH,OAAOnB,GAAG,CAACmB,MAAM;IACrB;EACJ;AACJ;AAAC,IAEYT,uBAAuB,GAAAvC,OAAA,CAAAuC,uBAAA;EAQhC,SAAAA,wBACoBY,OAAwB,EACxB9B,YAAoB,EACpBD,cAAsB,EACtBoB,MAAyD,EACzDY,SAAmC,EACnCX,OAAsB,EACxC;IAAA,KAdMY,QAAQ,GAA6E,IAAIC,aAAO,CAAC,CAAC;IAAA,KAClGC,UAAU,GAAgD,IAAID,aAAO,CAAC,CAAC;IAAA,KACvEE,IAAI,GAAmB,EAAE;IAAA,KAMbL,OAAwB,GAAxBA,OAAwB;IAAA,KACxB9B,YAAoB,GAApBA,YAAoB;IAAA,KACpBD,cAAsB,GAAtBA,cAAsB;IAAA,KACtBoB,MAAyD,GAAzDA,MAAyD;IAAA,KACzDY,SAAmC,GAAnCA,SAAmC;IAAA,KACnCX,OAAsB,GAAtBA,OAAsB;IAEtC,IAAI,CAACf,SAAS,GAAG,IAAI,CAAC0B,SAAS,CAAC9B,cAAc,CAACI,SAAS,CAACC,IAAI,CACzD,IAAAC,YAAM,EAACC,GAAG,IAAIA,GAAG,CAACZ,YAAY,KAAK,IAAI,CAACmC,SAAS,CAACnC,YAAY,CAClE,CAAC;IACD,IAAI,CAACuC,IAAI,CAACrC,IAAI,CACV,IAAI,CAACO,SAAS,CAAC+B,SAAS,CAAC5B,GAAG,IAAI;MAC5B,IAAIA,GAAG,CAACG,MAAM,KAAK,cAAc,EAAE;QAC/B,IAAI,CAACqB,QAAQ,CAACK,IAAI,CAACT,gBAAgB,CAACpB,GAAG,CAAC,CAAC;MAC7C;MACA,IAAIA,GAAG,CAACG,MAAM,KAAK,wBAAwB,EAAE;QACzC,IAAI,CAACuB,UAAU,CAACG,IAAI,CAAC7B,GAAG,CAACmB,MAAM,CAAC;MACpC;IACJ,CAAC,CACL,CAAC;EACL;EAAC,IAAAW,OAAA,GAAApB,uBAAA,CAAA3B,SAAA;EAAA+C,OAAA,CAEaC,aAAa,GAA3B,eAAAA,cACIC,UAAkD,EAClD7C,MAAW,EACb;IACE,IAAMO,SAAS,GAAG,IAAI,CAAC4B,OAAO,CAACtC,YAAY,CAAC,CAAC;IAC7C,IAAMiD,eAAe,GAAG,IAAArC,oBAAc,EAClC,IAAI,CAACC,SAAS,CAACC,IAAI,CACf,IAAAC,YAAM,EAACC,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAKP,SAAS,CAC5C,CACJ,CAAC;IACD,IAAMwC,OAAwB,GAAG;MAC7B9C,YAAY,EAAE,IAAI,CAACmC,SAAS,CAACnC,YAAY;MACzCM,SAAS;MACTS,MAAM,EAAE6B,UAAU;MAClB7C;IACJ,CAAC;IACD,IAAI,CAACoC,SAAS,CAAC9B,cAAc,CAACS,IAAI,CAACgC,OAAO,CAAC;IAC3C,IAAMjB,QAAQ,GAAG,MAAMgB,eAAe;IACtC,IAAIhB,QAAQ,CAACZ,KAAK,EAAE;MAChB,MAAM,IAAIE,KAAK,CAAC,2BAA2B,GAAGC,IAAI,CAACC,SAAS,CAAC;QACzDuB,UAAU;QACV7C,MAAM;QACNkB,KAAK,EAAEY,QAAQ,CAACZ;MACpB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC,MAAM;MACH,OAAOe,gBAAgB,CAACH,QAAQ,CAAC;IACrC;EACJ,CAAC;EAAAa,OAAA,CACDK,SAAS,GAAT,SAAAA,UACIC,cAAyC,EACzCC,OAAe,EAC+B;IAC9C,OAAO,IAAI,CAACN,aAAa,CAAC,WAAW,EAAE,CAACK,cAAc,EAAEC,OAAO,CAAC,CAAC;EACrE,CAAC;EAAAP,OAAA,CACDQ,iBAAiB,GAAjB,SAAAA,kBAAkBC,GAAa,EAAEC,OAAgB,EAAwC;IACrF,OAAO,IAAI,CAACT,aAAa,CAAC,mBAAmB,EAAE,CAACQ,GAAG,EAAEC,OAAO,CAAC,CAAC;EAClE,CAAC;EAAAV,OAAA,CACDW,KAAK,GAAL,SAAAA,MAAMC,aAAkB,EAA4C;IAChE,OAAO,IAAI,CAACX,aAAa,CAAC,OAAO,EAAE,CAACW,aAAa,CAAC,CAAC;EACvD,CAAC;EAAAZ,OAAA,CACDa,KAAK,GAAL,SAAAA,MAAMD,aAAkB,EAAiC;IACrD,OAAO,IAAI,CAACX,aAAa,CAAC,OAAO,EAAE,CAACW,aAAa,CAAC,CAAC;EACvD,CAAC;EAAAZ,OAAA,CACDc,iBAAiB,GAAjB,SAAAA,kBAAkBC,UAAkB,EAAEC,YAAoB,EAAEC,MAAc,EAAmB;IACzF,OAAO,IAAI,CAAChB,aAAa,CAAC,mBAAmB,EAAE,CAACc,UAAU,EAAEC,YAAY,EAAEC,MAAM,CAAC,CAAC;EACtF,CAAC;EAAAjB,OAAA,CACDkB,wBAAwB,GAAxB,SAAAA,yBACIC,KAAa,EACbC,UAAgB,EAKb;IACH,OAAO,IAAI,CAACnB,aAAa,CAAC,0BAA0B,EAAE,CAACkB,KAAK,EAAEC,UAAU,CAAC,CAAC;EAC9E,CAAC;EAAApB,OAAA,CACDqB,YAAY,GAAZ,SAAAA,aAAA,EAA4F;IACxF,OAAO,IAAI,CAAC3B,QAAQ,CAAC4B,YAAY,CAAC,CAAC;EACvC,CAAC;EAAAtB,OAAA,CACDuB,OAAO,GAAP,SAAAA,QAAQC,cAAsB,EAAoB;IAC9C,OAAO,IAAI,CAACvB,aAAa,CAAC,SAAS,EAAE,CAACuB,cAAc,CAAC,CAAC;EAC1D,CAAC;EAAAxB,OAAA,CACKZ,KAAK,GAAX,eAAAA,MAAA,EAA6B;IACzB,IAAI,IAAI,CAACqC,MAAM,EAAE;MACb,OAAO,IAAI,CAACA,MAAM;IACtB;IACA,IAAI,CAACA,MAAM,GAAG,CAAC,YAAY;MACvB,IAAI,CAAC5B,IAAI,CAAC6B,OAAO,CAACC,GAAG,IAAIA,GAAG,CAACC,WAAW,CAAC,CAAC,CAAC;MAC3C,IAAI,CAAClC,QAAQ,CAACmC,QAAQ,CAAC,CAAC;MACxB,MAAM,IAAI,CAAC5B,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;MACrC,MAAM,IAAAzB,wCAAmB,EAAC,IAAI,CAACiB,SAAS,CAAC9B,cAAc,CAAC;IAC5D,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAAC8D,MAAM;EACtB,CAAC;EAAAzB,OAAA,CACK8B,MAAM,GAAZ,eAAAA,OAAA,EAA8B;IAC1B,IAAI,IAAI,CAACL,MAAM,EAAE;MACb,MAAM,IAAIhD,KAAK,CAAC,gBAAgB,CAAC;IACrC;IACA,IAAI,CAACgD,MAAM,GAAG,CAAC,YAAY;MACvB,MAAM,IAAI,CAACxB,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;MACtC,MAAM,IAAAzB,wCAAmB,EAAC,IAAI,CAACiB,SAAS,CAAC9B,cAAc,CAAC;IAC5D,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAAC8D,MAAM;EACtB,CAAC;EAAAzB,OAAA,CACD+B,sBAAsB,GAAtB,SAAAA,uBAAA,EAAyE;IACrE,OAAO,IAAI,CAACnC,UAAU;EAC1B,CAAC;EAAAI,OAAA,CACKgC,4BAA4B,GAAlC,eAAAA,6BAAmCC,YAAwD,EAAiB;IACxG,MAAM,IAAI,CAAChC,aAAa,CAAC,8BAA8B,EAAE,CAACgC,YAAY,CAAC,CAAC;EAC5E,CAAC;EAAA,OAAArD,uBAAA;AAAA;AAGE,SAASsD,kBAAkBA,CAAC5F,QAAiC,EAAmB;EACnF,IAAM6F,YAAY,GAAGC,MAAM,CAACC,MAAM,CAAC;IAC/BxF,IAAI,EAAE;EACV,CAAC,EAAEP,QAAQ,CAAC;EACZ,OAAO,IAAIF,eAAe,CAAC+F,YAAY,CAAC;AAC5C","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/query-cache.js.map b/dist/cjs/query-cache.js.map index 5d17500a908..4b4d89d17d4 100644 --- a/dist/cjs/query-cache.js.map +++ b/dist/cjs/query-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"query-cache.js","names":["_index","require","QueryCache","exports","_map","Map","_proto","prototype","getByQuery","rxQuery","stringRep","toString","getFromMapOrCreate","createQueryCache","uncacheRxQuery","queryCache","uncached","delete","countRxQuerySubscribers","refCount$","observers","length","DEFAULT_TRY_TO_KEEP_MAX","DEFAULT_UNEXECUTED_LIFETIME","defaultCacheReplacementPolicyMonad","tryToKeepMax","unExecutedLifetime","_collection","size","minUnExecutedLifetime","now","maybeUncache","queriesInCache","Array","from","values","_lastEnsureEqual","_creationTime","push","mustUncache","sortedByLastUsage","sort","a","b","toRemove","slice","forEach","defaultCacheReplacementPolicy","COLLECTIONS_WITH_RUNNING_CLEANUP","WeakSet","triggerCacheReplacement","rxCollection","has","add","nextTick","then","requestIdlePromise","destroyed","cacheReplacementPolicy","_queryCache"],"sources":["../../src/query-cache.ts"],"sourcesContent":["/**\n * the query-cache makes sure that on every query-state, exactly one instance can exist\n * if you use the same mango-query more then once, it will reuse the first RxQuery\n */\nimport type {\n RxQuery,\n RxCacheReplacementPolicy,\n RxCollection\n} from './types/index.d.ts';\nimport {\n getFromMapOrCreate,\n nextTick,\n now,\n requestIdlePromise\n} from './plugins/utils/index.ts';\n\nexport class QueryCache {\n public _map: Map = new Map();\n\n /**\n * check if an equal query is in the cache,\n * if true, return the cached one,\n * if false, save the given one and return it\n */\n getByQuery(rxQuery: RxQuery): RxQuery {\n const stringRep = rxQuery.toString();\n return getFromMapOrCreate(\n this._map,\n stringRep,\n () => rxQuery\n );\n }\n}\n\nexport function createQueryCache() {\n return new QueryCache();\n}\n\n\nexport function uncacheRxQuery(queryCache: QueryCache, rxQuery: RxQuery) {\n rxQuery.uncached = true;\n const stringRep = rxQuery.toString();\n queryCache._map.delete(stringRep);\n\n}\n\n\nexport function countRxQuerySubscribers(rxQuery: RxQuery): number {\n return rxQuery.refCount$.observers.length;\n}\n\n\nexport const DEFAULT_TRY_TO_KEEP_MAX = 100;\nexport const DEFAULT_UNEXECUTED_LIFETIME = 30 * 1000;\n\n/**\n * The default cache replacement policy\n * See docs-src/query-cache.md to learn how it should work.\n * Notice that this runs often and should block the cpu as less as possible\n * This is a monad which makes it easier to unit test\n */\nexport const defaultCacheReplacementPolicyMonad: (\n tryToKeepMax: number,\n unExecutedLifetime: number\n) => RxCacheReplacementPolicy = (\n tryToKeepMax,\n unExecutedLifetime\n) => (\n _collection: RxCollection,\n queryCache: QueryCache\n) => {\n if (queryCache._map.size < tryToKeepMax) {\n return;\n }\n\n const minUnExecutedLifetime = now() - unExecutedLifetime;\n const maybeUncache: RxQuery[] = [];\n\n const queriesInCache = Array.from(queryCache._map.values());\n for (const rxQuery of queriesInCache) {\n // filter out queries with subscribers\n if (countRxQuerySubscribers(rxQuery) > 0) {\n continue;\n }\n // directly uncache queries that never executed and are older then unExecutedLifetime\n if (rxQuery._lastEnsureEqual === 0 && rxQuery._creationTime < minUnExecutedLifetime) {\n uncacheRxQuery(queryCache, rxQuery);\n continue;\n }\n maybeUncache.push(rxQuery);\n }\n\n const mustUncache = maybeUncache.length - tryToKeepMax;\n if (mustUncache <= 0) {\n return;\n }\n\n const sortedByLastUsage = maybeUncache.sort((a, b) => a._lastEnsureEqual - b._lastEnsureEqual);\n const toRemove = sortedByLastUsage.slice(0, mustUncache);\n toRemove.forEach(rxQuery => uncacheRxQuery(queryCache, rxQuery));\n };\n\n\nexport const defaultCacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicyMonad(\n DEFAULT_TRY_TO_KEEP_MAX,\n DEFAULT_UNEXECUTED_LIFETIME\n);\n\nexport const COLLECTIONS_WITH_RUNNING_CLEANUP: WeakSet = new WeakSet();\n\n/**\n * Triggers the cache replacement policy after waitTime has passed.\n * We do not run this directly because at exactly the time a query is created,\n * we need all CPU to minimize latency.\n * Also this should not be triggered multiple times when waitTime is still waiting.\n */\nexport function triggerCacheReplacement(\n rxCollection: RxCollection\n) {\n if (COLLECTIONS_WITH_RUNNING_CLEANUP.has(rxCollection)) {\n // already started\n return;\n }\n\n COLLECTIONS_WITH_RUNNING_CLEANUP.add(rxCollection);\n\n /**\n * Do not run directly to not reduce result latency of a new query\n */\n nextTick() // wait at least one tick\n .then(() => requestIdlePromise(200)) // and then wait for the CPU to be idle\n .then(() => {\n if (!rxCollection.destroyed) {\n rxCollection.cacheReplacementPolicy(rxCollection, rxCollection._queryCache);\n }\n COLLECTIONS_WITH_RUNNING_CLEANUP.delete(rxCollection);\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"query-cache.js","names":["_index","require","QueryCache","exports","_map","Map","_proto","prototype","getByQuery","rxQuery","stringRep","toString","getFromMapOrCreate","createQueryCache","uncacheRxQuery","queryCache","uncached","delete","countRxQuerySubscribers","refCount$","observers","length","DEFAULT_TRY_TO_KEEP_MAX","DEFAULT_UNEXECUTED_LIFETIME","defaultCacheReplacementPolicyMonad","tryToKeepMax","unExecutedLifetime","_collection","size","minUnExecutedLifetime","now","maybeUncache","queriesInCache","Array","from","values","_lastEnsureEqual","_creationTime","push","mustUncache","sortedByLastUsage","sort","a","b","toRemove","slice","forEach","defaultCacheReplacementPolicy","COLLECTIONS_WITH_RUNNING_CLEANUP","WeakSet","triggerCacheReplacement","rxCollection","has","add","nextTick","then","requestIdlePromise","destroyed","cacheReplacementPolicy","_queryCache"],"sources":["../../src/query-cache.ts"],"sourcesContent":["/**\n * the query-cache makes sure that on every query-state, exactly one instance can exist\n * if you use the same mango-query more then once, it will reuse the first RxQuery\n */\nimport type {\n RxQuery,\n RxCacheReplacementPolicy,\n RxCollection\n} from './types/index.d.ts';\nimport {\n getFromMapOrCreate,\n nextTick,\n now,\n requestIdlePromise\n} from './plugins/utils/index.ts';\n\nexport class QueryCache {\n public _map: Map = new Map();\n\n /**\n * check if an equal query is in the cache,\n * if true, return the cached one,\n * if false, save the given one and return it\n */\n getByQuery(rxQuery: RxQuery): RxQuery {\n const stringRep = rxQuery.toString();\n return getFromMapOrCreate(\n this._map,\n stringRep,\n () => rxQuery\n );\n }\n}\n\nexport function createQueryCache() {\n return new QueryCache();\n}\n\n\nexport function uncacheRxQuery(queryCache: QueryCache, rxQuery: RxQuery) {\n rxQuery.uncached = true;\n const stringRep = rxQuery.toString();\n queryCache._map.delete(stringRep);\n\n}\n\n\nexport function countRxQuerySubscribers(rxQuery: RxQuery): number {\n return rxQuery.refCount$.observers.length;\n}\n\n\nexport const DEFAULT_TRY_TO_KEEP_MAX = 100;\nexport const DEFAULT_UNEXECUTED_LIFETIME = 30 * 1000;\n\n/**\n * The default cache replacement policy\n * See docs-src/query-cache.md to learn how it should work.\n * Notice that this runs often and should block the cpu as less as possible\n * This is a monad which makes it easier to unit test\n */\nexport const defaultCacheReplacementPolicyMonad: (\n tryToKeepMax: number,\n unExecutedLifetime: number\n) => RxCacheReplacementPolicy = (\n tryToKeepMax,\n unExecutedLifetime\n) => (\n _collection: RxCollection,\n queryCache: QueryCache\n) => {\n if (queryCache._map.size < tryToKeepMax) {\n return;\n }\n\n const minUnExecutedLifetime = now() - unExecutedLifetime;\n const maybeUncache: RxQuery[] = [];\n\n const queriesInCache = Array.from(queryCache._map.values());\n for (const rxQuery of queriesInCache) {\n // filter out queries with subscribers\n if (countRxQuerySubscribers(rxQuery) > 0) {\n continue;\n }\n // directly uncache queries that never executed and are older then unExecutedLifetime\n if (rxQuery._lastEnsureEqual === 0 && rxQuery._creationTime < minUnExecutedLifetime) {\n uncacheRxQuery(queryCache, rxQuery);\n continue;\n }\n maybeUncache.push(rxQuery);\n }\n\n const mustUncache = maybeUncache.length - tryToKeepMax;\n if (mustUncache <= 0) {\n return;\n }\n\n const sortedByLastUsage = maybeUncache.sort((a, b) => a._lastEnsureEqual - b._lastEnsureEqual);\n const toRemove = sortedByLastUsage.slice(0, mustUncache);\n toRemove.forEach(rxQuery => uncacheRxQuery(queryCache, rxQuery));\n };\n\n\nexport const defaultCacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicyMonad(\n DEFAULT_TRY_TO_KEEP_MAX,\n DEFAULT_UNEXECUTED_LIFETIME\n);\n\nexport const COLLECTIONS_WITH_RUNNING_CLEANUP: WeakSet = new WeakSet();\n\n/**\n * Triggers the cache replacement policy after waitTime has passed.\n * We do not run this directly because at exactly the time a query is created,\n * we need all CPU to minimize latency.\n * Also this should not be triggered multiple times when waitTime is still waiting.\n */\nexport function triggerCacheReplacement(\n rxCollection: RxCollection\n) {\n if (COLLECTIONS_WITH_RUNNING_CLEANUP.has(rxCollection)) {\n // already started\n return;\n }\n\n COLLECTIONS_WITH_RUNNING_CLEANUP.add(rxCollection);\n\n /**\n * Do not run directly to not reduce result latency of a new query\n */\n nextTick() // wait at least one tick\n .then(() => requestIdlePromise(200)) // and then wait for the CPU to be idle\n .then(() => {\n if (!rxCollection.destroyed) {\n rxCollection.cacheReplacementPolicy(rxCollection, rxCollection._queryCache);\n }\n COLLECTIONS_WITH_RUNNING_CLEANUP.delete(rxCollection);\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/rx-collection.js.map b/dist/cjs/rx-collection.js.map index 97f8e0c5a3d..313c616dca5 100644 --- a/dist/cjs/rx-collection.js.map +++ b/dist/cjs/rx-collection.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-collection.js","names":["_rxjs","require","_index","_rxCollectionHelper","_rxQuery","_rxError","_docCache","_queryCache","_changeEventBuffer","_hooks","_rxDocumentPrototypeMerge","_rxStorageHelper","_index2","_incrementalWrite","_rxDocument","_overwritable","HOOKS_WHEN","HOOKS_KEYS","hooksApplied","RxCollectionBase","exports","database","name","schema","internalStorageInstance","instanceCreationOptions","migrationStrategies","methods","attachments","options","cacheReplacementPolicy","defaultCacheReplacementPolicy","statics","conflictHandler","defaultConflictHandler","storageInstance","timeouts","Set","incrementalWriteQueue","_incrementalUpsertQueues","Map","synced","hooks","_subs","createQueryCache","$","checkpoint$","onDestroy","destroyed","onRemove","_applyHookFunctions","asRxCollection","_proto","prototype","prepare","getWrappedStorageInstance","jsonSchema","IncrementalWriteQueue","primaryPath","newData","oldData","beforeDocumentUpdateWrite","result","_runHooks","collectionEventBulks$","eventBulks$","pipe","filter","changeEventBulk","collectionName","mergeMap","events","map","checkpoint","createChangeEventBuffer","documentConstructor","DocumentCache","isLocal","b","docData","getRxDocumentConstructor","createNewRxDocument","listenToRemoveSub","internalStore","changeStream","bulk","key","version","found","find","event","documentData","context","operation","subscribe","destroy","Promise","all","fn","push","databaseStorageToken","storageToken","subDocs","eventBulk","Array","length","rawEvents","deepFreezeWhenDevMode","overwritable","index","documentId","previousDocumentData","id","internal","databaseToken","token","endTime","startTime","$emit","conflictResultionTasks","task","input","then","output","resolveConflictResultionTask","PROMISE_RESOLVE_VOID","cleanup","_minimumDeletedTime","ensureRxCollectionIsNotDestroyed","pluginMissing","migrationNeeded","getMigrationState","startMigration","batchSize","migratePromise","insert","json","writeResult","bulkInsert","isError","error","throwIfIsStorageWriteError","insertResult","ensureNotFalsy","success","docsData","insertRows","hasHooks","useDocData","fillObjectDataBeforeInsert","document","results","bulkWrite","rxDocuments","collection","ret","mapDocumentsDataToCacheDocs","docsMap","forEach","row","doc","set","get","primary","bulkRemove","ids","rxDocumentMap","findByIds","exec","from","values","rxDocument","data","toMutableJSON","removeDocs","writeDoc","flatClone","_deleted","previous","successIds","d","getFromMapOrThrow","bulkUpsert","insertData","useJsonByDocId","useJson","newRxError","slice","err","status","writeData","docDataInDb","documentInDb","getCachedRxDocuments","newDoc","incrementalModify","upsert","bulkResult","incrementalUpsert","queue","_incrementalUpsertEnsureRxDocumentExists","wasInserted","inserted","_incrementalUpsertUpdate","queryObj","_getDefaultQuery","query","createRxQuery","findOne","isArray","newRxTypeError","selector","limit","count","mangoQuery","$in","exportJSON","importJSON","_exportedJSON","insertCRDT","_updateObj","addHook","when","fun","parallel","includes","boundFun","bind","runName","series","getHooks","instance","tasks","hook","promiseSeries","_runHooksSync","promiseWait","time","res","timeout","setTimeout","delete","add","PROMISE_RESOLVE_FALSE","clearTimeout","requestIdlePromise","close","sub","unsubscribe","collections","runAsyncPluginHooks","remove","removeCollectionStorages","storage","password","hashFunction","_createClass2","default","cE","colProto","Object","getPrototypeOf","fnName","ucfirst","_innerDoc","rxCollection","docDataFromCache","getLatestDocumentDataIfExists","resolve","createRxCollection","autoMigrate","localDocuments","storageInstanceCreationParams","databaseInstanceToken","databaseName","multiInstance","devMode","isDevMode","runPluginHooks","createRxCollectionStorageInstance","entries","funName","defineProperty","creator","catch","reject","isRxCollection","obj"],"sources":["../../src/rx-collection.ts"],"sourcesContent":["import {\n filter,\n map,\n mergeMap\n} from 'rxjs';\n\nimport {\n ucfirst,\n flatClone,\n promiseSeries,\n pluginMissing,\n ensureNotFalsy,\n getFromMapOrThrow,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_VOID\n} from './plugins/utils/index.ts';\nimport {\n fillObjectDataBeforeInsert,\n createRxCollectionStorageInstance,\n removeCollectionStorages,\n ensureRxCollectionIsNotDestroyed\n} from './rx-collection-helper.ts';\nimport {\n createRxQuery,\n _getDefaultQuery\n} from './rx-query.ts';\nimport {\n newRxError,\n newRxTypeError\n} from './rx-error.ts';\nimport type {\n RxMigrationState\n} from './plugins/migration-schema/index.ts';\nimport {\n DocumentCache,\n mapDocumentsDataToCacheDocs\n} from './doc-cache.ts';\nimport {\n QueryCache,\n createQueryCache,\n defaultCacheReplacementPolicy\n} from './query-cache.ts';\nimport {\n ChangeEventBuffer,\n createChangeEventBuffer\n} from './change-event-buffer.ts';\nimport {\n runAsyncPluginHooks,\n runPluginHooks\n} from './hooks.ts';\n\nimport {\n Subscription,\n Observable\n} from 'rxjs';\n\nimport type {\n KeyFunctionMap,\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxDumpCollection,\n RxDumpCollectionAny,\n MangoQuery,\n MangoQueryNoLimit,\n RxCacheReplacementPolicy,\n RxStorageWriteError,\n RxDocumentData,\n RxStorageInstanceCreationParams,\n BulkWriteRow,\n RxChangeEvent,\n RxChangeEventInsert,\n RxChangeEventUpdate,\n RxChangeEventDelete,\n RxStorageInstance,\n CollectionsOfDatabase,\n RxChangeEventBulk,\n RxLocalDocumentData,\n RxDocumentBase,\n RxConflictHandler,\n MaybePromise,\n CRDTEntry,\n MangoQuerySelectorAndIndex,\n MigrationStrategies\n} from './types/index.d.ts';\n\nimport {\n RxSchema\n} from './rx-schema.ts';\n\nimport {\n createNewRxDocument,\n getRxDocumentConstructor\n} from './rx-document-prototype-merge.ts';\nimport {\n getWrappedStorageInstance,\n throwIfIsStorageWriteError,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport { defaultConflictHandler } from './replication-protocol/index.ts';\nimport { IncrementalWriteQueue } from './incremental-write.ts';\nimport { beforeDocumentUpdateWrite } from './rx-document.ts';\nimport { overwritable } from './overwritable.ts';\n\nconst HOOKS_WHEN = ['pre', 'post'] as const;\ntype HookWhenType = typeof HOOKS_WHEN[number];\nconst HOOKS_KEYS = ['insert', 'save', 'remove', 'create'] as const;\ntype HookKeyType = typeof HOOKS_KEYS[number];\nlet hooksApplied = false;\n\nexport class RxCollectionBase<\n InstanceCreationOptions,\n RxDocumentType = { [prop: string]: any; },\n OrmMethods = {},\n StaticMethods = { [key: string]: any; },\n Reactivity = any\n> {\n\n\n /**\n * Stores all 'normal' documents\n */\n public storageInstance: WrappedRxStorageInstance = {} as any;\n public readonly timeouts: Set> = new Set();\n public incrementalWriteQueue: IncrementalWriteQueue = {} as any;\n\n constructor(\n public database: RxDatabase,\n public name: string,\n public schema: RxSchema,\n public internalStorageInstance: RxStorageInstance,\n public instanceCreationOptions: InstanceCreationOptions = {} as any,\n public migrationStrategies: MigrationStrategies = {},\n public methods: KeyFunctionMap = {},\n public attachments: KeyFunctionMap = {},\n public options: any = {},\n public cacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicy,\n public statics: KeyFunctionMap = {},\n public conflictHandler: RxConflictHandler = defaultConflictHandler\n ) {\n _applyHookFunctions(this.asRxCollection);\n }\n\n get insert$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'INSERT')\n ) as any;\n }\n get update$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'UPDATE')\n ) as any;\n }\n get remove$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'DELETE')\n ) as any;\n }\n\n public _incrementalUpsertQueues: Map> = new Map();\n // defaults\n public synced: boolean = false;\n public hooks: {\n [key in HookKeyType]: {\n [when in HookWhenType]: {\n series: Function[];\n parallel: Function[];\n };\n }\n } = {} as any;\n public _subs: Subscription[] = [];\n\n public _docCache: DocumentCache = {} as any;\n\n public _queryCache: QueryCache = createQueryCache();\n public $: Observable> = {} as any;\n public checkpoint$: Observable = {} as any;\n public _changeEventBuffer: ChangeEventBuffer = {} as ChangeEventBuffer;\n\n\n\n /**\n * When the collection is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed = false;\n\n public onRemove: (() => MaybePromise)[] = [];\n\n public async prepare(): Promise {\n this.storageInstance = getWrappedStorageInstance(\n this.database,\n this.internalStorageInstance,\n this.schema.jsonSchema\n );\n this.incrementalWriteQueue = new IncrementalWriteQueue(\n this.storageInstance,\n this.schema.primaryPath,\n (newData, oldData) => beforeDocumentUpdateWrite(this as any, newData, oldData),\n result => this._runHooks('post', 'save', result)\n );\n\n const collectionEventBulks$ = this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name),\n );\n this.$ = collectionEventBulks$.pipe(\n mergeMap(changeEventBulk => changeEventBulk.events),\n );\n this.checkpoint$ = collectionEventBulks$.pipe(\n map(changeEventBulk => changeEventBulk.checkpoint),\n );\n\n this._changeEventBuffer = createChangeEventBuffer(this.asRxCollection);\n let documentConstructor: any;\n this._docCache = new DocumentCache(\n this.schema.primaryPath,\n this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name && !changeEventBulk.events[0].isLocal),\n map(b => b.events)\n ),\n docData => {\n if (!documentConstructor) {\n documentConstructor = getRxDocumentConstructor(this.asRxCollection);\n }\n return createNewRxDocument(this.asRxCollection, documentConstructor, docData);\n }\n );\n\n\n const listenToRemoveSub = this.database.internalStore.changeStream().pipe(\n filter(bulk => {\n const key = this.name + '-' + this.schema.version;\n const found = bulk.events.find(event => {\n return (\n event.documentData.context === 'collection' &&\n event.documentData.key === key &&\n event.operation === 'DELETE'\n );\n });\n return !!found;\n })\n ).subscribe(async () => {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n });\n this._subs.push(listenToRemoveSub);\n\n\n /**\n * TODO Instead of resolving the EventBulk array here and spit it into\n * single events, we should fully work with event bulks internally\n * to save performance.\n */\n const databaseStorageToken = await this.database.storageToken;\n const subDocs = this.storageInstance.changeStream().subscribe(eventBulk => {\n const events = new Array(eventBulk.events.length);\n const rawEvents = eventBulk.events;\n const collectionName = this.name;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n for (let index = 0; index < rawEvents.length; index++) {\n const event = rawEvents[index];\n events[index] = {\n documentId: event.documentId,\n collectionName,\n isLocal: false,\n operation: event.operation,\n documentData: deepFreezeWhenDevMode(event.documentData) as any,\n previousDocumentData: deepFreezeWhenDevMode(event.previousDocumentData) as any\n };\n }\n const changeEventBulk: RxChangeEventBulk = {\n id: eventBulk.id,\n internal: false,\n collectionName: this.name,\n storageToken: databaseStorageToken,\n events,\n databaseToken: this.database.token,\n checkpoint: eventBulk.checkpoint,\n context: eventBulk.context,\n endTime: eventBulk.endTime,\n startTime: eventBulk.startTime\n };\n this.database.$emit(changeEventBulk);\n });\n this._subs.push(subDocs);\n\n /**\n * Resolve the conflict tasks\n * of the RxStorageInstance\n */\n this._subs.push(\n this.storageInstance\n .conflictResultionTasks()\n .subscribe(task => {\n this\n .conflictHandler(task.input, task.context)\n .then(output => {\n this.storageInstance.resolveConflictResultionTask({\n id: task.id,\n output\n });\n });\n })\n );\n\n return PROMISE_RESOLVE_VOID;\n }\n\n\n /**\n * Manually call the cleanup function of the storage.\n * @link https://rxdb.info/cleanup.html\n */\n cleanup(_minimumDeletedTime?: number): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n throw pluginMissing('cleanup');\n }\n\n // overwritten by migration-plugin\n migrationNeeded(): Promise {\n throw pluginMissing('migration-schema');\n }\n getMigrationState(): RxMigrationState {\n throw pluginMissing('migration-schema');\n }\n startMigration(batchSize: number = 10): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n return this.getMigrationState().startMigration(batchSize);\n }\n migratePromise(batchSize: number = 10): Promise {\n return this.getMigrationState().migratePromise(batchSize);\n }\n\n async insert(\n json: RxDocumentType | RxDocument\n ): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const writeResult = await this.bulkInsert([json as any]);\n\n const isError = writeResult.error[0];\n throwIfIsStorageWriteError(this as any, (json as any)[this.schema.primaryPath] as any, json, isError);\n const insertResult = ensureNotFalsy(writeResult.success[0]);\n return insertResult;\n }\n\n async bulkInsert(\n docsData: RxDocumentType[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (docsData.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const primaryPath = this.schema.primaryPath;\n\n\n /**\n * This code is a bit redundant for better performance.\n * Instead of iterating multiple times,\n * we directly transform the input to a write-row array.\n */\n let insertRows: BulkWriteRow[];\n if (this.hasHooks('pre', 'insert')) {\n insertRows = await Promise.all(\n docsData.map(docData => {\n const useDocData = fillObjectDataBeforeInsert(this.schema, docData);\n return this._runHooks('pre', 'insert', useDocData)\n .then(() => {\n return { document: useDocData };\n });\n })\n );\n } else {\n insertRows = new Array(docsData.length);\n const schema = this.schema;\n for (let index = 0; index < docsData.length; index++) {\n const docData = docsData[index];\n const useDocData = fillObjectDataBeforeInsert(schema, docData);\n insertRows[index] = { document: useDocData };\n }\n }\n\n const results = await this.storageInstance.bulkWrite(\n insertRows,\n 'rx-collection-bulk-insert'\n );\n\n\n /**\n * Often the user does not need to access the RxDocuments of the bulkInsert() call.\n * So we transform the data to RxDocuments only if needed to use less CPU performance.\n */\n let rxDocuments: RxDocument[];\n const collection = this;\n const ret = {\n get success() {\n if (!rxDocuments) {\n rxDocuments = mapDocumentsDataToCacheDocs(collection._docCache, results.success);\n }\n return rxDocuments;\n },\n error: results.error\n };\n\n if (this.hasHooks('post', 'insert')) {\n const docsMap: Map = new Map();\n insertRows.forEach(row => {\n const doc = row.document;\n docsMap.set((doc as any)[primaryPath] as any, doc);\n });\n await Promise.all(\n ret.success.map(doc => {\n return this._runHooks(\n 'post',\n 'insert',\n docsMap.get(doc.primary),\n doc\n );\n })\n );\n }\n\n return ret;\n }\n\n async bulkRemove(\n ids: string[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const primaryPath = this.schema.primaryPath;\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (ids.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const rxDocumentMap = await this.findByIds(ids).exec();\n const docsData: RxDocumentData[] = [];\n const docsMap: Map> = new Map();\n Array.from(rxDocumentMap.values()).forEach(rxDocument => {\n const data: RxDocumentData = rxDocument.toMutableJSON(true) as any;\n docsData.push(data);\n docsMap.set(rxDocument.primary, data);\n });\n\n await Promise.all(\n docsData.map(doc => {\n const primary = (doc as any)[this.schema.primaryPath];\n return this._runHooks('pre', 'remove', doc, rxDocumentMap.get(primary));\n })\n );\n const removeDocs: BulkWriteRow[] = docsData.map(doc => {\n const writeDoc = flatClone(doc);\n writeDoc._deleted = true;\n return {\n previous: doc,\n document: writeDoc\n };\n });\n const results = await this.storageInstance.bulkWrite(\n removeDocs,\n 'rx-collection-bulk-remove'\n );\n\n const successIds: string[] = results.success.map(d => d[primaryPath] as string);\n\n // run hooks\n await Promise.all(\n successIds.map(id => {\n return this._runHooks(\n 'post',\n 'remove',\n docsMap.get(id),\n rxDocumentMap.get(id)\n );\n })\n );\n\n const rxDocuments = successIds.map(id => getFromMapOrThrow(rxDocumentMap, id));\n\n return {\n success: rxDocuments,\n error: results.error\n };\n }\n\n /**\n * same as bulkInsert but overwrites existing document with same primary\n */\n async bulkUpsert(docsData: Partial[]): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const insertData: RxDocumentType[] = [];\n const useJsonByDocId: Map = new Map();\n docsData.forEach(docData => {\n const useJson = fillObjectDataBeforeInsert(this.schema, docData);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL3', {\n primaryPath: this.schema.primaryPath as string,\n data: useJson,\n schema: this.schema.jsonSchema\n });\n }\n useJsonByDocId.set(primary, useJson);\n insertData.push(useJson);\n });\n\n const insertResult = await this.bulkInsert(insertData);\n const success = insertResult.success.slice(0);\n const error: RxStorageWriteError[] = [];\n\n // update the ones that existed already\n await Promise.all(\n insertResult.error.map(async (err) => {\n if (err.status !== 409) {\n error.push(err);\n } else {\n const id = err.documentId;\n const writeData = getFromMapOrThrow(useJsonByDocId, id);\n const docDataInDb = ensureNotFalsy(err.documentInDb);\n const doc = this._docCache.getCachedRxDocuments([docDataInDb])[0];\n const newDoc = await doc.incrementalModify(() => writeData);\n success.push(newDoc);\n }\n })\n );\n return {\n error,\n success\n };\n }\n\n /**\n * same as insert but overwrites existing document with same primary\n */\n async upsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const bulkResult = await this.bulkUpsert([json]);\n throwIfIsStorageWriteError(\n this.asRxCollection,\n (json as any)[this.schema.primaryPath],\n json as any,\n bulkResult.error[0]\n );\n return bulkResult.success[0];\n }\n\n /**\n * upserts to a RxDocument, uses incrementalModify if document already exists\n */\n incrementalUpsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const useJson = fillObjectDataBeforeInsert(this.schema, json);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL4', {\n data: json\n });\n }\n\n // ensure that it won't try 2 parallel runs\n let queue = this._incrementalUpsertQueues.get(primary);\n if (!queue) {\n queue = PROMISE_RESOLVE_VOID;\n }\n queue = queue\n .then(() => _incrementalUpsertEnsureRxDocumentExists(this as any, primary as any, useJson))\n .then((wasInserted) => {\n if (!wasInserted.inserted) {\n return _incrementalUpsertUpdate(wasInserted.doc, useJson);\n } else {\n return wasInserted.doc;\n }\n });\n this._incrementalUpsertQueues.set(primary, queue);\n return queue;\n }\n\n find(queryObj?: MangoQuery): RxQuery<\n RxDocumentType,\n RxDocument[],\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (typeof queryObj === 'string') {\n throw newRxError('COL5', {\n queryObj\n });\n }\n\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n const query = createRxQuery('find', queryObj, this as any);\n return query as any;\n }\n\n findOne(\n queryObj?: MangoQueryNoLimit | string\n ): RxQuery<\n RxDocumentType,\n RxDocument | null,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n\n // TODO move this check to dev-mode plugin\n if (\n typeof queryObj === 'number' ||\n Array.isArray(queryObj)\n ) {\n throw newRxTypeError('COL6', {\n queryObj\n });\n }\n\n let query;\n\n if (typeof queryObj === 'string') {\n query = createRxQuery('findOne', {\n selector: {\n [this.schema.primaryPath]: queryObj\n },\n limit: 1\n }, this as any);\n } else {\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n\n // cannot have limit on findOne queries because it will be overwritten\n if ((queryObj as MangoQuery).limit) {\n throw newRxError('QU6');\n }\n\n queryObj = flatClone(queryObj);\n (queryObj as any).limit = 1;\n query = createRxQuery('findOne', queryObj, this as any);\n }\n\n\n return query as any;\n }\n\n count(queryObj?: MangoQuerySelectorAndIndex): RxQuery<\n RxDocumentType,\n number,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n const query = createRxQuery('count', queryObj, this as any);\n return query as any;\n }\n\n /**\n * find a list documents by their primary key\n * has way better performance then running multiple findOne() or a find() with a complex $or-selected\n */\n findByIds(\n ids: string[]\n ): RxQuery<\n RxDocumentType,\n Map>,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n const mangoQuery: MangoQuery = {\n selector: {\n [this.schema.primaryPath]: {\n $in: ids.slice(0)\n }\n } as any\n };\n const query = createRxQuery('findByIds', mangoQuery, this as any);\n return query as any;\n }\n\n /**\n * Export collection to a JSON friendly format.\n */\n exportJSON(): Promise>;\n exportJSON(): Promise>;\n exportJSON(): Promise {\n throw pluginMissing('json-dump');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n */\n importJSON(_exportedJSON: RxDumpCollectionAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n insertCRDT(_updateObj: CRDTEntry | CRDTEntry[]): RxDocument {\n throw pluginMissing('crdt');\n }\n\n /**\n * HOOKS\n */\n addHook(when: HookWhenType, key: HookKeyType, fun: any, parallel = false) {\n if (typeof fun !== 'function') {\n throw newRxTypeError('COL7', {\n key,\n when\n });\n }\n\n if (!HOOKS_WHEN.includes(when)) {\n throw newRxTypeError('COL8', {\n key,\n when\n });\n }\n\n if (!HOOKS_KEYS.includes(key)) {\n throw newRxError('COL9', {\n key\n });\n }\n\n if (when === 'post' && key === 'create' && parallel === true) {\n throw newRxError('COL10', {\n when,\n key,\n parallel\n });\n }\n\n // bind this-scope to hook-function\n const boundFun = fun.bind(this);\n\n const runName = parallel ? 'parallel' : 'series';\n\n this.hooks[key] = this.hooks[key] || {};\n this.hooks[key][when] = this.hooks[key][when] || {\n series: [],\n parallel: []\n };\n this.hooks[key][when][runName].push(boundFun);\n }\n\n getHooks(when: HookWhenType, key: HookKeyType) {\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return {\n series: [],\n parallel: []\n };\n }\n return this.hooks[key][when];\n }\n\n hasHooks(when: HookWhenType, key: HookKeyType) {\n /**\n * Performance shortcut\n * so that we not have to build the empty object.\n */\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return false;\n }\n\n const hooks = this.getHooks(when, key);\n if (!hooks) {\n return false;\n }\n return hooks.series.length > 0 || hooks.parallel.length > 0;\n }\n\n _runHooks(when: HookWhenType, key: HookKeyType, data: any, instance?: any): Promise {\n const hooks = this.getHooks(when, key);\n\n if (!hooks) {\n return PROMISE_RESOLVE_VOID;\n }\n\n // run parallel: false\n const tasks = hooks.series.map((hook: any) => () => hook(data, instance));\n return promiseSeries(tasks)\n // run parallel: true\n .then(() => Promise.all(\n hooks.parallel\n .map((hook: any) => hook(data, instance))\n ));\n }\n\n /**\n * does the same as ._runHooks() but with non-async-functions\n */\n _runHooksSync(when: HookWhenType, key: HookKeyType, data: any, instance: any) {\n if (!this.hasHooks(when, key)) {\n return;\n }\n const hooks = this.getHooks(when, key);\n if (!hooks) return;\n hooks.series.forEach((hook: any) => hook(data, instance));\n }\n\n /**\n * Returns a promise that resolves after the given time.\n * Ensures that is properly cleans up when the collection is destroyed\n * so that no running timeouts prevent the exit of the JavaScript process.\n */\n promiseWait(time: number): Promise {\n const ret = new Promise(res => {\n const timeout = setTimeout(() => {\n this.timeouts.delete(timeout);\n res();\n }, time);\n this.timeouts.add(timeout);\n });\n return ret;\n }\n\n async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n\n await Promise.all(this.onDestroy.map(fn => fn()));\n\n /**\n * Settings destroyed = true\n * must be the first thing to do,\n * so for example the replication can directly stop\n * instead of sending requests to a closed storage.\n */\n this.destroyed = true;\n\n\n Array.from(this.timeouts).forEach(timeout => clearTimeout(timeout));\n if (this._changeEventBuffer) {\n this._changeEventBuffer.destroy();\n }\n /**\n * First wait until the whole database is idle.\n * This ensures that the storage does not get closed\n * while some operation is running.\n * It is important that we do not intercept a running call\n * because it might lead to undefined behavior like when a doc is written\n * but the change is not added to the changes collection.\n */\n return this.database.requestIdlePromise()\n .then(() => this.storageInstance.close())\n .then(() => {\n /**\n * Unsubscribing must be done AFTER the storageInstance.close()\n * Because the conflict handling is part of the subscriptions and\n * otherwise there might be open conflicts to be resolved which\n * will then stuck and never resolve.\n */\n this._subs.forEach(sub => sub.unsubscribe());\n\n delete this.database.collections[this.name];\n return runAsyncPluginHooks('postDestroyRxCollection', this).then(() => true);\n });\n }\n\n /**\n * remove all data of the collection\n */\n async remove(): Promise {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n await removeCollectionStorages(\n this.database.storage,\n this.database.internalStore,\n this.database.token,\n this.database.name,\n this.name,\n this.database.password,\n this.database.hashFunction\n );\n }\n\n get asRxCollection(): RxCollection {\n return this as any;\n }\n}\n\n/**\n * adds the hook-functions to the collections prototype\n * this runs only once\n */\nfunction _applyHookFunctions(\n collection: RxCollection\n) {\n if (hooksApplied) return; // already run\n hooksApplied = true;\n const colProto = Object.getPrototypeOf(collection);\n HOOKS_KEYS.forEach(key => {\n HOOKS_WHEN.map(when => {\n const fnName = when + ucfirst(key);\n colProto[fnName] = function (fun: string, parallel: boolean) {\n return this.addHook(when, key, fun, parallel);\n };\n });\n });\n}\n\nfunction _incrementalUpsertUpdate(\n doc: RxDocumentBase,\n json: RxDocumentData\n): Promise> {\n return doc.incrementalModify((_innerDoc) => {\n return json;\n });\n}\n\n/**\n * ensures that the given document exists\n * @return promise that resolves with new doc and flag if inserted\n */\nfunction _incrementalUpsertEnsureRxDocumentExists(\n rxCollection: RxCollection,\n primary: string,\n json: any\n): Promise<\n {\n doc: RxDocument;\n inserted: boolean;\n }\n> {\n /**\n * Optimisation shortcut,\n * first try to find the document in the doc-cache\n */\n const docDataFromCache = rxCollection._docCache.getLatestDocumentDataIfExists(primary);\n if (docDataFromCache) {\n return Promise.resolve({\n doc: rxCollection._docCache.getCachedRxDocuments([docDataFromCache])[0],\n inserted: false\n });\n }\n return rxCollection.findOne(primary).exec()\n .then(doc => {\n if (!doc) {\n return rxCollection.insert(json).then(newDoc => ({\n doc: newDoc,\n inserted: true\n }));\n } else {\n return {\n doc,\n inserted: false\n };\n }\n });\n}\n\n/**\n * creates and prepares a new collection\n */\nexport function createRxCollection(\n {\n database,\n name,\n schema,\n instanceCreationOptions = {},\n migrationStrategies = {},\n autoMigrate = true,\n statics = {},\n methods = {},\n attachments = {},\n options = {},\n localDocuments = false,\n cacheReplacementPolicy = defaultCacheReplacementPolicy,\n conflictHandler = defaultConflictHandler\n }: any\n): Promise {\n const storageInstanceCreationParams: RxStorageInstanceCreationParams = {\n databaseInstanceToken: database.token,\n databaseName: database.name,\n collectionName: name,\n schema: schema.jsonSchema,\n options: instanceCreationOptions,\n multiInstance: database.multiInstance,\n password: database.password,\n devMode: overwritable.isDevMode()\n };\n\n runPluginHooks(\n 'preCreateRxStorageInstance',\n storageInstanceCreationParams\n );\n\n return createRxCollectionStorageInstance(\n database,\n storageInstanceCreationParams\n ).then(storageInstance => {\n const collection = new RxCollectionBase(\n database,\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n statics,\n conflictHandler\n );\n\n return collection\n .prepare()\n .then(() => {\n // ORM add statics\n Object\n .entries(statics)\n .forEach(([funName, fun]) => {\n Object.defineProperty(collection, funName, {\n get: () => (fun as any).bind(collection)\n });\n });\n\n let ret = PROMISE_RESOLVE_VOID;\n if (autoMigrate && collection.schema.version !== 0) {\n ret = collection.migratePromise();\n }\n return ret;\n })\n .then(() => {\n runPluginHooks('createRxCollection', {\n collection,\n creator: {\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n localDocuments,\n statics\n }\n });\n return collection as any;\n })\n /**\n * If the collection creation fails,\n * we yet have to close the storage instances.\n */\n .catch(err => {\n return storageInstance.close()\n .then(() => Promise.reject(err));\n });\n });\n}\n\nexport function isRxCollection(obj: any): boolean {\n return obj instanceof RxCollectionBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-collection.js","names":["_rxjs","require","_index","_rxCollectionHelper","_rxQuery","_rxError","_docCache","_queryCache","_changeEventBuffer","_hooks","_rxDocumentPrototypeMerge","_rxStorageHelper","_index2","_incrementalWrite","_rxDocument","_overwritable","HOOKS_WHEN","HOOKS_KEYS","hooksApplied","RxCollectionBase","exports","database","name","schema","internalStorageInstance","instanceCreationOptions","migrationStrategies","methods","attachments","options","cacheReplacementPolicy","defaultCacheReplacementPolicy","statics","conflictHandler","defaultConflictHandler","storageInstance","timeouts","Set","incrementalWriteQueue","_incrementalUpsertQueues","Map","synced","hooks","_subs","createQueryCache","$","checkpoint$","onDestroy","destroyed","onRemove","_applyHookFunctions","asRxCollection","_proto","prototype","prepare","getWrappedStorageInstance","jsonSchema","IncrementalWriteQueue","primaryPath","newData","oldData","beforeDocumentUpdateWrite","result","_runHooks","collectionEventBulks$","eventBulks$","pipe","filter","changeEventBulk","collectionName","mergeMap","events","map","checkpoint","createChangeEventBuffer","documentConstructor","DocumentCache","isLocal","b","docData","getRxDocumentConstructor","createNewRxDocument","listenToRemoveSub","internalStore","changeStream","bulk","key","version","found","find","event","documentData","context","operation","subscribe","destroy","Promise","all","fn","push","databaseStorageToken","storageToken","subDocs","eventBulk","Array","length","rawEvents","deepFreezeWhenDevMode","overwritable","index","documentId","previousDocumentData","id","internal","databaseToken","token","endTime","startTime","$emit","conflictResultionTasks","task","input","then","output","resolveConflictResultionTask","PROMISE_RESOLVE_VOID","cleanup","_minimumDeletedTime","ensureRxCollectionIsNotDestroyed","pluginMissing","migrationNeeded","getMigrationState","startMigration","batchSize","migratePromise","insert","json","writeResult","bulkInsert","isError","error","throwIfIsStorageWriteError","insertResult","ensureNotFalsy","success","docsData","insertRows","hasHooks","useDocData","fillObjectDataBeforeInsert","document","results","bulkWrite","rxDocuments","collection","ret","mapDocumentsDataToCacheDocs","docsMap","forEach","row","doc","set","get","primary","bulkRemove","ids","rxDocumentMap","findByIds","exec","from","values","rxDocument","data","toMutableJSON","removeDocs","writeDoc","flatClone","_deleted","previous","successIds","d","getFromMapOrThrow","bulkUpsert","insertData","useJsonByDocId","useJson","newRxError","slice","err","status","writeData","docDataInDb","documentInDb","getCachedRxDocuments","newDoc","incrementalModify","upsert","bulkResult","incrementalUpsert","queue","_incrementalUpsertEnsureRxDocumentExists","wasInserted","inserted","_incrementalUpsertUpdate","queryObj","_getDefaultQuery","query","createRxQuery","findOne","isArray","newRxTypeError","selector","limit","count","mangoQuery","$in","exportJSON","importJSON","_exportedJSON","insertCRDT","_updateObj","addHook","when","fun","parallel","includes","boundFun","bind","runName","series","getHooks","instance","tasks","hook","promiseSeries","_runHooksSync","promiseWait","time","res","timeout","setTimeout","delete","add","PROMISE_RESOLVE_FALSE","clearTimeout","requestIdlePromise","close","sub","unsubscribe","collections","runAsyncPluginHooks","remove","removeCollectionStorages","storage","password","hashFunction","_createClass2","default","cE","colProto","Object","getPrototypeOf","fnName","ucfirst","_innerDoc","rxCollection","docDataFromCache","getLatestDocumentDataIfExists","resolve","createRxCollection","autoMigrate","localDocuments","storageInstanceCreationParams","databaseInstanceToken","databaseName","multiInstance","devMode","isDevMode","runPluginHooks","createRxCollectionStorageInstance","entries","funName","defineProperty","creator","catch","reject","isRxCollection","obj"],"sources":["../../src/rx-collection.ts"],"sourcesContent":["import {\n filter,\n map,\n mergeMap\n} from 'rxjs';\n\nimport {\n ucfirst,\n flatClone,\n promiseSeries,\n pluginMissing,\n ensureNotFalsy,\n getFromMapOrThrow,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_VOID\n} from './plugins/utils/index.ts';\nimport {\n fillObjectDataBeforeInsert,\n createRxCollectionStorageInstance,\n removeCollectionStorages,\n ensureRxCollectionIsNotDestroyed\n} from './rx-collection-helper.ts';\nimport {\n createRxQuery,\n _getDefaultQuery\n} from './rx-query.ts';\nimport {\n newRxError,\n newRxTypeError\n} from './rx-error.ts';\nimport type {\n RxMigrationState\n} from './plugins/migration-schema/index.ts';\nimport {\n DocumentCache,\n mapDocumentsDataToCacheDocs\n} from './doc-cache.ts';\nimport {\n QueryCache,\n createQueryCache,\n defaultCacheReplacementPolicy\n} from './query-cache.ts';\nimport {\n ChangeEventBuffer,\n createChangeEventBuffer\n} from './change-event-buffer.ts';\nimport {\n runAsyncPluginHooks,\n runPluginHooks\n} from './hooks.ts';\n\nimport {\n Subscription,\n Observable\n} from 'rxjs';\n\nimport type {\n KeyFunctionMap,\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxDumpCollection,\n RxDumpCollectionAny,\n MangoQuery,\n MangoQueryNoLimit,\n RxCacheReplacementPolicy,\n RxStorageWriteError,\n RxDocumentData,\n RxStorageInstanceCreationParams,\n BulkWriteRow,\n RxChangeEvent,\n RxChangeEventInsert,\n RxChangeEventUpdate,\n RxChangeEventDelete,\n RxStorageInstance,\n CollectionsOfDatabase,\n RxChangeEventBulk,\n RxLocalDocumentData,\n RxDocumentBase,\n RxConflictHandler,\n MaybePromise,\n CRDTEntry,\n MangoQuerySelectorAndIndex,\n MigrationStrategies\n} from './types/index.d.ts';\n\nimport {\n RxSchema\n} from './rx-schema.ts';\n\nimport {\n createNewRxDocument,\n getRxDocumentConstructor\n} from './rx-document-prototype-merge.ts';\nimport {\n getWrappedStorageInstance,\n throwIfIsStorageWriteError,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport { defaultConflictHandler } from './replication-protocol/index.ts';\nimport { IncrementalWriteQueue } from './incremental-write.ts';\nimport { beforeDocumentUpdateWrite } from './rx-document.ts';\nimport { overwritable } from './overwritable.ts';\n\nconst HOOKS_WHEN = ['pre', 'post'] as const;\ntype HookWhenType = typeof HOOKS_WHEN[number];\nconst HOOKS_KEYS = ['insert', 'save', 'remove', 'create'] as const;\ntype HookKeyType = typeof HOOKS_KEYS[number];\nlet hooksApplied = false;\n\nexport class RxCollectionBase<\n InstanceCreationOptions,\n RxDocumentType = { [prop: string]: any; },\n OrmMethods = {},\n StaticMethods = { [key: string]: any; },\n Reactivity = any\n> {\n\n\n /**\n * Stores all 'normal' documents\n */\n public storageInstance: WrappedRxStorageInstance = {} as any;\n public readonly timeouts: Set> = new Set();\n public incrementalWriteQueue: IncrementalWriteQueue = {} as any;\n\n constructor(\n public database: RxDatabase,\n public name: string,\n public schema: RxSchema,\n public internalStorageInstance: RxStorageInstance,\n public instanceCreationOptions: InstanceCreationOptions = {} as any,\n public migrationStrategies: MigrationStrategies = {},\n public methods: KeyFunctionMap = {},\n public attachments: KeyFunctionMap = {},\n public options: any = {},\n public cacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicy,\n public statics: KeyFunctionMap = {},\n public conflictHandler: RxConflictHandler = defaultConflictHandler\n ) {\n _applyHookFunctions(this.asRxCollection);\n }\n\n get insert$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'INSERT')\n ) as any;\n }\n get update$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'UPDATE')\n ) as any;\n }\n get remove$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'DELETE')\n ) as any;\n }\n\n public _incrementalUpsertQueues: Map> = new Map();\n // defaults\n public synced: boolean = false;\n public hooks: {\n [key in HookKeyType]: {\n [when in HookWhenType]: {\n series: Function[];\n parallel: Function[];\n };\n }\n } = {} as any;\n public _subs: Subscription[] = [];\n\n public _docCache: DocumentCache = {} as any;\n\n public _queryCache: QueryCache = createQueryCache();\n public $: Observable> = {} as any;\n public checkpoint$: Observable = {} as any;\n public _changeEventBuffer: ChangeEventBuffer = {} as ChangeEventBuffer;\n\n\n\n /**\n * When the collection is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed = false;\n\n public onRemove: (() => MaybePromise)[] = [];\n\n public async prepare(): Promise {\n this.storageInstance = getWrappedStorageInstance(\n this.database,\n this.internalStorageInstance,\n this.schema.jsonSchema\n );\n this.incrementalWriteQueue = new IncrementalWriteQueue(\n this.storageInstance,\n this.schema.primaryPath,\n (newData, oldData) => beforeDocumentUpdateWrite(this as any, newData, oldData),\n result => this._runHooks('post', 'save', result)\n );\n\n const collectionEventBulks$ = this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name),\n );\n this.$ = collectionEventBulks$.pipe(\n mergeMap(changeEventBulk => changeEventBulk.events),\n );\n this.checkpoint$ = collectionEventBulks$.pipe(\n map(changeEventBulk => changeEventBulk.checkpoint),\n );\n\n this._changeEventBuffer = createChangeEventBuffer(this.asRxCollection);\n let documentConstructor: any;\n this._docCache = new DocumentCache(\n this.schema.primaryPath,\n this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name && !changeEventBulk.events[0].isLocal),\n map(b => b.events)\n ),\n docData => {\n if (!documentConstructor) {\n documentConstructor = getRxDocumentConstructor(this.asRxCollection);\n }\n return createNewRxDocument(this.asRxCollection, documentConstructor, docData);\n }\n );\n\n\n const listenToRemoveSub = this.database.internalStore.changeStream().pipe(\n filter(bulk => {\n const key = this.name + '-' + this.schema.version;\n const found = bulk.events.find(event => {\n return (\n event.documentData.context === 'collection' &&\n event.documentData.key === key &&\n event.operation === 'DELETE'\n );\n });\n return !!found;\n })\n ).subscribe(async () => {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n });\n this._subs.push(listenToRemoveSub);\n\n\n /**\n * TODO Instead of resolving the EventBulk array here and spit it into\n * single events, we should fully work with event bulks internally\n * to save performance.\n */\n const databaseStorageToken = await this.database.storageToken;\n const subDocs = this.storageInstance.changeStream().subscribe(eventBulk => {\n const events = new Array(eventBulk.events.length);\n const rawEvents = eventBulk.events;\n const collectionName = this.name;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n for (let index = 0; index < rawEvents.length; index++) {\n const event = rawEvents[index];\n events[index] = {\n documentId: event.documentId,\n collectionName,\n isLocal: false,\n operation: event.operation,\n documentData: deepFreezeWhenDevMode(event.documentData) as any,\n previousDocumentData: deepFreezeWhenDevMode(event.previousDocumentData) as any\n };\n }\n const changeEventBulk: RxChangeEventBulk = {\n id: eventBulk.id,\n internal: false,\n collectionName: this.name,\n storageToken: databaseStorageToken,\n events,\n databaseToken: this.database.token,\n checkpoint: eventBulk.checkpoint,\n context: eventBulk.context,\n endTime: eventBulk.endTime,\n startTime: eventBulk.startTime\n };\n this.database.$emit(changeEventBulk);\n });\n this._subs.push(subDocs);\n\n /**\n * Resolve the conflict tasks\n * of the RxStorageInstance\n */\n this._subs.push(\n this.storageInstance\n .conflictResultionTasks()\n .subscribe(task => {\n this\n .conflictHandler(task.input, task.context)\n .then(output => {\n this.storageInstance.resolveConflictResultionTask({\n id: task.id,\n output\n });\n });\n })\n );\n\n return PROMISE_RESOLVE_VOID;\n }\n\n\n /**\n * Manually call the cleanup function of the storage.\n * @link https://rxdb.info/cleanup.html\n */\n cleanup(_minimumDeletedTime?: number): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n throw pluginMissing('cleanup');\n }\n\n // overwritten by migration-plugin\n migrationNeeded(): Promise {\n throw pluginMissing('migration-schema');\n }\n getMigrationState(): RxMigrationState {\n throw pluginMissing('migration-schema');\n }\n startMigration(batchSize: number = 10): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n return this.getMigrationState().startMigration(batchSize);\n }\n migratePromise(batchSize: number = 10): Promise {\n return this.getMigrationState().migratePromise(batchSize);\n }\n\n async insert(\n json: RxDocumentType | RxDocument\n ): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const writeResult = await this.bulkInsert([json as any]);\n\n const isError = writeResult.error[0];\n throwIfIsStorageWriteError(this as any, (json as any)[this.schema.primaryPath] as any, json, isError);\n const insertResult = ensureNotFalsy(writeResult.success[0]);\n return insertResult;\n }\n\n async bulkInsert(\n docsData: RxDocumentType[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (docsData.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const primaryPath = this.schema.primaryPath;\n\n\n /**\n * This code is a bit redundant for better performance.\n * Instead of iterating multiple times,\n * we directly transform the input to a write-row array.\n */\n let insertRows: BulkWriteRow[];\n if (this.hasHooks('pre', 'insert')) {\n insertRows = await Promise.all(\n docsData.map(docData => {\n const useDocData = fillObjectDataBeforeInsert(this.schema, docData);\n return this._runHooks('pre', 'insert', useDocData)\n .then(() => {\n return { document: useDocData };\n });\n })\n );\n } else {\n insertRows = new Array(docsData.length);\n const schema = this.schema;\n for (let index = 0; index < docsData.length; index++) {\n const docData = docsData[index];\n const useDocData = fillObjectDataBeforeInsert(schema, docData);\n insertRows[index] = { document: useDocData };\n }\n }\n\n const results = await this.storageInstance.bulkWrite(\n insertRows,\n 'rx-collection-bulk-insert'\n );\n\n\n /**\n * Often the user does not need to access the RxDocuments of the bulkInsert() call.\n * So we transform the data to RxDocuments only if needed to use less CPU performance.\n */\n let rxDocuments: RxDocument[];\n const collection = this;\n const ret = {\n get success() {\n if (!rxDocuments) {\n rxDocuments = mapDocumentsDataToCacheDocs(collection._docCache, results.success);\n }\n return rxDocuments;\n },\n error: results.error\n };\n\n if (this.hasHooks('post', 'insert')) {\n const docsMap: Map = new Map();\n insertRows.forEach(row => {\n const doc = row.document;\n docsMap.set((doc as any)[primaryPath] as any, doc);\n });\n await Promise.all(\n ret.success.map(doc => {\n return this._runHooks(\n 'post',\n 'insert',\n docsMap.get(doc.primary),\n doc\n );\n })\n );\n }\n\n return ret;\n }\n\n async bulkRemove(\n ids: string[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const primaryPath = this.schema.primaryPath;\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (ids.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const rxDocumentMap = await this.findByIds(ids).exec();\n const docsData: RxDocumentData[] = [];\n const docsMap: Map> = new Map();\n Array.from(rxDocumentMap.values()).forEach(rxDocument => {\n const data: RxDocumentData = rxDocument.toMutableJSON(true) as any;\n docsData.push(data);\n docsMap.set(rxDocument.primary, data);\n });\n\n await Promise.all(\n docsData.map(doc => {\n const primary = (doc as any)[this.schema.primaryPath];\n return this._runHooks('pre', 'remove', doc, rxDocumentMap.get(primary));\n })\n );\n const removeDocs: BulkWriteRow[] = docsData.map(doc => {\n const writeDoc = flatClone(doc);\n writeDoc._deleted = true;\n return {\n previous: doc,\n document: writeDoc\n };\n });\n const results = await this.storageInstance.bulkWrite(\n removeDocs,\n 'rx-collection-bulk-remove'\n );\n\n const successIds: string[] = results.success.map(d => d[primaryPath] as string);\n\n // run hooks\n await Promise.all(\n successIds.map(id => {\n return this._runHooks(\n 'post',\n 'remove',\n docsMap.get(id),\n rxDocumentMap.get(id)\n );\n })\n );\n\n const rxDocuments = successIds.map(id => getFromMapOrThrow(rxDocumentMap, id));\n\n return {\n success: rxDocuments,\n error: results.error\n };\n }\n\n /**\n * same as bulkInsert but overwrites existing document with same primary\n */\n async bulkUpsert(docsData: Partial[]): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const insertData: RxDocumentType[] = [];\n const useJsonByDocId: Map = new Map();\n docsData.forEach(docData => {\n const useJson = fillObjectDataBeforeInsert(this.schema, docData);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL3', {\n primaryPath: this.schema.primaryPath as string,\n data: useJson,\n schema: this.schema.jsonSchema\n });\n }\n useJsonByDocId.set(primary, useJson);\n insertData.push(useJson);\n });\n\n const insertResult = await this.bulkInsert(insertData);\n const success = insertResult.success.slice(0);\n const error: RxStorageWriteError[] = [];\n\n // update the ones that existed already\n await Promise.all(\n insertResult.error.map(async (err) => {\n if (err.status !== 409) {\n error.push(err);\n } else {\n const id = err.documentId;\n const writeData = getFromMapOrThrow(useJsonByDocId, id);\n const docDataInDb = ensureNotFalsy(err.documentInDb);\n const doc = this._docCache.getCachedRxDocuments([docDataInDb])[0];\n const newDoc = await doc.incrementalModify(() => writeData);\n success.push(newDoc);\n }\n })\n );\n return {\n error,\n success\n };\n }\n\n /**\n * same as insert but overwrites existing document with same primary\n */\n async upsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const bulkResult = await this.bulkUpsert([json]);\n throwIfIsStorageWriteError(\n this.asRxCollection,\n (json as any)[this.schema.primaryPath],\n json as any,\n bulkResult.error[0]\n );\n return bulkResult.success[0];\n }\n\n /**\n * upserts to a RxDocument, uses incrementalModify if document already exists\n */\n incrementalUpsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const useJson = fillObjectDataBeforeInsert(this.schema, json);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL4', {\n data: json\n });\n }\n\n // ensure that it won't try 2 parallel runs\n let queue = this._incrementalUpsertQueues.get(primary);\n if (!queue) {\n queue = PROMISE_RESOLVE_VOID;\n }\n queue = queue\n .then(() => _incrementalUpsertEnsureRxDocumentExists(this as any, primary as any, useJson))\n .then((wasInserted) => {\n if (!wasInserted.inserted) {\n return _incrementalUpsertUpdate(wasInserted.doc, useJson);\n } else {\n return wasInserted.doc;\n }\n });\n this._incrementalUpsertQueues.set(primary, queue);\n return queue;\n }\n\n find(queryObj?: MangoQuery): RxQuery<\n RxDocumentType,\n RxDocument[],\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (typeof queryObj === 'string') {\n throw newRxError('COL5', {\n queryObj\n });\n }\n\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n const query = createRxQuery('find', queryObj, this as any);\n return query as any;\n }\n\n findOne(\n queryObj?: MangoQueryNoLimit | string\n ): RxQuery<\n RxDocumentType,\n RxDocument | null,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n\n // TODO move this check to dev-mode plugin\n if (\n typeof queryObj === 'number' ||\n Array.isArray(queryObj)\n ) {\n throw newRxTypeError('COL6', {\n queryObj\n });\n }\n\n let query;\n\n if (typeof queryObj === 'string') {\n query = createRxQuery('findOne', {\n selector: {\n [this.schema.primaryPath]: queryObj\n },\n limit: 1\n }, this as any);\n } else {\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n\n // cannot have limit on findOne queries because it will be overwritten\n if ((queryObj as MangoQuery).limit) {\n throw newRxError('QU6');\n }\n\n queryObj = flatClone(queryObj);\n (queryObj as any).limit = 1;\n query = createRxQuery('findOne', queryObj, this as any);\n }\n\n\n return query as any;\n }\n\n count(queryObj?: MangoQuerySelectorAndIndex): RxQuery<\n RxDocumentType,\n number,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n const query = createRxQuery('count', queryObj, this as any);\n return query as any;\n }\n\n /**\n * find a list documents by their primary key\n * has way better performance then running multiple findOne() or a find() with a complex $or-selected\n */\n findByIds(\n ids: string[]\n ): RxQuery<\n RxDocumentType,\n Map>,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n const mangoQuery: MangoQuery = {\n selector: {\n [this.schema.primaryPath]: {\n $in: ids.slice(0)\n }\n } as any\n };\n const query = createRxQuery('findByIds', mangoQuery, this as any);\n return query as any;\n }\n\n /**\n * Export collection to a JSON friendly format.\n */\n exportJSON(): Promise>;\n exportJSON(): Promise>;\n exportJSON(): Promise {\n throw pluginMissing('json-dump');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n */\n importJSON(_exportedJSON: RxDumpCollectionAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n insertCRDT(_updateObj: CRDTEntry | CRDTEntry[]): RxDocument {\n throw pluginMissing('crdt');\n }\n\n /**\n * HOOKS\n */\n addHook(when: HookWhenType, key: HookKeyType, fun: any, parallel = false) {\n if (typeof fun !== 'function') {\n throw newRxTypeError('COL7', {\n key,\n when\n });\n }\n\n if (!HOOKS_WHEN.includes(when)) {\n throw newRxTypeError('COL8', {\n key,\n when\n });\n }\n\n if (!HOOKS_KEYS.includes(key)) {\n throw newRxError('COL9', {\n key\n });\n }\n\n if (when === 'post' && key === 'create' && parallel === true) {\n throw newRxError('COL10', {\n when,\n key,\n parallel\n });\n }\n\n // bind this-scope to hook-function\n const boundFun = fun.bind(this);\n\n const runName = parallel ? 'parallel' : 'series';\n\n this.hooks[key] = this.hooks[key] || {};\n this.hooks[key][when] = this.hooks[key][when] || {\n series: [],\n parallel: []\n };\n this.hooks[key][when][runName].push(boundFun);\n }\n\n getHooks(when: HookWhenType, key: HookKeyType) {\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return {\n series: [],\n parallel: []\n };\n }\n return this.hooks[key][when];\n }\n\n hasHooks(when: HookWhenType, key: HookKeyType) {\n /**\n * Performance shortcut\n * so that we not have to build the empty object.\n */\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return false;\n }\n\n const hooks = this.getHooks(when, key);\n if (!hooks) {\n return false;\n }\n return hooks.series.length > 0 || hooks.parallel.length > 0;\n }\n\n _runHooks(when: HookWhenType, key: HookKeyType, data: any, instance?: any): Promise {\n const hooks = this.getHooks(when, key);\n\n if (!hooks) {\n return PROMISE_RESOLVE_VOID;\n }\n\n // run parallel: false\n const tasks = hooks.series.map((hook: any) => () => hook(data, instance));\n return promiseSeries(tasks)\n // run parallel: true\n .then(() => Promise.all(\n hooks.parallel\n .map((hook: any) => hook(data, instance))\n ));\n }\n\n /**\n * does the same as ._runHooks() but with non-async-functions\n */\n _runHooksSync(when: HookWhenType, key: HookKeyType, data: any, instance: any) {\n if (!this.hasHooks(when, key)) {\n return;\n }\n const hooks = this.getHooks(when, key);\n if (!hooks) return;\n hooks.series.forEach((hook: any) => hook(data, instance));\n }\n\n /**\n * Returns a promise that resolves after the given time.\n * Ensures that is properly cleans up when the collection is destroyed\n * so that no running timeouts prevent the exit of the JavaScript process.\n */\n promiseWait(time: number): Promise {\n const ret = new Promise(res => {\n const timeout = setTimeout(() => {\n this.timeouts.delete(timeout);\n res();\n }, time);\n this.timeouts.add(timeout);\n });\n return ret;\n }\n\n async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n\n await Promise.all(this.onDestroy.map(fn => fn()));\n\n /**\n * Settings destroyed = true\n * must be the first thing to do,\n * so for example the replication can directly stop\n * instead of sending requests to a closed storage.\n */\n this.destroyed = true;\n\n\n Array.from(this.timeouts).forEach(timeout => clearTimeout(timeout));\n if (this._changeEventBuffer) {\n this._changeEventBuffer.destroy();\n }\n /**\n * First wait until the whole database is idle.\n * This ensures that the storage does not get closed\n * while some operation is running.\n * It is important that we do not intercept a running call\n * because it might lead to undefined behavior like when a doc is written\n * but the change is not added to the changes collection.\n */\n return this.database.requestIdlePromise()\n .then(() => this.storageInstance.close())\n .then(() => {\n /**\n * Unsubscribing must be done AFTER the storageInstance.close()\n * Because the conflict handling is part of the subscriptions and\n * otherwise there might be open conflicts to be resolved which\n * will then stuck and never resolve.\n */\n this._subs.forEach(sub => sub.unsubscribe());\n\n delete this.database.collections[this.name];\n return runAsyncPluginHooks('postDestroyRxCollection', this).then(() => true);\n });\n }\n\n /**\n * remove all data of the collection\n */\n async remove(): Promise {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n await removeCollectionStorages(\n this.database.storage,\n this.database.internalStore,\n this.database.token,\n this.database.name,\n this.name,\n this.database.password,\n this.database.hashFunction\n );\n }\n\n get asRxCollection(): RxCollection {\n return this as any;\n }\n}\n\n/**\n * adds the hook-functions to the collections prototype\n * this runs only once\n */\nfunction _applyHookFunctions(\n collection: RxCollection\n) {\n if (hooksApplied) return; // already run\n hooksApplied = true;\n const colProto = Object.getPrototypeOf(collection);\n HOOKS_KEYS.forEach(key => {\n HOOKS_WHEN.map(when => {\n const fnName = when + ucfirst(key);\n colProto[fnName] = function (fun: string, parallel: boolean) {\n return this.addHook(when, key, fun, parallel);\n };\n });\n });\n}\n\nfunction _incrementalUpsertUpdate(\n doc: RxDocumentBase,\n json: RxDocumentData\n): Promise> {\n return doc.incrementalModify((_innerDoc) => {\n return json;\n });\n}\n\n/**\n * ensures that the given document exists\n * @return promise that resolves with new doc and flag if inserted\n */\nfunction _incrementalUpsertEnsureRxDocumentExists(\n rxCollection: RxCollection,\n primary: string,\n json: any\n): Promise<\n {\n doc: RxDocument;\n inserted: boolean;\n }\n> {\n /**\n * Optimisation shortcut,\n * first try to find the document in the doc-cache\n */\n const docDataFromCache = rxCollection._docCache.getLatestDocumentDataIfExists(primary);\n if (docDataFromCache) {\n return Promise.resolve({\n doc: rxCollection._docCache.getCachedRxDocuments([docDataFromCache])[0],\n inserted: false\n });\n }\n return rxCollection.findOne(primary).exec()\n .then(doc => {\n if (!doc) {\n return rxCollection.insert(json).then(newDoc => ({\n doc: newDoc,\n inserted: true\n }));\n } else {\n return {\n doc,\n inserted: false\n };\n }\n });\n}\n\n/**\n * creates and prepares a new collection\n */\nexport function createRxCollection(\n {\n database,\n name,\n schema,\n instanceCreationOptions = {},\n migrationStrategies = {},\n autoMigrate = true,\n statics = {},\n methods = {},\n attachments = {},\n options = {},\n localDocuments = false,\n cacheReplacementPolicy = defaultCacheReplacementPolicy,\n conflictHandler = defaultConflictHandler\n }: any\n): Promise {\n const storageInstanceCreationParams: RxStorageInstanceCreationParams = {\n databaseInstanceToken: database.token,\n databaseName: database.name,\n collectionName: name,\n schema: schema.jsonSchema,\n options: instanceCreationOptions,\n multiInstance: database.multiInstance,\n password: database.password,\n devMode: overwritable.isDevMode()\n };\n\n runPluginHooks(\n 'preCreateRxStorageInstance',\n storageInstanceCreationParams\n );\n\n return createRxCollectionStorageInstance(\n database,\n storageInstanceCreationParams\n ).then(storageInstance => {\n const collection = new RxCollectionBase(\n database,\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n statics,\n conflictHandler\n );\n\n return collection\n .prepare()\n .then(() => {\n // ORM add statics\n Object\n .entries(statics)\n .forEach(([funName, fun]) => {\n Object.defineProperty(collection, funName, {\n get: () => (fun as any).bind(collection)\n });\n });\n\n let ret = PROMISE_RESOLVE_VOID;\n if (autoMigrate && collection.schema.version !== 0) {\n ret = collection.migratePromise();\n }\n return ret;\n })\n .then(() => {\n runPluginHooks('createRxCollection', {\n collection,\n creator: {\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n localDocuments,\n statics\n }\n });\n return collection as any;\n })\n /**\n * If the collection creation fails,\n * we yet have to close the storage instances.\n */\n .catch(err => {\n return storageInstance.close()\n .then(() => Promise.reject(err));\n });\n });\n}\n\nexport function isRxCollection(obj: any): boolean {\n return obj instanceof RxCollectionBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/rx-database.js.map b/dist/cjs/rx-database.js.map index ba5727324d3..030a274102e 100644 --- a/dist/cjs/rx-database.js.map +++ b/dist/cjs/rx-database.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-database.js","names":["_customIdleQueue","require","_index","_rxError","_rxSchema","_hooks","_rxjs","_operators","_rxCollection","_rxStorageHelper","_obliviousSet","_rxDatabaseInternalStore","_rxCollectionHelper","_overwritable","USED_DATABASE_NAMES","Set","DB_COUNT","RxDatabaseBase","exports","name","token","storage","instanceCreationOptions","password","multiInstance","eventReduce","options","internalStore","hashFunction","cleanupPolicy","allowSlowCount","reactivity","idleQueue","IdleQueue","rxdbVersion","RXDB_VERSION","storageInstances","_subs","startupErrors","onDestroy","destroyed","collections","states","eventBulks$","Subject","observable$","pipe","mergeMap","changeEventBulk","events","storageToken","PROMISE_RESOLVE_FALSE","storageTokenDocument","emittedEventBulkIds","ObliviousSet","getWrappedStorageInstance","asRxDatabase","INTERNAL_STORE_SCHEMA","ensureStorageTokenDocumentExists","catch","err","push","then","doc","data","_proto","prototype","getReactivityFactory","newRxError","database","$emit","has","id","add","next","removeCollectionDoc","schema","getSingleDocument","getPrimaryKeyOfInternalDocument","_collectionNamePrimary","INTERNAL_CONTEXT_COLLECTION","writeDoc","flatCloneDocWithMeta","_deleted","bulkWrite","document","previous","addCollections","collectionCreators","jsonSchemas","schemas","bulkPutDocs","useArgsByCollectionName","Promise","all","Object","entries","map","args","collectionName","rxJsonSchema","createRxSchema","collectionNameWithVersion","collectionDocData","key","context","schemaHash","hash","jsonSchema","version","connectedStorages","_meta","getDefaultRxDocumentMeta","_rev","getDefaultRevision","_attachments","useArgs","assign","hookData","flatClone","runPluginHooks","conflictHandler","putDocsResult","ensureNoStartupErrors","error","status","writeError","docInDb","ensureNotFalsy","documentInDb","collection","previousSchemaHash","previousSchema","ret","keys","createRxCollection","defineProperty","get","lockedRun","fn","wrapCall","requestIdlePromise","exportJSON","_collections","pluginMissing","addState","_name","importJSON","_exportedJSON","backup","_options","leaderElector","isLeader","waitForLeadership","migrationStates","destroy","runAsyncPluginHooks","complete","sub","unsubscribe","col","close","delete","remove","removeRxDatabase","_createClass2","default","throwIfDatabaseNameUsed","link","createRxDatabaseStorageInstance","databaseInstanceToken","databaseName","createStorageInstance","INTERNAL_STORAGE_NAME","devMode","overwritable","isDevMode","createRxDatabase","ignoreDuplicate","localDocuments","defaultHashSha256","randomCouchString","storageInstance","rxDatabase","creator","dbInternalsStorageInstance","collectionDocs","getAllCollectionDocuments","collectionNames","forEach","removedCollectionNames","Array","from","removeCollectionStorages","isRxDatabase","obj","dbCount","isRxDatabaseFirstTimeInstantiated","tokenDoc","instanceToken"],"sources":["../../src/rx-database.ts"],"sourcesContent":["import { IdleQueue } from 'custom-idle-queue';\nimport type {\n LeaderElector\n} from 'broadcast-channel';\nimport type {\n CollectionsOfDatabase,\n RxDatabase,\n RxCollectionCreator,\n RxJsonSchema,\n RxCollection,\n RxDumpDatabase,\n RxDumpDatabaseAny,\n BackupOptions,\n RxStorage,\n RxStorageInstance,\n BulkWriteRow,\n RxChangeEvent,\n RxDatabaseCreator,\n RxChangeEventBulk,\n RxDocumentData,\n RxCleanupPolicy,\n InternalStoreDocType,\n InternalStoreStorageTokenDocType,\n InternalStoreCollectionDocType,\n RxTypeError,\n RxError,\n HashFunction,\n MaybePromise,\n RxState\n} from './types/index.d.ts';\n\nimport {\n pluginMissing,\n flatClone,\n PROMISE_RESOLVE_FALSE,\n randomCouchString,\n ensureNotFalsy,\n getDefaultRevision,\n getDefaultRxDocumentMeta,\n defaultHashSha256,\n RXDB_VERSION\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n createRxSchema,\n RxSchema\n} from './rx-schema.ts';\nimport {\n runPluginHooks,\n runAsyncPluginHooks\n} from './hooks.ts';\nimport {\n Subject,\n Subscription,\n Observable\n} from 'rxjs';\nimport {\n mergeMap\n} from 'rxjs/operators';\nimport {\n createRxCollection\n} from './rx-collection.ts';\nimport {\n flatCloneDocWithMeta,\n getSingleDocument,\n getWrappedStorageInstance,\n INTERNAL_STORAGE_NAME,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport type { RxBackupState } from './plugins/backup/index.ts';\nimport { ObliviousSet } from 'oblivious-set';\nimport {\n ensureStorageTokenDocumentExists,\n getAllCollectionDocuments,\n getPrimaryKeyOfInternalDocument,\n INTERNAL_CONTEXT_COLLECTION,\n INTERNAL_STORE_SCHEMA,\n _collectionNamePrimary\n} from './rx-database-internal-store.ts';\nimport { removeCollectionStorages } from './rx-collection-helper.ts';\nimport { overwritable } from './overwritable.ts';\nimport type { RxMigrationState } from './plugins/migration-schema/index.ts';\nimport type { RxReactivityFactory } from './types/plugins/reactivity.d.ts';\n\n/**\n * stores the used database names+storage names\n * so we can throw when the same database is created more then once.\n */\nconst USED_DATABASE_NAMES: Set = new Set();\n\nlet DB_COUNT = 0;\n\nexport class RxDatabaseBase<\n Internals,\n InstanceCreationOptions,\n Collections = CollectionsOfDatabase,\n Reactivity = unknown\n> {\n\n public readonly idleQueue: IdleQueue = new IdleQueue();\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Contains all known non-closed storage instances\n * that belong to this database.\n * Used in plugins and unit tests.\n */\n public readonly storageInstances = new Set>();\n\n constructor(\n public readonly name: string,\n /**\n * Uniquely identifies the instance\n * of this RxDatabase.\n */\n public readonly token: string,\n public readonly storage: RxStorage,\n public readonly instanceCreationOptions: InstanceCreationOptions,\n public readonly password: any,\n public readonly multiInstance: boolean,\n public readonly eventReduce: boolean = false,\n public options: any = {},\n /**\n * Stores information documents about the collections of the database\n */\n public readonly internalStore: RxStorageInstance,\n public readonly hashFunction: HashFunction,\n public readonly cleanupPolicy?: Partial,\n public readonly allowSlowCount?: boolean,\n public readonly reactivity?: RxReactivityFactory\n ) {\n DB_COUNT++;\n\n /**\n * In the dev-mode, we create a pseudoInstance\n * to get all properties of RxDatabase and ensure they do not\n * conflict with the collection names etc.\n * So only if it is not pseudoInstance,\n * we have all values to prepare a real RxDatabase.\n *\n * TODO this is ugly, we should use a different way in the dev-mode\n * so that all non-dev-mode code can be cleaner.\n */\n if (this.name !== 'pseudoInstance') {\n /**\n * Wrap the internal store\n * to ensure that calls to it also end up in\n * calculation of the idle state and the hooks.\n */\n this.internalStore = getWrappedStorageInstance(\n this.asRxDatabase,\n internalStore,\n INTERNAL_STORE_SCHEMA\n );\n\n /**\n * Start writing the storage token.\n * Do not await the creation because it would run\n * in a critical path that increases startup time.\n *\n * Writing the token takes about 20 milliseconds\n * even on a fast adapter, so this is worth it.\n */\n this.storageTokenDocument = ensureStorageTokenDocumentExists(this.asRxDatabase)\n .catch(err => this.startupErrors.push(err) as any);\n this.storageToken = this.storageTokenDocument\n .then(doc => doc.data.token)\n .catch(err => this.startupErrors.push(err) as any);\n }\n }\n\n get $(): Observable> {\n return this.observable$;\n }\n\n public getReactivityFactory(): RxReactivityFactory {\n if (!this.reactivity) {\n throw newRxError('DB14', { database: this.name });\n }\n return this.reactivity;\n }\n\n public _subs: Subscription[] = [];\n\n /**\n * Because having unhandled exceptions would fail,\n * we have to store the async errors of the constructor here\n * so we can throw them later.\n */\n public startupErrors: (RxError | RxTypeError)[] = [];\n\n /**\n * When the database is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed: boolean = false;\n public collections: Collections = {} as any;\n public states: { [name: string]: RxState; } = {};\n public readonly eventBulks$: Subject> = new Subject();\n private observable$: Observable> = this.eventBulks$\n .pipe(\n mergeMap(changeEventBulk => changeEventBulk.events)\n );\n\n /**\n * Unique token that is stored with the data.\n * Used to detect if the dataset has been deleted\n * and if two RxDatabase instances work on the same dataset or not.\n *\n * Because reading and writing the storageToken runs in the hot path\n * of database creation, we do not await the storageWrites but instead\n * work with the promise when we need the value.\n */\n public storageToken: Promise = PROMISE_RESOLVE_FALSE as any;\n /**\n * Stores the whole state of the internal storage token document.\n * We need this in some plugins.\n */\n public storageTokenDocument: Promise> = PROMISE_RESOLVE_FALSE as any;\n\n /**\n * Contains the ids of all event bulks that have been emitted\n * by the database.\n * Used to detect duplicates that come in again via BroadcastChannel\n * or other streams.\n * TODO instead of having this here, we should add a test to ensure each RxStorage\n * behaves equal and does never emit duplicate eventBulks.\n */\n public emittedEventBulkIds: ObliviousSet = new ObliviousSet(60 * 1000);\n\n /**\n * This is the main handle-point for all change events\n * ChangeEvents created by this instance go:\n * RxDocument -> RxCollection -> RxDatabase.$emit -> MultiInstance\n * ChangeEvents created by other instances go:\n * MultiInstance -> RxDatabase.$emit -> RxCollection -> RxDatabase\n */\n $emit(changeEventBulk: RxChangeEventBulk) {\n if (this.emittedEventBulkIds.has(changeEventBulk.id)) {\n return;\n }\n this.emittedEventBulkIds.add(changeEventBulk.id);\n\n // emit into own stream\n this.eventBulks$.next(changeEventBulk);\n }\n\n /**\n * removes the collection-doc from the internalStore\n */\n async removeCollectionDoc(name: string, schema: any): Promise {\n const doc = await getSingleDocument(\n this.internalStore,\n getPrimaryKeyOfInternalDocument(\n _collectionNamePrimary(name, schema),\n INTERNAL_CONTEXT_COLLECTION\n )\n );\n if (!doc) {\n throw newRxError('SNH', { name, schema });\n }\n const writeDoc = flatCloneDocWithMeta(doc);\n writeDoc._deleted = true;\n\n await this.internalStore.bulkWrite([{\n document: writeDoc,\n previous: doc\n }], 'rx-database-remove-collection');\n }\n\n /**\n * creates multiple RxCollections at once\n * to be much faster by saving db txs and doing stuff in bulk-operations\n * This function is not called often, but mostly in the critical path at the initial page load\n * So it must be as fast as possible.\n */\n async addCollections>(collectionCreators: {\n [key in keyof CreatedCollections]: RxCollectionCreator\n }): Promise<{ [key in keyof CreatedCollections]: RxCollection }> {\n const jsonSchemas: { [key in keyof CreatedCollections]: RxJsonSchema } = {} as any;\n const schemas: { [key in keyof CreatedCollections]: RxSchema } = {} as any;\n const bulkPutDocs: BulkWriteRow[] = [];\n const useArgsByCollectionName: any = {};\n\n await Promise.all(\n Object.entries(collectionCreators).map(async ([name, args]) => {\n const collectionName: keyof CreatedCollections = name as any;\n const rxJsonSchema = (args as RxCollectionCreator).schema;\n jsonSchemas[collectionName] = rxJsonSchema;\n const schema = createRxSchema(rxJsonSchema, this.hashFunction);\n schemas[collectionName] = schema;\n\n // collection already exists\n if ((this.collections as any)[name]) {\n throw newRxError('DB3', {\n name\n });\n }\n\n const collectionNameWithVersion = _collectionNamePrimary(name, rxJsonSchema);\n const collectionDocData: RxDocumentData = {\n id: getPrimaryKeyOfInternalDocument(\n collectionNameWithVersion,\n INTERNAL_CONTEXT_COLLECTION\n ),\n key: collectionNameWithVersion,\n context: INTERNAL_CONTEXT_COLLECTION,\n data: {\n name: collectionName as any,\n schemaHash: await schema.hash,\n schema: schema.jsonSchema,\n version: schema.version,\n connectedStorages: []\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n bulkPutDocs.push({\n document: collectionDocData\n });\n\n const useArgs: any = Object.assign(\n {},\n args,\n {\n name: collectionName,\n schema,\n database: this\n }\n );\n\n // run hooks\n const hookData: RxCollectionCreator & { name: string; } = flatClone(args) as any;\n (hookData as any).database = this;\n hookData.name = name;\n runPluginHooks('preCreateRxCollection', hookData);\n useArgs.conflictHandler = hookData.conflictHandler;\n\n useArgsByCollectionName[collectionName] = useArgs;\n })\n );\n\n\n const putDocsResult = await this.internalStore.bulkWrite(\n bulkPutDocs,\n 'rx-database-add-collection'\n );\n\n await ensureNoStartupErrors(this);\n\n await Promise.all(\n putDocsResult.error.map(async (error) => {\n if (error.status !== 409) {\n throw newRxError('DB12', {\n database: this.name,\n writeError: error\n });\n }\n const docInDb: RxDocumentData = ensureNotFalsy(error.documentInDb);\n const collectionName = docInDb.data.name;\n const schema = (schemas as any)[collectionName];\n // collection already exists but has different schema\n if (docInDb.data.schemaHash !== await schema.hash) {\n throw newRxError('DB6', {\n database: this.name,\n collection: collectionName,\n previousSchemaHash: docInDb.data.schemaHash,\n schemaHash: await schema.hash,\n previousSchema: docInDb.data.schema,\n schema: ensureNotFalsy((jsonSchemas as any)[collectionName])\n });\n }\n })\n );\n\n const ret: { [key in keyof CreatedCollections]: RxCollection } = {} as any;\n await Promise.all(\n Object.keys(collectionCreators).map(async (collectionName) => {\n const useArgs = useArgsByCollectionName[collectionName];\n const collection = await createRxCollection(useArgs);\n (ret as any)[collectionName] = collection;\n\n // set as getter to the database\n (this.collections as any)[collectionName] = collection;\n if (!(this as any)[collectionName]) {\n Object.defineProperty(this, collectionName, {\n get: () => (this.collections as any)[collectionName]\n });\n }\n })\n );\n\n return ret;\n }\n\n /**\n * runs the given function between idleQueue-locking\n */\n lockedRun(fn: (...args: any[]) => T): T extends Promise ? T : Promise {\n return this.idleQueue.wrapCall(fn) as any;\n }\n\n requestIdlePromise() {\n return this.idleQueue.requestIdlePromise();\n }\n\n /**\n * Export database to a JSON friendly format.\n */\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise {\n throw pluginMissing('json-dump');\n }\n\n addState(_name?: string): Promise> {\n throw pluginMissing('state');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n * @note When an interface is loaded in this collection all base properties of the type are typed as `any`\n * since data could be encrypted.\n */\n importJSON(_exportedJSON: RxDumpDatabaseAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n backup(_options: BackupOptions): RxBackupState {\n throw pluginMissing('backup');\n }\n\n public leaderElector(): LeaderElector {\n throw pluginMissing('leader-election');\n }\n\n public isLeader(): boolean {\n throw pluginMissing('leader-election');\n }\n /**\n * returns a promise which resolves when the instance becomes leader\n */\n public waitForLeadership(): Promise {\n throw pluginMissing('leader-election');\n }\n\n public migrationStates(): Observable {\n throw pluginMissing('migration-schema');\n }\n\n /**\n * destroys the database-instance and all collections\n */\n public async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n // settings destroyed = true must be the first thing to do.\n this.destroyed = true;\n\n await runAsyncPluginHooks('preDestroyRxDatabase', this);\n /**\n * Complete the event stream\n * to stop all subscribers who forgot to unsubscribe.\n */\n this.eventBulks$.complete();\n\n DB_COUNT--;\n this._subs.map(sub => sub.unsubscribe());\n\n /**\n * Destroying the pseudo instance will throw\n * because stuff is missing\n * TODO we should not need the pseudo instance on runtime.\n * we should generate the property list on build time.\n */\n if (this.name === 'pseudoInstance') {\n return PROMISE_RESOLVE_FALSE;\n }\n\n /**\n * First wait until the database is idle\n */\n return this.requestIdlePromise()\n .then(() => Promise.all(this.onDestroy.map(fn => fn())))\n // destroy all collections\n .then(() => Promise.all(\n Object.keys(this.collections as any)\n .map(key => (this.collections as any)[key])\n .map(col => col.destroy())\n ))\n // destroy internal storage instances\n .then(() => this.internalStore.close())\n // remove combination from USED_COMBINATIONS-map\n .then(() => USED_DATABASE_NAMES.delete(this.storage.name + '|' + this.name))\n .then(() => true);\n }\n\n /**\n * deletes the database and its stored data.\n * Returns the names of all removed collections.\n */\n remove(): Promise {\n return this\n .destroy()\n .then(() => removeRxDatabase(this.name, this.storage, this.password));\n }\n\n get asRxDatabase(): RxDatabase<\n {},\n Internals,\n InstanceCreationOptions,\n Reactivity\n > {\n return this as any;\n }\n}\n\n/**\n * checks if an instance with same name and storage already exists\n * @throws {RxError} if used\n */\nfunction throwIfDatabaseNameUsed(\n name: string,\n storage: RxStorage\n) {\n const key = storage.name + '|' + name;\n if (!USED_DATABASE_NAMES.has(key)) {\n return;\n } else {\n throw newRxError('DB8', {\n name,\n storage: storage.name,\n link: 'https://rxdb.info/rx-database.html#ignoreduplicate'\n });\n }\n}\n\n/**\n * Creates the storage instances that are used internally in the database\n * to store schemas and other configuration stuff.\n */\nexport async function createRxDatabaseStorageInstance(\n databaseInstanceToken: string,\n storage: RxStorage,\n databaseName: string,\n options: InstanceCreationOptions,\n multiInstance: boolean,\n password?: string\n): Promise> {\n const internalStore = await storage.createStorageInstance(\n {\n databaseInstanceToken,\n databaseName,\n collectionName: INTERNAL_STORAGE_NAME,\n schema: INTERNAL_STORE_SCHEMA,\n options,\n multiInstance,\n password,\n devMode: overwritable.isDevMode()\n }\n );\n return internalStore;\n}\n\nexport function createRxDatabase<\n Collections = { [key: string]: RxCollection; },\n Internals = any,\n InstanceCreationOptions = any,\n Reactivity = unknown\n>(\n {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance = true,\n eventReduce = true,\n ignoreDuplicate = false,\n options = {},\n cleanupPolicy,\n allowSlowCount = false,\n localDocuments = false,\n hashFunction = defaultHashSha256,\n reactivity\n }: RxDatabaseCreator\n): Promise<\n RxDatabase\n> {\n runPluginHooks('preCreateRxDatabase', {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n });\n // check if combination already used\n if (!ignoreDuplicate) {\n throwIfDatabaseNameUsed(name, storage);\n }\n USED_DATABASE_NAMES.add(storage.name + '|' + name);\n\n const databaseInstanceToken = randomCouchString(10);\n\n return createRxDatabaseStorageInstance<\n Internals,\n InstanceCreationOptions\n >(\n databaseInstanceToken,\n storage,\n name,\n instanceCreationOptions as any,\n multiInstance,\n password\n )\n /**\n * Creating the internal store might fail\n * if some RxStorage wrapper is used that does some checks\n * and then throw.\n * In that case we have to properly clean up the database.\n */\n .catch(err => {\n USED_DATABASE_NAMES.delete(storage.name + '|' + name);\n throw err;\n })\n .then(storageInstance => {\n const rxDatabase: RxDatabase = new RxDatabaseBase(\n name,\n databaseInstanceToken,\n storage,\n instanceCreationOptions,\n password,\n multiInstance,\n eventReduce,\n options,\n storageInstance,\n hashFunction,\n cleanupPolicy,\n allowSlowCount,\n reactivity\n ) as any;\n\n return runAsyncPluginHooks('createRxDatabase', {\n database: rxDatabase,\n creator: {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n }\n }).then(() => rxDatabase);\n });\n}\n\n/**\n * Removes the database and all its known data\n * with all known collections and all internal meta data.\n *\n * Returns the names of the removed collections.\n */\nexport async function removeRxDatabase(\n databaseName: string,\n storage: RxStorage,\n password?: string\n): Promise {\n const databaseInstanceToken = randomCouchString(10);\n const dbInternalsStorageInstance = await createRxDatabaseStorageInstance(\n databaseInstanceToken,\n storage,\n databaseName,\n {},\n false,\n password\n );\n const collectionDocs = await getAllCollectionDocuments(dbInternalsStorageInstance);\n const collectionNames = new Set();\n collectionDocs.forEach(doc => collectionNames.add(doc.data.name));\n const removedCollectionNames: string[] = Array.from(collectionNames);\n\n await Promise.all(\n removedCollectionNames.map(collectionName => removeCollectionStorages(\n storage,\n dbInternalsStorageInstance,\n databaseInstanceToken,\n databaseName,\n collectionName,\n password\n ))\n );\n\n await runAsyncPluginHooks('postRemoveRxDatabase', {\n databaseName,\n storage\n });\n\n await dbInternalsStorageInstance.remove();\n return removedCollectionNames;\n}\n\nexport function isRxDatabase(obj: any) {\n return obj instanceof RxDatabaseBase;\n}\n\nexport function dbCount(): number {\n return DB_COUNT;\n}\n\n\n/**\n * Returns true if the given RxDatabase was the first\n * instance that was created on the storage with this name.\n *\n * Can be used for some optimizations because on the first instantiation,\n * we can assume that no data was written before.\n */\nexport async function isRxDatabaseFirstTimeInstantiated(\n database: RxDatabase\n): Promise {\n const tokenDoc = await database.storageTokenDocument;\n return tokenDoc.data.instanceToken === database.token;\n}\n\n\n/**\n * For better performance some tasks run async\n * and are awaited later.\n * But we still have to ensure that there have been no errors\n * on database creation.\n */\nexport async function ensureNoStartupErrors(\n rxDatabase: RxDatabaseBase\n) {\n await rxDatabase.storageToken;\n if (rxDatabase.startupErrors[0]) {\n throw rxDatabase.startupErrors[0];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AA+BA,IAAAC,MAAA,GAAAD,OAAA;AAWA,IAAAE,QAAA,GAAAF,OAAA;AAGA,IAAAG,SAAA,GAAAH,OAAA;AAIA,IAAAI,MAAA,GAAAJ,OAAA;AAIA,IAAAK,KAAA,GAAAL,OAAA;AAKA,IAAAM,UAAA,GAAAN,OAAA;AAGA,IAAAO,aAAA,GAAAP,OAAA;AAGA,IAAAQ,gBAAA,GAAAR,OAAA;AAQA,IAAAS,aAAA,GAAAT,OAAA;AACA,IAAAU,wBAAA,GAAAV,OAAA;AAQA,IAAAW,mBAAA,GAAAX,OAAA;AACA,IAAAY,aAAA,GAAAZ,OAAA;AAIA;AACA;AACA;AACA;AACA,IAAMa,mBAAgC,GAAG,IAAIC,GAAG,CAAC,CAAC;AAElD,IAAIC,QAAQ,GAAG,CAAC;AAAC,IAEJC,cAAc,GAAAC,OAAA,CAAAD,cAAA;EAUvB;AACJ;AACA;AACA;AACA;;EAGI,SAAAA,eACoBE,IAAY;EAC5B;AACR;AACA;AACA;EACwBC,KAAa,EACbC,OAAsD,EACtDC,uBAAgD,EAChDC,QAAa,EACbC,aAAsB,EACtBC,WAAoB,GAAG,KAAK,EACrCC,OAAY,GAAG,CAAC,CAAC;EACxB;AACR;AACA;EACwBC,aAA0F,EAC1FC,YAA0B,EAC1BC,aAAwC,EACxCC,cAAwB,EACxBC,UAAqC,EACvD;IAAA,KA/BcC,SAAS,GAAc,IAAIC,0BAAS,CAAC,CAAC;IAAA,KACtCC,WAAW,GAAGC,mBAAY;IAAA,KAO1BC,gBAAgB,GAAG,IAAIrB,GAAG,CAAoE,CAAC;IAAA,KA2ExGsB,KAAK,GAAmB,EAAE;IAAA,KAO1BC,aAAa,GAA8B,EAAE;IAAA,KAQ7CC,SAAS,GAAgC,EAAE;IAAA,KAC3CC,SAAS,GAAY,KAAK;IAAA,KAC1BC,WAAW,GAAgB,CAAC,CAAC;IAAA,KAC7BC,MAAM,GAAkD,CAAC,CAAC;IAAA,KACjDC,WAAW,GAAoC,IAAIC,aAAO,CAAC,CAAC;IAAA,KACpEC,WAAW,GAAmC,IAAI,CAACF,WAAW,CACjEG,IAAI,CACD,IAAAC,mBAAQ,EAACC,eAAe,IAAIA,eAAe,CAACC,MAAM,CACtD,CAAC;IAAA,KAWEC,YAAY,GAAoBC,4BAAqB;IAAA,KAKrDC,oBAAoB,GAA8DD,4BAAqB;IAAA,KAUvGE,mBAAmB,GAAyB,IAAIC,0BAAY,CAAC,EAAE,GAAG,IAAI,CAAC;IAAA,KAzH1DnC,IAAY,GAAZA,IAAY;IAAA,KAKZC,KAAa,GAAbA,KAAa;IAAA,KACbC,OAAsD,GAAtDA,OAAsD;IAAA,KACtDC,uBAAgD,GAAhDA,uBAAgD;IAAA,KAChDC,QAAa,GAAbA,QAAa;IAAA,KACbC,aAAsB,GAAtBA,aAAsB;IAAA,KACtBC,WAAoB,GAApBA,WAAoB;IAAA,KAC7BC,OAAY,GAAZA,OAAY;IAAA,KAIHC,aAA0F,GAA1FA,aAA0F;IAAA,KAC1FC,YAA0B,GAA1BA,YAA0B;IAAA,KAC1BC,aAAwC,GAAxCA,aAAwC;IAAA,KACxCC,cAAwB,GAAxBA,cAAwB;IAAA,KACxBC,UAAqC,GAArCA,UAAqC;IAErDf,QAAQ,EAAE;;IAEV;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQ,IAAI,IAAI,CAACG,IAAI,KAAK,gBAAgB,EAAE;MAChC;AACZ;AACA;AACA;AACA;MACY,IAAI,CAACQ,aAAa,GAAG,IAAA4B,0CAAyB,EAC1C,IAAI,CAACC,YAAY,EACjB7B,aAAa,EACb8B,8CACJ,CAAC;;MAED;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;MACY,IAAI,CAACL,oBAAoB,GAAG,IAAAM,yDAAgC,EAAC,IAAI,CAACF,YAAY,CAAC,CAC1EG,KAAK,CAACC,GAAG,IAAI,IAAI,CAACtB,aAAa,CAACuB,IAAI,CAACD,GAAG,CAAQ,CAAC;MACtD,IAAI,CAACV,YAAY,GAAG,IAAI,CAACE,oBAAoB,CACxCU,IAAI,CAACC,GAAG,IAAIA,GAAG,CAACC,IAAI,CAAC5C,KAAK,CAAC,CAC3BuC,KAAK,CAACC,GAAG,IAAI,IAAI,CAACtB,aAAa,CAACuB,IAAI,CAACD,GAAG,CAAQ,CAAC;IAC1D;EACJ;EAAC,IAAAK,MAAA,GAAAhD,cAAA,CAAAiD,SAAA;EAAAD,MAAA,CAMME,oBAAoB,GAA3B,SAAOA,oBAAoBA,CAAA,EAAoC;IAC3D,IAAI,CAAC,IAAI,CAACpC,UAAU,EAAE;MAClB,MAAM,IAAAqC,mBAAU,EAAC,MAAM,EAAE;QAAEC,QAAQ,EAAE,IAAI,CAAClD;MAAK,CAAC,CAAC;IACrD;IACA,OAAO,IAAI,CAACY,UAAU;EAC1B;;EAIA;AACJ;AACA;AACA;AACA;;EAGI;AACJ;AACA;AACA;AACA;AACA;;EAWI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAEI;AACJ;AACA;AACA;;EAGI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,KAPI;EAUA;AACJ;AACA;AACA;AACA;AACA;AACA;EANIkC,MAAA,CAOAK,KAAK,GAAL,SAAAA,KAAKA,CAACtB,eAAuC,EAAE;IAC3C,IAAI,IAAI,CAACK,mBAAmB,CAACkB,GAAG,CAACvB,eAAe,CAACwB,EAAE,CAAC,EAAE;MAClD;IACJ;IACA,IAAI,CAACnB,mBAAmB,CAACoB,GAAG,CAACzB,eAAe,CAACwB,EAAE,CAAC;;IAEhD;IACA,IAAI,CAAC7B,WAAW,CAAC+B,IAAI,CAAC1B,eAAe,CAAC;EAC1C;;EAEA;AACJ;AACA,KAFI;EAAAiB,MAAA,CAGMU,mBAAmB,GAAzB,eAAMA,mBAAmBA,CAACxD,IAAY,EAAEyD,MAAW,EAAiB;IAChE,IAAMb,GAAG,GAAG,MAAM,IAAAc,kCAAiB,EAC/B,IAAI,CAAClD,aAAa,EAClB,IAAAmD,wDAA+B,EAC3B,IAAAC,+CAAsB,EAAC5D,IAAI,EAAEyD,MAAM,CAAC,EACpCI,oDACJ,CACJ,CAAC;IACD,IAAI,CAACjB,GAAG,EAAE;MACN,MAAM,IAAAK,mBAAU,EAAC,KAAK,EAAE;QAAEjD,IAAI;QAAEyD;MAAO,CAAC,CAAC;IAC7C;IACA,IAAMK,QAAQ,GAAG,IAAAC,qCAAoB,EAACnB,GAAG,CAAC;IAC1CkB,QAAQ,CAACE,QAAQ,GAAG,IAAI;IAExB,MAAM,IAAI,CAACxD,aAAa,CAACyD,SAAS,CAAC,CAAC;MAChCC,QAAQ,EAAEJ,QAAQ;MAClBK,QAAQ,EAAEvB;IACd,CAAC,CAAC,EAAE,+BAA+B,CAAC;EACxC;;EAEA;AACJ;AACA;AACA;AACA;AACA,KALI;EAAAE,MAAA,CAMMsB,cAAc,GAApB,eAAMA,cAAcA,CAA4CC,kBAE/D,EAA6F;IAC1F,IAAMC,WAAqE,GAAG,CAAC,CAAQ;IACvF,IAAMC,OAA6D,GAAG,CAAC,CAAQ;IAC/E,IAAMC,WAA2D,GAAG,EAAE;IACtE,IAAMC,uBAA4B,GAAG,CAAC,CAAC;IAEvC,MAAMC,OAAO,CAACC,GAAG,CACbC,MAAM,CAACC,OAAO,CAACR,kBAAkB,CAAC,CAACS,GAAG,CAAC,OAAO,CAAC9E,IAAI,EAAE+E,IAAI,CAAC,KAAK;MAC3D,IAAMC,cAAwC,GAAGhF,IAAW;MAC5D,IAAMiF,YAAY,GAAIF,IAAI,CAA8BtB,MAAM;MAC9Da,WAAW,CAACU,cAAc,CAAC,GAAGC,YAAY;MAC1C,IAAMxB,MAAM,GAAG,IAAAyB,wBAAc,EAACD,YAAY,EAAE,IAAI,CAACxE,YAAY,CAAC;MAC9D8D,OAAO,CAACS,cAAc,CAAC,GAAGvB,MAAM;;MAEhC;MACA,IAAK,IAAI,CAACnC,WAAW,CAAStB,IAAI,CAAC,EAAE;QACjC,MAAM,IAAAiD,mBAAU,EAAC,KAAK,EAAE;UACpBjD;QACJ,CAAC,CAAC;MACN;MAEA,IAAMmF,yBAAyB,GAAG,IAAAvB,+CAAsB,EAAC5D,IAAI,EAAEiF,YAAY,CAAC;MAC5E,IAAMG,iBAAiE,GAAG;QACtE/B,EAAE,EAAE,IAAAM,wDAA+B,EAC/BwB,yBAAyB,EACzBtB,oDACJ,CAAC;QACDwB,GAAG,EAAEF,yBAAyB;QAC9BG,OAAO,EAAEzB,oDAA2B;QACpChB,IAAI,EAAE;UACF7C,IAAI,EAAEgF,cAAqB;UAC3BO,UAAU,EAAE,MAAM9B,MAAM,CAAC+B,IAAI;UAC7B/B,MAAM,EAAEA,MAAM,CAACgC,UAAU;UACzBC,OAAO,EAAEjC,MAAM,CAACiC,OAAO;UACvBC,iBAAiB,EAAE;QACvB,CAAC;QACD3B,QAAQ,EAAE,KAAK;QACf4B,KAAK,EAAE,IAAAC,+BAAwB,EAAC,CAAC;QACjCC,IAAI,EAAE,IAAAC,yBAAkB,EAAC,CAAC;QAC1BC,YAAY,EAAE,CAAC;MACnB,CAAC;MACDxB,WAAW,CAAC9B,IAAI,CAAC;QACbwB,QAAQ,EAAEkB;MACd,CAAC,CAAC;MAEF,IAAMa,OAAY,GAAGrB,MAAM,CAACsB,MAAM,CAC9B,CAAC,CAAC,EACFnB,IAAI,EACJ;QACI/E,IAAI,EAAEgF,cAAc;QACpBvB,MAAM;QACNP,QAAQ,EAAE;MACd,CACJ,CAAC;;MAED;MACA,IAAMiD,QAAsD,GAAG,IAAAC,gBAAS,EAACrB,IAAI,CAAQ;MACpFoB,QAAQ,CAASjD,QAAQ,GAAG,IAAI;MACjCiD,QAAQ,CAACnG,IAAI,GAAGA,IAAI;MACpB,IAAAqG,qBAAc,EAAC,uBAAuB,EAAEF,QAAQ,CAAC;MACjDF,OAAO,CAACK,eAAe,GAAGH,QAAQ,CAACG,eAAe;MAElD7B,uBAAuB,CAACO,cAAc,CAAC,GAAGiB,OAAO;IACrD,CAAC,CACL,CAAC;IAGD,IAAMM,aAAa,GAAG,MAAM,IAAI,CAAC/F,aAAa,CAACyD,SAAS,CACpDO,WAAW,EACX,4BACJ,CAAC;IAED,MAAMgC,qBAAqB,CAAC,IAAI,CAAC;IAEjC,MAAM9B,OAAO,CAACC,GAAG,CACb4B,aAAa,CAACE,KAAK,CAAC3B,GAAG,CAAC,MAAO2B,KAAK,IAAK;MACrC,IAAIA,KAAK,CAACC,MAAM,KAAK,GAAG,EAAE;QACtB,MAAM,IAAAzD,mBAAU,EAAC,MAAM,EAAE;UACrBC,QAAQ,EAAE,IAAI,CAAClD,IAAI;UACnB2G,UAAU,EAAEF;QAChB,CAAC,CAAC;MACN;MACA,IAAMG,OAAuD,GAAG,IAAAC,qBAAc,EAACJ,KAAK,CAACK,YAAY,CAAC;MAClG,IAAM9B,cAAc,GAAG4B,OAAO,CAAC/D,IAAI,CAAC7C,IAAI;MACxC,IAAMyD,MAAM,GAAIc,OAAO,CAASS,cAAc,CAAC;MAC/C;MACA,IAAI4B,OAAO,CAAC/D,IAAI,CAAC0C,UAAU,MAAK,MAAM9B,MAAM,CAAC+B,IAAI,GAAE;QAC/C,MAAM,IAAAvC,mBAAU,EAAC,KAAK,EAAE;UACpBC,QAAQ,EAAE,IAAI,CAAClD,IAAI;UACnB+G,UAAU,EAAE/B,cAAc;UAC1BgC,kBAAkB,EAAEJ,OAAO,CAAC/D,IAAI,CAAC0C,UAAU;UAC3CA,UAAU,EAAE,MAAM9B,MAAM,CAAC+B,IAAI;UAC7ByB,cAAc,EAAEL,OAAO,CAAC/D,IAAI,CAACY,MAAM;UACnCA,MAAM,EAAE,IAAAoD,qBAAc,EAAEvC,WAAW,CAASU,cAAc,CAAC;QAC/D,CAAC,CAAC;MACN;IACJ,CAAC,CACL,CAAC;IAED,IAAMkC,GAAqF,GAAG,CAAC,CAAQ;IACvG,MAAMxC,OAAO,CAACC,GAAG,CACbC,MAAM,CAACuC,IAAI,CAAC9C,kBAAkB,CAAC,CAACS,GAAG,CAAC,MAAOE,cAAc,IAAK;MAC1D,IAAMiB,OAAO,GAAGxB,uBAAuB,CAACO,cAAc,CAAC;MACvD,IAAM+B,UAAU,GAAG,MAAM,IAAAK,gCAAkB,EAACnB,OAAO,CAAC;MACnDiB,GAAG,CAASlC,cAAc,CAAC,GAAG+B,UAAU;;MAEzC;MACC,IAAI,CAACzF,WAAW,CAAS0D,cAAc,CAAC,GAAG+B,UAAU;MACtD,IAAI,CAAE,IAAI,CAAS/B,cAAc,CAAC,EAAE;QAChCJ,MAAM,CAACyC,cAAc,CAAC,IAAI,EAAErC,cAAc,EAAE;UACxCsC,GAAG,EAAEA,CAAA,KAAO,IAAI,CAAChG,WAAW,CAAS0D,cAAc;QACvD,CAAC,CAAC;MACN;IACJ,CAAC,CACL,CAAC;IAED,OAAOkC,GAAG;EACd;;EAEA;AACJ;AACA,KAFI;EAAApE,MAAA,CAGAyE,SAAS,GAAT,SAAAA,SAASA,CAAIC,EAAyB,EAA2C;IAC7E,OAAO,IAAI,CAAC3G,SAAS,CAAC4G,QAAQ,CAACD,EAAE,CAAC;EACtC,CAAC;EAAA1E,MAAA,CAED4E,kBAAkB,GAAlB,SAAAA,kBAAkBA,CAAA,EAAG;IACjB,OAAO,IAAI,CAAC7G,SAAS,CAAC6G,kBAAkB,CAAC,CAAC;EAC9C;;EAEA;AACJ;AACA,KAFI;EAAA5E,MAAA,CAKA6E,UAAU,GAAV,SAAAA,UAAUA,CAACC,YAAuB,EAAgB;IAC9C,MAAM,IAAAC,oBAAa,EAAC,WAAW,CAAC;EACpC,CAAC;EAAA/E,MAAA,CAEDgF,QAAQ,GAAR,SAAAA,QAAQA,CAAUC,KAAc,EAAmC;IAC/D,MAAM,IAAAF,oBAAa,EAAC,OAAO,CAAC;EAChC;;EAEA;AACJ;AACA;AACA;AACA;AACA,KALI;EAAA/E,MAAA,CAMAkF,UAAU,GAAV,SAAAA,UAAUA,CAACC,aAA6C,EAAiB;IACrE,MAAM,IAAAJ,oBAAa,EAAC,WAAW,CAAC;EACpC,CAAC;EAAA/E,MAAA,CAEDoF,MAAM,GAAN,SAAAA,MAAMA,CAACC,QAAuB,EAAiB;IAC3C,MAAM,IAAAN,oBAAa,EAAC,QAAQ,CAAC;EACjC,CAAC;EAAA/E,MAAA,CAEMsF,aAAa,GAApB,SAAOA,aAAaA,CAAA,EAAkB;IAClC,MAAM,IAAAP,oBAAa,EAAC,iBAAiB,CAAC;EAC1C,CAAC;EAAA/E,MAAA,CAEMuF,QAAQ,GAAf,SAAOA,QAAQA,CAAA,EAAY;IACvB,MAAM,IAAAR,oBAAa,EAAC,iBAAiB,CAAC;EAC1C;EACA;AACJ;AACA,KAFI;EAAA/E,MAAA,CAGOwF,iBAAiB,GAAxB,SAAOA,iBAAiBA,CAAA,EAAqB;IACzC,MAAM,IAAAT,oBAAa,EAAC,iBAAiB,CAAC;EAC1C,CAAC;EAAA/E,MAAA,CAEMyF,eAAe,GAAtB,SAAOA,eAAeA,CAAA,EAAmC;IACrD,MAAM,IAAAV,oBAAa,EAAC,kBAAkB,CAAC;EAC3C;;EAEA;AACJ;AACA,KAFI;EAAA/E,MAAA,CAGa0F,OAAO,GAApB,eAAaA,OAAOA,CAAA,EAAqB;IACrC,IAAI,IAAI,CAACnH,SAAS,EAAE;MAChB,OAAOW,4BAAqB;IAChC;;IAEA;IACA,IAAI,CAACX,SAAS,GAAG,IAAI;IAErB,MAAM,IAAAoH,0BAAmB,EAAC,sBAAsB,EAAE,IAAI,CAAC;IACvD;AACR;AACA;AACA;IACQ,IAAI,CAACjH,WAAW,CAACkH,QAAQ,CAAC,CAAC;IAE3B7I,QAAQ,EAAE;IACV,IAAI,CAACqB,KAAK,CAAC4D,GAAG,CAAC6D,GAAG,IAAIA,GAAG,CAACC,WAAW,CAAC,CAAC,CAAC;;IAExC;AACR;AACA;AACA;AACA;AACA;IACQ,IAAI,IAAI,CAAC5I,IAAI,KAAK,gBAAgB,EAAE;MAChC,OAAOgC,4BAAqB;IAChC;;IAEA;AACR;AACA;IACQ,OAAO,IAAI,CAAC0F,kBAAkB,CAAC,CAAC,CAC3B/E,IAAI,CAAC,MAAM+B,OAAO,CAACC,GAAG,CAAC,IAAI,CAACvD,SAAS,CAAC0D,GAAG,CAAC0C,EAAE,IAAIA,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD;IAAA,CACC7E,IAAI,CAAC,MAAM+B,OAAO,CAACC,GAAG,CACnBC,MAAM,CAACuC,IAAI,CAAC,IAAI,CAAC7F,WAAkB,CAAC,CAC/BwD,GAAG,CAACO,GAAG,IAAK,IAAI,CAAC/D,WAAW,CAAS+D,GAAG,CAAC,CAAC,CAC1CP,GAAG,CAAC+D,GAAG,IAAIA,GAAG,CAACL,OAAO,CAAC,CAAC,CACjC,CAAC;IACD;IAAA,CACC7F,IAAI,CAAC,MAAM,IAAI,CAACnC,aAAa,CAACsI,KAAK,CAAC,CAAC;IACtC;IAAA,CACCnG,IAAI,CAAC,MAAMhD,mBAAmB,CAACoJ,MAAM,CAAC,IAAI,CAAC7I,OAAO,CAACF,IAAI,GAAG,GAAG,GAAG,IAAI,CAACA,IAAI,CAAC,CAAC,CAC3E2C,IAAI,CAAC,MAAM,IAAI,CAAC;EACzB;;EAEA;AACJ;AACA;AACA,KAHI;EAAAG,MAAA,CAIAkG,MAAM,GAAN,SAAAA,MAAMA,CAAA,EAAsB;IACxB,OAAO,IAAI,CACNR,OAAO,CAAC,CAAC,CACT7F,IAAI,CAAC,MAAMsG,gBAAgB,CAAC,IAAI,CAACjJ,IAAI,EAAE,IAAI,CAACE,OAAO,EAAE,IAAI,CAACE,QAAQ,CAAC,CAAC;EAC7E,CAAC;EAAA,WAAA8I,aAAA,CAAAC,OAAA,EAAArJ,cAAA;IAAAuF,GAAA;IAAAiC,GAAA,EAtVD,SAAAA,CAAA,EAAwC;MACpC,OAAO,IAAI,CAAC5F,WAAW;IAC3B;EAAC;IAAA2D,GAAA;IAAAiC,GAAA,EAsVD,SAAAA,CAAA,EAKE;MACE,OAAO,IAAI;IACf;EAAC;AAAA;AAGL;AACA;AACA;AACA;AACA,SAAS8B,uBAAuBA,CAC5BpJ,IAAY,EACZE,OAA4B,EAC9B;EACE,IAAMmF,GAAG,GAAGnF,OAAO,CAACF,IAAI,GAAG,GAAG,GAAGA,IAAI;EACrC,IAAI,CAACL,mBAAmB,CAACyD,GAAG,CAACiC,GAAG,CAAC,EAAE;IAC/B;EACJ,CAAC,MAAM;IACH,MAAM,IAAApC,mBAAU,EAAC,KAAK,EAAE;MACpBjD,IAAI;MACJE,OAAO,EAAEA,OAAO,CAACF,IAAI;MACrBqJ,IAAI,EAAE;IACV,CAAC,CAAC;EACN;AACJ;;AAEA;AACA;AACA;AACA;AACO,eAAeC,+BAA+BA,CACjDC,qBAA6B,EAC7BrJ,OAAsD,EACtDsJ,YAAoB,EACpBjJ,OAAgC,EAChCF,aAAsB,EACtBD,QAAiB,EACmE;EACpF,IAAMI,aAAa,GAAG,MAAMN,OAAO,CAACuJ,qBAAqB,CACrD;IACIF,qBAAqB;IACrBC,YAAY;IACZxE,cAAc,EAAE0E,sCAAqB;IACrCjG,MAAM,EAAEnB,8CAAqB;IAC7B/B,OAAO;IACPF,aAAa;IACbD,QAAQ;IACRuJ,OAAO,EAAEC,0BAAY,CAACC,SAAS,CAAC;EACpC,CACJ,CAAC;EACD,OAAOrJ,aAAa;AACxB;AAEO,SAASsJ,gBAAgBA,CAM5B;EACI5J,OAAO;EACPC,uBAAuB;EACvBH,IAAI;EACJI,QAAQ;EACRC,aAAa,GAAG,IAAI;EACpBC,WAAW,GAAG,IAAI;EAClByJ,eAAe,GAAG,KAAK;EACvBxJ,OAAO,GAAG,CAAC,CAAC;EACZG,aAAa;EACbC,cAAc,GAAG,KAAK;EACtBqJ,cAAc,GAAG,KAAK;EACtBvJ,YAAY,GAAGwJ,wBAAiB;EAChCrJ;AAC+D,CAAC,EAGtE;EACE,IAAAyF,qBAAc,EAAC,qBAAqB,EAAE;IAClCnG,OAAO;IACPC,uBAAuB;IACvBH,IAAI;IACJI,QAAQ;IACRC,aAAa;IACbC,WAAW;IACXyJ,eAAe;IACfxJ,OAAO;IACPyJ;EACJ,CAAC,CAAC;EACF;EACA,IAAI,CAACD,eAAe,EAAE;IAClBX,uBAAuB,CAACpJ,IAAI,EAAEE,OAAO,CAAC;EAC1C;EACAP,mBAAmB,CAAC2D,GAAG,CAACpD,OAAO,CAACF,IAAI,GAAG,GAAG,GAAGA,IAAI,CAAC;EAElD,IAAMuJ,qBAAqB,GAAG,IAAAW,wBAAiB,EAAC,EAAE,CAAC;EAEnD,OAAOZ,+BAA+B,CAIlCC,qBAAqB,EACrBrJ,OAAO,EACPF,IAAI,EACJG,uBAAuB,EACvBE,aAAa,EACbD,QACJ;EACI;AACR;AACA;AACA;AACA;AACA,KALQ,CAMCoC,KAAK,CAACC,GAAG,IAAI;IACV9C,mBAAmB,CAACoJ,MAAM,CAAC7I,OAAO,CAACF,IAAI,GAAG,GAAG,GAAGA,IAAI,CAAC;IACrD,MAAMyC,GAAG;EACb,CAAC,CAAC,CACDE,IAAI,CAACwH,eAAe,IAAI;IACrB,IAAMC,UAAmC,GAAG,IAAItK,cAAc,CAC1DE,IAAI,EACJuJ,qBAAqB,EACrBrJ,OAAO,EACPC,uBAAuB,EACvBC,QAAQ,EACRC,aAAa,EACbC,WAAW,EACXC,OAAO,EACP4J,eAAe,EACf1J,YAAY,EACZC,aAAa,EACbC,cAAc,EACdC,UACJ,CAAQ;IAER,OAAO,IAAA6H,0BAAmB,EAAC,kBAAkB,EAAE;MAC3CvF,QAAQ,EAAEkH,UAAU;MACpBC,OAAO,EAAE;QACLnK,OAAO;QACPC,uBAAuB;QACvBH,IAAI;QACJI,QAAQ;QACRC,aAAa;QACbC,WAAW;QACXyJ,eAAe;QACfxJ,OAAO;QACPyJ;MACJ;IACJ,CAAC,CAAC,CAACrH,IAAI,CAAC,MAAMyH,UAAU,CAAC;EAC7B,CAAC,CAAC;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,eAAenB,gBAAgBA,CAClCO,YAAoB,EACpBtJ,OAA4B,EAC5BE,QAAiB,EACA;EACjB,IAAMmJ,qBAAqB,GAAG,IAAAW,wBAAiB,EAAC,EAAE,CAAC;EACnD,IAAMI,0BAA0B,GAAG,MAAMhB,+BAA+B,CACpEC,qBAAqB,EACrBrJ,OAAO,EACPsJ,YAAY,EACZ,CAAC,CAAC,EACF,KAAK,EACLpJ,QACJ,CAAC;EACD,IAAMmK,cAAc,GAAG,MAAM,IAAAC,kDAAyB,EAACF,0BAA0B,CAAC;EAClF,IAAMG,eAAe,GAAG,IAAI7K,GAAG,CAAS,CAAC;EACzC2K,cAAc,CAACG,OAAO,CAAC9H,GAAG,IAAI6H,eAAe,CAACnH,GAAG,CAACV,GAAG,CAACC,IAAI,CAAC7C,IAAI,CAAC,CAAC;EACjE,IAAM2K,sBAAgC,GAAGC,KAAK,CAACC,IAAI,CAACJ,eAAe,CAAC;EAEpE,MAAM/F,OAAO,CAACC,GAAG,CACbgG,sBAAsB,CAAC7F,GAAG,CAACE,cAAc,IAAI,IAAA8F,4CAAwB,EACjE5K,OAAO,EACPoK,0BAA0B,EAC1Bf,qBAAqB,EACrBC,YAAY,EACZxE,cAAc,EACd5E,QACJ,CAAC,CACL,CAAC;EAED,MAAM,IAAAqI,0BAAmB,EAAC,sBAAsB,EAAE;IAC9Ce,YAAY;IACZtJ;EACJ,CAAC,CAAC;EAEF,MAAMoK,0BAA0B,CAACtB,MAAM,CAAC,CAAC;EACzC,OAAO2B,sBAAsB;AACjC;AAEO,SAASI,YAAYA,CAACC,GAAQ,EAAE;EACnC,OAAOA,GAAG,YAAYlL,cAAc;AACxC;AAEO,SAASmL,OAAOA,CAAA,EAAW;EAC9B,OAAOpL,QAAQ;AACnB;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeqL,iCAAiCA,CACnDhI,QAAoB,EACJ;EAChB,IAAMiI,QAAQ,GAAG,MAAMjI,QAAQ,CAACjB,oBAAoB;EACpD,OAAOkJ,QAAQ,CAACtI,IAAI,CAACuI,aAAa,KAAKlI,QAAQ,CAACjD,KAAK;AACzD;;AAGA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeuG,qBAAqBA,CACvC4D,UAA8C,EAChD;EACE,MAAMA,UAAU,CAACrI,YAAY;EAC7B,IAAIqI,UAAU,CAACjJ,aAAa,CAAC,CAAC,CAAC,EAAE;IAC7B,MAAMiJ,UAAU,CAACjJ,aAAa,CAAC,CAAC,CAAC;EACrC;AACJ","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-database.js","names":["_customIdleQueue","require","_index","_rxError","_rxSchema","_hooks","_rxjs","_operators","_rxCollection","_rxStorageHelper","_obliviousSet","_rxDatabaseInternalStore","_rxCollectionHelper","_overwritable","USED_DATABASE_NAMES","Set","DB_COUNT","RxDatabaseBase","exports","name","token","storage","instanceCreationOptions","password","multiInstance","eventReduce","options","internalStore","hashFunction","cleanupPolicy","allowSlowCount","reactivity","idleQueue","IdleQueue","rxdbVersion","RXDB_VERSION","storageInstances","_subs","startupErrors","onDestroy","destroyed","collections","states","eventBulks$","Subject","observable$","pipe","mergeMap","changeEventBulk","events","storageToken","PROMISE_RESOLVE_FALSE","storageTokenDocument","emittedEventBulkIds","ObliviousSet","getWrappedStorageInstance","asRxDatabase","INTERNAL_STORE_SCHEMA","ensureStorageTokenDocumentExists","catch","err","push","then","doc","data","_proto","prototype","getReactivityFactory","newRxError","database","$emit","has","id","add","next","removeCollectionDoc","schema","getSingleDocument","getPrimaryKeyOfInternalDocument","_collectionNamePrimary","INTERNAL_CONTEXT_COLLECTION","writeDoc","flatCloneDocWithMeta","_deleted","bulkWrite","document","previous","addCollections","collectionCreators","jsonSchemas","schemas","bulkPutDocs","useArgsByCollectionName","Promise","all","Object","entries","map","args","collectionName","rxJsonSchema","createRxSchema","collectionNameWithVersion","collectionDocData","key","context","schemaHash","hash","jsonSchema","version","connectedStorages","_meta","getDefaultRxDocumentMeta","_rev","getDefaultRevision","_attachments","useArgs","assign","hookData","flatClone","runPluginHooks","conflictHandler","putDocsResult","ensureNoStartupErrors","error","status","writeError","docInDb","ensureNotFalsy","documentInDb","collection","previousSchemaHash","previousSchema","ret","keys","createRxCollection","defineProperty","get","lockedRun","fn","wrapCall","requestIdlePromise","exportJSON","_collections","pluginMissing","addState","_name","importJSON","_exportedJSON","backup","_options","leaderElector","isLeader","waitForLeadership","migrationStates","destroy","runAsyncPluginHooks","complete","sub","unsubscribe","col","close","delete","remove","removeRxDatabase","_createClass2","default","throwIfDatabaseNameUsed","link","createRxDatabaseStorageInstance","databaseInstanceToken","databaseName","createStorageInstance","INTERNAL_STORAGE_NAME","devMode","overwritable","isDevMode","createRxDatabase","ignoreDuplicate","localDocuments","defaultHashSha256","randomCouchString","storageInstance","rxDatabase","creator","dbInternalsStorageInstance","collectionDocs","getAllCollectionDocuments","collectionNames","forEach","removedCollectionNames","Array","from","removeCollectionStorages","isRxDatabase","obj","dbCount","isRxDatabaseFirstTimeInstantiated","tokenDoc","instanceToken"],"sources":["../../src/rx-database.ts"],"sourcesContent":["import { IdleQueue } from 'custom-idle-queue';\nimport type {\n LeaderElector\n} from 'broadcast-channel';\nimport type {\n CollectionsOfDatabase,\n RxDatabase,\n RxCollectionCreator,\n RxJsonSchema,\n RxCollection,\n RxDumpDatabase,\n RxDumpDatabaseAny,\n BackupOptions,\n RxStorage,\n RxStorageInstance,\n BulkWriteRow,\n RxChangeEvent,\n RxDatabaseCreator,\n RxChangeEventBulk,\n RxDocumentData,\n RxCleanupPolicy,\n InternalStoreDocType,\n InternalStoreStorageTokenDocType,\n InternalStoreCollectionDocType,\n RxTypeError,\n RxError,\n HashFunction,\n MaybePromise,\n RxState\n} from './types/index.d.ts';\n\nimport {\n pluginMissing,\n flatClone,\n PROMISE_RESOLVE_FALSE,\n randomCouchString,\n ensureNotFalsy,\n getDefaultRevision,\n getDefaultRxDocumentMeta,\n defaultHashSha256,\n RXDB_VERSION\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n createRxSchema,\n RxSchema\n} from './rx-schema.ts';\nimport {\n runPluginHooks,\n runAsyncPluginHooks\n} from './hooks.ts';\nimport {\n Subject,\n Subscription,\n Observable\n} from 'rxjs';\nimport {\n mergeMap\n} from 'rxjs/operators';\nimport {\n createRxCollection\n} from './rx-collection.ts';\nimport {\n flatCloneDocWithMeta,\n getSingleDocument,\n getWrappedStorageInstance,\n INTERNAL_STORAGE_NAME,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport type { RxBackupState } from './plugins/backup/index.ts';\nimport { ObliviousSet } from 'oblivious-set';\nimport {\n ensureStorageTokenDocumentExists,\n getAllCollectionDocuments,\n getPrimaryKeyOfInternalDocument,\n INTERNAL_CONTEXT_COLLECTION,\n INTERNAL_STORE_SCHEMA,\n _collectionNamePrimary\n} from './rx-database-internal-store.ts';\nimport { removeCollectionStorages } from './rx-collection-helper.ts';\nimport { overwritable } from './overwritable.ts';\nimport type { RxMigrationState } from './plugins/migration-schema/index.ts';\nimport type { RxReactivityFactory } from './types/plugins/reactivity.d.ts';\n\n/**\n * stores the used database names+storage names\n * so we can throw when the same database is created more then once.\n */\nconst USED_DATABASE_NAMES: Set = new Set();\n\nlet DB_COUNT = 0;\n\nexport class RxDatabaseBase<\n Internals,\n InstanceCreationOptions,\n Collections = CollectionsOfDatabase,\n Reactivity = unknown\n> {\n\n public readonly idleQueue: IdleQueue = new IdleQueue();\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Contains all known non-closed storage instances\n * that belong to this database.\n * Used in plugins and unit tests.\n */\n public readonly storageInstances = new Set>();\n\n constructor(\n public readonly name: string,\n /**\n * Uniquely identifies the instance\n * of this RxDatabase.\n */\n public readonly token: string,\n public readonly storage: RxStorage,\n public readonly instanceCreationOptions: InstanceCreationOptions,\n public readonly password: any,\n public readonly multiInstance: boolean,\n public readonly eventReduce: boolean = false,\n public options: any = {},\n /**\n * Stores information documents about the collections of the database\n */\n public readonly internalStore: RxStorageInstance,\n public readonly hashFunction: HashFunction,\n public readonly cleanupPolicy?: Partial,\n public readonly allowSlowCount?: boolean,\n public readonly reactivity?: RxReactivityFactory\n ) {\n DB_COUNT++;\n\n /**\n * In the dev-mode, we create a pseudoInstance\n * to get all properties of RxDatabase and ensure they do not\n * conflict with the collection names etc.\n * So only if it is not pseudoInstance,\n * we have all values to prepare a real RxDatabase.\n *\n * TODO this is ugly, we should use a different way in the dev-mode\n * so that all non-dev-mode code can be cleaner.\n */\n if (this.name !== 'pseudoInstance') {\n /**\n * Wrap the internal store\n * to ensure that calls to it also end up in\n * calculation of the idle state and the hooks.\n */\n this.internalStore = getWrappedStorageInstance(\n this.asRxDatabase,\n internalStore,\n INTERNAL_STORE_SCHEMA\n );\n\n /**\n * Start writing the storage token.\n * Do not await the creation because it would run\n * in a critical path that increases startup time.\n *\n * Writing the token takes about 20 milliseconds\n * even on a fast adapter, so this is worth it.\n */\n this.storageTokenDocument = ensureStorageTokenDocumentExists(this.asRxDatabase)\n .catch(err => this.startupErrors.push(err) as any);\n this.storageToken = this.storageTokenDocument\n .then(doc => doc.data.token)\n .catch(err => this.startupErrors.push(err) as any);\n }\n }\n\n get $(): Observable> {\n return this.observable$;\n }\n\n public getReactivityFactory(): RxReactivityFactory {\n if (!this.reactivity) {\n throw newRxError('DB14', { database: this.name });\n }\n return this.reactivity;\n }\n\n public _subs: Subscription[] = [];\n\n /**\n * Because having unhandled exceptions would fail,\n * we have to store the async errors of the constructor here\n * so we can throw them later.\n */\n public startupErrors: (RxError | RxTypeError)[] = [];\n\n /**\n * When the database is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed: boolean = false;\n public collections: Collections = {} as any;\n public states: { [name: string]: RxState; } = {};\n public readonly eventBulks$: Subject> = new Subject();\n private observable$: Observable> = this.eventBulks$\n .pipe(\n mergeMap(changeEventBulk => changeEventBulk.events)\n );\n\n /**\n * Unique token that is stored with the data.\n * Used to detect if the dataset has been deleted\n * and if two RxDatabase instances work on the same dataset or not.\n *\n * Because reading and writing the storageToken runs in the hot path\n * of database creation, we do not await the storageWrites but instead\n * work with the promise when we need the value.\n */\n public storageToken: Promise = PROMISE_RESOLVE_FALSE as any;\n /**\n * Stores the whole state of the internal storage token document.\n * We need this in some plugins.\n */\n public storageTokenDocument: Promise> = PROMISE_RESOLVE_FALSE as any;\n\n /**\n * Contains the ids of all event bulks that have been emitted\n * by the database.\n * Used to detect duplicates that come in again via BroadcastChannel\n * or other streams.\n * TODO instead of having this here, we should add a test to ensure each RxStorage\n * behaves equal and does never emit duplicate eventBulks.\n */\n public emittedEventBulkIds: ObliviousSet = new ObliviousSet(60 * 1000);\n\n /**\n * This is the main handle-point for all change events\n * ChangeEvents created by this instance go:\n * RxDocument -> RxCollection -> RxDatabase.$emit -> MultiInstance\n * ChangeEvents created by other instances go:\n * MultiInstance -> RxDatabase.$emit -> RxCollection -> RxDatabase\n */\n $emit(changeEventBulk: RxChangeEventBulk) {\n if (this.emittedEventBulkIds.has(changeEventBulk.id)) {\n return;\n }\n this.emittedEventBulkIds.add(changeEventBulk.id);\n\n // emit into own stream\n this.eventBulks$.next(changeEventBulk);\n }\n\n /**\n * removes the collection-doc from the internalStore\n */\n async removeCollectionDoc(name: string, schema: any): Promise {\n const doc = await getSingleDocument(\n this.internalStore,\n getPrimaryKeyOfInternalDocument(\n _collectionNamePrimary(name, schema),\n INTERNAL_CONTEXT_COLLECTION\n )\n );\n if (!doc) {\n throw newRxError('SNH', { name, schema });\n }\n const writeDoc = flatCloneDocWithMeta(doc);\n writeDoc._deleted = true;\n\n await this.internalStore.bulkWrite([{\n document: writeDoc,\n previous: doc\n }], 'rx-database-remove-collection');\n }\n\n /**\n * creates multiple RxCollections at once\n * to be much faster by saving db txs and doing stuff in bulk-operations\n * This function is not called often, but mostly in the critical path at the initial page load\n * So it must be as fast as possible.\n */\n async addCollections>(collectionCreators: {\n [key in keyof CreatedCollections]: RxCollectionCreator\n }): Promise<{ [key in keyof CreatedCollections]: RxCollection }> {\n const jsonSchemas: { [key in keyof CreatedCollections]: RxJsonSchema } = {} as any;\n const schemas: { [key in keyof CreatedCollections]: RxSchema } = {} as any;\n const bulkPutDocs: BulkWriteRow[] = [];\n const useArgsByCollectionName: any = {};\n\n await Promise.all(\n Object.entries(collectionCreators).map(async ([name, args]) => {\n const collectionName: keyof CreatedCollections = name as any;\n const rxJsonSchema = (args as RxCollectionCreator).schema;\n jsonSchemas[collectionName] = rxJsonSchema;\n const schema = createRxSchema(rxJsonSchema, this.hashFunction);\n schemas[collectionName] = schema;\n\n // collection already exists\n if ((this.collections as any)[name]) {\n throw newRxError('DB3', {\n name\n });\n }\n\n const collectionNameWithVersion = _collectionNamePrimary(name, rxJsonSchema);\n const collectionDocData: RxDocumentData = {\n id: getPrimaryKeyOfInternalDocument(\n collectionNameWithVersion,\n INTERNAL_CONTEXT_COLLECTION\n ),\n key: collectionNameWithVersion,\n context: INTERNAL_CONTEXT_COLLECTION,\n data: {\n name: collectionName as any,\n schemaHash: await schema.hash,\n schema: schema.jsonSchema,\n version: schema.version,\n connectedStorages: []\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n bulkPutDocs.push({\n document: collectionDocData\n });\n\n const useArgs: any = Object.assign(\n {},\n args,\n {\n name: collectionName,\n schema,\n database: this\n }\n );\n\n // run hooks\n const hookData: RxCollectionCreator & { name: string; } = flatClone(args) as any;\n (hookData as any).database = this;\n hookData.name = name;\n runPluginHooks('preCreateRxCollection', hookData);\n useArgs.conflictHandler = hookData.conflictHandler;\n\n useArgsByCollectionName[collectionName] = useArgs;\n })\n );\n\n\n const putDocsResult = await this.internalStore.bulkWrite(\n bulkPutDocs,\n 'rx-database-add-collection'\n );\n\n await ensureNoStartupErrors(this);\n\n await Promise.all(\n putDocsResult.error.map(async (error) => {\n if (error.status !== 409) {\n throw newRxError('DB12', {\n database: this.name,\n writeError: error\n });\n }\n const docInDb: RxDocumentData = ensureNotFalsy(error.documentInDb);\n const collectionName = docInDb.data.name;\n const schema = (schemas as any)[collectionName];\n // collection already exists but has different schema\n if (docInDb.data.schemaHash !== await schema.hash) {\n throw newRxError('DB6', {\n database: this.name,\n collection: collectionName,\n previousSchemaHash: docInDb.data.schemaHash,\n schemaHash: await schema.hash,\n previousSchema: docInDb.data.schema,\n schema: ensureNotFalsy((jsonSchemas as any)[collectionName])\n });\n }\n })\n );\n\n const ret: { [key in keyof CreatedCollections]: RxCollection } = {} as any;\n await Promise.all(\n Object.keys(collectionCreators).map(async (collectionName) => {\n const useArgs = useArgsByCollectionName[collectionName];\n const collection = await createRxCollection(useArgs);\n (ret as any)[collectionName] = collection;\n\n // set as getter to the database\n (this.collections as any)[collectionName] = collection;\n if (!(this as any)[collectionName]) {\n Object.defineProperty(this, collectionName, {\n get: () => (this.collections as any)[collectionName]\n });\n }\n })\n );\n\n return ret;\n }\n\n /**\n * runs the given function between idleQueue-locking\n */\n lockedRun(fn: (...args: any[]) => T): T extends Promise ? T : Promise {\n return this.idleQueue.wrapCall(fn) as any;\n }\n\n requestIdlePromise() {\n return this.idleQueue.requestIdlePromise();\n }\n\n /**\n * Export database to a JSON friendly format.\n */\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise {\n throw pluginMissing('json-dump');\n }\n\n addState(_name?: string): Promise> {\n throw pluginMissing('state');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n * @note When an interface is loaded in this collection all base properties of the type are typed as `any`\n * since data could be encrypted.\n */\n importJSON(_exportedJSON: RxDumpDatabaseAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n backup(_options: BackupOptions): RxBackupState {\n throw pluginMissing('backup');\n }\n\n public leaderElector(): LeaderElector {\n throw pluginMissing('leader-election');\n }\n\n public isLeader(): boolean {\n throw pluginMissing('leader-election');\n }\n /**\n * returns a promise which resolves when the instance becomes leader\n */\n public waitForLeadership(): Promise {\n throw pluginMissing('leader-election');\n }\n\n public migrationStates(): Observable {\n throw pluginMissing('migration-schema');\n }\n\n /**\n * destroys the database-instance and all collections\n */\n public async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n // settings destroyed = true must be the first thing to do.\n this.destroyed = true;\n\n await runAsyncPluginHooks('preDestroyRxDatabase', this);\n /**\n * Complete the event stream\n * to stop all subscribers who forgot to unsubscribe.\n */\n this.eventBulks$.complete();\n\n DB_COUNT--;\n this._subs.map(sub => sub.unsubscribe());\n\n /**\n * Destroying the pseudo instance will throw\n * because stuff is missing\n * TODO we should not need the pseudo instance on runtime.\n * we should generate the property list on build time.\n */\n if (this.name === 'pseudoInstance') {\n return PROMISE_RESOLVE_FALSE;\n }\n\n /**\n * First wait until the database is idle\n */\n return this.requestIdlePromise()\n .then(() => Promise.all(this.onDestroy.map(fn => fn())))\n // destroy all collections\n .then(() => Promise.all(\n Object.keys(this.collections as any)\n .map(key => (this.collections as any)[key])\n .map(col => col.destroy())\n ))\n // destroy internal storage instances\n .then(() => this.internalStore.close())\n // remove combination from USED_COMBINATIONS-map\n .then(() => USED_DATABASE_NAMES.delete(this.storage.name + '|' + this.name))\n .then(() => true);\n }\n\n /**\n * deletes the database and its stored data.\n * Returns the names of all removed collections.\n */\n remove(): Promise {\n return this\n .destroy()\n .then(() => removeRxDatabase(this.name, this.storage, this.password));\n }\n\n get asRxDatabase(): RxDatabase<\n {},\n Internals,\n InstanceCreationOptions,\n Reactivity\n > {\n return this as any;\n }\n}\n\n/**\n * checks if an instance with same name and storage already exists\n * @throws {RxError} if used\n */\nfunction throwIfDatabaseNameUsed(\n name: string,\n storage: RxStorage\n) {\n const key = storage.name + '|' + name;\n if (!USED_DATABASE_NAMES.has(key)) {\n return;\n } else {\n throw newRxError('DB8', {\n name,\n storage: storage.name,\n link: 'https://rxdb.info/rx-database.html#ignoreduplicate'\n });\n }\n}\n\n/**\n * Creates the storage instances that are used internally in the database\n * to store schemas and other configuration stuff.\n */\nexport async function createRxDatabaseStorageInstance(\n databaseInstanceToken: string,\n storage: RxStorage,\n databaseName: string,\n options: InstanceCreationOptions,\n multiInstance: boolean,\n password?: string\n): Promise> {\n const internalStore = await storage.createStorageInstance(\n {\n databaseInstanceToken,\n databaseName,\n collectionName: INTERNAL_STORAGE_NAME,\n schema: INTERNAL_STORE_SCHEMA,\n options,\n multiInstance,\n password,\n devMode: overwritable.isDevMode()\n }\n );\n return internalStore;\n}\n\nexport function createRxDatabase<\n Collections = { [key: string]: RxCollection; },\n Internals = any,\n InstanceCreationOptions = any,\n Reactivity = unknown\n>(\n {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance = true,\n eventReduce = true,\n ignoreDuplicate = false,\n options = {},\n cleanupPolicy,\n allowSlowCount = false,\n localDocuments = false,\n hashFunction = defaultHashSha256,\n reactivity\n }: RxDatabaseCreator\n): Promise<\n RxDatabase\n> {\n runPluginHooks('preCreateRxDatabase', {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n });\n // check if combination already used\n if (!ignoreDuplicate) {\n throwIfDatabaseNameUsed(name, storage);\n }\n USED_DATABASE_NAMES.add(storage.name + '|' + name);\n\n const databaseInstanceToken = randomCouchString(10);\n\n return createRxDatabaseStorageInstance<\n Internals,\n InstanceCreationOptions\n >(\n databaseInstanceToken,\n storage,\n name,\n instanceCreationOptions as any,\n multiInstance,\n password\n )\n /**\n * Creating the internal store might fail\n * if some RxStorage wrapper is used that does some checks\n * and then throw.\n * In that case we have to properly clean up the database.\n */\n .catch(err => {\n USED_DATABASE_NAMES.delete(storage.name + '|' + name);\n throw err;\n })\n .then(storageInstance => {\n const rxDatabase: RxDatabase = new RxDatabaseBase(\n name,\n databaseInstanceToken,\n storage,\n instanceCreationOptions,\n password,\n multiInstance,\n eventReduce,\n options,\n storageInstance,\n hashFunction,\n cleanupPolicy,\n allowSlowCount,\n reactivity\n ) as any;\n\n return runAsyncPluginHooks('createRxDatabase', {\n database: rxDatabase,\n creator: {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n }\n }).then(() => rxDatabase);\n });\n}\n\n/**\n * Removes the database and all its known data\n * with all known collections and all internal meta data.\n *\n * Returns the names of the removed collections.\n */\nexport async function removeRxDatabase(\n databaseName: string,\n storage: RxStorage,\n password?: string\n): Promise {\n const databaseInstanceToken = randomCouchString(10);\n const dbInternalsStorageInstance = await createRxDatabaseStorageInstance(\n databaseInstanceToken,\n storage,\n databaseName,\n {},\n false,\n password\n );\n const collectionDocs = await getAllCollectionDocuments(dbInternalsStorageInstance);\n const collectionNames = new Set();\n collectionDocs.forEach(doc => collectionNames.add(doc.data.name));\n const removedCollectionNames: string[] = Array.from(collectionNames);\n\n await Promise.all(\n removedCollectionNames.map(collectionName => removeCollectionStorages(\n storage,\n dbInternalsStorageInstance,\n databaseInstanceToken,\n databaseName,\n collectionName,\n password\n ))\n );\n\n await runAsyncPluginHooks('postRemoveRxDatabase', {\n databaseName,\n storage\n });\n\n await dbInternalsStorageInstance.remove();\n return removedCollectionNames;\n}\n\nexport function isRxDatabase(obj: any) {\n return obj instanceof RxDatabaseBase;\n}\n\nexport function dbCount(): number {\n return DB_COUNT;\n}\n\n\n/**\n * Returns true if the given RxDatabase was the first\n * instance that was created on the storage with this name.\n *\n * Can be used for some optimizations because on the first instantiation,\n * we can assume that no data was written before.\n */\nexport async function isRxDatabaseFirstTimeInstantiated(\n database: RxDatabase\n): Promise {\n const tokenDoc = await database.storageTokenDocument;\n return tokenDoc.data.instanceToken === database.token;\n}\n\n\n/**\n * For better performance some tasks run async\n * and are awaited later.\n * But we still have to ensure that there have been no errors\n * on database creation.\n */\nexport async function ensureNoStartupErrors(\n rxDatabase: RxDatabaseBase\n) {\n await rxDatabase.storageToken;\n if (rxDatabase.startupErrors[0]) {\n throw rxDatabase.startupErrors[0];\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/rx-error.js b/dist/cjs/rx-error.js index 23767d5f170..1e3b06f699d 100644 --- a/dist/cjs/rx-error.js +++ b/dist/cjs/rx-error.js @@ -75,7 +75,7 @@ var RxError = exports.RxError = /*#__PURE__*/function (_Error) { return false; } }]); -}(/*#__PURE__*/(0, _wrapNativeSuper2.default)(Error)); +}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error)); var RxTypeError = exports.RxTypeError = /*#__PURE__*/function (_TypeError) { // always true, use this to detect if its an rxdb-error @@ -106,7 +106,7 @@ var RxTypeError = exports.RxTypeError = /*#__PURE__*/function (_TypeError) { return true; } }]); -}(/*#__PURE__*/(0, _wrapNativeSuper2.default)(TypeError)); +}( /*#__PURE__*/(0, _wrapNativeSuper2.default)(TypeError)); function getErrorUrl(code) { return 'https://rxdb.info/errors.html?console=errors#' + code; } diff --git a/dist/cjs/rx-error.js.map b/dist/cjs/rx-error.js.map index 73c7bbe721f..b4c433db30f 100644 --- a/dist/cjs/rx-error.js.map +++ b/dist/cjs/rx-error.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-error.js","names":["_overwritable","require","parametersToString","parameters","ret","Object","keys","length","map","k","paramStr","err","JSON","stringify","getOwnPropertyNames","_k","v","undefined","e","join","messageForError","message","code","RxError","exports","_Error","_this","mes","call","url","getErrorUrl","rxdb","_inheritsLoose2","default","_proto","prototype","toString","_createClass2","key","get","_wrapNativeSuper2","Error","RxTypeError","_TypeError","_this2","_proto2","TypeError","errorUrlHint","newRxError","overwritable","tunnelErrorMessage","newRxTypeError","isBulkWriteConflictError","status","STORAGE_WRITE_ERROR_CODE_TO_MESSAGE","rxStorageWriteErrorToRxError","name","document","documentId","writeError"],"sources":["../../src/rx-error.ts"],"sourcesContent":["/**\n * here we use custom errors with the additional field 'parameters'\n */\n\nimport { overwritable } from './overwritable.ts';\nimport type {\n RxErrorParameters,\n RxErrorKey,\n RxStorageWriteError,\n RxStorageWriteErrorConflict\n} from './types/index.d.ts';\n\n/**\n * transform an object of parameters to a presentable string\n */\nfunction parametersToString(parameters: any): string {\n let ret = '';\n if (Object.keys(parameters).length === 0)\n return ret;\n ret += 'Given parameters: {\\n';\n ret += Object.keys(parameters)\n .map(k => {\n let paramStr = '[object Object]';\n try {\n if (k === 'errors') {\n paramStr = parameters[k].map((err: any) => JSON.stringify(err, Object.getOwnPropertyNames(err)));\n } else {\n paramStr = JSON.stringify(parameters[k], function (_k, v) {\n return v === undefined ? null : v;\n }, 2);\n }\n } catch (e) { }\n return k + ':' + paramStr;\n })\n .join('\\n');\n ret += '}';\n return ret;\n}\n\nfunction messageForError(\n message: string,\n code: string,\n parameters: any\n): string {\n return 'RxError (' + code + '):' + '\\n' +\n message + '\\n' +\n parametersToString(parameters);\n}\n\nexport class RxError extends Error {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return false;\n }\n}\n\nexport class RxTypeError extends TypeError {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxTypeError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return true;\n }\n}\n\n\nexport function getErrorUrl(code: RxErrorKey) {\n return 'https://rxdb.info/errors.html?console=errors#' + code;\n}\n\nexport function errorUrlHint(code: RxErrorKey) {\n return '\\n You can find out more about this error here: ' + getErrorUrl(code) + ' ';\n}\n\nexport function newRxError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxError {\n return new RxError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\nexport function newRxTypeError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxTypeError {\n return new RxTypeError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\n\n/**\n * Returns the error if it is a 409 conflict,\n * return false if it is another error.\n */\nexport function isBulkWriteConflictError(\n err?: RxStorageWriteError | any\n): RxStorageWriteErrorConflict | false {\n if (\n err &&\n err.status === 409\n ) {\n return err;\n } else {\n return false;\n }\n}\n\n\nconst STORAGE_WRITE_ERROR_CODE_TO_MESSAGE: { [k: number]: string; } = {\n 409: 'document write conflict',\n 422: 'schema validation error',\n 510: 'attachment data missing'\n};\n\nexport function rxStorageWriteErrorToRxError(err: RxStorageWriteError): RxError {\n return newRxError('COL20', {\n name: STORAGE_WRITE_ERROR_CODE_TO_MESSAGE[err.status],\n document: err.documentId,\n writeError: err\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-error.js","names":["_overwritable","require","parametersToString","parameters","ret","Object","keys","length","map","k","paramStr","err","JSON","stringify","getOwnPropertyNames","_k","v","undefined","e","join","messageForError","message","code","RxError","exports","_Error","_this","mes","call","url","getErrorUrl","rxdb","_inheritsLoose2","default","_proto","prototype","toString","_createClass2","key","get","_wrapNativeSuper2","Error","RxTypeError","_TypeError","_this2","_proto2","TypeError","errorUrlHint","newRxError","overwritable","tunnelErrorMessage","newRxTypeError","isBulkWriteConflictError","status","STORAGE_WRITE_ERROR_CODE_TO_MESSAGE","rxStorageWriteErrorToRxError","name","document","documentId","writeError"],"sources":["../../src/rx-error.ts"],"sourcesContent":["/**\n * here we use custom errors with the additional field 'parameters'\n */\n\nimport { overwritable } from './overwritable.ts';\nimport type {\n RxErrorParameters,\n RxErrorKey,\n RxStorageWriteError,\n RxStorageWriteErrorConflict\n} from './types/index.d.ts';\n\n/**\n * transform an object of parameters to a presentable string\n */\nfunction parametersToString(parameters: any): string {\n let ret = '';\n if (Object.keys(parameters).length === 0)\n return ret;\n ret += 'Given parameters: {\\n';\n ret += Object.keys(parameters)\n .map(k => {\n let paramStr = '[object Object]';\n try {\n if (k === 'errors') {\n paramStr = parameters[k].map((err: any) => JSON.stringify(err, Object.getOwnPropertyNames(err)));\n } else {\n paramStr = JSON.stringify(parameters[k], function (_k, v) {\n return v === undefined ? null : v;\n }, 2);\n }\n } catch (e) { }\n return k + ':' + paramStr;\n })\n .join('\\n');\n ret += '}';\n return ret;\n}\n\nfunction messageForError(\n message: string,\n code: string,\n parameters: any\n): string {\n return 'RxError (' + code + '):' + '\\n' +\n message + '\\n' +\n parametersToString(parameters);\n}\n\nexport class RxError extends Error {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return false;\n }\n}\n\nexport class RxTypeError extends TypeError {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxTypeError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return true;\n }\n}\n\n\nexport function getErrorUrl(code: RxErrorKey) {\n return 'https://rxdb.info/errors.html?console=errors#' + code;\n}\n\nexport function errorUrlHint(code: RxErrorKey) {\n return '\\n You can find out more about this error here: ' + getErrorUrl(code) + ' ';\n}\n\nexport function newRxError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxError {\n return new RxError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\nexport function newRxTypeError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxTypeError {\n return new RxTypeError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\n\n/**\n * Returns the error if it is a 409 conflict,\n * return false if it is another error.\n */\nexport function isBulkWriteConflictError(\n err?: RxStorageWriteError | any\n): RxStorageWriteErrorConflict | false {\n if (\n err &&\n err.status === 409\n ) {\n return err;\n } else {\n return false;\n }\n}\n\n\nconst STORAGE_WRITE_ERROR_CODE_TO_MESSAGE: { [k: number]: string; } = {\n 409: 'document write conflict',\n 422: 'schema validation error',\n 510: 'attachment data missing'\n};\n\nexport function rxStorageWriteErrorToRxError(err: RxStorageWriteError): RxError {\n return newRxError('COL20', {\n name: STORAGE_WRITE_ERROR_CODE_TO_MESSAGE[err.status],\n document: err.documentId,\n writeError: err\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/rx-query.js.map b/dist/cjs/rx-query.js.map index b4339305c46..b3aeaf6ec8c 100644 --- a/dist/cjs/rx-query.js.map +++ b/dist/cjs/rx-query.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-query.js","names":["_rxjs","require","_operators","_index","_rxError","_hooks","_eventReduce","_queryCache","_rxQueryHelper","_rxQuerySingleResult","_queryPlanner","_eventReduceJs","_rxStorageHelper","_queryCount","newQueryID","RESTORE_QUERY_UPDATE_DRIFT","RESTORE_QUERY_MAX_DOCS_CHANGED","RESTORE_QUERY_MAX_TIME_AGO","exports","RxQueryBase","op","mangoQuery","collection","other","id","_execOverDatabaseCount","_creationTime","now","_lastEnsureEqual","uncached","refCount$","BehaviorSubject","_result","_latestChangeEvent","_lastExecStart","_lastExecEnd","_limitBufferSize","_limitBufferResults","_persistentQueryCacheResult","undefined","_persistentQueryCacheResultLwt","_ensureEqualQueue","PROMISE_RESOLVE_FALSE","_getDefaultQuery","isFindOneByIdQuery","schema","primaryPath","_proto","prototype","_setResultData","newResultData","RxQuerySingleResult","Map","Array","from","values","docsDataMap","docsMap","docs","map","docData","_docCache","getCachedRxDocument","docsData","doc","set","primary","_data","length","_execOverDatabase","preparedQuery","getPreparedQuery","result","storageInstance","count","mode","database","allowSlowCount","newRxError","queryObj","ids","ensureNotFalsy","selector","$in","ret","mustBeQueried","forEach","getLatestDocumentDataIfExists","_deleted","push","findDocumentsById","docsPromise","queryCollection","then","exec","throwIfMissing","name","query","_ensureEqual","firstValueFrom","$","toString","stringObj","sortObject","value","JSON","stringify","persistentQueryId","String","hashFunction","hookInput","rxQuery","normalizeMangoQuery","jsonSchema","includesDeleted","$eq","index","unshift","limit","runPluginHooks","prepareQuery","doesDocumentDataMatch","queryMatcher","remove","isArray","Promise","all","incrementalRemove","runQueryUpdateFunction","asRxQuery","update","_updateObj","pluginMissing","patch","incrementalPatch","modify","mutationFunction","incrementalModify","where","_queryObj","sort","_params","skip","_amount","enableLimitBuffer","bufferSize","console","error","enablePersistentQueryCache","backend","_persistentQueryCacheBackend","_persistentQueryCacheLoaded","_restoreQueryCacheFromPersistedState","getItem","log","persistedQueryCacheIds","Set","limitBufferIds","startsWith","add","replace","time","lwt","Number","documents","changedDocs","getChangedDocumentsSince","Math","floor","changedDocIds","d","docIdsWeNeedToFetch","filter","has","otherPotentialMatchingDocs","_queryCollectionByIds","concat","normalizedMangoQuery","sortComparator","getSortComparator","Infinity","lastValidIndex","findLastIndex","slice","unchangedItemsMayNowBeInResults","size","pastLimitItems","finalResults","_changeEventBuffer","counter","timeEnd","_createClass2","default","key","get","_$","results$","pipe","changeEvent","isLocal","startWith","mergeMap","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","distinctUntilChanged","prev","curr","useResult","merge","reactivity","getReactivityFactory","fromObservable","selectorIncludesDeleted","normalizedQuery","overwriteGetterForCaching","getQueryMatcher","tunnelQueryCache","getByQuery","createRxQuery","triggerCacheReplacement","_isResultsInSync","currentLatestEventNumber","getCounter","destroyed","__ensureEqual","mustReExec","missedChangeEvents","getFrom","runChangeEvents","reduceByLastOfDoc","_loop","cE","find","documentId","previousCount","newCount","didMatchBefore","previousDocumentData","doesMatchNow","documentData","eventReduceResult","calculateNewResults","runFullQueryAgain","changed","newResults","areRxDocumentArraysEqual","returnValue","updatePersistentQueryCache","docsKeys","idsToPersist","RX_META_LWT_MINIMUM","setItem","docResults","docIds","docId","Object","mutateableQuery","queryPlan","getQueryPlan","docsFromStorage","appendToArray","fromStorageList","queryResult","splice","keys","r","isRxQuery","obj"],"sources":["../../src/rx-query.ts"],"sourcesContent":["import {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n merge\n} from 'rxjs';\nimport {\n mergeMap,\n filter,\n map,\n startWith,\n distinctUntilChanged,\n shareReplay\n} from 'rxjs/operators';\nimport {\n appendToArray,\n areRxDocumentArraysEqual,\n now,\n overwriteGetterForCaching,\n pluginMissing,\n PROMISE_RESOLVE_FALSE, RX_META_LWT_MINIMUM,\n RXJS_SHARE_REPLAY_DEFAULTS,\n sortObject\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\nimport type {\n MangoQuery,\n PreparedQuery,\n QueryMatcher,\n RxChangeEvent,\n RxCollection,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n FilledMangoQuery,\n ModifyFunction,\n RxDocumentWriteData,\n RxQuery,\n RxQueryOP, MangoQuerySelector, MangoQuerySortPart\n} from './types/index.d.ts';\nimport { calculateNewResults } from './event-reduce.ts';\nimport { triggerCacheReplacement } from './query-cache.ts';\nimport {\n getQueryMatcher,\n getSortComparator,\n normalizeMangoQuery,\n runQueryUpdateFunction,\n selectorIncludesDeleted\n\n} from './rx-query-helper.ts';\nimport { RxQuerySingleResult } from './rx-query-single-result.ts';\nimport { getQueryPlan } from './query-planner.ts';\nimport { ensureNotFalsy } from 'event-reduce-js';\nimport { getChangedDocumentsSince } from './rx-storage-helper.ts';\n\n\nexport interface QueryCacheBackend {\n getItem(key: string): Promise;\n setItem(key: string, value: T): Promise;\n}\n\nlet _queryCount = 0;\nconst newQueryID = function (): number {\n return ++_queryCount;\n};\n\n// allow changes to be 100ms older than the actual lwt value\nconst RESTORE_QUERY_UPDATE_DRIFT = 100;\n\n// 5000 seems like a sane number where re-executing the query will be easier than trying to restore\nconst RESTORE_QUERY_MAX_DOCS_CHANGED = 5000;\n\n// If a query was persisted more than a week ago, just re-execute it\nexport const RESTORE_QUERY_MAX_TIME_AGO = 7 * 24 * 60 * 60 * 1000;\n\nexport class RxQueryBase<\n RxDocType,\n RxQueryResult,\n OrmMethods = {},\n Reactivity = unknown,\n> {\n\n public id: number = newQueryID();\n\n /**\n * Some stats then are used for debugging and cache replacement policies\n */\n public _execOverDatabaseCount: number = 0;\n public _creationTime = now();\n\n // used in the query-cache to determine if the RxQuery can be cleaned up.\n public _lastEnsureEqual = 0;\n\n public uncached = false;\n\n // used to count the subscribers to the query\n public refCount$ = new BehaviorSubject(null);\n\n public isFindOneByIdQuery: false | string | string[];\n\n\n /**\n * Contains the current result state\n * or null if query has not run yet.\n */\n public _result: RxQuerySingleResult | null = null;\n\n\n constructor(\n public op: RxQueryOP,\n public mangoQuery: Readonly>,\n public collection: RxCollection,\n // used by some plugins\n public other: any = {}\n ) {\n if (!mangoQuery) {\n this.mangoQuery = _getDefaultQuery();\n }\n\n this.isFindOneByIdQuery = isFindOneByIdQuery(\n this.collection.schema.primaryPath as string,\n mangoQuery\n );\n }\n get $(): BehaviorSubject {\n if (!this._$) {\n\n const results$ = this.collection.$.pipe(\n /**\n * Performance shortcut.\n * Changes to local documents are not relevant for the query.\n */\n filter(changeEvent => !changeEvent.isLocal),\n /**\n * Start once to ensure the querying also starts\n * when there where no changes.\n */\n startWith(null),\n // ensure query results are up to date.\n mergeMap(() => _ensureEqual(this as any)),\n // use the current result set, written by _ensureEqual().\n map(() => this._result),\n // do not run stuff above for each new subscriber, only once.\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n // do not proceed if result set has not changed.\n distinctUntilChanged((prev, curr) => {\n if (prev && prev.time === ensureNotFalsy(curr).time) {\n return true;\n } else {\n return false;\n }\n }),\n filter(result => !!result),\n /**\n * Map the result set to a single RxDocument or an array,\n * depending on query type\n */\n map((result) => {\n const useResult = ensureNotFalsy(result);\n if (this.op === 'count') {\n return useResult.count;\n } else if (this.op === 'findOne') {\n // findOne()-queries emit RxDocument or null\n return useResult.documents.length === 0 ? null : useResult.documents[0];\n } else if (this.op === 'findByIds') {\n return useResult.docsMap;\n } else {\n // find()-queries emit RxDocument[]\n // Flat copy the array so it won't matter if the user modifies it.\n return useResult.documents.slice(0);\n }\n })\n );\n\n this._$ = merge(\n results$,\n /**\n * Also add the refCount$ to the query observable\n * to allow us to count the amount of subscribers.\n */\n this.refCount$.pipe(\n filter(() => false)\n )\n );\n }\n return this._$ as any;\n }\n\n get $$(): Reactivity {\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n this.$,\n undefined,\n this.collection.database\n ) as any;\n }\n\n get includesDeleted(): boolean {\n return selectorIncludesDeleted(this.mangoQuery.selector);\n }\n\n // stores the changeEvent-number of the last handled change-event\n public _latestChangeEvent: -1 | number = -1;\n\n // time stamps on when the last full exec over the database has run\n // used to properly handle events that happen while the find-query is running\n public _lastExecStart: number = 0;\n public _lastExecEnd: number = 0;\n\n // Fields used for the Limit Buffer when enabled:\n public _limitBufferSize: number | null = null;\n public _limitBufferResults: RxDocumentData[] | null = null;\n\n // Fields used for the persistent query cache when enabled:\n public _persistentQueryCacheResult?: string[] | string = undefined;\n public _persistentQueryCacheResultLwt?: string = undefined; // lwt = latest write time\n public _persistentQueryCacheLoaded?: Promise;\n public _persistentQueryCacheBackend?: QueryCacheBackend;\n\n /**\n * ensures that the exec-runs\n * are not run in parallel\n */\n public _ensureEqualQueue: Promise = PROMISE_RESOLVE_FALSE;\n\n /**\n * Returns an observable that emits the results\n * This should behave like an rxjs-BehaviorSubject which means:\n * - Emit the current result-set on subscribe\n * - Emit the new result-set when an RxChangeEvent comes in\n * - Do not emit anything before the first result-set was created (no null)\n */\n public _$?: Observable;\n\n /**\n * set the new result-data as result-docs of the query\n * @param newResultData json-docs that were received from the storage\n */\n _setResultData(newResultData: RxDocumentData[] | number | Map>): void {\n if (typeof newResultData === 'number') {\n this._result = new RxQuerySingleResult(\n this.collection,\n [],\n newResultData\n );\n return;\n } else if (newResultData instanceof Map) {\n newResultData = Array.from((newResultData as Map>).values());\n }\n\n const docsDataMap = new Map();\n const docsMap = new Map();\n\n\n const docs = newResultData.map(docData => this.collection._docCache.getCachedRxDocument(docData));\n\n /**\n * Instead of using the newResultData in the result cache,\n * we directly use the objects that are stored in the RxDocument\n * to ensure we do not store the same data twice and fill up the memory.\n */\n const docsData = docs.map(doc => {\n docsDataMap.set(doc.primary, doc._data);\n docsMap.set(doc.primary, doc);\n return doc._data;\n });\n\n this._result = new RxQuerySingleResult(this.collection, docsData, docsData.length);\n }\n\n /**\n * executes the query on the database\n * @return results-array with document-data\n */\n async _execOverDatabase(): Promise[] | number> {\n this._execOverDatabaseCount = this._execOverDatabaseCount + 1;\n this._lastExecStart = now();\n\n\n if (this.op === 'count') {\n const preparedQuery = this.getPreparedQuery();\n const result = await this.collection.storageInstance.count(preparedQuery);\n if (result.mode === 'slow' && !this.collection.database.allowSlowCount) {\n throw newRxError('QU14', {\n collection: this.collection,\n queryObj: this.mangoQuery\n });\n } else {\n return result.count;\n }\n }\n\n if (this.op === 'findByIds') {\n const ids: string[] = ensureNotFalsy(this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\n const ret = new Map>();\n const mustBeQueried: string[] = [];\n // first try to fill from docCache\n ids.forEach(id => {\n const docData = this.collection._docCache.getLatestDocumentDataIfExists(id);\n if (docData) {\n if (!docData._deleted) {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(id, doc);\n }\n } else {\n mustBeQueried.push(id);\n }\n });\n // everything which was not in docCache must be fetched from the storage\n if (mustBeQueried.length > 0) {\n const docs = await this.collection.storageInstance.findDocumentsById(mustBeQueried, false);\n docs.forEach(docData => {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(doc.primary, doc);\n });\n }\n return ret as any;\n }\n\n\n const docsPromise = queryCollection(this as any);\n return docsPromise.then(docs => {\n this._lastExecEnd = now();\n return docs;\n });\n }\n\n /**\n * Execute the query\n * To have an easier implementations,\n * just subscribe and use the first result\n */\n public exec(throwIfMissing: true): Promise>;\n public exec(): Promise;\n public exec(throwIfMissing?: boolean): Promise {\n if (throwIfMissing && this.op !== 'findOne') {\n throw newRxError('QU9', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n }\n\n\n /**\n * run _ensureEqual() here,\n * this will make sure that errors in the query which throw inside of the RxStorage,\n * will be thrown at this execution context and not in the background.\n */\n return _ensureEqual(this as any)\n .then(() => firstValueFrom(this.$))\n .then(result => {\n if (!result && throwIfMissing) {\n throw newRxError('QU10', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n } else {\n return result;\n }\n });\n }\n\n\n\n /**\n * cached call to get the queryMatcher\n * @overwrites itself with the actual value\n */\n get queryMatcher(): QueryMatcher> {\n const schema = this.collection.schema.jsonSchema;\n const normalizedQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n return overwriteGetterForCaching(\n this,\n 'queryMatcher',\n getQueryMatcher(\n schema,\n normalizedQuery\n ) as any\n );\n }\n\n /**\n * returns a string that is used for equal-comparisons\n * @overwrites itself with the actual value\n */\n toString(): string {\n const stringObj = sortObject({\n op: this.op,\n query: this.mangoQuery,\n other: this.other\n }, true);\n const value = JSON.stringify(stringObj);\n this.toString = () => value;\n return value;\n }\n\n persistentQueryId() {\n return String(this.collection.database.hashFunction(this.toString()));\n }\n\n /**\n * returns the prepared query\n * which can be send to the storage instance to query for documents.\n * @overwrites itself with the actual value.\n */\n getPreparedQuery(): PreparedQuery {\n const hookInput = {\n rxQuery: this,\n // can be mutated by the hooks so we have to deep clone first.\n mangoQuery: normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n )\n };\n\n // Set _deleted to false if not explicitly set in selector\n if (!this.includesDeleted) {\n hookInput.mangoQuery.selector = {\n ...hookInput.mangoQuery.selector,\n _deleted: { $eq: false },\n };\n }\n\n if (hookInput.mangoQuery.index) {\n hookInput.mangoQuery.index.unshift('_deleted');\n }\n\n if (this._limitBufferSize !== null && hookInput.mangoQuery.limit) {\n hookInput.mangoQuery.limit = hookInput.mangoQuery.limit + this._limitBufferSize;\n }\n\n runPluginHooks('prePrepareQuery', hookInput);\n\n const value = prepareQuery(\n this.collection.schema.jsonSchema,\n hookInput.mangoQuery as any\n );\n\n this.getPreparedQuery = () => value;\n return value;\n }\n\n /**\n * returns true if the document matches the query,\n * does not use the 'skip' and 'limit'\n */\n doesDocumentDataMatch(docData: RxDocType | any): boolean {\n // if doc is deleted, it cannot match\n if (docData._deleted) {\n return false;\n }\n\n return this.queryMatcher(docData);\n }\n\n /**\n * deletes all found documents\n * @return promise with deleted documents\n */\n remove(): Promise {\n return this\n .exec()\n .then(docs => {\n if (Array.isArray(docs)) {\n // TODO use a bulk operation instead of running .remove() on each document\n return Promise.all(docs.map(doc => doc.remove()));\n } else {\n return (docs as any).remove();\n }\n });\n }\n incrementalRemove(): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalRemove(),\n );\n }\n\n\n /**\n * helper function to transform RxQueryBase to RxQuery type\n */\n get asRxQuery(): RxQuery {\n return this as any;\n }\n\n /**\n * updates all found documents\n * @overwritten by plugin (optional)\n */\n update(_updateObj: any): Promise {\n throw pluginMissing('update');\n }\n\n patch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.patch(patch),\n );\n }\n incrementalPatch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalPatch(patch),\n );\n }\n modify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.modify(mutationFunction),\n );\n }\n incrementalModify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalModify(mutationFunction),\n );\n }\n\n\n // we only set some methods of query-builder here\n // because the others depend on these ones\n where(_queryObj: MangoQuerySelector | keyof RxDocType | string): RxQuery {\n throw pluginMissing('query-builder');\n }\n sort(_params: string | MangoQuerySortPart): RxQuery {\n throw pluginMissing('query-builder');\n }\n skip(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n limit(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n\n enableLimitBuffer(bufferSize: number) {\n if (this._limitBufferSize !== null) {\n // Limit buffer has already been enabled, do nothing:\n return this;\n }\n if (this._lastExecStart !== 0) {\n console.error('Can\\'t use limit buffer if query has already executed');\n return this;\n }\n if (this.mangoQuery.skip || !this.mangoQuery.limit) {\n console.error('Right now, limit buffer only works on non-skip, limit queries.');\n return this;\n }\n this._limitBufferSize = bufferSize;\n return this;\n }\n\n enablePersistentQueryCache(backend: QueryCacheBackend) {\n if (this._persistentQueryCacheBackend) {\n // We've already tried to enable the query cache\n return this;\n }\n this._persistentQueryCacheBackend = backend;\n this._persistentQueryCacheLoaded = this._restoreQueryCacheFromPersistedState();\n return this;\n }\n\n private async _restoreQueryCacheFromPersistedState() {\n if (!this._persistentQueryCacheBackend) {\n // no cache backend provided, do nothing\n return;\n }\n if (this._persistentQueryCacheResult) {\n // we already restored the cache once, no need to run twice\n return;\n }\n if (this.mangoQuery.skip || this.op === 'count') {\n console.error('The persistent query cache only works on non-skip, non-count queries.');\n return;\n }\n\n // First, check if there are any query results persisted:\n const persistentQueryId = this.persistentQueryId();\n const value = await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}`);\n if (!value || !Array.isArray(value) || value.length === 0) {\n // eslint-disable-next-line no-console\n console.log(`no persistent query cache found in the backend, returning early ${this.toString()}`);\n return;\n }\n\n // If there are persisted ids, create our two Sets of ids from the cache:\n const persistedQueryCacheIds = new Set();\n const limitBufferIds = new Set();\n\n for (const id of value) {\n if (id.startsWith('lb-')) {\n limitBufferIds.add(id.replace('lb-', ''));\n } else {\n persistedQueryCacheIds.add(id);\n }\n }\n\n // eslint-disable-next-line no-console\n console.time(`Restoring persistent querycache ${this.toString()}`);\n\n // Next, pull the lwt from the cache:\n // TODO: if lwt is too old, should we just give up here? What if there are too many changedDocs?\n const lwt = (await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}:lwt`)) as string | null;\n if (!lwt) {\n return;\n }\n\n // If the query was persisted too long ago, just re-execute it.\n if (now() - Number(lwt) > RESTORE_QUERY_MAX_TIME_AGO) {\n return;\n }\n\n const primaryPath = this.collection.schema.primaryPath;\n\n const {documents: changedDocs} = await getChangedDocumentsSince(this.collection.storageInstance,\n RESTORE_QUERY_MAX_DOCS_CHANGED,\n // make sure we remove the monotonic clock (xxx.01, xxx.02) from the lwt timestamp to avoid issues with\n // lookups in indices (dexie)\n {id: '', lwt: Math.floor(Number(lwt)) - RESTORE_QUERY_UPDATE_DRIFT}\n );\n\n // If too many docs have changed, just give up and re-execute the query\n if (changedDocs.length === RESTORE_QUERY_MAX_DOCS_CHANGED) {\n return;\n }\n\n const changedDocIds = new Set(changedDocs.map((d) => d[primaryPath] as string));\n\n const docIdsWeNeedToFetch = [...persistedQueryCacheIds, ...limitBufferIds].filter((id) => !changedDocIds.has(id));\n\n // We use _queryCollectionByIds to fetch the remaining docs we need efficiently, pulling\n // from query cache if we can (and the storageInstance by ids if we can't):\n const otherPotentialMatchingDocs: RxDocumentData[] = [];\n await _queryCollectionByIds(this as any, otherPotentialMatchingDocs, docIdsWeNeedToFetch);\n\n // Now that we have all potential documents, we just filter (in-memory) the ones that still match our query:\n let docsData: RxDocumentData[] = [];\n for (const doc of changedDocs.concat(otherPotentialMatchingDocs)) {\n if (this.doesDocumentDataMatch(doc)) {\n docsData.push(doc);\n }\n }\n\n // Sort the documents by the query's sort field:\n const normalizedMangoQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n const sortComparator = getSortComparator(this.collection.schema.jsonSchema, normalizedMangoQuery);\n const limit = normalizedMangoQuery.limit ? normalizedMangoQuery.limit : Infinity;\n docsData = docsData.sort(sortComparator);\n\n // We know for sure that all persisted and limit buffer ids (and changed docs before them) are in the correct\n // result set. And we can't be sure about any past that point. So cut it off there:\n const lastValidIndex = docsData.findLastIndex((d) => limitBufferIds.has(d[primaryPath] as string) || persistedQueryCacheIds.has(d[primaryPath] as string));\n docsData = docsData.slice(0, lastValidIndex + 1);\n\n // Now this is the trickiest part.\n // If we somehow have fewer docs than the limit of our query\n // (and this wasn't the case because before persistence)\n // then there is no way for us to know the correct results, and we re-exec:\n const unchangedItemsMayNowBeInResults = (\n this.mangoQuery.limit &&\n docsData.length < this.mangoQuery.limit &&\n persistedQueryCacheIds.size >= this.mangoQuery.limit\n );\n if (unchangedItemsMayNowBeInResults) {\n return;\n }\n\n // Our finalResults are the actual results of this query, and pastLimitItems are any remaining matching\n // documents we have left over (past the limit).\n const pastLimitItems = docsData.slice(limit);\n const finalResults = docsData.slice(0, limit);\n\n // If there are still items past the first LIMIT items, try to restore the limit buffer with them:\n if (limitBufferIds.size && pastLimitItems.length > 0) {\n this._limitBufferResults = pastLimitItems;\n } else {\n this._limitBufferResults = [];\n }\n\n // Finally, set the query's results to what we've pulled from disk:\n this._lastEnsureEqual = now();\n this._latestChangeEvent = this.collection._changeEventBuffer.counter;\n this._setResultData(finalResults);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Restoring persistent querycache ${this.toString()}`);\n }\n}\n\nexport function _getDefaultQuery(): MangoQuery {\n return {\n selector: {}\n };\n}\n\n/**\n * run this query through the QueryCache\n */\nexport function tunnelQueryCache(\n rxQuery: RxQueryBase\n): RxQuery {\n return rxQuery.collection._queryCache.getByQuery(rxQuery as any);\n}\n\nexport function createRxQuery(\n op: RxQueryOP,\n queryObj: MangoQuery,\n collection: RxCollection,\n other?: any\n) {\n runPluginHooks('preCreateRxQuery', {\n op,\n queryObj,\n collection,\n other\n });\n\n let ret = new RxQueryBase(op, queryObj, collection, other);\n\n // ensure when created with same params, only one is created\n ret = tunnelQueryCache(ret);\n // TODO: clear persistent query cache as well\n triggerCacheReplacement(collection);\n\n return ret;\n}\n\n/**\n * Check if the current results-state is in sync with the database\n * which means that no write event happened since the last run.\n * @return false if not which means it should re-execute\n */\nfunction _isResultsInSync(rxQuery: RxQueryBase): boolean {\n const currentLatestEventNumber = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n if (rxQuery._latestChangeEvent >= currentLatestEventNumber) {\n return true;\n } else {\n return false;\n }\n}\n\n\n/**\n * wraps __ensureEqual()\n * to ensure it does not run in parallel\n * @return true if has changed, false if not\n */\nfunction _ensureEqual(rxQuery: RxQueryBase): Promise {\n // Optimisation shortcut\n if (\n rxQuery.collection.database.destroyed ||\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\n .then(() => __ensureEqual(rxQuery));\n return rxQuery._ensureEqualQueue;\n}\n\n\n/**\n * ensures that the results of this query is equal to the results which a query over the database would give\n * @return true if results have changed\n */\nasync function __ensureEqual(rxQuery: RxQueryBase): Promise {\n await rxQuery._persistentQueryCacheLoaded;\n\n rxQuery._lastEnsureEqual = now();\n\n /**\n * Optimisation shortcuts\n */\n if (\n // db is closed\n rxQuery.collection.database.destroyed ||\n // nothing happened since last run\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n let ret = false;\n let mustReExec = false; // if this becomes true, a whole execution over the database is made\n if (rxQuery._latestChangeEvent === -1) {\n // have not executed yet -> must run\n mustReExec = true;\n }\n\n /**\n * try to use EventReduce to calculate the new results\n */\n if (!mustReExec) {\n const missedChangeEvents = rxQuery.asRxQuery.collection._changeEventBuffer.getFrom(rxQuery._latestChangeEvent + 1);\n if (missedChangeEvents === null) {\n // changeEventBuffer is of bounds -> we must re-execute over the database\n mustReExec = true;\n } else {\n rxQuery._latestChangeEvent = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n\n const runChangeEvents: RxChangeEvent[] = rxQuery.asRxQuery.collection\n ._changeEventBuffer\n .reduceByLastOfDoc(missedChangeEvents);\n\n if (rxQuery._limitBufferResults !== null) {\n // Check if any item in our limit buffer was modified by a change event\n for (const cE of runChangeEvents) {\n if (rxQuery._limitBufferResults.find((doc) => doc[rxQuery.collection.schema.primaryPath] === cE.documentId)) {\n // If so, the limit buffer is potential invalid -- let's just blow it up\n // TODO: could we instead update the documents in the limit buffer?\n rxQuery._limitBufferResults = null;\n break;\n }\n }\n }\n\n if (rxQuery.includesDeleted) {\n return rxQuery._execOverDatabase().then((newResultData) => {\n rxQuery._setResultData(newResultData);\n return true;\n });\n } else if (rxQuery.op === 'count') {\n // 'count' query\n const previousCount = ensureNotFalsy(rxQuery._result).count;\n let newCount = previousCount;\n runChangeEvents.forEach(cE => {\n const didMatchBefore = cE.previousDocumentData && rxQuery.doesDocumentDataMatch(cE.previousDocumentData);\n const doesMatchNow = rxQuery.doesDocumentDataMatch(cE.documentData);\n\n if (!didMatchBefore && doesMatchNow) {\n newCount++;\n }\n if (didMatchBefore && !doesMatchNow) {\n newCount--;\n }\n });\n if (newCount !== previousCount) {\n ret = true; // true because results changed\n rxQuery._setResultData(newCount as any);\n }\n } else {\n // 'find' or 'findOne' query\n const eventReduceResult = calculateNewResults(\n rxQuery as any,\n runChangeEvents\n );\n if (eventReduceResult.runFullQueryAgain) {\n // could not calculate the new results, execute must be done\n mustReExec = true;\n } else if (eventReduceResult.changed) {\n // we got the new results, we do not have to re-execute, mustReExec stays false\n ret = true; // true because results changed\n rxQuery._setResultData(eventReduceResult.newResults as any);\n }\n }\n }\n }\n\n // oh no we have to re-execute the whole query over the database\n if (mustReExec) {\n return rxQuery._execOverDatabase()\n .then(newResultData => {\n\n /**\n * The RxStorage is defined to always first emit events and then return\n * on bulkWrite() calls. So here we have to use the counter AFTER the execOverDatabase()\n * has been run, not the one from before.\n */\n rxQuery._latestChangeEvent = rxQuery.collection._changeEventBuffer.getCounter();\n\n // A count query needs a different has-changed check.\n if (typeof newResultData === 'number') {\n if (\n !rxQuery._result ||\n newResultData !== rxQuery._result.count\n ) {\n ret = true;\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n }\n if (\n !rxQuery._result ||\n !areRxDocumentArraysEqual(\n rxQuery.collection.schema.primaryPath,\n newResultData,\n rxQuery._result.docsData\n )\n ) {\n ret = true; // true because results changed\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n })\n .then(async (returnValue) => {\n await updatePersistentQueryCache(rxQuery);\n return returnValue;\n });\n }\n\n return ret; // true if results have changed\n}\n\n\nasync function updatePersistentQueryCache(rxQuery: RxQueryBase) {\n if (!rxQuery._persistentQueryCacheBackend) {\n return;\n }\n\n const backend = rxQuery._persistentQueryCacheBackend;\n\n const key = rxQuery.persistentQueryId();\n\n // update _persistedQueryCacheResult\n rxQuery._persistentQueryCacheResult = rxQuery._result?.docsKeys ?? [];\n\n const idsToPersist = [...rxQuery._persistentQueryCacheResult];\n if (rxQuery._limitBufferResults) {\n rxQuery._limitBufferResults.forEach((d) => {\n idsToPersist.push(`lb-${d[rxQuery.collection.schema.primaryPath]}`);\n });\n }\n // eslint-disable-next-line no-console\n console.time(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n // persist query cache\n const lwt = rxQuery._result?.time ?? RX_META_LWT_MINIMUM;\n\n await Promise.all([\n backend.setItem(`qc:${String(key)}`, idsToPersist),\n backend.setItem(`qc:${String(key)}:lwt`, lwt.toString()),\n ]);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n}\n\n\n// Refactored out of `queryCollection`: modifies the docResults array to fill it with data\nasync function _queryCollectionByIds(rxQuery: RxQuery | RxQueryBase, docResults: RxDocumentData[], docIds: string[]) {\n const collection = rxQuery.collection;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docResults.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsMap = await collection.storageInstance.findDocumentsById(docIds, false);\n Object.values(docsMap).forEach(docData => {\n docResults.push(docData);\n });\n }\n}\n\n/**\n * @returns a format of the query that can be used with the storage\n * when calling RxStorageInstance().query()\n */\nexport function prepareQuery(\n schema: RxJsonSchema>,\n mutateableQuery: FilledMangoQuery\n): PreparedQuery {\n if (!mutateableQuery.sort) {\n throw newRxError('SNH', {\n query: mutateableQuery\n });\n }\n\n /**\n * Store the query plan together with the\n * prepared query to save performance.\n */\n const queryPlan = getQueryPlan(\n schema,\n mutateableQuery\n );\n\n return {\n query: mutateableQuery,\n queryPlan\n };\n}\n\n/**\n * Runs the query over the storage instance\n * of the collection.\n * Does some optimizations to ensure findById is used\n * when specific queries are used.\n */\nexport async function queryCollection(\n rxQuery: RxQuery | RxQueryBase\n): Promise[]> {\n await rxQuery._persistentQueryCacheLoaded;\n\n let docs: RxDocumentData[] = [];\n const collection = rxQuery.collection;\n\n /**\n * Optimizations shortcut.\n * If query is find-one-document-by-id,\n * then we do not have to use the slow query() method\n * but instead can use findDocumentsById()\n */\n if (rxQuery.isFindOneByIdQuery) {\n if (Array.isArray(rxQuery.isFindOneByIdQuery)) {\n let docIds = rxQuery.isFindOneByIdQuery;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docs.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsFromStorage = await collection.storageInstance.findDocumentsById(docIds, false);\n appendToArray(docs, docsFromStorage);\n }\n await _queryCollectionByIds(rxQuery, docs, rxQuery.isFindOneByIdQuery);\n } else {\n const docId = rxQuery.isFindOneByIdQuery;\n\n // first try to fill from docCache\n let docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (!docData) {\n // otherwise get from storage\n const fromStorageList = await collection.storageInstance.findDocumentsById([docId], false);\n if (fromStorageList[0]) {\n docData = fromStorageList[0];\n }\n }\n if (docData && !docData._deleted) {\n docs.push(docData);\n }\n }\n } else {\n const preparedQuery = rxQuery.getPreparedQuery();\n const queryResult = await collection.storageInstance.query(preparedQuery);\n if (rxQuery._limitBufferSize !== null && rxQuery.mangoQuery.limit && queryResult.documents.length > rxQuery.mangoQuery.limit) {\n // If there are more than query.limit results, we pull out our buffer items from the\n // last rxQuery._limitBufferSize items of the results.\n rxQuery._limitBufferResults = queryResult.documents.splice(rxQuery.mangoQuery.limit);\n }\n docs = queryResult.documents;\n }\n return docs;\n}\n\n/**\n * Returns true if the given query\n * selects exactly one document by its id.\n * Used to optimize performance because these kind of\n * queries do not have to run over an index and can use get-by-id instead.\n * Returns false if no query of that kind.\n * Returns the document id otherwise.\n */\nexport function isFindOneByIdQuery(\n primaryPath: string,\n query: MangoQuery\n): false | string | string[] {\n // must have exactly one operator which must be $eq || $in\n if (\n !query.skip &&\n query.selector &&\n Object.keys(query.selector).length === 1 &&\n query.selector[primaryPath]\n ) {\n const value: any = query.selector[primaryPath];\n if (typeof value === 'string') {\n return value;\n } else if (\n Object.keys(value).length === 1 &&\n typeof value.$eq === 'string'\n ) {\n return value.$eq;\n }\n\n // same with $in string arrays\n if (\n Object.keys(value).length === 1 &&\n Array.isArray(value.$eq) &&\n // must only contain strings\n !(value.$eq as any[]).find(r => typeof r !== 'string')\n ) {\n return value.$eq;\n }\n }\n return false;\n}\n\n\nexport function isRxQuery(obj: any): boolean {\n return obj instanceof RxQueryBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-query.js","names":["_rxjs","require","_operators","_index","_rxError","_hooks","_eventReduce","_queryCache","_rxQueryHelper","_rxQuerySingleResult","_queryPlanner","_eventReduceJs","_rxStorageHelper","_queryCount","newQueryID","RESTORE_QUERY_UPDATE_DRIFT","RESTORE_QUERY_MAX_DOCS_CHANGED","RESTORE_QUERY_MAX_TIME_AGO","exports","RxQueryBase","op","mangoQuery","collection","other","id","_execOverDatabaseCount","_creationTime","now","_lastEnsureEqual","uncached","refCount$","BehaviorSubject","_result","_latestChangeEvent","_lastExecStart","_lastExecEnd","_limitBufferSize","_limitBufferResults","_persistentQueryCacheResult","undefined","_persistentQueryCacheResultLwt","_ensureEqualQueue","PROMISE_RESOLVE_FALSE","_getDefaultQuery","isFindOneByIdQuery","schema","primaryPath","_proto","prototype","_setResultData","newResultData","RxQuerySingleResult","Map","Array","from","values","docsDataMap","docsMap","docs","map","docData","_docCache","getCachedRxDocument","docsData","doc","set","primary","_data","length","_execOverDatabase","preparedQuery","getPreparedQuery","result","storageInstance","count","mode","database","allowSlowCount","newRxError","queryObj","ids","ensureNotFalsy","selector","$in","ret","mustBeQueried","forEach","getLatestDocumentDataIfExists","_deleted","push","findDocumentsById","docsPromise","queryCollection","then","exec","throwIfMissing","name","query","_ensureEqual","firstValueFrom","$","toString","stringObj","sortObject","value","JSON","stringify","persistentQueryId","String","hashFunction","hookInput","rxQuery","normalizeMangoQuery","jsonSchema","includesDeleted","$eq","index","unshift","limit","runPluginHooks","prepareQuery","doesDocumentDataMatch","queryMatcher","remove","isArray","Promise","all","incrementalRemove","runQueryUpdateFunction","asRxQuery","update","_updateObj","pluginMissing","patch","incrementalPatch","modify","mutationFunction","incrementalModify","where","_queryObj","sort","_params","skip","_amount","enableLimitBuffer","bufferSize","console","error","enablePersistentQueryCache","backend","_persistentQueryCacheBackend","_persistentQueryCacheLoaded","_restoreQueryCacheFromPersistedState","getItem","log","persistedQueryCacheIds","Set","limitBufferIds","startsWith","add","replace","time","lwt","Number","documents","changedDocs","getChangedDocumentsSince","Math","floor","changedDocIds","d","docIdsWeNeedToFetch","filter","has","otherPotentialMatchingDocs","_queryCollectionByIds","concat","normalizedMangoQuery","sortComparator","getSortComparator","Infinity","lastValidIndex","findLastIndex","slice","unchangedItemsMayNowBeInResults","size","pastLimitItems","finalResults","_changeEventBuffer","counter","timeEnd","_createClass2","default","key","get","_$","results$","pipe","changeEvent","isLocal","startWith","mergeMap","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","distinctUntilChanged","prev","curr","useResult","merge","reactivity","getReactivityFactory","fromObservable","selectorIncludesDeleted","normalizedQuery","overwriteGetterForCaching","getQueryMatcher","tunnelQueryCache","getByQuery","createRxQuery","triggerCacheReplacement","_isResultsInSync","currentLatestEventNumber","getCounter","destroyed","__ensureEqual","mustReExec","missedChangeEvents","getFrom","runChangeEvents","reduceByLastOfDoc","_loop","cE","find","documentId","previousCount","newCount","didMatchBefore","previousDocumentData","doesMatchNow","documentData","eventReduceResult","calculateNewResults","runFullQueryAgain","changed","newResults","areRxDocumentArraysEqual","returnValue","updatePersistentQueryCache","docsKeys","idsToPersist","RX_META_LWT_MINIMUM","setItem","docResults","docIds","docId","Object","mutateableQuery","queryPlan","getQueryPlan","docsFromStorage","appendToArray","fromStorageList","queryResult","splice","keys","r","isRxQuery","obj"],"sources":["../../src/rx-query.ts"],"sourcesContent":["import {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n merge\n} from 'rxjs';\nimport {\n mergeMap,\n filter,\n map,\n startWith,\n distinctUntilChanged,\n shareReplay\n} from 'rxjs/operators';\nimport {\n appendToArray,\n areRxDocumentArraysEqual,\n now,\n overwriteGetterForCaching,\n pluginMissing,\n PROMISE_RESOLVE_FALSE, RX_META_LWT_MINIMUM,\n RXJS_SHARE_REPLAY_DEFAULTS,\n sortObject\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\nimport type {\n MangoQuery,\n PreparedQuery,\n QueryMatcher,\n RxChangeEvent,\n RxCollection,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n FilledMangoQuery,\n ModifyFunction,\n RxDocumentWriteData,\n RxQuery,\n RxQueryOP, MangoQuerySelector, MangoQuerySortPart\n} from './types/index.d.ts';\nimport { calculateNewResults } from './event-reduce.ts';\nimport { triggerCacheReplacement } from './query-cache.ts';\nimport {\n getQueryMatcher,\n getSortComparator,\n normalizeMangoQuery,\n runQueryUpdateFunction,\n selectorIncludesDeleted\n\n} from './rx-query-helper.ts';\nimport { RxQuerySingleResult } from './rx-query-single-result.ts';\nimport { getQueryPlan } from './query-planner.ts';\nimport { ensureNotFalsy } from 'event-reduce-js';\nimport { getChangedDocumentsSince } from './rx-storage-helper.ts';\n\n\nexport interface QueryCacheBackend {\n getItem(key: string): Promise;\n setItem(key: string, value: T): Promise;\n}\n\nlet _queryCount = 0;\nconst newQueryID = function (): number {\n return ++_queryCount;\n};\n\n// allow changes to be 100ms older than the actual lwt value\nconst RESTORE_QUERY_UPDATE_DRIFT = 100;\n\n// 5000 seems like a sane number where re-executing the query will be easier than trying to restore\nconst RESTORE_QUERY_MAX_DOCS_CHANGED = 5000;\n\n// If a query was persisted more than a week ago, just re-execute it\nexport const RESTORE_QUERY_MAX_TIME_AGO = 7 * 24 * 60 * 60 * 1000;\n\nexport class RxQueryBase<\n RxDocType,\n RxQueryResult,\n OrmMethods = {},\n Reactivity = unknown,\n> {\n\n public id: number = newQueryID();\n\n /**\n * Some stats then are used for debugging and cache replacement policies\n */\n public _execOverDatabaseCount: number = 0;\n public _creationTime = now();\n\n // used in the query-cache to determine if the RxQuery can be cleaned up.\n public _lastEnsureEqual = 0;\n\n public uncached = false;\n\n // used to count the subscribers to the query\n public refCount$ = new BehaviorSubject(null);\n\n public isFindOneByIdQuery: false | string | string[];\n\n\n /**\n * Contains the current result state\n * or null if query has not run yet.\n */\n public _result: RxQuerySingleResult | null = null;\n\n\n constructor(\n public op: RxQueryOP,\n public mangoQuery: Readonly>,\n public collection: RxCollection,\n // used by some plugins\n public other: any = {}\n ) {\n if (!mangoQuery) {\n this.mangoQuery = _getDefaultQuery();\n }\n\n this.isFindOneByIdQuery = isFindOneByIdQuery(\n this.collection.schema.primaryPath as string,\n mangoQuery\n );\n }\n get $(): BehaviorSubject {\n if (!this._$) {\n\n const results$ = this.collection.$.pipe(\n /**\n * Performance shortcut.\n * Changes to local documents are not relevant for the query.\n */\n filter(changeEvent => !changeEvent.isLocal),\n /**\n * Start once to ensure the querying also starts\n * when there where no changes.\n */\n startWith(null),\n // ensure query results are up to date.\n mergeMap(() => _ensureEqual(this as any)),\n // use the current result set, written by _ensureEqual().\n map(() => this._result),\n // do not run stuff above for each new subscriber, only once.\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n // do not proceed if result set has not changed.\n distinctUntilChanged((prev, curr) => {\n if (prev && prev.time === ensureNotFalsy(curr).time) {\n return true;\n } else {\n return false;\n }\n }),\n filter(result => !!result),\n /**\n * Map the result set to a single RxDocument or an array,\n * depending on query type\n */\n map((result) => {\n const useResult = ensureNotFalsy(result);\n if (this.op === 'count') {\n return useResult.count;\n } else if (this.op === 'findOne') {\n // findOne()-queries emit RxDocument or null\n return useResult.documents.length === 0 ? null : useResult.documents[0];\n } else if (this.op === 'findByIds') {\n return useResult.docsMap;\n } else {\n // find()-queries emit RxDocument[]\n // Flat copy the array so it won't matter if the user modifies it.\n return useResult.documents.slice(0);\n }\n })\n );\n\n this._$ = merge(\n results$,\n /**\n * Also add the refCount$ to the query observable\n * to allow us to count the amount of subscribers.\n */\n this.refCount$.pipe(\n filter(() => false)\n )\n );\n }\n return this._$ as any;\n }\n\n get $$(): Reactivity {\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n this.$,\n undefined,\n this.collection.database\n ) as any;\n }\n\n get includesDeleted(): boolean {\n return selectorIncludesDeleted(this.mangoQuery.selector);\n }\n\n // stores the changeEvent-number of the last handled change-event\n public _latestChangeEvent: -1 | number = -1;\n\n // time stamps on when the last full exec over the database has run\n // used to properly handle events that happen while the find-query is running\n public _lastExecStart: number = 0;\n public _lastExecEnd: number = 0;\n\n // Fields used for the Limit Buffer when enabled:\n public _limitBufferSize: number | null = null;\n public _limitBufferResults: RxDocumentData[] | null = null;\n\n // Fields used for the persistent query cache when enabled:\n public _persistentQueryCacheResult?: string[] | string = undefined;\n public _persistentQueryCacheResultLwt?: string = undefined; // lwt = latest write time\n public _persistentQueryCacheLoaded?: Promise;\n public _persistentQueryCacheBackend?: QueryCacheBackend;\n\n /**\n * ensures that the exec-runs\n * are not run in parallel\n */\n public _ensureEqualQueue: Promise = PROMISE_RESOLVE_FALSE;\n\n /**\n * Returns an observable that emits the results\n * This should behave like an rxjs-BehaviorSubject which means:\n * - Emit the current result-set on subscribe\n * - Emit the new result-set when an RxChangeEvent comes in\n * - Do not emit anything before the first result-set was created (no null)\n */\n public _$?: Observable;\n\n /**\n * set the new result-data as result-docs of the query\n * @param newResultData json-docs that were received from the storage\n */\n _setResultData(newResultData: RxDocumentData[] | number | Map>): void {\n if (typeof newResultData === 'number') {\n this._result = new RxQuerySingleResult(\n this.collection,\n [],\n newResultData\n );\n return;\n } else if (newResultData instanceof Map) {\n newResultData = Array.from((newResultData as Map>).values());\n }\n\n const docsDataMap = new Map();\n const docsMap = new Map();\n\n\n const docs = newResultData.map(docData => this.collection._docCache.getCachedRxDocument(docData));\n\n /**\n * Instead of using the newResultData in the result cache,\n * we directly use the objects that are stored in the RxDocument\n * to ensure we do not store the same data twice and fill up the memory.\n */\n const docsData = docs.map(doc => {\n docsDataMap.set(doc.primary, doc._data);\n docsMap.set(doc.primary, doc);\n return doc._data;\n });\n\n this._result = new RxQuerySingleResult(this.collection, docsData, docsData.length);\n }\n\n /**\n * executes the query on the database\n * @return results-array with document-data\n */\n async _execOverDatabase(): Promise[] | number> {\n this._execOverDatabaseCount = this._execOverDatabaseCount + 1;\n this._lastExecStart = now();\n\n\n if (this.op === 'count') {\n const preparedQuery = this.getPreparedQuery();\n const result = await this.collection.storageInstance.count(preparedQuery);\n if (result.mode === 'slow' && !this.collection.database.allowSlowCount) {\n throw newRxError('QU14', {\n collection: this.collection,\n queryObj: this.mangoQuery\n });\n } else {\n return result.count;\n }\n }\n\n if (this.op === 'findByIds') {\n const ids: string[] = ensureNotFalsy(this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\n const ret = new Map>();\n const mustBeQueried: string[] = [];\n // first try to fill from docCache\n ids.forEach(id => {\n const docData = this.collection._docCache.getLatestDocumentDataIfExists(id);\n if (docData) {\n if (!docData._deleted) {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(id, doc);\n }\n } else {\n mustBeQueried.push(id);\n }\n });\n // everything which was not in docCache must be fetched from the storage\n if (mustBeQueried.length > 0) {\n const docs = await this.collection.storageInstance.findDocumentsById(mustBeQueried, false);\n docs.forEach(docData => {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(doc.primary, doc);\n });\n }\n return ret as any;\n }\n\n\n const docsPromise = queryCollection(this as any);\n return docsPromise.then(docs => {\n this._lastExecEnd = now();\n return docs;\n });\n }\n\n /**\n * Execute the query\n * To have an easier implementations,\n * just subscribe and use the first result\n */\n public exec(throwIfMissing: true): Promise>;\n public exec(): Promise;\n public exec(throwIfMissing?: boolean): Promise {\n if (throwIfMissing && this.op !== 'findOne') {\n throw newRxError('QU9', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n }\n\n\n /**\n * run _ensureEqual() here,\n * this will make sure that errors in the query which throw inside of the RxStorage,\n * will be thrown at this execution context and not in the background.\n */\n return _ensureEqual(this as any)\n .then(() => firstValueFrom(this.$))\n .then(result => {\n if (!result && throwIfMissing) {\n throw newRxError('QU10', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n } else {\n return result;\n }\n });\n }\n\n\n\n /**\n * cached call to get the queryMatcher\n * @overwrites itself with the actual value\n */\n get queryMatcher(): QueryMatcher> {\n const schema = this.collection.schema.jsonSchema;\n const normalizedQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n return overwriteGetterForCaching(\n this,\n 'queryMatcher',\n getQueryMatcher(\n schema,\n normalizedQuery\n ) as any\n );\n }\n\n /**\n * returns a string that is used for equal-comparisons\n * @overwrites itself with the actual value\n */\n toString(): string {\n const stringObj = sortObject({\n op: this.op,\n query: this.mangoQuery,\n other: this.other\n }, true);\n const value = JSON.stringify(stringObj);\n this.toString = () => value;\n return value;\n }\n\n persistentQueryId() {\n return String(this.collection.database.hashFunction(this.toString()));\n }\n\n /**\n * returns the prepared query\n * which can be send to the storage instance to query for documents.\n * @overwrites itself with the actual value.\n */\n getPreparedQuery(): PreparedQuery {\n const hookInput = {\n rxQuery: this,\n // can be mutated by the hooks so we have to deep clone first.\n mangoQuery: normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n )\n };\n\n // Set _deleted to false if not explicitly set in selector\n if (!this.includesDeleted) {\n hookInput.mangoQuery.selector = {\n ...hookInput.mangoQuery.selector,\n _deleted: { $eq: false },\n };\n }\n\n if (hookInput.mangoQuery.index) {\n hookInput.mangoQuery.index.unshift('_deleted');\n }\n\n if (this._limitBufferSize !== null && hookInput.mangoQuery.limit) {\n hookInput.mangoQuery.limit = hookInput.mangoQuery.limit + this._limitBufferSize;\n }\n\n runPluginHooks('prePrepareQuery', hookInput);\n\n const value = prepareQuery(\n this.collection.schema.jsonSchema,\n hookInput.mangoQuery as any\n );\n\n this.getPreparedQuery = () => value;\n return value;\n }\n\n /**\n * returns true if the document matches the query,\n * does not use the 'skip' and 'limit'\n */\n doesDocumentDataMatch(docData: RxDocType | any): boolean {\n // if doc is deleted, it cannot match\n if (docData._deleted) {\n return false;\n }\n\n return this.queryMatcher(docData);\n }\n\n /**\n * deletes all found documents\n * @return promise with deleted documents\n */\n remove(): Promise {\n return this\n .exec()\n .then(docs => {\n if (Array.isArray(docs)) {\n // TODO use a bulk operation instead of running .remove() on each document\n return Promise.all(docs.map(doc => doc.remove()));\n } else {\n return (docs as any).remove();\n }\n });\n }\n incrementalRemove(): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalRemove(),\n );\n }\n\n\n /**\n * helper function to transform RxQueryBase to RxQuery type\n */\n get asRxQuery(): RxQuery {\n return this as any;\n }\n\n /**\n * updates all found documents\n * @overwritten by plugin (optional)\n */\n update(_updateObj: any): Promise {\n throw pluginMissing('update');\n }\n\n patch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.patch(patch),\n );\n }\n incrementalPatch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalPatch(patch),\n );\n }\n modify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.modify(mutationFunction),\n );\n }\n incrementalModify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalModify(mutationFunction),\n );\n }\n\n\n // we only set some methods of query-builder here\n // because the others depend on these ones\n where(_queryObj: MangoQuerySelector | keyof RxDocType | string): RxQuery {\n throw pluginMissing('query-builder');\n }\n sort(_params: string | MangoQuerySortPart): RxQuery {\n throw pluginMissing('query-builder');\n }\n skip(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n limit(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n\n enableLimitBuffer(bufferSize: number) {\n if (this._limitBufferSize !== null) {\n // Limit buffer has already been enabled, do nothing:\n return this;\n }\n if (this._lastExecStart !== 0) {\n console.error('Can\\'t use limit buffer if query has already executed');\n return this;\n }\n if (this.mangoQuery.skip || !this.mangoQuery.limit) {\n console.error('Right now, limit buffer only works on non-skip, limit queries.');\n return this;\n }\n this._limitBufferSize = bufferSize;\n return this;\n }\n\n enablePersistentQueryCache(backend: QueryCacheBackend) {\n if (this._persistentQueryCacheBackend) {\n // We've already tried to enable the query cache\n return this;\n }\n this._persistentQueryCacheBackend = backend;\n this._persistentQueryCacheLoaded = this._restoreQueryCacheFromPersistedState();\n return this;\n }\n\n private async _restoreQueryCacheFromPersistedState() {\n if (!this._persistentQueryCacheBackend) {\n // no cache backend provided, do nothing\n return;\n }\n if (this._persistentQueryCacheResult) {\n // we already restored the cache once, no need to run twice\n return;\n }\n if (this.mangoQuery.skip || this.op === 'count') {\n console.error('The persistent query cache only works on non-skip, non-count queries.');\n return;\n }\n\n // First, check if there are any query results persisted:\n const persistentQueryId = this.persistentQueryId();\n const value = await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}`);\n if (!value || !Array.isArray(value) || value.length === 0) {\n // eslint-disable-next-line no-console\n console.log(`no persistent query cache found in the backend, returning early ${this.toString()}`);\n return;\n }\n\n // If there are persisted ids, create our two Sets of ids from the cache:\n const persistedQueryCacheIds = new Set();\n const limitBufferIds = new Set();\n\n for (const id of value) {\n if (id.startsWith('lb-')) {\n limitBufferIds.add(id.replace('lb-', ''));\n } else {\n persistedQueryCacheIds.add(id);\n }\n }\n\n // eslint-disable-next-line no-console\n console.time(`Restoring persistent querycache ${this.toString()}`);\n\n // Next, pull the lwt from the cache:\n // TODO: if lwt is too old, should we just give up here? What if there are too many changedDocs?\n const lwt = (await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}:lwt`)) as string | null;\n if (!lwt) {\n return;\n }\n\n // If the query was persisted too long ago, just re-execute it.\n if (now() - Number(lwt) > RESTORE_QUERY_MAX_TIME_AGO) {\n return;\n }\n\n const primaryPath = this.collection.schema.primaryPath;\n\n const {documents: changedDocs} = await getChangedDocumentsSince(this.collection.storageInstance,\n RESTORE_QUERY_MAX_DOCS_CHANGED,\n // make sure we remove the monotonic clock (xxx.01, xxx.02) from the lwt timestamp to avoid issues with\n // lookups in indices (dexie)\n {id: '', lwt: Math.floor(Number(lwt)) - RESTORE_QUERY_UPDATE_DRIFT}\n );\n\n // If too many docs have changed, just give up and re-execute the query\n if (changedDocs.length === RESTORE_QUERY_MAX_DOCS_CHANGED) {\n return;\n }\n\n const changedDocIds = new Set(changedDocs.map((d) => d[primaryPath] as string));\n\n const docIdsWeNeedToFetch = [...persistedQueryCacheIds, ...limitBufferIds].filter((id) => !changedDocIds.has(id));\n\n // We use _queryCollectionByIds to fetch the remaining docs we need efficiently, pulling\n // from query cache if we can (and the storageInstance by ids if we can't):\n const otherPotentialMatchingDocs: RxDocumentData[] = [];\n await _queryCollectionByIds(this as any, otherPotentialMatchingDocs, docIdsWeNeedToFetch);\n\n // Now that we have all potential documents, we just filter (in-memory) the ones that still match our query:\n let docsData: RxDocumentData[] = [];\n for (const doc of changedDocs.concat(otherPotentialMatchingDocs)) {\n if (this.doesDocumentDataMatch(doc)) {\n docsData.push(doc);\n }\n }\n\n // Sort the documents by the query's sort field:\n const normalizedMangoQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n const sortComparator = getSortComparator(this.collection.schema.jsonSchema, normalizedMangoQuery);\n const limit = normalizedMangoQuery.limit ? normalizedMangoQuery.limit : Infinity;\n docsData = docsData.sort(sortComparator);\n\n // We know for sure that all persisted and limit buffer ids (and changed docs before them) are in the correct\n // result set. And we can't be sure about any past that point. So cut it off there:\n const lastValidIndex = docsData.findLastIndex((d) => limitBufferIds.has(d[primaryPath] as string) || persistedQueryCacheIds.has(d[primaryPath] as string));\n docsData = docsData.slice(0, lastValidIndex + 1);\n\n // Now this is the trickiest part.\n // If we somehow have fewer docs than the limit of our query\n // (and this wasn't the case because before persistence)\n // then there is no way for us to know the correct results, and we re-exec:\n const unchangedItemsMayNowBeInResults = (\n this.mangoQuery.limit &&\n docsData.length < this.mangoQuery.limit &&\n persistedQueryCacheIds.size >= this.mangoQuery.limit\n );\n if (unchangedItemsMayNowBeInResults) {\n return;\n }\n\n // Our finalResults are the actual results of this query, and pastLimitItems are any remaining matching\n // documents we have left over (past the limit).\n const pastLimitItems = docsData.slice(limit);\n const finalResults = docsData.slice(0, limit);\n\n // If there are still items past the first LIMIT items, try to restore the limit buffer with them:\n if (limitBufferIds.size && pastLimitItems.length > 0) {\n this._limitBufferResults = pastLimitItems;\n } else {\n this._limitBufferResults = [];\n }\n\n // Finally, set the query's results to what we've pulled from disk:\n this._lastEnsureEqual = now();\n this._latestChangeEvent = this.collection._changeEventBuffer.counter;\n this._setResultData(finalResults);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Restoring persistent querycache ${this.toString()}`);\n }\n}\n\nexport function _getDefaultQuery(): MangoQuery {\n return {\n selector: {}\n };\n}\n\n/**\n * run this query through the QueryCache\n */\nexport function tunnelQueryCache(\n rxQuery: RxQueryBase\n): RxQuery {\n return rxQuery.collection._queryCache.getByQuery(rxQuery as any);\n}\n\nexport function createRxQuery(\n op: RxQueryOP,\n queryObj: MangoQuery,\n collection: RxCollection,\n other?: any\n) {\n runPluginHooks('preCreateRxQuery', {\n op,\n queryObj,\n collection,\n other\n });\n\n let ret = new RxQueryBase(op, queryObj, collection, other);\n\n // ensure when created with same params, only one is created\n ret = tunnelQueryCache(ret);\n // TODO: clear persistent query cache as well\n triggerCacheReplacement(collection);\n\n return ret;\n}\n\n/**\n * Check if the current results-state is in sync with the database\n * which means that no write event happened since the last run.\n * @return false if not which means it should re-execute\n */\nfunction _isResultsInSync(rxQuery: RxQueryBase): boolean {\n const currentLatestEventNumber = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n if (rxQuery._latestChangeEvent >= currentLatestEventNumber) {\n return true;\n } else {\n return false;\n }\n}\n\n\n/**\n * wraps __ensureEqual()\n * to ensure it does not run in parallel\n * @return true if has changed, false if not\n */\nfunction _ensureEqual(rxQuery: RxQueryBase): Promise {\n // Optimisation shortcut\n if (\n rxQuery.collection.database.destroyed ||\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\n .then(() => __ensureEqual(rxQuery));\n return rxQuery._ensureEqualQueue;\n}\n\n\n/**\n * ensures that the results of this query is equal to the results which a query over the database would give\n * @return true if results have changed\n */\nasync function __ensureEqual(rxQuery: RxQueryBase): Promise {\n await rxQuery._persistentQueryCacheLoaded;\n\n rxQuery._lastEnsureEqual = now();\n\n /**\n * Optimisation shortcuts\n */\n if (\n // db is closed\n rxQuery.collection.database.destroyed ||\n // nothing happened since last run\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n let ret = false;\n let mustReExec = false; // if this becomes true, a whole execution over the database is made\n if (rxQuery._latestChangeEvent === -1) {\n // have not executed yet -> must run\n mustReExec = true;\n }\n\n /**\n * try to use EventReduce to calculate the new results\n */\n if (!mustReExec) {\n const missedChangeEvents = rxQuery.asRxQuery.collection._changeEventBuffer.getFrom(rxQuery._latestChangeEvent + 1);\n if (missedChangeEvents === null) {\n // changeEventBuffer is of bounds -> we must re-execute over the database\n mustReExec = true;\n } else {\n rxQuery._latestChangeEvent = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n\n const runChangeEvents: RxChangeEvent[] = rxQuery.asRxQuery.collection\n ._changeEventBuffer\n .reduceByLastOfDoc(missedChangeEvents);\n\n if (rxQuery._limitBufferResults !== null) {\n // Check if any item in our limit buffer was modified by a change event\n for (const cE of runChangeEvents) {\n if (rxQuery._limitBufferResults.find((doc) => doc[rxQuery.collection.schema.primaryPath] === cE.documentId)) {\n // If so, the limit buffer is potential invalid -- let's just blow it up\n // TODO: could we instead update the documents in the limit buffer?\n rxQuery._limitBufferResults = null;\n break;\n }\n }\n }\n\n if (rxQuery.includesDeleted) {\n return rxQuery._execOverDatabase().then((newResultData) => {\n rxQuery._setResultData(newResultData);\n return true;\n });\n } else if (rxQuery.op === 'count') {\n // 'count' query\n const previousCount = ensureNotFalsy(rxQuery._result).count;\n let newCount = previousCount;\n runChangeEvents.forEach(cE => {\n const didMatchBefore = cE.previousDocumentData && rxQuery.doesDocumentDataMatch(cE.previousDocumentData);\n const doesMatchNow = rxQuery.doesDocumentDataMatch(cE.documentData);\n\n if (!didMatchBefore && doesMatchNow) {\n newCount++;\n }\n if (didMatchBefore && !doesMatchNow) {\n newCount--;\n }\n });\n if (newCount !== previousCount) {\n ret = true; // true because results changed\n rxQuery._setResultData(newCount as any);\n }\n } else {\n // 'find' or 'findOne' query\n const eventReduceResult = calculateNewResults(\n rxQuery as any,\n runChangeEvents\n );\n if (eventReduceResult.runFullQueryAgain) {\n // could not calculate the new results, execute must be done\n mustReExec = true;\n } else if (eventReduceResult.changed) {\n // we got the new results, we do not have to re-execute, mustReExec stays false\n ret = true; // true because results changed\n rxQuery._setResultData(eventReduceResult.newResults as any);\n }\n }\n }\n }\n\n // oh no we have to re-execute the whole query over the database\n if (mustReExec) {\n return rxQuery._execOverDatabase()\n .then(newResultData => {\n\n /**\n * The RxStorage is defined to always first emit events and then return\n * on bulkWrite() calls. So here we have to use the counter AFTER the execOverDatabase()\n * has been run, not the one from before.\n */\n rxQuery._latestChangeEvent = rxQuery.collection._changeEventBuffer.getCounter();\n\n // A count query needs a different has-changed check.\n if (typeof newResultData === 'number') {\n if (\n !rxQuery._result ||\n newResultData !== rxQuery._result.count\n ) {\n ret = true;\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n }\n if (\n !rxQuery._result ||\n !areRxDocumentArraysEqual(\n rxQuery.collection.schema.primaryPath,\n newResultData,\n rxQuery._result.docsData\n )\n ) {\n ret = true; // true because results changed\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n })\n .then(async (returnValue) => {\n await updatePersistentQueryCache(rxQuery);\n return returnValue;\n });\n }\n\n return ret; // true if results have changed\n}\n\n\nasync function updatePersistentQueryCache(rxQuery: RxQueryBase) {\n if (!rxQuery._persistentQueryCacheBackend) {\n return;\n }\n\n const backend = rxQuery._persistentQueryCacheBackend;\n\n const key = rxQuery.persistentQueryId();\n\n // update _persistedQueryCacheResult\n rxQuery._persistentQueryCacheResult = rxQuery._result?.docsKeys ?? [];\n\n const idsToPersist = [...rxQuery._persistentQueryCacheResult];\n if (rxQuery._limitBufferResults) {\n rxQuery._limitBufferResults.forEach((d) => {\n idsToPersist.push(`lb-${d[rxQuery.collection.schema.primaryPath]}`);\n });\n }\n // eslint-disable-next-line no-console\n console.time(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n // persist query cache\n const lwt = rxQuery._result?.time ?? RX_META_LWT_MINIMUM;\n\n await Promise.all([\n backend.setItem(`qc:${String(key)}`, idsToPersist),\n backend.setItem(`qc:${String(key)}:lwt`, lwt.toString()),\n ]);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n}\n\n\n// Refactored out of `queryCollection`: modifies the docResults array to fill it with data\nasync function _queryCollectionByIds(rxQuery: RxQuery | RxQueryBase, docResults: RxDocumentData[], docIds: string[]) {\n const collection = rxQuery.collection;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docResults.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsMap = await collection.storageInstance.findDocumentsById(docIds, false);\n Object.values(docsMap).forEach(docData => {\n docResults.push(docData);\n });\n }\n}\n\n/**\n * @returns a format of the query that can be used with the storage\n * when calling RxStorageInstance().query()\n */\nexport function prepareQuery(\n schema: RxJsonSchema>,\n mutateableQuery: FilledMangoQuery\n): PreparedQuery {\n if (!mutateableQuery.sort) {\n throw newRxError('SNH', {\n query: mutateableQuery\n });\n }\n\n /**\n * Store the query plan together with the\n * prepared query to save performance.\n */\n const queryPlan = getQueryPlan(\n schema,\n mutateableQuery\n );\n\n return {\n query: mutateableQuery,\n queryPlan\n };\n}\n\n/**\n * Runs the query over the storage instance\n * of the collection.\n * Does some optimizations to ensure findById is used\n * when specific queries are used.\n */\nexport async function queryCollection(\n rxQuery: RxQuery | RxQueryBase\n): Promise[]> {\n await rxQuery._persistentQueryCacheLoaded;\n\n let docs: RxDocumentData[] = [];\n const collection = rxQuery.collection;\n\n /**\n * Optimizations shortcut.\n * If query is find-one-document-by-id,\n * then we do not have to use the slow query() method\n * but instead can use findDocumentsById()\n */\n if (rxQuery.isFindOneByIdQuery) {\n if (Array.isArray(rxQuery.isFindOneByIdQuery)) {\n let docIds = rxQuery.isFindOneByIdQuery;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docs.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsFromStorage = await collection.storageInstance.findDocumentsById(docIds, false);\n appendToArray(docs, docsFromStorage);\n }\n await _queryCollectionByIds(rxQuery, docs, rxQuery.isFindOneByIdQuery);\n } else {\n const docId = rxQuery.isFindOneByIdQuery;\n\n // first try to fill from docCache\n let docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (!docData) {\n // otherwise get from storage\n const fromStorageList = await collection.storageInstance.findDocumentsById([docId], false);\n if (fromStorageList[0]) {\n docData = fromStorageList[0];\n }\n }\n if (docData && !docData._deleted) {\n docs.push(docData);\n }\n }\n } else {\n const preparedQuery = rxQuery.getPreparedQuery();\n const queryResult = await collection.storageInstance.query(preparedQuery);\n if (rxQuery._limitBufferSize !== null && rxQuery.mangoQuery.limit && queryResult.documents.length > rxQuery.mangoQuery.limit) {\n // If there are more than query.limit results, we pull out our buffer items from the\n // last rxQuery._limitBufferSize items of the results.\n rxQuery._limitBufferResults = queryResult.documents.splice(rxQuery.mangoQuery.limit);\n }\n docs = queryResult.documents;\n }\n return docs;\n}\n\n/**\n * Returns true if the given query\n * selects exactly one document by its id.\n * Used to optimize performance because these kind of\n * queries do not have to run over an index and can use get-by-id instead.\n * Returns false if no query of that kind.\n * Returns the document id otherwise.\n */\nexport function isFindOneByIdQuery(\n primaryPath: string,\n query: MangoQuery\n): false | string | string[] {\n // must have exactly one operator which must be $eq || $in\n if (\n !query.skip &&\n query.selector &&\n Object.keys(query.selector).length === 1 &&\n query.selector[primaryPath]\n ) {\n const value: any = query.selector[primaryPath];\n if (typeof value === 'string') {\n return value;\n } else if (\n Object.keys(value).length === 1 &&\n typeof value.$eq === 'string'\n ) {\n return value.$eq;\n }\n\n // same with $in string arrays\n if (\n Object.keys(value).length === 1 &&\n Array.isArray(value.$eq) &&\n // must only contain strings\n !(value.$eq as any[]).find(r => typeof r !== 'string')\n ) {\n return value.$eq;\n }\n }\n return false;\n}\n\n\nexport function isRxQuery(obj: any): boolean {\n return obj instanceof RxQueryBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/cjs/rx-schema.js.map b/dist/cjs/rx-schema.js.map index 8b324297890..b2b5611c95e 100644 --- a/dist/cjs/rx-schema.js.map +++ b/dist/cjs/rx-schema.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-schema.js","names":["_index","require","_rxError","_hooks","_rxSchemaHelper","_overwritable","RxSchema","exports","jsonSchema","hashFunction","indexes","getIndexes","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","finalFields","getFinalFields","_proto","prototype","validateChange","dataBefore","dataAfter","forEach","fieldName","deepEqual","newRxError","schema","getDocumentPrototype","proto","pathProperties","getSchemaByObjectPath","Object","keys","key","fullPath","__defineGetter__","get","undefined","ret","defineProperty","get$","enumerable","configurable","get$$","populate","overwriteGetterForCaching","getPrimaryOfDocumentData","documentData","getComposedPrimaryKeyOfDocumentData","_createClass2","default","version","values","entries","properties","filter","v","hasOwnProperty","call","k","JSON","stringify","map","index","isMaybeReadonlyArray","getPreviousVersions","c","Array","fill","createRxSchema","runPreCreateHooks","runPluginHooks","useJsonSchema","fillWithDefaultSettings","normalizeRxJsonSchema","overwritable","deepFreezeWhenDevMode","isRxSchema","obj","toTypedRxJsonSchema"],"sources":["../../src/rx-schema.ts"],"sourcesContent":["import {\n overwriteGetterForCaching,\n isMaybeReadonlyArray,\n deepEqual\n} from './plugins/utils/index.ts';\nimport {\n newRxError,\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\n\nimport type {\n DeepMutable,\n DeepReadonly,\n HashFunction,\n MaybeReadonly,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n StringKeys\n} from './types/index.d.ts';\nimport {\n fillWithDefaultSettings,\n getComposedPrimaryKeyOfDocumentData,\n getFinalFields,\n getPrimaryFieldOfPrimaryKey,\n getSchemaByObjectPath,\n normalizeRxJsonSchema\n} from './rx-schema-helper.ts';\nimport { overwritable } from './overwritable.ts';\n\nexport class RxSchema {\n public indexes: MaybeReadonly[];\n public readonly primaryPath: StringKeys>;\n public finalFields: string[];\n\n constructor(\n public readonly jsonSchema: RxJsonSchema>,\n public readonly hashFunction: HashFunction\n ) {\n this.indexes = getIndexes(this.jsonSchema);\n\n // primary is always required\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.jsonSchema.primaryKey);\n\n this.finalFields = getFinalFields(this.jsonSchema);\n }\n\n public get version(): number {\n return this.jsonSchema.version;\n }\n\n public get defaultValues(): { [P in keyof RxDocType]: RxDocType[P] } {\n const values = {} as { [P in keyof RxDocType]: RxDocType[P] };\n Object\n .entries(this.jsonSchema.properties)\n .filter(([, v]) => Object.prototype.hasOwnProperty.call(v, 'default'))\n .forEach(([k, v]) => (values as any)[k] = (v as any).default);\n return overwriteGetterForCaching(\n this,\n 'defaultValues',\n values\n );\n }\n\n /**\n * @overrides itself on the first call\n *\n * TODO this should be a pure function that\n * caches the hash in a WeakMap.\n */\n public get hash(): Promise {\n return overwriteGetterForCaching(\n this,\n 'hash',\n this.hashFunction(JSON.stringify(this.jsonSchema))\n );\n }\n\n /**\n * checks if a given change on a document is allowed\n * Ensures that:\n * - final fields are not modified\n * @throws {Error} if not valid\n */\n validateChange(dataBefore: any, dataAfter: any): void {\n this.finalFields.forEach(fieldName => {\n if (!deepEqual(dataBefore[fieldName], dataAfter[fieldName])) {\n throw newRxError('DOC9', {\n dataBefore,\n dataAfter,\n fieldName,\n schema: this.jsonSchema\n });\n }\n });\n }\n\n /**\n * creates the schema-based document-prototype,\n * see RxCollection.getDocumentPrototype()\n */\n public getDocumentPrototype(): any {\n const proto: any = {};\n\n /**\n * On the top level, we know all keys\n * and therefore do not have to create a new Proxy object\n * for each document. Instead we define the getter in the prototype once.\n */\n const pathProperties = getSchemaByObjectPath(\n this.jsonSchema,\n ''\n );\n Object.keys(pathProperties)\n .forEach(key => {\n const fullPath = key;\n\n // getter - value\n proto.__defineGetter__(\n key,\n function (this: RxDocument) {\n if (!this.get || typeof this.get !== 'function') {\n /**\n * When an object gets added to the state of a vuejs-component,\n * it happens that this getter is called with another scope.\n * To prevent errors, we have to return undefined in this case\n */\n return undefined;\n }\n const ret = this.get(fullPath);\n return ret;\n }\n );\n // getter - observable$\n Object.defineProperty(proto, key + '$', {\n get: function () {\n return this.get$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - reactivity$$\n Object.defineProperty(proto, key + '$$', {\n get: function () {\n return this.get$$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - populate_\n Object.defineProperty(proto, key + '_', {\n get: function () {\n return this.populate(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n });\n\n overwriteGetterForCaching(\n this,\n 'getDocumentPrototype',\n () => proto\n );\n return proto;\n }\n\n\n getPrimaryOfDocumentData(\n documentData: Partial\n ): string {\n return getComposedPrimaryKeyOfDocumentData(\n this.jsonSchema,\n documentData\n );\n }\n}\n\nexport function getIndexes(\n jsonSchema: RxJsonSchema\n): MaybeReadonly[] {\n return (jsonSchema.indexes || []).map(index => isMaybeReadonlyArray(index) ? index : [index]);\n}\n\n/**\n * array with previous version-numbers\n */\nexport function getPreviousVersions(schema: RxJsonSchema): number[] {\n const version = schema.version ? schema.version : 0;\n let c = 0;\n return new Array(version)\n .fill(0)\n .map(() => c++);\n}\n\nexport function createRxSchema(\n jsonSchema: RxJsonSchema,\n hashFunction: HashFunction,\n runPreCreateHooks = true\n): RxSchema {\n if (runPreCreateHooks) {\n runPluginHooks('preCreateRxSchema', jsonSchema);\n }\n\n let useJsonSchema = fillWithDefaultSettings(jsonSchema);\n useJsonSchema = normalizeRxJsonSchema(useJsonSchema);\n overwritable.deepFreezeWhenDevMode(useJsonSchema);\n\n const schema = new RxSchema(useJsonSchema, hashFunction);\n runPluginHooks('createRxSchema', schema);\n return schema;\n}\n\nexport function isRxSchema(obj: any): boolean {\n return obj instanceof RxSchema;\n}\n\n/**\n * Used as helper function the generate the document type out of the schema via typescript.\n * @link https://github.com/pubkey/rxdb/discussions/3467\n */\nexport function toTypedRxJsonSchema>>(schema: T): DeepMutable {\n return schema as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-schema.js","names":["_index","require","_rxError","_hooks","_rxSchemaHelper","_overwritable","RxSchema","exports","jsonSchema","hashFunction","indexes","getIndexes","primaryPath","getPrimaryFieldOfPrimaryKey","primaryKey","finalFields","getFinalFields","_proto","prototype","validateChange","dataBefore","dataAfter","forEach","fieldName","deepEqual","newRxError","schema","getDocumentPrototype","proto","pathProperties","getSchemaByObjectPath","Object","keys","key","fullPath","__defineGetter__","get","undefined","ret","defineProperty","get$","enumerable","configurable","get$$","populate","overwriteGetterForCaching","getPrimaryOfDocumentData","documentData","getComposedPrimaryKeyOfDocumentData","_createClass2","default","version","values","entries","properties","filter","v","hasOwnProperty","call","k","JSON","stringify","map","index","isMaybeReadonlyArray","getPreviousVersions","c","Array","fill","createRxSchema","runPreCreateHooks","runPluginHooks","useJsonSchema","fillWithDefaultSettings","normalizeRxJsonSchema","overwritable","deepFreezeWhenDevMode","isRxSchema","obj","toTypedRxJsonSchema"],"sources":["../../src/rx-schema.ts"],"sourcesContent":["import {\n overwriteGetterForCaching,\n isMaybeReadonlyArray,\n deepEqual\n} from './plugins/utils/index.ts';\nimport {\n newRxError,\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\n\nimport type {\n DeepMutable,\n DeepReadonly,\n HashFunction,\n MaybeReadonly,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n StringKeys\n} from './types/index.d.ts';\nimport {\n fillWithDefaultSettings,\n getComposedPrimaryKeyOfDocumentData,\n getFinalFields,\n getPrimaryFieldOfPrimaryKey,\n getSchemaByObjectPath,\n normalizeRxJsonSchema\n} from './rx-schema-helper.ts';\nimport { overwritable } from './overwritable.ts';\n\nexport class RxSchema {\n public indexes: MaybeReadonly[];\n public readonly primaryPath: StringKeys>;\n public finalFields: string[];\n\n constructor(\n public readonly jsonSchema: RxJsonSchema>,\n public readonly hashFunction: HashFunction\n ) {\n this.indexes = getIndexes(this.jsonSchema);\n\n // primary is always required\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.jsonSchema.primaryKey);\n\n this.finalFields = getFinalFields(this.jsonSchema);\n }\n\n public get version(): number {\n return this.jsonSchema.version;\n }\n\n public get defaultValues(): { [P in keyof RxDocType]: RxDocType[P] } {\n const values = {} as { [P in keyof RxDocType]: RxDocType[P] };\n Object\n .entries(this.jsonSchema.properties)\n .filter(([, v]) => Object.prototype.hasOwnProperty.call(v, 'default'))\n .forEach(([k, v]) => (values as any)[k] = (v as any).default);\n return overwriteGetterForCaching(\n this,\n 'defaultValues',\n values\n );\n }\n\n /**\n * @overrides itself on the first call\n *\n * TODO this should be a pure function that\n * caches the hash in a WeakMap.\n */\n public get hash(): Promise {\n return overwriteGetterForCaching(\n this,\n 'hash',\n this.hashFunction(JSON.stringify(this.jsonSchema))\n );\n }\n\n /**\n * checks if a given change on a document is allowed\n * Ensures that:\n * - final fields are not modified\n * @throws {Error} if not valid\n */\n validateChange(dataBefore: any, dataAfter: any): void {\n this.finalFields.forEach(fieldName => {\n if (!deepEqual(dataBefore[fieldName], dataAfter[fieldName])) {\n throw newRxError('DOC9', {\n dataBefore,\n dataAfter,\n fieldName,\n schema: this.jsonSchema\n });\n }\n });\n }\n\n /**\n * creates the schema-based document-prototype,\n * see RxCollection.getDocumentPrototype()\n */\n public getDocumentPrototype(): any {\n const proto: any = {};\n\n /**\n * On the top level, we know all keys\n * and therefore do not have to create a new Proxy object\n * for each document. Instead we define the getter in the prototype once.\n */\n const pathProperties = getSchemaByObjectPath(\n this.jsonSchema,\n ''\n );\n Object.keys(pathProperties)\n .forEach(key => {\n const fullPath = key;\n\n // getter - value\n proto.__defineGetter__(\n key,\n function (this: RxDocument) {\n if (!this.get || typeof this.get !== 'function') {\n /**\n * When an object gets added to the state of a vuejs-component,\n * it happens that this getter is called with another scope.\n * To prevent errors, we have to return undefined in this case\n */\n return undefined;\n }\n const ret = this.get(fullPath);\n return ret;\n }\n );\n // getter - observable$\n Object.defineProperty(proto, key + '$', {\n get: function () {\n return this.get$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - reactivity$$\n Object.defineProperty(proto, key + '$$', {\n get: function () {\n return this.get$$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - populate_\n Object.defineProperty(proto, key + '_', {\n get: function () {\n return this.populate(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n });\n\n overwriteGetterForCaching(\n this,\n 'getDocumentPrototype',\n () => proto\n );\n return proto;\n }\n\n\n getPrimaryOfDocumentData(\n documentData: Partial\n ): string {\n return getComposedPrimaryKeyOfDocumentData(\n this.jsonSchema,\n documentData\n );\n }\n}\n\nexport function getIndexes(\n jsonSchema: RxJsonSchema\n): MaybeReadonly[] {\n return (jsonSchema.indexes || []).map(index => isMaybeReadonlyArray(index) ? index : [index]);\n}\n\n/**\n * array with previous version-numbers\n */\nexport function getPreviousVersions(schema: RxJsonSchema): number[] {\n const version = schema.version ? schema.version : 0;\n let c = 0;\n return new Array(version)\n .fill(0)\n .map(() => c++);\n}\n\nexport function createRxSchema(\n jsonSchema: RxJsonSchema,\n hashFunction: HashFunction,\n runPreCreateHooks = true\n): RxSchema {\n if (runPreCreateHooks) {\n runPluginHooks('preCreateRxSchema', jsonSchema);\n }\n\n let useJsonSchema = fillWithDefaultSettings(jsonSchema);\n useJsonSchema = normalizeRxJsonSchema(useJsonSchema);\n overwritable.deepFreezeWhenDevMode(useJsonSchema);\n\n const schema = new RxSchema(useJsonSchema, hashFunction);\n runPluginHooks('createRxSchema', schema);\n return schema;\n}\n\nexport function isRxSchema(obj: any): boolean {\n return obj instanceof RxSchema;\n}\n\n/**\n * Used as helper function the generate the document type out of the schema via typescript.\n * @link https://github.com/pubkey/rxdb/discussions/3467\n */\nexport function toTypedRxJsonSchema>>(schema: T): DeepMutable {\n return schema as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/change-event-buffer.js.map b/dist/esm/change-event-buffer.js.map index 30f239aacbd..5dc3cbda4f9 100644 --- a/dist/esm/change-event-buffer.js.map +++ b/dist/esm/change-event-buffer.js.map @@ -1 +1 @@ -{"version":3,"file":"change-event-buffer.js","names":["filter","appendToArray","requestIdlePromiseNoQueue","ChangeEventBuffer","collection","subs","counter","eventCounterMap","WeakMap","buffer","limit","tasks","Set","push","database","eventBulks$","pipe","changeEventBulk","collectionName","name","bulk","first","events","isLocal","subscribe","eventBulk","add","_handleChangeEvents","size","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","counterBefore","length","slice","counterBase","index","event","set","getCounter","getBuffer","getArrayIndexByPointer","pointer","oldestEvent","oldestCounter","get","rest","getFrom","ret","currentIndex","nextEvent","runFrom","fn","Error","cE","reduceByLastOfDoc","changeEvents","docEventMap","changeEvent","documentId","Object","values","destroy","sub","unsubscribe","createChangeEventBuffer"],"sources":["../../src/change-event-buffer.ts"],"sourcesContent":["/**\n * a buffer-cache which holds the last X changeEvents of the collection\n */\nimport {\n Subscription\n} from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type {\n RxChangeEvent,\n RxCollection\n} from './types/index.d.ts';\nimport { appendToArray, requestIdlePromiseNoQueue } from './plugins/utils/index.ts';\n\n/**\n * This buffer rembemers previous change events\n * so that queries can use them on .exec()\n * to calculate the new result set via event-reduce instead\n * of running the query against the storage.\n */\nexport class ChangeEventBuffer {\n /**\n * These properties are private to ensure they cannot\n * be read without first processing the lazy tasks.\n */\n private subs: Subscription[] = [];\n public counter: number = 0;\n private eventCounterMap: WeakMap<\n RxChangeEvent, number\n > = new WeakMap();\n /**\n * array with changeEvents\n * starts with oldest known event, ends with newest\n */\n private buffer: RxChangeEvent[] = [];\n\n public limit: number = 100;\n\n\n\n private tasks = new Set();\n\n constructor(\n public collection: RxCollection\n ) {\n this.subs.push(\n this.collection.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.collection.name),\n filter(bulk => {\n const first = bulk.events[0];\n return !first.isLocal;\n })\n ).subscribe(eventBulk => {\n this.tasks.add(() => this._handleChangeEvents(eventBulk.events));\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n })\n );\n }\n\n private processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n private _handleChangeEvents(events: RxChangeEvent[]) {\n const counterBefore = this.counter;\n this.counter = this.counter + events.length;\n if (events.length > this.limit) {\n this.buffer = events.slice(events.length * -1);\n } else {\n appendToArray(this.buffer, events);\n this.buffer = this.buffer.slice(this.limit * -1);\n }\n const counterBase = counterBefore + 1;\n const eventCounterMap = this.eventCounterMap;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n eventCounterMap.set(event, counterBase + index);\n }\n }\n\n getCounter() {\n this.processTasks();\n return this.counter;\n }\n getBuffer() {\n this.processTasks();\n return this.buffer;\n }\n\n /**\n * gets the array-index for the given pointer\n * @return arrayIndex which can be used to iterate from there. If null, pointer is out of lower bound\n */\n getArrayIndexByPointer(pointer: number): number | null {\n this.processTasks();\n const oldestEvent = this.buffer[0];\n const oldestCounter = this.eventCounterMap.get(\n oldestEvent\n ) as number;\n\n if (pointer < oldestCounter)\n return null; // out of bounds\n\n const rest = pointer - oldestCounter;\n return rest;\n }\n\n /**\n * get all changeEvents which came in later than the pointer-event\n * @return array with change-events. If null, pointer out of bounds\n */\n getFrom(pointer: number): RxChangeEvent[] | null {\n this.processTasks();\n const ret = [];\n let currentIndex = this.getArrayIndexByPointer(pointer);\n if (currentIndex === null) // out of bounds\n return null;\n\n while (true) {\n const nextEvent = this.buffer[currentIndex];\n currentIndex++;\n if (!nextEvent) {\n return ret;\n } else {\n ret.push(nextEvent);\n }\n }\n }\n\n runFrom(pointer: number, fn: Function) {\n this.processTasks();\n const ret = this.getFrom(pointer);\n if (ret === null) {\n throw new Error('out of bounds');\n } else {\n ret.forEach(cE => fn(cE));\n }\n }\n\n /**\n * no matter how many operations are done on one document,\n * only the last operation has to be checked to calculate the new state\n * this function reduces the events to the last ChangeEvent of each doc\n */\n reduceByLastOfDoc(changeEvents: RxChangeEvent[]): RxChangeEvent[] {\n this.processTasks();\n return changeEvents.slice(0);\n // TODO the old implementation was wrong\n // because it did not correctly reassigned the previousData of the changeevents\n // this should be added to the event-reduce library and not be done in RxDB\n const docEventMap: any = {};\n changeEvents.forEach(changeEvent => {\n docEventMap[changeEvent.documentId] = changeEvent;\n });\n return Object.values(docEventMap);\n }\n\n destroy() {\n this.tasks.clear();\n this.subs.forEach(sub => sub.unsubscribe());\n }\n}\n\nexport function createChangeEventBuffer(\n collection: RxCollection\n) {\n return new ChangeEventBuffer(collection);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"change-event-buffer.js","names":["filter","appendToArray","requestIdlePromiseNoQueue","ChangeEventBuffer","collection","subs","counter","eventCounterMap","WeakMap","buffer","limit","tasks","Set","push","database","eventBulks$","pipe","changeEventBulk","collectionName","name","bulk","first","events","isLocal","subscribe","eventBulk","add","_handleChangeEvents","size","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","counterBefore","length","slice","counterBase","index","event","set","getCounter","getBuffer","getArrayIndexByPointer","pointer","oldestEvent","oldestCounter","get","rest","getFrom","ret","currentIndex","nextEvent","runFrom","fn","Error","cE","reduceByLastOfDoc","changeEvents","docEventMap","changeEvent","documentId","Object","values","destroy","sub","unsubscribe","createChangeEventBuffer"],"sources":["../../src/change-event-buffer.ts"],"sourcesContent":["/**\n * a buffer-cache which holds the last X changeEvents of the collection\n */\nimport {\n Subscription\n} from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type {\n RxChangeEvent,\n RxCollection\n} from './types/index.d.ts';\nimport { appendToArray, requestIdlePromiseNoQueue } from './plugins/utils/index.ts';\n\n/**\n * This buffer rembemers previous change events\n * so that queries can use them on .exec()\n * to calculate the new result set via event-reduce instead\n * of running the query against the storage.\n */\nexport class ChangeEventBuffer {\n /**\n * These properties are private to ensure they cannot\n * be read without first processing the lazy tasks.\n */\n private subs: Subscription[] = [];\n public counter: number = 0;\n private eventCounterMap: WeakMap<\n RxChangeEvent, number\n > = new WeakMap();\n /**\n * array with changeEvents\n * starts with oldest known event, ends with newest\n */\n private buffer: RxChangeEvent[] = [];\n\n public limit: number = 100;\n\n\n\n private tasks = new Set();\n\n constructor(\n public collection: RxCollection\n ) {\n this.subs.push(\n this.collection.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.collection.name),\n filter(bulk => {\n const first = bulk.events[0];\n return !first.isLocal;\n })\n ).subscribe(eventBulk => {\n this.tasks.add(() => this._handleChangeEvents(eventBulk.events));\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n })\n );\n }\n\n private processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n private _handleChangeEvents(events: RxChangeEvent[]) {\n const counterBefore = this.counter;\n this.counter = this.counter + events.length;\n if (events.length > this.limit) {\n this.buffer = events.slice(events.length * -1);\n } else {\n appendToArray(this.buffer, events);\n this.buffer = this.buffer.slice(this.limit * -1);\n }\n const counterBase = counterBefore + 1;\n const eventCounterMap = this.eventCounterMap;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n eventCounterMap.set(event, counterBase + index);\n }\n }\n\n getCounter() {\n this.processTasks();\n return this.counter;\n }\n getBuffer() {\n this.processTasks();\n return this.buffer;\n }\n\n /**\n * gets the array-index for the given pointer\n * @return arrayIndex which can be used to iterate from there. If null, pointer is out of lower bound\n */\n getArrayIndexByPointer(pointer: number): number | null {\n this.processTasks();\n const oldestEvent = this.buffer[0];\n const oldestCounter = this.eventCounterMap.get(\n oldestEvent\n ) as number;\n\n if (pointer < oldestCounter)\n return null; // out of bounds\n\n const rest = pointer - oldestCounter;\n return rest;\n }\n\n /**\n * get all changeEvents which came in later than the pointer-event\n * @return array with change-events. If null, pointer out of bounds\n */\n getFrom(pointer: number): RxChangeEvent[] | null {\n this.processTasks();\n const ret = [];\n let currentIndex = this.getArrayIndexByPointer(pointer);\n if (currentIndex === null) // out of bounds\n return null;\n\n while (true) {\n const nextEvent = this.buffer[currentIndex];\n currentIndex++;\n if (!nextEvent) {\n return ret;\n } else {\n ret.push(nextEvent);\n }\n }\n }\n\n runFrom(pointer: number, fn: Function) {\n this.processTasks();\n const ret = this.getFrom(pointer);\n if (ret === null) {\n throw new Error('out of bounds');\n } else {\n ret.forEach(cE => fn(cE));\n }\n }\n\n /**\n * no matter how many operations are done on one document,\n * only the last operation has to be checked to calculate the new state\n * this function reduces the events to the last ChangeEvent of each doc\n */\n reduceByLastOfDoc(changeEvents: RxChangeEvent[]): RxChangeEvent[] {\n this.processTasks();\n return changeEvents.slice(0);\n // TODO the old implementation was wrong\n // because it did not correctly reassigned the previousData of the changeevents\n // this should be added to the event-reduce library and not be done in RxDB\n const docEventMap: any = {};\n changeEvents.forEach(changeEvent => {\n docEventMap[changeEvent.documentId] = changeEvent;\n });\n return Object.values(docEventMap);\n }\n\n destroy() {\n this.tasks.clear();\n this.subs.forEach(sub => sub.unsubscribe());\n }\n}\n\nexport function createChangeEventBuffer(\n collection: RxCollection\n) {\n return new ChangeEventBuffer(collection);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/doc-cache.js.map b/dist/esm/doc-cache.js.map index 39052c7a7d1..a4f693d1a7c 100644 --- a/dist/esm/doc-cache.js.map +++ b/dist/esm/doc-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"doc-cache.js","names":["getFromMapOrThrow","getHeightOfRevision","overwriteGetterForCaching","requestIdlePromiseNoQueue","overwritable","DocumentCache","primaryPath","changes$","documentCreator","cacheItemByDocId","Map","tasks","Set","registry","FinalizationRegistry","docMeta","docId","cacheItem","get","delete","revisionHeight","size","undefined","subscribe","events","add","index","length","event","documentId","documentData","previousDocumentData","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","getLatestDocumentData","getLatestDocumentDataIfExists","_createClass","key","fn","getCachedRxDocumentMonad","doc","docCache","deepFreezeWhenDevMode","docsData","ret","registryTasks","docData","_rev","byRev","cachedRxDocumentWeakRef","set","cachedRxDocument","deref","createWeakRefWithFallback","push","register","primary","revision","mapDocumentsDataToCacheDocs","getCachedRxDocuments","HAS_WEAK_REF","WeakRef","createWeakRef","createWeakRefFallback","obj"],"sources":["../../src/doc-cache.ts"],"sourcesContent":["import type {\n RxChangeEvent,\n RxDocument,\n RxDocumentData\n} from './types/index.d.ts';\nimport {\n getFromMapOrThrow,\n getHeightOfRevision,\n overwriteGetterForCaching,\n requestIdlePromiseNoQueue\n} from './plugins/utils/index.ts';\nimport {\n overwritable\n} from './overwritable.ts';\nimport { Observable } from 'rxjs';\n\n/**\n * Because we have to create many cache items,\n * we use an array instead of an object with properties\n * for better performance and less memory usage.\n * @link https://stackoverflow.com/questions/17295056/array-vs-object-efficiency-in-javascript\n */\ndeclare type CacheItem = [\n /**\n * Store the different document states of time\n * based on their revision height (rev height = array index).\n * We store WeakRefs so that we can later clean up\n * document states that are no longer needed.\n */\n Map>>,\n\n /**\n * Store the latest known document state.\n * As long as any state of the document is in the cache,\n * we observe the changestream and update the latestDoc accordingly.\n * This makes it easier to optimize performance on other parts\n * because for each known document we can always get the current state\n * in the storage.\n * Also it makes it possible to call RxDocument.latest() in a non-async way\n * to retrieve the latest document state or to observe$ some property.\n *\n * To not prevent the whole cacheItem from being garbage collected,\n * we store only the document data here, but not the RxDocument.\n */\n RxDocumentData\n];\n\n\n/**\n * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n */\ndeclare type FinalizationRegistryValue = {\n docId: string;\n revisionHeight: number;\n};\n\n/**\n * The DocumentCache stores RxDocument objects\n * by their primary key and revision.\n * This is useful on client side applications where\n * it is not known how much memory can be used, so\n * we de-duplicate RxDocument states to save memory.\n * To not fill up the memory with old document states, the DocumentCache\n * only contains weak references to the RxDocuments themself.\n * @link https://caniuse.com/?search=weakref\n */\nexport class DocumentCache {\n public readonly cacheItemByDocId = new Map>();\n\n /**\n * Process stuff lazy to not block the CPU\n * on critical paths.\n */\n public readonly tasks = new Set();\n\n /**\n * Some JavaScript runtimes like QuickJS,\n * so not have a FinalizationRegistry or WeakRef.\n * Therefore we need a workaround which might waste a lot of memory,\n * but at least works.\n */\n public readonly registry?: FinalizationRegistry = typeof FinalizationRegistry === 'function' ?\n new FinalizationRegistry(docMeta => {\n const docId = docMeta.docId;\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n cacheItem[0].delete(docMeta.revisionHeight);\n if (cacheItem[0].size === 0) {\n /**\n * No state of the document is cached anymore,\n * so we can clean up.\n */\n this.cacheItemByDocId.delete(docId);\n }\n }\n }) :\n undefined;\n\n constructor(\n public readonly primaryPath: string,\n public readonly changes$: Observable[]>,\n /**\n * A method that can create a RxDocument by the given document data.\n */\n public documentCreator: (docData: RxDocumentData) => RxDocument\n ) {\n changes$.subscribe(events => {\n this.tasks.add(() => {\n const cacheItemByDocId = this.cacheItemByDocId;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n const cacheItem = cacheItemByDocId.get(event.documentId);\n if (cacheItem) {\n let documentData = event.documentData;\n if (!documentData) {\n documentData = event.previousDocumentData as any;\n }\n cacheItem[1] = documentData;\n }\n }\n });\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n });\n }\n\n public processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n /**\n * Get the RxDocument from the cache\n * and create a new one if not exits before.\n * @overwrites itself with the actual function\n * because this is @performance relevant.\n * It is called on each document row for each write and read.\n */\n get getCachedRxDocuments(): (docsData: RxDocumentData[]) => RxDocument[] {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocuments',\n fn\n );\n }\n\n get getCachedRxDocument(): (docData: RxDocumentData) => RxDocument {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocument',\n doc => fn([doc])[0]\n );\n }\n\n /**\n * Throws if not exists\n */\n public getLatestDocumentData(docId: string): RxDocumentData {\n this.processTasks();\n const cacheItem = getFromMapOrThrow(this.cacheItemByDocId, docId);\n return cacheItem[1];\n }\n\n public getLatestDocumentDataIfExists(docId: string): RxDocumentData | undefined {\n this.processTasks();\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n return cacheItem[1];\n }\n }\n}\n\n/**\n * This function is called very very often.\n * This is likely the most important function for RxDB overall performance\n * @hotPath This is one of the most important methods for performance.\n * It is used in many places to transform the raw document data into RxDocuments.\n */\nfunction getCachedRxDocumentMonad(\n docCache: DocumentCache\n): (docsData: RxDocumentData[]) => RxDocument[] {\n const primaryPath = docCache.primaryPath;\n const cacheItemByDocId = docCache.cacheItemByDocId;\n const registry = docCache.registry;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n const documentCreator = docCache.documentCreator;\n const fn: (docsData: RxDocumentData[]) => RxDocument[] = (docsData: RxDocumentData[]) => {\n const ret: RxDocument[] = new Array(docsData.length);\n const registryTasks: RxDocument[] = [];\n for (let index = 0; index < docsData.length; index++) {\n let docData = docsData[index];\n const docId: string = (docData as any)[primaryPath];\n const revisionHeight = getHeightOfRevision(docData._rev);\n\n let byRev: Map>>;\n let cachedRxDocumentWeakRef: WeakRef> | undefined;\n let cacheItem = cacheItemByDocId.get(docId);\n if (!cacheItem) {\n byRev = new Map();\n cacheItem = [\n byRev,\n docData\n ];\n cacheItemByDocId.set(docId, cacheItem);\n } else {\n byRev = cacheItem[0];\n cachedRxDocumentWeakRef = byRev.get(revisionHeight);\n }\n let cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;\n if (!cachedRxDocument) {\n docData = deepFreezeWhenDevMode(docData) as any;\n cachedRxDocument = documentCreator(docData) as RxDocument;\n byRev.set(revisionHeight, createWeakRefWithFallback(cachedRxDocument));\n if (registry) {\n registryTasks.push(cachedRxDocument);\n }\n }\n ret[index] = cachedRxDocument;\n }\n if (registryTasks.length > 0 && registry) {\n /**\n * Calling registry.register() has shown to have\n * really bad performance. So we add the cached documents\n * lazily.\n */\n docCache.tasks.add(() => {\n for (let index = 0; index < registryTasks.length; index++) {\n const doc = registryTasks[index];\n registry.register(doc, {\n docId: doc.primary,\n revisionHeight: getHeightOfRevision(doc.revision)\n });\n }\n });\n if (docCache.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n docCache.processTasks();\n });\n }\n }\n return ret;\n };\n return fn;\n}\n\nexport function mapDocumentsDataToCacheDocs(\n docCache: DocumentCache,\n docsData: RxDocumentData[]\n) {\n const getCachedRxDocuments = docCache.getCachedRxDocuments;\n return getCachedRxDocuments(docsData);\n}\n\n/**\n * Fallback for JavaScript runtimes that do not support WeakRef.\n * The fallback will keep the items in cache forever,\n * but at least works.\n */\nconst HAS_WEAK_REF = typeof WeakRef === 'function';\nconst createWeakRefWithFallback = HAS_WEAK_REF ? createWeakRef : createWeakRefFallback;\nfunction createWeakRef(obj: T): WeakRef {\n return new WeakRef(obj) as any;\n}\nfunction createWeakRefFallback(obj: T): WeakRef {\n return {\n deref() {\n return obj;\n }\n } as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"doc-cache.js","names":["getFromMapOrThrow","getHeightOfRevision","overwriteGetterForCaching","requestIdlePromiseNoQueue","overwritable","DocumentCache","primaryPath","changes$","documentCreator","cacheItemByDocId","Map","tasks","Set","registry","FinalizationRegistry","docMeta","docId","cacheItem","get","delete","revisionHeight","size","undefined","subscribe","events","add","index","length","event","documentId","documentData","previousDocumentData","then","processTasks","_proto","prototype","Array","from","forEach","task","clear","getLatestDocumentData","getLatestDocumentDataIfExists","_createClass","key","fn","getCachedRxDocumentMonad","doc","docCache","deepFreezeWhenDevMode","docsData","ret","registryTasks","docData","_rev","byRev","cachedRxDocumentWeakRef","set","cachedRxDocument","deref","createWeakRefWithFallback","push","register","primary","revision","mapDocumentsDataToCacheDocs","getCachedRxDocuments","HAS_WEAK_REF","WeakRef","createWeakRef","createWeakRefFallback","obj"],"sources":["../../src/doc-cache.ts"],"sourcesContent":["import type {\n RxChangeEvent,\n RxDocument,\n RxDocumentData\n} from './types/index.d.ts';\nimport {\n getFromMapOrThrow,\n getHeightOfRevision,\n overwriteGetterForCaching,\n requestIdlePromiseNoQueue\n} from './plugins/utils/index.ts';\nimport {\n overwritable\n} from './overwritable.ts';\nimport { Observable } from 'rxjs';\n\n/**\n * Because we have to create many cache items,\n * we use an array instead of an object with properties\n * for better performance and less memory usage.\n * @link https://stackoverflow.com/questions/17295056/array-vs-object-efficiency-in-javascript\n */\ndeclare type CacheItem = [\n /**\n * Store the different document states of time\n * based on their revision height (rev height = array index).\n * We store WeakRefs so that we can later clean up\n * document states that are no longer needed.\n */\n Map>>,\n\n /**\n * Store the latest known document state.\n * As long as any state of the document is in the cache,\n * we observe the changestream and update the latestDoc accordingly.\n * This makes it easier to optimize performance on other parts\n * because for each known document we can always get the current state\n * in the storage.\n * Also it makes it possible to call RxDocument.latest() in a non-async way\n * to retrieve the latest document state or to observe$ some property.\n *\n * To not prevent the whole cacheItem from being garbage collected,\n * we store only the document data here, but not the RxDocument.\n */\n RxDocumentData\n];\n\n\n/**\n * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n */\ndeclare type FinalizationRegistryValue = {\n docId: string;\n revisionHeight: number;\n};\n\n/**\n * The DocumentCache stores RxDocument objects\n * by their primary key and revision.\n * This is useful on client side applications where\n * it is not known how much memory can be used, so\n * we de-duplicate RxDocument states to save memory.\n * To not fill up the memory with old document states, the DocumentCache\n * only contains weak references to the RxDocuments themself.\n * @link https://caniuse.com/?search=weakref\n */\nexport class DocumentCache {\n public readonly cacheItemByDocId = new Map>();\n\n /**\n * Process stuff lazy to not block the CPU\n * on critical paths.\n */\n public readonly tasks = new Set();\n\n /**\n * Some JavaScript runtimes like QuickJS,\n * so not have a FinalizationRegistry or WeakRef.\n * Therefore we need a workaround which might waste a lot of memory,\n * but at least works.\n */\n public readonly registry?: FinalizationRegistry = typeof FinalizationRegistry === 'function' ?\n new FinalizationRegistry(docMeta => {\n const docId = docMeta.docId;\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n cacheItem[0].delete(docMeta.revisionHeight);\n if (cacheItem[0].size === 0) {\n /**\n * No state of the document is cached anymore,\n * so we can clean up.\n */\n this.cacheItemByDocId.delete(docId);\n }\n }\n }) :\n undefined;\n\n constructor(\n public readonly primaryPath: string,\n public readonly changes$: Observable[]>,\n /**\n * A method that can create a RxDocument by the given document data.\n */\n public documentCreator: (docData: RxDocumentData) => RxDocument\n ) {\n changes$.subscribe(events => {\n this.tasks.add(() => {\n const cacheItemByDocId = this.cacheItemByDocId;\n for (let index = 0; index < events.length; index++) {\n const event = events[index];\n const cacheItem = cacheItemByDocId.get(event.documentId);\n if (cacheItem) {\n let documentData = event.documentData;\n if (!documentData) {\n documentData = event.previousDocumentData as any;\n }\n cacheItem[1] = documentData;\n }\n }\n });\n if (this.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n this.processTasks();\n });\n }\n });\n }\n\n public processTasks() {\n if (this.tasks.size === 0) {\n return;\n }\n const tasks = Array.from(this.tasks);\n tasks.forEach(task => task());\n this.tasks.clear();\n }\n\n /**\n * Get the RxDocument from the cache\n * and create a new one if not exits before.\n * @overwrites itself with the actual function\n * because this is @performance relevant.\n * It is called on each document row for each write and read.\n */\n get getCachedRxDocuments(): (docsData: RxDocumentData[]) => RxDocument[] {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocuments',\n fn\n );\n }\n\n get getCachedRxDocument(): (docData: RxDocumentData) => RxDocument {\n const fn = getCachedRxDocumentMonad(this);\n return overwriteGetterForCaching(\n this,\n 'getCachedRxDocument',\n doc => fn([doc])[0]\n );\n }\n\n /**\n * Throws if not exists\n */\n public getLatestDocumentData(docId: string): RxDocumentData {\n this.processTasks();\n const cacheItem = getFromMapOrThrow(this.cacheItemByDocId, docId);\n return cacheItem[1];\n }\n\n public getLatestDocumentDataIfExists(docId: string): RxDocumentData | undefined {\n this.processTasks();\n const cacheItem = this.cacheItemByDocId.get(docId);\n if (cacheItem) {\n return cacheItem[1];\n }\n }\n}\n\n/**\n * This function is called very very often.\n * This is likely the most important function for RxDB overall performance\n * @hotPath This is one of the most important methods for performance.\n * It is used in many places to transform the raw document data into RxDocuments.\n */\nfunction getCachedRxDocumentMonad(\n docCache: DocumentCache\n): (docsData: RxDocumentData[]) => RxDocument[] {\n const primaryPath = docCache.primaryPath;\n const cacheItemByDocId = docCache.cacheItemByDocId;\n const registry = docCache.registry;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n const documentCreator = docCache.documentCreator;\n const fn: (docsData: RxDocumentData[]) => RxDocument[] = (docsData: RxDocumentData[]) => {\n const ret: RxDocument[] = new Array(docsData.length);\n const registryTasks: RxDocument[] = [];\n for (let index = 0; index < docsData.length; index++) {\n let docData = docsData[index];\n const docId: string = (docData as any)[primaryPath];\n const revisionHeight = getHeightOfRevision(docData._rev);\n\n let byRev: Map>>;\n let cachedRxDocumentWeakRef: WeakRef> | undefined;\n let cacheItem = cacheItemByDocId.get(docId);\n if (!cacheItem) {\n byRev = new Map();\n cacheItem = [\n byRev,\n docData\n ];\n cacheItemByDocId.set(docId, cacheItem);\n } else {\n byRev = cacheItem[0];\n cachedRxDocumentWeakRef = byRev.get(revisionHeight);\n }\n let cachedRxDocument = cachedRxDocumentWeakRef ? cachedRxDocumentWeakRef.deref() : undefined;\n if (!cachedRxDocument) {\n docData = deepFreezeWhenDevMode(docData) as any;\n cachedRxDocument = documentCreator(docData) as RxDocument;\n byRev.set(revisionHeight, createWeakRefWithFallback(cachedRxDocument));\n if (registry) {\n registryTasks.push(cachedRxDocument);\n }\n }\n ret[index] = cachedRxDocument;\n }\n if (registryTasks.length > 0 && registry) {\n /**\n * Calling registry.register() has shown to have\n * really bad performance. So we add the cached documents\n * lazily.\n */\n docCache.tasks.add(() => {\n for (let index = 0; index < registryTasks.length; index++) {\n const doc = registryTasks[index];\n registry.register(doc, {\n docId: doc.primary,\n revisionHeight: getHeightOfRevision(doc.revision)\n });\n }\n });\n if (docCache.tasks.size <= 1) {\n requestIdlePromiseNoQueue().then(() => {\n docCache.processTasks();\n });\n }\n }\n return ret;\n };\n return fn;\n}\n\nexport function mapDocumentsDataToCacheDocs(\n docCache: DocumentCache,\n docsData: RxDocumentData[]\n) {\n const getCachedRxDocuments = docCache.getCachedRxDocuments;\n return getCachedRxDocuments(docsData);\n}\n\n/**\n * Fallback for JavaScript runtimes that do not support WeakRef.\n * The fallback will keep the items in cache forever,\n * but at least works.\n */\nconst HAS_WEAK_REF = typeof WeakRef === 'function';\nconst createWeakRefWithFallback = HAS_WEAK_REF ? createWeakRef : createWeakRefFallback;\nfunction createWeakRef(obj: T): WeakRef {\n return new WeakRef(obj) as any;\n}\nfunction createWeakRefFallback(obj: T): WeakRef {\n return {\n deref() {\n return obj;\n }\n } as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/incremental-write.js.map b/dist/esm/incremental-write.js.map index 1f2e4a8af37..8130123368f 100644 --- a/dist/esm/incremental-write.js.map +++ b/dist/esm/incremental-write.js.map @@ -1 +1 @@ -{"version":3,"file":"incremental-write.js","names":["isBulkWriteConflictError","rxStorageWriteErrorToRxError","clone","ensureNotFalsy","getFromMapOrCreate","getFromMapOrThrow","getHeightOfRevision","stripMetaDataFromDocument","IncrementalWriteQueue","storageInstance","primaryPath","preWrite","postWrite","queueByDocId","Map","isRunning","_proto","prototype","addWrite","lastKnownDocumentState","modifier","docId","ar","ret","Promise","resolve","reject","item","push","triggerRun","size","writeRows","itemsById","all","Array","from","entries","map","_docId","items","oldData","findNewestOfDocumentStates","i","newData","err","forEach","previous","document","writeResult","length","bulkWrite","error","success","result","documentId","isConflict","reverse","documentInDb","unshift","rxError","modifierFromPublicToInternal","publicModifier","docData","withoutMeta","_deleted","modified","reattachedMeta","Object","assign","_meta","_attachments","_rev","docs","newest","newestRevisionHeight","doc","height"],"sources":["../../src/incremental-write.ts"],"sourcesContent":["import {\n isBulkWriteConflictError,\n rxStorageWriteErrorToRxError\n} from './rx-error.ts';\nimport type {\n ModifyFunction,\n BulkWriteRow,\n MaybePromise,\n RxDocumentData,\n RxDocumentWriteData,\n RxError,\n RxStorageBulkWriteResponse,\n RxStorageInstance,\n StringKeys,\n WithDeleted\n} from './types/index.d.ts';\nimport {\n clone,\n ensureNotFalsy,\n getFromMapOrCreate,\n getFromMapOrThrow,\n getHeightOfRevision,\n stripMetaDataFromDocument\n} from './plugins/utils/index.ts';\n\n\n\nexport type IncrementalWriteModifier = (\n doc: RxDocumentData\n) => MaybePromise> | MaybePromise>;\n\n\ntype IncrementalWriteQueueItem = {\n lastKnownDocumentState: RxDocumentData;\n modifier: IncrementalWriteModifier;\n resolve: (d: RxDocumentData) => void;\n reject: (error: RxError) => void;\n};\n\n/**\n * The incremental write queue\n * batches up all incremental writes to a collection\n * so that performance can be improved by:\n * - Running only one write even when there are multiple modifications to the same document.\n * - Run all writes ins a single bulkWrite() call even when there are writes to many documents.\n */\nexport class IncrementalWriteQueue {\n public queueByDocId = new Map[]>();\n public isRunning: boolean = false;\n\n constructor(\n public readonly storageInstance: RxStorageInstance,\n public readonly primaryPath: StringKeys>,\n // can be used to run hooks etc.\n public readonly preWrite: (newData: RxDocumentData, oldData: RxDocumentData) => MaybePromise,\n public readonly postWrite: (docData: RxDocumentData) => void\n\n ) { }\n\n addWrite(\n lastKnownDocumentState: RxDocumentData,\n modifier: IncrementalWriteModifier\n ): Promise> {\n const docId: string = lastKnownDocumentState[this.primaryPath] as any;\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n const ret = new Promise>((resolve, reject) => {\n const item: IncrementalWriteQueueItem = {\n lastKnownDocumentState,\n modifier,\n resolve,\n reject\n };\n ensureNotFalsy(ar).push(item);\n this.triggerRun();\n });\n return ret;\n }\n\n async triggerRun(): Promise {\n if (\n this.isRunning === true ||\n this.queueByDocId.size === 0\n ) {\n // already running\n return;\n }\n this.isRunning = true;\n const writeRows: BulkWriteRow[] = [];\n\n /**\n * 'take over' so that while the async functions runs,\n * new incremental updates could be added from the outside.\n */\n const itemsById = this.queueByDocId;\n this.queueByDocId = new Map();\n await Promise.all(\n Array.from(itemsById.entries())\n .map(async ([_docId, items]) => {\n const oldData = findNewestOfDocumentStates(\n items.map(i => i.lastKnownDocumentState)\n );\n let newData = oldData;\n for (const item of items) {\n try {\n newData = await item.modifier(\n /**\n * We have to clone() each time because the modifier\n * might throw while it already changed some properties\n * of the document.\n */\n clone(newData)\n ) as any;\n } catch (err: any) {\n item.reject(err);\n item.reject = () => { };\n item.resolve = () => { };\n }\n }\n\n try {\n await this.preWrite(newData, oldData);\n } catch (err: any) {\n /**\n * If the before-hooks fail,\n * we reject all of the writes because it is\n * not possible to determine which one is to blame.\n */\n items.forEach(item => item.reject(err));\n return;\n }\n writeRows.push({\n previous: oldData,\n document: newData\n });\n })\n );\n const writeResult: RxStorageBulkWriteResponse = writeRows.length > 0 ?\n await this.storageInstance.bulkWrite(writeRows, 'incremental-write') :\n { error: [], success: [] };\n\n // process success\n await Promise.all(\n writeResult.success.map(result => {\n const docId = result[this.primaryPath] as string;\n this.postWrite(result);\n const items = getFromMapOrThrow(itemsById, docId);\n items.forEach(item => item.resolve(result));\n })\n );\n\n // process errors\n writeResult.error\n .forEach(error => {\n const docId = error.documentId;\n const items = getFromMapOrThrow(itemsById, docId);\n const isConflict = isBulkWriteConflictError(error);\n if (isConflict) {\n // had conflict -> retry afterwards\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n /**\n * Add the items back to this.queueByDocId\n * by maintaining the original order.\n */\n items\n .reverse()\n .forEach(item => {\n item.lastKnownDocumentState = ensureNotFalsy(isConflict.documentInDb);\n ensureNotFalsy(ar).unshift(item);\n });\n } else {\n // other error -> must be thrown\n const rxError = rxStorageWriteErrorToRxError(error);\n items.forEach(item => item.reject(rxError));\n }\n });\n this.isRunning = false;\n\n /**\n * Always trigger another run\n * because in between there might be new items\n * been added to the queue.\n */\n return this.triggerRun();\n }\n}\n\n\nexport function modifierFromPublicToInternal(\n publicModifier: ModifyFunction\n): IncrementalWriteModifier {\n const ret = async (docData: RxDocumentData) => {\n const withoutMeta: WithDeleted = stripMetaDataFromDocument(docData) as any;\n withoutMeta._deleted = docData._deleted;\n const modified = await publicModifier(withoutMeta);\n const reattachedMeta: RxDocumentData = Object.assign({}, modified, {\n _meta: docData._meta,\n _attachments: docData._attachments,\n _rev: docData._rev,\n _deleted: typeof (modified as WithDeleted)._deleted !== 'undefined' ?\n (modified as WithDeleted)._deleted :\n docData._deleted\n });\n if (typeof reattachedMeta._deleted === 'undefined') {\n reattachedMeta._deleted = false;\n }\n return reattachedMeta;\n };\n return ret;\n}\n\n\nexport function findNewestOfDocumentStates(\n docs: RxDocumentData[]\n): RxDocumentData {\n\n let newest = docs[0];\n let newestRevisionHeight = getHeightOfRevision(newest._rev);\n docs.forEach(doc => {\n const height = getHeightOfRevision(doc._rev);\n if (height > newestRevisionHeight) {\n newest = doc;\n newestRevisionHeight = height;\n }\n });\n return newest;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"incremental-write.js","names":["isBulkWriteConflictError","rxStorageWriteErrorToRxError","clone","ensureNotFalsy","getFromMapOrCreate","getFromMapOrThrow","getHeightOfRevision","stripMetaDataFromDocument","IncrementalWriteQueue","storageInstance","primaryPath","preWrite","postWrite","queueByDocId","Map","isRunning","_proto","prototype","addWrite","lastKnownDocumentState","modifier","docId","ar","ret","Promise","resolve","reject","item","push","triggerRun","size","writeRows","itemsById","all","Array","from","entries","map","_docId","items","oldData","findNewestOfDocumentStates","i","newData","err","forEach","previous","document","writeResult","length","bulkWrite","error","success","result","documentId","isConflict","reverse","documentInDb","unshift","rxError","modifierFromPublicToInternal","publicModifier","docData","withoutMeta","_deleted","modified","reattachedMeta","Object","assign","_meta","_attachments","_rev","docs","newest","newestRevisionHeight","doc","height"],"sources":["../../src/incremental-write.ts"],"sourcesContent":["import {\n isBulkWriteConflictError,\n rxStorageWriteErrorToRxError\n} from './rx-error.ts';\nimport type {\n ModifyFunction,\n BulkWriteRow,\n MaybePromise,\n RxDocumentData,\n RxDocumentWriteData,\n RxError,\n RxStorageBulkWriteResponse,\n RxStorageInstance,\n StringKeys,\n WithDeleted\n} from './types/index.d.ts';\nimport {\n clone,\n ensureNotFalsy,\n getFromMapOrCreate,\n getFromMapOrThrow,\n getHeightOfRevision,\n stripMetaDataFromDocument\n} from './plugins/utils/index.ts';\n\n\n\nexport type IncrementalWriteModifier = (\n doc: RxDocumentData\n) => MaybePromise> | MaybePromise>;\n\n\ntype IncrementalWriteQueueItem = {\n lastKnownDocumentState: RxDocumentData;\n modifier: IncrementalWriteModifier;\n resolve: (d: RxDocumentData) => void;\n reject: (error: RxError) => void;\n};\n\n/**\n * The incremental write queue\n * batches up all incremental writes to a collection\n * so that performance can be improved by:\n * - Running only one write even when there are multiple modifications to the same document.\n * - Run all writes ins a single bulkWrite() call even when there are writes to many documents.\n */\nexport class IncrementalWriteQueue {\n public queueByDocId = new Map[]>();\n public isRunning: boolean = false;\n\n constructor(\n public readonly storageInstance: RxStorageInstance,\n public readonly primaryPath: StringKeys>,\n // can be used to run hooks etc.\n public readonly preWrite: (newData: RxDocumentData, oldData: RxDocumentData) => MaybePromise,\n public readonly postWrite: (docData: RxDocumentData) => void\n\n ) { }\n\n addWrite(\n lastKnownDocumentState: RxDocumentData,\n modifier: IncrementalWriteModifier\n ): Promise> {\n const docId: string = lastKnownDocumentState[this.primaryPath] as any;\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n const ret = new Promise>((resolve, reject) => {\n const item: IncrementalWriteQueueItem = {\n lastKnownDocumentState,\n modifier,\n resolve,\n reject\n };\n ensureNotFalsy(ar).push(item);\n this.triggerRun();\n });\n return ret;\n }\n\n async triggerRun(): Promise {\n if (\n this.isRunning === true ||\n this.queueByDocId.size === 0\n ) {\n // already running\n return;\n }\n this.isRunning = true;\n const writeRows: BulkWriteRow[] = [];\n\n /**\n * 'take over' so that while the async functions runs,\n * new incremental updates could be added from the outside.\n */\n const itemsById = this.queueByDocId;\n this.queueByDocId = new Map();\n await Promise.all(\n Array.from(itemsById.entries())\n .map(async ([_docId, items]) => {\n const oldData = findNewestOfDocumentStates(\n items.map(i => i.lastKnownDocumentState)\n );\n let newData = oldData;\n for (const item of items) {\n try {\n newData = await item.modifier(\n /**\n * We have to clone() each time because the modifier\n * might throw while it already changed some properties\n * of the document.\n */\n clone(newData)\n ) as any;\n } catch (err: any) {\n item.reject(err);\n item.reject = () => { };\n item.resolve = () => { };\n }\n }\n\n try {\n await this.preWrite(newData, oldData);\n } catch (err: any) {\n /**\n * If the before-hooks fail,\n * we reject all of the writes because it is\n * not possible to determine which one is to blame.\n */\n items.forEach(item => item.reject(err));\n return;\n }\n writeRows.push({\n previous: oldData,\n document: newData\n });\n })\n );\n const writeResult: RxStorageBulkWriteResponse = writeRows.length > 0 ?\n await this.storageInstance.bulkWrite(writeRows, 'incremental-write') :\n { error: [], success: [] };\n\n // process success\n await Promise.all(\n writeResult.success.map(result => {\n const docId = result[this.primaryPath] as string;\n this.postWrite(result);\n const items = getFromMapOrThrow(itemsById, docId);\n items.forEach(item => item.resolve(result));\n })\n );\n\n // process errors\n writeResult.error\n .forEach(error => {\n const docId = error.documentId;\n const items = getFromMapOrThrow(itemsById, docId);\n const isConflict = isBulkWriteConflictError(error);\n if (isConflict) {\n // had conflict -> retry afterwards\n const ar = getFromMapOrCreate(this.queueByDocId, docId, () => []);\n /**\n * Add the items back to this.queueByDocId\n * by maintaining the original order.\n */\n items\n .reverse()\n .forEach(item => {\n item.lastKnownDocumentState = ensureNotFalsy(isConflict.documentInDb);\n ensureNotFalsy(ar).unshift(item);\n });\n } else {\n // other error -> must be thrown\n const rxError = rxStorageWriteErrorToRxError(error);\n items.forEach(item => item.reject(rxError));\n }\n });\n this.isRunning = false;\n\n /**\n * Always trigger another run\n * because in between there might be new items\n * been added to the queue.\n */\n return this.triggerRun();\n }\n}\n\n\nexport function modifierFromPublicToInternal(\n publicModifier: ModifyFunction\n): IncrementalWriteModifier {\n const ret = async (docData: RxDocumentData) => {\n const withoutMeta: WithDeleted = stripMetaDataFromDocument(docData) as any;\n withoutMeta._deleted = docData._deleted;\n const modified = await publicModifier(withoutMeta);\n const reattachedMeta: RxDocumentData = Object.assign({}, modified, {\n _meta: docData._meta,\n _attachments: docData._attachments,\n _rev: docData._rev,\n _deleted: typeof (modified as WithDeleted)._deleted !== 'undefined' ?\n (modified as WithDeleted)._deleted :\n docData._deleted\n });\n if (typeof reattachedMeta._deleted === 'undefined') {\n reattachedMeta._deleted = false;\n }\n return reattachedMeta;\n };\n return ret;\n}\n\n\nexport function findNewestOfDocumentStates(\n docs: RxDocumentData[]\n): RxDocumentData {\n\n let newest = docs[0];\n let newestRevisionHeight = getHeightOfRevision(newest._rev);\n docs.forEach(doc => {\n const height = getHeightOfRevision(doc._rev);\n if (height > newestRevisionHeight) {\n newest = doc;\n newestRevisionHeight = height;\n }\n });\n return newest;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/attachments/index.js.map b/dist/esm/plugins/attachments/index.js.map index 91996e602a4..4c04a74fae1 100644 --- a/dist/esm/plugins/attachments/index.js.map +++ b/dist/esm/plugins/attachments/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["map","blobToBase64String","blobToString","createBlobFromBase64","flatClone","getBlobSize","PROMISE_RESOLVE_VOID","assignMethodsToAttachment","ensureSchemaSupportsAttachments","RxAttachment","doc","id","type","length","digest","_proto","prototype","remove","collection","incrementalWriteQueue","addWrite","_data","docWriteData","_attachments","then","getData","plainDataBase64","storageInstance","getAttachmentData","primary","ret","getStringData","data","asString","fromStorageInstanceResult","attachmentData","rxDocument","putAttachment","dataSize","dataString","database","hashFunction","writeResult","newDocument","_docCache","getCachedRxDocument","attachmentDataOfId","attachment","getAttachment","docData","allAttachments","Object","keys","preMigrateDocument","attachments","newAttachments","Promise","all","attachmentId","docPrimary","oldCollection","schema","primaryPath","rawAttachmentData","postMigrateDocument","_action","RxDBAttachmentsPlugin","name","rxdb","prototypes","RxDocument","proto","defineProperty","get","allAttachments$","$","pipe","entries","toJSON","overwritable","hooks","after"],"sources":["../../../../src/plugins/attachments/index.ts"],"sourcesContent":["import {\n map\n} from 'rxjs';\n\nimport {\n blobToBase64String,\n blobToString,\n createBlobFromBase64,\n flatClone,\n getBlobSize,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport type {\n RxDocument,\n RxPlugin,\n RxDocumentWriteData,\n RxAttachmentData,\n RxDocumentData,\n RxAttachmentCreator,\n RxAttachmentWriteData\n} from '../../types/index.ts';\nimport { assignMethodsToAttachment, ensureSchemaSupportsAttachments } from './attachments-utils.ts';\n\n\n\n/**\n * an RxAttachment is basically just the attachment-stub\n * wrapped so that you can access the attachment-data\n */\nexport class RxAttachment {\n public doc: RxDocument;\n public id: string;\n public type: string;\n public length: number;\n public digest: string;\n constructor({\n doc,\n id,\n type,\n length,\n digest\n }: any) {\n this.doc = doc;\n this.id = id;\n this.type = type;\n this.length = length;\n this.digest = digest;\n\n assignMethodsToAttachment(this);\n }\n\n remove(): Promise {\n return this.doc.collection.incrementalWriteQueue.addWrite(\n this.doc._data,\n docWriteData => {\n delete docWriteData._attachments[this.id];\n return docWriteData;\n }\n ).then(() => { });\n }\n\n /**\n * returns the data for the attachment\n */\n async getData(): Promise {\n const plainDataBase64 = await this.doc.collection.storageInstance.getAttachmentData(\n this.doc.primary,\n this.id,\n this.digest\n );\n const ret = await createBlobFromBase64(\n plainDataBase64,\n this.type as any\n );\n return ret;\n }\n\n async getStringData(): Promise {\n const data = await this.getData();\n const asString = await blobToString(data);\n return asString;\n }\n}\n\nexport function fromStorageInstanceResult(\n id: string,\n attachmentData: RxAttachmentData,\n rxDocument: RxDocument\n) {\n return new RxAttachment({\n doc: rxDocument,\n id,\n type: attachmentData.type,\n length: attachmentData.length,\n digest: attachmentData.digest\n });\n}\n\n\n\nexport async function putAttachment(\n this: RxDocument,\n attachmentData: RxAttachmentCreator\n): Promise {\n ensureSchemaSupportsAttachments(this);\n\n const dataSize = getBlobSize(attachmentData.data);\n const dataString = await blobToBase64String(attachmentData.data);\n const digest = await this.collection.database.hashFunction(dataString);\n\n const id = attachmentData.id;\n const type = attachmentData.type;\n const data = dataString;\n\n return this.collection.incrementalWriteQueue.addWrite(\n this._data,\n (docWriteData: RxDocumentWriteData) => {\n docWriteData = flatClone(docWriteData);\n docWriteData._attachments = flatClone(docWriteData._attachments);\n docWriteData._attachments[id] = {\n length: dataSize,\n type,\n data,\n digest\n };\n return docWriteData;\n }).then(writeResult => {\n const newDocument = this.collection._docCache.getCachedRxDocument(writeResult);\n const attachmentDataOfId = writeResult._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentDataOfId,\n newDocument\n );\n return attachment;\n });\n}\n\n/**\n * get an attachment of the document by its id\n */\nexport function getAttachment(\n this: RxDocument,\n id: string\n): RxAttachment | null {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n if (!docData._attachments || !docData._attachments[id])\n return null;\n\n const attachmentData = docData._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n return attachment;\n}\n\n/**\n * returns all attachments of the document\n */\nexport function allAttachments(\n this: RxDocument\n): RxAttachment[] {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n\n // if there are no attachments, the field is missing\n if (!docData._attachments) {\n return [];\n }\n return Object.keys(docData._attachments)\n .map(id => {\n return fromStorageInstanceResult(\n id,\n docData._attachments[id],\n this\n );\n });\n}\n\nexport async function preMigrateDocument(\n data: {\n docData: RxDocumentData;\n oldCollection: any; // TODO\n }\n): Promise {\n const attachments = data.docData._attachments;\n if (attachments) {\n const newAttachments: { [attachmentId: string]: RxAttachmentWriteData; } = {};\n await Promise.all(\n Object.keys(attachments).map(async (attachmentId) => {\n const attachment: RxAttachmentData = attachments[attachmentId];\n const docPrimary: string = (data.docData as any)[data.oldCollection.schema.primaryPath];\n const rawAttachmentData = await data.oldCollection.storageInstance.getAttachmentData(\n docPrimary,\n attachmentId,\n attachment.digest\n );\n const digest = await data.oldCollection.database.hashFunction(rawAttachmentData);\n newAttachments[attachmentId] = {\n length: attachment.length,\n type: attachment.type,\n data: rawAttachmentData,\n digest\n };\n })\n );\n\n /**\n * Hooks mutate the input\n * instead of returning stuff\n */\n (data.docData as RxDocumentWriteData)._attachments = newAttachments;\n }\n}\n\nexport function postMigrateDocument(_action: any): Promise {\n /**\n * No longer needed because\n * we store the attachments data buffers directly in the document.\n */\n return PROMISE_RESOLVE_VOID;\n}\n\nexport const RxDBAttachmentsPlugin: RxPlugin = {\n name: 'attachments',\n rxdb: true,\n prototypes: {\n RxDocument: (proto: any) => {\n proto.putAttachment = putAttachment;\n proto.getAttachment = getAttachment;\n proto.allAttachments = allAttachments;\n Object.defineProperty(proto, 'allAttachments$', {\n get: function allAttachments$(this: RxDocument) {\n return this.$\n .pipe(\n map(rxDocument => Object.entries(\n rxDocument.toJSON(true)._attachments\n )),\n map(entries => {\n return (entries as any)\n .map(([id, attachmentData]: any) => {\n return fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n });\n })\n );\n }\n });\n }\n },\n overwritable: {},\n hooks: {\n preMigrateDocument: {\n after: preMigrateDocument\n },\n postMigrateDocument: {\n after: postMigrateDocument\n }\n }\n};\n\n\nexport * from './attachments-utils.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["map","blobToBase64String","blobToString","createBlobFromBase64","flatClone","getBlobSize","PROMISE_RESOLVE_VOID","assignMethodsToAttachment","ensureSchemaSupportsAttachments","RxAttachment","doc","id","type","length","digest","_proto","prototype","remove","collection","incrementalWriteQueue","addWrite","_data","docWriteData","_attachments","then","getData","plainDataBase64","storageInstance","getAttachmentData","primary","ret","getStringData","data","asString","fromStorageInstanceResult","attachmentData","rxDocument","putAttachment","dataSize","dataString","database","hashFunction","writeResult","newDocument","_docCache","getCachedRxDocument","attachmentDataOfId","attachment","getAttachment","docData","allAttachments","Object","keys","preMigrateDocument","attachments","newAttachments","Promise","all","attachmentId","docPrimary","oldCollection","schema","primaryPath","rawAttachmentData","postMigrateDocument","_action","RxDBAttachmentsPlugin","name","rxdb","prototypes","RxDocument","proto","defineProperty","get","allAttachments$","$","pipe","entries","toJSON","overwritable","hooks","after"],"sources":["../../../../src/plugins/attachments/index.ts"],"sourcesContent":["import {\n map\n} from 'rxjs';\n\nimport {\n blobToBase64String,\n blobToString,\n createBlobFromBase64,\n flatClone,\n getBlobSize,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport type {\n RxDocument,\n RxPlugin,\n RxDocumentWriteData,\n RxAttachmentData,\n RxDocumentData,\n RxAttachmentCreator,\n RxAttachmentWriteData\n} from '../../types/index.ts';\nimport { assignMethodsToAttachment, ensureSchemaSupportsAttachments } from './attachments-utils.ts';\n\n\n\n/**\n * an RxAttachment is basically just the attachment-stub\n * wrapped so that you can access the attachment-data\n */\nexport class RxAttachment {\n public doc: RxDocument;\n public id: string;\n public type: string;\n public length: number;\n public digest: string;\n constructor({\n doc,\n id,\n type,\n length,\n digest\n }: any) {\n this.doc = doc;\n this.id = id;\n this.type = type;\n this.length = length;\n this.digest = digest;\n\n assignMethodsToAttachment(this);\n }\n\n remove(): Promise {\n return this.doc.collection.incrementalWriteQueue.addWrite(\n this.doc._data,\n docWriteData => {\n delete docWriteData._attachments[this.id];\n return docWriteData;\n }\n ).then(() => { });\n }\n\n /**\n * returns the data for the attachment\n */\n async getData(): Promise {\n const plainDataBase64 = await this.doc.collection.storageInstance.getAttachmentData(\n this.doc.primary,\n this.id,\n this.digest\n );\n const ret = await createBlobFromBase64(\n plainDataBase64,\n this.type as any\n );\n return ret;\n }\n\n async getStringData(): Promise {\n const data = await this.getData();\n const asString = await blobToString(data);\n return asString;\n }\n}\n\nexport function fromStorageInstanceResult(\n id: string,\n attachmentData: RxAttachmentData,\n rxDocument: RxDocument\n) {\n return new RxAttachment({\n doc: rxDocument,\n id,\n type: attachmentData.type,\n length: attachmentData.length,\n digest: attachmentData.digest\n });\n}\n\n\n\nexport async function putAttachment(\n this: RxDocument,\n attachmentData: RxAttachmentCreator\n): Promise {\n ensureSchemaSupportsAttachments(this);\n\n const dataSize = getBlobSize(attachmentData.data);\n const dataString = await blobToBase64String(attachmentData.data);\n const digest = await this.collection.database.hashFunction(dataString);\n\n const id = attachmentData.id;\n const type = attachmentData.type;\n const data = dataString;\n\n return this.collection.incrementalWriteQueue.addWrite(\n this._data,\n (docWriteData: RxDocumentWriteData) => {\n docWriteData = flatClone(docWriteData);\n docWriteData._attachments = flatClone(docWriteData._attachments);\n docWriteData._attachments[id] = {\n length: dataSize,\n type,\n data,\n digest\n };\n return docWriteData;\n }).then(writeResult => {\n const newDocument = this.collection._docCache.getCachedRxDocument(writeResult);\n const attachmentDataOfId = writeResult._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentDataOfId,\n newDocument\n );\n return attachment;\n });\n}\n\n/**\n * get an attachment of the document by its id\n */\nexport function getAttachment(\n this: RxDocument,\n id: string\n): RxAttachment | null {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n if (!docData._attachments || !docData._attachments[id])\n return null;\n\n const attachmentData = docData._attachments[id];\n const attachment = fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n return attachment;\n}\n\n/**\n * returns all attachments of the document\n */\nexport function allAttachments(\n this: RxDocument\n): RxAttachment[] {\n ensureSchemaSupportsAttachments(this);\n const docData: any = this._data;\n\n // if there are no attachments, the field is missing\n if (!docData._attachments) {\n return [];\n }\n return Object.keys(docData._attachments)\n .map(id => {\n return fromStorageInstanceResult(\n id,\n docData._attachments[id],\n this\n );\n });\n}\n\nexport async function preMigrateDocument(\n data: {\n docData: RxDocumentData;\n oldCollection: any; // TODO\n }\n): Promise {\n const attachments = data.docData._attachments;\n if (attachments) {\n const newAttachments: { [attachmentId: string]: RxAttachmentWriteData; } = {};\n await Promise.all(\n Object.keys(attachments).map(async (attachmentId) => {\n const attachment: RxAttachmentData = attachments[attachmentId];\n const docPrimary: string = (data.docData as any)[data.oldCollection.schema.primaryPath];\n const rawAttachmentData = await data.oldCollection.storageInstance.getAttachmentData(\n docPrimary,\n attachmentId,\n attachment.digest\n );\n const digest = await data.oldCollection.database.hashFunction(rawAttachmentData);\n newAttachments[attachmentId] = {\n length: attachment.length,\n type: attachment.type,\n data: rawAttachmentData,\n digest\n };\n })\n );\n\n /**\n * Hooks mutate the input\n * instead of returning stuff\n */\n (data.docData as RxDocumentWriteData)._attachments = newAttachments;\n }\n}\n\nexport function postMigrateDocument(_action: any): Promise {\n /**\n * No longer needed because\n * we store the attachments data buffers directly in the document.\n */\n return PROMISE_RESOLVE_VOID;\n}\n\nexport const RxDBAttachmentsPlugin: RxPlugin = {\n name: 'attachments',\n rxdb: true,\n prototypes: {\n RxDocument: (proto: any) => {\n proto.putAttachment = putAttachment;\n proto.getAttachment = getAttachment;\n proto.allAttachments = allAttachments;\n Object.defineProperty(proto, 'allAttachments$', {\n get: function allAttachments$(this: RxDocument) {\n return this.$\n .pipe(\n map(rxDocument => Object.entries(\n rxDocument.toJSON(true)._attachments\n )),\n map(entries => {\n return (entries as any)\n .map(([id, attachmentData]: any) => {\n return fromStorageInstanceResult(\n id,\n attachmentData,\n this\n );\n });\n })\n );\n }\n });\n }\n },\n overwritable: {},\n hooks: {\n preMigrateDocument: {\n after: preMigrateDocument\n },\n postMigrateDocument: {\n after: postMigrateDocument\n }\n }\n};\n\n\nexport * from './attachments-utils.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/backup/index.js.map b/dist/esm/plugins/backup/index.js.map index 4886b28ed56..132ec6db74a 100644 --- a/dist/esm/plugins/backup/index.js.map +++ b/dist/esm/plugins/backup/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["path","BehaviorSubject","firstValueFrom","Subject","filter","map","getFromMapOrCreate","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","clearFolder","deleteFolder","documentFolder","ensureFolderExists","getMeta","prepareFolders","setMeta","writeJsonToFile","writeToFile","getChangedDocumentsSince","backupSingleDocument","rxDocument","options","data","toJSON","writtenFiles","docFolder","primary","fileLocation","join","push","attachments","attachmentsFolder","allAttachments","Promise","all","attachment","content","getData","attachmentFileLocation","id","BACKUP_STATES_BY_DB","WeakMap","addToBackupStates","db","state","ar","RxBackupState","database","isStopped","subs","persistRunning","initialReplicationDone$","internalWriteEvents$","writeEvents$","asObservable","batchSize","_proto","prototype","persistOnce","then","_persistOnce","_this","meta","Object","entries","collections","collectionName","collection","primaryKey","schema","primaryPath","processedDocuments","Set","requestIdlePromise","collectionStates","lastCheckpoint","checkpoint","hasMore","_loop","changesResult","storageInstance","documents","length","docIds","doc","has","add","elem","pos","arr","indexOf","docs","findByIds","exec","size","Array","from","values","next","name","documentId","files","deleted","docId","getValue","watchForChanges","forEach","changes$","changeStream","sub","subscribe","awaitInitialBackup","pipe","v","cancel","unsubscribe","backup","backupState","live","RxDBBackupPlugin","rxdb","prototypes","RxDatabase","proto","hooks","preDestroyRxDatabase","after","states","get"],"sources":["../../../../src/plugins/backup/index.ts"],"sourcesContent":["import * as path from 'node:path';\nimport {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport {\n filter,\n map\n} from 'rxjs';\nimport type {\n BackupOptions,\n RxBackupWriteEvent,\n RxCollection,\n RxDatabase,\n RxDocument,\n RxPlugin\n} from '../../types/index.d.ts';\nimport {\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport {\n clearFolder,\n deleteFolder,\n documentFolder,\n ensureFolderExists,\n getMeta,\n prepareFolders,\n setMeta,\n writeJsonToFile,\n writeToFile\n} from './file-util.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\n\n\n/**\n * Backups a single documents,\n * returns the paths to all written files\n */\nexport async function backupSingleDocument(\n rxDocument: RxDocument,\n options: BackupOptions\n): Promise {\n const data = rxDocument.toJSON(true);\n const writtenFiles: string[] = [];\n\n const docFolder = documentFolder(options, rxDocument.primary);\n await clearFolder(docFolder);\n\n const fileLocation = path.join(\n docFolder,\n 'document.json'\n );\n await writeJsonToFile(fileLocation, data);\n writtenFiles.push(fileLocation);\n\n if (options.attachments) {\n const attachmentsFolder = path.join(\n docFolder,\n 'attachments'\n );\n ensureFolderExists(attachmentsFolder);\n const attachments = (rxDocument as RxDocument).allAttachments();\n await Promise.all(\n attachments\n .map(async (attachment) => {\n const content = await attachment.getData();\n const attachmentFileLocation = path.join(\n attachmentsFolder,\n attachment.id\n );\n await writeToFile(attachmentFileLocation, content);\n writtenFiles.push(attachmentFileLocation);\n })\n );\n }\n\n return writtenFiles;\n}\n\nconst BACKUP_STATES_BY_DB: WeakMap = new WeakMap();\nfunction addToBackupStates(db: RxDatabase, state: RxBackupState) {\n const ar = getFromMapOrCreate(\n BACKUP_STATES_BY_DB,\n db,\n () => []\n );\n ar.push(state);\n}\n\nexport class RxBackupState {\n public isStopped: boolean = false;\n private subs: Subscription[] = [];\n private persistRunning: Promise = PROMISE_RESOLVE_VOID;\n private initialReplicationDone$: BehaviorSubject = new BehaviorSubject(false as any);\n\n private readonly internalWriteEvents$: Subject = new Subject();\n public readonly writeEvents$: Observable = this.internalWriteEvents$.asObservable();\n\n constructor(\n public readonly database: RxDatabase,\n public readonly options: BackupOptions\n ) {\n if (!this.options.batchSize) {\n this.options.batchSize = 10;\n }\n addToBackupStates(database, this);\n prepareFolders(database, options);\n }\n\n /**\n * Persists all data from all collections,\n * beginning from the oldest sequence checkpoint\n * to the newest one.\n * Do not call this while it is already running.\n * Returns true if there are more documents to process\n */\n public persistOnce() {\n return this.persistRunning = this.persistRunning.then(() => this._persistOnce());\n }\n\n public async _persistOnce() {\n const meta = await getMeta(this.options);\n\n await Promise.all(\n Object\n .entries(this.database.collections)\n .map(async ([collectionName, collection]) => {\n const primaryKey = collection.schema.primaryPath;\n const processedDocuments: Set = new Set();\n\n await this.database.requestIdlePromise();\n\n if (!meta.collectionStates[collectionName]) {\n meta.collectionStates[collectionName] = {};\n }\n let lastCheckpoint = meta.collectionStates[collectionName].checkpoint;\n\n let hasMore = true;\n while (hasMore && !this.isStopped) {\n await this.database.requestIdlePromise();\n const changesResult = await getChangedDocumentsSince(\n collection.storageInstance,\n this.options.batchSize ? this.options.batchSize : 0,\n lastCheckpoint\n );\n lastCheckpoint = changesResult.documents.length > 0 ? changesResult.checkpoint : lastCheckpoint;\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n\n const docIds: string[] = changesResult.documents\n .map(doc => doc[primaryKey])\n .filter(id => {\n if (\n processedDocuments.has(id)\n ) {\n return false;\n } else {\n processedDocuments.add(id);\n return true;\n }\n })\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos); // unique\n await this.database.requestIdlePromise();\n\n const docs: Map = await collection.findByIds(docIds).exec();\n if (docs.size === 0) {\n hasMore = false;\n continue;\n }\n await Promise.all(\n Array\n .from(docs.values())\n .map(async (doc) => {\n const writtenFiles = await backupSingleDocument(doc, this.options);\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: doc.primary,\n files: writtenFiles,\n deleted: false\n });\n })\n );\n // handle deleted documents\n await Promise.all(\n docIds\n .filter(docId => !docs.has(docId))\n .map(async (docId) => {\n await deleteFolder(documentFolder(this.options, docId));\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: docId,\n files: [],\n deleted: true\n });\n })\n );\n }\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n await setMeta(this.options, meta);\n })\n );\n\n if (!this.initialReplicationDone$.getValue()) {\n this.initialReplicationDone$.next(true);\n }\n }\n\n public watchForChanges() {\n const collections: RxCollection[] = Object.values(this.database.collections);\n collections.forEach(collection => {\n const changes$ = collection.storageInstance.changeStream();\n const sub = changes$.subscribe(() => {\n this.persistOnce();\n });\n this.subs.push(sub);\n });\n }\n\n /**\n * Returns a promise that resolves when the initial backup is done\n * and the filesystem is in sync with the database state\n */\n public awaitInitialBackup(): Promise {\n return firstValueFrom(\n this.initialReplicationDone$.pipe(\n filter(v => !!v),\n map(() => true)\n )\n );\n }\n\n cancel(): Promise {\n if (this.isStopped) {\n return PROMISE_RESOLVE_FALSE;\n }\n this.isStopped = true;\n this.subs.forEach(sub => sub.unsubscribe());\n return PROMISE_RESOLVE_TRUE;\n }\n}\n\n\nexport function backup(\n this: RxDatabase,\n options: BackupOptions\n): RxBackupState {\n const backupState = new RxBackupState(this, options);\n backupState.persistOnce();\n\n if (options.live) {\n backupState.watchForChanges();\n }\n\n return backupState;\n}\n\nexport * from './file-util.ts';\nexport const RxDBBackupPlugin: RxPlugin = {\n name: 'backup',\n rxdb: true,\n prototypes: {\n RxDatabase(proto: any) {\n proto.backup = backup;\n }\n },\n hooks: {\n preDestroyRxDatabase: {\n after: function preDestroyRxDatabase(db: RxDatabase) {\n const states = BACKUP_STATES_BY_DB.get(db);\n if (states) {\n states.forEach(state => state.cancel());\n }\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["path","BehaviorSubject","firstValueFrom","Subject","filter","map","getFromMapOrCreate","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","clearFolder","deleteFolder","documentFolder","ensureFolderExists","getMeta","prepareFolders","setMeta","writeJsonToFile","writeToFile","getChangedDocumentsSince","backupSingleDocument","rxDocument","options","data","toJSON","writtenFiles","docFolder","primary","fileLocation","join","push","attachments","attachmentsFolder","allAttachments","Promise","all","attachment","content","getData","attachmentFileLocation","id","BACKUP_STATES_BY_DB","WeakMap","addToBackupStates","db","state","ar","RxBackupState","database","isStopped","subs","persistRunning","initialReplicationDone$","internalWriteEvents$","writeEvents$","asObservable","batchSize","_proto","prototype","persistOnce","then","_persistOnce","_this","meta","Object","entries","collections","collectionName","collection","primaryKey","schema","primaryPath","processedDocuments","Set","requestIdlePromise","collectionStates","lastCheckpoint","checkpoint","hasMore","_loop","changesResult","storageInstance","documents","length","docIds","doc","has","add","elem","pos","arr","indexOf","docs","findByIds","exec","size","Array","from","values","next","name","documentId","files","deleted","docId","getValue","watchForChanges","forEach","changes$","changeStream","sub","subscribe","awaitInitialBackup","pipe","v","cancel","unsubscribe","backup","backupState","live","RxDBBackupPlugin","rxdb","prototypes","RxDatabase","proto","hooks","preDestroyRxDatabase","after","states","get"],"sources":["../../../../src/plugins/backup/index.ts"],"sourcesContent":["import * as path from 'node:path';\nimport {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport {\n filter,\n map\n} from 'rxjs';\nimport type {\n BackupOptions,\n RxBackupWriteEvent,\n RxCollection,\n RxDatabase,\n RxDocument,\n RxPlugin\n} from '../../types/index.d.ts';\nimport {\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID\n} from '../../plugins/utils/index.ts';\nimport {\n clearFolder,\n deleteFolder,\n documentFolder,\n ensureFolderExists,\n getMeta,\n prepareFolders,\n setMeta,\n writeJsonToFile,\n writeToFile\n} from './file-util.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\n\n\n/**\n * Backups a single documents,\n * returns the paths to all written files\n */\nexport async function backupSingleDocument(\n rxDocument: RxDocument,\n options: BackupOptions\n): Promise {\n const data = rxDocument.toJSON(true);\n const writtenFiles: string[] = [];\n\n const docFolder = documentFolder(options, rxDocument.primary);\n await clearFolder(docFolder);\n\n const fileLocation = path.join(\n docFolder,\n 'document.json'\n );\n await writeJsonToFile(fileLocation, data);\n writtenFiles.push(fileLocation);\n\n if (options.attachments) {\n const attachmentsFolder = path.join(\n docFolder,\n 'attachments'\n );\n ensureFolderExists(attachmentsFolder);\n const attachments = (rxDocument as RxDocument).allAttachments();\n await Promise.all(\n attachments\n .map(async (attachment) => {\n const content = await attachment.getData();\n const attachmentFileLocation = path.join(\n attachmentsFolder,\n attachment.id\n );\n await writeToFile(attachmentFileLocation, content);\n writtenFiles.push(attachmentFileLocation);\n })\n );\n }\n\n return writtenFiles;\n}\n\nconst BACKUP_STATES_BY_DB: WeakMap = new WeakMap();\nfunction addToBackupStates(db: RxDatabase, state: RxBackupState) {\n const ar = getFromMapOrCreate(\n BACKUP_STATES_BY_DB,\n db,\n () => []\n );\n ar.push(state);\n}\n\nexport class RxBackupState {\n public isStopped: boolean = false;\n private subs: Subscription[] = [];\n private persistRunning: Promise = PROMISE_RESOLVE_VOID;\n private initialReplicationDone$: BehaviorSubject = new BehaviorSubject(false as any);\n\n private readonly internalWriteEvents$: Subject = new Subject();\n public readonly writeEvents$: Observable = this.internalWriteEvents$.asObservable();\n\n constructor(\n public readonly database: RxDatabase,\n public readonly options: BackupOptions\n ) {\n if (!this.options.batchSize) {\n this.options.batchSize = 10;\n }\n addToBackupStates(database, this);\n prepareFolders(database, options);\n }\n\n /**\n * Persists all data from all collections,\n * beginning from the oldest sequence checkpoint\n * to the newest one.\n * Do not call this while it is already running.\n * Returns true if there are more documents to process\n */\n public persistOnce() {\n return this.persistRunning = this.persistRunning.then(() => this._persistOnce());\n }\n\n public async _persistOnce() {\n const meta = await getMeta(this.options);\n\n await Promise.all(\n Object\n .entries(this.database.collections)\n .map(async ([collectionName, collection]) => {\n const primaryKey = collection.schema.primaryPath;\n const processedDocuments: Set = new Set();\n\n await this.database.requestIdlePromise();\n\n if (!meta.collectionStates[collectionName]) {\n meta.collectionStates[collectionName] = {};\n }\n let lastCheckpoint = meta.collectionStates[collectionName].checkpoint;\n\n let hasMore = true;\n while (hasMore && !this.isStopped) {\n await this.database.requestIdlePromise();\n const changesResult = await getChangedDocumentsSince(\n collection.storageInstance,\n this.options.batchSize ? this.options.batchSize : 0,\n lastCheckpoint\n );\n lastCheckpoint = changesResult.documents.length > 0 ? changesResult.checkpoint : lastCheckpoint;\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n\n const docIds: string[] = changesResult.documents\n .map(doc => doc[primaryKey])\n .filter(id => {\n if (\n processedDocuments.has(id)\n ) {\n return false;\n } else {\n processedDocuments.add(id);\n return true;\n }\n })\n .filter((elem, pos, arr) => arr.indexOf(elem) === pos); // unique\n await this.database.requestIdlePromise();\n\n const docs: Map = await collection.findByIds(docIds).exec();\n if (docs.size === 0) {\n hasMore = false;\n continue;\n }\n await Promise.all(\n Array\n .from(docs.values())\n .map(async (doc) => {\n const writtenFiles = await backupSingleDocument(doc, this.options);\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: doc.primary,\n files: writtenFiles,\n deleted: false\n });\n })\n );\n // handle deleted documents\n await Promise.all(\n docIds\n .filter(docId => !docs.has(docId))\n .map(async (docId) => {\n await deleteFolder(documentFolder(this.options, docId));\n this.internalWriteEvents$.next({\n collectionName: collection.name,\n documentId: docId,\n files: [],\n deleted: true\n });\n })\n );\n }\n meta.collectionStates[collectionName].checkpoint = lastCheckpoint;\n await setMeta(this.options, meta);\n })\n );\n\n if (!this.initialReplicationDone$.getValue()) {\n this.initialReplicationDone$.next(true);\n }\n }\n\n public watchForChanges() {\n const collections: RxCollection[] = Object.values(this.database.collections);\n collections.forEach(collection => {\n const changes$ = collection.storageInstance.changeStream();\n const sub = changes$.subscribe(() => {\n this.persistOnce();\n });\n this.subs.push(sub);\n });\n }\n\n /**\n * Returns a promise that resolves when the initial backup is done\n * and the filesystem is in sync with the database state\n */\n public awaitInitialBackup(): Promise {\n return firstValueFrom(\n this.initialReplicationDone$.pipe(\n filter(v => !!v),\n map(() => true)\n )\n );\n }\n\n cancel(): Promise {\n if (this.isStopped) {\n return PROMISE_RESOLVE_FALSE;\n }\n this.isStopped = true;\n this.subs.forEach(sub => sub.unsubscribe());\n return PROMISE_RESOLVE_TRUE;\n }\n}\n\n\nexport function backup(\n this: RxDatabase,\n options: BackupOptions\n): RxBackupState {\n const backupState = new RxBackupState(this, options);\n backupState.persistOnce();\n\n if (options.live) {\n backupState.watchForChanges();\n }\n\n return backupState;\n}\n\nexport * from './file-util.ts';\nexport const RxDBBackupPlugin: RxPlugin = {\n name: 'backup',\n rxdb: true,\n prototypes: {\n RxDatabase(proto: any) {\n proto.backup = backup;\n }\n },\n hooks: {\n preDestroyRxDatabase: {\n after: function preDestroyRxDatabase(db: RxDatabase) {\n const states = BACKUP_STATES_BY_DB.get(db);\n if (states) {\n states.forEach(state => state.cancel());\n }\n }\n }\n }\n};\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/migration-schema/rx-migration-state.js.map b/dist/esm/plugins/migration-schema/rx-migration-state.js.map index d20897c307f..a80cf260185 100644 --- a/dist/esm/plugins/migration-schema/rx-migration-state.js.map +++ b/dist/esm/plugins/migration-schema/rx-migration-state.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-migration-state.js","names":["Subject","filter","firstValueFrom","map","shareReplay","isBulkWriteConflictError","newRxError","MIGRATION_DEFAULT_BATCH_SIZE","addMigrationStateToDatabase","getOldCollectionMeta","migrateDocumentData","mustMigrate","PROMISE_RESOLVE_TRUE","RXJS_SHARE_REPLAY_DEFAULTS","clone","deepEqual","ensureNotFalsy","errorToPlainJson","getDefaultRevision","getDefaultRxDocumentMeta","getSingleDocument","hasEncryption","observeSingle","writeSingle","BroadcastChannel","createLeaderElection","META_INSTANCE_SCHEMA_TITLE","awaitRxStorageReplicationFirstInSync","cancelRxStorageReplication","defaultConflictHandler","getRxReplicationMetaInstanceSchema","replicateRxStorageInstance","rxStorageInstanceToReplicationHandler","overwritable","INTERNAL_CONTEXT_MIGRATION_STATUS","addConnectedStorageToCollection","getPrimaryKeyOfInternalDocument","prepareQuery","normalizeMangoQuery","RxMigrationState","collection","migrationStrategies","statusDocKey","name","schema","version","join","started","updateStatusHandlers","updateStatusQueue","database","oldCollectionMeta","statusDocId","$","internalStore","pipe","d","data","_proto","prototype","getStatus","startMigration","batchSize","must","broadcastChannel","undefined","multiInstance","leaderElector","awaitLeadership","oldStorageInstance","storage","createStorageInstance","databaseName","collectionName","databaseInstanceToken","token","options","password","devMode","isDevMode","connectedInstances","getConnectedStorageInstances","totalCount","countAllDoucments","concat","r","oldStorage","updateStatus","s","count","total","Promise","all","connectedInstance","newStorage","migrateStorage","close","storageInstance","originalStorageInstance","err","status","error","previous","document","Object","assign","_deleted","handler","push","then","length","useHandlers","newDoc","id","key","context","handled","percent","_meta","_rev","_attachments","oneHandler","Math","round","replicationMetaStorageInstance","replicationHandlerBase","replicationState","keepMeta","identifier","replicationHandler","masterChangesSince","resolve","checkpoint","documents","masterWrite","rows","row","newDocData","newDocumentState","title","docData","isCheckpoint","assumedMasterState","migratedDocData","newRow","result","masterChangeStream$","asObservable","forkInstance","metaInstance","pushBatchSize","pullBatchSize","conflictHandler","hashFunction","hasError","events","subscribe","processed","up","remove","storageInstances","ret","instance","preparedQuery","selector","countResult","connectedStorages","connectedStorage","Error","newSchema","jsonSchema","migratePromise","race"],"sources":["../../../../src/plugins/migration-schema/rx-migration-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n filter,\n firstValueFrom,\n map,\n shareReplay\n} from 'rxjs';\nimport {\n isBulkWriteConflictError,\n newRxError\n} from '../../rx-error.ts';\nimport type {\n NumberFunctionMap,\n RxCollection,\n RxDatabase,\n RxError,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n MIGRATION_DEFAULT_BATCH_SIZE,\n addMigrationStateToDatabase,\n getOldCollectionMeta,\n migrateDocumentData,\n mustMigrate\n} from './migration-helpers.ts';\nimport {\n PROMISE_RESOLVE_TRUE,\n RXJS_SHARE_REPLAY_DEFAULTS,\n clone,\n deepEqual,\n ensureNotFalsy,\n errorToPlainJson,\n getDefaultRevision,\n getDefaultRxDocumentMeta\n} from '../utils/index.ts';\nimport type {\n MigrationStatusUpdate,\n RxMigrationStatus,\n RxMigrationStatusDocument\n} from './migration-types.ts';\nimport {\n getSingleDocument,\n hasEncryption,\n observeSingle,\n writeSingle\n} from '../../rx-storage-helper.ts';\nimport {\n BroadcastChannel,\n createLeaderElection\n} from 'broadcast-channel';\nimport {\n META_INSTANCE_SCHEMA_TITLE,\n awaitRxStorageReplicationFirstInSync,\n cancelRxStorageReplication,\n defaultConflictHandler,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance,\n rxStorageInstanceToReplicationHandler\n} from '../../replication-protocol/index.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n INTERNAL_CONTEXT_MIGRATION_STATUS,\n addConnectedStorageToCollection,\n getPrimaryKeyOfInternalDocument\n} from '../../rx-database-internal-store.ts';\nimport { prepareQuery } from '../../rx-query.ts';\nimport { normalizeMangoQuery } from '../../rx-query-helper.ts';\n\n\n\nexport class RxMigrationState {\n\n public database: RxDatabase;\n\n\n private started: boolean = false;\n public readonly oldCollectionMeta: ReturnType;\n public readonly mustMigrate: ReturnType;\n public readonly statusDocId: string;\n public readonly $: Observable;\n\n constructor(\n public readonly collection: RxCollection,\n public readonly migrationStrategies: NumberFunctionMap,\n public readonly statusDocKey = [\n collection.name,\n 'v',\n collection.schema.version\n ].join('-'),\n ) {\n this.database = collection.database;\n this.oldCollectionMeta = getOldCollectionMeta(this);\n this.mustMigrate = mustMigrate(this);\n this.statusDocId = getPrimaryKeyOfInternalDocument(\n this.statusDocKey,\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n addMigrationStateToDatabase(this);\n\n this.$ = observeSingle(\n this.database.internalStore,\n this.statusDocId\n ).pipe(\n filter(d => !!d),\n map(d => ensureNotFalsy(d).data),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\n );\n }\n\n getStatus() {\n return firstValueFrom(this.$);\n }\n\n\n /**\n * Starts the migration.\n * Returns void so that people to not get the idea to await\n * this function.\n * Instead use migratePromise() if you want to await\n * the migration. This ensures it works even if the migration\n * is run on a different browser tab.\n */\n async startMigration(batchSize: number = MIGRATION_DEFAULT_BATCH_SIZE): Promise {\n const must = await this.mustMigrate;\n if (!must) {\n return;\n }\n if (this.started) {\n throw newRxError('DM1');\n }\n this.started = true;\n\n\n let broadcastChannel: BroadcastChannel | undefined = undefined;\n /**\n * To ensure that multiple tabs do not migrate the same collection,\n * we use a new broadcastChannel/leaderElector for each collection.\n * This is required because collections can be added dynamically and\n * not all tabs might know about this collection.\n */\n if (this.database.multiInstance) {\n broadcastChannel = new BroadcastChannel([\n 'rx-migration-state',\n this.database.name,\n this.collection.name,\n this.collection.schema.version\n ].join('|'));\n const leaderElector = createLeaderElection(broadcastChannel);\n await leaderElector.awaitLeadership();\n }\n\n /**\n * Instead of writing a custom migration protocol,\n * we do a push-only replication from the old collection data to the new one.\n * This also ensure that restarting the replication works without problems.\n */\n const oldCollectionMeta = await this.oldCollectionMeta;\n const oldStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: this.collection.name,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: oldCollectionMeta.data.schema,\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n\n const connectedInstances = await this.getConnectedStorageInstances();\n\n\n /**\n * Initially write the migration status into a meta document.\n */\n const totalCount = await this.countAllDoucments(\n [oldStorageInstance].concat(connectedInstances.map(r => r.oldStorage))\n );\n await this.updateStatus(s => {\n s.count.total = totalCount;\n return s;\n });\n\n\n try {\n /**\n * First migrate the connected storages,\n * afterwards migrate the normal collection.\n */\n await Promise.all(\n connectedInstances.map(async (connectedInstance) => {\n await addConnectedStorageToCollection(\n this.collection,\n connectedInstance.newStorage.collectionName,\n connectedInstance.newStorage.schema\n );\n await this.migrateStorage(\n connectedInstance.oldStorage,\n connectedInstance.newStorage,\n batchSize\n );\n await connectedInstance.newStorage.close();\n })\n );\n\n await this.migrateStorage(\n oldStorageInstance,\n /**\n * Use the originalStorageInstance here\n * so that the _meta.lwt time keeps the same\n * and our replication checkpoints still point to the\n * correct checkpoint.\n */\n this.collection.storageInstance.originalStorageInstance,\n batchSize\n );\n } catch (err) {\n await oldStorageInstance.close();\n await this.updateStatus(s => {\n s.status = 'ERROR';\n s.error = errorToPlainJson(err as Error);\n return s;\n });\n return;\n }\n\n\n // remove old collection meta doc\n await writeSingle(\n this.database.internalStore,\n {\n previous: oldCollectionMeta,\n document: Object.assign(\n {},\n oldCollectionMeta,\n {\n _deleted: true\n }\n )\n },\n 'rx-migration-remove-collection-meta'\n );\n\n await this.updateStatus(s => {\n s.status = 'DONE';\n return s;\n });\n if (broadcastChannel) {\n await broadcastChannel.close();\n }\n }\n\n public updateStatusHandlers: MigrationStatusUpdate[] = [];\n public updateStatusQueue: Promise = PROMISE_RESOLVE_TRUE;\n public updateStatus(\n handler: MigrationStatusUpdate\n ) {\n this.updateStatusHandlers.push(handler);\n this.updateStatusQueue = this.updateStatusQueue.then(async () => {\n if (this.updateStatusHandlers.length === 0) {\n return;\n }\n // re-run until no conflict\n const useHandlers = this.updateStatusHandlers;\n this.updateStatusHandlers = [];\n while (true) {\n const previous = await getSingleDocument(\n this.database.internalStore,\n this.statusDocId\n );\n let newDoc = clone(previous);\n if (!previous) {\n newDoc = {\n id: this.statusDocId,\n key: this.statusDocKey,\n context: INTERNAL_CONTEXT_MIGRATION_STATUS,\n data: {\n collectionName: this.collection.name,\n status: 'RUNNING',\n count: {\n total: 0,\n handled: 0,\n percent: 0\n }\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n }\n\n let status = ensureNotFalsy(newDoc).data;\n for (const oneHandler of useHandlers) {\n status = oneHandler(status);\n }\n status.count.percent = Math.round((status.count.handled / status.count.total) * 100);\n\n if (\n newDoc && previous &&\n deepEqual(newDoc.data, previous.data)\n ) {\n break;\n }\n\n\n try {\n await writeSingle(\n this.database.internalStore,\n {\n previous,\n document: ensureNotFalsy(newDoc)\n },\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n\n // write successful\n break;\n } catch (err) {\n // ignore conflicts\n if (!isBulkWriteConflictError(err)) {\n throw err;\n }\n }\n }\n });\n return this.updateStatusQueue;\n }\n\n\n public async migrateStorage(\n oldStorage: RxStorageInstance,\n newStorage: RxStorageInstance,\n batchSize: number\n ) {\n const replicationMetaStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: 'rx-migration-state-meta-' + this.collection.name + '-' + this.collection.schema.version,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: getRxReplicationMetaInstanceSchema(oldStorage.schema, hasEncryption(oldStorage.schema)),\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n const replicationHandlerBase = rxStorageInstanceToReplicationHandler(\n newStorage,\n /**\n * Ignore push-conflicts.\n * If this happens we drop the 'old' document state.\n */\n defaultConflictHandler,\n this.database.token,\n true\n );\n\n const replicationState = replicateRxStorageInstance({\n keepMeta: true,\n identifier: [\n 'rx-migration-state',\n this.collection.name,\n oldStorage.schema.version,\n this.collection.schema.version\n ].join('-'),\n replicationHandler: {\n masterChangesSince() {\n return Promise.resolve({\n checkpoint: null,\n documents: []\n });\n },\n masterWrite: async (rows) => {\n rows = await Promise.all(\n rows\n .map(async (row) => {\n let newDocData = row.newDocumentState;\n if (newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE) {\n newDocData = row.newDocumentState.docData;\n if (row.newDocumentState.isCheckpoint === '1') {\n return {\n assumedMasterState: undefined,\n newDocumentState: row.newDocumentState\n };\n }\n }\n const migratedDocData: RxReplicationWriteToMasterRow = await migrateDocumentData(\n this.collection,\n oldStorage.schema.version,\n newDocData\n );\n const newRow: RxReplicationWriteToMasterRow = {\n // drop the assumed master state, we do not have to care about conflicts here.\n assumedMasterState: undefined,\n newDocumentState: newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE\n ? Object.assign({}, row.newDocumentState, { docData: migratedDocData })\n : migratedDocData\n };\n return newRow;\n })\n );\n\n // filter out the documents where the migration strategy returned null\n rows = rows.filter(row => !!row.newDocumentState);\n\n const result = await replicationHandlerBase.masterWrite(rows);\n return result;\n },\n masterChangeStream$: new Subject().asObservable()\n },\n forkInstance: oldStorage,\n metaInstance: replicationMetaStorageInstance,\n pushBatchSize: batchSize,\n pullBatchSize: 0,\n conflictHandler: defaultConflictHandler,\n hashFunction: this.database.hashFunction\n });\n\n\n let hasError: RxError | RxTypeError | false = false;\n replicationState.events.error.subscribe(err => hasError = err);\n\n // update replication status on each change\n replicationState.events.processed.up.subscribe(() => {\n this.updateStatus(status => {\n status.count.handled = status.count.handled + 1;\n return status;\n });\n });\n\n await awaitRxStorageReplicationFirstInSync(replicationState);\n await cancelRxStorageReplication(replicationState);\n\n await this.updateStatusQueue;\n if (hasError) {\n await replicationMetaStorageInstance.close();\n throw hasError;\n }\n\n // cleanup old storages\n await Promise.all([\n oldStorage.remove(),\n replicationMetaStorageInstance.remove()\n ]);\n }\n\n public async countAllDoucments(\n storageInstances: RxStorageInstance[]\n ): Promise {\n let ret = 0;\n await Promise.all(\n storageInstances.map(async (instance) => {\n\n const preparedQuery = prepareQuery(\n instance.schema,\n normalizeMangoQuery(\n instance.schema,\n {\n selector: {}\n }\n )\n );\n const countResult = await instance.count(preparedQuery);\n ret += countResult.count;\n })\n );\n return ret;\n }\n\n public async getConnectedStorageInstances() {\n const oldCollectionMeta = await this.oldCollectionMeta;\n const ret: {\n oldStorage: RxStorageInstance;\n newStorage: RxStorageInstance;\n }[] = [];\n\n await Promise.all(\n await Promise.all(\n oldCollectionMeta\n .data\n .connectedStorages\n .map(async (connectedStorage) => {\n\n // atm we can only migrate replication states.\n if (connectedStorage.schema.title !== META_INSTANCE_SCHEMA_TITLE) {\n throw new Error('unknown migration handling for schema');\n }\n\n const newSchema = getRxReplicationMetaInstanceSchema(\n clone(this.collection.schema.jsonSchema),\n hasEncryption(connectedStorage.schema)\n );\n newSchema.version = this.collection.schema.version;\n const [oldStorage, newStorage] = await Promise.all([\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: connectedStorage.schema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n }),\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: newSchema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n })\n ]);\n ret.push({ oldStorage, newStorage });\n })\n )\n );\n\n return ret;\n }\n\n\n\n async migratePromise(batchSize?: number): Promise {\n this.startMigration(batchSize);\n const must = await this.mustMigrate;\n if (!must) {\n return {\n status: 'DONE',\n collectionName: this.collection.name,\n count: {\n handled: 0,\n percent: 0,\n total: 0\n }\n };\n }\n\n const result = await Promise.race([\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'DONE')\n )\n ),\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'ERROR')\n )\n )\n ]);\n\n if (result.status === 'ERROR') {\n throw newRxError('DM4', {\n collection: this.collection.name,\n error: result.error\n });\n } else {\n return result;\n }\n\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-migration-state.js","names":["Subject","filter","firstValueFrom","map","shareReplay","isBulkWriteConflictError","newRxError","MIGRATION_DEFAULT_BATCH_SIZE","addMigrationStateToDatabase","getOldCollectionMeta","migrateDocumentData","mustMigrate","PROMISE_RESOLVE_TRUE","RXJS_SHARE_REPLAY_DEFAULTS","clone","deepEqual","ensureNotFalsy","errorToPlainJson","getDefaultRevision","getDefaultRxDocumentMeta","getSingleDocument","hasEncryption","observeSingle","writeSingle","BroadcastChannel","createLeaderElection","META_INSTANCE_SCHEMA_TITLE","awaitRxStorageReplicationFirstInSync","cancelRxStorageReplication","defaultConflictHandler","getRxReplicationMetaInstanceSchema","replicateRxStorageInstance","rxStorageInstanceToReplicationHandler","overwritable","INTERNAL_CONTEXT_MIGRATION_STATUS","addConnectedStorageToCollection","getPrimaryKeyOfInternalDocument","prepareQuery","normalizeMangoQuery","RxMigrationState","collection","migrationStrategies","statusDocKey","name","schema","version","join","started","updateStatusHandlers","updateStatusQueue","database","oldCollectionMeta","statusDocId","$","internalStore","pipe","d","data","_proto","prototype","getStatus","startMigration","batchSize","must","broadcastChannel","undefined","multiInstance","leaderElector","awaitLeadership","oldStorageInstance","storage","createStorageInstance","databaseName","collectionName","databaseInstanceToken","token","options","password","devMode","isDevMode","connectedInstances","getConnectedStorageInstances","totalCount","countAllDoucments","concat","r","oldStorage","updateStatus","s","count","total","Promise","all","connectedInstance","newStorage","migrateStorage","close","storageInstance","originalStorageInstance","err","status","error","previous","document","Object","assign","_deleted","handler","push","then","length","useHandlers","newDoc","id","key","context","handled","percent","_meta","_rev","_attachments","oneHandler","Math","round","replicationMetaStorageInstance","replicationHandlerBase","replicationState","keepMeta","identifier","replicationHandler","masterChangesSince","resolve","checkpoint","documents","masterWrite","rows","row","newDocData","newDocumentState","title","docData","isCheckpoint","assumedMasterState","migratedDocData","newRow","result","masterChangeStream$","asObservable","forkInstance","metaInstance","pushBatchSize","pullBatchSize","conflictHandler","hashFunction","hasError","events","subscribe","processed","up","remove","storageInstances","ret","instance","preparedQuery","selector","countResult","connectedStorages","connectedStorage","Error","newSchema","jsonSchema","migratePromise","race"],"sources":["../../../../src/plugins/migration-schema/rx-migration-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n filter,\n firstValueFrom,\n map,\n shareReplay\n} from 'rxjs';\nimport {\n isBulkWriteConflictError,\n newRxError\n} from '../../rx-error.ts';\nimport type {\n NumberFunctionMap,\n RxCollection,\n RxDatabase,\n RxError,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n MIGRATION_DEFAULT_BATCH_SIZE,\n addMigrationStateToDatabase,\n getOldCollectionMeta,\n migrateDocumentData,\n mustMigrate\n} from './migration-helpers.ts';\nimport {\n PROMISE_RESOLVE_TRUE,\n RXJS_SHARE_REPLAY_DEFAULTS,\n clone,\n deepEqual,\n ensureNotFalsy,\n errorToPlainJson,\n getDefaultRevision,\n getDefaultRxDocumentMeta\n} from '../utils/index.ts';\nimport type {\n MigrationStatusUpdate,\n RxMigrationStatus,\n RxMigrationStatusDocument\n} from './migration-types.ts';\nimport {\n getSingleDocument,\n hasEncryption,\n observeSingle,\n writeSingle\n} from '../../rx-storage-helper.ts';\nimport {\n BroadcastChannel,\n createLeaderElection\n} from 'broadcast-channel';\nimport {\n META_INSTANCE_SCHEMA_TITLE,\n awaitRxStorageReplicationFirstInSync,\n cancelRxStorageReplication,\n defaultConflictHandler,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance,\n rxStorageInstanceToReplicationHandler\n} from '../../replication-protocol/index.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n INTERNAL_CONTEXT_MIGRATION_STATUS,\n addConnectedStorageToCollection,\n getPrimaryKeyOfInternalDocument\n} from '../../rx-database-internal-store.ts';\nimport { prepareQuery } from '../../rx-query.ts';\nimport { normalizeMangoQuery } from '../../rx-query-helper.ts';\n\n\n\nexport class RxMigrationState {\n\n public database: RxDatabase;\n\n\n private started: boolean = false;\n public readonly oldCollectionMeta: ReturnType;\n public readonly mustMigrate: ReturnType;\n public readonly statusDocId: string;\n public readonly $: Observable;\n\n constructor(\n public readonly collection: RxCollection,\n public readonly migrationStrategies: NumberFunctionMap,\n public readonly statusDocKey = [\n collection.name,\n 'v',\n collection.schema.version\n ].join('-'),\n ) {\n this.database = collection.database;\n this.oldCollectionMeta = getOldCollectionMeta(this);\n this.mustMigrate = mustMigrate(this);\n this.statusDocId = getPrimaryKeyOfInternalDocument(\n this.statusDocKey,\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n addMigrationStateToDatabase(this);\n\n this.$ = observeSingle(\n this.database.internalStore,\n this.statusDocId\n ).pipe(\n filter(d => !!d),\n map(d => ensureNotFalsy(d).data),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS)\n );\n }\n\n getStatus() {\n return firstValueFrom(this.$);\n }\n\n\n /**\n * Starts the migration.\n * Returns void so that people to not get the idea to await\n * this function.\n * Instead use migratePromise() if you want to await\n * the migration. This ensures it works even if the migration\n * is run on a different browser tab.\n */\n async startMigration(batchSize: number = MIGRATION_DEFAULT_BATCH_SIZE): Promise {\n const must = await this.mustMigrate;\n if (!must) {\n return;\n }\n if (this.started) {\n throw newRxError('DM1');\n }\n this.started = true;\n\n\n let broadcastChannel: BroadcastChannel | undefined = undefined;\n /**\n * To ensure that multiple tabs do not migrate the same collection,\n * we use a new broadcastChannel/leaderElector for each collection.\n * This is required because collections can be added dynamically and\n * not all tabs might know about this collection.\n */\n if (this.database.multiInstance) {\n broadcastChannel = new BroadcastChannel([\n 'rx-migration-state',\n this.database.name,\n this.collection.name,\n this.collection.schema.version\n ].join('|'));\n const leaderElector = createLeaderElection(broadcastChannel);\n await leaderElector.awaitLeadership();\n }\n\n /**\n * Instead of writing a custom migration protocol,\n * we do a push-only replication from the old collection data to the new one.\n * This also ensure that restarting the replication works without problems.\n */\n const oldCollectionMeta = await this.oldCollectionMeta;\n const oldStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: this.collection.name,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: oldCollectionMeta.data.schema,\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n\n const connectedInstances = await this.getConnectedStorageInstances();\n\n\n /**\n * Initially write the migration status into a meta document.\n */\n const totalCount = await this.countAllDoucments(\n [oldStorageInstance].concat(connectedInstances.map(r => r.oldStorage))\n );\n await this.updateStatus(s => {\n s.count.total = totalCount;\n return s;\n });\n\n\n try {\n /**\n * First migrate the connected storages,\n * afterwards migrate the normal collection.\n */\n await Promise.all(\n connectedInstances.map(async (connectedInstance) => {\n await addConnectedStorageToCollection(\n this.collection,\n connectedInstance.newStorage.collectionName,\n connectedInstance.newStorage.schema\n );\n await this.migrateStorage(\n connectedInstance.oldStorage,\n connectedInstance.newStorage,\n batchSize\n );\n await connectedInstance.newStorage.close();\n })\n );\n\n await this.migrateStorage(\n oldStorageInstance,\n /**\n * Use the originalStorageInstance here\n * so that the _meta.lwt time keeps the same\n * and our replication checkpoints still point to the\n * correct checkpoint.\n */\n this.collection.storageInstance.originalStorageInstance,\n batchSize\n );\n } catch (err) {\n await oldStorageInstance.close();\n await this.updateStatus(s => {\n s.status = 'ERROR';\n s.error = errorToPlainJson(err as Error);\n return s;\n });\n return;\n }\n\n\n // remove old collection meta doc\n await writeSingle(\n this.database.internalStore,\n {\n previous: oldCollectionMeta,\n document: Object.assign(\n {},\n oldCollectionMeta,\n {\n _deleted: true\n }\n )\n },\n 'rx-migration-remove-collection-meta'\n );\n\n await this.updateStatus(s => {\n s.status = 'DONE';\n return s;\n });\n if (broadcastChannel) {\n await broadcastChannel.close();\n }\n }\n\n public updateStatusHandlers: MigrationStatusUpdate[] = [];\n public updateStatusQueue: Promise = PROMISE_RESOLVE_TRUE;\n public updateStatus(\n handler: MigrationStatusUpdate\n ) {\n this.updateStatusHandlers.push(handler);\n this.updateStatusQueue = this.updateStatusQueue.then(async () => {\n if (this.updateStatusHandlers.length === 0) {\n return;\n }\n // re-run until no conflict\n const useHandlers = this.updateStatusHandlers;\n this.updateStatusHandlers = [];\n while (true) {\n const previous = await getSingleDocument(\n this.database.internalStore,\n this.statusDocId\n );\n let newDoc = clone(previous);\n if (!previous) {\n newDoc = {\n id: this.statusDocId,\n key: this.statusDocKey,\n context: INTERNAL_CONTEXT_MIGRATION_STATUS,\n data: {\n collectionName: this.collection.name,\n status: 'RUNNING',\n count: {\n total: 0,\n handled: 0,\n percent: 0\n }\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n }\n\n let status = ensureNotFalsy(newDoc).data;\n for (const oneHandler of useHandlers) {\n status = oneHandler(status);\n }\n status.count.percent = Math.round((status.count.handled / status.count.total) * 100);\n\n if (\n newDoc && previous &&\n deepEqual(newDoc.data, previous.data)\n ) {\n break;\n }\n\n\n try {\n await writeSingle(\n this.database.internalStore,\n {\n previous,\n document: ensureNotFalsy(newDoc)\n },\n INTERNAL_CONTEXT_MIGRATION_STATUS\n );\n\n // write successful\n break;\n } catch (err) {\n // ignore conflicts\n if (!isBulkWriteConflictError(err)) {\n throw err;\n }\n }\n }\n });\n return this.updateStatusQueue;\n }\n\n\n public async migrateStorage(\n oldStorage: RxStorageInstance,\n newStorage: RxStorageInstance,\n batchSize: number\n ) {\n const replicationMetaStorageInstance = await this.database.storage.createStorageInstance({\n databaseName: this.database.name,\n collectionName: 'rx-migration-state-meta-' + this.collection.name + '-' + this.collection.schema.version,\n databaseInstanceToken: this.database.token,\n multiInstance: this.database.multiInstance,\n options: {},\n schema: getRxReplicationMetaInstanceSchema(oldStorage.schema, hasEncryption(oldStorage.schema)),\n password: this.database.password,\n devMode: overwritable.isDevMode()\n });\n\n const replicationHandlerBase = rxStorageInstanceToReplicationHandler(\n newStorage,\n /**\n * Ignore push-conflicts.\n * If this happens we drop the 'old' document state.\n */\n defaultConflictHandler,\n this.database.token,\n true\n );\n\n const replicationState = replicateRxStorageInstance({\n keepMeta: true,\n identifier: [\n 'rx-migration-state',\n this.collection.name,\n oldStorage.schema.version,\n this.collection.schema.version\n ].join('-'),\n replicationHandler: {\n masterChangesSince() {\n return Promise.resolve({\n checkpoint: null,\n documents: []\n });\n },\n masterWrite: async (rows) => {\n rows = await Promise.all(\n rows\n .map(async (row) => {\n let newDocData = row.newDocumentState;\n if (newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE) {\n newDocData = row.newDocumentState.docData;\n if (row.newDocumentState.isCheckpoint === '1') {\n return {\n assumedMasterState: undefined,\n newDocumentState: row.newDocumentState\n };\n }\n }\n const migratedDocData: RxReplicationWriteToMasterRow = await migrateDocumentData(\n this.collection,\n oldStorage.schema.version,\n newDocData\n );\n const newRow: RxReplicationWriteToMasterRow = {\n // drop the assumed master state, we do not have to care about conflicts here.\n assumedMasterState: undefined,\n newDocumentState: newStorage.schema.title === META_INSTANCE_SCHEMA_TITLE\n ? Object.assign({}, row.newDocumentState, { docData: migratedDocData })\n : migratedDocData\n };\n return newRow;\n })\n );\n\n // filter out the documents where the migration strategy returned null\n rows = rows.filter(row => !!row.newDocumentState);\n\n const result = await replicationHandlerBase.masterWrite(rows);\n return result;\n },\n masterChangeStream$: new Subject().asObservable()\n },\n forkInstance: oldStorage,\n metaInstance: replicationMetaStorageInstance,\n pushBatchSize: batchSize,\n pullBatchSize: 0,\n conflictHandler: defaultConflictHandler,\n hashFunction: this.database.hashFunction\n });\n\n\n let hasError: RxError | RxTypeError | false = false;\n replicationState.events.error.subscribe(err => hasError = err);\n\n // update replication status on each change\n replicationState.events.processed.up.subscribe(() => {\n this.updateStatus(status => {\n status.count.handled = status.count.handled + 1;\n return status;\n });\n });\n\n await awaitRxStorageReplicationFirstInSync(replicationState);\n await cancelRxStorageReplication(replicationState);\n\n await this.updateStatusQueue;\n if (hasError) {\n await replicationMetaStorageInstance.close();\n throw hasError;\n }\n\n // cleanup old storages\n await Promise.all([\n oldStorage.remove(),\n replicationMetaStorageInstance.remove()\n ]);\n }\n\n public async countAllDoucments(\n storageInstances: RxStorageInstance[]\n ): Promise {\n let ret = 0;\n await Promise.all(\n storageInstances.map(async (instance) => {\n\n const preparedQuery = prepareQuery(\n instance.schema,\n normalizeMangoQuery(\n instance.schema,\n {\n selector: {}\n }\n )\n );\n const countResult = await instance.count(preparedQuery);\n ret += countResult.count;\n })\n );\n return ret;\n }\n\n public async getConnectedStorageInstances() {\n const oldCollectionMeta = await this.oldCollectionMeta;\n const ret: {\n oldStorage: RxStorageInstance;\n newStorage: RxStorageInstance;\n }[] = [];\n\n await Promise.all(\n await Promise.all(\n oldCollectionMeta\n .data\n .connectedStorages\n .map(async (connectedStorage) => {\n\n // atm we can only migrate replication states.\n if (connectedStorage.schema.title !== META_INSTANCE_SCHEMA_TITLE) {\n throw new Error('unknown migration handling for schema');\n }\n\n const newSchema = getRxReplicationMetaInstanceSchema(\n clone(this.collection.schema.jsonSchema),\n hasEncryption(connectedStorage.schema)\n );\n newSchema.version = this.collection.schema.version;\n const [oldStorage, newStorage] = await Promise.all([\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: connectedStorage.schema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n }),\n this.database.storage.createStorageInstance({\n databaseInstanceToken: this.database.token,\n databaseName: this.database.name,\n devMode: overwritable.isDevMode(),\n multiInstance: this.database.multiInstance,\n options: {},\n schema: newSchema,\n password: this.database.password,\n collectionName: connectedStorage.collectionName\n })\n ]);\n ret.push({ oldStorage, newStorage });\n })\n )\n );\n\n return ret;\n }\n\n\n\n async migratePromise(batchSize?: number): Promise {\n this.startMigration(batchSize);\n const must = await this.mustMigrate;\n if (!must) {\n return {\n status: 'DONE',\n collectionName: this.collection.name,\n count: {\n handled: 0,\n percent: 0,\n total: 0\n }\n };\n }\n\n const result = await Promise.race([\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'DONE')\n )\n ),\n firstValueFrom(\n this.$.pipe(\n filter(d => d.status === 'ERROR')\n )\n )\n ]);\n\n if (result.status === 'ERROR') {\n throw newRxError('DM4', {\n collection: this.collection.name,\n error: result.error\n });\n } else {\n return result;\n }\n\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js b/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js index 23087f21497..3c4cc067518 100644 --- a/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js +++ b/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js @@ -1,4 +1,3 @@ -import _readOnlyError from "@babel/runtime/helpers/readOnlyError"; /** * this is based on * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js diff --git a/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map b/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map index c244b2a0286..b046eb220c1 100644 --- a/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map +++ b/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map @@ -1 +1 @@ -{"version":3,"file":"nosql-query-builder.js","names":["isObject","merge","newRxTypeError","newRxError","NoSqlQueryBuilderClass","mangoQuery","_path","options","_conditions","_fields","queryBuilder","selector","find","limit","skip","sort","forEach","s","_proto","prototype","where","_val","arguments","length","type","Array","isArray","path","equals","val","_ensurePath","eq","or","array","$or","push","apply","nor","$nor","and","$and","mod","slice","conds","$mod","exists","$exists","elemMatch","_criteria","fn","criteria","$elemMatch","arg","len","i","_pushArr","split","field","ascend","substring","keys","Object","args","source","canMerge","_distinct","method","toJSON","query","mQuerySortToRxDBSort","entries","map","k","v","direction","part","OTHER_MANGO_ATTRIBUTES","OTHER_MANGO_OPERATORS","$conditional","RegExp","$regex","$options","opts","value","$meta","String","toLowerCase","test","valueStr","toString","replace","parseInt","createQueryBuilder"],"sources":["../../../../../src/plugins/query-builder/mquery/nosql-query-builder.ts"],"sourcesContent":["/**\n * this is based on\n * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js\n */\nimport {\n isObject,\n merge\n} from './mquery-utils.ts';\nimport {\n newRxTypeError,\n newRxError\n} from '../../../rx-error.ts';\nimport type {\n MangoQuery,\n MangoQuerySelector,\n MangoQuerySortPart,\n MangoQuerySortDirection\n} from '../../../types/index.d.ts';\n\n\ndeclare type MQueryOptions = {\n limit?: number;\n skip?: number;\n sort?: any;\n};\n\nexport class NoSqlQueryBuilderClass {\n\n public options: MQueryOptions = {};\n public _conditions: MangoQuerySelector = {};\n public _fields: any = {};\n private _distinct: any;\n\n /**\n * MQuery constructor used for building queries.\n *\n * ####Example:\n * var query = new MQuery({ name: 'mquery' });\n * query.where('age').gte(21).exec(callback);\n *\n */\n constructor(\n mangoQuery?: MangoQuery,\n public _path?: any\n ) {\n if (mangoQuery) {\n const queryBuilder: NoSqlQueryBuilder = this as any;\n\n if (mangoQuery.selector) {\n queryBuilder.find(mangoQuery.selector);\n }\n if (mangoQuery.limit) {\n queryBuilder.limit(mangoQuery.limit);\n }\n if (mangoQuery.skip) {\n queryBuilder.skip(mangoQuery.skip);\n }\n if (mangoQuery.sort) {\n mangoQuery.sort.forEach(s => queryBuilder.sort(s));\n }\n }\n }\n\n /**\n * Specifies a `path` for use with chaining.\n */\n where(_path: string, _val?: MangoQuerySelector): NoSqlQueryBuilder {\n if (!arguments.length) return this as any;\n const type = typeof arguments[0];\n if ('string' === type) {\n this._path = arguments[0];\n if (2 === arguments.length) {\n (this._conditions as any)[this._path] = arguments[1];\n }\n return this as any;\n }\n\n if ('object' === type && !Array.isArray(arguments[0])) {\n return this.merge(arguments[0]);\n }\n\n throw newRxTypeError('MQ1', {\n path: arguments[0]\n });\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * ####Example\n * User.where('age').equals(49);\n */\n equals(val: any): NoSqlQueryBuilder {\n this._ensurePath('equals');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * This is alias of `equals`\n */\n eq(val: any): NoSqlQueryBuilder {\n this._ensurePath('eq');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies arguments for an `$or` condition.\n * ####Example\n * query.or([{ color: 'red' }, { status: 'emergency' }])\n */\n or(array: any[]): NoSqlQueryBuilder {\n const or = this._conditions.$or || (this._conditions.$or = []);\n if (!Array.isArray(array)) array = [array];\n or.push.apply(or, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$nor` condition.\n * ####Example\n * query.nor([{ color: 'green' }, { status: 'ok' }])\n */\n nor(array: any[]): NoSqlQueryBuilder {\n const nor = this._conditions.$nor || (this._conditions.$nor = []);\n if (!Array.isArray(array)) array = [array];\n nor.push.apply(nor, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$and` condition.\n * ####Example\n * query.and([{ color: 'green' }, { status: 'ok' }])\n * @see $and http://docs.mongodb.org/manual/reference/operator/and/\n */\n and(array: any[]): NoSqlQueryBuilder {\n const and = this._conditions.$and || (this._conditions.$and = []);\n if (!Array.isArray(array)) array = [array];\n and.push.apply(and, array);\n return this as any;\n }\n\n /**\n * Specifies a `$mod` condition\n */\n mod(_path: string, _val: number): NoSqlQueryBuilder {\n let val;\n let path;\n\n if (1 === arguments.length) {\n this._ensurePath('mod');\n val = arguments[0];\n path = this._path;\n } else if (2 === arguments.length && !Array.isArray(arguments[1])) {\n this._ensurePath('mod');\n val = (arguments as any).slice();\n path = this._path;\n } else if (3 === arguments.length) {\n val = (arguments as any).slice(1);\n path = arguments[0];\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$mod = val;\n return this as any;\n }\n\n /**\n * Specifies an `$exists` condition\n * ####Example\n * // { name: { $exists: true }}\n * Thing.where('name').exists()\n * Thing.where('name').exists(true)\n * Thing.find().exists('name')\n */\n exists(_path: string, _val: number): NoSqlQueryBuilder {\n let path;\n let val;\n if (0 === arguments.length) {\n this._ensurePath('exists');\n path = this._path;\n val = true;\n } else if (1 === arguments.length) {\n if ('boolean' === typeof arguments[0]) {\n this._ensurePath('exists');\n path = this._path;\n val = arguments[0];\n } else {\n path = arguments[0];\n val = true;\n }\n } else if (2 === arguments.length) {\n path = arguments[0];\n val = arguments[1];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$exists = val;\n return this as any;\n }\n\n /**\n * Specifies an `$elemMatch` condition\n * ####Example\n * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})\n * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})\n * query.elemMatch('comment', function (elem) {\n * elem.where('author').equals('autobot');\n * elem.where('votes').gte(5);\n * })\n * query.where('comment').elemMatch(function (elem) {\n * elem.where({ author: 'autobot' });\n * elem.where('votes').gte(5);\n * })\n */\n elemMatch(_path: string, _criteria: any): NoSqlQueryBuilder {\n if (null === arguments[0])\n throw newRxTypeError('MQ2');\n\n let fn;\n let path;\n let criteria;\n\n if ('function' === typeof arguments[0]) {\n this._ensurePath('elemMatch');\n path = this._path;\n fn = arguments[0];\n } else if (isObject(arguments[0])) {\n this._ensurePath('elemMatch');\n path = this._path;\n criteria = arguments[0];\n } else if ('function' === typeof arguments[1]) {\n path = arguments[0];\n fn = arguments[1];\n } else if (arguments[1] && isObject(arguments[1])) {\n path = arguments[0];\n criteria = arguments[1];\n } else\n throw newRxTypeError('MQ2');\n\n if (fn) {\n criteria = new NoSqlQueryBuilderClass;\n fn(criteria);\n criteria = criteria._conditions;\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$elemMatch = criteria;\n return this as any;\n }\n\n /**\n * Sets the sort order\n * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1.\n * If a string is passed, it must be a space delimited list of path names.\n * The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.\n * ####Example\n * query.sort({ field: 'asc', test: -1 });\n * query.sort('field -test');\n * query.sort([['field', 1], ['test', -1]]);\n */\n sort(arg: any): NoSqlQueryBuilder {\n if (!arg) return this as any;\n let len;\n const type = typeof arg;\n // .sort([['field', 1], ['test', -1]])\n if (Array.isArray(arg)) {\n len = arg.length;\n for (let i = 0; i < arg.length; ++i) {\n _pushArr(this.options, arg[i][0], arg[i][1]);\n }\n\n return this as any;\n }\n\n // .sort('field -test')\n if (1 === arguments.length && 'string' === type) {\n arg = arg.split(/\\s+/);\n len = arg.length;\n for (let i = 0; i < len; ++i) {\n let field = arg[i];\n if (!field) continue;\n const ascend = '-' === field[0] ? -1 : 1;\n if (ascend === -1) field = field.substring(1);\n push(this.options, field, ascend);\n }\n\n return this as any;\n }\n\n // .sort({ field: 1, test: -1 })\n if (isObject(arg)) {\n const keys = Object.keys(arg);\n keys.forEach(field => push(this.options, field, arg[field]));\n return this as any;\n }\n\n throw newRxTypeError('MQ3', {\n args: arguments\n });\n }\n\n /**\n * Merges another MQuery or conditions object into this one.\n *\n * When a MQuery is passed, conditions, field selection and options are merged.\n *\n */\n merge(source: any): NoSqlQueryBuilder {\n if (!source) {\n return this as any;\n }\n\n if (!canMerge(source)) {\n throw newRxTypeError('MQ4', {\n source\n });\n }\n\n if (source instanceof NoSqlQueryBuilderClass) {\n // if source has a feature, apply it to ourselves\n\n if (source._conditions)\n merge(this._conditions, source._conditions);\n\n if (source._fields) {\n if (!this._fields) this._fields = {};\n merge(this._fields, source._fields);\n }\n\n if (source.options) {\n if (!this.options) this.options = {};\n merge(this.options, source.options);\n }\n\n if (source._distinct)\n this._distinct = source._distinct;\n\n return this as any;\n }\n\n // plain object\n merge(this._conditions, source);\n\n return this as any;\n }\n\n /**\n * Finds documents.\n * ####Example\n * query.find()\n * query.find({ name: 'Burning Lights' })\n */\n find(criteria: any): NoSqlQueryBuilder {\n if (canMerge(criteria)) {\n this.merge(criteria);\n }\n\n return this as any;\n }\n\n /**\n * Make sure _path is set.\n *\n * @param {String} method\n */\n _ensurePath(method: any) {\n if (!this._path) {\n throw newRxError('MQ5', {\n method\n });\n }\n }\n\n toJSON(): {\n query: MangoQuery;\n path?: string;\n } {\n const query: MangoQuery = {\n selector: this._conditions,\n };\n\n if (this.options.skip) {\n query.skip = this.options.skip;\n }\n if (this.options.limit) {\n query.limit = this.options.limit;\n }\n if (this.options.sort) {\n query.sort = mQuerySortToRxDBSort(this.options.sort);\n }\n\n return {\n query,\n path: this._path\n };\n }\n}\n\nexport function mQuerySortToRxDBSort(\n sort: { [k: string]: 1 | -1; }\n): MangoQuerySortPart[] {\n return Object.entries(sort).map(([k, v]) => {\n const direction: MangoQuerySortDirection = v === 1 ? 'asc' : 'desc';\n const part: MangoQuerySortPart = { [k]: direction } as any;\n return part;\n });\n}\n\n/**\n * Because some prototype-methods are generated,\n * we have to define the type of NoSqlQueryBuilder here\n */\n\nexport interface NoSqlQueryBuilder extends NoSqlQueryBuilderClass {\n maxScan: ReturnSelfNumberFunction;\n batchSize: ReturnSelfNumberFunction;\n limit: ReturnSelfNumberFunction;\n skip: ReturnSelfNumberFunction;\n comment: ReturnSelfFunction;\n\n gt: ReturnSelfFunction;\n gte: ReturnSelfFunction;\n lt: ReturnSelfFunction;\n lte: ReturnSelfFunction;\n ne: ReturnSelfFunction;\n in: ReturnSelfFunction;\n nin: ReturnSelfFunction;\n all: ReturnSelfFunction;\n regex: ReturnSelfFunction;\n size: ReturnSelfFunction;\n\n}\n\ndeclare type ReturnSelfFunction = (v: any) => NoSqlQueryBuilder;\ndeclare type ReturnSelfNumberFunction = (v: number | null) => NoSqlQueryBuilder;\n\n/**\n * limit, skip, maxScan, batchSize, comment\n *\n * Sets these associated options.\n *\n * query.comment('feed query');\n */\nexport const OTHER_MANGO_ATTRIBUTES = ['limit', 'skip', 'maxScan', 'batchSize', 'comment'];\nOTHER_MANGO_ATTRIBUTES.forEach(function (method) {\n (NoSqlQueryBuilderClass.prototype as any)[method] = function (v: any) {\n this.options[method] = v;\n return this;\n };\n});\n\n\n/**\n * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance\n *\n * Thing.where('type').nin(array)\n */\nexport const OTHER_MANGO_OPERATORS = [\n 'gt', 'gte', 'lt', 'lte', 'ne',\n 'in', 'nin', 'all', 'regex', 'size'\n];\nOTHER_MANGO_OPERATORS.forEach(function ($conditional) {\n (NoSqlQueryBuilderClass.prototype as any)[$conditional] = function () {\n let path;\n let val;\n\n if (1 === arguments.length) {\n this._ensurePath($conditional);\n val = arguments[0];\n path = this._path;\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = this._conditions[path] === null || typeof this._conditions[path] === 'object' ?\n this._conditions[path] :\n (this._conditions[path] = {});\n\n\n\n if ($conditional === 'regex') {\n if (val instanceof RegExp) {\n throw newRxError('QU16', {\n field: path,\n query: this._conditions,\n });\n }\n if (typeof val === 'string') {\n conds['$' + $conditional] = val;\n } else {\n conds['$' + $conditional] = val.$regex;\n if (val.$options) {\n conds.$options = val.$options;\n }\n }\n } else {\n conds['$' + $conditional] = val;\n }\n\n return this;\n };\n});\n\n\nfunction push(opts: any, field: string, value: any) {\n if (Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ6', {\n opts,\n field,\n value\n });\n }\n\n if (value && value.$meta) {\n const sort = opts.sort || (opts.sort = {});\n sort[field] = {\n $meta: value.$meta\n };\n return;\n }\n\n const val = String(value || 1).toLowerCase();\n if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) {\n if (Array.isArray(value)) value = '[' + value + ']';\n throw newRxTypeError('MQ7', {\n field,\n value\n });\n }\n // store `sort` in a sane format\n const s = opts.sort || (opts.sort = {});\n const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');\n s[field] = parseInt(valueStr, 10);\n}\n\nfunction _pushArr(opts: any, field: string, value: any) {\n opts.sort = opts.sort || [];\n if (!Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ8', {\n opts,\n field,\n value\n });\n }\n\n /* const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');*/\n opts.sort.push([field, value]);\n}\n\n\n/**\n * Determines if `conds` can be merged using `mquery().merge()`\n */\nexport function canMerge(conds: any): boolean {\n return conds instanceof NoSqlQueryBuilderClass || isObject(conds);\n}\n\n\nexport function createQueryBuilder(query?: MangoQuery, path?: any): NoSqlQueryBuilder {\n return new NoSqlQueryBuilderClass(query, path) as NoSqlQueryBuilder;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"nosql-query-builder.js","names":["isObject","merge","newRxTypeError","newRxError","NoSqlQueryBuilderClass","mangoQuery","_path","options","_conditions","_fields","queryBuilder","selector","find","limit","skip","sort","forEach","s","_proto","prototype","where","_val","arguments","length","type","Array","isArray","path","equals","val","_ensurePath","eq","or","array","$or","push","apply","nor","$nor","and","$and","mod","slice","conds","$mod","exists","$exists","elemMatch","_criteria","fn","criteria","$elemMatch","arg","len","i","_pushArr","split","field","ascend","substring","keys","Object","args","source","canMerge","_distinct","method","toJSON","query","mQuerySortToRxDBSort","entries","map","k","v","direction","part","OTHER_MANGO_ATTRIBUTES","OTHER_MANGO_OPERATORS","$conditional","RegExp","$regex","$options","opts","value","$meta","String","toLowerCase","test","valueStr","toString","replace","parseInt","createQueryBuilder"],"sources":["../../../../../src/plugins/query-builder/mquery/nosql-query-builder.ts"],"sourcesContent":["/**\n * this is based on\n * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js\n */\nimport {\n isObject,\n merge\n} from './mquery-utils.ts';\nimport {\n newRxTypeError,\n newRxError\n} from '../../../rx-error.ts';\nimport type {\n MangoQuery,\n MangoQuerySelector,\n MangoQuerySortPart,\n MangoQuerySortDirection\n} from '../../../types/index.d.ts';\n\n\ndeclare type MQueryOptions = {\n limit?: number;\n skip?: number;\n sort?: any;\n};\n\nexport class NoSqlQueryBuilderClass {\n\n public options: MQueryOptions = {};\n public _conditions: MangoQuerySelector = {};\n public _fields: any = {};\n private _distinct: any;\n\n /**\n * MQuery constructor used for building queries.\n *\n * ####Example:\n * var query = new MQuery({ name: 'mquery' });\n * query.where('age').gte(21).exec(callback);\n *\n */\n constructor(\n mangoQuery?: MangoQuery,\n public _path?: any\n ) {\n if (mangoQuery) {\n const queryBuilder: NoSqlQueryBuilder = this as any;\n\n if (mangoQuery.selector) {\n queryBuilder.find(mangoQuery.selector);\n }\n if (mangoQuery.limit) {\n queryBuilder.limit(mangoQuery.limit);\n }\n if (mangoQuery.skip) {\n queryBuilder.skip(mangoQuery.skip);\n }\n if (mangoQuery.sort) {\n mangoQuery.sort.forEach(s => queryBuilder.sort(s));\n }\n }\n }\n\n /**\n * Specifies a `path` for use with chaining.\n */\n where(_path: string, _val?: MangoQuerySelector): NoSqlQueryBuilder {\n if (!arguments.length) return this as any;\n const type = typeof arguments[0];\n if ('string' === type) {\n this._path = arguments[0];\n if (2 === arguments.length) {\n (this._conditions as any)[this._path] = arguments[1];\n }\n return this as any;\n }\n\n if ('object' === type && !Array.isArray(arguments[0])) {\n return this.merge(arguments[0]);\n }\n\n throw newRxTypeError('MQ1', {\n path: arguments[0]\n });\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * ####Example\n * User.where('age').equals(49);\n */\n equals(val: any): NoSqlQueryBuilder {\n this._ensurePath('equals');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies the complementary comparison value for paths specified with `where()`\n * This is alias of `equals`\n */\n eq(val: any): NoSqlQueryBuilder {\n this._ensurePath('eq');\n const path = this._path;\n (this._conditions as any)[path] = val;\n return this as any;\n }\n\n /**\n * Specifies arguments for an `$or` condition.\n * ####Example\n * query.or([{ color: 'red' }, { status: 'emergency' }])\n */\n or(array: any[]): NoSqlQueryBuilder {\n const or = this._conditions.$or || (this._conditions.$or = []);\n if (!Array.isArray(array)) array = [array];\n or.push.apply(or, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$nor` condition.\n * ####Example\n * query.nor([{ color: 'green' }, { status: 'ok' }])\n */\n nor(array: any[]): NoSqlQueryBuilder {\n const nor = this._conditions.$nor || (this._conditions.$nor = []);\n if (!Array.isArray(array)) array = [array];\n nor.push.apply(nor, array);\n return this as any;\n }\n\n /**\n * Specifies arguments for a `$and` condition.\n * ####Example\n * query.and([{ color: 'green' }, { status: 'ok' }])\n * @see $and http://docs.mongodb.org/manual/reference/operator/and/\n */\n and(array: any[]): NoSqlQueryBuilder {\n const and = this._conditions.$and || (this._conditions.$and = []);\n if (!Array.isArray(array)) array = [array];\n and.push.apply(and, array);\n return this as any;\n }\n\n /**\n * Specifies a `$mod` condition\n */\n mod(_path: string, _val: number): NoSqlQueryBuilder {\n let val;\n let path;\n\n if (1 === arguments.length) {\n this._ensurePath('mod');\n val = arguments[0];\n path = this._path;\n } else if (2 === arguments.length && !Array.isArray(arguments[1])) {\n this._ensurePath('mod');\n val = (arguments as any).slice();\n path = this._path;\n } else if (3 === arguments.length) {\n val = (arguments as any).slice(1);\n path = arguments[0];\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$mod = val;\n return this as any;\n }\n\n /**\n * Specifies an `$exists` condition\n * ####Example\n * // { name: { $exists: true }}\n * Thing.where('name').exists()\n * Thing.where('name').exists(true)\n * Thing.find().exists('name')\n */\n exists(_path: string, _val: number): NoSqlQueryBuilder {\n let path;\n let val;\n if (0 === arguments.length) {\n this._ensurePath('exists');\n path = this._path;\n val = true;\n } else if (1 === arguments.length) {\n if ('boolean' === typeof arguments[0]) {\n this._ensurePath('exists');\n path = this._path;\n val = arguments[0];\n } else {\n path = arguments[0];\n val = true;\n }\n } else if (2 === arguments.length) {\n path = arguments[0];\n val = arguments[1];\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$exists = val;\n return this as any;\n }\n\n /**\n * Specifies an `$elemMatch` condition\n * ####Example\n * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})\n * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})\n * query.elemMatch('comment', function (elem) {\n * elem.where('author').equals('autobot');\n * elem.where('votes').gte(5);\n * })\n * query.where('comment').elemMatch(function (elem) {\n * elem.where({ author: 'autobot' });\n * elem.where('votes').gte(5);\n * })\n */\n elemMatch(_path: string, _criteria: any): NoSqlQueryBuilder {\n if (null === arguments[0])\n throw newRxTypeError('MQ2');\n\n let fn;\n let path;\n let criteria;\n\n if ('function' === typeof arguments[0]) {\n this._ensurePath('elemMatch');\n path = this._path;\n fn = arguments[0];\n } else if (isObject(arguments[0])) {\n this._ensurePath('elemMatch');\n path = this._path;\n criteria = arguments[0];\n } else if ('function' === typeof arguments[1]) {\n path = arguments[0];\n fn = arguments[1];\n } else if (arguments[1] && isObject(arguments[1])) {\n path = arguments[0];\n criteria = arguments[1];\n } else\n throw newRxTypeError('MQ2');\n\n if (fn) {\n criteria = new NoSqlQueryBuilderClass;\n fn(criteria);\n criteria = criteria._conditions;\n }\n\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\n conds.$elemMatch = criteria;\n return this as any;\n }\n\n /**\n * Sets the sort order\n * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1.\n * If a string is passed, it must be a space delimited list of path names.\n * The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.\n * ####Example\n * query.sort({ field: 'asc', test: -1 });\n * query.sort('field -test');\n * query.sort([['field', 1], ['test', -1]]);\n */\n sort(arg: any): NoSqlQueryBuilder {\n if (!arg) return this as any;\n let len;\n const type = typeof arg;\n // .sort([['field', 1], ['test', -1]])\n if (Array.isArray(arg)) {\n len = arg.length;\n for (let i = 0; i < arg.length; ++i) {\n _pushArr(this.options, arg[i][0], arg[i][1]);\n }\n\n return this as any;\n }\n\n // .sort('field -test')\n if (1 === arguments.length && 'string' === type) {\n arg = arg.split(/\\s+/);\n len = arg.length;\n for (let i = 0; i < len; ++i) {\n let field = arg[i];\n if (!field) continue;\n const ascend = '-' === field[0] ? -1 : 1;\n if (ascend === -1) field = field.substring(1);\n push(this.options, field, ascend);\n }\n\n return this as any;\n }\n\n // .sort({ field: 1, test: -1 })\n if (isObject(arg)) {\n const keys = Object.keys(arg);\n keys.forEach(field => push(this.options, field, arg[field]));\n return this as any;\n }\n\n throw newRxTypeError('MQ3', {\n args: arguments\n });\n }\n\n /**\n * Merges another MQuery or conditions object into this one.\n *\n * When a MQuery is passed, conditions, field selection and options are merged.\n *\n */\n merge(source: any): NoSqlQueryBuilder {\n if (!source) {\n return this as any;\n }\n\n if (!canMerge(source)) {\n throw newRxTypeError('MQ4', {\n source\n });\n }\n\n if (source instanceof NoSqlQueryBuilderClass) {\n // if source has a feature, apply it to ourselves\n\n if (source._conditions)\n merge(this._conditions, source._conditions);\n\n if (source._fields) {\n if (!this._fields) this._fields = {};\n merge(this._fields, source._fields);\n }\n\n if (source.options) {\n if (!this.options) this.options = {};\n merge(this.options, source.options);\n }\n\n if (source._distinct)\n this._distinct = source._distinct;\n\n return this as any;\n }\n\n // plain object\n merge(this._conditions, source);\n\n return this as any;\n }\n\n /**\n * Finds documents.\n * ####Example\n * query.find()\n * query.find({ name: 'Burning Lights' })\n */\n find(criteria: any): NoSqlQueryBuilder {\n if (canMerge(criteria)) {\n this.merge(criteria);\n }\n\n return this as any;\n }\n\n /**\n * Make sure _path is set.\n *\n * @param {String} method\n */\n _ensurePath(method: any) {\n if (!this._path) {\n throw newRxError('MQ5', {\n method\n });\n }\n }\n\n toJSON(): {\n query: MangoQuery;\n path?: string;\n } {\n const query: MangoQuery = {\n selector: this._conditions,\n };\n\n if (this.options.skip) {\n query.skip = this.options.skip;\n }\n if (this.options.limit) {\n query.limit = this.options.limit;\n }\n if (this.options.sort) {\n query.sort = mQuerySortToRxDBSort(this.options.sort);\n }\n\n return {\n query,\n path: this._path\n };\n }\n}\n\nexport function mQuerySortToRxDBSort(\n sort: { [k: string]: 1 | -1; }\n): MangoQuerySortPart[] {\n return Object.entries(sort).map(([k, v]) => {\n const direction: MangoQuerySortDirection = v === 1 ? 'asc' : 'desc';\n const part: MangoQuerySortPart = { [k]: direction } as any;\n return part;\n });\n}\n\n/**\n * Because some prototype-methods are generated,\n * we have to define the type of NoSqlQueryBuilder here\n */\n\nexport interface NoSqlQueryBuilder extends NoSqlQueryBuilderClass {\n maxScan: ReturnSelfNumberFunction;\n batchSize: ReturnSelfNumberFunction;\n limit: ReturnSelfNumberFunction;\n skip: ReturnSelfNumberFunction;\n comment: ReturnSelfFunction;\n\n gt: ReturnSelfFunction;\n gte: ReturnSelfFunction;\n lt: ReturnSelfFunction;\n lte: ReturnSelfFunction;\n ne: ReturnSelfFunction;\n in: ReturnSelfFunction;\n nin: ReturnSelfFunction;\n all: ReturnSelfFunction;\n regex: ReturnSelfFunction;\n size: ReturnSelfFunction;\n\n}\n\ndeclare type ReturnSelfFunction = (v: any) => NoSqlQueryBuilder;\ndeclare type ReturnSelfNumberFunction = (v: number | null) => NoSqlQueryBuilder;\n\n/**\n * limit, skip, maxScan, batchSize, comment\n *\n * Sets these associated options.\n *\n * query.comment('feed query');\n */\nexport const OTHER_MANGO_ATTRIBUTES = ['limit', 'skip', 'maxScan', 'batchSize', 'comment'];\nOTHER_MANGO_ATTRIBUTES.forEach(function (method) {\n (NoSqlQueryBuilderClass.prototype as any)[method] = function (v: any) {\n this.options[method] = v;\n return this;\n };\n});\n\n\n/**\n * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance\n *\n * Thing.where('type').nin(array)\n */\nexport const OTHER_MANGO_OPERATORS = [\n 'gt', 'gte', 'lt', 'lte', 'ne',\n 'in', 'nin', 'all', 'regex', 'size'\n];\nOTHER_MANGO_OPERATORS.forEach(function ($conditional) {\n (NoSqlQueryBuilderClass.prototype as any)[$conditional] = function () {\n let path;\n let val;\n\n if (1 === arguments.length) {\n this._ensurePath($conditional);\n val = arguments[0];\n path = this._path;\n } else {\n val = arguments[1];\n path = arguments[0];\n }\n\n const conds = this._conditions[path] === null || typeof this._conditions[path] === 'object' ?\n this._conditions[path] :\n (this._conditions[path] = {});\n\n\n\n if ($conditional === 'regex') {\n if (val instanceof RegExp) {\n throw newRxError('QU16', {\n field: path,\n query: this._conditions,\n });\n }\n if (typeof val === 'string') {\n conds['$' + $conditional] = val;\n } else {\n conds['$' + $conditional] = val.$regex;\n if (val.$options) {\n conds.$options = val.$options;\n }\n }\n } else {\n conds['$' + $conditional] = val;\n }\n\n return this;\n };\n});\n\n\nfunction push(opts: any, field: string, value: any) {\n if (Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ6', {\n opts,\n field,\n value\n });\n }\n\n if (value && value.$meta) {\n const sort = opts.sort || (opts.sort = {});\n sort[field] = {\n $meta: value.$meta\n };\n return;\n }\n\n const val = String(value || 1).toLowerCase();\n if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) {\n if (Array.isArray(value)) value = '[' + value + ']';\n throw newRxTypeError('MQ7', {\n field,\n value\n });\n }\n // store `sort` in a sane format\n const s = opts.sort || (opts.sort = {});\n const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');\n s[field] = parseInt(valueStr, 10);\n}\n\nfunction _pushArr(opts: any, field: string, value: any) {\n opts.sort = opts.sort || [];\n if (!Array.isArray(opts.sort)) {\n throw newRxTypeError('MQ8', {\n opts,\n field,\n value\n });\n }\n\n /* const valueStr = value.toString()\n .replace('asc', '1')\n .replace('ascending', '1')\n .replace('desc', '-1')\n .replace('descending', '-1');*/\n opts.sort.push([field, value]);\n}\n\n\n/**\n * Determines if `conds` can be merged using `mquery().merge()`\n */\nexport function canMerge(conds: any): boolean {\n return conds instanceof NoSqlQueryBuilderClass || isObject(conds);\n}\n\n\nexport function createQueryBuilder(query?: MangoQuery, path?: any): NoSqlQueryBuilder {\n return new NoSqlQueryBuilderClass(query, path) as NoSqlQueryBuilder;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/replication-graphql/index.js.map b/dist/esm/plugins/replication-graphql/index.js.map index 67116d18674..a7637e04775 100644 --- a/dist/esm/plugins/replication-graphql/index.js.map +++ b/dist/esm/plugins/replication-graphql/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["ensureNotFalsy","flatClone","getProperty","graphQLRequest","RxDBLeaderElectionPlugin","RxReplicationState","startReplicationOnLeaderShip","addRxPlugin","removeGraphQLWebSocketRef","getGraphQLWebSocket","Subject","RxGraphQLReplicationState","_RxReplicationState","url","clientState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","customFetch","_this","call","_inheritsLoose","_proto","prototype","setHeaders","headers","setCredentials","credentials","queryParams","fetch","http","replicateGraphQL","waitForLeadership","mutateableClientState","pullStream$","replicationPrimitivesPull","pullBatchSize","batchSize","handler","lastPulledCheckpoint","pullGraphQL","queryBuilder","result","graphqlReplicationState","errors","dataPath","Object","keys","data","responseModifier","docsData","documents","newCheckpoint","checkpoint","modifier","stream$","asObservable","replicationPrimitivesPush","rows","pushObj","mustUseSocket","ws","streamQueryBuilder","startBefore","start","bind","httpHeaders","includeWsHeaders","undefined","wsClient","on","next","query","subscribe","streamResponse","firstField","error","complete","cancelBefore","cancel","isStopped"],"sources":["../../../../src/plugins/replication-graphql/index.ts"],"sourcesContent":["/**\n * this plugin adds the RxCollection.syncGraphQl()-function to rxdb\n * you can use it to sync collections with a remote graphql endpoint.\n */\nimport {\n ensureNotFalsy,\n flatClone,\n getProperty\n} from '../../plugins/utils/index.ts';\n\nimport {\n graphQLRequest\n} from './helper.ts';\n\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport type {\n RxCollection,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxReplicationWriteToMasterRow,\n GraphQLServerUrl,\n RxReplicationPullStreamItem,\n RxGraphQLReplicationQueryBuilderResponseObject,\n RxGraphQLReplicationClientState,\n ById\n} from '../../types/index.d.ts';\nimport {\n RxReplicationState,\n startReplicationOnLeaderShip\n} from '../replication/index.ts';\nimport {\n addRxPlugin,\n SyncOptionsGraphQL,\n WithDeleted\n} from '../../index.ts';\n\nimport {\n removeGraphQLWebSocketRef,\n getGraphQLWebSocket\n} from './graphql-websocket.ts';\nimport { Subject } from 'rxjs';\n\n\n\n\nexport class RxGraphQLReplicationState extends RxReplicationState {\n constructor(\n public readonly url: GraphQLServerUrl,\n public readonly clientState: RxGraphQLReplicationClientState,\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n public readonly customFetch?: WindowOrWorkerGlobalScope['fetch']\n ) {\n super(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n }\n\n setHeaders(headers: ById): void {\n this.clientState.headers = flatClone(headers);\n }\n\n setCredentials(credentials: RequestCredentials | undefined) {\n this.clientState.credentials = credentials;\n }\n\n graphQLRequest(\n queryParams: RxGraphQLReplicationQueryBuilderResponseObject\n ) {\n return graphQLRequest(\n this.customFetch ?? fetch,\n ensureNotFalsy(this.url.http),\n this.clientState,\n queryParams\n );\n }\n}\n\nexport function replicateGraphQL(\n {\n collection,\n url,\n headers = {},\n credentials,\n deletedField = '_deleted',\n waitForLeadership = true,\n pull,\n push,\n live = true,\n fetch: customFetch,\n retryTime = 1000 * 5, // in ms\n autoStart = true,\n replicationIdentifier\n }: SyncOptionsGraphQL\n): RxGraphQLReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n /**\n * We use this object to store the GraphQL client\n * so we can later swap out the client inside of the replication handlers.\n */\n const mutateableClientState = {\n headers,\n credentials\n };\n\n\n const pullStream$: Subject> = new Subject();\n\n let replicationPrimitivesPull: ReplicationPullOptions | undefined;\n if (pull) {\n const pullBatchSize = pull.batchSize ? pull.batchSize : 20;\n replicationPrimitivesPull = {\n async handler(\n lastPulledCheckpoint: CheckpointType | undefined\n ) {\n const pullGraphQL = await pull.queryBuilder(lastPulledCheckpoint, pullBatchSize);\n const result = await graphqlReplicationState.graphQLRequest(pullGraphQL);\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = pull.dataPath || ['data', Object.keys(result.data)[0]];\n let data: any = getProperty(result, dataPath);\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'handler',\n lastPulledCheckpoint\n );\n }\n\n const docsData: WithDeleted[] = data.documents;\n const newCheckpoint = data.checkpoint;\n\n return {\n documents: docsData,\n checkpoint: newCheckpoint\n };\n },\n batchSize: pull.batchSize,\n modifier: pull.modifier,\n stream$: pullStream$.asObservable()\n };\n }\n let replicationPrimitivesPush: ReplicationPushOptions | undefined;\n if (push) {\n replicationPrimitivesPush = {\n async handler(\n rows: RxReplicationWriteToMasterRow[]\n ) {\n const pushObj = await push.queryBuilder(rows);\n const result = await graphqlReplicationState.graphQLRequest(pushObj);\n\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = push.dataPath || Object.keys(result.data)[0];\n let data: any = getProperty(result.data, dataPath);\n\n if (push.responseModifier) {\n data = await push.responseModifier(\n data,\n );\n }\n\n return data;\n },\n batchSize: push.batchSize,\n modifier: push.modifier\n };\n }\n\n const graphqlReplicationState = new RxGraphQLReplicationState(\n url,\n mutateableClientState,\n replicationIdentifier,\n collection,\n deletedField,\n replicationPrimitivesPull,\n replicationPrimitivesPush,\n live,\n retryTime,\n autoStart,\n customFetch\n );\n\n const mustUseSocket = url.ws &&\n pull &&\n pull.streamQueryBuilder &&\n live;\n\n const startBefore = graphqlReplicationState.start.bind(graphqlReplicationState);\n graphqlReplicationState.start = () => {\n if (mustUseSocket) {\n const httpHeaders = pull.includeWsHeaders ? mutateableClientState.headers : undefined;\n const wsClient = getGraphQLWebSocket(ensureNotFalsy(url.ws), httpHeaders);\n\n wsClient.on('connected', () => {\n pullStream$.next('RESYNC');\n });\n\n const query: any = ensureNotFalsy(pull.streamQueryBuilder)(mutateableClientState.headers);\n\n wsClient.subscribe(\n query,\n {\n next: async (streamResponse: any) => {\n const firstField = Object.keys(streamResponse.data)[0];\n let data = streamResponse.data[firstField];\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'stream'\n );\n }\n pullStream$.next(data);\n },\n error: (error: any) => {\n pullStream$.error(error);\n },\n complete: () => {\n pullStream$.complete();\n }\n });\n }\n return startBefore();\n };\n\n const cancelBefore = graphqlReplicationState.cancel.bind(graphqlReplicationState);\n graphqlReplicationState.cancel = () => {\n if (!graphqlReplicationState.isStopped()) {\n pullStream$.complete();\n if (mustUseSocket) {\n removeGraphQLWebSocketRef(ensureNotFalsy(url.ws));\n }\n }\n return cancelBefore();\n };\n\n startReplicationOnLeaderShip(waitForLeadership, graphqlReplicationState);\n return graphqlReplicationState;\n}\n\nexport * from './helper.ts';\nexport * from './graphql-schema-from-rx-schema.ts';\nexport * from './query-builder-from-rx-schema.ts';\nexport * from './graphql-websocket.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["ensureNotFalsy","flatClone","getProperty","graphQLRequest","RxDBLeaderElectionPlugin","RxReplicationState","startReplicationOnLeaderShip","addRxPlugin","removeGraphQLWebSocketRef","getGraphQLWebSocket","Subject","RxGraphQLReplicationState","_RxReplicationState","url","clientState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","customFetch","_this","call","_inheritsLoose","_proto","prototype","setHeaders","headers","setCredentials","credentials","queryParams","fetch","http","replicateGraphQL","waitForLeadership","mutateableClientState","pullStream$","replicationPrimitivesPull","pullBatchSize","batchSize","handler","lastPulledCheckpoint","pullGraphQL","queryBuilder","result","graphqlReplicationState","errors","dataPath","Object","keys","data","responseModifier","docsData","documents","newCheckpoint","checkpoint","modifier","stream$","asObservable","replicationPrimitivesPush","rows","pushObj","mustUseSocket","ws","streamQueryBuilder","startBefore","start","bind","httpHeaders","includeWsHeaders","undefined","wsClient","on","next","query","subscribe","streamResponse","firstField","error","complete","cancelBefore","cancel","isStopped"],"sources":["../../../../src/plugins/replication-graphql/index.ts"],"sourcesContent":["/**\n * this plugin adds the RxCollection.syncGraphQl()-function to rxdb\n * you can use it to sync collections with a remote graphql endpoint.\n */\nimport {\n ensureNotFalsy,\n flatClone,\n getProperty\n} from '../../plugins/utils/index.ts';\n\nimport {\n graphQLRequest\n} from './helper.ts';\n\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport type {\n RxCollection,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxReplicationWriteToMasterRow,\n GraphQLServerUrl,\n RxReplicationPullStreamItem,\n RxGraphQLReplicationQueryBuilderResponseObject,\n RxGraphQLReplicationClientState,\n ById\n} from '../../types/index.d.ts';\nimport {\n RxReplicationState,\n startReplicationOnLeaderShip\n} from '../replication/index.ts';\nimport {\n addRxPlugin,\n SyncOptionsGraphQL,\n WithDeleted\n} from '../../index.ts';\n\nimport {\n removeGraphQLWebSocketRef,\n getGraphQLWebSocket\n} from './graphql-websocket.ts';\nimport { Subject } from 'rxjs';\n\n\n\n\nexport class RxGraphQLReplicationState extends RxReplicationState {\n constructor(\n public readonly url: GraphQLServerUrl,\n public readonly clientState: RxGraphQLReplicationClientState,\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n public readonly customFetch?: WindowOrWorkerGlobalScope['fetch']\n ) {\n super(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n }\n\n setHeaders(headers: ById): void {\n this.clientState.headers = flatClone(headers);\n }\n\n setCredentials(credentials: RequestCredentials | undefined) {\n this.clientState.credentials = credentials;\n }\n\n graphQLRequest(\n queryParams: RxGraphQLReplicationQueryBuilderResponseObject\n ) {\n return graphQLRequest(\n this.customFetch ?? fetch,\n ensureNotFalsy(this.url.http),\n this.clientState,\n queryParams\n );\n }\n}\n\nexport function replicateGraphQL(\n {\n collection,\n url,\n headers = {},\n credentials,\n deletedField = '_deleted',\n waitForLeadership = true,\n pull,\n push,\n live = true,\n fetch: customFetch,\n retryTime = 1000 * 5, // in ms\n autoStart = true,\n replicationIdentifier\n }: SyncOptionsGraphQL\n): RxGraphQLReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n /**\n * We use this object to store the GraphQL client\n * so we can later swap out the client inside of the replication handlers.\n */\n const mutateableClientState = {\n headers,\n credentials\n };\n\n\n const pullStream$: Subject> = new Subject();\n\n let replicationPrimitivesPull: ReplicationPullOptions | undefined;\n if (pull) {\n const pullBatchSize = pull.batchSize ? pull.batchSize : 20;\n replicationPrimitivesPull = {\n async handler(\n lastPulledCheckpoint: CheckpointType | undefined\n ) {\n const pullGraphQL = await pull.queryBuilder(lastPulledCheckpoint, pullBatchSize);\n const result = await graphqlReplicationState.graphQLRequest(pullGraphQL);\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = pull.dataPath || ['data', Object.keys(result.data)[0]];\n let data: any = getProperty(result, dataPath);\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'handler',\n lastPulledCheckpoint\n );\n }\n\n const docsData: WithDeleted[] = data.documents;\n const newCheckpoint = data.checkpoint;\n\n return {\n documents: docsData,\n checkpoint: newCheckpoint\n };\n },\n batchSize: pull.batchSize,\n modifier: pull.modifier,\n stream$: pullStream$.asObservable()\n };\n }\n let replicationPrimitivesPush: ReplicationPushOptions | undefined;\n if (push) {\n replicationPrimitivesPush = {\n async handler(\n rows: RxReplicationWriteToMasterRow[]\n ) {\n const pushObj = await push.queryBuilder(rows);\n const result = await graphqlReplicationState.graphQLRequest(pushObj);\n\n if (result.errors) {\n throw result.errors;\n }\n const dataPath = push.dataPath || Object.keys(result.data)[0];\n let data: any = getProperty(result.data, dataPath);\n\n if (push.responseModifier) {\n data = await push.responseModifier(\n data,\n );\n }\n\n return data;\n },\n batchSize: push.batchSize,\n modifier: push.modifier\n };\n }\n\n const graphqlReplicationState = new RxGraphQLReplicationState(\n url,\n mutateableClientState,\n replicationIdentifier,\n collection,\n deletedField,\n replicationPrimitivesPull,\n replicationPrimitivesPush,\n live,\n retryTime,\n autoStart,\n customFetch\n );\n\n const mustUseSocket = url.ws &&\n pull &&\n pull.streamQueryBuilder &&\n live;\n\n const startBefore = graphqlReplicationState.start.bind(graphqlReplicationState);\n graphqlReplicationState.start = () => {\n if (mustUseSocket) {\n const httpHeaders = pull.includeWsHeaders ? mutateableClientState.headers : undefined;\n const wsClient = getGraphQLWebSocket(ensureNotFalsy(url.ws), httpHeaders);\n\n wsClient.on('connected', () => {\n pullStream$.next('RESYNC');\n });\n\n const query: any = ensureNotFalsy(pull.streamQueryBuilder)(mutateableClientState.headers);\n\n wsClient.subscribe(\n query,\n {\n next: async (streamResponse: any) => {\n const firstField = Object.keys(streamResponse.data)[0];\n let data = streamResponse.data[firstField];\n if (pull.responseModifier) {\n data = await pull.responseModifier(\n data,\n 'stream'\n );\n }\n pullStream$.next(data);\n },\n error: (error: any) => {\n pullStream$.error(error);\n },\n complete: () => {\n pullStream$.complete();\n }\n });\n }\n return startBefore();\n };\n\n const cancelBefore = graphqlReplicationState.cancel.bind(graphqlReplicationState);\n graphqlReplicationState.cancel = () => {\n if (!graphqlReplicationState.isStopped()) {\n pullStream$.complete();\n if (mustUseSocket) {\n removeGraphQLWebSocketRef(ensureNotFalsy(url.ws));\n }\n }\n return cancelBefore();\n };\n\n startReplicationOnLeaderShip(waitForLeadership, graphqlReplicationState);\n return graphqlReplicationState;\n}\n\nexport * from './helper.ts';\nexport * from './graphql-schema-from-rx-schema.ts';\nexport * from './query-builder-from-rx-schema.ts';\nexport * from './graphql-websocket.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/replication-webrtc/index.js.map b/dist/esm/plugins/replication-webrtc/index.js.map index 2a901f3de50..79a881a4eca 100644 --- a/dist/esm/plugins/replication-webrtc/index.js.map +++ b/dist/esm/plugins/replication-webrtc/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["BehaviorSubject","filter","firstValueFrom","map","Subject","addRxPlugin","rxStorageInstanceToReplicationHandler","ensureNotFalsy","getFromMapOrThrow","randomCouchString","RxDBLeaderElectionPlugin","replicateRxCollection","isMasterInWebRTCReplication","sendMessageAndAwaitAnswer","newRxError","replicateWebRTC","options","collection","pull","batchSize","push","database","multiInstance","waitForLeadership","requestCounter","requestFlag","getRequestId","count","token","storageToken","pool","RxWebRTCReplicationPool","connectionHandlerCreator","subs","connectionHandler","error$","subscribe","err","next","disconnect$","peer","removePeer","message$","pipe","data","message","method","send","id","result","connectSub","connect$","canceled","isPeerValid","isValid","peerToken","tokenResponse","params","error","isMaster","hashFunction","replicationState","masterHandler","masterReplicationHandler","masterChangeStreamSub","masterChangeStream$","ev","streamResponse","p","unsubscribe","messageSub","msgPeer","bind","response","replicationIdentifier","name","topic","join","autoStart","deletedField","live","retryTime","Object","assign","handler","lastPulledCheckpoint","answer","stream$","response$","m","undefined","docs","addPeer","peerStates$","Map","onDestroy","cancel","storageInstance","conflictHandler","_proto","prototype","peerState","getValue","set","delete","forEach","sub","awaitFirstPeer","peerStates","size","Array","from","keys","destroy"],"sources":["../../../../src/plugins/replication-webrtc/index.ts"],"sourcesContent":["import {\n BehaviorSubject,\n filter,\n firstValueFrom,\n map,\n Subject,\n Subscription\n} from 'rxjs';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { rxStorageInstanceToReplicationHandler } from '../../replication-protocol/index.ts';\nimport type {\n RxCollection,\n RxError,\n RxReplicationHandler,\n RxReplicationWriteToMasterRow,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport { replicateRxCollection } from '../replication/index.ts';\nimport {\n isMasterInWebRTCReplication,\n sendMessageAndAwaitAnswer\n} from './webrtc-helper.ts';\nimport type {\n WebRTCConnectionHandler,\n WebRTCPeerState,\n WebRTCReplicationCheckpoint,\n WebRTCResponse,\n RxWebRTCReplicationState,\n SyncOptionsWebRTC\n} from './webrtc-types.ts';\nimport { newRxError } from '../../rx-error.ts';\n\n\nexport async function replicateWebRTC(\n options: SyncOptionsWebRTC\n): Promise> {\n const collection = options.collection;\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n // fill defaults\n if (options.pull) {\n if (!options.pull.batchSize) {\n options.pull.batchSize = 20;\n }\n }\n if (options.push) {\n if (!options.push.batchSize) {\n options.push.batchSize = 20;\n }\n }\n\n if (collection.database.multiInstance) {\n await collection.database.waitForLeadership();\n }\n\n // used to easier debug stuff\n let requestCounter = 0;\n const requestFlag = randomCouchString(10);\n function getRequestId() {\n const count = requestCounter++;\n return collection.database.token + '|' + requestFlag + '|' + count;\n }\n\n const storageToken = await collection.database.storageToken;\n const pool = new RxWebRTCReplicationPool(\n collection,\n options,\n await options.connectionHandlerCreator(options)\n );\n\n\n pool.subs.push(\n pool.connectionHandler.error$.subscribe(err => pool.error$.next(err)),\n pool.connectionHandler.disconnect$.subscribe(peer => pool.removePeer(peer))\n );\n\n /**\n * Answer if someone requests our storage token\n */\n pool.subs.push(\n pool.connectionHandler.message$.pipe(\n filter(data => data.message.method === 'token')\n ).subscribe(data => {\n pool.connectionHandler.send(data.peer, {\n id: data.message.id,\n result: storageToken\n });\n })\n );\n\n const connectSub = pool.connectionHandler.connect$\n .pipe(\n filter(() => !pool.canceled)\n )\n .subscribe(async (peer) => {\n if (options.isPeerValid) {\n const isValid = await options.isPeerValid(peer);\n if (!isValid) {\n return;\n }\n }\n\n let peerToken: string;\n try {\n const tokenResponse = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n id: getRequestId(),\n method: 'token',\n params: []\n }\n );\n peerToken = tokenResponse.result;\n } catch (error: any) {\n /**\n * If could not get the tokenResponse,\n * just ignore that peer.\n */\n pool.error$.next(newRxError('RC_WEBRTC_PEER', {\n error\n }));\n return;\n }\n const isMaster = await isMasterInWebRTCReplication(collection.database.hashFunction, storageToken, peerToken);\n\n let replicationState: RxWebRTCReplicationState | undefined;\n if (isMaster) {\n const masterHandler = pool.masterReplicationHandler;\n const masterChangeStreamSub = masterHandler.masterChangeStream$.subscribe(ev => {\n const streamResponse: WebRTCResponse = {\n id: 'masterChangeStream$',\n result: ev\n };\n pool.connectionHandler.send(peer, streamResponse);\n });\n\n // clean up the subscription\n pool.subs.push(\n masterChangeStreamSub,\n pool.connectionHandler.disconnect$.pipe(\n filter(p => p === peer)\n ).subscribe(() => masterChangeStreamSub.unsubscribe())\n );\n\n const messageSub = pool.connectionHandler.message$\n .pipe(\n filter(data => data.peer === peer),\n filter(data => data.message.method !== 'token')\n )\n .subscribe(async (data) => {\n const { peer: msgPeer, message } = data;\n /**\n * If it is not a function,\n * it means that the client requested the masterChangeStream$\n */\n const method = (masterHandler as any)[message.method].bind(masterHandler);\n const result = await (method as any)(...message.params);\n const response: WebRTCResponse = {\n id: message.id,\n result\n };\n pool.connectionHandler.send(msgPeer, response);\n });\n pool.subs.push(messageSub);\n } else {\n replicationState = replicateRxCollection({\n replicationIdentifier: [collection.name, options.topic, peerToken].join('||'),\n collection: collection,\n autoStart: true,\n deletedField: '_deleted',\n live: true,\n retryTime: options.retryTime,\n waitForLeadership: false,\n pull: options.pull ? Object.assign({}, options.pull, {\n async handler(lastPulledCheckpoint: WebRTCReplicationCheckpoint | undefined) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterChangesSince',\n params: [\n lastPulledCheckpoint,\n ensureNotFalsy(options.pull).batchSize\n ],\n id: getRequestId()\n }\n );\n return answer.result;\n },\n stream$: pool.connectionHandler.response$.pipe(\n filter(m => m.response.id === 'masterChangeStream$'),\n map(m => m.response.result)\n )\n\n }) : undefined,\n push: options.push ? Object.assign({}, options.push, {\n async handler(docs: RxReplicationWriteToMasterRow[]) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterWrite',\n params: [docs],\n id: getRequestId()\n }\n );\n return answer.result;\n }\n }) : undefined\n });\n }\n pool.addPeer(peer, replicationState);\n });\n pool.subs.push(connectSub);\n return pool;\n}\n\n\n/**\n * Because the WebRTC replication runs between many instances,\n * we use a Pool instead of returning a single replication state.\n */\nexport class RxWebRTCReplicationPool {\n peerStates$: BehaviorSubject>> = new BehaviorSubject(new Map());\n canceled: boolean = false;\n masterReplicationHandler: RxReplicationHandler;\n subs: Subscription[] = [];\n\n public error$ = new Subject();\n\n constructor(\n public readonly collection: RxCollection,\n public readonly options: SyncOptionsWebRTC,\n public readonly connectionHandler: WebRTCConnectionHandler\n ) {\n this.collection.onDestroy.push(() => this.cancel());\n this.masterReplicationHandler = rxStorageInstanceToReplicationHandler(\n collection.storageInstance,\n collection.conflictHandler,\n collection.database.token,\n );\n }\n\n addPeer(\n peer: PeerType,\n // only if isMaster=false it has a replicationState\n replicationState?: RxWebRTCReplicationState\n ) {\n const peerState: WebRTCPeerState = {\n peer,\n replicationState,\n subs: []\n };\n this.peerStates$.next(this.peerStates$.getValue().set(peer, peerState));\n if (replicationState) {\n peerState.subs.push(\n replicationState.error$.subscribe(ev => this.error$.next(ev))\n );\n }\n }\n removePeer(peer: PeerType) {\n const peerState = getFromMapOrThrow(this.peerStates$.getValue(), peer);\n this.peerStates$.getValue().delete(peer);\n this.peerStates$.next(this.peerStates$.getValue());\n peerState.subs.forEach(sub => sub.unsubscribe());\n if (peerState.replicationState) {\n peerState.replicationState.cancel();\n }\n }\n\n // often used in unit tests\n awaitFirstPeer() {\n return firstValueFrom(\n this.peerStates$.pipe(\n filter(peerStates => peerStates.size > 0)\n )\n );\n }\n\n public async cancel() {\n if (this.canceled) {\n return;\n }\n this.canceled = true;\n this.subs.forEach(sub => sub.unsubscribe());\n Array.from(this.peerStates$.getValue().keys()).forEach(peer => {\n this.removePeer(peer);\n });\n await this.connectionHandler.destroy();\n }\n}\n\nexport * from './webrtc-helper.ts';\nexport * from './signaling-server.ts';\nexport * from './webrtc-types.ts';\n// export * from './connection-handler-webtorrent';\n// export * from './connection-handler-p2pcf';\nexport * from './connection-handler-simple-peer.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["BehaviorSubject","filter","firstValueFrom","map","Subject","addRxPlugin","rxStorageInstanceToReplicationHandler","ensureNotFalsy","getFromMapOrThrow","randomCouchString","RxDBLeaderElectionPlugin","replicateRxCollection","isMasterInWebRTCReplication","sendMessageAndAwaitAnswer","newRxError","replicateWebRTC","options","collection","pull","batchSize","push","database","multiInstance","waitForLeadership","requestCounter","requestFlag","getRequestId","count","token","storageToken","pool","RxWebRTCReplicationPool","connectionHandlerCreator","subs","connectionHandler","error$","subscribe","err","next","disconnect$","peer","removePeer","message$","pipe","data","message","method","send","id","result","connectSub","connect$","canceled","isPeerValid","isValid","peerToken","tokenResponse","params","error","isMaster","hashFunction","replicationState","masterHandler","masterReplicationHandler","masterChangeStreamSub","masterChangeStream$","ev","streamResponse","p","unsubscribe","messageSub","msgPeer","bind","response","replicationIdentifier","name","topic","join","autoStart","deletedField","live","retryTime","Object","assign","handler","lastPulledCheckpoint","answer","stream$","response$","m","undefined","docs","addPeer","peerStates$","Map","onDestroy","cancel","storageInstance","conflictHandler","_proto","prototype","peerState","getValue","set","delete","forEach","sub","awaitFirstPeer","peerStates","size","Array","from","keys","destroy"],"sources":["../../../../src/plugins/replication-webrtc/index.ts"],"sourcesContent":["import {\n BehaviorSubject,\n filter,\n firstValueFrom,\n map,\n Subject,\n Subscription\n} from 'rxjs';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { rxStorageInstanceToReplicationHandler } from '../../replication-protocol/index.ts';\nimport type {\n RxCollection,\n RxError,\n RxReplicationHandler,\n RxReplicationWriteToMasterRow,\n RxTypeError\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport { replicateRxCollection } from '../replication/index.ts';\nimport {\n isMasterInWebRTCReplication,\n sendMessageAndAwaitAnswer\n} from './webrtc-helper.ts';\nimport type {\n WebRTCConnectionHandler,\n WebRTCPeerState,\n WebRTCReplicationCheckpoint,\n WebRTCResponse,\n RxWebRTCReplicationState,\n SyncOptionsWebRTC\n} from './webrtc-types.ts';\nimport { newRxError } from '../../rx-error.ts';\n\n\nexport async function replicateWebRTC(\n options: SyncOptionsWebRTC\n): Promise> {\n const collection = options.collection;\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n // fill defaults\n if (options.pull) {\n if (!options.pull.batchSize) {\n options.pull.batchSize = 20;\n }\n }\n if (options.push) {\n if (!options.push.batchSize) {\n options.push.batchSize = 20;\n }\n }\n\n if (collection.database.multiInstance) {\n await collection.database.waitForLeadership();\n }\n\n // used to easier debug stuff\n let requestCounter = 0;\n const requestFlag = randomCouchString(10);\n function getRequestId() {\n const count = requestCounter++;\n return collection.database.token + '|' + requestFlag + '|' + count;\n }\n\n const storageToken = await collection.database.storageToken;\n const pool = new RxWebRTCReplicationPool(\n collection,\n options,\n await options.connectionHandlerCreator(options)\n );\n\n\n pool.subs.push(\n pool.connectionHandler.error$.subscribe(err => pool.error$.next(err)),\n pool.connectionHandler.disconnect$.subscribe(peer => pool.removePeer(peer))\n );\n\n /**\n * Answer if someone requests our storage token\n */\n pool.subs.push(\n pool.connectionHandler.message$.pipe(\n filter(data => data.message.method === 'token')\n ).subscribe(data => {\n pool.connectionHandler.send(data.peer, {\n id: data.message.id,\n result: storageToken\n });\n })\n );\n\n const connectSub = pool.connectionHandler.connect$\n .pipe(\n filter(() => !pool.canceled)\n )\n .subscribe(async (peer) => {\n if (options.isPeerValid) {\n const isValid = await options.isPeerValid(peer);\n if (!isValid) {\n return;\n }\n }\n\n let peerToken: string;\n try {\n const tokenResponse = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n id: getRequestId(),\n method: 'token',\n params: []\n }\n );\n peerToken = tokenResponse.result;\n } catch (error: any) {\n /**\n * If could not get the tokenResponse,\n * just ignore that peer.\n */\n pool.error$.next(newRxError('RC_WEBRTC_PEER', {\n error\n }));\n return;\n }\n const isMaster = await isMasterInWebRTCReplication(collection.database.hashFunction, storageToken, peerToken);\n\n let replicationState: RxWebRTCReplicationState | undefined;\n if (isMaster) {\n const masterHandler = pool.masterReplicationHandler;\n const masterChangeStreamSub = masterHandler.masterChangeStream$.subscribe(ev => {\n const streamResponse: WebRTCResponse = {\n id: 'masterChangeStream$',\n result: ev\n };\n pool.connectionHandler.send(peer, streamResponse);\n });\n\n // clean up the subscription\n pool.subs.push(\n masterChangeStreamSub,\n pool.connectionHandler.disconnect$.pipe(\n filter(p => p === peer)\n ).subscribe(() => masterChangeStreamSub.unsubscribe())\n );\n\n const messageSub = pool.connectionHandler.message$\n .pipe(\n filter(data => data.peer === peer),\n filter(data => data.message.method !== 'token')\n )\n .subscribe(async (data) => {\n const { peer: msgPeer, message } = data;\n /**\n * If it is not a function,\n * it means that the client requested the masterChangeStream$\n */\n const method = (masterHandler as any)[message.method].bind(masterHandler);\n const result = await (method as any)(...message.params);\n const response: WebRTCResponse = {\n id: message.id,\n result\n };\n pool.connectionHandler.send(msgPeer, response);\n });\n pool.subs.push(messageSub);\n } else {\n replicationState = replicateRxCollection({\n replicationIdentifier: [collection.name, options.topic, peerToken].join('||'),\n collection: collection,\n autoStart: true,\n deletedField: '_deleted',\n live: true,\n retryTime: options.retryTime,\n waitForLeadership: false,\n pull: options.pull ? Object.assign({}, options.pull, {\n async handler(lastPulledCheckpoint: WebRTCReplicationCheckpoint | undefined) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterChangesSince',\n params: [\n lastPulledCheckpoint,\n ensureNotFalsy(options.pull).batchSize\n ],\n id: getRequestId()\n }\n );\n return answer.result;\n },\n stream$: pool.connectionHandler.response$.pipe(\n filter(m => m.response.id === 'masterChangeStream$'),\n map(m => m.response.result)\n )\n\n }) : undefined,\n push: options.push ? Object.assign({}, options.push, {\n async handler(docs: RxReplicationWriteToMasterRow[]) {\n const answer = await sendMessageAndAwaitAnswer(\n pool.connectionHandler,\n peer,\n {\n method: 'masterWrite',\n params: [docs],\n id: getRequestId()\n }\n );\n return answer.result;\n }\n }) : undefined\n });\n }\n pool.addPeer(peer, replicationState);\n });\n pool.subs.push(connectSub);\n return pool;\n}\n\n\n/**\n * Because the WebRTC replication runs between many instances,\n * we use a Pool instead of returning a single replication state.\n */\nexport class RxWebRTCReplicationPool {\n peerStates$: BehaviorSubject>> = new BehaviorSubject(new Map());\n canceled: boolean = false;\n masterReplicationHandler: RxReplicationHandler;\n subs: Subscription[] = [];\n\n public error$ = new Subject();\n\n constructor(\n public readonly collection: RxCollection,\n public readonly options: SyncOptionsWebRTC,\n public readonly connectionHandler: WebRTCConnectionHandler\n ) {\n this.collection.onDestroy.push(() => this.cancel());\n this.masterReplicationHandler = rxStorageInstanceToReplicationHandler(\n collection.storageInstance,\n collection.conflictHandler,\n collection.database.token,\n );\n }\n\n addPeer(\n peer: PeerType,\n // only if isMaster=false it has a replicationState\n replicationState?: RxWebRTCReplicationState\n ) {\n const peerState: WebRTCPeerState = {\n peer,\n replicationState,\n subs: []\n };\n this.peerStates$.next(this.peerStates$.getValue().set(peer, peerState));\n if (replicationState) {\n peerState.subs.push(\n replicationState.error$.subscribe(ev => this.error$.next(ev))\n );\n }\n }\n removePeer(peer: PeerType) {\n const peerState = getFromMapOrThrow(this.peerStates$.getValue(), peer);\n this.peerStates$.getValue().delete(peer);\n this.peerStates$.next(this.peerStates$.getValue());\n peerState.subs.forEach(sub => sub.unsubscribe());\n if (peerState.replicationState) {\n peerState.replicationState.cancel();\n }\n }\n\n // often used in unit tests\n awaitFirstPeer() {\n return firstValueFrom(\n this.peerStates$.pipe(\n filter(peerStates => peerStates.size > 0)\n )\n );\n }\n\n public async cancel() {\n if (this.canceled) {\n return;\n }\n this.canceled = true;\n this.subs.forEach(sub => sub.unsubscribe());\n Array.from(this.peerStates$.getValue().keys()).forEach(peer => {\n this.removePeer(peer);\n });\n await this.connectionHandler.destroy();\n }\n}\n\nexport * from './webrtc-helper.ts';\nexport * from './signaling-server.ts';\nexport * from './webrtc-types.ts';\n// export * from './connection-handler-webtorrent';\n// export * from './connection-handler-p2pcf';\nexport * from './connection-handler-simple-peer.ts';\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/replication/index.js.map b/dist/esm/plugins/replication/index.js.map index fefe153fb24..49c1dcccf32 100644 --- a/dist/esm/plugins/replication/index.js.map +++ b/dist/esm/plugins/replication/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["BehaviorSubject","combineLatest","filter","mergeMap","Subject","RxDBLeaderElectionPlugin","arrayFilterNotEmpty","ensureNotFalsy","errorToPlainJson","flatClone","getFromMapOrCreate","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_TRUE","toArray","toPromise","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","cancelRxStorageReplication","getRxReplicationMetaInstanceSchema","replicateRxStorageInstance","newRxError","awaitRetry","DEFAULT_MODIFIER","swapDefaultDeletedTodeletedField","handlePulledDocuments","addConnectedStorageToCollection","removeConnectedStorageFromCollection","addRxPlugin","hasEncryption","overwritable","runAsyncPluginHooks","REPLICATION_STATE_BY_COLLECTION","WeakMap","RxReplicationState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","subs","subjects","received","sent","error","canceled","active","received$","asObservable","sent$","error$","canceled$","active$","onCancel","callOnStart","undefined","remoteEvents$","metaInfoPromise","metaInstanceCollectionName","database","hashFunction","name","join","metaInstanceSchema","schema","jsonSchema","collectionName","replicationStates","onDestroy","cancel","Object","keys","forEach","key","defineProperty","get","startPromise","Promise","res","_proto","prototype","start","isStopped","pullModifier","modifier","pushModifier","metaInfo","metaInstance","all","storage","createStorageInstance","databaseName","databaseInstanceToken","token","multiInstance","options","password","devMode","isDevMode","internalReplicationState","pushBatchSize","batchSize","pullBatchSize","initialCheckpoint","upstream","downstream","forkInstance","storageInstance","identifier","conflictHandler","replicationHandler","masterChangeStream$","pipe","_v","ev","useEv","documents","map","d","masterChangesSince","checkpoint","done","result","handler","err","emitError","errors","er","direction","next","useResult","masterWrite","rows","useRowsOrNull","row","newDocumentState","assumedMasterState","useRows","length","Array","isArray","pushRows","args","rxdb","conflicts","events","subscribe","processed","down","document","up","writeToMasterRow","isActive","stream$","getValue","awaitInitialReplication","awaitInSync","t","requestIdlePromise","reSync","emitEvent","promises","fn","checkpointQueue","then","close","sub","unsubscribe","complete","remove","replicateRxCollection","waitForLeadership","replicationState","startReplicationOnLeaderShip","mustWaitForLeadership","waitTillRun"],"sources":["../../../../src/plugins/replication/index.ts"],"sourcesContent":["/**\n * This plugin contains the primitives to create\n * a RxDB client-server replication.\n * It is used in the other replication plugins\n * but also can be used as standalone with a custom replication handler.\n */\n\nimport {\n BehaviorSubject,\n combineLatest,\n filter,\n mergeMap,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n ReplicationOptions,\n ReplicationPullHandlerResult,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxCollection,\n RxDocumentData,\n RxError,\n RxJsonSchema,\n RxReplicationPullStreamItem,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxStorageInstanceReplicationState,\n RxStorageReplicationMeta,\n RxTypeError,\n WithDeleted\n} from '../../types/index.d.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport {\n arrayFilterNotEmpty,\n ensureNotFalsy,\n errorToPlainJson,\n flatClone,\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n toArray,\n toPromise\n} from '../../plugins/utils/index.ts';\nimport {\n awaitRxStorageReplicationFirstInSync,\n awaitRxStorageReplicationInSync,\n cancelRxStorageReplication,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance\n} from '../../replication-protocol/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport {\n awaitRetry,\n DEFAULT_MODIFIER,\n swapDefaultDeletedTodeletedField,\n handlePulledDocuments\n} from './replication-helper.ts';\nimport {\n addConnectedStorageToCollection, removeConnectedStorageFromCollection\n} from '../../rx-database-internal-store.ts';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { hasEncryption } from '../../rx-storage-helper.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n runAsyncPluginHooks\n} from '../../hooks.ts';\n\n\nexport const REPLICATION_STATE_BY_COLLECTION: WeakMap[]> = new WeakMap();\n\nexport class RxReplicationState {\n public readonly subs: Subscription[] = [];\n public readonly subjects = {\n received: new Subject>(), // all documents that are received from the endpoint\n sent: new Subject>(), // all documents that are send to the endpoint\n error: new Subject(), // all errors that are received from the endpoint, emits new Error() objects\n canceled: new BehaviorSubject(false), // true when the replication was canceled\n active: new BehaviorSubject(false) // true when something is running, false when not\n };\n\n readonly received$: Observable> = this.subjects.received.asObservable();\n readonly sent$: Observable> = this.subjects.sent.asObservable();\n readonly error$: Observable = this.subjects.error.asObservable();\n readonly canceled$: Observable = this.subjects.canceled.asObservable();\n readonly active$: Observable = this.subjects.active.asObservable();\n\n readonly metaInfoPromise: Promise<{ collectionName: string, schema: RxJsonSchema>> }>;\n\n public startPromise: Promise;\n\n public onCancel: (() => void)[] = [];\n\n constructor(\n /**\n * The identifier, used to flag revisions\n * and to identify which documents state came from the remote.\n */\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n ) {\n this.metaInfoPromise = (async () => {\n const metaInstanceCollectionName = 'rx-replication-meta-' + await collection.database.hashFunction([\n this.collection.name,\n this.replicationIdentifier\n ].join('-'));\n const metaInstanceSchema = getRxReplicationMetaInstanceSchema(\n this.collection.schema.jsonSchema,\n hasEncryption(this.collection.schema.jsonSchema)\n );\n return {\n collectionName: metaInstanceCollectionName,\n schema: metaInstanceSchema\n };\n })();\n const replicationStates = getFromMapOrCreate(\n REPLICATION_STATE_BY_COLLECTION,\n collection,\n () => []\n );\n replicationStates.push(this);\n\n // stop the replication when the collection gets destroyed\n this.collection.onDestroy.push(() => this.cancel());\n\n // create getters for the observables\n Object.keys(this.subjects).forEach(key => {\n Object.defineProperty(this, key + '$', {\n get: function () {\n return this.subjects[key].asObservable();\n }\n });\n });\n const startPromise = new Promise(res => {\n this.callOnStart = res;\n });\n this.startPromise = startPromise;\n }\n\n private callOnStart: () => void = undefined as any;\n\n public internalReplicationState?: RxStorageInstanceReplicationState;\n public metaInstance?: RxStorageInstance, any, {}, any>;\n public remoteEvents$: Subject> = new Subject();\n\n public async start(): Promise {\n if (this.isStopped()) {\n return;\n }\n\n // fill in defaults for pull & push\n const pullModifier = this.pull && this.pull.modifier ? this.pull.modifier : DEFAULT_MODIFIER;\n const pushModifier = this.push && this.push.modifier ? this.push.modifier : DEFAULT_MODIFIER;\n\n const database = this.collection.database;\n\n const metaInfo = await this.metaInfoPromise;\n\n const [metaInstance] = await Promise.all([\n this.collection.database.storage.createStorageInstance>({\n databaseName: database.name,\n collectionName: metaInfo.collectionName,\n databaseInstanceToken: database.token,\n multiInstance: database.multiInstance, // TODO is this always false?\n options: {},\n schema: metaInfo.schema,\n password: database.password,\n devMode: overwritable.isDevMode()\n }),\n addConnectedStorageToCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n )\n ]);\n this.metaInstance = metaInstance;\n\n this.internalReplicationState = replicateRxStorageInstance({\n pushBatchSize: this.push && this.push.batchSize ? this.push.batchSize : 100,\n pullBatchSize: this.pull && this.pull.batchSize ? this.pull.batchSize : 100,\n initialCheckpoint: {\n upstream: this.push ? this.push.initialCheckpoint : undefined,\n downstream: this.pull ? this.pull.initialCheckpoint : undefined\n },\n forkInstance: this.collection.storageInstance,\n metaInstance: this.metaInstance,\n hashFunction: database.hashFunction,\n identifier: 'rxdbreplication' + this.replicationIdentifier,\n conflictHandler: this.collection.conflictHandler,\n replicationHandler: {\n masterChangeStream$: this.remoteEvents$.asObservable().pipe(\n filter(_v => !!this.pull),\n mergeMap(async (ev) => {\n if (ev === 'RESYNC') {\n return ev;\n }\n const useEv = flatClone(ev);\n useEv.documents = handlePulledDocuments(this.collection, this.deletedField, useEv.documents);\n useEv.documents = await Promise.all(\n useEv.documents.map(d => pullModifier(d))\n );\n return useEv;\n })\n ),\n masterChangesSince: async (\n checkpoint: CheckpointType | undefined,\n batchSize: number\n ) => {\n if (!this.pull) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n /**\n * Retries must be done here in the replication primitives plugin,\n * because the replication protocol itself has no\n * error handling.\n */\n let done = false;\n let result: ReplicationPullHandlerResult = {} as any;\n while (!done && !this.isStopped()) {\n try {\n result = await this.pull.handler(\n checkpoint,\n batchSize\n );\n done = true;\n } catch (err: any | Error | Error[]) {\n const emitError = newRxError('RC_PULL', {\n checkpoint,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'pull'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n\n if (this.isStopped()) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n\n const useResult = flatClone(result);\n useResult.documents = handlePulledDocuments(this.collection, this.deletedField, useResult.documents);\n useResult.documents = await Promise.all(\n useResult.documents.map(d => pullModifier(d))\n );\n return useResult;\n },\n masterWrite: async (\n rows: RxReplicationWriteToMasterRow[]\n ) => {\n if (!this.push) {\n return [];\n }\n let done = false;\n\n await runAsyncPluginHooks('preReplicationMasterWrite', {\n rows,\n collection: this.collection\n });\n\n const useRowsOrNull = await Promise.all(\n rows.map(async (row) => {\n row.newDocumentState = await pushModifier(row.newDocumentState);\n if (row.newDocumentState === null) {\n return null;\n }\n if (row.assumedMasterState) {\n row.assumedMasterState = await pushModifier(row.assumedMasterState);\n }\n if (this.deletedField !== '_deleted') {\n row.newDocumentState = swapDefaultDeletedTodeletedField(this.deletedField, row.newDocumentState) as any;\n if (row.assumedMasterState) {\n row.assumedMasterState = swapDefaultDeletedTodeletedField(this.deletedField, row.assumedMasterState) as any;\n }\n }\n return row;\n })\n );\n const useRows: RxReplicationWriteToMasterRow[] = useRowsOrNull.filter(arrayFilterNotEmpty);\n\n let result: WithDeleted[] = null as any;\n\n // In case all the rows have been filtered and nothing has to be sent\n if (useRows.length === 0) {\n done = true;\n result = [];\n }\n\n while (!done && !this.isStopped()) {\n try {\n result = await this.push.handler(useRows);\n /**\n * It is a common problem that people have wrongly behaving backend\n * that do not return an array with the conflicts on push requests.\n * So we run this check here to make it easier to debug.\n * @link https://github.com/pubkey/rxdb/issues/4103\n */\n if (!Array.isArray(result)) {\n throw newRxError(\n 'RC_PUSH_NO_AR',\n {\n pushRows: rows,\n direction: 'push',\n args: { result }\n }\n );\n }\n done = true;\n } catch (err: any | Error | Error[] | RxError) {\n const emitError = (err as RxError).rxdb ? err : newRxError('RC_PUSH', {\n pushRows: rows,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'push'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n if (this.isStopped()) {\n return [];\n }\n\n await runAsyncPluginHooks('preReplicationMasterWriteDocumentsHandle', {\n result,\n collection: this.collection\n });\n\n const conflicts = handlePulledDocuments(this.collection, this.deletedField, ensureNotFalsy(result));\n return conflicts;\n }\n }\n });\n this.subs.push(\n this.internalReplicationState.events.error.subscribe(err => {\n this.subjects.error.next(err);\n }),\n this.internalReplicationState.events.processed.down\n .subscribe(row => this.subjects.received.next(row.document as any)),\n this.internalReplicationState.events.processed.up\n .subscribe(writeToMasterRow => {\n this.subjects.sent.next(writeToMasterRow.newDocumentState);\n }),\n combineLatest([\n this.internalReplicationState.events.active.down,\n this.internalReplicationState.events.active.up\n ]).subscribe(([down, up]) => {\n const isActive = down || up;\n this.subjects.active.next(isActive);\n })\n );\n\n if (\n this.pull &&\n this.pull.stream$ &&\n this.live\n ) {\n this.subs.push(\n this.pull.stream$.subscribe({\n next: ev => {\n this.remoteEvents$.next(ev);\n },\n error: err => {\n this.subjects.error.next(err);\n }\n })\n );\n }\n\n /**\n * Non-live replications run once\n * and then automatically get canceled.\n */\n if (!this.live) {\n await awaitRxStorageReplicationFirstInSync(this.internalReplicationState);\n await awaitRxStorageReplicationInSync(this.internalReplicationState);\n await this.cancel();\n }\n this.callOnStart();\n }\n\n isStopped(): boolean {\n if (this.subjects.canceled.getValue()) {\n return true;\n }\n return false;\n }\n\n async awaitInitialReplication(): Promise {\n await this.startPromise;\n return awaitRxStorageReplicationFirstInSync(\n ensureNotFalsy(this.internalReplicationState)\n );\n }\n\n /**\n * Returns a promise that resolves when:\n * - All local data is replicated with the remote\n * - No replication cycle is running or in retry-state\n *\n * WARNING: USing this function directly in a multi-tab browser application\n * is dangerous because only the leading instance will ever be replicated,\n * so this promise will not resolve in the other tabs.\n * For multi-tab support you should set and observe a flag in a local document.\n */\n async awaitInSync(): Promise {\n await this.startPromise;\n await awaitRxStorageReplicationFirstInSync(ensureNotFalsy(this.internalReplicationState));\n\n /**\n * To reduce the amount of re-renders and make testing\n * and to make the whole behavior more predictable,\n * we await these things multiple times.\n * For example the state might be in sync already and at the\n * exact same time a pull.stream$ event comes in and we want to catch\n * that in the same call to awaitInSync() instead of resolving\n * while actually the state is not in sync.\n */\n let t = 2;\n while (t > 0) {\n t--;\n\n /**\n * Often awaitInSync() is called directly after a document write,\n * like in the unit tests.\n * So we first have to await the idleness to ensure that all RxChangeEvents\n * are processed already.\n */\n await this.collection.database.requestIdlePromise();\n await awaitRxStorageReplicationInSync(ensureNotFalsy(this.internalReplicationState));\n }\n\n return true;\n }\n\n reSync() {\n this.remoteEvents$.next('RESYNC');\n }\n emitEvent(ev: RxReplicationPullStreamItem) {\n this.remoteEvents$.next(ev);\n }\n\n async cancel(): Promise {\n if (this.isStopped()) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n const promises: Promise[] = this.onCancel.map(fn => toPromise(fn()));\n\n if (this.internalReplicationState) {\n await cancelRxStorageReplication(this.internalReplicationState);\n }\n if (this.metaInstance) {\n promises.push(\n ensureNotFalsy(this.internalReplicationState).checkpointQueue\n .then(() => ensureNotFalsy(this.metaInstance).close())\n );\n }\n\n this.subs.forEach(sub => sub.unsubscribe());\n this.subjects.canceled.next(true);\n\n this.subjects.active.complete();\n this.subjects.canceled.complete();\n this.subjects.error.complete();\n this.subjects.received.complete();\n this.subjects.sent.complete();\n\n return Promise.all(promises);\n }\n\n async remove() {\n await ensureNotFalsy(this.metaInstance).remove();\n const metaInfo = await this.metaInfoPromise;\n await this.cancel();\n await removeConnectedStorageFromCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n );\n }\n}\n\n\nexport function replicateRxCollection(\n {\n replicationIdentifier,\n collection,\n deletedField = '_deleted',\n pull,\n push,\n live = true,\n retryTime = 1000 * 5,\n waitForLeadership = true,\n autoStart = true,\n }: ReplicationOptions\n): RxReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n /**\n * It is a common error to forget to add these config\n * objects. So we check here because it makes no sense\n * to start a replication with neither push nor pull.\n */\n if (!pull && !push) {\n throw newRxError('UT3', {\n collection: collection.name,\n args: {\n replicationIdentifier\n }\n });\n }\n\n const replicationState = new RxReplicationState(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n\n\n startReplicationOnLeaderShip(waitForLeadership, replicationState);\n return replicationState as any;\n}\n\n\nexport function startReplicationOnLeaderShip(\n waitForLeadership: boolean,\n replicationState: RxReplicationState\n) {\n /**\n * Always await this Promise to ensure that the current instance\n * is leader when waitForLeadership=true\n */\n const mustWaitForLeadership = waitForLeadership && replicationState.collection.database.multiInstance;\n const waitTillRun: Promise = mustWaitForLeadership ? replicationState.collection.database.waitForLeadership() : PROMISE_RESOLVE_TRUE;\n return waitTillRun.then(() => {\n if (replicationState.isStopped()) {\n return;\n }\n if (replicationState.autoStart) {\n replicationState.start();\n }\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["BehaviorSubject","combineLatest","filter","mergeMap","Subject","RxDBLeaderElectionPlugin","arrayFilterNotEmpty","ensureNotFalsy","errorToPlainJson","flatClone","getFromMapOrCreate","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_TRUE","toArray","toPromise","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","cancelRxStorageReplication","getRxReplicationMetaInstanceSchema","replicateRxStorageInstance","newRxError","awaitRetry","DEFAULT_MODIFIER","swapDefaultDeletedTodeletedField","handlePulledDocuments","addConnectedStorageToCollection","removeConnectedStorageFromCollection","addRxPlugin","hasEncryption","overwritable","runAsyncPluginHooks","REPLICATION_STATE_BY_COLLECTION","WeakMap","RxReplicationState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","subs","subjects","received","sent","error","canceled","active","received$","asObservable","sent$","error$","canceled$","active$","onCancel","callOnStart","undefined","remoteEvents$","metaInfoPromise","metaInstanceCollectionName","database","hashFunction","name","join","metaInstanceSchema","schema","jsonSchema","collectionName","replicationStates","onDestroy","cancel","Object","keys","forEach","key","defineProperty","get","startPromise","Promise","res","_proto","prototype","start","isStopped","pullModifier","modifier","pushModifier","metaInfo","metaInstance","all","storage","createStorageInstance","databaseName","databaseInstanceToken","token","multiInstance","options","password","devMode","isDevMode","internalReplicationState","pushBatchSize","batchSize","pullBatchSize","initialCheckpoint","upstream","downstream","forkInstance","storageInstance","identifier","conflictHandler","replicationHandler","masterChangeStream$","pipe","_v","ev","useEv","documents","map","d","masterChangesSince","checkpoint","done","result","handler","err","emitError","errors","er","direction","next","useResult","masterWrite","rows","useRowsOrNull","row","newDocumentState","assumedMasterState","useRows","length","Array","isArray","pushRows","args","rxdb","conflicts","events","subscribe","processed","down","document","up","writeToMasterRow","isActive","stream$","getValue","awaitInitialReplication","awaitInSync","t","requestIdlePromise","reSync","emitEvent","promises","fn","checkpointQueue","then","close","sub","unsubscribe","complete","remove","replicateRxCollection","waitForLeadership","replicationState","startReplicationOnLeaderShip","mustWaitForLeadership","waitTillRun"],"sources":["../../../../src/plugins/replication/index.ts"],"sourcesContent":["/**\n * This plugin contains the primitives to create\n * a RxDB client-server replication.\n * It is used in the other replication plugins\n * but also can be used as standalone with a custom replication handler.\n */\n\nimport {\n BehaviorSubject,\n combineLatest,\n filter,\n mergeMap,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n ReplicationOptions,\n ReplicationPullHandlerResult,\n ReplicationPullOptions,\n ReplicationPushOptions,\n RxCollection,\n RxDocumentData,\n RxError,\n RxJsonSchema,\n RxReplicationPullStreamItem,\n RxReplicationWriteToMasterRow,\n RxStorageInstance,\n RxStorageInstanceReplicationState,\n RxStorageReplicationMeta,\n RxTypeError,\n WithDeleted\n} from '../../types/index.d.ts';\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\nimport {\n arrayFilterNotEmpty,\n ensureNotFalsy,\n errorToPlainJson,\n flatClone,\n getFromMapOrCreate,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_TRUE,\n toArray,\n toPromise\n} from '../../plugins/utils/index.ts';\nimport {\n awaitRxStorageReplicationFirstInSync,\n awaitRxStorageReplicationInSync,\n cancelRxStorageReplication,\n getRxReplicationMetaInstanceSchema,\n replicateRxStorageInstance\n} from '../../replication-protocol/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport {\n awaitRetry,\n DEFAULT_MODIFIER,\n swapDefaultDeletedTodeletedField,\n handlePulledDocuments\n} from './replication-helper.ts';\nimport {\n addConnectedStorageToCollection, removeConnectedStorageFromCollection\n} from '../../rx-database-internal-store.ts';\nimport { addRxPlugin } from '../../plugin.ts';\nimport { hasEncryption } from '../../rx-storage-helper.ts';\nimport { overwritable } from '../../overwritable.ts';\nimport {\n runAsyncPluginHooks\n} from '../../hooks.ts';\n\n\nexport const REPLICATION_STATE_BY_COLLECTION: WeakMap[]> = new WeakMap();\n\nexport class RxReplicationState {\n public readonly subs: Subscription[] = [];\n public readonly subjects = {\n received: new Subject>(), // all documents that are received from the endpoint\n sent: new Subject>(), // all documents that are send to the endpoint\n error: new Subject(), // all errors that are received from the endpoint, emits new Error() objects\n canceled: new BehaviorSubject(false), // true when the replication was canceled\n active: new BehaviorSubject(false) // true when something is running, false when not\n };\n\n readonly received$: Observable> = this.subjects.received.asObservable();\n readonly sent$: Observable> = this.subjects.sent.asObservable();\n readonly error$: Observable = this.subjects.error.asObservable();\n readonly canceled$: Observable = this.subjects.canceled.asObservable();\n readonly active$: Observable = this.subjects.active.asObservable();\n\n readonly metaInfoPromise: Promise<{ collectionName: string, schema: RxJsonSchema>> }>;\n\n public startPromise: Promise;\n\n public onCancel: (() => void)[] = [];\n\n constructor(\n /**\n * The identifier, used to flag revisions\n * and to identify which documents state came from the remote.\n */\n public readonly replicationIdentifier: string,\n public readonly collection: RxCollection,\n public readonly deletedField: string,\n public readonly pull?: ReplicationPullOptions,\n public readonly push?: ReplicationPushOptions,\n public readonly live?: boolean,\n public retryTime?: number,\n public autoStart?: boolean,\n ) {\n this.metaInfoPromise = (async () => {\n const metaInstanceCollectionName = 'rx-replication-meta-' + await collection.database.hashFunction([\n this.collection.name,\n this.replicationIdentifier\n ].join('-'));\n const metaInstanceSchema = getRxReplicationMetaInstanceSchema(\n this.collection.schema.jsonSchema,\n hasEncryption(this.collection.schema.jsonSchema)\n );\n return {\n collectionName: metaInstanceCollectionName,\n schema: metaInstanceSchema\n };\n })();\n const replicationStates = getFromMapOrCreate(\n REPLICATION_STATE_BY_COLLECTION,\n collection,\n () => []\n );\n replicationStates.push(this);\n\n // stop the replication when the collection gets destroyed\n this.collection.onDestroy.push(() => this.cancel());\n\n // create getters for the observables\n Object.keys(this.subjects).forEach(key => {\n Object.defineProperty(this, key + '$', {\n get: function () {\n return this.subjects[key].asObservable();\n }\n });\n });\n const startPromise = new Promise(res => {\n this.callOnStart = res;\n });\n this.startPromise = startPromise;\n }\n\n private callOnStart: () => void = undefined as any;\n\n public internalReplicationState?: RxStorageInstanceReplicationState;\n public metaInstance?: RxStorageInstance, any, {}, any>;\n public remoteEvents$: Subject> = new Subject();\n\n public async start(): Promise {\n if (this.isStopped()) {\n return;\n }\n\n // fill in defaults for pull & push\n const pullModifier = this.pull && this.pull.modifier ? this.pull.modifier : DEFAULT_MODIFIER;\n const pushModifier = this.push && this.push.modifier ? this.push.modifier : DEFAULT_MODIFIER;\n\n const database = this.collection.database;\n\n const metaInfo = await this.metaInfoPromise;\n\n const [metaInstance] = await Promise.all([\n this.collection.database.storage.createStorageInstance>({\n databaseName: database.name,\n collectionName: metaInfo.collectionName,\n databaseInstanceToken: database.token,\n multiInstance: database.multiInstance, // TODO is this always false?\n options: {},\n schema: metaInfo.schema,\n password: database.password,\n devMode: overwritable.isDevMode()\n }),\n addConnectedStorageToCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n )\n ]);\n this.metaInstance = metaInstance;\n\n this.internalReplicationState = replicateRxStorageInstance({\n pushBatchSize: this.push && this.push.batchSize ? this.push.batchSize : 100,\n pullBatchSize: this.pull && this.pull.batchSize ? this.pull.batchSize : 100,\n initialCheckpoint: {\n upstream: this.push ? this.push.initialCheckpoint : undefined,\n downstream: this.pull ? this.pull.initialCheckpoint : undefined\n },\n forkInstance: this.collection.storageInstance,\n metaInstance: this.metaInstance,\n hashFunction: database.hashFunction,\n identifier: 'rxdbreplication' + this.replicationIdentifier,\n conflictHandler: this.collection.conflictHandler,\n replicationHandler: {\n masterChangeStream$: this.remoteEvents$.asObservable().pipe(\n filter(_v => !!this.pull),\n mergeMap(async (ev) => {\n if (ev === 'RESYNC') {\n return ev;\n }\n const useEv = flatClone(ev);\n useEv.documents = handlePulledDocuments(this.collection, this.deletedField, useEv.documents);\n useEv.documents = await Promise.all(\n useEv.documents.map(d => pullModifier(d))\n );\n return useEv;\n })\n ),\n masterChangesSince: async (\n checkpoint: CheckpointType | undefined,\n batchSize: number\n ) => {\n if (!this.pull) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n /**\n * Retries must be done here in the replication primitives plugin,\n * because the replication protocol itself has no\n * error handling.\n */\n let done = false;\n let result: ReplicationPullHandlerResult = {} as any;\n while (!done && !this.isStopped()) {\n try {\n result = await this.pull.handler(\n checkpoint,\n batchSize\n );\n done = true;\n } catch (err: any | Error | Error[]) {\n const emitError = newRxError('RC_PULL', {\n checkpoint,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'pull'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n\n if (this.isStopped()) {\n return {\n checkpoint: null,\n documents: []\n };\n }\n\n const useResult = flatClone(result);\n useResult.documents = handlePulledDocuments(this.collection, this.deletedField, useResult.documents);\n useResult.documents = await Promise.all(\n useResult.documents.map(d => pullModifier(d))\n );\n return useResult;\n },\n masterWrite: async (\n rows: RxReplicationWriteToMasterRow[]\n ) => {\n if (!this.push) {\n return [];\n }\n let done = false;\n\n await runAsyncPluginHooks('preReplicationMasterWrite', {\n rows,\n collection: this.collection\n });\n\n const useRowsOrNull = await Promise.all(\n rows.map(async (row) => {\n row.newDocumentState = await pushModifier(row.newDocumentState);\n if (row.newDocumentState === null) {\n return null;\n }\n if (row.assumedMasterState) {\n row.assumedMasterState = await pushModifier(row.assumedMasterState);\n }\n if (this.deletedField !== '_deleted') {\n row.newDocumentState = swapDefaultDeletedTodeletedField(this.deletedField, row.newDocumentState) as any;\n if (row.assumedMasterState) {\n row.assumedMasterState = swapDefaultDeletedTodeletedField(this.deletedField, row.assumedMasterState) as any;\n }\n }\n return row;\n })\n );\n const useRows: RxReplicationWriteToMasterRow[] = useRowsOrNull.filter(arrayFilterNotEmpty);\n\n let result: WithDeleted[] = null as any;\n\n // In case all the rows have been filtered and nothing has to be sent\n if (useRows.length === 0) {\n done = true;\n result = [];\n }\n\n while (!done && !this.isStopped()) {\n try {\n result = await this.push.handler(useRows);\n /**\n * It is a common problem that people have wrongly behaving backend\n * that do not return an array with the conflicts on push requests.\n * So we run this check here to make it easier to debug.\n * @link https://github.com/pubkey/rxdb/issues/4103\n */\n if (!Array.isArray(result)) {\n throw newRxError(\n 'RC_PUSH_NO_AR',\n {\n pushRows: rows,\n direction: 'push',\n args: { result }\n }\n );\n }\n done = true;\n } catch (err: any | Error | Error[] | RxError) {\n const emitError = (err as RxError).rxdb ? err : newRxError('RC_PUSH', {\n pushRows: rows,\n errors: toArray(err).map(er => errorToPlainJson(er)),\n direction: 'push'\n });\n this.subjects.error.next(emitError);\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\n }\n }\n if (this.isStopped()) {\n return [];\n }\n\n await runAsyncPluginHooks('preReplicationMasterWriteDocumentsHandle', {\n result,\n collection: this.collection\n });\n\n const conflicts = handlePulledDocuments(this.collection, this.deletedField, ensureNotFalsy(result));\n return conflicts;\n }\n }\n });\n this.subs.push(\n this.internalReplicationState.events.error.subscribe(err => {\n this.subjects.error.next(err);\n }),\n this.internalReplicationState.events.processed.down\n .subscribe(row => this.subjects.received.next(row.document as any)),\n this.internalReplicationState.events.processed.up\n .subscribe(writeToMasterRow => {\n this.subjects.sent.next(writeToMasterRow.newDocumentState);\n }),\n combineLatest([\n this.internalReplicationState.events.active.down,\n this.internalReplicationState.events.active.up\n ]).subscribe(([down, up]) => {\n const isActive = down || up;\n this.subjects.active.next(isActive);\n })\n );\n\n if (\n this.pull &&\n this.pull.stream$ &&\n this.live\n ) {\n this.subs.push(\n this.pull.stream$.subscribe({\n next: ev => {\n this.remoteEvents$.next(ev);\n },\n error: err => {\n this.subjects.error.next(err);\n }\n })\n );\n }\n\n /**\n * Non-live replications run once\n * and then automatically get canceled.\n */\n if (!this.live) {\n await awaitRxStorageReplicationFirstInSync(this.internalReplicationState);\n await awaitRxStorageReplicationInSync(this.internalReplicationState);\n await this.cancel();\n }\n this.callOnStart();\n }\n\n isStopped(): boolean {\n if (this.subjects.canceled.getValue()) {\n return true;\n }\n return false;\n }\n\n async awaitInitialReplication(): Promise {\n await this.startPromise;\n return awaitRxStorageReplicationFirstInSync(\n ensureNotFalsy(this.internalReplicationState)\n );\n }\n\n /**\n * Returns a promise that resolves when:\n * - All local data is replicated with the remote\n * - No replication cycle is running or in retry-state\n *\n * WARNING: USing this function directly in a multi-tab browser application\n * is dangerous because only the leading instance will ever be replicated,\n * so this promise will not resolve in the other tabs.\n * For multi-tab support you should set and observe a flag in a local document.\n */\n async awaitInSync(): Promise {\n await this.startPromise;\n await awaitRxStorageReplicationFirstInSync(ensureNotFalsy(this.internalReplicationState));\n\n /**\n * To reduce the amount of re-renders and make testing\n * and to make the whole behavior more predictable,\n * we await these things multiple times.\n * For example the state might be in sync already and at the\n * exact same time a pull.stream$ event comes in and we want to catch\n * that in the same call to awaitInSync() instead of resolving\n * while actually the state is not in sync.\n */\n let t = 2;\n while (t > 0) {\n t--;\n\n /**\n * Often awaitInSync() is called directly after a document write,\n * like in the unit tests.\n * So we first have to await the idleness to ensure that all RxChangeEvents\n * are processed already.\n */\n await this.collection.database.requestIdlePromise();\n await awaitRxStorageReplicationInSync(ensureNotFalsy(this.internalReplicationState));\n }\n\n return true;\n }\n\n reSync() {\n this.remoteEvents$.next('RESYNC');\n }\n emitEvent(ev: RxReplicationPullStreamItem) {\n this.remoteEvents$.next(ev);\n }\n\n async cancel(): Promise {\n if (this.isStopped()) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n const promises: Promise[] = this.onCancel.map(fn => toPromise(fn()));\n\n if (this.internalReplicationState) {\n await cancelRxStorageReplication(this.internalReplicationState);\n }\n if (this.metaInstance) {\n promises.push(\n ensureNotFalsy(this.internalReplicationState).checkpointQueue\n .then(() => ensureNotFalsy(this.metaInstance).close())\n );\n }\n\n this.subs.forEach(sub => sub.unsubscribe());\n this.subjects.canceled.next(true);\n\n this.subjects.active.complete();\n this.subjects.canceled.complete();\n this.subjects.error.complete();\n this.subjects.received.complete();\n this.subjects.sent.complete();\n\n return Promise.all(promises);\n }\n\n async remove() {\n await ensureNotFalsy(this.metaInstance).remove();\n const metaInfo = await this.metaInfoPromise;\n await this.cancel();\n await removeConnectedStorageFromCollection(\n this.collection,\n metaInfo.collectionName,\n metaInfo.schema\n );\n }\n}\n\n\nexport function replicateRxCollection(\n {\n replicationIdentifier,\n collection,\n deletedField = '_deleted',\n pull,\n push,\n live = true,\n retryTime = 1000 * 5,\n waitForLeadership = true,\n autoStart = true,\n }: ReplicationOptions\n): RxReplicationState {\n addRxPlugin(RxDBLeaderElectionPlugin);\n\n /**\n * It is a common error to forget to add these config\n * objects. So we check here because it makes no sense\n * to start a replication with neither push nor pull.\n */\n if (!pull && !push) {\n throw newRxError('UT3', {\n collection: collection.name,\n args: {\n replicationIdentifier\n }\n });\n }\n\n const replicationState = new RxReplicationState(\n replicationIdentifier,\n collection,\n deletedField,\n pull,\n push,\n live,\n retryTime,\n autoStart\n );\n\n\n startReplicationOnLeaderShip(waitForLeadership, replicationState);\n return replicationState as any;\n}\n\n\nexport function startReplicationOnLeaderShip(\n waitForLeadership: boolean,\n replicationState: RxReplicationState\n) {\n /**\n * Always await this Promise to ensure that the current instance\n * is leader when waitForLeadership=true\n */\n const mustWaitForLeadership = waitForLeadership && replicationState.collection.database.multiInstance;\n const waitTillRun: Promise = mustWaitForLeadership ? replicationState.collection.database.waitForLeadership() : PROMISE_RESOLVE_TRUE;\n return waitTillRun.then(() => {\n if (replicationState.isStopped()) {\n return;\n }\n if (replicationState.autoStart) {\n replicationState.start();\n }\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/state/rx-state.js.map b/dist/esm/plugins/state/rx-state.js.map index 80e6a749a87..49968b73849 100644 --- a/dist/esm/plugins/state/rx-state.js.map +++ b/dist/esm/plugins/state/rx-state.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-state.js","names":["Subject","distinctUntilChanged","map","merge","shareReplay","startWith","tap","overwritable","getChangedDocumentsSince","RXJS_SHARE_REPLAY_DEFAULTS","getProperty","setProperty","PROMISE_RESOLVE_VOID","appendToArray","clone","randomCouchString","deepEqual","RX_STATE_COLLECTION_SCHEMA","nextRxStateId","newRxError","runPluginHooks","debugId","RxStateBase","prefix","collection","_id","_state","_nonPersisted","_writeQueue","_initDone","_instanceId","properties","sId","maxLength","_ownEmits$","onDestroy","push","_lastIdQuery","findOne","sort","id","$","subscribe","pipe","event","operation","documentData","mergeOperationsIntoState","ops","_proto","prototype","set","path","modifier","_triggerWrite","then","length","useWrites","done","lastIdDoc","exec","nextId","undefined","newState","index","writeRow","value","newValue","k","v","insert","next","err","code","catch","error","name","get","deepFreezeWhenDevMode","get$","get$$","obs","reactivity","database","getReactivityFactory","fromObservable","_cleanup","firstWrite","lastWrite","firstNr","parseInt","lastNr","find","selector","$lte","remove","createRxState","collectionName","addCollections","schema","collections","rxState","checkpoint","result","storageInstance","documents","document","proxy","Proxy","target","property","ret","bind","lastChar","charAt","endsWith","key","slice","receiver","Error","state","operations"],"sources":["../../../../src/plugins/state/rx-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n distinctUntilChanged,\n map,\n merge,\n shareReplay,\n startWith,\n tap\n} from 'rxjs';\nimport { overwritable } from '../../overwritable.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\nimport type {\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxError,\n Paths\n} from '../../types';\nimport {\n RXJS_SHARE_REPLAY_DEFAULTS,\n getProperty,\n setProperty,\n PROMISE_RESOLVE_VOID,\n appendToArray,\n clone,\n randomCouchString,\n deepEqual\n} from '../utils/index.ts';\nimport {\n RX_STATE_COLLECTION_SCHEMA,\n nextRxStateId\n} from './helpers.ts';\nimport {\n RxStateDocument,\n RxStateOperation,\n RxStateModifier\n} from './types.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport { runPluginHooks } from '../../hooks.ts';\n\n\nlet debugId = 0;\n\n\n/**\n * RxDB internally used properties are\n * prefixed with lodash _ to make them less\n * likely to clash with actual state properties\n * from the user.\n */\nexport class RxStateBase {\n // used for debugging\n public _id: number = debugId++;\n public _state: T | any = {};\n public $: Observable;\n public _lastIdQuery: RxQuery | null>;\n public _nonPersisted: {\n path: string;\n modifier: RxStateModifier;\n }[] = [];\n public _writeQueue = PROMISE_RESOLVE_VOID;\n public _initDone = false;\n public _instanceId = randomCouchString(RX_STATE_COLLECTION_SCHEMA.properties.sId.maxLength);\n public _ownEmits$ = new Subject();\n\n constructor(\n public readonly prefix: string,\n public readonly collection: RxCollection\n ) {\n this.collection.onDestroy.push(() => this._writeQueue);\n this._lastIdQuery = this.collection.findOne({\n sort: [\n { id: 'desc' }\n ]\n });\n // make it \"hot\" for better write performance\n this._lastIdQuery.$.subscribe();\n\n this.$ = merge(\n this._ownEmits$,\n this.collection.$.pipe(\n tap(event => {\n if (\n this._initDone &&\n event.operation === 'INSERT' &&\n event.documentData.sId !== this._instanceId\n ) {\n mergeOperationsIntoState(this._state, event.documentData.ops);\n }\n })\n )\n ).pipe(\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n map(() => this._state)\n );\n // directly subscribe because of the tap() side effect\n this.$.subscribe();\n }\n\n async set(\n path: Paths | '',\n modifier: RxStateModifier\n ) {\n this._nonPersisted.push({\n path,\n modifier\n });\n return this._triggerWrite();\n }\n\n /**\n * To have deterministic writes,\n * and to ensure that multiple js realms do not overwrite\n * each other, the write happens with incremental ids\n * that would throw conflict errors and trigger a retry.\n */\n _triggerWrite() {\n this._writeQueue = this._writeQueue.then(async () => {\n if (this._nonPersisted.length === 0) {\n return;\n }\n let useWrites: typeof this._nonPersisted = [];\n let done = false;\n while (!done) {\n const lastIdDoc = await this._lastIdQuery.exec();\n appendToArray(useWrites, this._nonPersisted);\n this._nonPersisted = [];\n const nextId = nextRxStateId(lastIdDoc ? lastIdDoc.id : undefined);\n try {\n /**\n * TODO instead of a deep-clone we should\n * only clone the parts where we know that they\n * will be changed. This would improve performance.\n */\n const newState = clone(this._state);\n const ops: RxStateOperation[] = [];\n for (let index = 0; index < useWrites.length; index++) {\n const writeRow = useWrites[index];\n const value = getProperty(newState, writeRow.path);\n const newValue = writeRow.modifier(value);\n setProperty(newState, writeRow.path, newValue);\n ops.push({\n k: writeRow.path,\n /**\n * Here we have to clone the value because\n * some storages like the memory storage\n * make input data deep-frozen in dev-mode.\n */\n v: clone(newValue)\n });\n }\n await this.collection.insert({\n id: nextId,\n sId: this._instanceId,\n ops\n });\n this._state = newState;\n this._ownEmits$.next(this._state);\n done = true;\n } catch (err) {\n if ((err as RxError).code !== 'CONFLICT') {\n throw err;\n }\n }\n }\n }).catch(error => {\n throw newRxError('SNH', {\n name: 'RxState WRITE QUEUE ERROR',\n error\n });\n });\n return this._writeQueue;\n }\n\n get(path?: Paths) {\n if (!path) {\n return overwritable.deepFreezeWhenDevMode(this._state);\n }\n return overwritable.deepFreezeWhenDevMode(\n getProperty(this._state, path)\n );\n }\n get$(path?: Paths): Observable {\n return this.$.pipe(\n map(() => this.get(path)),\n startWith(this.get(path)),\n distinctUntilChanged(deepEqual),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n );\n }\n get$$(path?: Paths): Reactivity {\n const obs = this.get$(path);\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n obs,\n this.get(path),\n this.collection.database\n ) as any;\n }\n\n /**\n * Merges the state operations into a single write row\n * to store space and make recreating the state from\n * disc faster.\n */\n async _cleanup() {\n const firstWrite = await this.collection.findOne({\n sort: [{ id: 'asc' }]\n }).exec();\n const lastWrite = await this._lastIdQuery.exec();\n\n if (!firstWrite || !lastWrite) {\n return;\n }\n\n const firstNr = parseInt(firstWrite.id, 10);\n const lastNr = parseInt(lastWrite.id, 10);\n if ((lastNr - 5) < firstNr) {\n // only run if more then 5 write rows\n return;\n }\n\n // update whole state object\n await this._writeQueue;\n await this.set('', () => this._state);\n\n // delete old ones\n await this.collection.find({\n selector: {\n id: {\n $lte: lastWrite.id\n }\n }\n }).remove();\n }\n}\n\n\nexport async function createRxState(\n database: RxDatabase,\n prefix: string\n): Promise> {\n const collectionName = 'rx-state-' + prefix;\n await database.addCollections({\n [collectionName]: {\n schema: RX_STATE_COLLECTION_SCHEMA as any\n }\n });\n const collection: RxCollection = database.collections[collectionName];\n\n const rxState = new RxStateBase(\n prefix,\n collection\n );\n\n\n /**\n * Directly get the state and put it into memory.\n * This ensures we can do non-async accesses to the\n * correct state.\n */\n let done = false;\n let checkpoint: any = undefined;\n while (!done) {\n const result = await getChangedDocumentsSince(\n collection.storageInstance,\n 1000,\n checkpoint\n );\n checkpoint = result.checkpoint;\n const documents = result.documents;\n if (documents.length === 0) {\n done = true;\n } else {\n for (let index = 0; index < documents.length; index++) {\n const document = documents[index];\n mergeOperationsIntoState(rxState._state, document.ops);\n }\n }\n }\n rxState._initDone = true;\n\n const proxy = new Proxy(\n rxState as any,\n {\n get(target, property: any) {\n if (typeof property !== 'string') {\n return target[property];\n }\n if ((rxState as any)[property]) {\n const ret = (rxState as any)[property];\n if (typeof ret === 'function') {\n return ret.bind(rxState);\n } else {\n return ret;\n }\n }\n const lastChar = property.charAt(property.length - 1);\n if (property.endsWith('$$')) {\n const key = property.slice(0, -2);\n return rxState.get$$(key as any);\n } else if (lastChar === '$') {\n const key = property.slice(0, -1);\n return rxState.get$(key as any);\n } else {\n return rxState.get(property as any);\n }\n },\n set(target, newValue, receiver) {\n throw new Error('Do not write to RxState');\n }\n }\n );\n\n runPluginHooks('createRxState', {\n collection,\n state: proxy\n });\n\n return proxy;\n}\n\n\nexport function mergeOperationsIntoState(\n state: T,\n operations: RxStateOperation[]\n) {\n for (let index = 0; index < operations.length; index++) {\n const operation = operations[index];\n setProperty(state, operation.k, clone(operation.v));\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-state.js","names":["Subject","distinctUntilChanged","map","merge","shareReplay","startWith","tap","overwritable","getChangedDocumentsSince","RXJS_SHARE_REPLAY_DEFAULTS","getProperty","setProperty","PROMISE_RESOLVE_VOID","appendToArray","clone","randomCouchString","deepEqual","RX_STATE_COLLECTION_SCHEMA","nextRxStateId","newRxError","runPluginHooks","debugId","RxStateBase","prefix","collection","_id","_state","_nonPersisted","_writeQueue","_initDone","_instanceId","properties","sId","maxLength","_ownEmits$","onDestroy","push","_lastIdQuery","findOne","sort","id","$","subscribe","pipe","event","operation","documentData","mergeOperationsIntoState","ops","_proto","prototype","set","path","modifier","_triggerWrite","then","length","useWrites","done","lastIdDoc","exec","nextId","undefined","newState","index","writeRow","value","newValue","k","v","insert","next","err","code","catch","error","name","get","deepFreezeWhenDevMode","get$","get$$","obs","reactivity","database","getReactivityFactory","fromObservable","_cleanup","firstWrite","lastWrite","firstNr","parseInt","lastNr","find","selector","$lte","remove","createRxState","collectionName","addCollections","schema","collections","rxState","checkpoint","result","storageInstance","documents","document","proxy","Proxy","target","property","ret","bind","lastChar","charAt","endsWith","key","slice","receiver","Error","state","operations"],"sources":["../../../../src/plugins/state/rx-state.ts"],"sourcesContent":["import {\n Observable,\n Subject,\n distinctUntilChanged,\n map,\n merge,\n shareReplay,\n startWith,\n tap\n} from 'rxjs';\nimport { overwritable } from '../../overwritable.ts';\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\nimport type {\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxError,\n Paths\n} from '../../types';\nimport {\n RXJS_SHARE_REPLAY_DEFAULTS,\n getProperty,\n setProperty,\n PROMISE_RESOLVE_VOID,\n appendToArray,\n clone,\n randomCouchString,\n deepEqual\n} from '../utils/index.ts';\nimport {\n RX_STATE_COLLECTION_SCHEMA,\n nextRxStateId\n} from './helpers.ts';\nimport {\n RxStateDocument,\n RxStateOperation,\n RxStateModifier\n} from './types.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport { runPluginHooks } from '../../hooks.ts';\n\n\nlet debugId = 0;\n\n\n/**\n * RxDB internally used properties are\n * prefixed with lodash _ to make them less\n * likely to clash with actual state properties\n * from the user.\n */\nexport class RxStateBase {\n // used for debugging\n public _id: number = debugId++;\n public _state: T | any = {};\n public $: Observable;\n public _lastIdQuery: RxQuery | null>;\n public _nonPersisted: {\n path: string;\n modifier: RxStateModifier;\n }[] = [];\n public _writeQueue = PROMISE_RESOLVE_VOID;\n public _initDone = false;\n public _instanceId = randomCouchString(RX_STATE_COLLECTION_SCHEMA.properties.sId.maxLength);\n public _ownEmits$ = new Subject();\n\n constructor(\n public readonly prefix: string,\n public readonly collection: RxCollection\n ) {\n this.collection.onDestroy.push(() => this._writeQueue);\n this._lastIdQuery = this.collection.findOne({\n sort: [\n { id: 'desc' }\n ]\n });\n // make it \"hot\" for better write performance\n this._lastIdQuery.$.subscribe();\n\n this.$ = merge(\n this._ownEmits$,\n this.collection.$.pipe(\n tap(event => {\n if (\n this._initDone &&\n event.operation === 'INSERT' &&\n event.documentData.sId !== this._instanceId\n ) {\n mergeOperationsIntoState(this._state, event.documentData.ops);\n }\n })\n )\n ).pipe(\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n map(() => this._state)\n );\n // directly subscribe because of the tap() side effect\n this.$.subscribe();\n }\n\n async set(\n path: Paths | '',\n modifier: RxStateModifier\n ) {\n this._nonPersisted.push({\n path,\n modifier\n });\n return this._triggerWrite();\n }\n\n /**\n * To have deterministic writes,\n * and to ensure that multiple js realms do not overwrite\n * each other, the write happens with incremental ids\n * that would throw conflict errors and trigger a retry.\n */\n _triggerWrite() {\n this._writeQueue = this._writeQueue.then(async () => {\n if (this._nonPersisted.length === 0) {\n return;\n }\n let useWrites: typeof this._nonPersisted = [];\n let done = false;\n while (!done) {\n const lastIdDoc = await this._lastIdQuery.exec();\n appendToArray(useWrites, this._nonPersisted);\n this._nonPersisted = [];\n const nextId = nextRxStateId(lastIdDoc ? lastIdDoc.id : undefined);\n try {\n /**\n * TODO instead of a deep-clone we should\n * only clone the parts where we know that they\n * will be changed. This would improve performance.\n */\n const newState = clone(this._state);\n const ops: RxStateOperation[] = [];\n for (let index = 0; index < useWrites.length; index++) {\n const writeRow = useWrites[index];\n const value = getProperty(newState, writeRow.path);\n const newValue = writeRow.modifier(value);\n setProperty(newState, writeRow.path, newValue);\n ops.push({\n k: writeRow.path,\n /**\n * Here we have to clone the value because\n * some storages like the memory storage\n * make input data deep-frozen in dev-mode.\n */\n v: clone(newValue)\n });\n }\n await this.collection.insert({\n id: nextId,\n sId: this._instanceId,\n ops\n });\n this._state = newState;\n this._ownEmits$.next(this._state);\n done = true;\n } catch (err) {\n if ((err as RxError).code !== 'CONFLICT') {\n throw err;\n }\n }\n }\n }).catch(error => {\n throw newRxError('SNH', {\n name: 'RxState WRITE QUEUE ERROR',\n error\n });\n });\n return this._writeQueue;\n }\n\n get(path?: Paths) {\n if (!path) {\n return overwritable.deepFreezeWhenDevMode(this._state);\n }\n return overwritable.deepFreezeWhenDevMode(\n getProperty(this._state, path)\n );\n }\n get$(path?: Paths): Observable {\n return this.$.pipe(\n map(() => this.get(path)),\n startWith(this.get(path)),\n distinctUntilChanged(deepEqual),\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n );\n }\n get$$(path?: Paths): Reactivity {\n const obs = this.get$(path);\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n obs,\n this.get(path),\n this.collection.database\n ) as any;\n }\n\n /**\n * Merges the state operations into a single write row\n * to store space and make recreating the state from\n * disc faster.\n */\n async _cleanup() {\n const firstWrite = await this.collection.findOne({\n sort: [{ id: 'asc' }]\n }).exec();\n const lastWrite = await this._lastIdQuery.exec();\n\n if (!firstWrite || !lastWrite) {\n return;\n }\n\n const firstNr = parseInt(firstWrite.id, 10);\n const lastNr = parseInt(lastWrite.id, 10);\n if ((lastNr - 5) < firstNr) {\n // only run if more then 5 write rows\n return;\n }\n\n // update whole state object\n await this._writeQueue;\n await this.set('', () => this._state);\n\n // delete old ones\n await this.collection.find({\n selector: {\n id: {\n $lte: lastWrite.id\n }\n }\n }).remove();\n }\n}\n\n\nexport async function createRxState(\n database: RxDatabase,\n prefix: string\n): Promise> {\n const collectionName = 'rx-state-' + prefix;\n await database.addCollections({\n [collectionName]: {\n schema: RX_STATE_COLLECTION_SCHEMA as any\n }\n });\n const collection: RxCollection = database.collections[collectionName];\n\n const rxState = new RxStateBase(\n prefix,\n collection\n );\n\n\n /**\n * Directly get the state and put it into memory.\n * This ensures we can do non-async accesses to the\n * correct state.\n */\n let done = false;\n let checkpoint: any = undefined;\n while (!done) {\n const result = await getChangedDocumentsSince(\n collection.storageInstance,\n 1000,\n checkpoint\n );\n checkpoint = result.checkpoint;\n const documents = result.documents;\n if (documents.length === 0) {\n done = true;\n } else {\n for (let index = 0; index < documents.length; index++) {\n const document = documents[index];\n mergeOperationsIntoState(rxState._state, document.ops);\n }\n }\n }\n rxState._initDone = true;\n\n const proxy = new Proxy(\n rxState as any,\n {\n get(target, property: any) {\n if (typeof property !== 'string') {\n return target[property];\n }\n if ((rxState as any)[property]) {\n const ret = (rxState as any)[property];\n if (typeof ret === 'function') {\n return ret.bind(rxState);\n } else {\n return ret;\n }\n }\n const lastChar = property.charAt(property.length - 1);\n if (property.endsWith('$$')) {\n const key = property.slice(0, -2);\n return rxState.get$$(key as any);\n } else if (lastChar === '$') {\n const key = property.slice(0, -1);\n return rxState.get$(key as any);\n } else {\n return rxState.get(property as any);\n }\n },\n set(target, newValue, receiver) {\n throw new Error('Do not write to RxState');\n }\n }\n );\n\n runPluginHooks('createRxState', {\n collection,\n state: proxy\n });\n\n return proxy;\n}\n\n\nexport function mergeOperationsIntoState(\n state: T,\n operations: RxStateOperation[]\n) {\n for (let index = 0; index < operations.length; index++) {\n const operation = operations[index];\n setProperty(state, operation.k, clone(operation.v));\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-denokv/index.js.map b/dist/esm/plugins/storage-denokv/index.js.map index a264be00047..84248d56a10 100644 --- a/dist/esm/plugins/storage-denokv/index.js.map +++ b/dist/esm/plugins/storage-denokv/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","names":["ensureRxStorageInstanceParamsAreCorrect","RX_STORAGE_NAME_DENOKV","createDenoKVStorageInstance","RXDB_VERSION","RxStorageDenoKV","settings","name","rxdbVersion","_proto","prototype","createStorageInstance","params","getRxStorageDenoKV","consistencyLevel","storage"],"sources":["../../../../src/plugins/storage-denokv/index.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport type { DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RX_STORAGE_NAME_DENOKV } from \"./denokv-helper.ts\";\nimport { RxStorageInstanceDenoKV, createDenoKVStorageInstance } from \"./rx-storage-instance-denokv.ts\";\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDenoKV implements RxStorage, DenoKVSettings> {\n public name = RX_STORAGE_NAME_DENOKV;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public settings: DenoKVSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDenoKVStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDenoKV(\n settings: DenoKVSettings = {\n consistencyLevel: 'strong'\n }\n): RxStorageDenoKV {\n const storage = new RxStorageDenoKV(settings);\n return storage;\n}\n"],"mappings":"AAIA,SAASA,uCAAuC,QAAQ,4BAA4B;AAEpF,SAASC,sBAAsB,QAAQ,oBAAoB;AAC3D,SAAkCC,2BAA2B,QAAQ,iCAAiC;AACtG,SAASC,YAAY,QAAQ,gCAAgC;AAI7D,WAAaC,eAAe;EAIxB,SAAAA,gBACWC,QAAwB,EACjC;IAAA,KALKC,IAAI,GAAGL,sBAAsB;IAAA,KACpBM,WAAW,GAAGJ,YAAY;IAAA,KAG/BE,QAAwB,GAAxBA,QAAwB;EAC/B;EAAC,IAAAG,MAAA,GAAAJ,eAAA,CAAAK,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAkE,EACvB;IAC3CX,uCAAuC,CAACW,MAAM,CAAC;IAC/C,OAAOT,2BAA2B,CAAC,IAAI,EAAES,MAAM,EAAE,IAAI,CAACN,QAAQ,CAAC;EACnE,CAAC;EAAA,OAAAD,eAAA;AAAA;AAIL,OAAO,SAASQ,kBAAkBA,CAC9BP,QAAwB,GAAG;EACvBQ,gBAAgB,EAAE;AACtB,CAAC,EACc;EACf,IAAMC,OAAO,GAAG,IAAIV,eAAe,CAACC,QAAQ,CAAC;EAC7C,OAAOS,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"index.js","names":["ensureRxStorageInstanceParamsAreCorrect","RX_STORAGE_NAME_DENOKV","createDenoKVStorageInstance","RXDB_VERSION","RxStorageDenoKV","settings","name","rxdbVersion","_proto","prototype","createStorageInstance","params","getRxStorageDenoKV","consistencyLevel","storage"],"sources":["../../../../src/plugins/storage-denokv/index.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport type { DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RX_STORAGE_NAME_DENOKV } from \"./denokv-helper.ts\";\nimport { RxStorageInstanceDenoKV, createDenoKVStorageInstance } from \"./rx-storage-instance-denokv.ts\";\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDenoKV implements RxStorage, DenoKVSettings> {\n public name = RX_STORAGE_NAME_DENOKV;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public settings: DenoKVSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDenoKVStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDenoKV(\n settings: DenoKVSettings = {\n consistencyLevel: 'strong'\n }\n): RxStorageDenoKV {\n const storage = new RxStorageDenoKV(settings);\n return storage;\n}\n"],"mappings":"AAIA,SAASA,uCAAuC,QAAQ,4BAA4B;AAEpF,SAASC,sBAAsB,QAAQ,oBAAoB;AAC3D,SAAkCC,2BAA2B,QAAQ,iCAAiC;AACtG,SAASC,YAAY,QAAQ,gCAAgC;AAI7D,WAAaC,eAAe;EAIxB,SAAAA,gBACWC,QAAwB,EACjC;IAAA,KALKC,IAAI,GAAGL,sBAAsB;IAAA,KACpBM,WAAW,GAAGJ,YAAY;IAAA,KAG/BE,QAAwB,GAAxBA,QAAwB;EAC/B;EAAC,IAAAG,MAAA,GAAAJ,eAAA,CAAAK,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAkE,EACvB;IAC3CX,uCAAuC,CAACW,MAAM,CAAC;IAC/C,OAAOT,2BAA2B,CAAC,IAAI,EAAES,MAAM,EAAE,IAAI,CAACN,QAAQ,CAAC;EACnE,CAAC;EAAA,OAAAD,eAAA;AAAA;AAIL,OAAO,SAASQ,kBAAkBA,CAC9BP,QAAwB,GAAG;EACvBQ,gBAAgB,EAAE;AACtB,CAAC,EACc;EACf,IAAMC,OAAO,GAAG,IAAIV,eAAe,CAACC,QAAQ,CAAC;EAC7C,OAAOS,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-denokv/rx-storage-instance-denokv.js.map b/dist/esm/plugins/storage-denokv/rx-storage-instance-denokv.js.map index 44dd6a82834..62a210cd8cb 100644 --- a/dist/esm/plugins/storage-denokv/rx-storage-instance-denokv.js.map +++ b/dist/esm/plugins/storage-denokv/rx-storage-instance-denokv.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-denokv.js","names":["Subject","getPrimaryFieldOfPrimaryKey","addRxStorageMultiInstanceSupport","CLEANUP_INDEX","DENOKV_DOCUMENT_ROOT_PATH","RX_STORAGE_NAME_DENOKV","getDenoGlobal","getDenoKVIndexName","getIndexableStringMonad","getStartIndexStringFromLowerBound","appendToArray","batchArray","toArray","ensureNotFalsy","categorizeBulkWriteRows","now","queryDenoKV","INDEX_MAX","PROMISE_RESOLVE_VOID","flatClone","RxStorageInstanceDenoKV","storage","databaseName","collectionName","schema","internals","options","settings","keySpace","version","join","kvOptions","consistency","consistencyLevel","changes$","primaryPath","primaryKey","kvPromise","openKv","openKvPath","then","kv","set","_proto","prototype","retryUntilNoWriteInBetween","fn","writeBlockKeyBefore","get","writeBlockValueBefore","value","result","writeBlockKeyAfter","writeBlockValueAfter","bulkWrite","documentWrites","context","_this","ret","success","error","batches","batchSize","writeBatch","_loop","writeBlockKey","docsInDB","Map","readManyBatches","Promise","all","map","readManyBatch","docsResult","getMany","writeRow","docId","document","row","docData","categorized","tx","atomic","check","bulkInsertDocs","forEach","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexId","bulkUpdateDocs","oldIndexString","previous","newIndexString","delete","txResult","commit","ok","errors","eventBulk","events","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","next","findDocumentsById","ids","withDeleted","kvKey","findSingleResult","docInDb","_deleted","query","preparedQuery","count","documents","mode","getAttachmentData","documentId","attachmentId","digest","Error","changeStream","asObservable","cleanup","minimumDeletedTime","_this2","maxDeletionTime","index","indexName","lowerBoundString","upperBoundString","noMoreUndeleted","range","list","start","end","limit","rangeCount","_loop2","docDataResult","indexMetaInner","_ret","close","closed","complete","remove","ensureNotClosed","promises","key","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createDenoKVStorageInstance","params","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","instance","resolve"],"sources":["../../../../src/plugins/storage-denokv/rx-storage-instance-denokv.ts"],"sourcesContent":["\nimport {\n Subject,\n Observable\n} from 'rxjs';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n RxConflictResultionTask,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport type { DenoKVIndexMeta, DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RxStorageDenoKV } from './index.ts';\nimport { CLEANUP_INDEX, DENOKV_DOCUMENT_ROOT_PATH, RX_STORAGE_NAME_DENOKV, getDenoGlobal, getDenoKVIndexName } from \"./denokv-helper.ts\";\nimport { getIndexableStringMonad, getStartIndexStringFromLowerBound } from \"../../custom-index.ts\";\nimport { appendToArray, batchArray, lastOfArray, toArray } from \"../utils/utils-array.ts\";\nimport { ensureNotFalsy } from \"../utils/utils-other.ts\";\nimport { categorizeBulkWriteRows } from \"../../rx-storage-helper.ts\";\nimport { now } from \"../utils/utils-time.ts\";\nimport { queryDenoKV } from \"./denokv-query.ts\";\nimport { INDEX_MAX } from \"../../query-planner.ts\";\nimport { PROMISE_RESOLVE_VOID } from \"../utils/utils-promise.ts\";\nimport { flatClone } from \"../utils/utils-object.ts\";\n\n\n\nexport class RxStorageInstanceDenoKV implements RxStorageInstance<\n RxDocType,\n DenoKVStorageInternals,\n DenoKVSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public closed?: Promise;\n public readonly kvPromise: Promise;\n\n constructor(\n public readonly storage: RxStorageDenoKV,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DenoKVStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DenoKVSettings,\n public readonly keySpace = ['rxdb', databaseName, collectionName, schema.version].join('|'),\n public readonly kvOptions = { consistency: settings.consistencyLevel }\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.kvPromise = getDenoGlobal().openKv(settings.openKvPath).then(async (kv: any) => {\n // insert writeBlockKey\n await kv.set([this.keySpace], 1);\n return kv;\n });\n }\n\n /**\n * DenoKV has no transactions\n * so we have to ensure that there is no write in between our queries\n * which would confuse RxDB and return wrong query results.\n */\n async retryUntilNoWriteInBetween(\n fn: () => Promise\n ): Promise {\n const kv = await this.kvPromise;\n while (true) {\n const writeBlockKeyBefore = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueBefore = writeBlockKeyBefore ? writeBlockKeyBefore.value : -1;\n const result = await fn();\n const writeBlockKeyAfter = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueAfter = writeBlockKeyAfter ? writeBlockKeyAfter.value : -1;\n\n if (writeBlockValueBefore === writeBlockValueAfter) {\n return result;\n }\n }\n }\n\n async bulkWrite(documentWrites: BulkWriteRow[], context: string): Promise> {\n const kv = await this.kvPromise;\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const batches = batchArray(documentWrites, ensureNotFalsy(this.settings.batchSize));\n\n /**\n * DenoKV does not have transactions\n * so we use a special writeBlock row to ensure\n * atomic writes (per document)\n * and so that we can do bulkWrites\n */\n for (const writeBatch of batches) {\n while (true) {\n const writeBlockKey = await kv.get([this.keySpace], this.kvOptions);\n const docsInDB = new Map>();\n\n /**\n * TODO the max amount for .getMany() is 10 which is defined by deno itself.\n * How can this be increased?\n */\n const readManyBatches = batchArray(writeBatch, 10);\n await Promise.all(\n readManyBatches.map(async (readManyBatch) => {\n const docsResult = await kv.getMany(\n readManyBatch.map(writeRow => {\n const docId: string = writeRow.document[primaryPath] as any;\n return [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n })\n );\n docsResult.map((row: any) => {\n const docData = row.value;\n if (!docData) {\n return;\n }\n const docId: string = docData[primaryPath] as any;\n docsInDB.set(docId, docData);\n });\n })\n );\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n\n let tx = kv.atomic();\n tx = tx.set([this.keySpace], ensureNotFalsy(writeBlockKey.value) + 1);\n tx = tx.check(writeBlockKey);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n tx = tx.set([this.keySpace, indexMeta.indexId, indexString], docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n tx = tx.delete([this.keySpace, indexMeta.indexId, oldIndexString]);\n tx = tx.set([this.keySpace, indexMeta.indexId, newIndexString], docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n const txResult = await tx.commit();\n if (txResult.ok) {\n appendToArray(ret.error, categorized.errors);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n break;\n }\n }\n }\n return ret;\n }\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const kv = await this.kvPromise;\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const kvKey = [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n const findSingleResult = await kv.get(kvKey, this.kvOptions);\n const docInDb = findSingleResult.value;\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return this.retryUntilNoWriteInBetween(\n () => queryDenoKV(this, preparedQuery)\n );\n }\n async count(preparedQuery: PreparedQuery): Promise {\n /**\n * At this point in time (end 2023), DenoKV does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/denoland/deno/issues/18965\n */\n const result = await this.retryUntilNoWriteInBetween(\n () => this.query(preparedQuery)\n );\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n throw new Error(\"Method not implemented.\");\n }\n changeStream() {\n return this.changes$.asObservable();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const maxDeletionTime = now() - minimumDeletedTime;\n const kv = await this.kvPromise;\n const index = CLEANUP_INDEX;\n const indexName = getDenoKVIndexName(index);\n const indexMeta = this.internals.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n\n const range = kv.list({\n start: [this.keySpace, indexMeta.indexId, lowerBoundString],\n end: [this.keySpace, indexMeta.indexId, upperBoundString]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize,\n limit: this.settings.batchSize\n });\n\n let rangeCount = 0;\n for await (const row of range) {\n rangeCount = rangeCount + 1;\n const docId = row.value;\n const docDataResult = await kv.get([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], this.kvOptions);\n if (!docDataResult.value) {\n continue;\n }\n const docData = ensureNotFalsy(docDataResult.value);\n if (\n !docData._deleted ||\n docData._meta.lwt > maxDeletionTime\n ) {\n continue;\n }\n\n\n let tx = kv.atomic();\n tx = tx.check(docDataResult);\n tx = tx.delete([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId]);\n Object\n .values(this.internals.indexes)\n .forEach(indexMetaInner => {\n tx = tx.delete([this.keySpace, indexMetaInner.indexId, docId]);\n });\n await tx.commit();\n }\n return noMoreUndeleted;\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const kv = await this.kvPromise;\n await kv.close();\n })();\n return this.closed;\n }\n async remove(): Promise {\n ensureNotClosed(this);\n const kv = await this.kvPromise;\n const range = kv.list({\n start: [this.keySpace],\n end: [this.keySpace, INDEX_MAX]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize\n });\n let promises: Promise[] = [];\n for await (const row of range) {\n promises.push(kv.delete(row.key));\n }\n\n await Promise.all(promises);\n return this.close();\n }\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\n\n\nexport async function createDenoKVStorageInstance(\n storage: RxStorageDenoKV,\n params: RxStorageInstanceCreationParams,\n settings: DenoKVSettings\n): Promise> {\n settings = flatClone(settings);\n if (!settings.batchSize) {\n settings.batchSize = 100;\n }\n\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const indexDBs: { [indexName: string]: DenoKVIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach((indexAr, indexId) => {\n const indexName = getDenoKVIndexName(indexAr);\n indexDBs[indexName] = {\n indexId: '|' + indexId + '|',\n indexName,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n const internals = {\n indexes: indexDBs\n };\n const instance = new RxStorageInstanceDenoKV(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DENOKV,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDenoKV\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDenoKV is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-denokv.js","names":["Subject","getPrimaryFieldOfPrimaryKey","addRxStorageMultiInstanceSupport","CLEANUP_INDEX","DENOKV_DOCUMENT_ROOT_PATH","RX_STORAGE_NAME_DENOKV","getDenoGlobal","getDenoKVIndexName","getIndexableStringMonad","getStartIndexStringFromLowerBound","appendToArray","batchArray","toArray","ensureNotFalsy","categorizeBulkWriteRows","now","queryDenoKV","INDEX_MAX","PROMISE_RESOLVE_VOID","flatClone","RxStorageInstanceDenoKV","storage","databaseName","collectionName","schema","internals","options","settings","keySpace","version","join","kvOptions","consistency","consistencyLevel","changes$","primaryPath","primaryKey","kvPromise","openKv","openKvPath","then","kv","set","_proto","prototype","retryUntilNoWriteInBetween","fn","writeBlockKeyBefore","get","writeBlockValueBefore","value","result","writeBlockKeyAfter","writeBlockValueAfter","bulkWrite","documentWrites","context","_this","ret","success","error","batches","batchSize","writeBatch","_loop","writeBlockKey","docsInDB","Map","readManyBatches","Promise","all","map","readManyBatch","docsResult","getMany","writeRow","docId","document","row","docData","categorized","tx","atomic","check","bulkInsertDocs","forEach","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexId","bulkUpdateDocs","oldIndexString","previous","newIndexString","delete","txResult","commit","ok","errors","eventBulk","events","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","next","findDocumentsById","ids","withDeleted","kvKey","findSingleResult","docInDb","_deleted","query","preparedQuery","count","documents","mode","getAttachmentData","documentId","attachmentId","digest","Error","changeStream","asObservable","cleanup","minimumDeletedTime","_this2","maxDeletionTime","index","indexName","lowerBoundString","upperBoundString","noMoreUndeleted","range","list","start","end","limit","rangeCount","_loop2","docDataResult","indexMetaInner","_ret","close","closed","complete","remove","ensureNotClosed","promises","key","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createDenoKVStorageInstance","params","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","instance","resolve"],"sources":["../../../../src/plugins/storage-denokv/rx-storage-instance-denokv.ts"],"sourcesContent":["\nimport {\n Subject,\n Observable\n} from 'rxjs';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n RxConflictResultionTask,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport type { DenoKVIndexMeta, DenoKVSettings, DenoKVStorageInternals } from './denokv-types.ts';\nimport { RxStorageDenoKV } from './index.ts';\nimport { CLEANUP_INDEX, DENOKV_DOCUMENT_ROOT_PATH, RX_STORAGE_NAME_DENOKV, getDenoGlobal, getDenoKVIndexName } from \"./denokv-helper.ts\";\nimport { getIndexableStringMonad, getStartIndexStringFromLowerBound } from \"../../custom-index.ts\";\nimport { appendToArray, batchArray, lastOfArray, toArray } from \"../utils/utils-array.ts\";\nimport { ensureNotFalsy } from \"../utils/utils-other.ts\";\nimport { categorizeBulkWriteRows } from \"../../rx-storage-helper.ts\";\nimport { now } from \"../utils/utils-time.ts\";\nimport { queryDenoKV } from \"./denokv-query.ts\";\nimport { INDEX_MAX } from \"../../query-planner.ts\";\nimport { PROMISE_RESOLVE_VOID } from \"../utils/utils-promise.ts\";\nimport { flatClone } from \"../utils/utils-object.ts\";\n\n\n\nexport class RxStorageInstanceDenoKV implements RxStorageInstance<\n RxDocType,\n DenoKVStorageInternals,\n DenoKVSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public closed?: Promise;\n public readonly kvPromise: Promise;\n\n constructor(\n public readonly storage: RxStorageDenoKV,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DenoKVStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DenoKVSettings,\n public readonly keySpace = ['rxdb', databaseName, collectionName, schema.version].join('|'),\n public readonly kvOptions = { consistency: settings.consistencyLevel }\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.kvPromise = getDenoGlobal().openKv(settings.openKvPath).then(async (kv: any) => {\n // insert writeBlockKey\n await kv.set([this.keySpace], 1);\n return kv;\n });\n }\n\n /**\n * DenoKV has no transactions\n * so we have to ensure that there is no write in between our queries\n * which would confuse RxDB and return wrong query results.\n */\n async retryUntilNoWriteInBetween(\n fn: () => Promise\n ): Promise {\n const kv = await this.kvPromise;\n while (true) {\n const writeBlockKeyBefore = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueBefore = writeBlockKeyBefore ? writeBlockKeyBefore.value : -1;\n const result = await fn();\n const writeBlockKeyAfter = await kv.get([this.keySpace], this.kvOptions);\n const writeBlockValueAfter = writeBlockKeyAfter ? writeBlockKeyAfter.value : -1;\n\n if (writeBlockValueBefore === writeBlockValueAfter) {\n return result;\n }\n }\n }\n\n async bulkWrite(documentWrites: BulkWriteRow[], context: string): Promise> {\n const kv = await this.kvPromise;\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const batches = batchArray(documentWrites, ensureNotFalsy(this.settings.batchSize));\n\n /**\n * DenoKV does not have transactions\n * so we use a special writeBlock row to ensure\n * atomic writes (per document)\n * and so that we can do bulkWrites\n */\n for (const writeBatch of batches) {\n while (true) {\n const writeBlockKey = await kv.get([this.keySpace], this.kvOptions);\n const docsInDB = new Map>();\n\n /**\n * TODO the max amount for .getMany() is 10 which is defined by deno itself.\n * How can this be increased?\n */\n const readManyBatches = batchArray(writeBatch, 10);\n await Promise.all(\n readManyBatches.map(async (readManyBatch) => {\n const docsResult = await kv.getMany(\n readManyBatch.map(writeRow => {\n const docId: string = writeRow.document[primaryPath] as any;\n return [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n })\n );\n docsResult.map((row: any) => {\n const docData = row.value;\n if (!docData) {\n return;\n }\n const docId: string = docData[primaryPath] as any;\n docsInDB.set(docId, docData);\n });\n })\n );\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n\n let tx = kv.atomic();\n tx = tx.set([this.keySpace], ensureNotFalsy(writeBlockKey.value) + 1);\n tx = tx.check(writeBlockKey);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n tx = tx.set([this.keySpace, indexMeta.indexId, indexString], docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // insert document data\n tx = tx.set([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], writeRow.document);\n\n // insert secondary indexes\n Object.values(this.internals.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n tx = tx.delete([this.keySpace, indexMeta.indexId, oldIndexString]);\n tx = tx.set([this.keySpace, indexMeta.indexId, newIndexString], docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n const txResult = await tx.commit();\n if (txResult.ok) {\n appendToArray(ret.error, categorized.errors);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n break;\n }\n }\n }\n return ret;\n }\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const kv = await this.kvPromise;\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const kvKey = [this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId];\n const findSingleResult = await kv.get(kvKey, this.kvOptions);\n const docInDb = findSingleResult.value;\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return this.retryUntilNoWriteInBetween(\n () => queryDenoKV(this, preparedQuery)\n );\n }\n async count(preparedQuery: PreparedQuery): Promise {\n /**\n * At this point in time (end 2023), DenoKV does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/denoland/deno/issues/18965\n */\n const result = await this.retryUntilNoWriteInBetween(\n () => this.query(preparedQuery)\n );\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n throw new Error(\"Method not implemented.\");\n }\n changeStream() {\n return this.changes$.asObservable();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const maxDeletionTime = now() - minimumDeletedTime;\n const kv = await this.kvPromise;\n const index = CLEANUP_INDEX;\n const indexName = getDenoKVIndexName(index);\n const indexMeta = this.internals.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n\n const range = kv.list({\n start: [this.keySpace, indexMeta.indexId, lowerBoundString],\n end: [this.keySpace, indexMeta.indexId, upperBoundString]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize,\n limit: this.settings.batchSize\n });\n\n let rangeCount = 0;\n for await (const row of range) {\n rangeCount = rangeCount + 1;\n const docId = row.value;\n const docDataResult = await kv.get([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId], this.kvOptions);\n if (!docDataResult.value) {\n continue;\n }\n const docData = ensureNotFalsy(docDataResult.value);\n if (\n !docData._deleted ||\n docData._meta.lwt > maxDeletionTime\n ) {\n continue;\n }\n\n\n let tx = kv.atomic();\n tx = tx.check(docDataResult);\n tx = tx.delete([this.keySpace, DENOKV_DOCUMENT_ROOT_PATH, docId]);\n Object\n .values(this.internals.indexes)\n .forEach(indexMetaInner => {\n tx = tx.delete([this.keySpace, indexMetaInner.indexId, docId]);\n });\n await tx.commit();\n }\n return noMoreUndeleted;\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const kv = await this.kvPromise;\n await kv.close();\n })();\n return this.closed;\n }\n async remove(): Promise {\n ensureNotClosed(this);\n const kv = await this.kvPromise;\n const range = kv.list({\n start: [this.keySpace],\n end: [this.keySpace, INDEX_MAX]\n }, {\n consistency: this.settings.consistencyLevel,\n batchSize: this.settings.batchSize\n });\n let promises: Promise[] = [];\n for await (const row of range) {\n promises.push(kv.delete(row.key));\n }\n\n await Promise.all(promises);\n return this.close();\n }\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\n\n\nexport async function createDenoKVStorageInstance(\n storage: RxStorageDenoKV,\n params: RxStorageInstanceCreationParams,\n settings: DenoKVSettings\n): Promise> {\n settings = flatClone(settings);\n if (!settings.batchSize) {\n settings.batchSize = 100;\n }\n\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const indexDBs: { [indexName: string]: DenoKVIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach((indexAr, indexId) => {\n const indexName = getDenoKVIndexName(indexAr);\n indexDBs[indexName] = {\n indexId: '|' + indexId + '|',\n indexName,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n const internals = {\n indexes: indexDBs\n };\n const instance = new RxStorageInstanceDenoKV(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DENOKV,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDenoKV\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDenoKV is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-dexie/rx-storage-dexie.js.map b/dist/esm/plugins/storage-dexie/rx-storage-dexie.js.map index f75dd47cae0..ae01887b68c 100644 --- a/dist/esm/plugins/storage-dexie/rx-storage-dexie.js.map +++ b/dist/esm/plugins/storage-dexie/rx-storage-dexie.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-dexie.js","names":["RX_STORAGE_NAME_DEXIE","createDexieStorageInstance","ensureRxStorageInstanceParamsAreCorrect","RXDB_VERSION","RxStorageDexie","settings","name","rxdbVersion","_proto","prototype","createStorageInstance","params","getRxStorageDexie","storage"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-dexie.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport {\n createDexieStorageInstance,\n RxStorageInstanceDexie\n} from './rx-storage-instance-dexie.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDexie implements RxStorage {\n public name = RX_STORAGE_NAME_DEXIE;\n public readonly rxdbVersion = RXDB_VERSION;\n constructor(\n public settings: DexieSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDexieStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDexie(\n settings: DexieSettings = {}\n): RxStorageDexie {\n const storage = new RxStorageDexie(settings);\n return storage;\n}\n"],"mappings":"AAIA,SACIA,qBAAqB,QAClB,mBAAmB;AAK1B,SACIC,0BAA0B,QAEvB,gCAAgC;AACvC,SAASC,uCAAuC,QAAQ,4BAA4B;AACpF,SAASC,YAAY,QAAQ,gCAAgC;AAI7D,WAAaC,cAAc;EAGvB,SAAAA,eACWC,QAAuB,EAChC;IAAA,KAJKC,IAAI,GAAGN,qBAAqB;IAAA,KACnBO,WAAW,GAAGJ,YAAY;IAAA,KAE/BE,QAAuB,GAAvBA,QAAuB;EAC9B;EAAC,IAAAG,MAAA,GAAAJ,cAAA,CAAAK,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAiE,EACvB;IAC1CT,uCAAuC,CAACS,MAAM,CAAC;IAC/C,OAAOV,0BAA0B,CAAC,IAAI,EAAEU,MAAM,EAAE,IAAI,CAACN,QAAQ,CAAC;EAClE,CAAC;EAAA,OAAAD,cAAA;AAAA;AAIL,OAAO,SAASQ,iBAAiBA,CAC7BP,QAAuB,GAAG,CAAC,CAAC,EACd;EACd,IAAMQ,OAAO,GAAG,IAAIT,cAAc,CAACC,QAAQ,CAAC;EAC5C,OAAOQ,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-dexie.js","names":["RX_STORAGE_NAME_DEXIE","createDexieStorageInstance","ensureRxStorageInstanceParamsAreCorrect","RXDB_VERSION","RxStorageDexie","settings","name","rxdbVersion","_proto","prototype","createStorageInstance","params","getRxStorageDexie","storage"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-dexie.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport {\n createDexieStorageInstance,\n RxStorageInstanceDexie\n} from './rx-storage-instance-dexie.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\n\n\nexport class RxStorageDexie implements RxStorage {\n public name = RX_STORAGE_NAME_DEXIE;\n public readonly rxdbVersion = RXDB_VERSION;\n constructor(\n public settings: DexieSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createDexieStorageInstance(this, params, this.settings);\n }\n}\n\n\nexport function getRxStorageDexie(\n settings: DexieSettings = {}\n): RxStorageDexie {\n const storage = new RxStorageDexie(settings);\n return storage;\n}\n"],"mappings":"AAIA,SACIA,qBAAqB,QAClB,mBAAmB;AAK1B,SACIC,0BAA0B,QAEvB,gCAAgC;AACvC,SAASC,uCAAuC,QAAQ,4BAA4B;AACpF,SAASC,YAAY,QAAQ,gCAAgC;AAI7D,WAAaC,cAAc;EAGvB,SAAAA,eACWC,QAAuB,EAChC;IAAA,KAJKC,IAAI,GAAGN,qBAAqB;IAAA,KACnBO,WAAW,GAAGJ,YAAY;IAAA,KAE/BE,QAAuB,GAAvBA,QAAuB;EAC9B;EAAC,IAAAG,MAAA,GAAAJ,cAAA,CAAAK,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAiE,EACvB;IAC1CT,uCAAuC,CAACS,MAAM,CAAC;IAC/C,OAAOV,0BAA0B,CAAC,IAAI,EAAEU,MAAM,EAAE,IAAI,CAACN,QAAQ,CAAC;EAClE,CAAC;EAAA,OAAAD,cAAA;AAAA;AAIL,OAAO,SAASQ,iBAAiBA,CAC7BP,QAAuB,GAAG,CAAC,CAAC,EACd;EACd,IAAMQ,OAAO,GAAG,IAAIT,cAAc,CAACC,QAAQ,CAAC;EAC5C,OAAOQ,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map b/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map index f016197215e..27524a0eab7 100644 --- a/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map +++ b/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-dexie.js","names":["Subject","now","ensureNotFalsy","defaultHashSha256","RXDB_UTILS_GLOBAL","PREMIUM_FLAG_HASH","attachmentObjectId","closeDexieDb","fromStorageToDexie","getDexieDbWithTables","getDocsInDb","RX_STORAGE_NAME_DEXIE","dexieCount","dexieQuery","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","flatCloneDocWithMeta","addRxStorageMultiInstanceSupport","newRxError","instanceId","DEXIE_TEST_META_FIELD","shownNonPremiumLog","RxStorageInstanceDexie","storage","databaseName","collectionName","schema","internals","options","settings","devMode","changes$","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensureNotClosed","premium","console","warn","join","forEach","row","document","_rev","previous","args","_meta","dir","Error","state","ret","success","error","map","doc","documentKeys","writeRow","categorized","dexieDb","transaction","dexieTable","dexieAttachmentsTable","docsInDbMap","Map","docsInDbWithInternals","docWithDexieInternals","set","errors","bulkPutDocs","bulkInsertDocs","push","bulkUpdateDocs","d","booleanIndexes","length","bulkPut","putAttachments","attachmentsAdd","attachment","id","documentId","attachmentId","data","attachmentData","attachmentsUpdate","bulkDelete","attachmentsRemove","eventBulk","events","lastState","newestRow","checkpoint","lwt","endTime","next","findDocumentsById","ids","deleted","docsInDb","documentInDb","_deleted","query","preparedQuery","count","queryPlan","selectorSatisfiedByIndex","result","mode","documents","changeStream","asObservable","cleanup","minimumDeletedTime","maxDeletionTime","toRemove","where","below","toArray","removeIds","getAttachmentData","_digest","get","remove","clear","close","closed","complete","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createDexieStorageInstance","params","instance","Promise","resolve"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-instance-dexie.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n now,\n ensureNotFalsy,\n defaultHashSha256,\n RXDB_UTILS_GLOBAL,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n CategorizeBulkWriteRowsOutput,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport { RxStorageDexie } from './rx-storage-dexie.ts';\nimport {\n attachmentObjectId,\n closeDexieDb,\n fromStorageToDexie,\n getDexieDbWithTables,\n getDocsInDb,\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport { dexieCount, dexieQuery } from './dexie-query.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows, flatCloneDocWithMeta } from '../../rx-storage-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport { newRxError } from '../../rx-error.ts';\n\nlet instanceId = now();\nexport const DEXIE_TEST_META_FIELD = 'dexieTestMetaField';\n\nlet shownNonPremiumLog = false;\n\n\nexport class RxStorageInstanceDexie implements RxStorageInstance<\n RxDocType,\n DexieStorageInternals,\n DexieSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n public closed?: Promise;\n\n constructor(\n public readonly storage: RxStorageDexie,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DexieStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DexieSettings,\n public readonly devMode: boolean\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n ensureNotClosed(this);\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=dexie ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n\n /**\n * Check some assumptions to ensure RxDB\n * does not call the storage with an invalid write.\n */\n documentWrites.forEach(row => {\n // ensure revision is set\n if (\n !row.document._rev ||\n (\n row.previous &&\n !row.previous._rev\n )\n ) {\n throw newRxError('SNH', { args: { row } });\n }\n\n // ensure prev-data is set\n if (this.devMode) {\n if (\n row.previous &&\n (\n !row.previous._meta[DEXIE_TEST_META_FIELD] ||\n row.previous._meta[DEXIE_TEST_META_FIELD] !== row.previous._rev\n )\n ) {\n console.dir(row);\n throw new Error('missing or wrong _meta.' + DEXIE_TEST_META_FIELD);\n }\n }\n });\n\n const state = await this.internals;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Some storages might add any _meta fields\n * internally. To ensure RxDB can work with that in the\n * test suite, we add a random field here.\n * To ensure \n */\n if (this.devMode) {\n documentWrites = documentWrites.map(row => {\n const doc = flatCloneDocWithMeta(row.document);\n doc._meta[DEXIE_TEST_META_FIELD] = doc._rev;\n return {\n previous: row.previous,\n document: doc\n }\n })\n }\n\n\n const documentKeys: string[] = documentWrites.map(writeRow => writeRow.document[this.primaryPath] as any);\n let categorized: CategorizeBulkWriteRowsOutput | undefined;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n state.dexieAttachmentsTable,\n async () => {\n const docsInDbMap = new Map>();\n const docsInDbWithInternals = await getDocsInDb(this.internals, documentKeys);\n docsInDbWithInternals.forEach(docWithDexieInternals => {\n const doc = docWithDexieInternals;\n if (doc) {\n docsInDbMap.set((doc as any)[this.primaryPath], doc as any);\n }\n return doc;\n });\n\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDbMap,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n /**\n * Batch up the database operations\n * so we can later run them in bulk.\n */\n let bulkPutDocs: any[] = [];\n categorized.bulkInsertDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n categorized.bulkUpdateDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n bulkPutDocs = bulkPutDocs.map(d => fromStorageToDexie(state.booleanIndexes, d));\n if (bulkPutDocs.length > 0) {\n await state.dexieTable.bulkPut(bulkPutDocs);\n }\n\n // handle attachments\n const putAttachments: { id: string, data: string }[] = [];\n categorized.attachmentsAdd.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n await state.dexieAttachmentsTable.bulkPut(putAttachments);\n await state.dexieAttachmentsTable.bulkDelete(\n categorized.attachmentsRemove.map(attachment => attachmentObjectId(attachment.documentId, attachment.attachmentId))\n );\n\n });\n\n categorized = ensureNotFalsy(categorized);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n\n async findDocumentsById(\n ids: string[],\n deleted: boolean\n ): Promise[]> {\n ensureNotClosed(this);\n const state = await this.internals;\n const ret: RxDocumentData[] = [];\n\n await state.dexieDb.transaction(\n 'r',\n state.dexieTable,\n async () => {\n const docsInDb = await getDocsInDb(this.internals, ids);\n docsInDb.forEach(documentInDb => {\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(documentInDb);\n }\n });\n });\n return ret;\n }\n\n query(preparedQuery: PreparedQuery): Promise> {\n ensureNotClosed(this);\n return dexieQuery(\n this,\n preparedQuery\n );\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n if (preparedQuery.queryPlan.selectorSatisfiedByIndex) {\n const result = await dexieCount(this, preparedQuery);\n return {\n count: result,\n mode: 'fast'\n };\n } else {\n const result = await dexieQuery(this, preparedQuery);\n return {\n count: result.documents.length,\n mode: 'slow'\n };\n }\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotClosed(this);\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n async () => {\n const maxDeletionTime = now() - minimumDeletedTime;\n /**\n * TODO only fetch _deleted=true\n */\n const toRemove = await state.dexieTable\n .where('_meta.lwt')\n .below(maxDeletionTime)\n .toArray();\n const removeIds: string[] = [];\n toRemove.forEach(doc => {\n if (doc._deleted === '1') {\n removeIds.push(doc[this.primaryPath]);\n }\n });\n await state.dexieTable.bulkDelete(removeIds);\n }\n );\n\n /**\n * TODO instead of deleting all deleted docs at once,\n * only clean up some of them and return false if there are more documents to clean up.\n * This ensures that when many documents have to be purged,\n * we do not block the more important tasks too long.\n */\n return true;\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n const id = attachmentObjectId(documentId, attachmentId);\n return await state.dexieDb.transaction(\n 'r',\n state.dexieAttachmentsTable,\n async () => {\n\n const attachment = await state.dexieAttachmentsTable.get(id);\n if (attachment) {\n return attachment.data;\n } else {\n throw new Error('attachment missing documentId: ' + documentId + ' attachmentId: ' + attachmentId);\n }\n });\n }\n\n async remove(): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieTable.clear()\n return this.close();\n }\n\n\n close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n await closeDexieDb(this.internals);\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\n\nexport async function createDexieStorageInstance(\n storage: RxStorageDexie,\n params: RxStorageInstanceCreationParams,\n settings: DexieSettings\n): Promise> {\n const internals = getDexieDbWithTables(\n params.databaseName,\n params.collectionName,\n settings,\n params.schema\n );\n\n const instance = new RxStorageInstanceDexie(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DEXIE,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDexie\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDexie is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-dexie.js","names":["Subject","now","ensureNotFalsy","defaultHashSha256","RXDB_UTILS_GLOBAL","PREMIUM_FLAG_HASH","attachmentObjectId","closeDexieDb","fromStorageToDexie","getDexieDbWithTables","getDocsInDb","RX_STORAGE_NAME_DEXIE","dexieCount","dexieQuery","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","flatCloneDocWithMeta","addRxStorageMultiInstanceSupport","newRxError","instanceId","DEXIE_TEST_META_FIELD","shownNonPremiumLog","RxStorageInstanceDexie","storage","databaseName","collectionName","schema","internals","options","settings","devMode","changes$","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensureNotClosed","premium","console","warn","join","forEach","row","document","_rev","previous","args","_meta","dir","Error","state","ret","success","error","map","doc","documentKeys","writeRow","categorized","dexieDb","transaction","dexieTable","dexieAttachmentsTable","docsInDbMap","Map","docsInDbWithInternals","docWithDexieInternals","set","errors","bulkPutDocs","bulkInsertDocs","push","bulkUpdateDocs","d","booleanIndexes","length","bulkPut","putAttachments","attachmentsAdd","attachment","id","documentId","attachmentId","data","attachmentData","attachmentsUpdate","bulkDelete","attachmentsRemove","eventBulk","events","lastState","newestRow","checkpoint","lwt","endTime","next","findDocumentsById","ids","deleted","docsInDb","documentInDb","_deleted","query","preparedQuery","count","queryPlan","selectorSatisfiedByIndex","result","mode","documents","changeStream","asObservable","cleanup","minimumDeletedTime","maxDeletionTime","toRemove","where","below","toArray","removeIds","getAttachmentData","_digest","get","remove","clear","close","closed","complete","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createDexieStorageInstance","params","instance","Promise","resolve"],"sources":["../../../../src/plugins/storage-dexie/rx-storage-instance-dexie.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n now,\n ensureNotFalsy,\n defaultHashSha256,\n RXDB_UTILS_GLOBAL,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport type {\n RxStorageInstance,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n RxStorageInstanceCreationParams,\n EventBulk,\n StringKeys,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n CategorizeBulkWriteRowsOutput,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport type {\n DexieSettings,\n DexieStorageInternals\n} from '../../types/plugins/dexie.d.ts';\nimport { RxStorageDexie } from './rx-storage-dexie.ts';\nimport {\n attachmentObjectId,\n closeDexieDb,\n fromStorageToDexie,\n getDexieDbWithTables,\n getDocsInDb,\n RX_STORAGE_NAME_DEXIE\n} from './dexie-helper.ts';\nimport { dexieCount, dexieQuery } from './dexie-query.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows, flatCloneDocWithMeta } from '../../rx-storage-helper.ts';\nimport { addRxStorageMultiInstanceSupport } from '../../rx-storage-multiinstance.ts';\nimport { newRxError } from '../../rx-error.ts';\n\nlet instanceId = now();\nexport const DEXIE_TEST_META_FIELD = 'dexieTestMetaField';\n\nlet shownNonPremiumLog = false;\n\n\nexport class RxStorageInstanceDexie implements RxStorageInstance<\n RxDocType,\n DexieStorageInternals,\n DexieSettings,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n public closed?: Promise;\n\n constructor(\n public readonly storage: RxStorageDexie,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: DexieStorageInternals,\n public readonly options: Readonly,\n public readonly settings: DexieSettings,\n public readonly devMode: boolean\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n ensureNotClosed(this);\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=dexie ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n\n /**\n * Check some assumptions to ensure RxDB\n * does not call the storage with an invalid write.\n */\n documentWrites.forEach(row => {\n // ensure revision is set\n if (\n !row.document._rev ||\n (\n row.previous &&\n !row.previous._rev\n )\n ) {\n throw newRxError('SNH', { args: { row } });\n }\n\n // ensure prev-data is set\n if (this.devMode) {\n if (\n row.previous &&\n (\n !row.previous._meta[DEXIE_TEST_META_FIELD] ||\n row.previous._meta[DEXIE_TEST_META_FIELD] !== row.previous._rev\n )\n ) {\n console.dir(row);\n throw new Error('missing or wrong _meta.' + DEXIE_TEST_META_FIELD);\n }\n }\n });\n\n const state = await this.internals;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Some storages might add any _meta fields\n * internally. To ensure RxDB can work with that in the\n * test suite, we add a random field here.\n * To ensure \n */\n if (this.devMode) {\n documentWrites = documentWrites.map(row => {\n const doc = flatCloneDocWithMeta(row.document);\n doc._meta[DEXIE_TEST_META_FIELD] = doc._rev;\n return {\n previous: row.previous,\n document: doc\n }\n })\n }\n\n\n const documentKeys: string[] = documentWrites.map(writeRow => writeRow.document[this.primaryPath] as any);\n let categorized: CategorizeBulkWriteRowsOutput | undefined;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n state.dexieAttachmentsTable,\n async () => {\n const docsInDbMap = new Map>();\n const docsInDbWithInternals = await getDocsInDb(this.internals, documentKeys);\n docsInDbWithInternals.forEach(docWithDexieInternals => {\n const doc = docWithDexieInternals;\n if (doc) {\n docsInDbMap.set((doc as any)[this.primaryPath], doc as any);\n }\n return doc;\n });\n\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDbMap,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n /**\n * Batch up the database operations\n * so we can later run them in bulk.\n */\n let bulkPutDocs: any[] = [];\n categorized.bulkInsertDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n categorized.bulkUpdateDocs.forEach(row => {\n ret.success.push(row.document);\n bulkPutDocs.push(row.document);\n });\n bulkPutDocs = bulkPutDocs.map(d => fromStorageToDexie(state.booleanIndexes, d));\n if (bulkPutDocs.length > 0) {\n await state.dexieTable.bulkPut(bulkPutDocs);\n }\n\n // handle attachments\n const putAttachments: { id: string, data: string }[] = [];\n categorized.attachmentsAdd.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n putAttachments.push({\n id: attachmentObjectId(attachment.documentId, attachment.attachmentId),\n data: attachment.attachmentData.data\n });\n });\n await state.dexieAttachmentsTable.bulkPut(putAttachments);\n await state.dexieAttachmentsTable.bulkDelete(\n categorized.attachmentsRemove.map(attachment => attachmentObjectId(attachment.documentId, attachment.attachmentId))\n );\n\n });\n\n categorized = ensureNotFalsy(categorized);\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n\n async findDocumentsById(\n ids: string[],\n deleted: boolean\n ): Promise[]> {\n ensureNotClosed(this);\n const state = await this.internals;\n const ret: RxDocumentData[] = [];\n\n await state.dexieDb.transaction(\n 'r',\n state.dexieTable,\n async () => {\n const docsInDb = await getDocsInDb(this.internals, ids);\n docsInDb.forEach(documentInDb => {\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(documentInDb);\n }\n });\n });\n return ret;\n }\n\n query(preparedQuery: PreparedQuery): Promise> {\n ensureNotClosed(this);\n return dexieQuery(\n this,\n preparedQuery\n );\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n if (preparedQuery.queryPlan.selectorSatisfiedByIndex) {\n const result = await dexieCount(this, preparedQuery);\n return {\n count: result,\n mode: 'fast'\n };\n } else {\n const result = await dexieQuery(this, preparedQuery);\n return {\n count: result.documents.length,\n mode: 'slow'\n };\n }\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotClosed(this);\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieDb.transaction(\n 'rw',\n state.dexieTable,\n async () => {\n const maxDeletionTime = now() - minimumDeletedTime;\n /**\n * TODO only fetch _deleted=true\n */\n const toRemove = await state.dexieTable\n .where('_meta.lwt')\n .below(maxDeletionTime)\n .toArray();\n const removeIds: string[] = [];\n toRemove.forEach(doc => {\n if (doc._deleted === '1') {\n removeIds.push(doc[this.primaryPath]);\n }\n });\n await state.dexieTable.bulkDelete(removeIds);\n }\n );\n\n /**\n * TODO instead of deleting all deleted docs at once,\n * only clean up some of them and return false if there are more documents to clean up.\n * This ensures that when many documents have to be purged,\n * we do not block the more important tasks too long.\n */\n return true;\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n const id = attachmentObjectId(documentId, attachmentId);\n return await state.dexieDb.transaction(\n 'r',\n state.dexieAttachmentsTable,\n async () => {\n\n const attachment = await state.dexieAttachmentsTable.get(id);\n if (attachment) {\n return attachment.data;\n } else {\n throw new Error('attachment missing documentId: ' + documentId + ' attachmentId: ' + attachmentId);\n }\n });\n }\n\n async remove(): Promise {\n ensureNotClosed(this);\n const state = await this.internals;\n await state.dexieTable.clear()\n return this.close();\n }\n\n\n close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n await closeDexieDb(this.internals);\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\n\nexport async function createDexieStorageInstance(\n storage: RxStorageDexie,\n params: RxStorageInstanceCreationParams,\n settings: DexieSettings\n): Promise> {\n const internals = getDexieDbWithTables(\n params.databaseName,\n params.collectionName,\n settings,\n params.schema\n );\n\n const instance = new RxStorageInstanceDexie(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_DEXIE,\n params,\n instance\n );\n\n return Promise.resolve(instance);\n}\n\n\n\nfunction ensureNotClosed(\n instance: RxStorageInstanceDexie\n) {\n if (instance.closed) {\n throw new Error('RxStorageInstanceDexie is closed ' + instance.databaseName + '-' + instance.collectionName);\n }\n}\n"],"mappings":"AAAA,SACIA,OAAO,QAEJ,MAAM;AACb,SACIC,GAAG,EACHC,cAAc,EACdC,iBAAiB,EACjBC,iBAAiB,EACjBC,iBAAiB,QACd,mBAAmB;AAwB1B,SACIC,kBAAkB,EAClBC,YAAY,EACZC,kBAAkB,EAClBC,oBAAoB,EACpBC,WAAW,EACXC,qBAAqB,QAClB,mBAAmB;AAC1B,SAASC,UAAU,EAAEC,UAAU,QAAQ,kBAAkB;AACzD,SAASC,2BAA2B,QAAQ,2BAA2B;AACvE,SAASC,uBAAuB,EAAEC,oBAAoB,QAAQ,4BAA4B;AAC1F,SAASC,gCAAgC,QAAQ,mCAAmC;AACpF,SAASC,UAAU,QAAQ,mBAAmB;AAE9C,IAAIC,UAAU,GAAGlB,GAAG,CAAC,CAAC;AACtB,OAAO,IAAMmB,qBAAqB,GAAG,oBAAoB;AAEzD,IAAIC,kBAAkB,GAAG,KAAK;AAG9B,WAAaC,sBAAsB;EAW/B,SAAAA,uBACoBC,OAAuB,EACvBC,YAAoB,EACpBC,cAAsB,EACtBC,MAAyD,EACzDC,SAAgC,EAChCC,OAAgC,EAChCC,QAAuB,EACvBC,OAAgB,EAClC;IAAA,KAbMC,QAAQ,GAAoG,IAAI/B,OAAO,CAAC,CAAC;IAAA,KACjHmB,UAAU,GAAGA,UAAU,EAAE;IAAA,KAIrBI,OAAuB,GAAvBA,OAAuB;IAAA,KACvBC,YAAoB,GAApBA,YAAoB;IAAA,KACpBC,cAAsB,GAAtBA,cAAsB;IAAA,KACtBC,MAAyD,GAAzDA,MAAyD;IAAA,KACzDC,SAAgC,GAAhCA,SAAgC;IAAA,KAChCC,OAAgC,GAAhCA,OAAgC;IAAA,KAChCC,QAAuB,GAAvBA,QAAuB;IAAA,KACvBC,OAAgB,GAAhBA,OAAgB;IAEhC,IAAI,CAACE,WAAW,GAAGlB,2BAA2B,CAAC,IAAI,CAACY,MAAM,CAACO,UAAU,CAAC;EAC1E;EAAC,IAAAC,MAAA,GAAAZ,sBAAA,CAAAa,SAAA;EAAAD,MAAA,CAEKE,SAAS,GAAf,eAAAA,UACIC,cAAyC,EACzCC,OAAe,EAC+B;IAC9CC,eAAe,CAAC,IAAI,CAAC;IAGrB,IACI,CAAClB,kBAAkB,KAEf,CAACjB,iBAAiB,CAACoC,OAAO,IAC1B,OAAOpC,iBAAiB,CAACoC,OAAO,KAAK,QAAQ,IAC5C,OAAMrC,iBAAiB,CAACC,iBAAiB,CAACoC,OAAO,CAAC,MAAKnC,iBAAkB,CAC7E,EACH;MACEoC,OAAO,CAACC,IAAI,CACR,CACI,yEAAyE,EACzE,iIAAiI,EACjI,iIAAiI,EACjI,mJAAmJ,EACnJ,2CAA2C,EAC3C,6IAA6I,EAC7I,uEAAuE,CAC1E,CAACC,IAAI,CAAC,IAAI,CACf,CAAC;MACDtB,kBAAkB,GAAG,IAAI;IAC7B,CAAC,MAAM;MACHA,kBAAkB,GAAG,IAAI;IAC7B;;IAGA;AACR;AACA;AACA;IACQgB,cAAc,CAACO,OAAO,CAACC,GAAG,IAAI;MAC1B;MACA,IACI,CAACA,GAAG,CAACC,QAAQ,CAACC,IAAI,IAEdF,GAAG,CAACG,QAAQ,IACZ,CAACH,GAAG,CAACG,QAAQ,CAACD,IACjB,EACH;QACE,MAAM7B,UAAU,CAAC,KAAK,EAAE;UAAE+B,IAAI,EAAE;YAAEJ;UAAI;QAAE,CAAC,CAAC;MAC9C;;MAEA;MACA,IAAI,IAAI,CAACf,OAAO,EAAE;QACd,IACIe,GAAG,CAACG,QAAQ,KAER,CAACH,GAAG,CAACG,QAAQ,CAACE,KAAK,CAAC9B,qBAAqB,CAAC,IAC1CyB,GAAG,CAACG,QAAQ,CAACE,KAAK,CAAC9B,qBAAqB,CAAC,KAAKyB,GAAG,CAACG,QAAQ,CAACD,IAAI,CAClE,EACH;UACEN,OAAO,CAACU,GAAG,CAACN,GAAG,CAAC;UAChB,MAAM,IAAIO,KAAK,CAAC,yBAAyB,GAAGhC,qBAAqB,CAAC;QACtE;MACJ;IACJ,CAAC,CAAC;IAEF,IAAMiC,KAAK,GAAG,MAAM,IAAI,CAAC1B,SAAS;IAClC,IAAM2B,GAA0C,GAAG;MAC/CC,OAAO,EAAE,EAAE;MACXC,KAAK,EAAE;IACX,CAAC;;IAED;AACR;AACA;AACA;AACA;AACA;IACQ,IAAI,IAAI,CAAC1B,OAAO,EAAE;MACdO,cAAc,GAAGA,cAAc,CAACoB,GAAG,CAACZ,GAAG,IAAI;QACvC,IAAMa,GAAG,GAAG1C,oBAAoB,CAAC6B,GAAG,CAACC,QAAQ,CAAC;QAC9CY,GAAG,CAACR,KAAK,CAAC9B,qBAAqB,CAAC,GAAGsC,GAAG,CAACX,IAAI;QAC3C,OAAO;UACHC,QAAQ,EAAEH,GAAG,CAACG,QAAQ;UACtBF,QAAQ,EAAEY;QACd,CAAC;MACL,CAAC,CAAC;IACN;IAGA,IAAMC,YAAsB,GAAGtB,cAAc,CAACoB,GAAG,CAACG,QAAQ,IAAIA,QAAQ,CAACd,QAAQ,CAAC,IAAI,CAACd,WAAW,CAAQ,CAAC;IACzG,IAAI6B,WAAiE;IACrE,MAAMR,KAAK,CAACS,OAAO,CAACC,WAAW,CAC3B,IAAI,EACJV,KAAK,CAACW,UAAU,EAChBX,KAAK,CAACY,qBAAqB,EAC3B,YAAY;MACR,IAAMC,WAAW,GAAG,IAAIC,GAAG,CAAoC,CAAC;MAChE,IAAMC,qBAAqB,GAAG,MAAM1D,WAAW,CAAY,IAAI,CAACiB,SAAS,EAAEgC,YAAY,CAAC;MACxFS,qBAAqB,CAACxB,OAAO,CAACyB,qBAAqB,IAAI;QACnD,IAAMX,GAAG,GAAGW,qBAAqB;QACjC,IAAIX,GAAG,EAAE;UACLQ,WAAW,CAACI,GAAG,CAAEZ,GAAG,CAAS,IAAI,CAAC1B,WAAW,CAAC,EAAE0B,GAAU,CAAC;QAC/D;QACA,OAAOA,GAAG;MACd,CAAC,CAAC;MAEFG,WAAW,GAAG9C,uBAAuB,CACjC,IAAI,EACJ,IAAI,CAACiB,WAAW,EAChBkC,WAAW,EACX7B,cAAc,EACdC,OACJ,CAAC;MACDgB,GAAG,CAACE,KAAK,GAAGK,WAAW,CAACU,MAAM;;MAE9B;AAChB;AACA;AACA;MACgB,IAAIC,WAAkB,GAAG,EAAE;MAC3BX,WAAW,CAACY,cAAc,CAAC7B,OAAO,CAACC,GAAG,IAAI;QACtCS,GAAG,CAACC,OAAO,CAACmB,IAAI,CAAC7B,GAAG,CAACC,QAAQ,CAAC;QAC9B0B,WAAW,CAACE,IAAI,CAAC7B,GAAG,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC;MACFe,WAAW,CAACc,cAAc,CAAC/B,OAAO,CAACC,GAAG,IAAI;QACtCS,GAAG,CAACC,OAAO,CAACmB,IAAI,CAAC7B,GAAG,CAACC,QAAQ,CAAC;QAC9B0B,WAAW,CAACE,IAAI,CAAC7B,GAAG,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC;MACF0B,WAAW,GAAGA,WAAW,CAACf,GAAG,CAACmB,CAAC,IAAIpE,kBAAkB,CAAC6C,KAAK,CAACwB,cAAc,EAAED,CAAC,CAAC,CAAC;MAC/E,IAAIJ,WAAW,CAACM,MAAM,GAAG,CAAC,EAAE;QACxB,MAAMzB,KAAK,CAACW,UAAU,CAACe,OAAO,CAACP,WAAW,CAAC;MAC/C;;MAEA;MACA,IAAMQ,cAA8C,GAAG,EAAE;MACzDnB,WAAW,CAACoB,cAAc,CAACrC,OAAO,CAACsC,UAAU,IAAI;QAC7CF,cAAc,CAACN,IAAI,CAAC;UAChBS,EAAE,EAAE7E,kBAAkB,CAAC4E,UAAU,CAACE,UAAU,EAAEF,UAAU,CAACG,YAAY,CAAC;UACtEC,IAAI,EAAEJ,UAAU,CAACK,cAAc,CAACD;QACpC,CAAC,CAAC;MACN,CAAC,CAAC;MACFzB,WAAW,CAAC2B,iBAAiB,CAAC5C,OAAO,CAACsC,UAAU,IAAI;QAChDF,cAAc,CAACN,IAAI,CAAC;UAChBS,EAAE,EAAE7E,kBAAkB,CAAC4E,UAAU,CAACE,UAAU,EAAEF,UAAU,CAACG,YAAY,CAAC;UACtEC,IAAI,EAAEJ,UAAU,CAACK,cAAc,CAACD;QACpC,CAAC,CAAC;MACN,CAAC,CAAC;MACF,MAAMjC,KAAK,CAACY,qBAAqB,CAACc,OAAO,CAACC,cAAc,CAAC;MACzD,MAAM3B,KAAK,CAACY,qBAAqB,CAACwB,UAAU,CACxC5B,WAAW,CAAC6B,iBAAiB,CAACjC,GAAG,CAACyB,UAAU,IAAI5E,kBAAkB,CAAC4E,UAAU,CAACE,UAAU,EAAEF,UAAU,CAACG,YAAY,CAAC,CACtH,CAAC;IAEL,CAAC,CAAC;IAENxB,WAAW,GAAG3D,cAAc,CAAC2D,WAAW,CAAC;IACzC,IAAIA,WAAW,CAAC8B,SAAS,CAACC,MAAM,CAACd,MAAM,GAAG,CAAC,EAAE;MACzC,IAAMe,SAAS,GAAG3F,cAAc,CAAC2D,WAAW,CAACiC,SAAS,CAAC,CAAChD,QAAQ;MAChEe,WAAW,CAAC8B,SAAS,CAACI,UAAU,GAAG;QAC/BZ,EAAE,EAAEU,SAAS,CAAC,IAAI,CAAC7D,WAAW,CAAC;QAC/BgE,GAAG,EAAEH,SAAS,CAAC3C,KAAK,CAAC8C;MACzB,CAAC;MACDnC,WAAW,CAAC8B,SAAS,CAACM,OAAO,GAAGhG,GAAG,CAAC,CAAC;MACrC,IAAI,CAAC8B,QAAQ,CAACmE,IAAI,CAACrC,WAAW,CAAC8B,SAAS,CAAC;IAC7C;IAEA,OAAOrC,GAAG;EACd,CAAC;EAAApB,MAAA,CAEKiE,iBAAiB,GAAvB,eAAAA,kBACIC,GAAa,EACbC,OAAgB,EACoB;IACpC9D,eAAe,CAAC,IAAI,CAAC;IACrB,IAAMc,KAAK,GAAG,MAAM,IAAI,CAAC1B,SAAS;IAClC,IAAM2B,GAAgC,GAAG,EAAE;IAE3C,MAAMD,KAAK,CAACS,OAAO,CAACC,WAAW,CAC3B,GAAG,EACHV,KAAK,CAACW,UAAU,EAChB,YAAY;MACR,IAAMsC,QAAQ,GAAG,MAAM5F,WAAW,CAAY,IAAI,CAACiB,SAAS,EAAEyE,GAAG,CAAC;MAClEE,QAAQ,CAAC1D,OAAO,CAAC2D,YAAY,IAAI;QAC7B,IACIA,YAAY,KACX,CAACA,YAAY,CAACC,QAAQ,IAAIH,OAAO,CAAC,EACrC;UACE/C,GAAG,CAACoB,IAAI,CAAC6B,YAAY,CAAC;QAC1B;MACJ,CAAC,CAAC;IACN,CAAC,CAAC;IACN,OAAOjD,GAAG;EACd,CAAC;EAAApB,MAAA,CAEDuE,KAAK,GAAL,SAAAA,MAAMC,aAAuC,EAA4C;IACrFnE,eAAe,CAAC,IAAI,CAAC;IACrB,OAAO1B,UAAU,CACb,IAAI,EACJ6F,aACJ,CAAC;EACL,CAAC;EAAAxE,MAAA,CACKyE,KAAK,GAAX,eAAAA,MACID,aAAuC,EACV;IAC7B,IAAIA,aAAa,CAACE,SAAS,CAACC,wBAAwB,EAAE;MAClD,IAAMC,MAAM,GAAG,MAAMlG,UAAU,CAAC,IAAI,EAAE8F,aAAa,CAAC;MACpD,OAAO;QACHC,KAAK,EAAEG,MAAM;QACbC,IAAI,EAAE;MACV,CAAC;IACL,CAAC,MAAM;MACH,IAAMD,OAAM,GAAG,MAAMjG,UAAU,CAAC,IAAI,EAAE6F,aAAa,CAAC;MACpD,OAAO;QACHC,KAAK,EAAEG,OAAM,CAACE,SAAS,CAAClC,MAAM;QAC9BiC,IAAI,EAAE;MACV,CAAC;IACL;EACJ,CAAC;EAAA7E,MAAA,CAED+E,YAAY,GAAZ,SAAAA,aAAA,EAAmH;IAC/G1E,eAAe,CAAC,IAAI,CAAC;IACrB,OAAO,IAAI,CAACR,QAAQ,CAACmF,YAAY,CAAC,CAAC;EACvC,CAAC;EAAAhF,MAAA,CAEKiF,OAAO,GAAb,eAAAA,QAAcC,kBAA0B,EAAoB;IACxD7E,eAAe,CAAC,IAAI,CAAC;IACrB,IAAMc,KAAK,GAAG,MAAM,IAAI,CAAC1B,SAAS;IAClC,MAAM0B,KAAK,CAACS,OAAO,CAACC,WAAW,CAC3B,IAAI,EACJV,KAAK,CAACW,UAAU,EAChB,YAAY;MACR,IAAMqD,eAAe,GAAGpH,GAAG,CAAC,CAAC,GAAGmH,kBAAkB;MAClD;AAChB;AACA;MACgB,IAAME,QAAQ,GAAG,MAAMjE,KAAK,CAACW,UAAU,CAClCuD,KAAK,CAAC,WAAW,CAAC,CAClBC,KAAK,CAACH,eAAe,CAAC,CACtBI,OAAO,CAAC,CAAC;MACd,IAAMC,SAAmB,GAAG,EAAE;MAC9BJ,QAAQ,CAAC1E,OAAO,CAACc,GAAG,IAAI;QACpB,IAAIA,GAAG,CAAC8C,QAAQ,KAAK,GAAG,EAAE;UACtBkB,SAAS,CAAChD,IAAI,CAAChB,GAAG,CAAC,IAAI,CAAC1B,WAAW,CAAC,CAAC;QACzC;MACJ,CAAC,CAAC;MACF,MAAMqB,KAAK,CAACW,UAAU,CAACyB,UAAU,CAACiC,SAAS,CAAC;IAChD,CACJ,CAAC;;IAED;AACR;AACA;AACA;AACA;AACA;IACQ,OAAO,IAAI;EACf,CAAC;EAAAxF,MAAA,CAEKyF,iBAAiB,GAAvB,eAAAA,kBAAwBvC,UAAkB,EAAEC,YAAoB,EAAEuC,OAAe,EAAmB;IAChGrF,eAAe,CAAC,IAAI,CAAC;IACrB,IAAMc,KAAK,GAAG,MAAM,IAAI,CAAC1B,SAAS;IAClC,IAAMwD,EAAE,GAAG7E,kBAAkB,CAAC8E,UAAU,EAAEC,YAAY,CAAC;IACvD,OAAO,MAAMhC,KAAK,CAACS,OAAO,CAACC,WAAW,CAClC,GAAG,EACHV,KAAK,CAACY,qBAAqB,EAC3B,YAAY;MAER,IAAMiB,UAAU,GAAG,MAAM7B,KAAK,CAACY,qBAAqB,CAAC4D,GAAG,CAAC1C,EAAE,CAAC;MAC5D,IAAID,UAAU,EAAE;QACZ,OAAOA,UAAU,CAACI,IAAI;MAC1B,CAAC,MAAM;QACH,MAAM,IAAIlC,KAAK,CAAC,iCAAiC,GAAGgC,UAAU,GAAG,iBAAiB,GAAGC,YAAY,CAAC;MACtG;IACJ,CAAC,CAAC;EACV,CAAC;EAAAnD,MAAA,CAEK4F,MAAM,GAAZ,eAAAA,OAAA,EAA8B;IAC1BvF,eAAe,CAAC,IAAI,CAAC;IACrB,IAAMc,KAAK,GAAG,MAAM,IAAI,CAAC1B,SAAS;IAClC,MAAM0B,KAAK,CAACW,UAAU,CAAC+D,KAAK,CAAC,CAAC;IAC9B,OAAO,IAAI,CAACC,KAAK,CAAC,CAAC;EACvB,CAAC;EAAA9F,MAAA,CAGD8F,KAAK,GAAL,SAAAA,MAAA,EAAuB;IACnB,IAAI,IAAI,CAACC,MAAM,EAAE;MACb,OAAO,IAAI,CAACA,MAAM;IACtB;IACA,IAAI,CAACA,MAAM,GAAG,CAAC,YAAY;MACvB,IAAI,CAAClG,QAAQ,CAACmG,QAAQ,CAAC,CAAC;MACxB,MAAM3H,YAAY,CAAC,IAAI,CAACoB,SAAS,CAAC;IACtC,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAACsG,MAAM;EACtB,CAAC;EAAA/F,MAAA,CAEDiG,sBAAsB,GAAtB,SAAAA,uBAAA,EAAyE;IACrE,OAAO,IAAInI,OAAO,CAAC,CAAC;EACxB,CAAC;EAAAkC,MAAA,CACKkG,4BAA4B,GAAlC,eAAAA,6BAAmCC,aAAyD,EAAiB,CAAE,CAAC;EAAA,OAAA/G,sBAAA;AAAA;AAKpH,OAAO,eAAegH,0BAA0BA,CAC5C/G,OAAuB,EACvBgH,MAAiE,EACjE1G,QAAuB,EACmB;EAC1C,IAAMF,SAAS,GAAGlB,oBAAoB,CAClC8H,MAAM,CAAC/G,YAAY,EACnB+G,MAAM,CAAC9G,cAAc,EACrBI,QAAQ,EACR0G,MAAM,CAAC7G,MACX,CAAC;EAED,IAAM8G,QAAQ,GAAG,IAAIlH,sBAAsB,CACvCC,OAAO,EACPgH,MAAM,CAAC/G,YAAY,EACnB+G,MAAM,CAAC9G,cAAc,EACrB8G,MAAM,CAAC7G,MAAM,EACbC,SAAS,EACT4G,MAAM,CAAC3G,OAAO,EACdC,QAAQ,EACR0G,MAAM,CAACzG,OACX,CAAC;EAED,MAAMb,gCAAgC,CAClCN,qBAAqB,EACrB4H,MAAM,EACNC,QACJ,CAAC;EAED,OAAOC,OAAO,CAACC,OAAO,CAACF,QAAQ,CAAC;AACpC;AAIA,SAASjG,eAAeA,CACpBiG,QAAqC,EACvC;EACE,IAAIA,QAAQ,CAACP,MAAM,EAAE;IACjB,MAAM,IAAI7E,KAAK,CAAC,mCAAmC,GAAGoF,QAAQ,CAAChH,YAAY,GAAG,GAAG,GAAGgH,QAAQ,CAAC/G,cAAc,CAAC;EAChH;AACJ","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map b/dist/esm/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map index 82939af57a4..7d823defaf8 100644 --- a/dist/esm/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map +++ b/dist/esm/plugins/storage-foundationdb/rx-storage-instance-foundationdb.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-foundationdb.js","names":["Subject","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","CLEANUP_INDEX","FOUNDATION_DB_WRITE_BATCH_SIZE","getFoundationDBIndexName","getIndexableStringMonad","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","appendToArray","batchArray","ensureNotFalsy","now","PROMISE_RESOLVE_VOID","toArray","queryFoundationDB","INDEX_MAX","attachmentMapKey","RxStorageInstanceFoundationDB","storage","databaseName","collectionName","schema","internals","options","settings","changes$","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","dbs","dbsPromise","ret","success","error","writeBatches","Promise","all","map","writeBatch","categorized","root","doTransaction","tx","ids","row","document","mainTx","at","main","subspace","attachmentTx","attachments","docsInDB","Map","id","doc","get","set","errors","bulkInsertDocs","forEach","writeRow","docId","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexTx","db","bulkUpdateDocs","oldIndexString","previous","newIndexString","delete","attachmentsAdd","attachment","documentId","attachmentId","attachmentData","attachmentsUpdate","attachmentsRemove","eventBulk","events","length","lastState","newestRow","checkpoint","lwt","_meta","endTime","next","findDocumentsById","withDeleted","docInDb","_deleted","query","preparedQuery","count","result","documents","mode","getAttachmentData","_digest","data","changeStream","asObservable","remove","clearRange","close","cleanup","minimumDeletedTime","keySelector","StreamingMode","require","maxDeletionTime","index","indexName","lowerBoundString","upperBoundString","noMoreUndeleted","batchSize","range","getRangeAll","firstGreaterThan","limit","streamingMode","Exact","pop","docIds","docsData","indexMetaInner","subIndexDB","docData","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","closed","complete","createFoundationDBStorageInstance","params","open","directory","encoders","connection","clusterFile","dir","createOrOpen","version","withKeyEncoding","string","withValueEncoding","json","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","indexDB","instance","resolve"],"sources":["../../../../src/plugins/storage-foundationdb/rx-storage-instance-foundationdb.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n RxAttachmentWriteData,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport type {\n FoundationDBDatabase,\n FoundationDBIndexMeta,\n FoundationDBStorageInternals,\n RxStorageFoundationDB,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageFoundationDBSettings\n} from './foundationdb-types.ts';\n// import {\n// open as foundationDBOpen,\n// directory as foundationDBDirectory,\n// encoders as foundationDBEncoders,\n// keySelector as foundationDBKeySelector,\n// StreamingMode as foundationDBStreamingMode\n// } from 'foundationdb';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport {\n\n CLEANUP_INDEX,\n FOUNDATION_DB_WRITE_BATCH_SIZE,\n getFoundationDBIndexName\n} from './foundationdb-helpers.ts';\nimport {\n getIndexableStringMonad,\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport {\n appendToArray,\n batchArray,\n ensureNotFalsy,\n lastOfArray,\n now,\n PROMISE_RESOLVE_VOID,\n toArray\n} from '../../plugins/utils/index.ts';\nimport { queryFoundationDB } from './foundationdb-query.ts';\nimport { INDEX_MAX } from '../../query-planner.ts';\nimport { attachmentMapKey } from '../storage-memory/index.ts';\n\nexport class RxStorageInstanceFoundationDB implements RxStorageInstance<\n RxDocType,\n FoundationDBStorageInternals,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n\n public closed?: Promise;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n\n constructor(\n public readonly storage: RxStorageFoundationDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: FoundationDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageFoundationDBSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n const dbs = await this.internals.dbsPromise;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Doing too many write in a single transaction\n * will throw with a 'Transaction exceeds byte limit'\n * so we have to batch up the writes.\n */\n const writeBatches = batchArray(documentWrites, FOUNDATION_DB_WRITE_BATCH_SIZE);\n await Promise.all(\n writeBatches.map(async (writeBatch) => {\n let categorized: CategorizeBulkWriteRowsOutput | undefined = null as any;\n await dbs.root.doTransaction(async (tx: any) => {\n const ids = writeBatch.map(row => (row.document as any)[this.primaryPath]);\n const mainTx = tx.at(dbs.main.subspace);\n const attachmentTx = tx.at(dbs.attachments.subspace);\n const docsInDB = new Map>();\n /**\n * TODO this might be faster if fdb\n * any time adds a bulk-fetch-by-key method.\n */\n await Promise.all(\n ids.map(async (id) => {\n const doc = await mainTx.get(id);\n docsInDB.set(id, doc);\n })\n );\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n appendToArray(ret.error, categorized.errors);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n mainTx.set(docId, writeRow.document);\n\n // insert secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.set(indexString, docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // overwrite document data\n mainTx.set(docId, writeRow.document);\n\n // update secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.delete(oldIndexString);\n indexTx.set(newIndexString, docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n // attachments\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentTx.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n });\n categorized = ensureNotFalsy(categorized);\n /**\n * The events must be emitted AFTER the transaction\n * has finished.\n * Otherwise an observable changestream might cause a read\n * to a document that does not already exist outside of the transaction.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n })\n );\n\n\n return ret;\n }\n\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const dbs = await this.internals.dbsPromise;\n return dbs.main.doTransaction(async (tx: any) => {\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const docInDb = await tx.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n });\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return queryFoundationDB(this, preparedQuery);\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n /**\n * At this point in time (end 2022), FoundationDB does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/apple/foundationdb/issues/5981\n */\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n const dbs = await this.internals.dbsPromise;\n const attachment = await dbs.attachments.get(attachmentMapKey(documentId, attachmentId));\n return attachment.data;\n }\n changeStream(): Observable, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async remove(): Promise {\n const dbs = await this.internals.dbsPromise;\n await dbs.root.doTransaction((tx: any) => {\n tx.clearRange('', INDEX_MAX);\n return PROMISE_RESOLVE_VOID;\n });\n return this.close();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const {\n keySelector,\n StreamingMode\n } = require('foundationdb');\n const maxDeletionTime = now() - minimumDeletedTime;\n const dbs = await this.internals.dbsPromise;\n const index = CLEANUP_INDEX;\n const indexName = getFoundationDBIndexName(index);\n const indexMeta = dbs.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n await dbs.root.doTransaction(async (tx: any) => {\n const batchSize = ensureNotFalsy(this.settings.batchSize);\n const indexTx = tx.at(indexMeta.db.subspace);\n const mainTx = tx.at(dbs.main.subspace);\n const range = await indexTx.getRangeAll(\n keySelector.firstGreaterThan(lowerBoundString),\n upperBoundString,\n {\n limit: batchSize + 1, // get one more extra to detect what to return from cleanup()\n streamingMode: StreamingMode.Exact\n }\n );\n if (range.length > batchSize) {\n noMoreUndeleted = false;\n range.pop();\n }\n const docIds = range.map((row: string[]) => row[1]);\n const docsData: RxDocumentData[] = await Promise.all(docIds.map((docId: string) => mainTx.get(docId)));\n\n Object\n .values(dbs.indexes)\n .forEach(indexMetaInner => {\n const subIndexDB = tx.at(indexMetaInner.db.subspace);\n docsData.forEach(docData => {\n const indexString = indexMetaInner.getIndexableString(docData);\n subIndexDB.delete(indexString);\n });\n });\n docIds.forEach((id: string) => mainTx.delete(id));\n });\n\n return noMoreUndeleted;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n\n async close() {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const dbs = await this.internals.dbsPromise;\n await dbs.root.close();\n\n // TODO shouldn't we close the index databases?\n // Object.values(dbs.indexes).forEach(db => db.close());\n })();\n return this.closed;\n }\n}\n\n\nexport function createFoundationDBStorageInstance(\n storage: RxStorageFoundationDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageFoundationDBSettings\n): Promise> {\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const {\n open,\n directory,\n encoders\n } = require('foundationdb');\n\n const connection = open(settings.clusterFile);\n const dbsPromise = (async () => {\n const dir = await directory.createOrOpen(connection, 'rxdb');\n\n const root = connection\n .at(dir)\n .at(params.databaseName + '.')\n .at(params.collectionName + '.')\n .at(params.schema.version + '.');\n const main: FoundationDBDatabase = root\n .at('main.')\n .withKeyEncoding(encoders.string) // automatically encode & decode keys using tuples\n .withValueEncoding(encoders.json) as any; // and values using JSON\n\n\n const events: FoundationDBDatabase>, RxStorageDefaultCheckpoint>> = root\n .at('events.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n const attachments: FoundationDBDatabase = root\n .at('attachments.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n\n const indexDBs: { [indexName: string]: FoundationDBIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n // used for `getChangedDocumentsSince()`\n useIndexesFinal.push([\n '_meta.lwt',\n primaryPath\n ]);\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach(indexAr => {\n const indexName = getFoundationDBIndexName(indexAr);\n const indexDB = root.at(indexName + '.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.string);\n indexDBs[indexName] = {\n indexName,\n db: indexDB,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n return {\n root,\n main,\n events,\n attachments,\n indexes: indexDBs\n };\n })();\n\n\n const internals: FoundationDBStorageInternals = {\n connection,\n dbsPromise: dbsPromise\n };\n\n const instance = new RxStorageInstanceFoundationDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-foundationdb.js","names":["Subject","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","CLEANUP_INDEX","FOUNDATION_DB_WRITE_BATCH_SIZE","getFoundationDBIndexName","getIndexableStringMonad","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","appendToArray","batchArray","ensureNotFalsy","now","PROMISE_RESOLVE_VOID","toArray","queryFoundationDB","INDEX_MAX","attachmentMapKey","RxStorageInstanceFoundationDB","storage","databaseName","collectionName","schema","internals","options","settings","changes$","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","dbs","dbsPromise","ret","success","error","writeBatches","Promise","all","map","writeBatch","categorized","root","doTransaction","tx","ids","row","document","mainTx","at","main","subspace","attachmentTx","attachments","docsInDB","Map","id","doc","get","set","errors","bulkInsertDocs","forEach","writeRow","docId","push","Object","values","indexes","indexMeta","indexString","getIndexableString","indexTx","db","bulkUpdateDocs","oldIndexString","previous","newIndexString","delete","attachmentsAdd","attachment","documentId","attachmentId","attachmentData","attachmentsUpdate","attachmentsRemove","eventBulk","events","length","lastState","newestRow","checkpoint","lwt","_meta","endTime","next","findDocumentsById","withDeleted","docInDb","_deleted","query","preparedQuery","count","result","documents","mode","getAttachmentData","_digest","data","changeStream","asObservable","remove","clearRange","close","cleanup","minimumDeletedTime","keySelector","StreamingMode","require","maxDeletionTime","index","indexName","lowerBoundString","upperBoundString","noMoreUndeleted","batchSize","range","getRangeAll","firstGreaterThan","limit","streamingMode","Exact","pop","docIds","docsData","indexMetaInner","subIndexDB","docData","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","closed","complete","createFoundationDBStorageInstance","params","open","directory","encoders","connection","clusterFile","dir","createOrOpen","version","withKeyEncoding","string","withValueEncoding","json","indexDBs","useIndexes","slice","useIndexesFinal","indexAr","indexDB","instance","resolve"],"sources":["../../../../src/plugins/storage-foundationdb/rx-storage-instance-foundationdb.ts"],"sourcesContent":["import { Observable, Subject } from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n RxAttachmentWriteData,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport type {\n FoundationDBDatabase,\n FoundationDBIndexMeta,\n FoundationDBStorageInternals,\n RxStorageFoundationDB,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageFoundationDBSettings\n} from './foundationdb-types.ts';\n// import {\n// open as foundationDBOpen,\n// directory as foundationDBDirectory,\n// encoders as foundationDBEncoders,\n// keySelector as foundationDBKeySelector,\n// StreamingMode as foundationDBStreamingMode\n// } from 'foundationdb';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport {\n\n CLEANUP_INDEX,\n FOUNDATION_DB_WRITE_BATCH_SIZE,\n getFoundationDBIndexName\n} from './foundationdb-helpers.ts';\nimport {\n getIndexableStringMonad,\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport {\n appendToArray,\n batchArray,\n ensureNotFalsy,\n lastOfArray,\n now,\n PROMISE_RESOLVE_VOID,\n toArray\n} from '../../plugins/utils/index.ts';\nimport { queryFoundationDB } from './foundationdb-query.ts';\nimport { INDEX_MAX } from '../../query-planner.ts';\nimport { attachmentMapKey } from '../storage-memory/index.ts';\n\nexport class RxStorageInstanceFoundationDB implements RxStorageInstance<\n RxDocType,\n FoundationDBStorageInternals,\n RxStorageFoundationDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n public readonly primaryPath: StringKeys>;\n\n public closed?: Promise;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n\n constructor(\n public readonly storage: RxStorageFoundationDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: FoundationDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageFoundationDBSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n const dbs = await this.internals.dbsPromise;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n /**\n * Doing too many write in a single transaction\n * will throw with a 'Transaction exceeds byte limit'\n * so we have to batch up the writes.\n */\n const writeBatches = batchArray(documentWrites, FOUNDATION_DB_WRITE_BATCH_SIZE);\n await Promise.all(\n writeBatches.map(async (writeBatch) => {\n let categorized: CategorizeBulkWriteRowsOutput | undefined = null as any;\n await dbs.root.doTransaction(async (tx: any) => {\n const ids = writeBatch.map(row => (row.document as any)[this.primaryPath]);\n const mainTx = tx.at(dbs.main.subspace);\n const attachmentTx = tx.at(dbs.attachments.subspace);\n const docsInDB = new Map>();\n /**\n * TODO this might be faster if fdb\n * any time adds a bulk-fetch-by-key method.\n */\n await Promise.all(\n ids.map(async (id) => {\n const doc = await mainTx.get(id);\n docsInDB.set(id, doc);\n })\n );\n categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDB,\n writeBatch,\n context\n );\n appendToArray(ret.error, categorized.errors);\n\n // INSERTS\n categorized.bulkInsertDocs.forEach(writeRow => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n ret.success.push(writeRow.document);\n\n // insert document data\n mainTx.set(docId, writeRow.document);\n\n // insert secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const indexString = indexMeta.getIndexableString(writeRow.document as any);\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.set(indexString, docId);\n });\n });\n // UPDATES\n categorized.bulkUpdateDocs.forEach((writeRow: BulkWriteRow) => {\n const docId: string = writeRow.document[this.primaryPath] as any;\n\n // overwrite document data\n mainTx.set(docId, writeRow.document);\n\n // update secondary indexes\n Object.values(dbs.indexes).forEach(indexMeta => {\n const oldIndexString = indexMeta.getIndexableString(ensureNotFalsy(writeRow.previous));\n const newIndexString = indexMeta.getIndexableString(writeRow.document as any);\n if (oldIndexString !== newIndexString) {\n const indexTx = tx.at(indexMeta.db.subspace);\n indexTx.delete(oldIndexString);\n indexTx.set(newIndexString, docId);\n }\n });\n ret.success.push(writeRow.document as any);\n });\n\n // attachments\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentTx.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n attachment.attachmentData\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentTx.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n });\n categorized = ensureNotFalsy(categorized);\n /**\n * The events must be emitted AFTER the transaction\n * has finished.\n * Otherwise an observable changestream might cause a read\n * to a document that does not already exist outside of the transaction.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n })\n );\n\n\n return ret;\n }\n\n async findDocumentsById(ids: string[], withDeleted: boolean): Promise[]> {\n const dbs = await this.internals.dbsPromise;\n return dbs.main.doTransaction(async (tx: any) => {\n const ret: RxDocumentData[] = [];\n await Promise.all(\n ids.map(async (docId) => {\n const docInDb = await tx.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n })\n );\n return ret;\n });\n }\n query(preparedQuery: PreparedQuery): Promise> {\n return queryFoundationDB(this, preparedQuery);\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n /**\n * At this point in time (end 2022), FoundationDB does not support\n * range counts. So we have to run a normal query and use the result set length.\n * @link https://github.com/apple/foundationdb/issues/5981\n */\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n async getAttachmentData(documentId: string, attachmentId: string, _digest: string): Promise {\n const dbs = await this.internals.dbsPromise;\n const attachment = await dbs.attachments.get(attachmentMapKey(documentId, attachmentId));\n return attachment.data;\n }\n changeStream(): Observable, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async remove(): Promise {\n const dbs = await this.internals.dbsPromise;\n await dbs.root.doTransaction((tx: any) => {\n tx.clearRange('', INDEX_MAX);\n return PROMISE_RESOLVE_VOID;\n });\n return this.close();\n }\n async cleanup(minimumDeletedTime: number): Promise {\n const {\n keySelector,\n StreamingMode\n } = require('foundationdb');\n const maxDeletionTime = now() - minimumDeletedTime;\n const dbs = await this.internals.dbsPromise;\n const index = CLEANUP_INDEX;\n const indexName = getFoundationDBIndexName(index);\n const indexMeta = dbs.indexes[indexName];\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n /**\n * Do not use 0 here,\n * because 1 is the minimum value for _meta.lwt\n */\n 1\n ]\n );\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n [\n true,\n maxDeletionTime\n ]\n );\n let noMoreUndeleted: boolean = true;\n await dbs.root.doTransaction(async (tx: any) => {\n const batchSize = ensureNotFalsy(this.settings.batchSize);\n const indexTx = tx.at(indexMeta.db.subspace);\n const mainTx = tx.at(dbs.main.subspace);\n const range = await indexTx.getRangeAll(\n keySelector.firstGreaterThan(lowerBoundString),\n upperBoundString,\n {\n limit: batchSize + 1, // get one more extra to detect what to return from cleanup()\n streamingMode: StreamingMode.Exact\n }\n );\n if (range.length > batchSize) {\n noMoreUndeleted = false;\n range.pop();\n }\n const docIds = range.map((row: string[]) => row[1]);\n const docsData: RxDocumentData[] = await Promise.all(docIds.map((docId: string) => mainTx.get(docId)));\n\n Object\n .values(dbs.indexes)\n .forEach(indexMetaInner => {\n const subIndexDB = tx.at(indexMetaInner.db.subspace);\n docsData.forEach(docData => {\n const indexString = indexMetaInner.getIndexableString(docData);\n subIndexDB.delete(indexString);\n });\n });\n docIds.forEach((id: string) => mainTx.delete(id));\n });\n\n return noMoreUndeleted;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject().asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n\n async close() {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n const dbs = await this.internals.dbsPromise;\n await dbs.root.close();\n\n // TODO shouldn't we close the index databases?\n // Object.values(dbs.indexes).forEach(db => db.close());\n })();\n return this.closed;\n }\n}\n\n\nexport function createFoundationDBStorageInstance(\n storage: RxStorageFoundationDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageFoundationDBSettings\n): Promise> {\n const primaryPath = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n\n const {\n open,\n directory,\n encoders\n } = require('foundationdb');\n\n const connection = open(settings.clusterFile);\n const dbsPromise = (async () => {\n const dir = await directory.createOrOpen(connection, 'rxdb');\n\n const root = connection\n .at(dir)\n .at(params.databaseName + '.')\n .at(params.collectionName + '.')\n .at(params.schema.version + '.');\n const main: FoundationDBDatabase = root\n .at('main.')\n .withKeyEncoding(encoders.string) // automatically encode & decode keys using tuples\n .withValueEncoding(encoders.json) as any; // and values using JSON\n\n\n const events: FoundationDBDatabase>, RxStorageDefaultCheckpoint>> = root\n .at('events.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n const attachments: FoundationDBDatabase = root\n .at('attachments.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.json) as any;\n\n\n const indexDBs: { [indexName: string]: FoundationDBIndexMeta; } = {};\n const useIndexes = params.schema.indexes ? params.schema.indexes.slice(0) : [];\n useIndexes.push([primaryPath]);\n const useIndexesFinal = useIndexes.map(index => {\n const indexAr = toArray(index);\n return indexAr;\n });\n // used for `getChangedDocumentsSince()`\n useIndexesFinal.push([\n '_meta.lwt',\n primaryPath\n ]);\n useIndexesFinal.push(CLEANUP_INDEX);\n useIndexesFinal.forEach(indexAr => {\n const indexName = getFoundationDBIndexName(indexAr);\n const indexDB = root.at(indexName + '.')\n .withKeyEncoding(encoders.string)\n .withValueEncoding(encoders.string);\n indexDBs[indexName] = {\n indexName,\n db: indexDB,\n getIndexableString: getIndexableStringMonad(params.schema, indexAr),\n index: indexAr\n };\n });\n\n return {\n root,\n main,\n events,\n attachments,\n indexes: indexDBs\n };\n })();\n\n\n const internals: FoundationDBStorageInternals = {\n connection,\n dbsPromise: dbsPromise\n };\n\n const instance = new RxStorageInstanceFoundationDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-lokijs/loki-save-queue.js.map b/dist/esm/plugins/storage-lokijs/loki-save-queue.js.map index 52a90671bdc..48706acc2af 100644 --- a/dist/esm/plugins/storage-lokijs/loki-save-queue.js.map +++ b/dist/esm/plugins/storage-lokijs/loki-save-queue.js.map @@ -1 +1 @@ -{"version":3,"file":"loki-save-queue.js","names":["PROMISE_RESOLVE_VOID","requestIdlePromise","LokiSaveQueue","lokiDatabase","databaseSettings","writesSinceLastRun","saveQueue","saveQueueC","_proto","prototype","addWrite","run","adapter","then","writeAmount","Promise","res","rej","saveDatabase","err","autosaveCallback","catch"],"sources":["../../../../src/plugins/storage-lokijs/loki-save-queue.ts"],"sourcesContent":["import type { LokiDatabaseSettings } from '../../types/index.d.ts';\nimport {\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../utils/index.ts';\n\n/**\n * The autosave feature of lokijs has strange behaviors\n * and often runs a save in critical moments when other\n * more important tasks are running.\n * So instead we use a custom save queue that ensures we\n * only run loki.saveDatabase() when nothing else is running.\n */\nexport class LokiSaveQueue {\n public writesSinceLastRun: number = 0;\n\n /**\n * Ensures that we do not run multiple saves\n * in parallel\n */\n public saveQueue: Promise = PROMISE_RESOLVE_VOID;\n // track amount of non-finished save calls in the queue.\n public saveQueueC = 0;\n\n constructor(\n public readonly lokiDatabase: any,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n\n }\n\n public addWrite() {\n this.writesSinceLastRun = this.writesSinceLastRun + 1;\n this.run();\n }\n\n public run() {\n if (\n // no persistence adapter given, so we do not need to save\n !this.databaseSettings.adapter ||\n // do not add more then two pending calls to the queue.\n this.saveQueueC > 2\n\n ) {\n return this.saveQueue;\n }\n\n this.saveQueueC = this.saveQueueC + 1;\n this.saveQueue = this.saveQueue\n .then(async () => {\n /**\n * Always wait until the JavaScript process is idle.\n * This ensures that CPU blocking writes are finished\n * before we proceed.\n */\n await requestIdlePromise();\n\n // no write happened since the last save call\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n /**\n * Because LokiJS is a in-memory database,\n * we can just wait until the JavaScript process is idle\n * via requestIdlePromise(). Then we know that nothing important\n * is running at the moment.\n */\n await requestIdlePromise().then(() => requestIdlePromise());\n\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n const writeAmount = this.writesSinceLastRun;\n this.writesSinceLastRun = 0;\n return new Promise((res, rej) => {\n this.lokiDatabase.saveDatabase((err: any) => {\n if (err) {\n this.writesSinceLastRun = this.writesSinceLastRun + writeAmount;\n rej(err);\n } else {\n if (this.databaseSettings.autosaveCallback) {\n this.databaseSettings.autosaveCallback();\n }\n res();\n }\n });\n });\n })\n .catch(() => { })\n .then(() => {\n this.saveQueueC = this.saveQueueC - 1;\n });\n return this.saveQueue;\n }\n}\n"],"mappings":"AACA,SACIA,oBAAoB,EACpBC,kBAAkB,QACf,mBAAmB;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAaC,aAAa;EAGtB;AACJ;AACA;AACA;;EAEI;;EAGA,SAAAA,cACoBC,YAAiB,EACjBC,gBAAsC,EACxD;IAAA,KAbKC,kBAAkB,GAAW,CAAC;IAAA,KAM9BC,SAAS,GAAkBN,oBAAoB;IAAA,KAE/CO,UAAU,GAAG,CAAC;IAAA,KAGDJ,YAAiB,GAAjBA,YAAiB;IAAA,KACjBC,gBAAsC,GAAtCA,gBAAsC;EAG1D;EAAC,IAAAI,MAAA,GAAAN,aAAA,CAAAO,SAAA;EAAAD,MAAA,CAEME,QAAQ,GAAf,SAAOA,QAAQA,CAAA,EAAG;IACd,IAAI,CAACL,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAG,CAAC;IACrD,IAAI,CAACM,GAAG,CAAC,CAAC;EACd,CAAC;EAAAH,MAAA,CAEMG,GAAG,GAAV,SAAOA,GAAGA,CAAA,EAAG;IACT;IACI;IACA,CAAC,IAAI,CAACP,gBAAgB,CAACQ,OAAO;IAC9B;IACA,IAAI,CAACL,UAAU,GAAG,CAAC,EAErB;MACE,OAAO,IAAI,CAACD,SAAS;IACzB;IAEA,IAAI,CAACC,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACrC,IAAI,CAACD,SAAS,GAAG,IAAI,CAACA,SAAS,CAC1BO,IAAI,CAAC,YAAY;MACd;AAChB;AACA;AACA;AACA;MACgB,MAAMZ,kBAAkB,CAAC,CAAC;;MAE1B;MACA,IAAI,IAAI,CAACI,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;;MAEA;AAChB;AACA;AACA;AACA;AACA;MACgB,MAAMJ,kBAAkB,CAAC,CAAC,CAACY,IAAI,CAAC,MAAMZ,kBAAkB,CAAC,CAAC,CAAC;MAE3D,IAAI,IAAI,CAACI,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;MAEA,IAAMS,WAAW,GAAG,IAAI,CAACT,kBAAkB;MAC3C,IAAI,CAACA,kBAAkB,GAAG,CAAC;MAC3B,OAAO,IAAIU,OAAO,CAAO,CAACC,GAAG,EAAEC,GAAG,KAAK;QACnC,IAAI,CAACd,YAAY,CAACe,YAAY,CAAEC,GAAQ,IAAK;UACzC,IAAIA,GAAG,EAAE;YACL,IAAI,CAACd,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAGS,WAAW;YAC/DG,GAAG,CAACE,GAAG,CAAC;UACZ,CAAC,MAAM;YACH,IAAI,IAAI,CAACf,gBAAgB,CAACgB,gBAAgB,EAAE;cACxC,IAAI,CAAChB,gBAAgB,CAACgB,gBAAgB,CAAC,CAAC;YAC5C;YACAJ,GAAG,CAAC,CAAC;UACT;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC,CACDK,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAChBR,IAAI,CAAC,MAAM;MACR,IAAI,CAACN,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACzC,CAAC,CAAC;IACN,OAAO,IAAI,CAACD,SAAS;EACzB,CAAC;EAAA,OAAAJ,aAAA;AAAA","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"loki-save-queue.js","names":["PROMISE_RESOLVE_VOID","requestIdlePromise","LokiSaveQueue","lokiDatabase","databaseSettings","writesSinceLastRun","saveQueue","saveQueueC","_proto","prototype","addWrite","run","adapter","then","writeAmount","Promise","res","rej","saveDatabase","err","autosaveCallback","catch"],"sources":["../../../../src/plugins/storage-lokijs/loki-save-queue.ts"],"sourcesContent":["import type { LokiDatabaseSettings } from '../../types/index.d.ts';\nimport {\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../utils/index.ts';\n\n/**\n * The autosave feature of lokijs has strange behaviors\n * and often runs a save in critical moments when other\n * more important tasks are running.\n * So instead we use a custom save queue that ensures we\n * only run loki.saveDatabase() when nothing else is running.\n */\nexport class LokiSaveQueue {\n public writesSinceLastRun: number = 0;\n\n /**\n * Ensures that we do not run multiple saves\n * in parallel\n */\n public saveQueue: Promise = PROMISE_RESOLVE_VOID;\n // track amount of non-finished save calls in the queue.\n public saveQueueC = 0;\n\n constructor(\n public readonly lokiDatabase: any,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n\n }\n\n public addWrite() {\n this.writesSinceLastRun = this.writesSinceLastRun + 1;\n this.run();\n }\n\n public run() {\n if (\n // no persistence adapter given, so we do not need to save\n !this.databaseSettings.adapter ||\n // do not add more then two pending calls to the queue.\n this.saveQueueC > 2\n\n ) {\n return this.saveQueue;\n }\n\n this.saveQueueC = this.saveQueueC + 1;\n this.saveQueue = this.saveQueue\n .then(async () => {\n /**\n * Always wait until the JavaScript process is idle.\n * This ensures that CPU blocking writes are finished\n * before we proceed.\n */\n await requestIdlePromise();\n\n // no write happened since the last save call\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n /**\n * Because LokiJS is a in-memory database,\n * we can just wait until the JavaScript process is idle\n * via requestIdlePromise(). Then we know that nothing important\n * is running at the moment.\n */\n await requestIdlePromise().then(() => requestIdlePromise());\n\n if (this.writesSinceLastRun === 0) {\n return;\n }\n\n const writeAmount = this.writesSinceLastRun;\n this.writesSinceLastRun = 0;\n return new Promise((res, rej) => {\n this.lokiDatabase.saveDatabase((err: any) => {\n if (err) {\n this.writesSinceLastRun = this.writesSinceLastRun + writeAmount;\n rej(err);\n } else {\n if (this.databaseSettings.autosaveCallback) {\n this.databaseSettings.autosaveCallback();\n }\n res();\n }\n });\n });\n })\n .catch(() => { })\n .then(() => {\n this.saveQueueC = this.saveQueueC - 1;\n });\n return this.saveQueue;\n }\n}\n"],"mappings":"AACA,SACIA,oBAAoB,EACpBC,kBAAkB,QACf,mBAAmB;;AAE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAaC,aAAa;EAGtB;AACJ;AACA;AACA;;EAEI;;EAGA,SAAAA,cACoBC,YAAiB,EACjBC,gBAAsC,EACxD;IAAA,KAbKC,kBAAkB,GAAW,CAAC;IAAA,KAM9BC,SAAS,GAAkBN,oBAAoB;IAAA,KAE/CO,UAAU,GAAG,CAAC;IAAA,KAGDJ,YAAiB,GAAjBA,YAAiB;IAAA,KACjBC,gBAAsC,GAAtCA,gBAAsC;EAG1D;EAAC,IAAAI,MAAA,GAAAN,aAAA,CAAAO,SAAA;EAAAD,MAAA,CAEME,QAAQ,GAAf,SAAAA,SAAA,EAAkB;IACd,IAAI,CAACL,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAG,CAAC;IACrD,IAAI,CAACM,GAAG,CAAC,CAAC;EACd,CAAC;EAAAH,MAAA,CAEMG,GAAG,GAAV,SAAAA,IAAA,EAAa;IACT;IACI;IACA,CAAC,IAAI,CAACP,gBAAgB,CAACQ,OAAO;IAC9B;IACA,IAAI,CAACL,UAAU,GAAG,CAAC,EAErB;MACE,OAAO,IAAI,CAACD,SAAS;IACzB;IAEA,IAAI,CAACC,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACrC,IAAI,CAACD,SAAS,GAAG,IAAI,CAACA,SAAS,CAC1BO,IAAI,CAAC,YAAY;MACd;AAChB;AACA;AACA;AACA;MACgB,MAAMZ,kBAAkB,CAAC,CAAC;;MAE1B;MACA,IAAI,IAAI,CAACI,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;;MAEA;AAChB;AACA;AACA;AACA;AACA;MACgB,MAAMJ,kBAAkB,CAAC,CAAC,CAACY,IAAI,CAAC,MAAMZ,kBAAkB,CAAC,CAAC,CAAC;MAE3D,IAAI,IAAI,CAACI,kBAAkB,KAAK,CAAC,EAAE;QAC/B;MACJ;MAEA,IAAMS,WAAW,GAAG,IAAI,CAACT,kBAAkB;MAC3C,IAAI,CAACA,kBAAkB,GAAG,CAAC;MAC3B,OAAO,IAAIU,OAAO,CAAO,CAACC,GAAG,EAAEC,GAAG,KAAK;QACnC,IAAI,CAACd,YAAY,CAACe,YAAY,CAAEC,GAAQ,IAAK;UACzC,IAAIA,GAAG,EAAE;YACL,IAAI,CAACd,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,GAAGS,WAAW;YAC/DG,GAAG,CAACE,GAAG,CAAC;UACZ,CAAC,MAAM;YACH,IAAI,IAAI,CAACf,gBAAgB,CAACgB,gBAAgB,EAAE;cACxC,IAAI,CAAChB,gBAAgB,CAACgB,gBAAgB,CAAC,CAAC;YAC5C;YACAJ,GAAG,CAAC,CAAC;UACT;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN,CAAC,CAAC,CACDK,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC,CAChBR,IAAI,CAAC,MAAM;MACR,IAAI,CAACN,UAAU,GAAG,IAAI,CAACA,UAAU,GAAG,CAAC;IACzC,CAAC,CAAC;IACN,OAAO,IAAI,CAACD,SAAS;EACzB,CAAC;EAAA,OAAAJ,aAAA;AAAA","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js b/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js index e7768390d66..efab21cece9 100644 --- a/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js +++ b/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js @@ -1,4 +1,3 @@ -import _readOnlyError from "@babel/runtime/helpers/readOnlyError"; import { Subject } from 'rxjs'; import { flatClone, now, ensureNotFalsy, isMaybeReadonlyArray, getFromMapOrThrow, hasDeepProperty, RXDB_UTILS_GLOBAL, defaultHashSha256, PREMIUM_FLAG_HASH } from "../utils/index.js"; import { newRxError } from "../../rx-error.js"; diff --git a/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js.map b/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js.map index 1c3c5c7c8cc..db8e861fa51 100644 --- a/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js.map +++ b/dist/esm/plugins/storage-lokijs/rx-storage-instance-loki.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-loki.js","names":["Subject","flatClone","now","ensureNotFalsy","isMaybeReadonlyArray","getFromMapOrThrow","hasDeepProperty","RXDB_UTILS_GLOBAL","defaultHashSha256","PREMIUM_FLAG_HASH","newRxError","closeLokiCollections","getLokiDatabase","OPEN_LOKIJS_STORAGE_INSTANCES","LOKIJS_COLLECTION_DEFAULT_OPTIONS","stripLokiKey","getLokiSortComparator","getLokiLeaderElector","requestRemoteInstance","mustUseLocalState","handleRemoteRequest","RX_STORAGE_NAME_LOKIJS","transformRegexToRegExp","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","addRxStorageMultiInstanceSupport","removeBroadcastChannelReference","getQueryMatcher","instanceId","shownNonPremiumLog","RxStorageInstanceLoki","databaseInstanceToken","storage","databaseName","collectionName","schema","internals","options","databaseSettings","changes$","primaryPath","primaryKey","add","leaderElector","copiedSelf","bulkWrite","bind","changeStream","cleanup","close","query","count","findDocumentsById","conflictResultionTasks","getAttachmentData","remove","resolveConflictResultionTask","awaitLeadership","then","broadcastChannel","addEventListener","msg","catch","_proto","prototype","documentWrites","context","premium","console","warn","join","length","args","localState","ret","success","error","docsInDb","Map","docsInDbWithLokiKey","forEach","writeRow","id","document","documentInDb","collection","by","set","categorized","errors","bulkInsertDocs","insert","push","bulkUpdateDocs","docId","documentInDbWithLokiKey","writeDoc","Object","assign","$loki","update","databaseState","saveQueue","addWrite","eventBulk","events","lastState","newestRow","checkpoint","lwt","_meta","endTime","next","ids","deleted","_deleted","preparedQueryOriginal","preparedQuery","selector","skip","limit","Infinity","skipPlusLimit","mustRunMatcher","lokiQuery","chain","find","sort","foundDocuments","data","map","lokiDoc","queryMatcher","filter","d","slice","documents","result","mode","_documentId","_attachmentId","_digest","Error","asObservable","minimumDeletedTime","deleteAmountPerRun","maxDeletionTime","$lt","closed","complete","delete","dbState","run","database","removeCollection","name","_taskSolution","createLokiLocalState","params","indices","indexes","idx","lokiCollectionName","version","collectionOptions","unique","addCollection","collections","createLokiStorageInstance","broadcastChannelRefObject","multiInstance","instance","undefined","closeBefore","removeBefore"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-instance-loki.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n flatClone,\n now,\n ensureNotFalsy,\n isMaybeReadonlyArray,\n getFromMapOrThrow,\n hasDeepProperty,\n RXDB_UTILS_GLOBAL,\n defaultHashSha256,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport type {\n RxStorageInstance,\n LokiSettings,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n MangoQuery,\n LokiStorageInternals,\n RxStorageInstanceCreationParams,\n LokiDatabaseSettings,\n LokiLocalDatabaseState,\n EventBulk,\n StringKeys,\n DeepReadonly,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport {\n closeLokiCollections,\n getLokiDatabase,\n OPEN_LOKIJS_STORAGE_INSTANCES,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS,\n stripLokiKey,\n getLokiSortComparator,\n getLokiLeaderElector,\n requestRemoteInstance,\n mustUseLocalState,\n handleRemoteRequest,\n RX_STORAGE_NAME_LOKIJS,\n transformRegexToRegExp\n} from './lokijs-helper.ts';\nimport type { RxStorageLoki } from './rx-storage-lokijs.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n addRxStorageMultiInstanceSupport,\n removeBroadcastChannelReference\n} from '../../rx-storage-multiinstance.ts';\nimport { getQueryMatcher } from '../../rx-query-helper.ts';\n\nlet instanceId = now();\nlet shownNonPremiumLog = false;\n\nexport class RxStorageInstanceLoki implements RxStorageInstance<\n RxDocType,\n LokiStorageInternals,\n LokiSettings,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n\n public closed?: Promise;\n\n constructor(\n public readonly databaseInstanceToken: string,\n public readonly storage: RxStorageLoki,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: LokiStorageInternals,\n public readonly options: Readonly,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n OPEN_LOKIJS_STORAGE_INSTANCES.add(this);\n if (this.internals.leaderElector) {\n\n\n /**\n * To run handleRemoteRequest(),\n * the instance will call its own methods.\n * But these methods could have already been swapped out by a RxStorageWrapper\n * so we must store the original methods here and use them instead.\n */\n const copiedSelf: RxStorageInstance = {\n bulkWrite: this.bulkWrite.bind(this),\n changeStream: this.changeStream.bind(this),\n cleanup: this.cleanup.bind(this),\n close: this.close.bind(this),\n query: this.query.bind(this),\n count: this.count.bind(this),\n findDocumentsById: this.findDocumentsById.bind(this),\n collectionName: this.collectionName,\n databaseName: this.databaseName,\n conflictResultionTasks: this.conflictResultionTasks.bind(this),\n getAttachmentData: this.getAttachmentData.bind(this),\n internals: this.internals,\n options: this.options,\n remove: this.remove.bind(this),\n resolveConflictResultionTask: this.resolveConflictResultionTask.bind(this),\n schema: this.schema\n };\n\n this.internals.leaderElector.awaitLeadership().then(() => {\n // this instance is leader now, so it has to reply to queries from other instances\n ensureNotFalsy(this.internals.leaderElector).broadcastChannel\n .addEventListener('message', (msg) => handleRemoteRequest(copiedSelf as any, msg));\n }).catch(() => { });\n }\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free LokiJS based RxStorage implementation from RxDB https://rxdb.info/rx-storage-lokijs.html?console=loki ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=loki ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n if (documentWrites.length === 0) {\n throw newRxError('P2', {\n args: {\n documentWrites\n }\n });\n }\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'bulkWrite', [documentWrites]);\n }\n\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const docsInDb: Map[StringKeys], RxDocumentData> = new Map();\n const docsInDbWithLokiKey: Map<\n RxDocumentData[StringKeys],\n RxDocumentData & { $loki: number; }\n > = new Map();\n documentWrites.forEach(writeRow => {\n const id = writeRow.document[this.primaryPath];\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (documentInDb) {\n docsInDbWithLokiKey.set(id as any, documentInDb);\n docsInDb.set(id as any, stripLokiKey(documentInDb));\n }\n });\n\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDb,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n categorized.bulkInsertDocs.forEach(writeRow => {\n localState.collection.insert(flatClone(writeRow.document));\n ret.success.push(writeRow.document);\n });\n categorized.bulkUpdateDocs.forEach(writeRow => {\n const docId = writeRow.document[this.primaryPath];\n const documentInDbWithLokiKey = getFromMapOrThrow(docsInDbWithLokiKey, docId as any);\n const writeDoc: any = Object.assign(\n {},\n writeRow.document,\n {\n $loki: documentInDbWithLokiKey.$loki\n }\n );\n localState.collection.update(writeDoc);\n ret.success.push(writeRow.document);\n });\n localState.databaseState.saveQueue.addWrite();\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n async findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'findDocumentsById', [ids, deleted]);\n }\n\n const ret: RxDocumentData[] = [];\n ids.forEach(id => {\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(stripLokiKey(documentInDb));\n }\n });\n return ret;\n }\n async query(preparedQueryOriginal: PreparedQuery): Promise> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'query', [preparedQueryOriginal]);\n }\n\n let preparedQuery = ensureNotFalsy(preparedQueryOriginal.query);\n if (preparedQuery.selector) {\n preparedQuery = flatClone(preparedQuery);\n preparedQuery.selector = transformRegexToRegExp(preparedQuery.selector);\n }\n\n const query = preparedQueryOriginal.query;\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n /**\n * LokiJS is not able to give correct results for some\n * operators, so we have to check all documents in that case\n * and laster apply skip and limit manually.\n * @link https://github.com/pubkey/rxdb/issues/5320\n */\n let mustRunMatcher = false;\n if (hasDeepProperty(preparedQuery.selector, '$in')) {\n mustRunMatcher = true;\n }\n\n\n let lokiQuery = localState.collection\n .chain()\n .find(mustRunMatcher ? {} : preparedQuery.selector);\n\n if (preparedQuery.sort) {\n lokiQuery = lokiQuery.sort(getLokiSortComparator(this.schema, preparedQuery));\n }\n\n\n let foundDocuments = lokiQuery.data().map((lokiDoc: any) => stripLokiKey(lokiDoc));\n\n\n /**\n * LokiJS returned wrong results on some queries\n * with complex indexes. Therefore we run the query-match\n * over all result docs to patch this bug.\n * TODO create an issue at the LokiJS repository.\n */\n const queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery as any\n );\n foundDocuments = foundDocuments.filter((d: any) => queryMatcher(d));\n\n // always apply offset and limit like this, because\n // sylvieQuery.offset() and sylvieQuery.limit() results were inconsistent\n foundDocuments = foundDocuments.slice(skip, skipPlusLimit);\n\n return {\n documents: foundDocuments\n };\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(_documentId: string, _attachmentId: string, _digest: string): Promise {\n throw new Error('Attachments are not implemented in the lokijs RxStorage. Make a pull request.');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'cleanup', [minimumDeletedTime]);\n }\n\n const deleteAmountPerRun = 10;\n const maxDeletionTime = now() - minimumDeletedTime;\n const query = localState.collection\n .chain()\n .find({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n }).limit(deleteAmountPerRun);\n const foundDocuments = query.data();\n if (foundDocuments.length > 0) {\n localState.collection.remove(foundDocuments);\n localState.databaseState.saveQueue.addWrite();\n }\n\n return foundDocuments.length !== deleteAmountPerRun;\n }\n\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n OPEN_LOKIJS_STORAGE_INSTANCES.delete(this);\n if (this.internals.localState) {\n const localState = await this.internals.localState;\n const dbState = await getLokiDatabase(\n this.databaseName,\n this.databaseSettings\n );\n await dbState.saveQueue.run();\n await closeLokiCollections(\n this.databaseName,\n [\n localState.collection\n ]\n );\n }\n })();\n return this.closed;\n }\n async remove(): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'remove', []);\n }\n localState.databaseState.database.removeCollection(localState.collection.name);\n await localState.databaseState.saveQueue.run();\n return this.close();\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\nexport async function createLokiLocalState(\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise {\n if (!params.options) {\n params.options = {};\n }\n\n const databaseState = await getLokiDatabase(\n params.databaseName,\n databaseSettings\n );\n\n /**\n * Construct loki indexes from RxJsonSchema indexes.\n * TODO what about compound indexes? Are they possible in lokijs?\n */\n const indices: string[] = [];\n if (params.schema.indexes) {\n params.schema.indexes.forEach(idx => {\n if (!isMaybeReadonlyArray(idx)) {\n indices.push(idx);\n }\n });\n }\n /**\n * LokiJS has no concept of custom primary key, they use a number-id that is generated.\n * To be able to query fast by primary key, we always add an index to the primary.\n */\n const primaryKey = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n indices.push(primaryKey as string);\n\n const lokiCollectionName = params.collectionName + '-' + params.schema.version;\n const collectionOptions: Partial = Object.assign(\n {},\n lokiCollectionName,\n {\n indices: indices as string[],\n unique: [primaryKey]\n } as any,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS\n );\n\n const collection: any = databaseState.database.addCollection(\n lokiCollectionName,\n collectionOptions as any\n );\n databaseState.collections[params.collectionName] = collection;\n const ret: LokiLocalDatabaseState = {\n databaseState,\n collection\n };\n\n return ret;\n}\n\n\nexport async function createLokiStorageInstance(\n storage: RxStorageLoki,\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise> {\n const internals: LokiStorageInternals = {};\n\n const broadcastChannelRefObject: DeepReadonly = {};\n\n\n if (params.multiInstance) {\n const leaderElector = getLokiLeaderElector(\n params.databaseInstanceToken,\n broadcastChannelRefObject,\n params.databaseName\n );\n internals.leaderElector = leaderElector;\n } else {\n // optimisation shortcut, directly create db is non multi instance.\n internals.localState = createLokiLocalState(params, databaseSettings);\n await internals.localState;\n }\n\n const instance = new RxStorageInstanceLoki(\n params.databaseInstanceToken,\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n databaseSettings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_LOKIJS,\n params,\n instance,\n internals.leaderElector ? internals.leaderElector.broadcastChannel : undefined\n );\n\n if (params.multiInstance) {\n /**\n * Clean up the broadcast-channel reference on close()\n */\n const closeBefore = instance.close.bind(instance);\n instance.close = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return closeBefore();\n };\n const removeBefore = instance.remove.bind(instance);\n instance.remove = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return removeBefore();\n };\n\n /**\n * Directly create the localState when/if the db becomes leader.\n */\n ensureNotFalsy(internals.leaderElector)\n .awaitLeadership()\n .then(() => {\n if (!instance.closed) {\n mustUseLocalState(instance);\n }\n });\n }\n\n\n return instance;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-loki.js","names":["Subject","flatClone","now","ensureNotFalsy","isMaybeReadonlyArray","getFromMapOrThrow","hasDeepProperty","RXDB_UTILS_GLOBAL","defaultHashSha256","PREMIUM_FLAG_HASH","newRxError","closeLokiCollections","getLokiDatabase","OPEN_LOKIJS_STORAGE_INSTANCES","LOKIJS_COLLECTION_DEFAULT_OPTIONS","stripLokiKey","getLokiSortComparator","getLokiLeaderElector","requestRemoteInstance","mustUseLocalState","handleRemoteRequest","RX_STORAGE_NAME_LOKIJS","transformRegexToRegExp","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","addRxStorageMultiInstanceSupport","removeBroadcastChannelReference","getQueryMatcher","instanceId","shownNonPremiumLog","RxStorageInstanceLoki","databaseInstanceToken","storage","databaseName","collectionName","schema","internals","options","databaseSettings","changes$","primaryPath","primaryKey","add","leaderElector","copiedSelf","bulkWrite","bind","changeStream","cleanup","close","query","count","findDocumentsById","conflictResultionTasks","getAttachmentData","remove","resolveConflictResultionTask","awaitLeadership","then","broadcastChannel","addEventListener","msg","catch","_proto","prototype","documentWrites","context","premium","console","warn","join","length","args","localState","ret","success","error","docsInDb","Map","docsInDbWithLokiKey","forEach","writeRow","id","document","documentInDb","collection","by","set","categorized","errors","bulkInsertDocs","insert","push","bulkUpdateDocs","docId","documentInDbWithLokiKey","writeDoc","Object","assign","$loki","update","databaseState","saveQueue","addWrite","eventBulk","events","lastState","newestRow","checkpoint","lwt","_meta","endTime","next","ids","deleted","_deleted","preparedQueryOriginal","preparedQuery","selector","skip","limit","Infinity","skipPlusLimit","mustRunMatcher","lokiQuery","chain","find","sort","foundDocuments","data","map","lokiDoc","queryMatcher","filter","d","slice","documents","result","mode","_documentId","_attachmentId","_digest","Error","asObservable","minimumDeletedTime","deleteAmountPerRun","maxDeletionTime","$lt","closed","complete","delete","dbState","run","database","removeCollection","name","_taskSolution","createLokiLocalState","params","indices","indexes","idx","lokiCollectionName","version","collectionOptions","unique","addCollection","collections","createLokiStorageInstance","broadcastChannelRefObject","multiInstance","instance","undefined","closeBefore","removeBefore"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-instance-loki.ts"],"sourcesContent":["import {\n Subject,\n Observable\n} from 'rxjs';\nimport {\n flatClone,\n now,\n ensureNotFalsy,\n isMaybeReadonlyArray,\n getFromMapOrThrow,\n hasDeepProperty,\n RXDB_UTILS_GLOBAL,\n defaultHashSha256,\n PREMIUM_FLAG_HASH\n} from '../utils/index.ts';\nimport { newRxError } from '../../rx-error.ts';\nimport type {\n RxStorageInstance,\n LokiSettings,\n RxStorageChangeEvent,\n RxDocumentData,\n BulkWriteRow,\n RxStorageBulkWriteResponse,\n RxStorageQueryResult,\n RxJsonSchema,\n MangoQuery,\n LokiStorageInternals,\n RxStorageInstanceCreationParams,\n LokiDatabaseSettings,\n LokiLocalDatabaseState,\n EventBulk,\n StringKeys,\n DeepReadonly,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxStorageDefaultCheckpoint,\n RxStorageCountResult,\n PreparedQuery\n} from '../../types/index.d.ts';\nimport {\n closeLokiCollections,\n getLokiDatabase,\n OPEN_LOKIJS_STORAGE_INSTANCES,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS,\n stripLokiKey,\n getLokiSortComparator,\n getLokiLeaderElector,\n requestRemoteInstance,\n mustUseLocalState,\n handleRemoteRequest,\n RX_STORAGE_NAME_LOKIJS,\n transformRegexToRegExp\n} from './lokijs-helper.ts';\nimport type { RxStorageLoki } from './rx-storage-lokijs.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n addRxStorageMultiInstanceSupport,\n removeBroadcastChannelReference\n} from '../../rx-storage-multiinstance.ts';\nimport { getQueryMatcher } from '../../rx-query-helper.ts';\n\nlet instanceId = now();\nlet shownNonPremiumLog = false;\n\nexport class RxStorageInstanceLoki implements RxStorageInstance<\n RxDocType,\n LokiStorageInternals,\n LokiSettings,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n private changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly instanceId = instanceId++;\n\n public closed?: Promise;\n\n constructor(\n public readonly databaseInstanceToken: string,\n public readonly storage: RxStorageLoki,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: LokiStorageInternals,\n public readonly options: Readonly,\n public readonly databaseSettings: LokiDatabaseSettings\n ) {\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n OPEN_LOKIJS_STORAGE_INSTANCES.add(this);\n if (this.internals.leaderElector) {\n\n\n /**\n * To run handleRemoteRequest(),\n * the instance will call its own methods.\n * But these methods could have already been swapped out by a RxStorageWrapper\n * so we must store the original methods here and use them instead.\n */\n const copiedSelf: RxStorageInstance = {\n bulkWrite: this.bulkWrite.bind(this),\n changeStream: this.changeStream.bind(this),\n cleanup: this.cleanup.bind(this),\n close: this.close.bind(this),\n query: this.query.bind(this),\n count: this.count.bind(this),\n findDocumentsById: this.findDocumentsById.bind(this),\n collectionName: this.collectionName,\n databaseName: this.databaseName,\n conflictResultionTasks: this.conflictResultionTasks.bind(this),\n getAttachmentData: this.getAttachmentData.bind(this),\n internals: this.internals,\n options: this.options,\n remove: this.remove.bind(this),\n resolveConflictResultionTask: this.resolveConflictResultionTask.bind(this),\n schema: this.schema\n };\n\n this.internals.leaderElector.awaitLeadership().then(() => {\n // this instance is leader now, so it has to reply to queries from other instances\n ensureNotFalsy(this.internals.leaderElector).broadcastChannel\n .addEventListener('message', (msg) => handleRemoteRequest(copiedSelf as any, msg));\n }).catch(() => { });\n }\n }\n\n async bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n\n if (\n !shownNonPremiumLog &&\n (\n !RXDB_UTILS_GLOBAL.premium ||\n typeof RXDB_UTILS_GLOBAL.premium !== 'string' ||\n (await defaultHashSha256(RXDB_UTILS_GLOBAL.premium) !== PREMIUM_FLAG_HASH)\n )\n ) {\n console.warn(\n [\n '-------------- RxDB Open Core RxStorage -------------------------------',\n 'You are using the free LokiJS based RxStorage implementation from RxDB https://rxdb.info/rx-storage-lokijs.html?console=loki ',\n 'While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.',\n 'For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability.',\n ' https://rxdb.info/premium?console=loki ',\n 'If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.',\n '---------------------------------------------------------------------'\n ].join('\\n')\n );\n shownNonPremiumLog = true;\n } else {\n shownNonPremiumLog = true;\n }\n\n if (documentWrites.length === 0) {\n throw newRxError('P2', {\n args: {\n documentWrites\n }\n });\n }\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'bulkWrite', [documentWrites]);\n }\n\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n const docsInDb: Map[StringKeys], RxDocumentData> = new Map();\n const docsInDbWithLokiKey: Map<\n RxDocumentData[StringKeys],\n RxDocumentData & { $loki: number; }\n > = new Map();\n documentWrites.forEach(writeRow => {\n const id = writeRow.document[this.primaryPath];\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (documentInDb) {\n docsInDbWithLokiKey.set(id as any, documentInDb);\n docsInDb.set(id as any, stripLokiKey(documentInDb));\n }\n });\n\n const categorized = categorizeBulkWriteRows(\n this,\n this.primaryPath as any,\n docsInDb,\n documentWrites,\n context\n );\n ret.error = categorized.errors;\n\n categorized.bulkInsertDocs.forEach(writeRow => {\n localState.collection.insert(flatClone(writeRow.document));\n ret.success.push(writeRow.document);\n });\n categorized.bulkUpdateDocs.forEach(writeRow => {\n const docId = writeRow.document[this.primaryPath];\n const documentInDbWithLokiKey = getFromMapOrThrow(docsInDbWithLokiKey, docId as any);\n const writeDoc: any = Object.assign(\n {},\n writeRow.document,\n {\n $loki: documentInDbWithLokiKey.$loki\n }\n );\n localState.collection.update(writeDoc);\n ret.success.push(writeRow.document);\n });\n localState.databaseState.saveQueue.addWrite();\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[this.primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n return ret;\n }\n async findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'findDocumentsById', [ids, deleted]);\n }\n\n const ret: RxDocumentData[] = [];\n ids.forEach(id => {\n const documentInDb = localState.collection.by(this.primaryPath, id);\n if (\n documentInDb &&\n (!documentInDb._deleted || deleted)\n ) {\n ret.push(stripLokiKey(documentInDb));\n }\n });\n return ret;\n }\n async query(preparedQueryOriginal: PreparedQuery): Promise> {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'query', [preparedQueryOriginal]);\n }\n\n let preparedQuery = ensureNotFalsy(preparedQueryOriginal.query);\n if (preparedQuery.selector) {\n preparedQuery = flatClone(preparedQuery);\n preparedQuery.selector = transformRegexToRegExp(preparedQuery.selector);\n }\n\n const query = preparedQueryOriginal.query;\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n /**\n * LokiJS is not able to give correct results for some\n * operators, so we have to check all documents in that case\n * and laster apply skip and limit manually.\n * @link https://github.com/pubkey/rxdb/issues/5320\n */\n let mustRunMatcher = false;\n if (hasDeepProperty(preparedQuery.selector, '$in')) {\n mustRunMatcher = true;\n }\n\n\n let lokiQuery = localState.collection\n .chain()\n .find(mustRunMatcher ? {} : preparedQuery.selector);\n\n if (preparedQuery.sort) {\n lokiQuery = lokiQuery.sort(getLokiSortComparator(this.schema, preparedQuery));\n }\n\n\n let foundDocuments = lokiQuery.data().map((lokiDoc: any) => stripLokiKey(lokiDoc));\n\n\n /**\n * LokiJS returned wrong results on some queries\n * with complex indexes. Therefore we run the query-match\n * over all result docs to patch this bug.\n * TODO create an issue at the LokiJS repository.\n */\n const queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery as any\n );\n foundDocuments = foundDocuments.filter((d: any) => queryMatcher(d));\n\n // always apply offset and limit like this, because\n // sylvieQuery.offset() and sylvieQuery.limit() results were inconsistent\n foundDocuments = foundDocuments.slice(skip, skipPlusLimit);\n\n return {\n documents: foundDocuments\n };\n }\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n getAttachmentData(_documentId: string, _attachmentId: string, _digest: string): Promise {\n throw new Error('Attachments are not implemented in the lokijs RxStorage. Make a pull request.');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$.asObservable();\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'cleanup', [minimumDeletedTime]);\n }\n\n const deleteAmountPerRun = 10;\n const maxDeletionTime = now() - minimumDeletedTime;\n const query = localState.collection\n .chain()\n .find({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n }).limit(deleteAmountPerRun);\n const foundDocuments = query.data();\n if (foundDocuments.length > 0) {\n localState.collection.remove(foundDocuments);\n localState.databaseState.saveQueue.addWrite();\n }\n\n return foundDocuments.length !== deleteAmountPerRun;\n }\n\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.changes$.complete();\n OPEN_LOKIJS_STORAGE_INSTANCES.delete(this);\n if (this.internals.localState) {\n const localState = await this.internals.localState;\n const dbState = await getLokiDatabase(\n this.databaseName,\n this.databaseSettings\n );\n await dbState.saveQueue.run();\n await closeLokiCollections(\n this.databaseName,\n [\n localState.collection\n ]\n );\n }\n })();\n return this.closed;\n }\n async remove(): Promise {\n const localState = await mustUseLocalState(this);\n if (!localState) {\n return requestRemoteInstance(this, 'remove', []);\n }\n localState.databaseState.database.removeCollection(localState.collection.name);\n await localState.databaseState.saveQueue.run();\n return this.close();\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n\n}\n\nexport async function createLokiLocalState(\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise {\n if (!params.options) {\n params.options = {};\n }\n\n const databaseState = await getLokiDatabase(\n params.databaseName,\n databaseSettings\n );\n\n /**\n * Construct loki indexes from RxJsonSchema indexes.\n * TODO what about compound indexes? Are they possible in lokijs?\n */\n const indices: string[] = [];\n if (params.schema.indexes) {\n params.schema.indexes.forEach(idx => {\n if (!isMaybeReadonlyArray(idx)) {\n indices.push(idx);\n }\n });\n }\n /**\n * LokiJS has no concept of custom primary key, they use a number-id that is generated.\n * To be able to query fast by primary key, we always add an index to the primary.\n */\n const primaryKey = getPrimaryFieldOfPrimaryKey(params.schema.primaryKey);\n indices.push(primaryKey as string);\n\n const lokiCollectionName = params.collectionName + '-' + params.schema.version;\n const collectionOptions: Partial = Object.assign(\n {},\n lokiCollectionName,\n {\n indices: indices as string[],\n unique: [primaryKey]\n } as any,\n LOKIJS_COLLECTION_DEFAULT_OPTIONS\n );\n\n const collection: any = databaseState.database.addCollection(\n lokiCollectionName,\n collectionOptions as any\n );\n databaseState.collections[params.collectionName] = collection;\n const ret: LokiLocalDatabaseState = {\n databaseState,\n collection\n };\n\n return ret;\n}\n\n\nexport async function createLokiStorageInstance(\n storage: RxStorageLoki,\n params: RxStorageInstanceCreationParams,\n databaseSettings: LokiDatabaseSettings\n): Promise> {\n const internals: LokiStorageInternals = {};\n\n const broadcastChannelRefObject: DeepReadonly = {};\n\n\n if (params.multiInstance) {\n const leaderElector = getLokiLeaderElector(\n params.databaseInstanceToken,\n broadcastChannelRefObject,\n params.databaseName\n );\n internals.leaderElector = leaderElector;\n } else {\n // optimisation shortcut, directly create db is non multi instance.\n internals.localState = createLokiLocalState(params, databaseSettings);\n await internals.localState;\n }\n\n const instance = new RxStorageInstanceLoki(\n params.databaseInstanceToken,\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n databaseSettings\n );\n\n await addRxStorageMultiInstanceSupport(\n RX_STORAGE_NAME_LOKIJS,\n params,\n instance,\n internals.leaderElector ? internals.leaderElector.broadcastChannel : undefined\n );\n\n if (params.multiInstance) {\n /**\n * Clean up the broadcast-channel reference on close()\n */\n const closeBefore = instance.close.bind(instance);\n instance.close = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return closeBefore();\n };\n const removeBefore = instance.remove.bind(instance);\n instance.remove = function () {\n removeBroadcastChannelReference(\n params.databaseInstanceToken,\n broadcastChannelRefObject\n );\n return removeBefore();\n };\n\n /**\n * Directly create the localState when/if the db becomes leader.\n */\n ensureNotFalsy(internals.leaderElector)\n .awaitLeadership()\n .then(() => {\n if (!instance.closed) {\n mustUseLocalState(instance);\n }\n });\n }\n\n\n return instance;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-lokijs/rx-storage-lokijs.js.map b/dist/esm/plugins/storage-lokijs/rx-storage-lokijs.js.map index 535913f0be5..917eec19787 100644 --- a/dist/esm/plugins/storage-lokijs/rx-storage-lokijs.js.map +++ b/dist/esm/plugins/storage-lokijs/rx-storage-lokijs.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-lokijs.js","names":["createLokiStorageInstance","RX_STORAGE_NAME_LOKIJS","ensureRxStorageInstanceParamsAreCorrect","RXDB_VERSION","RxStorageLoki","databaseSettings","name","rxdbVersion","leaderElectorByLokiDbName","Map","_proto","prototype","createStorageInstance","params","getRxStorageLoki","storage"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-lokijs.ts"],"sourcesContent":["import type {\n LokiDatabaseSettings,\n LokiSettings,\n LokiStorageInternals,\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n createLokiStorageInstance,\n RxStorageInstanceLoki\n} from './rx-storage-instance-loki.ts';\nimport { RX_STORAGE_NAME_LOKIJS } from './lokijs-helper.ts';\nimport type { LeaderElector } from 'broadcast-channel';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageLoki implements RxStorage {\n public name = RX_STORAGE_NAME_LOKIJS;\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Create one leader elector by db name.\n * This is done inside of the storage, not globally\n * to make it easier to test multi-tab behavior.\n */\n public leaderElectorByLokiDbName: Map = new Map();\n\n constructor(\n public databaseSettings: LokiDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createLokiStorageInstance(this, params, this.databaseSettings);\n }\n}\n\n/**\n * @deprecated The lokijs RxStorage is deprecated, more info at:\n * @link https://rxdb.info/rx-storage-lokijs.html\n */\nexport function getRxStorageLoki(\n databaseSettings: LokiDatabaseSettings = {}\n): RxStorageLoki {\n const storage = new RxStorageLoki(databaseSettings);\n return storage;\n}\n"],"mappings":"AAOA,SACIA,yBAAyB,QAEtB,+BAA+B;AACtC,SAASC,sBAAsB,QAAQ,oBAAoB;AAG3D,SAASC,uCAAuC,QAAQ,4BAA4B;AACpF,SAASC,YAAY,QAAQ,gCAAgC;AAE7D,WAAaC,aAAa;EAItB;AACJ;AACA;AACA;AACA;;EAUI,SAAAA,cACWC,gBAAsC,EAC/C;IAAA,KAnBKC,IAAI,GAAGL,sBAAsB;IAAA,KACpBM,WAAW,GAAGJ,YAAY;IAAA,KAOnCK,yBAAyB,GAO3B,IAAIC,GAAG,CAAC,CAAC;IAAA,KAGHJ,gBAAsC,GAAtCA,gBAAsC;EAC7C;EAAC,IAAAK,MAAA,GAAAN,aAAA,CAAAO,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAgE,EACvB;IACzCX,uCAAuC,CAACW,MAAM,CAAC;IAC/C,OAAOb,yBAAyB,CAAC,IAAI,EAAEa,MAAM,EAAE,IAAI,CAACR,gBAAgB,CAAC;EACzE,CAAC;EAAA,OAAAD,aAAA;AAAA;;AAGL;AACA;AACA;AACA;AACA,OAAO,SAASU,gBAAgBA,CAC5BT,gBAAsC,GAAG,CAAC,CAAC,EAC9B;EACb,IAAMU,OAAO,GAAG,IAAIX,aAAa,CAACC,gBAAgB,CAAC;EACnD,OAAOU,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-lokijs.js","names":["createLokiStorageInstance","RX_STORAGE_NAME_LOKIJS","ensureRxStorageInstanceParamsAreCorrect","RXDB_VERSION","RxStorageLoki","databaseSettings","name","rxdbVersion","leaderElectorByLokiDbName","Map","_proto","prototype","createStorageInstance","params","getRxStorageLoki","storage"],"sources":["../../../../src/plugins/storage-lokijs/rx-storage-lokijs.ts"],"sourcesContent":["import type {\n LokiDatabaseSettings,\n LokiSettings,\n LokiStorageInternals,\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\nimport {\n createLokiStorageInstance,\n RxStorageInstanceLoki\n} from './rx-storage-instance-loki.ts';\nimport { RX_STORAGE_NAME_LOKIJS } from './lokijs-helper.ts';\nimport type { LeaderElector } from 'broadcast-channel';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageLoki implements RxStorage {\n public name = RX_STORAGE_NAME_LOKIJS;\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Create one leader elector by db name.\n * This is done inside of the storage, not globally\n * to make it easier to test multi-tab behavior.\n */\n public leaderElectorByLokiDbName: Map = new Map();\n\n constructor(\n public databaseSettings: LokiDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createLokiStorageInstance(this, params, this.databaseSettings);\n }\n}\n\n/**\n * @deprecated The lokijs RxStorage is deprecated, more info at:\n * @link https://rxdb.info/rx-storage-lokijs.html\n */\nexport function getRxStorageLoki(\n databaseSettings: LokiDatabaseSettings = {}\n): RxStorageLoki {\n const storage = new RxStorageLoki(databaseSettings);\n return storage;\n}\n"],"mappings":"AAOA,SACIA,yBAAyB,QAEtB,+BAA+B;AACtC,SAASC,sBAAsB,QAAQ,oBAAoB;AAG3D,SAASC,uCAAuC,QAAQ,4BAA4B;AACpF,SAASC,YAAY,QAAQ,gCAAgC;AAE7D,WAAaC,aAAa;EAItB;AACJ;AACA;AACA;AACA;;EAUI,SAAAA,cACWC,gBAAsC,EAC/C;IAAA,KAnBKC,IAAI,GAAGL,sBAAsB;IAAA,KACpBM,WAAW,GAAGJ,YAAY;IAAA,KAOnCK,yBAAyB,GAO3B,IAAIC,GAAG,CAAC,CAAC;IAAA,KAGHJ,gBAAsC,GAAtCA,gBAAsC;EAC7C;EAAC,IAAAK,MAAA,GAAAN,aAAA,CAAAO,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAgE,EACvB;IACzCX,uCAAuC,CAACW,MAAM,CAAC;IAC/C,OAAOb,yBAAyB,CAAC,IAAI,EAAEa,MAAM,EAAE,IAAI,CAACR,gBAAgB,CAAC;EACzE,CAAC;EAAA,OAAAD,aAAA;AAAA;;AAGL;AACA;AACA;AACA;AACA,OAAO,SAASU,gBAAgBA,CAC5BT,gBAAsC,GAAG,CAAC,CAAC,EAC9B;EACb,IAAMU,OAAO,GAAG,IAAIX,aAAa,CAACC,gBAAgB,CAAC;EACnD,OAAOU,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js b/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js index e1dfedfe50d..0a41631e13e 100644 --- a/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js +++ b/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js @@ -1,4 +1,3 @@ -import _readOnlyError from "@babel/runtime/helpers/readOnlyError"; import { Subject } from 'rxjs'; import { getStartIndexStringFromLowerBound, getStartIndexStringFromUpperBound } from "../../custom-index.js"; import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js"; diff --git a/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map b/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map index 78f92435ec5..7d7fd3bf7d0 100644 --- a/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map +++ b/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-memory.js","names":["Subject","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","deepEqual","ensureNotFalsy","now","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","randomCouchString","requestIdlePromiseNoQueue","boundGE","boundGT","boundLE","boundLT","attachmentMapKey","compareDocsWithIndex","ensureNotRemoved","getMemoryCollectionKey","putWriteRowToState","removeDocFromState","addIndexesToInternalsState","getMemoryIndexName","getQueryMatcher","getSortComparator","OPEN_MEMORY_INSTANCES","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","documentsById","documents","categorized","error","errors","success","Array","bulkInsertDocs","length","awaitMe","Promise","resolve","i","writeRow","doc","document","bulkUpdateDocs","push","set","ensurePersistenceTask","ensurePersistenceIdlePromise","then","undefined","eventBulk","events","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","changes$","next","stateByIndex","Object","values","byIndex","docId","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","_deleted","query","preparedQuery","queryPlan","skip","limit","Infinity","skipPlusLimit","queryMatcher","selectorSatisfiedByIndex","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","upperBound","endKeys","upperBoundString","indexName","Error","docsWithIndex","indexOfLower","inclusiveStart","indexOfUpper","inclusiveEnd","rows","done","currentRow","currentDoc","sortComparator","sort","slice","count","result","mode","cleanup","minimumDeletedTime","maxDeletionTime","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","version","close","refCount","conflictResultionTasks","conflictResultionTasks$","resolveConflictResultionTask","_taskSolution","createMemoryStorageInstance","params","collectionKey","Map","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\n Observable,\n Subject\n} from 'rxjs';\nimport {\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n QueryMatcher,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n deepEqual,\n ensureNotFalsy,\n now,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID,\n randomCouchString,\n requestIdlePromiseNoQueue\n} from '../../plugins/utils/index.ts';\nimport {\n boundGE,\n boundGT,\n boundLE,\n boundLT\n} from './binary-search-bounds.ts';\nimport {\n attachmentMapKey,\n compareDocsWithIndex,\n ensureNotRemoved,\n getMemoryCollectionKey,\n putWriteRowToState,\n removeDocFromState\n} from './memory-helper.ts';\nimport {\n addIndexesToInternalsState,\n getMemoryIndexName\n} from './memory-indexes.ts';\nimport type {\n MemoryStorageInternals,\n RxStorageMemory,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageMemorySettings\n} from './memory-types.ts';\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\n\n/**\n * Used in tests to ensure everything\n * is closed correctly\n */\nexport const OPEN_MEMORY_INSTANCES = new Set>();\n\nexport class RxStorageInstanceMemory implements RxStorageInstance<\n RxDocType,\n MemoryStorageInternals,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public closed = false;\n\n /**\n * Used by some plugins and storage wrappers\n * to find out details about the internals of a write operation.\n * For example if you want to know which documents really have been replaced\n * or newly inserted.\n */\n public categorizedByWriteInput = new WeakMap[], CategorizeBulkWriteRowsOutput>();\n\n constructor(\n public readonly storage: RxStorageMemory,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MemoryStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMemorySettings,\n public readonly devMode: boolean\n ) {\n OPEN_MEMORY_INSTANCES.add(this);\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentsById,\n documentWrites,\n context\n );\n const error = categorized.errors;\n let success: RxDocumentData[] = new Array(categorized.bulkInsertDocs.length);\n /**\n * @performance\n * We have to return a Promise but we do not want to wait\n * one tick, so we directly create the promise\n * which makes it likely to be already resolved later.\n */\n const awaitMe = Promise.resolve({ success, error });\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n success[i] = doc;\n }\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n success.push(doc);\n }\n\n this.categorizedByWriteInput.set(documentWrites, categorized);\n this.internals.ensurePersistenceTask = categorized;\n\n if (!this.internals.ensurePersistenceIdlePromise) {\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\n this.internals.ensurePersistenceIdlePromise = undefined;\n this.ensurePersistence();\n });\n }\n\n /**\n * Important: The events must be emitted AFTER the persistence\n * task has been added.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n internals.changes$.next(categorized.eventBulk);\n }\n return awaitMe;\n }\n\n /**\n * Instead of directly inserting the documents into all indexes,\n * we do it lazy in the background. This gives the application time\n * to directly work with the write-result and to do stuff like rendering DOM\n * notes and processing RxDB queries.\n * Then in some later time, or just before the next read/write,\n * it is ensured that the indexes have been written.\n */\n public ensurePersistence() {\n if (\n !this.internals.ensurePersistenceTask\n ) {\n return;\n }\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n const categorized = this.internals.ensurePersistenceTask;\n this.internals.ensurePersistenceTask = undefined;\n\n /**\n * Do inserts/updates\n */\n const stateByIndex = Object.values(this.internals.byIndex);\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n undefined\n );\n }\n\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n documentsById.get(docId as any)\n );\n }\n\n /**\n * Handle attachments\n */\n if (this.schema.attachments) {\n const attachmentsMap = internals.attachments;\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n if (this.schema.attachments) {\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentsMap.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n }\n }\n }\n\n findDocumentsById(\n docIds: string[],\n withDeleted: boolean\n ): Promise[]> {\n this.ensurePersistence();\n const documentsById = this.internals.documents;\n const ret: RxDocumentData[] = [];\n if (documentsById.size === 0) {\n return Promise.resolve(ret);\n }\n for (let i = 0; i < docIds.length; ++i) {\n const docId = docIds[i];\n const docInDb = documentsById.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n }\n return Promise.resolve(ret);\n }\n\n query(\n preparedQuery: PreparedQuery\n ): Promise> {\n this.ensurePersistence();\n\n const queryPlan = preparedQuery.queryPlan;\n const query = preparedQuery.query;\n\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n let queryMatcher: QueryMatcher> | false = false;\n if (!queryPlan.selectorSatisfiedByIndex) {\n queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery.query\n );\n }\n\n const queryPlanFields: string[] = queryPlan.index;\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\n const index: string[] | undefined = queryPlanFields;\n const lowerBound: any[] = queryPlan.startKeys;\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n lowerBound\n );\n\n let upperBound: any[] = queryPlan.endKeys;\n upperBound = upperBound;\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n upperBound\n );\n const indexName = getMemoryIndexName(index);\n\n if (!this.internals.byIndex[indexName]) {\n throw new Error('index does not exist ' + indexName);\n }\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n\n\n let indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\n docsWithIndex,\n [\n upperBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let rows: RxDocumentData[] = [];\n let done = false;\n while (!done) {\n const currentRow = docsWithIndex[indexOfLower];\n if (\n !currentRow ||\n indexOfLower > indexOfUpper\n ) {\n break;\n }\n const currentDoc = currentRow[1];\n\n if (!queryMatcher || queryMatcher(currentDoc)) {\n rows.push(currentDoc);\n }\n\n if (\n (rows.length >= skipPlusLimit && !mustManuallyResort)\n ) {\n done = true;\n }\n\n indexOfLower++;\n }\n\n if (mustManuallyResort) {\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\n rows = rows.sort(sortComparator);\n }\n\n // apply skip and limit boundaries.\n rows = rows.slice(skip, skipPlusLimit);\n return Promise.resolve({\n documents: rows\n });\n }\n\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n this.ensurePersistence();\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n cleanup(minimumDeletedTime: number): Promise {\n this.ensurePersistence();\n const maxDeletionTime = now() - minimumDeletedTime;\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\n const indexName = getMemoryIndexName(index);\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n 0,\n ''\n ]\n );\n\n let indexOfLower = boundGT(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let done = false;\n while (!done) {\n const currentDoc = docsWithIndex[indexOfLower];\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\n done = true;\n } else {\n removeDocFromState(\n this.primaryPath as any,\n this.schema,\n this.internals,\n currentDoc[1]\n );\n indexOfLower++;\n }\n }\n return PROMISE_RESOLVE_TRUE;\n }\n\n getAttachmentData(\n documentId: string,\n attachmentId: string,\n digest: string\n ): Promise {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const key = attachmentMapKey(documentId, attachmentId);\n const data = this.internals.attachments.get(key);\n\n if (\n !digest ||\n !data ||\n data.digest !== digest\n ) {\n throw new Error('attachment does not exist: ' + key);\n }\n return Promise.resolve(data.writeData.data);\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotRemoved(this);\n return this.internals.changes$.asObservable();\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('closed');\n }\n this.ensurePersistence();\n ensureNotRemoved(this);\n\n this.internals.removed = true;\n this.storage.collectionStates.delete(\n getMemoryCollectionKey(\n this.databaseName,\n this.collectionName,\n this.schema.version\n )\n );\n await this.close();\n }\n\n close(): Promise {\n OPEN_MEMORY_INSTANCES.delete(this);\n\n this.ensurePersistence();\n if (this.closed) {\n return PROMISE_RESOLVE_VOID;\n }\n this.closed = true;\n\n this.internals.refCount = this.internals.refCount - 1;\n return PROMISE_RESOLVE_VOID;\n }\n\n conflictResultionTasks(): Observable> {\n return this.internals.conflictResultionTasks$.asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\nexport function createMemoryStorageInstance(\n storage: RxStorageMemory,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMemorySettings\n): Promise> {\n const collectionKey = getMemoryCollectionKey(\n params.databaseName,\n params.collectionName,\n params.schema.version\n );\n\n let internals = storage.collectionStates.get(collectionKey);\n if (!internals) {\n internals = {\n id: randomCouchString(5),\n schema: params.schema,\n removed: false,\n refCount: 1,\n documents: new Map(),\n attachments: params.schema.attachments ? new Map() : undefined as any,\n byIndex: {},\n conflictResultionTasks$: new Subject(),\n changes$: new Subject()\n };\n addIndexesToInternalsState(internals, params.schema);\n storage.collectionStates.set(collectionKey, internals);\n } else {\n /**\n * Ensure that the storage was not already\n * created with a different schema.\n * This is very important because if this check\n * does not exist here, we have hard-to-debug problems\n * downstream.\n */\n if (\n params.devMode &&\n !deepEqual(internals.schema, params.schema)\n ) {\n throw new Error('storage was already created with a different schema');\n }\n internals.refCount = internals.refCount + 1;\n }\n\n const instance = new RxStorageInstanceMemory(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-memory.js","names":["Subject","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","deepEqual","ensureNotFalsy","now","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","randomCouchString","requestIdlePromiseNoQueue","boundGE","boundGT","boundLE","boundLT","attachmentMapKey","compareDocsWithIndex","ensureNotRemoved","getMemoryCollectionKey","putWriteRowToState","removeDocFromState","addIndexesToInternalsState","getMemoryIndexName","getQueryMatcher","getSortComparator","OPEN_MEMORY_INSTANCES","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","documentsById","documents","categorized","error","errors","success","Array","bulkInsertDocs","length","awaitMe","Promise","resolve","i","writeRow","doc","document","bulkUpdateDocs","push","set","ensurePersistenceTask","ensurePersistenceIdlePromise","then","undefined","eventBulk","events","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","changes$","next","stateByIndex","Object","values","byIndex","docId","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","_deleted","query","preparedQuery","queryPlan","skip","limit","Infinity","skipPlusLimit","queryMatcher","selectorSatisfiedByIndex","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","upperBound","endKeys","upperBoundString","indexName","Error","docsWithIndex","indexOfLower","inclusiveStart","indexOfUpper","inclusiveEnd","rows","done","currentRow","currentDoc","sortComparator","sort","slice","count","result","mode","cleanup","minimumDeletedTime","maxDeletionTime","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","version","close","refCount","conflictResultionTasks","conflictResultionTasks$","resolveConflictResultionTask","_taskSolution","createMemoryStorageInstance","params","collectionKey","Map","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\n Observable,\n Subject\n} from 'rxjs';\nimport {\n getStartIndexStringFromLowerBound,\n getStartIndexStringFromUpperBound\n} from '../../custom-index.ts';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport {\n categorizeBulkWriteRows\n} from '../../rx-storage-helper.ts';\nimport type {\n BulkWriteRow,\n CategorizeBulkWriteRowsOutput,\n EventBulk,\n PreparedQuery,\n QueryMatcher,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n deepEqual,\n ensureNotFalsy,\n now,\n PROMISE_RESOLVE_TRUE,\n PROMISE_RESOLVE_VOID,\n randomCouchString,\n requestIdlePromiseNoQueue\n} from '../../plugins/utils/index.ts';\nimport {\n boundGE,\n boundGT,\n boundLE,\n boundLT\n} from './binary-search-bounds.ts';\nimport {\n attachmentMapKey,\n compareDocsWithIndex,\n ensureNotRemoved,\n getMemoryCollectionKey,\n putWriteRowToState,\n removeDocFromState\n} from './memory-helper.ts';\nimport {\n addIndexesToInternalsState,\n getMemoryIndexName\n} from './memory-indexes.ts';\nimport type {\n MemoryStorageInternals,\n RxStorageMemory,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageMemorySettings\n} from './memory-types.ts';\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\n\n/**\n * Used in tests to ensure everything\n * is closed correctly\n */\nexport const OPEN_MEMORY_INSTANCES = new Set>();\n\nexport class RxStorageInstanceMemory implements RxStorageInstance<\n RxDocType,\n MemoryStorageInternals,\n RxStorageMemoryInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public closed = false;\n\n /**\n * Used by some plugins and storage wrappers\n * to find out details about the internals of a write operation.\n * For example if you want to know which documents really have been replaced\n * or newly inserted.\n */\n public categorizedByWriteInput = new WeakMap[], CategorizeBulkWriteRowsOutput>();\n\n constructor(\n public readonly storage: RxStorageMemory,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MemoryStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMemorySettings,\n public readonly devMode: boolean\n ) {\n OPEN_MEMORY_INSTANCES.add(this);\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n }\n\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentsById,\n documentWrites,\n context\n );\n const error = categorized.errors;\n let success: RxDocumentData[] = new Array(categorized.bulkInsertDocs.length);\n /**\n * @performance\n * We have to return a Promise but we do not want to wait\n * one tick, so we directly create the promise\n * which makes it likely to be already resolved later.\n */\n const awaitMe = Promise.resolve({ success, error });\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n success[i] = doc;\n }\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n success.push(doc);\n }\n\n this.categorizedByWriteInput.set(documentWrites, categorized);\n this.internals.ensurePersistenceTask = categorized;\n\n if (!this.internals.ensurePersistenceIdlePromise) {\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\n this.internals.ensurePersistenceIdlePromise = undefined;\n this.ensurePersistence();\n });\n }\n\n /**\n * Important: The events must be emitted AFTER the persistence\n * task has been added.\n */\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n internals.changes$.next(categorized.eventBulk);\n }\n return awaitMe;\n }\n\n /**\n * Instead of directly inserting the documents into all indexes,\n * we do it lazy in the background. This gives the application time\n * to directly work with the write-result and to do stuff like rendering DOM\n * notes and processing RxDB queries.\n * Then in some later time, or just before the next read/write,\n * it is ensured that the indexes have been written.\n */\n public ensurePersistence() {\n if (\n !this.internals.ensurePersistenceTask\n ) {\n return;\n }\n const internals = this.internals;\n const documentsById = this.internals.documents;\n const primaryPath = this.primaryPath;\n\n const categorized = this.internals.ensurePersistenceTask;\n this.internals.ensurePersistenceTask = undefined;\n\n /**\n * Do inserts/updates\n */\n const stateByIndex = Object.values(this.internals.byIndex);\n\n const bulkInsertDocs = categorized.bulkInsertDocs;\n for (let i = 0; i < bulkInsertDocs.length; ++i) {\n const writeRow = bulkInsertDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n undefined\n );\n }\n\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\n const writeRow = bulkUpdateDocs[i];\n const doc = writeRow.document;\n const docId = doc[primaryPath];\n putWriteRowToState(\n docId as any,\n internals,\n stateByIndex,\n doc,\n documentsById.get(docId as any)\n );\n }\n\n /**\n * Handle attachments\n */\n if (this.schema.attachments) {\n const attachmentsMap = internals.attachments;\n categorized.attachmentsAdd.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n if (this.schema.attachments) {\n categorized.attachmentsUpdate.forEach(attachment => {\n attachmentsMap.set(\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\n {\n writeData: attachment.attachmentData,\n digest: attachment.digest\n }\n );\n });\n categorized.attachmentsRemove.forEach(attachment => {\n attachmentsMap.delete(\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\n );\n });\n }\n }\n }\n\n findDocumentsById(\n docIds: string[],\n withDeleted: boolean\n ): Promise[]> {\n this.ensurePersistence();\n const documentsById = this.internals.documents;\n const ret: RxDocumentData[] = [];\n if (documentsById.size === 0) {\n return Promise.resolve(ret);\n }\n for (let i = 0; i < docIds.length; ++i) {\n const docId = docIds[i];\n const docInDb = documentsById.get(docId);\n if (\n docInDb &&\n (\n !docInDb._deleted ||\n withDeleted\n )\n ) {\n ret.push(docInDb);\n }\n }\n return Promise.resolve(ret);\n }\n\n query(\n preparedQuery: PreparedQuery\n ): Promise> {\n this.ensurePersistence();\n\n const queryPlan = preparedQuery.queryPlan;\n const query = preparedQuery.query;\n\n const skip = query.skip ? query.skip : 0;\n const limit = query.limit ? query.limit : Infinity;\n const skipPlusLimit = skip + limit;\n\n let queryMatcher: QueryMatcher> | false = false;\n if (!queryPlan.selectorSatisfiedByIndex) {\n queryMatcher = getQueryMatcher(\n this.schema,\n preparedQuery.query\n );\n }\n\n const queryPlanFields: string[] = queryPlan.index;\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\n const index: string[] | undefined = queryPlanFields;\n const lowerBound: any[] = queryPlan.startKeys;\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n lowerBound\n );\n\n let upperBound: any[] = queryPlan.endKeys;\n upperBound = upperBound;\n const upperBoundString = getStartIndexStringFromUpperBound(\n this.schema,\n index,\n upperBound\n );\n const indexName = getMemoryIndexName(index);\n\n if (!this.internals.byIndex[indexName]) {\n throw new Error('index does not exist ' + indexName);\n }\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n\n\n let indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\n docsWithIndex,\n [\n upperBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let rows: RxDocumentData[] = [];\n let done = false;\n while (!done) {\n const currentRow = docsWithIndex[indexOfLower];\n if (\n !currentRow ||\n indexOfLower > indexOfUpper\n ) {\n break;\n }\n const currentDoc = currentRow[1];\n\n if (!queryMatcher || queryMatcher(currentDoc)) {\n rows.push(currentDoc);\n }\n\n if (\n (rows.length >= skipPlusLimit && !mustManuallyResort)\n ) {\n done = true;\n }\n\n indexOfLower++;\n }\n\n if (mustManuallyResort) {\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\n rows = rows.sort(sortComparator);\n }\n\n // apply skip and limit boundaries.\n rows = rows.slice(skip, skipPlusLimit);\n return Promise.resolve({\n documents: rows\n });\n }\n\n async count(\n preparedQuery: PreparedQuery\n ): Promise {\n this.ensurePersistence();\n const result = await this.query(preparedQuery);\n return {\n count: result.documents.length,\n mode: 'fast'\n };\n }\n\n cleanup(minimumDeletedTime: number): Promise {\n this.ensurePersistence();\n const maxDeletionTime = now() - minimumDeletedTime;\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\n const indexName = getMemoryIndexName(index);\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\n\n const lowerBoundString = getStartIndexStringFromLowerBound(\n this.schema,\n index,\n [\n true,\n 0,\n ''\n ]\n );\n\n let indexOfLower = boundGT(\n docsWithIndex,\n [\n lowerBoundString\n ] as any,\n compareDocsWithIndex\n );\n\n let done = false;\n while (!done) {\n const currentDoc = docsWithIndex[indexOfLower];\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\n done = true;\n } else {\n removeDocFromState(\n this.primaryPath as any,\n this.schema,\n this.internals,\n currentDoc[1]\n );\n indexOfLower++;\n }\n }\n return PROMISE_RESOLVE_TRUE;\n }\n\n getAttachmentData(\n documentId: string,\n attachmentId: string,\n digest: string\n ): Promise {\n this.ensurePersistence();\n ensureNotRemoved(this);\n const key = attachmentMapKey(documentId, attachmentId);\n const data = this.internals.attachments.get(key);\n\n if (\n !digest ||\n !data ||\n data.digest !== digest\n ) {\n throw new Error('attachment does not exist: ' + key);\n }\n return Promise.resolve(data.writeData.data);\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n ensureNotRemoved(this);\n return this.internals.changes$.asObservable();\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('closed');\n }\n this.ensurePersistence();\n ensureNotRemoved(this);\n\n this.internals.removed = true;\n this.storage.collectionStates.delete(\n getMemoryCollectionKey(\n this.databaseName,\n this.collectionName,\n this.schema.version\n )\n );\n await this.close();\n }\n\n close(): Promise {\n OPEN_MEMORY_INSTANCES.delete(this);\n\n this.ensurePersistence();\n if (this.closed) {\n return PROMISE_RESOLVE_VOID;\n }\n this.closed = true;\n\n this.internals.refCount = this.internals.refCount - 1;\n return PROMISE_RESOLVE_VOID;\n }\n\n conflictResultionTasks(): Observable> {\n return this.internals.conflictResultionTasks$.asObservable();\n }\n resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise {\n return PROMISE_RESOLVE_VOID;\n }\n}\n\nexport function createMemoryStorageInstance(\n storage: RxStorageMemory,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMemorySettings\n): Promise> {\n const collectionKey = getMemoryCollectionKey(\n params.databaseName,\n params.collectionName,\n params.schema.version\n );\n\n let internals = storage.collectionStates.get(collectionKey);\n if (!internals) {\n internals = {\n id: randomCouchString(5),\n schema: params.schema,\n removed: false,\n refCount: 1,\n documents: new Map(),\n attachments: params.schema.attachments ? new Map() : undefined as any,\n byIndex: {},\n conflictResultionTasks$: new Subject(),\n changes$: new Subject()\n };\n addIndexesToInternalsState(internals, params.schema);\n storage.collectionStates.set(collectionKey, internals);\n } else {\n /**\n * Ensure that the storage was not already\n * created with a different schema.\n * This is very important because if this check\n * does not exist here, we have hard-to-debug problems\n * downstream.\n */\n if (\n params.devMode &&\n !deepEqual(internals.schema, params.schema)\n ) {\n throw new Error('storage was already created with a different schema');\n }\n internals.refCount = internals.refCount + 1;\n }\n\n const instance = new RxStorageInstanceMemory(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n internals,\n params.options,\n settings,\n params.devMode\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js b/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js index e93dfaeed1c..f10245933f9 100644 --- a/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js +++ b/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js @@ -1,4 +1,3 @@ -import _readOnlyError from "@babel/runtime/helpers/readOnlyError"; import { BehaviorSubject, Subject, filter, firstValueFrom } from 'rxjs'; import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js"; import { ensureNotFalsy, getFromMapOrThrow, isMaybeReadonlyArray, now, PROMISE_RESOLVE_VOID, requestIdlePromise } from "../../plugins/utils/index.js"; diff --git a/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map b/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map index 24812d96178..0a7159089dc 100644 --- a/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +++ b/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-instance-mongodb.js","names":["BehaviorSubject","Subject","filter","firstValueFrom","getPrimaryFieldOfPrimaryKey","ensureNotFalsy","getFromMapOrThrow","isMaybeReadonlyArray","now","PROMISE_RESOLVE_VOID","requestIdlePromise","MongoClient","categorizeBulkWriteRows","MONGO_ID_SUBSTITUTE_FIELDNAME","getMongoDBIndexName","prepareMongoDBQuery","swapMongoToRxDoc","swapRxDocToMongo","RxStorageInstanceMongoDB","storage","databaseName","collectionName","schema","internals","options","settings","changes$","runningOperations","writeQueue","mongoObjectIdCache","WeakMap","attachments","Error","primaryPath","primaryKey","inMongoPrimaryPath","mongoClient","databaseSettings","connection","mongoDatabase","db","version","indexes","slice","map","index","arIndex","push","mongoCollectionPromise","createCollection","then","mongoCollection","createIndexes","mongoIndex","forEach","field","name","key","_proto","prototype","bulkWrite","documentWrites","context","next","getValue","closed","Promise","reject","ret","success","error","docIds","d","document","documentStates","findDocumentsById","documentStatesMap","Map","doc","docId","set","categorized","changeByDocId","eventBulk","events","change","documentId","errors","all","bulkInsertDocs","writeRow","writeResult","findOneAndUpdate","$setOnInsert","upsert","includeResultMetadata","value","conflictError","status","documentInDb","isError","event","get","bulkUpdateDocs","findOneAndReplace","_rev","previous","returnDocument","ok","currentDocState","currentDoc","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","withDeleted","session","plainQuery","$in","_deleted","result","queryResult","find","toArray","row","query","originalPreparedQuery","preparedQuery","mongoSelector","skip","limit","sort","mongoSort","resultDocs","documents","count","countDocuments","mode","cleanup","minimumDeletedTime","maxDeletionTime","deleteMany","$lt","getAttachmentData","_documentId","_attachmentId","_digest","changeStream","remove","drop","close","pipe","c","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createMongoDBStorageInstance","params","instance","resolve"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts"],"sourcesContent":["import {\n BehaviorSubject,\n Observable,\n Subject,\n filter,\n firstValueFrom\n} from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n EventBulk,\n PreparedQuery,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n RxStorageWriteErrorConflict,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n isMaybeReadonlyArray,\n now,\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../../plugins/utils/index.ts';\nimport {\n MongoDBPreparedQuery,\n MongoDBStorageInternals,\n MongoQuerySelector,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageMongoDBSettings\n} from './mongodb-types.ts';\nimport { RxStorageMongoDB } from './rx-storage-mongodb.ts';\nimport {\n Db as MongoDatabase,\n Collection as MongoCollection,\n MongoClient,\n ObjectId,\n ClientSession\n} from 'mongodb';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n MONGO_ID_SUBSTITUTE_FIELDNAME,\n getMongoDBIndexName,\n prepareMongoDBQuery,\n swapMongoToRxDoc,\n swapRxDocToMongo\n} from './mongodb-helper.ts';\n\nexport class RxStorageInstanceMongoDB implements RxStorageInstance<\n RxDocType,\n MongoDBStorageInternals,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public readonly inMongoPrimaryPath: string;\n public closed?: Promise;\n private readonly changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly mongoClient: MongoClient;\n public readonly mongoDatabase: MongoDatabase;\n public readonly mongoCollectionPromise: Promise | any>>;\n // public mongoChangeStream?: MongoChangeStream>;\n\n\n /**\n * Closing the connection must not happen when\n * an operation is running, otherwise we get an error.\n * So we store all running operations here so that\n * they can be awaited.\n */\n public readonly runningOperations = new BehaviorSubject(0);\n public writeQueue: Promise = PROMISE_RESOLVE_VOID;\n\n /**\n * We use this to be able to still fetch\n * the objectId after transforming the document from mongo-style (with _id)\n * to RxDB\n */\n public readonly mongoObjectIdCache = new WeakMap, ObjectId>();\n\n constructor(\n public readonly storage: RxStorageMongoDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MongoDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMongoDBSettings\n ) {\n if (this.schema.attachments) {\n throw new Error('attachments not supported in mongodb storage, make a PR if you need that');\n }\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.inMongoPrimaryPath = this.primaryPath === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;\n this.mongoClient = new MongoClient(storage.databaseSettings.connection);\n this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);\n\n const indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {\n const arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];\n return arIndex;\n });\n indexes.push([this.inMongoPrimaryPath]);\n\n this.mongoCollectionPromise = this.mongoDatabase.createCollection(collectionName)\n .then(async (mongoCollection) => {\n await mongoCollection.createIndexes(\n indexes.map(index => {\n const mongoIndex: any = {};\n index.forEach(field => mongoIndex[field] = 1);\n return { name: getMongoDBIndexName(index), key: mongoIndex };\n })\n );\n\n /**\n * TODO in a setup where multiple servers run node.js\n * processes that use the mongodb storage, we should propagate\n * events by listening to the mongodb changestream.\n * This maybe should be a premium feature.\n */\n // this.mongoChangeStream = mongoCollection.watch(\n // undefined, {\n // batchSize: 100\n // }\n // ).on('change', change => {\n\n\n // const eventBulkId = randomCouchString(10);\n // const newDocData: RxDocumentData = (change as any).fullDocument;\n // const documentId = newDocData[this.primaryPath] as any;\n\n // const eventBulk: EventBulk>, RxStorageDefaultCheckpoint> = {\n // checkpoint: {\n // id: newDocData[this.primaryPath] as any,\n // lwt: newDocData._meta.lwt\n // },\n // context: 'mongodb-write',\n // id: eventBulkId,\n // events: [{\n // documentData: newDocData,\n // documentId,\n // operation: 'INSERT',\n // previousDocumentData: undefined,\n // }],\n // startTime: now(),\n // endTime: now()\n // };\n\n // this.changes$.next(eventBulk);\n // });\n\n\n return mongoCollection;\n });\n\n\n }\n\n /**\n * Bulk writes on the mongodb storage.\n * Notice that MongoDB does not support cross-document transactions\n * so we have to do a update-if-previous-is-correct like operations.\n * (Similar to what RxDB does with the revision system)\n */\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n this.writeQueue = this.writeQueue.then(async () => {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n\n const mongoCollection = await this.mongoCollectionPromise;\n if (this.closed) {\n return Promise.reject(new Error('already closed'));\n }\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n\n const docIds = documentWrites.map(d => (d.document as any)[primaryPath]);\n const documentStates = await this.findDocumentsById(\n docIds,\n true\n );\n const documentStatesMap = new Map();\n documentStates.forEach(doc => {\n const docId = doc[primaryPath];\n documentStatesMap.set(docId, doc);\n });\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentStatesMap,\n documentWrites,\n context\n );\n\n const changeByDocId = new Map>>();\n categorized.eventBulk.events.forEach(change => {\n changeByDocId.set(change.documentId, change);\n });\n\n\n ret.error = categorized.errors;\n\n /**\n * Reset the event bulk because\n * conflicts can still appear after the categorization\n */\n const eventBulk = categorized.eventBulk;\n eventBulk.events = [];\n\n await Promise.all([\n /**\n * Inserts\n * @link https://sparkbyexamples.com/mongodb/mongodb-insert-if-not-exists/\n */\n Promise.all(\n categorized.bulkInsertDocs.map(async (writeRow) => {\n const docId: string = writeRow.document[primaryPath] as any;\n const writeResult = await mongoCollection.findOneAndUpdate(\n {\n [this.inMongoPrimaryPath]: docId\n },\n {\n $setOnInsert: swapRxDocToMongo(writeRow.document)\n },\n {\n upsert: true,\n includeResultMetadata: true\n }\n );\n if (writeResult.value) {\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: swapMongoToRxDoc(ensureNotFalsy(writeResult.value)),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = changeByDocId.get(docId);\n if (event) {\n eventBulk.events.push(event);\n }\n ret.success.push(writeRow.document);\n }\n })\n ),\n /**\n * Updates\n */\n Promise.all(\n categorized.bulkUpdateDocs.map(async (writeRow) => {\n const docId = writeRow.document[primaryPath] as string;\n const writeResult = await mongoCollection.findOneAndReplace(\n {\n [this.inMongoPrimaryPath]: docId,\n _rev: ensureNotFalsy(writeRow.previous)._rev\n },\n swapRxDocToMongo(writeRow.document),\n {\n includeResultMetadata: true,\n upsert: false,\n returnDocument: 'before'\n }\n );\n if (!writeResult.ok) {\n const currentDocState = await this.findDocumentsById([docId], true);\n const currentDoc = currentDocState[0];\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: ensureNotFalsy(currentDoc),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = getFromMapOrThrow(changeByDocId, docId);\n eventBulk.events.push(event);\n ret.success.push(writeRow.document);\n }\n\n })\n )\n ]);\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return ret;\n });\n return this.writeQueue;\n\n }\n\n async findDocumentsById(\n docIds: string[],\n withDeleted: boolean,\n session?: ClientSession\n ): Promise[]> {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const primaryPath = this.primaryPath;\n\n const plainQuery: MongoQuerySelector = {\n [primaryPath]: {\n $in: docIds\n }\n };\n if (!withDeleted) {\n plainQuery._deleted = false;\n }\n const result: RxDocumentData[] = [];\n const queryResult = await mongoCollection.find(\n plainQuery,\n {\n session\n }\n ).toArray();\n queryResult.forEach(row => {\n result.push(\n swapMongoToRxDoc(\n row as any\n )\n );\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return result;\n }\n\n async query(\n originalPreparedQuery: PreparedQuery\n ): Promise> {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n\n let query = mongoCollection.find(preparedQuery.mongoSelector);\n if (preparedQuery.query.skip) {\n query = query.skip(preparedQuery.query.skip);\n }\n if (preparedQuery.query.limit) {\n query = query.limit(preparedQuery.query.limit);\n }\n if (preparedQuery.query.sort) {\n query = query.sort(preparedQuery.mongoSort);\n }\n const resultDocs = await query.toArray();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n documents: resultDocs.map(d => swapMongoToRxDoc(d))\n };\n }\n\n async count(\n originalPreparedQuery: PreparedQuery\n ): Promise {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n const count = await mongoCollection.countDocuments(preparedQuery.mongoSelector);\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n count,\n mode: 'fast'\n };\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const maxDeletionTime = now() - minimumDeletedTime;\n await mongoCollection.deleteMany({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return true;\n }\n\n async getAttachmentData(\n _documentId: string,\n _attachmentId: string,\n _digest: string\n ): Promise {\n await this.mongoCollectionPromise;\n throw new Error('attachments not implemented, make a PR');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$;\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n await mongoCollection.drop();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n await this.close();\n }\n\n async close(): Promise {\n // TODO without this next-tick we have random fails in the tests\n await requestIdlePromise(200);\n\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n await this.mongoCollectionPromise;\n await firstValueFrom(this.runningOperations.pipe(filter(c => c === 0)));\n // await ensureNotFalsy(this.mongoChangeStream).close();\n await this.mongoClient.close();\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n}\n\nexport function createMongoDBStorageInstance(\n storage: RxStorageMongoDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMongoDBSettings\n): Promise> {\n const instance = new RxStorageInstanceMongoDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n {},\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-instance-mongodb.js","names":["BehaviorSubject","Subject","filter","firstValueFrom","getPrimaryFieldOfPrimaryKey","ensureNotFalsy","getFromMapOrThrow","isMaybeReadonlyArray","now","PROMISE_RESOLVE_VOID","requestIdlePromise","MongoClient","categorizeBulkWriteRows","MONGO_ID_SUBSTITUTE_FIELDNAME","getMongoDBIndexName","prepareMongoDBQuery","swapMongoToRxDoc","swapRxDocToMongo","RxStorageInstanceMongoDB","storage","databaseName","collectionName","schema","internals","options","settings","changes$","runningOperations","writeQueue","mongoObjectIdCache","WeakMap","attachments","Error","primaryPath","primaryKey","inMongoPrimaryPath","mongoClient","databaseSettings","connection","mongoDatabase","db","version","indexes","slice","map","index","arIndex","push","mongoCollectionPromise","createCollection","then","mongoCollection","createIndexes","mongoIndex","forEach","field","name","key","_proto","prototype","bulkWrite","documentWrites","context","next","getValue","closed","Promise","reject","ret","success","error","docIds","d","document","documentStates","findDocumentsById","documentStatesMap","Map","doc","docId","set","categorized","changeByDocId","eventBulk","events","change","documentId","errors","all","bulkInsertDocs","writeRow","writeResult","findOneAndUpdate","$setOnInsert","upsert","includeResultMetadata","value","conflictError","status","documentInDb","isError","event","get","bulkUpdateDocs","findOneAndReplace","_rev","previous","returnDocument","ok","currentDocState","currentDoc","length","lastState","newestRow","checkpoint","id","lwt","_meta","endTime","withDeleted","session","plainQuery","$in","_deleted","result","queryResult","find","toArray","row","query","originalPreparedQuery","preparedQuery","mongoSelector","skip","limit","sort","mongoSort","resultDocs","documents","count","countDocuments","mode","cleanup","minimumDeletedTime","maxDeletionTime","deleteMany","$lt","getAttachmentData","_documentId","_attachmentId","_digest","changeStream","remove","drop","close","pipe","c","conflictResultionTasks","resolveConflictResultionTask","_taskSolution","createMongoDBStorageInstance","params","instance","resolve"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts"],"sourcesContent":["import {\n BehaviorSubject,\n Observable,\n Subject,\n filter,\n firstValueFrom\n} from 'rxjs';\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\nimport type {\n BulkWriteRow,\n EventBulk,\n PreparedQuery,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageDefaultCheckpoint,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult,\n RxStorageWriteErrorConflict,\n StringKeys\n} from '../../types/index.d.ts';\nimport {\n ensureNotFalsy,\n getFromMapOrThrow,\n isMaybeReadonlyArray,\n now,\n PROMISE_RESOLVE_VOID,\n requestIdlePromise\n} from '../../plugins/utils/index.ts';\nimport {\n MongoDBPreparedQuery,\n MongoDBStorageInternals,\n MongoQuerySelector,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageMongoDBSettings\n} from './mongodb-types.ts';\nimport { RxStorageMongoDB } from './rx-storage-mongodb.ts';\nimport {\n Db as MongoDatabase,\n Collection as MongoCollection,\n MongoClient,\n ObjectId,\n ClientSession\n} from 'mongodb';\nimport { categorizeBulkWriteRows } from '../../rx-storage-helper.ts';\nimport {\n MONGO_ID_SUBSTITUTE_FIELDNAME,\n getMongoDBIndexName,\n prepareMongoDBQuery,\n swapMongoToRxDoc,\n swapRxDocToMongo\n} from './mongodb-helper.ts';\n\nexport class RxStorageInstanceMongoDB implements RxStorageInstance<\n RxDocType,\n MongoDBStorageInternals,\n RxStorageMongoDBInstanceCreationOptions,\n RxStorageDefaultCheckpoint\n> {\n\n public readonly primaryPath: StringKeys>;\n public readonly inMongoPrimaryPath: string;\n public closed?: Promise;\n private readonly changes$: Subject>, RxStorageDefaultCheckpoint>> = new Subject();\n public readonly mongoClient: MongoClient;\n public readonly mongoDatabase: MongoDatabase;\n public readonly mongoCollectionPromise: Promise | any>>;\n // public mongoChangeStream?: MongoChangeStream>;\n\n\n /**\n * Closing the connection must not happen when\n * an operation is running, otherwise we get an error.\n * So we store all running operations here so that\n * they can be awaited.\n */\n public readonly runningOperations = new BehaviorSubject(0);\n public writeQueue: Promise = PROMISE_RESOLVE_VOID;\n\n /**\n * We use this to be able to still fetch\n * the objectId after transforming the document from mongo-style (with _id)\n * to RxDB\n */\n public readonly mongoObjectIdCache = new WeakMap, ObjectId>();\n\n constructor(\n public readonly storage: RxStorageMongoDB,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: MongoDBStorageInternals,\n public readonly options: Readonly,\n public readonly settings: RxStorageMongoDBSettings\n ) {\n if (this.schema.attachments) {\n throw new Error('attachments not supported in mongodb storage, make a PR if you need that');\n }\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\n this.inMongoPrimaryPath = this.primaryPath === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;\n this.mongoClient = new MongoClient(storage.databaseSettings.connection);\n this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);\n\n const indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {\n const arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];\n return arIndex;\n });\n indexes.push([this.inMongoPrimaryPath]);\n\n this.mongoCollectionPromise = this.mongoDatabase.createCollection(collectionName)\n .then(async (mongoCollection) => {\n await mongoCollection.createIndexes(\n indexes.map(index => {\n const mongoIndex: any = {};\n index.forEach(field => mongoIndex[field] = 1);\n return { name: getMongoDBIndexName(index), key: mongoIndex };\n })\n );\n\n /**\n * TODO in a setup where multiple servers run node.js\n * processes that use the mongodb storage, we should propagate\n * events by listening to the mongodb changestream.\n * This maybe should be a premium feature.\n */\n // this.mongoChangeStream = mongoCollection.watch(\n // undefined, {\n // batchSize: 100\n // }\n // ).on('change', change => {\n\n\n // const eventBulkId = randomCouchString(10);\n // const newDocData: RxDocumentData = (change as any).fullDocument;\n // const documentId = newDocData[this.primaryPath] as any;\n\n // const eventBulk: EventBulk>, RxStorageDefaultCheckpoint> = {\n // checkpoint: {\n // id: newDocData[this.primaryPath] as any,\n // lwt: newDocData._meta.lwt\n // },\n // context: 'mongodb-write',\n // id: eventBulkId,\n // events: [{\n // documentData: newDocData,\n // documentId,\n // operation: 'INSERT',\n // previousDocumentData: undefined,\n // }],\n // startTime: now(),\n // endTime: now()\n // };\n\n // this.changes$.next(eventBulk);\n // });\n\n\n return mongoCollection;\n });\n\n\n }\n\n /**\n * Bulk writes on the mongodb storage.\n * Notice that MongoDB does not support cross-document transactions\n * so we have to do a update-if-previous-is-correct like operations.\n * (Similar to what RxDB does with the revision system)\n */\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n\n this.writeQueue = this.writeQueue.then(async () => {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n\n const mongoCollection = await this.mongoCollectionPromise;\n if (this.closed) {\n return Promise.reject(new Error('already closed'));\n }\n const primaryPath = this.primaryPath;\n const ret: RxStorageBulkWriteResponse = {\n success: [],\n error: []\n };\n\n\n const docIds = documentWrites.map(d => (d.document as any)[primaryPath]);\n const documentStates = await this.findDocumentsById(\n docIds,\n true\n );\n const documentStatesMap = new Map();\n documentStates.forEach(doc => {\n const docId = doc[primaryPath];\n documentStatesMap.set(docId, doc);\n });\n const categorized = categorizeBulkWriteRows(\n this,\n primaryPath as any,\n documentStatesMap,\n documentWrites,\n context\n );\n\n const changeByDocId = new Map>>();\n categorized.eventBulk.events.forEach(change => {\n changeByDocId.set(change.documentId, change);\n });\n\n\n ret.error = categorized.errors;\n\n /**\n * Reset the event bulk because\n * conflicts can still appear after the categorization\n */\n const eventBulk = categorized.eventBulk;\n eventBulk.events = [];\n\n await Promise.all([\n /**\n * Inserts\n * @link https://sparkbyexamples.com/mongodb/mongodb-insert-if-not-exists/\n */\n Promise.all(\n categorized.bulkInsertDocs.map(async (writeRow) => {\n const docId: string = writeRow.document[primaryPath] as any;\n const writeResult = await mongoCollection.findOneAndUpdate(\n {\n [this.inMongoPrimaryPath]: docId\n },\n {\n $setOnInsert: swapRxDocToMongo(writeRow.document)\n },\n {\n upsert: true,\n includeResultMetadata: true\n }\n );\n if (writeResult.value) {\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: swapMongoToRxDoc(ensureNotFalsy(writeResult.value)),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = changeByDocId.get(docId);\n if (event) {\n eventBulk.events.push(event);\n }\n ret.success.push(writeRow.document);\n }\n })\n ),\n /**\n * Updates\n */\n Promise.all(\n categorized.bulkUpdateDocs.map(async (writeRow) => {\n const docId = writeRow.document[primaryPath] as string;\n const writeResult = await mongoCollection.findOneAndReplace(\n {\n [this.inMongoPrimaryPath]: docId,\n _rev: ensureNotFalsy(writeRow.previous)._rev\n },\n swapRxDocToMongo(writeRow.document),\n {\n includeResultMetadata: true,\n upsert: false,\n returnDocument: 'before'\n }\n );\n if (!writeResult.ok) {\n const currentDocState = await this.findDocumentsById([docId], true);\n const currentDoc = currentDocState[0];\n // had insert conflict\n const conflictError: RxStorageWriteErrorConflict = {\n status: 409,\n documentId: docId,\n writeRow,\n documentInDb: ensureNotFalsy(currentDoc),\n isError: true\n };\n ret.error.push(conflictError);\n } else {\n const event = getFromMapOrThrow(changeByDocId, docId);\n eventBulk.events.push(event);\n ret.success.push(writeRow.document);\n }\n\n })\n )\n ]);\n\n if (categorized.eventBulk.events.length > 0) {\n const lastState = ensureNotFalsy(categorized.newestRow).document;\n categorized.eventBulk.checkpoint = {\n id: lastState[primaryPath],\n lwt: lastState._meta.lwt\n };\n categorized.eventBulk.endTime = now();\n this.changes$.next(categorized.eventBulk);\n }\n\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return ret;\n });\n return this.writeQueue;\n\n }\n\n async findDocumentsById(\n docIds: string[],\n withDeleted: boolean,\n session?: ClientSession\n ): Promise[]> {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const primaryPath = this.primaryPath;\n\n const plainQuery: MongoQuerySelector = {\n [primaryPath]: {\n $in: docIds\n }\n };\n if (!withDeleted) {\n plainQuery._deleted = false;\n }\n const result: RxDocumentData[] = [];\n const queryResult = await mongoCollection.find(\n plainQuery,\n {\n session\n }\n ).toArray();\n queryResult.forEach(row => {\n result.push(\n swapMongoToRxDoc(\n row as any\n )\n );\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return result;\n }\n\n async query(\n originalPreparedQuery: PreparedQuery\n ): Promise> {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n\n let query = mongoCollection.find(preparedQuery.mongoSelector);\n if (preparedQuery.query.skip) {\n query = query.skip(preparedQuery.query.skip);\n }\n if (preparedQuery.query.limit) {\n query = query.limit(preparedQuery.query.limit);\n }\n if (preparedQuery.query.sort) {\n query = query.sort(preparedQuery.mongoSort);\n }\n const resultDocs = await query.toArray();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n documents: resultDocs.map(d => swapMongoToRxDoc(d))\n };\n }\n\n async count(\n originalPreparedQuery: PreparedQuery\n ): Promise {\n const preparedQuery = prepareMongoDBQuery(this.schema, originalPreparedQuery.query);\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n await this.writeQueue;\n const mongoCollection = await this.mongoCollectionPromise;\n const count = await mongoCollection.countDocuments(preparedQuery.mongoSelector);\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return {\n count,\n mode: 'fast'\n };\n }\n\n async cleanup(minimumDeletedTime: number): Promise {\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n const maxDeletionTime = now() - minimumDeletedTime;\n await mongoCollection.deleteMany({\n _deleted: true,\n '_meta.lwt': {\n $lt: maxDeletionTime\n }\n });\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n return true;\n }\n\n async getAttachmentData(\n _documentId: string,\n _attachmentId: string,\n _digest: string\n ): Promise {\n await this.mongoCollectionPromise;\n throw new Error('attachments not implemented, make a PR');\n }\n\n changeStream(): Observable>, RxStorageDefaultCheckpoint>> {\n return this.changes$;\n }\n\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.runningOperations.next(this.runningOperations.getValue() + 1);\n const mongoCollection = await this.mongoCollectionPromise;\n await mongoCollection.drop();\n this.runningOperations.next(this.runningOperations.getValue() - 1);\n await this.close();\n }\n\n async close(): Promise {\n // TODO without this next-tick we have random fails in the tests\n await requestIdlePromise(200);\n\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n await this.mongoCollectionPromise;\n await firstValueFrom(this.runningOperations.pipe(filter(c => c === 0)));\n // await ensureNotFalsy(this.mongoChangeStream).close();\n await this.mongoClient.close();\n })();\n return this.closed;\n }\n\n conflictResultionTasks(): Observable> {\n return new Subject();\n }\n async resolveConflictResultionTask(_taskSolution: RxConflictResultionTaskSolution): Promise { }\n}\n\nexport function createMongoDBStorageInstance(\n storage: RxStorageMongoDB,\n params: RxStorageInstanceCreationParams,\n settings: RxStorageMongoDBSettings\n): Promise> {\n const instance = new RxStorageInstanceMongoDB(\n storage,\n params.databaseName,\n params.collectionName,\n params.schema,\n {},\n params.options,\n settings\n );\n return Promise.resolve(instance);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-mongodb/rx-storage-mongodb.js.map b/dist/esm/plugins/storage-mongodb/rx-storage-mongodb.js.map index ba2b3f84874..1174b7e7176 100644 --- a/dist/esm/plugins/storage-mongodb/rx-storage-mongodb.js.map +++ b/dist/esm/plugins/storage-mongodb/rx-storage-mongodb.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-mongodb.js","names":["ensureRxStorageInstanceParamsAreCorrect","RX_STORAGE_NAME_MONGODB","createMongoDBStorageInstance","RXDB_VERSION","RxStorageMongoDB","databaseSettings","name","rxdbVersion","_proto","prototype","createStorageInstance","params","getRxStorageMongoDB","storage"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-mongodb.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RX_STORAGE_NAME_MONGODB } from './mongodb-helper.ts';\nimport type { MongoDBDatabaseSettings, MongoDBSettings, MongoDBStorageInternals } from './mongodb-types.ts';\nimport { RxStorageInstanceMongoDB, createMongoDBStorageInstance } from './rx-storage-instance-mongodb.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageMongoDB implements RxStorage {\n public name = RX_STORAGE_NAME_MONGODB;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public databaseSettings: MongoDBDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createMongoDBStorageInstance(this, params, this.databaseSettings);\n }\n}\n\nexport function getRxStorageMongoDB(\n databaseSettings: MongoDBDatabaseSettings\n): RxStorageMongoDB {\n const storage = new RxStorageMongoDB(databaseSettings);\n return storage;\n}\n"],"mappings":"AAKA,SAASA,uCAAuC,QAAQ,4BAA4B;AACpF,SAASC,uBAAuB,QAAQ,qBAAqB;AAE7D,SAAmCC,4BAA4B,QAAQ,kCAAkC;AACzG,SAASC,YAAY,QAAQ,gCAAgC;AAE7D,WAAaC,gBAAgB;EAIzB,SAAAA,iBACWC,gBAAyC,EAClD;IAAA,KALKC,IAAI,GAAGL,uBAAuB;IAAA,KACrBM,WAAW,GAAGJ,YAAY;IAAA,KAG/BE,gBAAyC,GAAzCA,gBAAyC;EAChD;EAAC,IAAAG,MAAA,GAAAJ,gBAAA,CAAAK,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAOA,qBAAqBA,CACxBC,MAAmE,EACvB;IAC5CX,uCAAuC,CAACW,MAAM,CAAC;IAC/C,OAAOT,4BAA4B,CAAC,IAAI,EAAES,MAAM,EAAE,IAAI,CAACN,gBAAgB,CAAC;EAC5E,CAAC;EAAA,OAAAD,gBAAA;AAAA;AAGL,OAAO,SAASQ,mBAAmBA,CAC/BP,gBAAyC,EACzB;EAChB,IAAMQ,OAAO,GAAG,IAAIT,gBAAgB,CAACC,gBAAgB,CAAC;EACtD,OAAOQ,OAAO;AAClB","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-mongodb.js","names":["ensureRxStorageInstanceParamsAreCorrect","RX_STORAGE_NAME_MONGODB","createMongoDBStorageInstance","RXDB_VERSION","RxStorageMongoDB","databaseSettings","name","rxdbVersion","_proto","prototype","createStorageInstance","params","getRxStorageMongoDB","storage"],"sources":["../../../../src/plugins/storage-mongodb/rx-storage-mongodb.ts"],"sourcesContent":["import type {\n RxStorage,\n RxStorageInstanceCreationParams\n} from '../../types/index.d.ts';\n\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\nimport { RX_STORAGE_NAME_MONGODB } from './mongodb-helper.ts';\nimport type { MongoDBDatabaseSettings, MongoDBSettings, MongoDBStorageInternals } from './mongodb-types.ts';\nimport { RxStorageInstanceMongoDB, createMongoDBStorageInstance } from './rx-storage-instance-mongodb.ts';\nimport { RXDB_VERSION } from '../utils/utils-rxdb-version.ts';\n\nexport class RxStorageMongoDB implements RxStorage {\n public name = RX_STORAGE_NAME_MONGODB;\n public readonly rxdbVersion = RXDB_VERSION;\n\n constructor(\n public databaseSettings: MongoDBDatabaseSettings\n ) { }\n\n public createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n ensureRxStorageInstanceParamsAreCorrect(params);\n return createMongoDBStorageInstance(this, params, this.databaseSettings);\n }\n}\n\nexport function getRxStorageMongoDB(\n databaseSettings: MongoDBDatabaseSettings\n): RxStorageMongoDB {\n const storage = new RxStorageMongoDB(databaseSettings);\n return storage;\n}\n"],"mappings":"AAKA,SAASA,uCAAuC,QAAQ,4BAA4B;AACpF,SAASC,uBAAuB,QAAQ,qBAAqB;AAE7D,SAAmCC,4BAA4B,QAAQ,kCAAkC;AACzG,SAASC,YAAY,QAAQ,gCAAgC;AAE7D,WAAaC,gBAAgB;EAIzB,SAAAA,iBACWC,gBAAyC,EAClD;IAAA,KALKC,IAAI,GAAGL,uBAAuB;IAAA,KACrBM,WAAW,GAAGJ,YAAY;IAAA,KAG/BE,gBAAyC,GAAzCA,gBAAyC;EAChD;EAAC,IAAAG,MAAA,GAAAJ,gBAAA,CAAAK,SAAA;EAAAD,MAAA,CAEEE,qBAAqB,GAA5B,SAAAA,sBACIC,MAAmE,EACvB;IAC5CX,uCAAuC,CAACW,MAAM,CAAC;IAC/C,OAAOT,4BAA4B,CAAC,IAAI,EAAES,MAAM,EAAE,IAAI,CAACN,gBAAgB,CAAC;EAC5E,CAAC;EAAA,OAAAD,gBAAA;AAAA;AAGL,OAAO,SAASQ,mBAAmBA,CAC/BP,gBAAyC,EACzB;EAChB,IAAMQ,OAAO,GAAG,IAAIT,gBAAgB,CAACC,gBAAgB,CAAC;EACtD,OAAOQ,OAAO;AAClB","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/plugins/storage-remote/rx-storage-remote.js.map b/dist/esm/plugins/storage-remote/rx-storage-remote.js.map index ee03bb497af..ffbe2318d68 100644 --- a/dist/esm/plugins/storage-remote/rx-storage-remote.js.map +++ b/dist/esm/plugins/storage-remote/rx-storage-remote.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-storage-remote.js","names":["firstValueFrom","filter","Subject","RXDB_VERSION","randomCouchString","closeMessageChannel","getMessageChannel","RxStorageRemote","settings","name","rxdbVersion","seed","lastRequestId","mode","messageChannelIfOneMode","_proto","prototype","getRequestId","newId","createStorageInstance","params","connectionId","cacheKeys","push","collectionName","databaseName","messageChannel","requestId","waitForOkPromise","messages$","pipe","msg","answerTo","send","method","waitForOkResult","error","Error","JSON","stringify","RxStorageInstanceRemote","schema","options","customRequest","data","messageChannelCreator","waitForAnswerPromise","response","close","return","getMessageReturn","parse","storage","internals","changes$","conflicts$","subs","subscribe","next","_proto2","requestRemote","methodName","responsePromise","message","bulkWrite","documentWrites","context","findDocumentsById","ids","deleted","query","preparedQuery","count","getAttachmentData","documentId","attachmentId","digest","getChangedDocumentsSince","limit","checkpoint","changeStream","asObservable","cleanup","minDeletedTime","closed","forEach","sub","unsubscribe","complete","remove","conflictResultionTasks","resolveConflictResultionTask","taskSolution","getRxStorageRemote","withDefaults","Object","assign"],"sources":["../../../../src/plugins/storage-remote/rx-storage-remote.ts"],"sourcesContent":["import {\n firstValueFrom,\n filter,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n BulkWriteRow,\n EventBulk,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorage,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult\n} from '../../types/index.d.ts';\nimport {\n RXDB_VERSION,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport type {\n MessageFromRemote,\n MessageToRemote,\n RemoteMessageChannel,\n RxStorageRemoteInternals,\n RxStorageRemoteSettings\n} from './storage-remote-types.ts';\nimport { closeMessageChannel, getMessageChannel } from './message-channel-cache.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\n\n\nexport class RxStorageRemote implements RxStorage {\n public readonly name: string = 'remote';\n public readonly rxdbVersion = RXDB_VERSION;\n\n private seed: string = randomCouchString(10);\n private lastRequestId: number = 0;\n public messageChannelIfOneMode?: Promise;\n constructor(\n public readonly settings: RxStorageRemoteSettings\n ) {\n if (settings.mode === 'one') {\n this.messageChannelIfOneMode = getMessageChannel(\n settings,\n [],\n true\n );\n }\n }\n\n public getRequestId() {\n const newId = this.lastRequestId++;\n return this.seed + '|' + newId;\n }\n\n async createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n const connectionId = 'c|' + this.getRequestId();\n\n const cacheKeys: string[] = [\n 'mode-' + this.settings.mode\n ];\n switch (this.settings.mode) {\n case 'collection':\n cacheKeys.push('collection-' + params.collectionName);\n // eslint-disable-next-line no-fallthrough\n case 'database':\n cacheKeys.push('database-' + params.databaseName);\n // eslint-disable-next-line no-fallthrough\n case 'storage':\n cacheKeys.push('seed-' + this.seed);\n }\n const messageChannel = await (this.messageChannelIfOneMode ?\n this.messageChannelIfOneMode :\n getMessageChannel(\n this.settings,\n cacheKeys\n )\n );\n\n const requestId = this.getRequestId();\n const waitForOkPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'create',\n requestId,\n params\n });\n\n const waitForOkResult = await waitForOkPromise;\n if (waitForOkResult.error) {\n await closeMessageChannel(messageChannel);\n throw new Error('could not create instance ' + JSON.stringify(waitForOkResult.error));\n }\n\n return new RxStorageInstanceRemote(\n this,\n params.databaseName,\n params.collectionName,\n params.schema,\n {\n params,\n connectionId,\n messageChannel\n },\n params.options\n );\n }\n\n async customRequest(data: In): Promise {\n const messageChannel = await this.settings.messageChannelCreator();\n const requestId = this.getRequestId();\n const connectionId = 'custom|request|' + requestId;\n const waitForAnswerPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'custom',\n requestId,\n params: data\n });\n const response = await waitForAnswerPromise;\n if (response.error) {\n await messageChannel.close();\n throw new Error('could not run customRequest(): ' + JSON.stringify({\n data,\n error: response.error\n }));\n } else {\n await messageChannel.close();\n return response.return;\n }\n\n }\n}\n\n/**\n * Because postMessage() can be very slow on complex objects,\n * and some RxStorage implementations do need a JSON-string internally\n * anyway, it is allowed to transfer a string instead of an object\n * which must then be JSON.parse()-ed before RxDB can use it.\n * @link https://surma.dev/things/is-postmessage-slow/\n */\nfunction getMessageReturn(\n msg: MessageFromRemote\n) {\n if (msg.method === 'getAttachmentData') {\n return msg.return;\n } else {\n if (typeof msg.return === 'string') {\n return JSON.parse(msg.return);\n } else {\n return msg.return;\n }\n }\n}\n\nexport class RxStorageInstanceRemote implements RxStorageInstance {\n private changes$: Subject>, any>> = new Subject();\n private conflicts$: Subject> = new Subject();\n private subs: Subscription[] = [];\n\n private closed?: Promise;\n messages$: Observable;\n\n constructor(\n public readonly storage: RxStorageRemote,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: RxStorageRemoteInternals,\n public readonly options: Readonly\n ) {\n this.messages$ = this.internals.messageChannel.messages$.pipe(\n filter(msg => msg.connectionId === this.internals.connectionId)\n );\n this.subs.push(\n this.messages$.subscribe(msg => {\n if (msg.method === 'changeStream') {\n this.changes$.next(getMessageReturn(msg));\n }\n if (msg.method === 'conflictResultionTasks') {\n this.conflicts$.next(msg.return);\n }\n })\n );\n }\n\n private async requestRemote(\n methodName: keyof RxStorageInstance,\n params: any\n ) {\n const requestId = this.storage.getRequestId();\n const responsePromise = firstValueFrom(\n this.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n )\n );\n const message: MessageToRemote = {\n connectionId: this.internals.connectionId,\n requestId,\n method: methodName,\n params\n };\n this.internals.messageChannel.send(message);\n const response = await responsePromise;\n if (response.error) {\n throw new Error('could not requestRemote: ' + JSON.stringify({\n methodName,\n params,\n error: response.error\n }, null, 4));\n } else {\n return getMessageReturn(response);\n }\n }\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n return this.requestRemote('bulkWrite', [documentWrites, context]);\n }\n findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n return this.requestRemote('findDocumentsById', [ids, deleted]);\n }\n query(preparedQuery: any): Promise> {\n return this.requestRemote('query', [preparedQuery]);\n }\n count(preparedQuery: any): Promise {\n return this.requestRemote('count', [preparedQuery]);\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n return this.requestRemote('getAttachmentData', [documentId, attachmentId, digest]);\n }\n getChangedDocumentsSince(\n limit: number,\n checkpoint?: any\n ): Promise<\n {\n documents: RxDocumentData[];\n checkpoint: any;\n }> {\n return this.requestRemote('getChangedDocumentsSince', [limit, checkpoint]);\n }\n changeStream(): Observable>, any>> {\n return this.changes$.asObservable();\n }\n cleanup(minDeletedTime: number): Promise {\n return this.requestRemote('cleanup', [minDeletedTime]);\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.subs.forEach(sub => sub.unsubscribe());\n this.changes$.complete();\n await this.requestRemote('close', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.closed = (async () => {\n await this.requestRemote('remove', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n conflictResultionTasks(): Observable> {\n return this.conflicts$;\n }\n async resolveConflictResultionTask(taskSolution: RxConflictResultionTaskSolution): Promise {\n await this.requestRemote('resolveConflictResultionTask', [taskSolution]);\n }\n}\n\nexport function getRxStorageRemote(settings: RxStorageRemoteSettings): RxStorageRemote {\n const withDefaults = Object.assign({\n mode: 'storage'\n }, settings);\n return new RxStorageRemote(withDefaults);\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-storage-remote.js","names":["firstValueFrom","filter","Subject","RXDB_VERSION","randomCouchString","closeMessageChannel","getMessageChannel","RxStorageRemote","settings","name","rxdbVersion","seed","lastRequestId","mode","messageChannelIfOneMode","_proto","prototype","getRequestId","newId","createStorageInstance","params","connectionId","cacheKeys","push","collectionName","databaseName","messageChannel","requestId","waitForOkPromise","messages$","pipe","msg","answerTo","send","method","waitForOkResult","error","Error","JSON","stringify","RxStorageInstanceRemote","schema","options","customRequest","data","messageChannelCreator","waitForAnswerPromise","response","close","return","getMessageReturn","parse","storage","internals","changes$","conflicts$","subs","subscribe","next","_proto2","requestRemote","methodName","responsePromise","message","bulkWrite","documentWrites","context","findDocumentsById","ids","deleted","query","preparedQuery","count","getAttachmentData","documentId","attachmentId","digest","getChangedDocumentsSince","limit","checkpoint","changeStream","asObservable","cleanup","minDeletedTime","closed","forEach","sub","unsubscribe","complete","remove","conflictResultionTasks","resolveConflictResultionTask","taskSolution","getRxStorageRemote","withDefaults","Object","assign"],"sources":["../../../../src/plugins/storage-remote/rx-storage-remote.ts"],"sourcesContent":["import {\n firstValueFrom,\n filter,\n Observable,\n Subject,\n Subscription\n} from 'rxjs';\nimport type {\n BulkWriteRow,\n EventBulk,\n RxConflictResultionTask,\n RxConflictResultionTaskSolution,\n RxDocumentData,\n RxJsonSchema,\n RxStorage,\n RxStorageBulkWriteResponse,\n RxStorageChangeEvent,\n RxStorageCountResult,\n RxStorageInstance,\n RxStorageInstanceCreationParams,\n RxStorageQueryResult\n} from '../../types/index.d.ts';\nimport {\n RXDB_VERSION,\n randomCouchString\n} from '../../plugins/utils/index.ts';\nimport type {\n MessageFromRemote,\n MessageToRemote,\n RemoteMessageChannel,\n RxStorageRemoteInternals,\n RxStorageRemoteSettings\n} from './storage-remote-types.ts';\nimport { closeMessageChannel, getMessageChannel } from './message-channel-cache.ts';\nimport { ensureRxStorageInstanceParamsAreCorrect } from '../../rx-storage-helper.ts';\n\n\nexport class RxStorageRemote implements RxStorage {\n public readonly name: string = 'remote';\n public readonly rxdbVersion = RXDB_VERSION;\n\n private seed: string = randomCouchString(10);\n private lastRequestId: number = 0;\n public messageChannelIfOneMode?: Promise;\n constructor(\n public readonly settings: RxStorageRemoteSettings\n ) {\n if (settings.mode === 'one') {\n this.messageChannelIfOneMode = getMessageChannel(\n settings,\n [],\n true\n );\n }\n }\n\n public getRequestId() {\n const newId = this.lastRequestId++;\n return this.seed + '|' + newId;\n }\n\n async createStorageInstance(\n params: RxStorageInstanceCreationParams\n ): Promise> {\n const connectionId = 'c|' + this.getRequestId();\n\n const cacheKeys: string[] = [\n 'mode-' + this.settings.mode\n ];\n switch (this.settings.mode) {\n case 'collection':\n cacheKeys.push('collection-' + params.collectionName);\n // eslint-disable-next-line no-fallthrough\n case 'database':\n cacheKeys.push('database-' + params.databaseName);\n // eslint-disable-next-line no-fallthrough\n case 'storage':\n cacheKeys.push('seed-' + this.seed);\n }\n const messageChannel = await (this.messageChannelIfOneMode ?\n this.messageChannelIfOneMode :\n getMessageChannel(\n this.settings,\n cacheKeys\n )\n );\n\n const requestId = this.getRequestId();\n const waitForOkPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'create',\n requestId,\n params\n });\n\n const waitForOkResult = await waitForOkPromise;\n if (waitForOkResult.error) {\n await closeMessageChannel(messageChannel);\n throw new Error('could not create instance ' + JSON.stringify(waitForOkResult.error));\n }\n\n return new RxStorageInstanceRemote(\n this,\n params.databaseName,\n params.collectionName,\n params.schema,\n {\n params,\n connectionId,\n messageChannel\n },\n params.options\n );\n }\n\n async customRequest(data: In): Promise {\n const messageChannel = await this.settings.messageChannelCreator();\n const requestId = this.getRequestId();\n const connectionId = 'custom|request|' + requestId;\n const waitForAnswerPromise = firstValueFrom(messageChannel.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n ));\n messageChannel.send({\n connectionId,\n method: 'custom',\n requestId,\n params: data\n });\n const response = await waitForAnswerPromise;\n if (response.error) {\n await messageChannel.close();\n throw new Error('could not run customRequest(): ' + JSON.stringify({\n data,\n error: response.error\n }));\n } else {\n await messageChannel.close();\n return response.return;\n }\n\n }\n}\n\n/**\n * Because postMessage() can be very slow on complex objects,\n * and some RxStorage implementations do need a JSON-string internally\n * anyway, it is allowed to transfer a string instead of an object\n * which must then be JSON.parse()-ed before RxDB can use it.\n * @link https://surma.dev/things/is-postmessage-slow/\n */\nfunction getMessageReturn(\n msg: MessageFromRemote\n) {\n if (msg.method === 'getAttachmentData') {\n return msg.return;\n } else {\n if (typeof msg.return === 'string') {\n return JSON.parse(msg.return);\n } else {\n return msg.return;\n }\n }\n}\n\nexport class RxStorageInstanceRemote implements RxStorageInstance {\n private changes$: Subject>, any>> = new Subject();\n private conflicts$: Subject> = new Subject();\n private subs: Subscription[] = [];\n\n private closed?: Promise;\n messages$: Observable;\n\n constructor(\n public readonly storage: RxStorageRemote,\n public readonly databaseName: string,\n public readonly collectionName: string,\n public readonly schema: Readonly>>,\n public readonly internals: RxStorageRemoteInternals,\n public readonly options: Readonly\n ) {\n this.messages$ = this.internals.messageChannel.messages$.pipe(\n filter(msg => msg.connectionId === this.internals.connectionId)\n );\n this.subs.push(\n this.messages$.subscribe(msg => {\n if (msg.method === 'changeStream') {\n this.changes$.next(getMessageReturn(msg));\n }\n if (msg.method === 'conflictResultionTasks') {\n this.conflicts$.next(msg.return);\n }\n })\n );\n }\n\n private async requestRemote(\n methodName: keyof RxStorageInstance,\n params: any\n ) {\n const requestId = this.storage.getRequestId();\n const responsePromise = firstValueFrom(\n this.messages$.pipe(\n filter(msg => msg.answerTo === requestId)\n )\n );\n const message: MessageToRemote = {\n connectionId: this.internals.connectionId,\n requestId,\n method: methodName,\n params\n };\n this.internals.messageChannel.send(message);\n const response = await responsePromise;\n if (response.error) {\n throw new Error('could not requestRemote: ' + JSON.stringify({\n methodName,\n params,\n error: response.error\n }, null, 4));\n } else {\n return getMessageReturn(response);\n }\n }\n bulkWrite(\n documentWrites: BulkWriteRow[],\n context: string\n ): Promise> {\n return this.requestRemote('bulkWrite', [documentWrites, context]);\n }\n findDocumentsById(ids: string[], deleted: boolean): Promise[]> {\n return this.requestRemote('findDocumentsById', [ids, deleted]);\n }\n query(preparedQuery: any): Promise> {\n return this.requestRemote('query', [preparedQuery]);\n }\n count(preparedQuery: any): Promise {\n return this.requestRemote('count', [preparedQuery]);\n }\n getAttachmentData(documentId: string, attachmentId: string, digest: string): Promise {\n return this.requestRemote('getAttachmentData', [documentId, attachmentId, digest]);\n }\n getChangedDocumentsSince(\n limit: number,\n checkpoint?: any\n ): Promise<\n {\n documents: RxDocumentData[];\n checkpoint: any;\n }> {\n return this.requestRemote('getChangedDocumentsSince', [limit, checkpoint]);\n }\n changeStream(): Observable>, any>> {\n return this.changes$.asObservable();\n }\n cleanup(minDeletedTime: number): Promise {\n return this.requestRemote('cleanup', [minDeletedTime]);\n }\n async close(): Promise {\n if (this.closed) {\n return this.closed;\n }\n this.closed = (async () => {\n this.subs.forEach(sub => sub.unsubscribe());\n this.changes$.complete();\n await this.requestRemote('close', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n async remove(): Promise {\n if (this.closed) {\n throw new Error('already closed');\n }\n this.closed = (async () => {\n await this.requestRemote('remove', []);\n await closeMessageChannel(this.internals.messageChannel);\n })();\n return this.closed;\n }\n conflictResultionTasks(): Observable> {\n return this.conflicts$;\n }\n async resolveConflictResultionTask(taskSolution: RxConflictResultionTaskSolution): Promise {\n await this.requestRemote('resolveConflictResultionTask', [taskSolution]);\n }\n}\n\nexport function getRxStorageRemote(settings: RxStorageRemoteSettings): RxStorageRemote {\n const withDefaults = Object.assign({\n mode: 'storage'\n }, settings);\n return new RxStorageRemote(withDefaults);\n}\n"],"mappings":"AAAA,SACIA,cAAc,EACdC,MAAM,EAENC,OAAO,QAEJ,MAAM;AAgBb,SACIC,YAAY,EACZC,iBAAiB,QACd,8BAA8B;AAQrC,SAASC,mBAAmB,EAAEC,iBAAiB,QAAQ,4BAA4B;AAInF,WAAaC,eAAe;EAOxB,SAAAA,gBACoBC,QAAiC,EACnD;IAAA,KARcC,IAAI,GAAW,QAAQ;IAAA,KACvBC,WAAW,GAAGP,YAAY;IAAA,KAElCQ,IAAI,GAAWP,iBAAiB,CAAC,EAAE,CAAC;IAAA,KACpCQ,aAAa,GAAW,CAAC;IAAA,KAGbJ,QAAiC,GAAjCA,QAAiC;IAEjD,IAAIA,QAAQ,CAACK,IAAI,KAAK,KAAK,EAAE;MACzB,IAAI,CAACC,uBAAuB,GAAGR,iBAAiB,CAC5CE,QAAQ,EACR,EAAE,EACF,IACJ,CAAC;IACL;EACJ;EAAC,IAAAO,MAAA,GAAAR,eAAA,CAAAS,SAAA;EAAAD,MAAA,CAEME,YAAY,GAAnB,SAAAA,aAAA,EAAsB;IAClB,IAAMC,KAAK,GAAG,IAAI,CAACN,aAAa,EAAE;IAClC,OAAO,IAAI,CAACD,IAAI,GAAG,GAAG,GAAGO,KAAK;EAClC,CAAC;EAAAH,MAAA,CAEKI,qBAAqB,GAA3B,eAAAA,sBACIC,MAAuD,EACZ;IAC3C,IAAMC,YAAY,GAAG,IAAI,GAAG,IAAI,CAACJ,YAAY,CAAC,CAAC;IAE/C,IAAMK,SAAmB,GAAG,CACxB,OAAO,GAAG,IAAI,CAACd,QAAQ,CAACK,IAAI,CAC/B;IACD,QAAQ,IAAI,CAACL,QAAQ,CAACK,IAAI;MACtB,KAAK,YAAY;QACbS,SAAS,CAACC,IAAI,CAAC,aAAa,GAAGH,MAAM,CAACI,cAAc,CAAC;MACzD;MACA,KAAK,UAAU;QACXF,SAAS,CAACC,IAAI,CAAC,WAAW,GAAGH,MAAM,CAACK,YAAY,CAAC;MACrD;MACA,KAAK,SAAS;QACVH,SAAS,CAACC,IAAI,CAAC,OAAO,GAAG,IAAI,CAACZ,IAAI,CAAC;IAC3C;IACA,IAAMe,cAAc,GAAG,OAAO,IAAI,CAACZ,uBAAuB,GACtD,IAAI,CAACA,uBAAuB,GAC5BR,iBAAiB,CACb,IAAI,CAACE,QAAQ,EACbc,SACJ,CAAC,CACJ;IAED,IAAMK,SAAS,GAAG,IAAI,CAACV,YAAY,CAAC,CAAC;IACrC,IAAMW,gBAAgB,GAAG5B,cAAc,CAAC0B,cAAc,CAACG,SAAS,CAACC,IAAI,CACjE7B,MAAM,CAAC8B,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAKL,SAAS,CAC5C,CAAC,CAAC;IACFD,cAAc,CAACO,IAAI,CAAC;MAChBZ,YAAY;MACZa,MAAM,EAAE,QAAQ;MAChBP,SAAS;MACTP;IACJ,CAAC,CAAC;IAEF,IAAMe,eAAe,GAAG,MAAMP,gBAAgB;IAC9C,IAAIO,eAAe,CAACC,KAAK,EAAE;MACvB,MAAM/B,mBAAmB,CAACqB,cAAc,CAAC;MACzC,MAAM,IAAIW,KAAK,CAAC,4BAA4B,GAAGC,IAAI,CAACC,SAAS,CAACJ,eAAe,CAACC,KAAK,CAAC,CAAC;IACzF;IAEA,OAAO,IAAII,uBAAuB,CAC9B,IAAI,EACJpB,MAAM,CAACK,YAAY,EACnBL,MAAM,CAACI,cAAc,EACrBJ,MAAM,CAACqB,MAAM,EACb;MACIrB,MAAM;MACNC,YAAY;MACZK;IACJ,CAAC,EACDN,MAAM,CAACsB,OACX,CAAC;EACL,CAAC;EAAA3B,MAAA,CAEK4B,aAAa,GAAnB,eAAAA,cAA6BC,IAAQ,EAAgB;IACjD,IAAMlB,cAAc,GAAG,MAAM,IAAI,CAAClB,QAAQ,CAACqC,qBAAqB,CAAC,CAAC;IAClE,IAAMlB,SAAS,GAAG,IAAI,CAACV,YAAY,CAAC,CAAC;IACrC,IAAMI,YAAY,GAAG,iBAAiB,GAAGM,SAAS;IAClD,IAAMmB,oBAAoB,GAAG9C,cAAc,CAAC0B,cAAc,CAACG,SAAS,CAACC,IAAI,CACrE7B,MAAM,CAAC8B,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAKL,SAAS,CAC5C,CAAC,CAAC;IACFD,cAAc,CAACO,IAAI,CAAC;MAChBZ,YAAY;MACZa,MAAM,EAAE,QAAQ;MAChBP,SAAS;MACTP,MAAM,EAAEwB;IACZ,CAAC,CAAC;IACF,IAAMG,QAAQ,GAAG,MAAMD,oBAAoB;IAC3C,IAAIC,QAAQ,CAACX,KAAK,EAAE;MAChB,MAAMV,cAAc,CAACsB,KAAK,CAAC,CAAC;MAC5B,MAAM,IAAIX,KAAK,CAAC,iCAAiC,GAAGC,IAAI,CAACC,SAAS,CAAC;QAC/DK,IAAI;QACJR,KAAK,EAAEW,QAAQ,CAACX;MACpB,CAAC,CAAC,CAAC;IACP,CAAC,MAAM;MACH,MAAMV,cAAc,CAACsB,KAAK,CAAC,CAAC;MAC5B,OAAOD,QAAQ,CAACE,MAAM;IAC1B;EAEJ,CAAC;EAAA,OAAA1C,eAAA;AAAA;;AAGL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS2C,gBAAgBA,CACrBnB,GAAsB,EACxB;EACE,IAAIA,GAAG,CAACG,MAAM,KAAK,mBAAmB,EAAE;IACpC,OAAOH,GAAG,CAACkB,MAAM;EACrB,CAAC,MAAM;IACH,IAAI,OAAOlB,GAAG,CAACkB,MAAM,KAAK,QAAQ,EAAE;MAChC,OAAOX,IAAI,CAACa,KAAK,CAACpB,GAAG,CAACkB,MAAM,CAAC;IACjC,CAAC,MAAM;MACH,OAAOlB,GAAG,CAACkB,MAAM;IACrB;EACJ;AACJ;AAEA,WAAaT,uBAAuB;EAQhC,SAAAA,wBACoBY,OAAwB,EACxB3B,YAAoB,EACpBD,cAAsB,EACtBiB,MAAyD,EACzDY,SAAmC,EACnCX,OAAsB,EACxC;IAAA,KAdMY,QAAQ,GAA6E,IAAIpD,OAAO,CAAC,CAAC;IAAA,KAClGqD,UAAU,GAAgD,IAAIrD,OAAO,CAAC,CAAC;IAAA,KACvEsD,IAAI,GAAmB,EAAE;IAAA,KAMbJ,OAAwB,GAAxBA,OAAwB;IAAA,KACxB3B,YAAoB,GAApBA,YAAoB;IAAA,KACpBD,cAAsB,GAAtBA,cAAsB;IAAA,KACtBiB,MAAyD,GAAzDA,MAAyD;IAAA,KACzDY,SAAmC,GAAnCA,SAAmC;IAAA,KACnCX,OAAsB,GAAtBA,OAAsB;IAEtC,IAAI,CAACb,SAAS,GAAG,IAAI,CAACwB,SAAS,CAAC3B,cAAc,CAACG,SAAS,CAACC,IAAI,CACzD7B,MAAM,CAAC8B,GAAG,IAAIA,GAAG,CAACV,YAAY,KAAK,IAAI,CAACgC,SAAS,CAAChC,YAAY,CAClE,CAAC;IACD,IAAI,CAACmC,IAAI,CAACjC,IAAI,CACV,IAAI,CAACM,SAAS,CAAC4B,SAAS,CAAC1B,GAAG,IAAI;MAC5B,IAAIA,GAAG,CAACG,MAAM,KAAK,cAAc,EAAE;QAC/B,IAAI,CAACoB,QAAQ,CAACI,IAAI,CAACR,gBAAgB,CAACnB,GAAG,CAAC,CAAC;MAC7C;MACA,IAAIA,GAAG,CAACG,MAAM,KAAK,wBAAwB,EAAE;QACzC,IAAI,CAACqB,UAAU,CAACG,IAAI,CAAC3B,GAAG,CAACkB,MAAM,CAAC;MACpC;IACJ,CAAC,CACL,CAAC;EACL;EAAC,IAAAU,OAAA,GAAAnB,uBAAA,CAAAxB,SAAA;EAAA2C,OAAA,CAEaC,aAAa,GAA3B,eAAAA,cACIC,UAAkD,EAClDzC,MAAW,EACb;IACE,IAAMO,SAAS,GAAG,IAAI,CAACyB,OAAO,CAACnC,YAAY,CAAC,CAAC;IAC7C,IAAM6C,eAAe,GAAG9D,cAAc,CAClC,IAAI,CAAC6B,SAAS,CAACC,IAAI,CACf7B,MAAM,CAAC8B,GAAG,IAAIA,GAAG,CAACC,QAAQ,KAAKL,SAAS,CAC5C,CACJ,CAAC;IACD,IAAMoC,OAAwB,GAAG;MAC7B1C,YAAY,EAAE,IAAI,CAACgC,SAAS,CAAChC,YAAY;MACzCM,SAAS;MACTO,MAAM,EAAE2B,UAAU;MAClBzC;IACJ,CAAC;IACD,IAAI,CAACiC,SAAS,CAAC3B,cAAc,CAACO,IAAI,CAAC8B,OAAO,CAAC;IAC3C,IAAMhB,QAAQ,GAAG,MAAMe,eAAe;IACtC,IAAIf,QAAQ,CAACX,KAAK,EAAE;MAChB,MAAM,IAAIC,KAAK,CAAC,2BAA2B,GAAGC,IAAI,CAACC,SAAS,CAAC;QACzDsB,UAAU;QACVzC,MAAM;QACNgB,KAAK,EAAEW,QAAQ,CAACX;MACpB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC,MAAM;MACH,OAAOc,gBAAgB,CAACH,QAAQ,CAAC;IACrC;EACJ,CAAC;EAAAY,OAAA,CACDK,SAAS,GAAT,SAAAA,UACIC,cAAyC,EACzCC,OAAe,EAC+B;IAC9C,OAAO,IAAI,CAACN,aAAa,CAAC,WAAW,EAAE,CAACK,cAAc,EAAEC,OAAO,CAAC,CAAC;EACrE,CAAC;EAAAP,OAAA,CACDQ,iBAAiB,GAAjB,SAAAA,kBAAkBC,GAAa,EAAEC,OAAgB,EAAwC;IACrF,OAAO,IAAI,CAACT,aAAa,CAAC,mBAAmB,EAAE,CAACQ,GAAG,EAAEC,OAAO,CAAC,CAAC;EAClE,CAAC;EAAAV,OAAA,CACDW,KAAK,GAAL,SAAAA,MAAMC,aAAkB,EAA4C;IAChE,OAAO,IAAI,CAACX,aAAa,CAAC,OAAO,EAAE,CAACW,aAAa,CAAC,CAAC;EACvD,CAAC;EAAAZ,OAAA,CACDa,KAAK,GAAL,SAAAA,MAAMD,aAAkB,EAAiC;IACrD,OAAO,IAAI,CAACX,aAAa,CAAC,OAAO,EAAE,CAACW,aAAa,CAAC,CAAC;EACvD,CAAC;EAAAZ,OAAA,CACDc,iBAAiB,GAAjB,SAAAA,kBAAkBC,UAAkB,EAAEC,YAAoB,EAAEC,MAAc,EAAmB;IACzF,OAAO,IAAI,CAAChB,aAAa,CAAC,mBAAmB,EAAE,CAACc,UAAU,EAAEC,YAAY,EAAEC,MAAM,CAAC,CAAC;EACtF,CAAC;EAAAjB,OAAA,CACDkB,wBAAwB,GAAxB,SAAAA,yBACIC,KAAa,EACbC,UAAgB,EAKb;IACH,OAAO,IAAI,CAACnB,aAAa,CAAC,0BAA0B,EAAE,CAACkB,KAAK,EAAEC,UAAU,CAAC,CAAC;EAC9E,CAAC;EAAApB,OAAA,CACDqB,YAAY,GAAZ,SAAAA,aAAA,EAA4F;IACxF,OAAO,IAAI,CAAC1B,QAAQ,CAAC2B,YAAY,CAAC,CAAC;EACvC,CAAC;EAAAtB,OAAA,CACDuB,OAAO,GAAP,SAAAA,QAAQC,cAAsB,EAAoB;IAC9C,OAAO,IAAI,CAACvB,aAAa,CAAC,SAAS,EAAE,CAACuB,cAAc,CAAC,CAAC;EAC1D,CAAC;EAAAxB,OAAA,CACKX,KAAK,GAAX,eAAAA,MAAA,EAA6B;IACzB,IAAI,IAAI,CAACoC,MAAM,EAAE;MACb,OAAO,IAAI,CAACA,MAAM;IACtB;IACA,IAAI,CAACA,MAAM,GAAG,CAAC,YAAY;MACvB,IAAI,CAAC5B,IAAI,CAAC6B,OAAO,CAACC,GAAG,IAAIA,GAAG,CAACC,WAAW,CAAC,CAAC,CAAC;MAC3C,IAAI,CAACjC,QAAQ,CAACkC,QAAQ,CAAC,CAAC;MACxB,MAAM,IAAI,CAAC5B,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;MACrC,MAAMvD,mBAAmB,CAAC,IAAI,CAACgD,SAAS,CAAC3B,cAAc,CAAC;IAC5D,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAAC0D,MAAM;EACtB,CAAC;EAAAzB,OAAA,CACK8B,MAAM,GAAZ,eAAAA,OAAA,EAA8B;IAC1B,IAAI,IAAI,CAACL,MAAM,EAAE;MACb,MAAM,IAAI/C,KAAK,CAAC,gBAAgB,CAAC;IACrC;IACA,IAAI,CAAC+C,MAAM,GAAG,CAAC,YAAY;MACvB,MAAM,IAAI,CAACxB,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;MACtC,MAAMvD,mBAAmB,CAAC,IAAI,CAACgD,SAAS,CAAC3B,cAAc,CAAC;IAC5D,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAAC0D,MAAM;EACtB,CAAC;EAAAzB,OAAA,CACD+B,sBAAsB,GAAtB,SAAAA,uBAAA,EAAyE;IACrE,OAAO,IAAI,CAACnC,UAAU;EAC1B,CAAC;EAAAI,OAAA,CACKgC,4BAA4B,GAAlC,eAAAA,6BAAmCC,YAAwD,EAAiB;IACxG,MAAM,IAAI,CAAChC,aAAa,CAAC,8BAA8B,EAAE,CAACgC,YAAY,CAAC,CAAC;EAC5E,CAAC;EAAA,OAAApD,uBAAA;AAAA;AAGL,OAAO,SAASqD,kBAAkBA,CAACrF,QAAiC,EAAmB;EACnF,IAAMsF,YAAY,GAAGC,MAAM,CAACC,MAAM,CAAC;IAC/BnF,IAAI,EAAE;EACV,CAAC,EAAEL,QAAQ,CAAC;EACZ,OAAO,IAAID,eAAe,CAACuF,YAAY,CAAC;AAC5C","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/query-cache.js.map b/dist/esm/query-cache.js.map index 1ac9ed43198..eea48af0fb3 100644 --- a/dist/esm/query-cache.js.map +++ b/dist/esm/query-cache.js.map @@ -1 +1 @@ -{"version":3,"file":"query-cache.js","names":["getFromMapOrCreate","nextTick","now","requestIdlePromise","QueryCache","_map","Map","_proto","prototype","getByQuery","rxQuery","stringRep","toString","createQueryCache","uncacheRxQuery","queryCache","uncached","delete","countRxQuerySubscribers","refCount$","observers","length","DEFAULT_TRY_TO_KEEP_MAX","DEFAULT_UNEXECUTED_LIFETIME","defaultCacheReplacementPolicyMonad","tryToKeepMax","unExecutedLifetime","_collection","size","minUnExecutedLifetime","maybeUncache","queriesInCache","Array","from","values","_lastEnsureEqual","_creationTime","push","mustUncache","sortedByLastUsage","sort","a","b","toRemove","slice","forEach","defaultCacheReplacementPolicy","COLLECTIONS_WITH_RUNNING_CLEANUP","WeakSet","triggerCacheReplacement","rxCollection","has","add","then","destroyed","cacheReplacementPolicy","_queryCache"],"sources":["../../src/query-cache.ts"],"sourcesContent":["/**\n * the query-cache makes sure that on every query-state, exactly one instance can exist\n * if you use the same mango-query more then once, it will reuse the first RxQuery\n */\nimport type {\n RxQuery,\n RxCacheReplacementPolicy,\n RxCollection\n} from './types/index.d.ts';\nimport {\n getFromMapOrCreate,\n nextTick,\n now,\n requestIdlePromise\n} from './plugins/utils/index.ts';\n\nexport class QueryCache {\n public _map: Map = new Map();\n\n /**\n * check if an equal query is in the cache,\n * if true, return the cached one,\n * if false, save the given one and return it\n */\n getByQuery(rxQuery: RxQuery): RxQuery {\n const stringRep = rxQuery.toString();\n return getFromMapOrCreate(\n this._map,\n stringRep,\n () => rxQuery\n );\n }\n}\n\nexport function createQueryCache() {\n return new QueryCache();\n}\n\n\nexport function uncacheRxQuery(queryCache: QueryCache, rxQuery: RxQuery) {\n rxQuery.uncached = true;\n const stringRep = rxQuery.toString();\n queryCache._map.delete(stringRep);\n\n}\n\n\nexport function countRxQuerySubscribers(rxQuery: RxQuery): number {\n return rxQuery.refCount$.observers.length;\n}\n\n\nexport const DEFAULT_TRY_TO_KEEP_MAX = 100;\nexport const DEFAULT_UNEXECUTED_LIFETIME = 30 * 1000;\n\n/**\n * The default cache replacement policy\n * See docs-src/query-cache.md to learn how it should work.\n * Notice that this runs often and should block the cpu as less as possible\n * This is a monad which makes it easier to unit test\n */\nexport const defaultCacheReplacementPolicyMonad: (\n tryToKeepMax: number,\n unExecutedLifetime: number\n) => RxCacheReplacementPolicy = (\n tryToKeepMax,\n unExecutedLifetime\n) => (\n _collection: RxCollection,\n queryCache: QueryCache\n) => {\n if (queryCache._map.size < tryToKeepMax) {\n return;\n }\n\n const minUnExecutedLifetime = now() - unExecutedLifetime;\n const maybeUncache: RxQuery[] = [];\n\n const queriesInCache = Array.from(queryCache._map.values());\n for (const rxQuery of queriesInCache) {\n // filter out queries with subscribers\n if (countRxQuerySubscribers(rxQuery) > 0) {\n continue;\n }\n // directly uncache queries that never executed and are older then unExecutedLifetime\n if (rxQuery._lastEnsureEqual === 0 && rxQuery._creationTime < minUnExecutedLifetime) {\n uncacheRxQuery(queryCache, rxQuery);\n continue;\n }\n maybeUncache.push(rxQuery);\n }\n\n const mustUncache = maybeUncache.length - tryToKeepMax;\n if (mustUncache <= 0) {\n return;\n }\n\n const sortedByLastUsage = maybeUncache.sort((a, b) => a._lastEnsureEqual - b._lastEnsureEqual);\n const toRemove = sortedByLastUsage.slice(0, mustUncache);\n toRemove.forEach(rxQuery => uncacheRxQuery(queryCache, rxQuery));\n };\n\n\nexport const defaultCacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicyMonad(\n DEFAULT_TRY_TO_KEEP_MAX,\n DEFAULT_UNEXECUTED_LIFETIME\n);\n\nexport const COLLECTIONS_WITH_RUNNING_CLEANUP: WeakSet = new WeakSet();\n\n/**\n * Triggers the cache replacement policy after waitTime has passed.\n * We do not run this directly because at exactly the time a query is created,\n * we need all CPU to minimize latency.\n * Also this should not be triggered multiple times when waitTime is still waiting.\n */\nexport function triggerCacheReplacement(\n rxCollection: RxCollection\n) {\n if (COLLECTIONS_WITH_RUNNING_CLEANUP.has(rxCollection)) {\n // already started\n return;\n }\n\n COLLECTIONS_WITH_RUNNING_CLEANUP.add(rxCollection);\n\n /**\n * Do not run directly to not reduce result latency of a new query\n */\n nextTick() // wait at least one tick\n .then(() => requestIdlePromise(200)) // and then wait for the CPU to be idle\n .then(() => {\n if (!rxCollection.destroyed) {\n rxCollection.cacheReplacementPolicy(rxCollection, rxCollection._queryCache);\n }\n COLLECTIONS_WITH_RUNNING_CLEANUP.delete(rxCollection);\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"query-cache.js","names":["getFromMapOrCreate","nextTick","now","requestIdlePromise","QueryCache","_map","Map","_proto","prototype","getByQuery","rxQuery","stringRep","toString","createQueryCache","uncacheRxQuery","queryCache","uncached","delete","countRxQuerySubscribers","refCount$","observers","length","DEFAULT_TRY_TO_KEEP_MAX","DEFAULT_UNEXECUTED_LIFETIME","defaultCacheReplacementPolicyMonad","tryToKeepMax","unExecutedLifetime","_collection","size","minUnExecutedLifetime","maybeUncache","queriesInCache","Array","from","values","_lastEnsureEqual","_creationTime","push","mustUncache","sortedByLastUsage","sort","a","b","toRemove","slice","forEach","defaultCacheReplacementPolicy","COLLECTIONS_WITH_RUNNING_CLEANUP","WeakSet","triggerCacheReplacement","rxCollection","has","add","then","destroyed","cacheReplacementPolicy","_queryCache"],"sources":["../../src/query-cache.ts"],"sourcesContent":["/**\n * the query-cache makes sure that on every query-state, exactly one instance can exist\n * if you use the same mango-query more then once, it will reuse the first RxQuery\n */\nimport type {\n RxQuery,\n RxCacheReplacementPolicy,\n RxCollection\n} from './types/index.d.ts';\nimport {\n getFromMapOrCreate,\n nextTick,\n now,\n requestIdlePromise\n} from './plugins/utils/index.ts';\n\nexport class QueryCache {\n public _map: Map = new Map();\n\n /**\n * check if an equal query is in the cache,\n * if true, return the cached one,\n * if false, save the given one and return it\n */\n getByQuery(rxQuery: RxQuery): RxQuery {\n const stringRep = rxQuery.toString();\n return getFromMapOrCreate(\n this._map,\n stringRep,\n () => rxQuery\n );\n }\n}\n\nexport function createQueryCache() {\n return new QueryCache();\n}\n\n\nexport function uncacheRxQuery(queryCache: QueryCache, rxQuery: RxQuery) {\n rxQuery.uncached = true;\n const stringRep = rxQuery.toString();\n queryCache._map.delete(stringRep);\n\n}\n\n\nexport function countRxQuerySubscribers(rxQuery: RxQuery): number {\n return rxQuery.refCount$.observers.length;\n}\n\n\nexport const DEFAULT_TRY_TO_KEEP_MAX = 100;\nexport const DEFAULT_UNEXECUTED_LIFETIME = 30 * 1000;\n\n/**\n * The default cache replacement policy\n * See docs-src/query-cache.md to learn how it should work.\n * Notice that this runs often and should block the cpu as less as possible\n * This is a monad which makes it easier to unit test\n */\nexport const defaultCacheReplacementPolicyMonad: (\n tryToKeepMax: number,\n unExecutedLifetime: number\n) => RxCacheReplacementPolicy = (\n tryToKeepMax,\n unExecutedLifetime\n) => (\n _collection: RxCollection,\n queryCache: QueryCache\n) => {\n if (queryCache._map.size < tryToKeepMax) {\n return;\n }\n\n const minUnExecutedLifetime = now() - unExecutedLifetime;\n const maybeUncache: RxQuery[] = [];\n\n const queriesInCache = Array.from(queryCache._map.values());\n for (const rxQuery of queriesInCache) {\n // filter out queries with subscribers\n if (countRxQuerySubscribers(rxQuery) > 0) {\n continue;\n }\n // directly uncache queries that never executed and are older then unExecutedLifetime\n if (rxQuery._lastEnsureEqual === 0 && rxQuery._creationTime < minUnExecutedLifetime) {\n uncacheRxQuery(queryCache, rxQuery);\n continue;\n }\n maybeUncache.push(rxQuery);\n }\n\n const mustUncache = maybeUncache.length - tryToKeepMax;\n if (mustUncache <= 0) {\n return;\n }\n\n const sortedByLastUsage = maybeUncache.sort((a, b) => a._lastEnsureEqual - b._lastEnsureEqual);\n const toRemove = sortedByLastUsage.slice(0, mustUncache);\n toRemove.forEach(rxQuery => uncacheRxQuery(queryCache, rxQuery));\n };\n\n\nexport const defaultCacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicyMonad(\n DEFAULT_TRY_TO_KEEP_MAX,\n DEFAULT_UNEXECUTED_LIFETIME\n);\n\nexport const COLLECTIONS_WITH_RUNNING_CLEANUP: WeakSet = new WeakSet();\n\n/**\n * Triggers the cache replacement policy after waitTime has passed.\n * We do not run this directly because at exactly the time a query is created,\n * we need all CPU to minimize latency.\n * Also this should not be triggered multiple times when waitTime is still waiting.\n */\nexport function triggerCacheReplacement(\n rxCollection: RxCollection\n) {\n if (COLLECTIONS_WITH_RUNNING_CLEANUP.has(rxCollection)) {\n // already started\n return;\n }\n\n COLLECTIONS_WITH_RUNNING_CLEANUP.add(rxCollection);\n\n /**\n * Do not run directly to not reduce result latency of a new query\n */\n nextTick() // wait at least one tick\n .then(() => requestIdlePromise(200)) // and then wait for the CPU to be idle\n .then(() => {\n if (!rxCollection.destroyed) {\n rxCollection.cacheReplacementPolicy(rxCollection, rxCollection._queryCache);\n }\n COLLECTIONS_WITH_RUNNING_CLEANUP.delete(rxCollection);\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/rx-collection.js.map b/dist/esm/rx-collection.js.map index fab19b44210..c8c01b78e6b 100644 --- a/dist/esm/rx-collection.js.map +++ b/dist/esm/rx-collection.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-collection.js","names":["filter","map","mergeMap","ucfirst","flatClone","promiseSeries","pluginMissing","ensureNotFalsy","getFromMapOrThrow","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_VOID","fillObjectDataBeforeInsert","createRxCollectionStorageInstance","removeCollectionStorages","ensureRxCollectionIsNotDestroyed","createRxQuery","_getDefaultQuery","newRxError","newRxTypeError","DocumentCache","mapDocumentsDataToCacheDocs","createQueryCache","defaultCacheReplacementPolicy","createChangeEventBuffer","runAsyncPluginHooks","runPluginHooks","createNewRxDocument","getRxDocumentConstructor","getWrappedStorageInstance","throwIfIsStorageWriteError","defaultConflictHandler","IncrementalWriteQueue","beforeDocumentUpdateWrite","overwritable","HOOKS_WHEN","HOOKS_KEYS","hooksApplied","RxCollectionBase","database","name","schema","internalStorageInstance","instanceCreationOptions","migrationStrategies","methods","attachments","options","cacheReplacementPolicy","statics","conflictHandler","storageInstance","timeouts","Set","incrementalWriteQueue","_incrementalUpsertQueues","Map","synced","hooks","_subs","_docCache","_queryCache","$","checkpoint$","_changeEventBuffer","onDestroy","destroyed","onRemove","_applyHookFunctions","asRxCollection","_proto","prototype","prepare","jsonSchema","primaryPath","newData","oldData","result","_runHooks","collectionEventBulks$","eventBulks$","pipe","changeEventBulk","collectionName","events","checkpoint","documentConstructor","isLocal","b","docData","listenToRemoveSub","internalStore","changeStream","bulk","key","version","found","find","event","documentData","context","operation","subscribe","destroy","Promise","all","fn","push","databaseStorageToken","storageToken","subDocs","eventBulk","Array","length","rawEvents","deepFreezeWhenDevMode","index","documentId","previousDocumentData","id","internal","databaseToken","token","endTime","startTime","$emit","conflictResultionTasks","task","input","then","output","resolveConflictResultionTask","cleanup","_minimumDeletedTime","migrationNeeded","getMigrationState","startMigration","batchSize","migratePromise","insert","json","writeResult","bulkInsert","isError","error","insertResult","success","docsData","insertRows","hasHooks","useDocData","document","results","bulkWrite","rxDocuments","collection","ret","docsMap","forEach","row","doc","set","get","primary","bulkRemove","ids","rxDocumentMap","findByIds","exec","from","values","rxDocument","data","toMutableJSON","removeDocs","writeDoc","_deleted","previous","successIds","d","bulkUpsert","insertData","useJsonByDocId","useJson","slice","err","status","writeData","docDataInDb","documentInDb","getCachedRxDocuments","newDoc","incrementalModify","upsert","bulkResult","incrementalUpsert","queue","_incrementalUpsertEnsureRxDocumentExists","wasInserted","inserted","_incrementalUpsertUpdate","queryObj","query","findOne","isArray","selector","limit","count","mangoQuery","$in","exportJSON","importJSON","_exportedJSON","insertCRDT","_updateObj","addHook","when","fun","parallel","includes","boundFun","bind","runName","series","getHooks","instance","tasks","hook","_runHooksSync","promiseWait","time","res","timeout","setTimeout","delete","add","clearTimeout","requestIdlePromise","close","sub","unsubscribe","collections","remove","storage","password","hashFunction","_createClass","cE","colProto","Object","getPrototypeOf","fnName","_innerDoc","rxCollection","docDataFromCache","getLatestDocumentDataIfExists","resolve","createRxCollection","autoMigrate","localDocuments","storageInstanceCreationParams","databaseInstanceToken","databaseName","multiInstance","devMode","isDevMode","entries","funName","defineProperty","creator","catch","reject","isRxCollection","obj"],"sources":["../../src/rx-collection.ts"],"sourcesContent":["import {\n filter,\n map,\n mergeMap\n} from 'rxjs';\n\nimport {\n ucfirst,\n flatClone,\n promiseSeries,\n pluginMissing,\n ensureNotFalsy,\n getFromMapOrThrow,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_VOID\n} from './plugins/utils/index.ts';\nimport {\n fillObjectDataBeforeInsert,\n createRxCollectionStorageInstance,\n removeCollectionStorages,\n ensureRxCollectionIsNotDestroyed\n} from './rx-collection-helper.ts';\nimport {\n createRxQuery,\n _getDefaultQuery\n} from './rx-query.ts';\nimport {\n newRxError,\n newRxTypeError\n} from './rx-error.ts';\nimport type {\n RxMigrationState\n} from './plugins/migration-schema/index.ts';\nimport {\n DocumentCache,\n mapDocumentsDataToCacheDocs\n} from './doc-cache.ts';\nimport {\n QueryCache,\n createQueryCache,\n defaultCacheReplacementPolicy\n} from './query-cache.ts';\nimport {\n ChangeEventBuffer,\n createChangeEventBuffer\n} from './change-event-buffer.ts';\nimport {\n runAsyncPluginHooks,\n runPluginHooks\n} from './hooks.ts';\n\nimport {\n Subscription,\n Observable\n} from 'rxjs';\n\nimport type {\n KeyFunctionMap,\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxDumpCollection,\n RxDumpCollectionAny,\n MangoQuery,\n MangoQueryNoLimit,\n RxCacheReplacementPolicy,\n RxStorageWriteError,\n RxDocumentData,\n RxStorageInstanceCreationParams,\n BulkWriteRow,\n RxChangeEvent,\n RxChangeEventInsert,\n RxChangeEventUpdate,\n RxChangeEventDelete,\n RxStorageInstance,\n CollectionsOfDatabase,\n RxChangeEventBulk,\n RxLocalDocumentData,\n RxDocumentBase,\n RxConflictHandler,\n MaybePromise,\n CRDTEntry,\n MangoQuerySelectorAndIndex,\n MigrationStrategies\n} from './types/index.d.ts';\n\nimport {\n RxSchema\n} from './rx-schema.ts';\n\nimport {\n createNewRxDocument,\n getRxDocumentConstructor\n} from './rx-document-prototype-merge.ts';\nimport {\n getWrappedStorageInstance,\n throwIfIsStorageWriteError,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport { defaultConflictHandler } from './replication-protocol/index.ts';\nimport { IncrementalWriteQueue } from './incremental-write.ts';\nimport { beforeDocumentUpdateWrite } from './rx-document.ts';\nimport { overwritable } from './overwritable.ts';\n\nconst HOOKS_WHEN = ['pre', 'post'] as const;\ntype HookWhenType = typeof HOOKS_WHEN[number];\nconst HOOKS_KEYS = ['insert', 'save', 'remove', 'create'] as const;\ntype HookKeyType = typeof HOOKS_KEYS[number];\nlet hooksApplied = false;\n\nexport class RxCollectionBase<\n InstanceCreationOptions,\n RxDocumentType = { [prop: string]: any; },\n OrmMethods = {},\n StaticMethods = { [key: string]: any; },\n Reactivity = any\n> {\n\n\n /**\n * Stores all 'normal' documents\n */\n public storageInstance: WrappedRxStorageInstance = {} as any;\n public readonly timeouts: Set> = new Set();\n public incrementalWriteQueue: IncrementalWriteQueue = {} as any;\n\n constructor(\n public database: RxDatabase,\n public name: string,\n public schema: RxSchema,\n public internalStorageInstance: RxStorageInstance,\n public instanceCreationOptions: InstanceCreationOptions = {} as any,\n public migrationStrategies: MigrationStrategies = {},\n public methods: KeyFunctionMap = {},\n public attachments: KeyFunctionMap = {},\n public options: any = {},\n public cacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicy,\n public statics: KeyFunctionMap = {},\n public conflictHandler: RxConflictHandler = defaultConflictHandler\n ) {\n _applyHookFunctions(this.asRxCollection);\n }\n\n get insert$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'INSERT')\n ) as any;\n }\n get update$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'UPDATE')\n ) as any;\n }\n get remove$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'DELETE')\n ) as any;\n }\n\n public _incrementalUpsertQueues: Map> = new Map();\n // defaults\n public synced: boolean = false;\n public hooks: {\n [key in HookKeyType]: {\n [when in HookWhenType]: {\n series: Function[];\n parallel: Function[];\n };\n }\n } = {} as any;\n public _subs: Subscription[] = [];\n\n public _docCache: DocumentCache = {} as any;\n\n public _queryCache: QueryCache = createQueryCache();\n public $: Observable> = {} as any;\n public checkpoint$: Observable = {} as any;\n public _changeEventBuffer: ChangeEventBuffer = {} as ChangeEventBuffer;\n\n\n\n /**\n * When the collection is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed = false;\n\n public onRemove: (() => MaybePromise)[] = [];\n\n public async prepare(): Promise {\n this.storageInstance = getWrappedStorageInstance(\n this.database,\n this.internalStorageInstance,\n this.schema.jsonSchema\n );\n this.incrementalWriteQueue = new IncrementalWriteQueue(\n this.storageInstance,\n this.schema.primaryPath,\n (newData, oldData) => beforeDocumentUpdateWrite(this as any, newData, oldData),\n result => this._runHooks('post', 'save', result)\n );\n\n const collectionEventBulks$ = this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name),\n );\n this.$ = collectionEventBulks$.pipe(\n mergeMap(changeEventBulk => changeEventBulk.events),\n );\n this.checkpoint$ = collectionEventBulks$.pipe(\n map(changeEventBulk => changeEventBulk.checkpoint),\n );\n\n this._changeEventBuffer = createChangeEventBuffer(this.asRxCollection);\n let documentConstructor: any;\n this._docCache = new DocumentCache(\n this.schema.primaryPath,\n this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name && !changeEventBulk.events[0].isLocal),\n map(b => b.events)\n ),\n docData => {\n if (!documentConstructor) {\n documentConstructor = getRxDocumentConstructor(this.asRxCollection);\n }\n return createNewRxDocument(this.asRxCollection, documentConstructor, docData);\n }\n );\n\n\n const listenToRemoveSub = this.database.internalStore.changeStream().pipe(\n filter(bulk => {\n const key = this.name + '-' + this.schema.version;\n const found = bulk.events.find(event => {\n return (\n event.documentData.context === 'collection' &&\n event.documentData.key === key &&\n event.operation === 'DELETE'\n );\n });\n return !!found;\n })\n ).subscribe(async () => {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n });\n this._subs.push(listenToRemoveSub);\n\n\n /**\n * TODO Instead of resolving the EventBulk array here and spit it into\n * single events, we should fully work with event bulks internally\n * to save performance.\n */\n const databaseStorageToken = await this.database.storageToken;\n const subDocs = this.storageInstance.changeStream().subscribe(eventBulk => {\n const events = new Array(eventBulk.events.length);\n const rawEvents = eventBulk.events;\n const collectionName = this.name;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n for (let index = 0; index < rawEvents.length; index++) {\n const event = rawEvents[index];\n events[index] = {\n documentId: event.documentId,\n collectionName,\n isLocal: false,\n operation: event.operation,\n documentData: deepFreezeWhenDevMode(event.documentData) as any,\n previousDocumentData: deepFreezeWhenDevMode(event.previousDocumentData) as any\n };\n }\n const changeEventBulk: RxChangeEventBulk = {\n id: eventBulk.id,\n internal: false,\n collectionName: this.name,\n storageToken: databaseStorageToken,\n events,\n databaseToken: this.database.token,\n checkpoint: eventBulk.checkpoint,\n context: eventBulk.context,\n endTime: eventBulk.endTime,\n startTime: eventBulk.startTime\n };\n this.database.$emit(changeEventBulk);\n });\n this._subs.push(subDocs);\n\n /**\n * Resolve the conflict tasks\n * of the RxStorageInstance\n */\n this._subs.push(\n this.storageInstance\n .conflictResultionTasks()\n .subscribe(task => {\n this\n .conflictHandler(task.input, task.context)\n .then(output => {\n this.storageInstance.resolveConflictResultionTask({\n id: task.id,\n output\n });\n });\n })\n );\n\n return PROMISE_RESOLVE_VOID;\n }\n\n\n /**\n * Manually call the cleanup function of the storage.\n * @link https://rxdb.info/cleanup.html\n */\n cleanup(_minimumDeletedTime?: number): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n throw pluginMissing('cleanup');\n }\n\n // overwritten by migration-plugin\n migrationNeeded(): Promise {\n throw pluginMissing('migration-schema');\n }\n getMigrationState(): RxMigrationState {\n throw pluginMissing('migration-schema');\n }\n startMigration(batchSize: number = 10): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n return this.getMigrationState().startMigration(batchSize);\n }\n migratePromise(batchSize: number = 10): Promise {\n return this.getMigrationState().migratePromise(batchSize);\n }\n\n async insert(\n json: RxDocumentType | RxDocument\n ): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const writeResult = await this.bulkInsert([json as any]);\n\n const isError = writeResult.error[0];\n throwIfIsStorageWriteError(this as any, (json as any)[this.schema.primaryPath] as any, json, isError);\n const insertResult = ensureNotFalsy(writeResult.success[0]);\n return insertResult;\n }\n\n async bulkInsert(\n docsData: RxDocumentType[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (docsData.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const primaryPath = this.schema.primaryPath;\n\n\n /**\n * This code is a bit redundant for better performance.\n * Instead of iterating multiple times,\n * we directly transform the input to a write-row array.\n */\n let insertRows: BulkWriteRow[];\n if (this.hasHooks('pre', 'insert')) {\n insertRows = await Promise.all(\n docsData.map(docData => {\n const useDocData = fillObjectDataBeforeInsert(this.schema, docData);\n return this._runHooks('pre', 'insert', useDocData)\n .then(() => {\n return { document: useDocData };\n });\n })\n );\n } else {\n insertRows = new Array(docsData.length);\n const schema = this.schema;\n for (let index = 0; index < docsData.length; index++) {\n const docData = docsData[index];\n const useDocData = fillObjectDataBeforeInsert(schema, docData);\n insertRows[index] = { document: useDocData };\n }\n }\n\n const results = await this.storageInstance.bulkWrite(\n insertRows,\n 'rx-collection-bulk-insert'\n );\n\n\n /**\n * Often the user does not need to access the RxDocuments of the bulkInsert() call.\n * So we transform the data to RxDocuments only if needed to use less CPU performance.\n */\n let rxDocuments: RxDocument[];\n const collection = this;\n const ret = {\n get success() {\n if (!rxDocuments) {\n rxDocuments = mapDocumentsDataToCacheDocs(collection._docCache, results.success);\n }\n return rxDocuments;\n },\n error: results.error\n };\n\n if (this.hasHooks('post', 'insert')) {\n const docsMap: Map = new Map();\n insertRows.forEach(row => {\n const doc = row.document;\n docsMap.set((doc as any)[primaryPath] as any, doc);\n });\n await Promise.all(\n ret.success.map(doc => {\n return this._runHooks(\n 'post',\n 'insert',\n docsMap.get(doc.primary),\n doc\n );\n })\n );\n }\n\n return ret;\n }\n\n async bulkRemove(\n ids: string[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const primaryPath = this.schema.primaryPath;\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (ids.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const rxDocumentMap = await this.findByIds(ids).exec();\n const docsData: RxDocumentData[] = [];\n const docsMap: Map> = new Map();\n Array.from(rxDocumentMap.values()).forEach(rxDocument => {\n const data: RxDocumentData = rxDocument.toMutableJSON(true) as any;\n docsData.push(data);\n docsMap.set(rxDocument.primary, data);\n });\n\n await Promise.all(\n docsData.map(doc => {\n const primary = (doc as any)[this.schema.primaryPath];\n return this._runHooks('pre', 'remove', doc, rxDocumentMap.get(primary));\n })\n );\n const removeDocs: BulkWriteRow[] = docsData.map(doc => {\n const writeDoc = flatClone(doc);\n writeDoc._deleted = true;\n return {\n previous: doc,\n document: writeDoc\n };\n });\n const results = await this.storageInstance.bulkWrite(\n removeDocs,\n 'rx-collection-bulk-remove'\n );\n\n const successIds: string[] = results.success.map(d => d[primaryPath] as string);\n\n // run hooks\n await Promise.all(\n successIds.map(id => {\n return this._runHooks(\n 'post',\n 'remove',\n docsMap.get(id),\n rxDocumentMap.get(id)\n );\n })\n );\n\n const rxDocuments = successIds.map(id => getFromMapOrThrow(rxDocumentMap, id));\n\n return {\n success: rxDocuments,\n error: results.error\n };\n }\n\n /**\n * same as bulkInsert but overwrites existing document with same primary\n */\n async bulkUpsert(docsData: Partial[]): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const insertData: RxDocumentType[] = [];\n const useJsonByDocId: Map = new Map();\n docsData.forEach(docData => {\n const useJson = fillObjectDataBeforeInsert(this.schema, docData);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL3', {\n primaryPath: this.schema.primaryPath as string,\n data: useJson,\n schema: this.schema.jsonSchema\n });\n }\n useJsonByDocId.set(primary, useJson);\n insertData.push(useJson);\n });\n\n const insertResult = await this.bulkInsert(insertData);\n const success = insertResult.success.slice(0);\n const error: RxStorageWriteError[] = [];\n\n // update the ones that existed already\n await Promise.all(\n insertResult.error.map(async (err) => {\n if (err.status !== 409) {\n error.push(err);\n } else {\n const id = err.documentId;\n const writeData = getFromMapOrThrow(useJsonByDocId, id);\n const docDataInDb = ensureNotFalsy(err.documentInDb);\n const doc = this._docCache.getCachedRxDocuments([docDataInDb])[0];\n const newDoc = await doc.incrementalModify(() => writeData);\n success.push(newDoc);\n }\n })\n );\n return {\n error,\n success\n };\n }\n\n /**\n * same as insert but overwrites existing document with same primary\n */\n async upsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const bulkResult = await this.bulkUpsert([json]);\n throwIfIsStorageWriteError(\n this.asRxCollection,\n (json as any)[this.schema.primaryPath],\n json as any,\n bulkResult.error[0]\n );\n return bulkResult.success[0];\n }\n\n /**\n * upserts to a RxDocument, uses incrementalModify if document already exists\n */\n incrementalUpsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const useJson = fillObjectDataBeforeInsert(this.schema, json);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL4', {\n data: json\n });\n }\n\n // ensure that it won't try 2 parallel runs\n let queue = this._incrementalUpsertQueues.get(primary);\n if (!queue) {\n queue = PROMISE_RESOLVE_VOID;\n }\n queue = queue\n .then(() => _incrementalUpsertEnsureRxDocumentExists(this as any, primary as any, useJson))\n .then((wasInserted) => {\n if (!wasInserted.inserted) {\n return _incrementalUpsertUpdate(wasInserted.doc, useJson);\n } else {\n return wasInserted.doc;\n }\n });\n this._incrementalUpsertQueues.set(primary, queue);\n return queue;\n }\n\n find(queryObj?: MangoQuery): RxQuery<\n RxDocumentType,\n RxDocument[],\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (typeof queryObj === 'string') {\n throw newRxError('COL5', {\n queryObj\n });\n }\n\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n const query = createRxQuery('find', queryObj, this as any);\n return query as any;\n }\n\n findOne(\n queryObj?: MangoQueryNoLimit | string\n ): RxQuery<\n RxDocumentType,\n RxDocument | null,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n\n // TODO move this check to dev-mode plugin\n if (\n typeof queryObj === 'number' ||\n Array.isArray(queryObj)\n ) {\n throw newRxTypeError('COL6', {\n queryObj\n });\n }\n\n let query;\n\n if (typeof queryObj === 'string') {\n query = createRxQuery('findOne', {\n selector: {\n [this.schema.primaryPath]: queryObj\n },\n limit: 1\n }, this as any);\n } else {\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n\n // cannot have limit on findOne queries because it will be overwritten\n if ((queryObj as MangoQuery).limit) {\n throw newRxError('QU6');\n }\n\n queryObj = flatClone(queryObj);\n (queryObj as any).limit = 1;\n query = createRxQuery('findOne', queryObj, this as any);\n }\n\n\n return query as any;\n }\n\n count(queryObj?: MangoQuerySelectorAndIndex): RxQuery<\n RxDocumentType,\n number,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n const query = createRxQuery('count', queryObj, this as any);\n return query as any;\n }\n\n /**\n * find a list documents by their primary key\n * has way better performance then running multiple findOne() or a find() with a complex $or-selected\n */\n findByIds(\n ids: string[]\n ): RxQuery<\n RxDocumentType,\n Map>,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n const mangoQuery: MangoQuery = {\n selector: {\n [this.schema.primaryPath]: {\n $in: ids.slice(0)\n }\n } as any\n };\n const query = createRxQuery('findByIds', mangoQuery, this as any);\n return query as any;\n }\n\n /**\n * Export collection to a JSON friendly format.\n */\n exportJSON(): Promise>;\n exportJSON(): Promise>;\n exportJSON(): Promise {\n throw pluginMissing('json-dump');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n */\n importJSON(_exportedJSON: RxDumpCollectionAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n insertCRDT(_updateObj: CRDTEntry | CRDTEntry[]): RxDocument {\n throw pluginMissing('crdt');\n }\n\n /**\n * HOOKS\n */\n addHook(when: HookWhenType, key: HookKeyType, fun: any, parallel = false) {\n if (typeof fun !== 'function') {\n throw newRxTypeError('COL7', {\n key,\n when\n });\n }\n\n if (!HOOKS_WHEN.includes(when)) {\n throw newRxTypeError('COL8', {\n key,\n when\n });\n }\n\n if (!HOOKS_KEYS.includes(key)) {\n throw newRxError('COL9', {\n key\n });\n }\n\n if (when === 'post' && key === 'create' && parallel === true) {\n throw newRxError('COL10', {\n when,\n key,\n parallel\n });\n }\n\n // bind this-scope to hook-function\n const boundFun = fun.bind(this);\n\n const runName = parallel ? 'parallel' : 'series';\n\n this.hooks[key] = this.hooks[key] || {};\n this.hooks[key][when] = this.hooks[key][when] || {\n series: [],\n parallel: []\n };\n this.hooks[key][when][runName].push(boundFun);\n }\n\n getHooks(when: HookWhenType, key: HookKeyType) {\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return {\n series: [],\n parallel: []\n };\n }\n return this.hooks[key][when];\n }\n\n hasHooks(when: HookWhenType, key: HookKeyType) {\n /**\n * Performance shortcut\n * so that we not have to build the empty object.\n */\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return false;\n }\n\n const hooks = this.getHooks(when, key);\n if (!hooks) {\n return false;\n }\n return hooks.series.length > 0 || hooks.parallel.length > 0;\n }\n\n _runHooks(when: HookWhenType, key: HookKeyType, data: any, instance?: any): Promise {\n const hooks = this.getHooks(when, key);\n\n if (!hooks) {\n return PROMISE_RESOLVE_VOID;\n }\n\n // run parallel: false\n const tasks = hooks.series.map((hook: any) => () => hook(data, instance));\n return promiseSeries(tasks)\n // run parallel: true\n .then(() => Promise.all(\n hooks.parallel\n .map((hook: any) => hook(data, instance))\n ));\n }\n\n /**\n * does the same as ._runHooks() but with non-async-functions\n */\n _runHooksSync(when: HookWhenType, key: HookKeyType, data: any, instance: any) {\n if (!this.hasHooks(when, key)) {\n return;\n }\n const hooks = this.getHooks(when, key);\n if (!hooks) return;\n hooks.series.forEach((hook: any) => hook(data, instance));\n }\n\n /**\n * Returns a promise that resolves after the given time.\n * Ensures that is properly cleans up when the collection is destroyed\n * so that no running timeouts prevent the exit of the JavaScript process.\n */\n promiseWait(time: number): Promise {\n const ret = new Promise(res => {\n const timeout = setTimeout(() => {\n this.timeouts.delete(timeout);\n res();\n }, time);\n this.timeouts.add(timeout);\n });\n return ret;\n }\n\n async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n\n await Promise.all(this.onDestroy.map(fn => fn()));\n\n /**\n * Settings destroyed = true\n * must be the first thing to do,\n * so for example the replication can directly stop\n * instead of sending requests to a closed storage.\n */\n this.destroyed = true;\n\n\n Array.from(this.timeouts).forEach(timeout => clearTimeout(timeout));\n if (this._changeEventBuffer) {\n this._changeEventBuffer.destroy();\n }\n /**\n * First wait until the whole database is idle.\n * This ensures that the storage does not get closed\n * while some operation is running.\n * It is important that we do not intercept a running call\n * because it might lead to undefined behavior like when a doc is written\n * but the change is not added to the changes collection.\n */\n return this.database.requestIdlePromise()\n .then(() => this.storageInstance.close())\n .then(() => {\n /**\n * Unsubscribing must be done AFTER the storageInstance.close()\n * Because the conflict handling is part of the subscriptions and\n * otherwise there might be open conflicts to be resolved which\n * will then stuck and never resolve.\n */\n this._subs.forEach(sub => sub.unsubscribe());\n\n delete this.database.collections[this.name];\n return runAsyncPluginHooks('postDestroyRxCollection', this).then(() => true);\n });\n }\n\n /**\n * remove all data of the collection\n */\n async remove(): Promise {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n await removeCollectionStorages(\n this.database.storage,\n this.database.internalStore,\n this.database.token,\n this.database.name,\n this.name,\n this.database.password,\n this.database.hashFunction\n );\n }\n\n get asRxCollection(): RxCollection {\n return this as any;\n }\n}\n\n/**\n * adds the hook-functions to the collections prototype\n * this runs only once\n */\nfunction _applyHookFunctions(\n collection: RxCollection\n) {\n if (hooksApplied) return; // already run\n hooksApplied = true;\n const colProto = Object.getPrototypeOf(collection);\n HOOKS_KEYS.forEach(key => {\n HOOKS_WHEN.map(when => {\n const fnName = when + ucfirst(key);\n colProto[fnName] = function (fun: string, parallel: boolean) {\n return this.addHook(when, key, fun, parallel);\n };\n });\n });\n}\n\nfunction _incrementalUpsertUpdate(\n doc: RxDocumentBase,\n json: RxDocumentData\n): Promise> {\n return doc.incrementalModify((_innerDoc) => {\n return json;\n });\n}\n\n/**\n * ensures that the given document exists\n * @return promise that resolves with new doc and flag if inserted\n */\nfunction _incrementalUpsertEnsureRxDocumentExists(\n rxCollection: RxCollection,\n primary: string,\n json: any\n): Promise<\n {\n doc: RxDocument;\n inserted: boolean;\n }\n> {\n /**\n * Optimisation shortcut,\n * first try to find the document in the doc-cache\n */\n const docDataFromCache = rxCollection._docCache.getLatestDocumentDataIfExists(primary);\n if (docDataFromCache) {\n return Promise.resolve({\n doc: rxCollection._docCache.getCachedRxDocuments([docDataFromCache])[0],\n inserted: false\n });\n }\n return rxCollection.findOne(primary).exec()\n .then(doc => {\n if (!doc) {\n return rxCollection.insert(json).then(newDoc => ({\n doc: newDoc,\n inserted: true\n }));\n } else {\n return {\n doc,\n inserted: false\n };\n }\n });\n}\n\n/**\n * creates and prepares a new collection\n */\nexport function createRxCollection(\n {\n database,\n name,\n schema,\n instanceCreationOptions = {},\n migrationStrategies = {},\n autoMigrate = true,\n statics = {},\n methods = {},\n attachments = {},\n options = {},\n localDocuments = false,\n cacheReplacementPolicy = defaultCacheReplacementPolicy,\n conflictHandler = defaultConflictHandler\n }: any\n): Promise {\n const storageInstanceCreationParams: RxStorageInstanceCreationParams = {\n databaseInstanceToken: database.token,\n databaseName: database.name,\n collectionName: name,\n schema: schema.jsonSchema,\n options: instanceCreationOptions,\n multiInstance: database.multiInstance,\n password: database.password,\n devMode: overwritable.isDevMode()\n };\n\n runPluginHooks(\n 'preCreateRxStorageInstance',\n storageInstanceCreationParams\n );\n\n return createRxCollectionStorageInstance(\n database,\n storageInstanceCreationParams\n ).then(storageInstance => {\n const collection = new RxCollectionBase(\n database,\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n statics,\n conflictHandler\n );\n\n return collection\n .prepare()\n .then(() => {\n // ORM add statics\n Object\n .entries(statics)\n .forEach(([funName, fun]) => {\n Object.defineProperty(collection, funName, {\n get: () => (fun as any).bind(collection)\n });\n });\n\n let ret = PROMISE_RESOLVE_VOID;\n if (autoMigrate && collection.schema.version !== 0) {\n ret = collection.migratePromise();\n }\n return ret;\n })\n .then(() => {\n runPluginHooks('createRxCollection', {\n collection,\n creator: {\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n localDocuments,\n statics\n }\n });\n return collection as any;\n })\n /**\n * If the collection creation fails,\n * we yet have to close the storage instances.\n */\n .catch(err => {\n return storageInstance.close()\n .then(() => Promise.reject(err));\n });\n });\n}\n\nexport function isRxCollection(obj: any): boolean {\n return obj instanceof RxCollectionBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-collection.js","names":["filter","map","mergeMap","ucfirst","flatClone","promiseSeries","pluginMissing","ensureNotFalsy","getFromMapOrThrow","PROMISE_RESOLVE_FALSE","PROMISE_RESOLVE_VOID","fillObjectDataBeforeInsert","createRxCollectionStorageInstance","removeCollectionStorages","ensureRxCollectionIsNotDestroyed","createRxQuery","_getDefaultQuery","newRxError","newRxTypeError","DocumentCache","mapDocumentsDataToCacheDocs","createQueryCache","defaultCacheReplacementPolicy","createChangeEventBuffer","runAsyncPluginHooks","runPluginHooks","createNewRxDocument","getRxDocumentConstructor","getWrappedStorageInstance","throwIfIsStorageWriteError","defaultConflictHandler","IncrementalWriteQueue","beforeDocumentUpdateWrite","overwritable","HOOKS_WHEN","HOOKS_KEYS","hooksApplied","RxCollectionBase","database","name","schema","internalStorageInstance","instanceCreationOptions","migrationStrategies","methods","attachments","options","cacheReplacementPolicy","statics","conflictHandler","storageInstance","timeouts","Set","incrementalWriteQueue","_incrementalUpsertQueues","Map","synced","hooks","_subs","_docCache","_queryCache","$","checkpoint$","_changeEventBuffer","onDestroy","destroyed","onRemove","_applyHookFunctions","asRxCollection","_proto","prototype","prepare","jsonSchema","primaryPath","newData","oldData","result","_runHooks","collectionEventBulks$","eventBulks$","pipe","changeEventBulk","collectionName","events","checkpoint","documentConstructor","isLocal","b","docData","listenToRemoveSub","internalStore","changeStream","bulk","key","version","found","find","event","documentData","context","operation","subscribe","destroy","Promise","all","fn","push","databaseStorageToken","storageToken","subDocs","eventBulk","Array","length","rawEvents","deepFreezeWhenDevMode","index","documentId","previousDocumentData","id","internal","databaseToken","token","endTime","startTime","$emit","conflictResultionTasks","task","input","then","output","resolveConflictResultionTask","cleanup","_minimumDeletedTime","migrationNeeded","getMigrationState","startMigration","batchSize","migratePromise","insert","json","writeResult","bulkInsert","isError","error","insertResult","success","docsData","insertRows","hasHooks","useDocData","document","results","bulkWrite","rxDocuments","collection","ret","docsMap","forEach","row","doc","set","get","primary","bulkRemove","ids","rxDocumentMap","findByIds","exec","from","values","rxDocument","data","toMutableJSON","removeDocs","writeDoc","_deleted","previous","successIds","d","bulkUpsert","insertData","useJsonByDocId","useJson","slice","err","status","writeData","docDataInDb","documentInDb","getCachedRxDocuments","newDoc","incrementalModify","upsert","bulkResult","incrementalUpsert","queue","_incrementalUpsertEnsureRxDocumentExists","wasInserted","inserted","_incrementalUpsertUpdate","queryObj","query","findOne","isArray","selector","limit","count","mangoQuery","$in","exportJSON","importJSON","_exportedJSON","insertCRDT","_updateObj","addHook","when","fun","parallel","includes","boundFun","bind","runName","series","getHooks","instance","tasks","hook","_runHooksSync","promiseWait","time","res","timeout","setTimeout","delete","add","clearTimeout","requestIdlePromise","close","sub","unsubscribe","collections","remove","storage","password","hashFunction","_createClass","cE","colProto","Object","getPrototypeOf","fnName","_innerDoc","rxCollection","docDataFromCache","getLatestDocumentDataIfExists","resolve","createRxCollection","autoMigrate","localDocuments","storageInstanceCreationParams","databaseInstanceToken","databaseName","multiInstance","devMode","isDevMode","entries","funName","defineProperty","creator","catch","reject","isRxCollection","obj"],"sources":["../../src/rx-collection.ts"],"sourcesContent":["import {\n filter,\n map,\n mergeMap\n} from 'rxjs';\n\nimport {\n ucfirst,\n flatClone,\n promiseSeries,\n pluginMissing,\n ensureNotFalsy,\n getFromMapOrThrow,\n PROMISE_RESOLVE_FALSE,\n PROMISE_RESOLVE_VOID\n} from './plugins/utils/index.ts';\nimport {\n fillObjectDataBeforeInsert,\n createRxCollectionStorageInstance,\n removeCollectionStorages,\n ensureRxCollectionIsNotDestroyed\n} from './rx-collection-helper.ts';\nimport {\n createRxQuery,\n _getDefaultQuery\n} from './rx-query.ts';\nimport {\n newRxError,\n newRxTypeError\n} from './rx-error.ts';\nimport type {\n RxMigrationState\n} from './plugins/migration-schema/index.ts';\nimport {\n DocumentCache,\n mapDocumentsDataToCacheDocs\n} from './doc-cache.ts';\nimport {\n QueryCache,\n createQueryCache,\n defaultCacheReplacementPolicy\n} from './query-cache.ts';\nimport {\n ChangeEventBuffer,\n createChangeEventBuffer\n} from './change-event-buffer.ts';\nimport {\n runAsyncPluginHooks,\n runPluginHooks\n} from './hooks.ts';\n\nimport {\n Subscription,\n Observable\n} from 'rxjs';\n\nimport type {\n KeyFunctionMap,\n RxCollection,\n RxDatabase,\n RxQuery,\n RxDocument,\n RxDumpCollection,\n RxDumpCollectionAny,\n MangoQuery,\n MangoQueryNoLimit,\n RxCacheReplacementPolicy,\n RxStorageWriteError,\n RxDocumentData,\n RxStorageInstanceCreationParams,\n BulkWriteRow,\n RxChangeEvent,\n RxChangeEventInsert,\n RxChangeEventUpdate,\n RxChangeEventDelete,\n RxStorageInstance,\n CollectionsOfDatabase,\n RxChangeEventBulk,\n RxLocalDocumentData,\n RxDocumentBase,\n RxConflictHandler,\n MaybePromise,\n CRDTEntry,\n MangoQuerySelectorAndIndex,\n MigrationStrategies\n} from './types/index.d.ts';\n\nimport {\n RxSchema\n} from './rx-schema.ts';\n\nimport {\n createNewRxDocument,\n getRxDocumentConstructor\n} from './rx-document-prototype-merge.ts';\nimport {\n getWrappedStorageInstance,\n throwIfIsStorageWriteError,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport { defaultConflictHandler } from './replication-protocol/index.ts';\nimport { IncrementalWriteQueue } from './incremental-write.ts';\nimport { beforeDocumentUpdateWrite } from './rx-document.ts';\nimport { overwritable } from './overwritable.ts';\n\nconst HOOKS_WHEN = ['pre', 'post'] as const;\ntype HookWhenType = typeof HOOKS_WHEN[number];\nconst HOOKS_KEYS = ['insert', 'save', 'remove', 'create'] as const;\ntype HookKeyType = typeof HOOKS_KEYS[number];\nlet hooksApplied = false;\n\nexport class RxCollectionBase<\n InstanceCreationOptions,\n RxDocumentType = { [prop: string]: any; },\n OrmMethods = {},\n StaticMethods = { [key: string]: any; },\n Reactivity = any\n> {\n\n\n /**\n * Stores all 'normal' documents\n */\n public storageInstance: WrappedRxStorageInstance = {} as any;\n public readonly timeouts: Set> = new Set();\n public incrementalWriteQueue: IncrementalWriteQueue = {} as any;\n\n constructor(\n public database: RxDatabase,\n public name: string,\n public schema: RxSchema,\n public internalStorageInstance: RxStorageInstance,\n public instanceCreationOptions: InstanceCreationOptions = {} as any,\n public migrationStrategies: MigrationStrategies = {},\n public methods: KeyFunctionMap = {},\n public attachments: KeyFunctionMap = {},\n public options: any = {},\n public cacheReplacementPolicy: RxCacheReplacementPolicy = defaultCacheReplacementPolicy,\n public statics: KeyFunctionMap = {},\n public conflictHandler: RxConflictHandler = defaultConflictHandler\n ) {\n _applyHookFunctions(this.asRxCollection);\n }\n\n get insert$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'INSERT')\n ) as any;\n }\n get update$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'UPDATE')\n ) as any;\n }\n get remove$(): Observable> {\n return this.$.pipe(\n filter(cE => cE.operation === 'DELETE')\n ) as any;\n }\n\n public _incrementalUpsertQueues: Map> = new Map();\n // defaults\n public synced: boolean = false;\n public hooks: {\n [key in HookKeyType]: {\n [when in HookWhenType]: {\n series: Function[];\n parallel: Function[];\n };\n }\n } = {} as any;\n public _subs: Subscription[] = [];\n\n public _docCache: DocumentCache = {} as any;\n\n public _queryCache: QueryCache = createQueryCache();\n public $: Observable> = {} as any;\n public checkpoint$: Observable = {} as any;\n public _changeEventBuffer: ChangeEventBuffer = {} as ChangeEventBuffer;\n\n\n\n /**\n * When the collection is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed = false;\n\n public onRemove: (() => MaybePromise)[] = [];\n\n public async prepare(): Promise {\n this.storageInstance = getWrappedStorageInstance(\n this.database,\n this.internalStorageInstance,\n this.schema.jsonSchema\n );\n this.incrementalWriteQueue = new IncrementalWriteQueue(\n this.storageInstance,\n this.schema.primaryPath,\n (newData, oldData) => beforeDocumentUpdateWrite(this as any, newData, oldData),\n result => this._runHooks('post', 'save', result)\n );\n\n const collectionEventBulks$ = this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name),\n );\n this.$ = collectionEventBulks$.pipe(\n mergeMap(changeEventBulk => changeEventBulk.events),\n );\n this.checkpoint$ = collectionEventBulks$.pipe(\n map(changeEventBulk => changeEventBulk.checkpoint),\n );\n\n this._changeEventBuffer = createChangeEventBuffer(this.asRxCollection);\n let documentConstructor: any;\n this._docCache = new DocumentCache(\n this.schema.primaryPath,\n this.database.eventBulks$.pipe(\n filter(changeEventBulk => changeEventBulk.collectionName === this.name && !changeEventBulk.events[0].isLocal),\n map(b => b.events)\n ),\n docData => {\n if (!documentConstructor) {\n documentConstructor = getRxDocumentConstructor(this.asRxCollection);\n }\n return createNewRxDocument(this.asRxCollection, documentConstructor, docData);\n }\n );\n\n\n const listenToRemoveSub = this.database.internalStore.changeStream().pipe(\n filter(bulk => {\n const key = this.name + '-' + this.schema.version;\n const found = bulk.events.find(event => {\n return (\n event.documentData.context === 'collection' &&\n event.documentData.key === key &&\n event.operation === 'DELETE'\n );\n });\n return !!found;\n })\n ).subscribe(async () => {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n });\n this._subs.push(listenToRemoveSub);\n\n\n /**\n * TODO Instead of resolving the EventBulk array here and spit it into\n * single events, we should fully work with event bulks internally\n * to save performance.\n */\n const databaseStorageToken = await this.database.storageToken;\n const subDocs = this.storageInstance.changeStream().subscribe(eventBulk => {\n const events = new Array(eventBulk.events.length);\n const rawEvents = eventBulk.events;\n const collectionName = this.name;\n const deepFreezeWhenDevMode = overwritable.deepFreezeWhenDevMode;\n for (let index = 0; index < rawEvents.length; index++) {\n const event = rawEvents[index];\n events[index] = {\n documentId: event.documentId,\n collectionName,\n isLocal: false,\n operation: event.operation,\n documentData: deepFreezeWhenDevMode(event.documentData) as any,\n previousDocumentData: deepFreezeWhenDevMode(event.previousDocumentData) as any\n };\n }\n const changeEventBulk: RxChangeEventBulk = {\n id: eventBulk.id,\n internal: false,\n collectionName: this.name,\n storageToken: databaseStorageToken,\n events,\n databaseToken: this.database.token,\n checkpoint: eventBulk.checkpoint,\n context: eventBulk.context,\n endTime: eventBulk.endTime,\n startTime: eventBulk.startTime\n };\n this.database.$emit(changeEventBulk);\n });\n this._subs.push(subDocs);\n\n /**\n * Resolve the conflict tasks\n * of the RxStorageInstance\n */\n this._subs.push(\n this.storageInstance\n .conflictResultionTasks()\n .subscribe(task => {\n this\n .conflictHandler(task.input, task.context)\n .then(output => {\n this.storageInstance.resolveConflictResultionTask({\n id: task.id,\n output\n });\n });\n })\n );\n\n return PROMISE_RESOLVE_VOID;\n }\n\n\n /**\n * Manually call the cleanup function of the storage.\n * @link https://rxdb.info/cleanup.html\n */\n cleanup(_minimumDeletedTime?: number): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n throw pluginMissing('cleanup');\n }\n\n // overwritten by migration-plugin\n migrationNeeded(): Promise {\n throw pluginMissing('migration-schema');\n }\n getMigrationState(): RxMigrationState {\n throw pluginMissing('migration-schema');\n }\n startMigration(batchSize: number = 10): Promise {\n ensureRxCollectionIsNotDestroyed(this);\n return this.getMigrationState().startMigration(batchSize);\n }\n migratePromise(batchSize: number = 10): Promise {\n return this.getMigrationState().migratePromise(batchSize);\n }\n\n async insert(\n json: RxDocumentType | RxDocument\n ): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const writeResult = await this.bulkInsert([json as any]);\n\n const isError = writeResult.error[0];\n throwIfIsStorageWriteError(this as any, (json as any)[this.schema.primaryPath] as any, json, isError);\n const insertResult = ensureNotFalsy(writeResult.success[0]);\n return insertResult;\n }\n\n async bulkInsert(\n docsData: RxDocumentType[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (docsData.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const primaryPath = this.schema.primaryPath;\n\n\n /**\n * This code is a bit redundant for better performance.\n * Instead of iterating multiple times,\n * we directly transform the input to a write-row array.\n */\n let insertRows: BulkWriteRow[];\n if (this.hasHooks('pre', 'insert')) {\n insertRows = await Promise.all(\n docsData.map(docData => {\n const useDocData = fillObjectDataBeforeInsert(this.schema, docData);\n return this._runHooks('pre', 'insert', useDocData)\n .then(() => {\n return { document: useDocData };\n });\n })\n );\n } else {\n insertRows = new Array(docsData.length);\n const schema = this.schema;\n for (let index = 0; index < docsData.length; index++) {\n const docData = docsData[index];\n const useDocData = fillObjectDataBeforeInsert(schema, docData);\n insertRows[index] = { document: useDocData };\n }\n }\n\n const results = await this.storageInstance.bulkWrite(\n insertRows,\n 'rx-collection-bulk-insert'\n );\n\n\n /**\n * Often the user does not need to access the RxDocuments of the bulkInsert() call.\n * So we transform the data to RxDocuments only if needed to use less CPU performance.\n */\n let rxDocuments: RxDocument[];\n const collection = this;\n const ret = {\n get success() {\n if (!rxDocuments) {\n rxDocuments = mapDocumentsDataToCacheDocs(collection._docCache, results.success);\n }\n return rxDocuments;\n },\n error: results.error\n };\n\n if (this.hasHooks('post', 'insert')) {\n const docsMap: Map = new Map();\n insertRows.forEach(row => {\n const doc = row.document;\n docsMap.set((doc as any)[primaryPath] as any, doc);\n });\n await Promise.all(\n ret.success.map(doc => {\n return this._runHooks(\n 'post',\n 'insert',\n docsMap.get(doc.primary),\n doc\n );\n })\n );\n }\n\n return ret;\n }\n\n async bulkRemove(\n ids: string[]\n ): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const primaryPath = this.schema.primaryPath;\n /**\n * Optimization shortcut,\n * do nothing when called with an empty array\n */\n if (ids.length === 0) {\n return {\n success: [],\n error: []\n };\n }\n\n const rxDocumentMap = await this.findByIds(ids).exec();\n const docsData: RxDocumentData[] = [];\n const docsMap: Map> = new Map();\n Array.from(rxDocumentMap.values()).forEach(rxDocument => {\n const data: RxDocumentData = rxDocument.toMutableJSON(true) as any;\n docsData.push(data);\n docsMap.set(rxDocument.primary, data);\n });\n\n await Promise.all(\n docsData.map(doc => {\n const primary = (doc as any)[this.schema.primaryPath];\n return this._runHooks('pre', 'remove', doc, rxDocumentMap.get(primary));\n })\n );\n const removeDocs: BulkWriteRow[] = docsData.map(doc => {\n const writeDoc = flatClone(doc);\n writeDoc._deleted = true;\n return {\n previous: doc,\n document: writeDoc\n };\n });\n const results = await this.storageInstance.bulkWrite(\n removeDocs,\n 'rx-collection-bulk-remove'\n );\n\n const successIds: string[] = results.success.map(d => d[primaryPath] as string);\n\n // run hooks\n await Promise.all(\n successIds.map(id => {\n return this._runHooks(\n 'post',\n 'remove',\n docsMap.get(id),\n rxDocumentMap.get(id)\n );\n })\n );\n\n const rxDocuments = successIds.map(id => getFromMapOrThrow(rxDocumentMap, id));\n\n return {\n success: rxDocuments,\n error: results.error\n };\n }\n\n /**\n * same as bulkInsert but overwrites existing document with same primary\n */\n async bulkUpsert(docsData: Partial[]): Promise<{\n success: RxDocument[];\n error: RxStorageWriteError[];\n }> {\n ensureRxCollectionIsNotDestroyed(this);\n const insertData: RxDocumentType[] = [];\n const useJsonByDocId: Map = new Map();\n docsData.forEach(docData => {\n const useJson = fillObjectDataBeforeInsert(this.schema, docData);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL3', {\n primaryPath: this.schema.primaryPath as string,\n data: useJson,\n schema: this.schema.jsonSchema\n });\n }\n useJsonByDocId.set(primary, useJson);\n insertData.push(useJson);\n });\n\n const insertResult = await this.bulkInsert(insertData);\n const success = insertResult.success.slice(0);\n const error: RxStorageWriteError[] = [];\n\n // update the ones that existed already\n await Promise.all(\n insertResult.error.map(async (err) => {\n if (err.status !== 409) {\n error.push(err);\n } else {\n const id = err.documentId;\n const writeData = getFromMapOrThrow(useJsonByDocId, id);\n const docDataInDb = ensureNotFalsy(err.documentInDb);\n const doc = this._docCache.getCachedRxDocuments([docDataInDb])[0];\n const newDoc = await doc.incrementalModify(() => writeData);\n success.push(newDoc);\n }\n })\n );\n return {\n error,\n success\n };\n }\n\n /**\n * same as insert but overwrites existing document with same primary\n */\n async upsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const bulkResult = await this.bulkUpsert([json]);\n throwIfIsStorageWriteError(\n this.asRxCollection,\n (json as any)[this.schema.primaryPath],\n json as any,\n bulkResult.error[0]\n );\n return bulkResult.success[0];\n }\n\n /**\n * upserts to a RxDocument, uses incrementalModify if document already exists\n */\n incrementalUpsert(json: Partial): Promise> {\n ensureRxCollectionIsNotDestroyed(this);\n const useJson = fillObjectDataBeforeInsert(this.schema, json);\n const primary: string = useJson[this.schema.primaryPath] as any;\n if (!primary) {\n throw newRxError('COL4', {\n data: json\n });\n }\n\n // ensure that it won't try 2 parallel runs\n let queue = this._incrementalUpsertQueues.get(primary);\n if (!queue) {\n queue = PROMISE_RESOLVE_VOID;\n }\n queue = queue\n .then(() => _incrementalUpsertEnsureRxDocumentExists(this as any, primary as any, useJson))\n .then((wasInserted) => {\n if (!wasInserted.inserted) {\n return _incrementalUpsertUpdate(wasInserted.doc, useJson);\n } else {\n return wasInserted.doc;\n }\n });\n this._incrementalUpsertQueues.set(primary, queue);\n return queue;\n }\n\n find(queryObj?: MangoQuery): RxQuery<\n RxDocumentType,\n RxDocument[],\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (typeof queryObj === 'string') {\n throw newRxError('COL5', {\n queryObj\n });\n }\n\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n const query = createRxQuery('find', queryObj, this as any);\n return query as any;\n }\n\n findOne(\n queryObj?: MangoQueryNoLimit | string\n ): RxQuery<\n RxDocumentType,\n RxDocument | null,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n\n // TODO move this check to dev-mode plugin\n if (\n typeof queryObj === 'number' ||\n Array.isArray(queryObj)\n ) {\n throw newRxTypeError('COL6', {\n queryObj\n });\n }\n\n let query;\n\n if (typeof queryObj === 'string') {\n query = createRxQuery('findOne', {\n selector: {\n [this.schema.primaryPath]: queryObj\n },\n limit: 1\n }, this as any);\n } else {\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n\n\n // cannot have limit on findOne queries because it will be overwritten\n if ((queryObj as MangoQuery).limit) {\n throw newRxError('QU6');\n }\n\n queryObj = flatClone(queryObj);\n (queryObj as any).limit = 1;\n query = createRxQuery('findOne', queryObj, this as any);\n }\n\n\n return query as any;\n }\n\n count(queryObj?: MangoQuerySelectorAndIndex): RxQuery<\n RxDocumentType,\n number,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n if (!queryObj) {\n queryObj = _getDefaultQuery();\n }\n const query = createRxQuery('count', queryObj, this as any);\n return query as any;\n }\n\n /**\n * find a list documents by their primary key\n * has way better performance then running multiple findOne() or a find() with a complex $or-selected\n */\n findByIds(\n ids: string[]\n ): RxQuery<\n RxDocumentType,\n Map>,\n OrmMethods,\n Reactivity\n > {\n ensureRxCollectionIsNotDestroyed(this);\n const mangoQuery: MangoQuery = {\n selector: {\n [this.schema.primaryPath]: {\n $in: ids.slice(0)\n }\n } as any\n };\n const query = createRxQuery('findByIds', mangoQuery, this as any);\n return query as any;\n }\n\n /**\n * Export collection to a JSON friendly format.\n */\n exportJSON(): Promise>;\n exportJSON(): Promise>;\n exportJSON(): Promise {\n throw pluginMissing('json-dump');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n */\n importJSON(_exportedJSON: RxDumpCollectionAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n insertCRDT(_updateObj: CRDTEntry | CRDTEntry[]): RxDocument {\n throw pluginMissing('crdt');\n }\n\n /**\n * HOOKS\n */\n addHook(when: HookWhenType, key: HookKeyType, fun: any, parallel = false) {\n if (typeof fun !== 'function') {\n throw newRxTypeError('COL7', {\n key,\n when\n });\n }\n\n if (!HOOKS_WHEN.includes(when)) {\n throw newRxTypeError('COL8', {\n key,\n when\n });\n }\n\n if (!HOOKS_KEYS.includes(key)) {\n throw newRxError('COL9', {\n key\n });\n }\n\n if (when === 'post' && key === 'create' && parallel === true) {\n throw newRxError('COL10', {\n when,\n key,\n parallel\n });\n }\n\n // bind this-scope to hook-function\n const boundFun = fun.bind(this);\n\n const runName = parallel ? 'parallel' : 'series';\n\n this.hooks[key] = this.hooks[key] || {};\n this.hooks[key][when] = this.hooks[key][when] || {\n series: [],\n parallel: []\n };\n this.hooks[key][when][runName].push(boundFun);\n }\n\n getHooks(when: HookWhenType, key: HookKeyType) {\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return {\n series: [],\n parallel: []\n };\n }\n return this.hooks[key][when];\n }\n\n hasHooks(when: HookWhenType, key: HookKeyType) {\n /**\n * Performance shortcut\n * so that we not have to build the empty object.\n */\n if (\n !this.hooks[key] ||\n !this.hooks[key][when]\n ) {\n return false;\n }\n\n const hooks = this.getHooks(when, key);\n if (!hooks) {\n return false;\n }\n return hooks.series.length > 0 || hooks.parallel.length > 0;\n }\n\n _runHooks(when: HookWhenType, key: HookKeyType, data: any, instance?: any): Promise {\n const hooks = this.getHooks(when, key);\n\n if (!hooks) {\n return PROMISE_RESOLVE_VOID;\n }\n\n // run parallel: false\n const tasks = hooks.series.map((hook: any) => () => hook(data, instance));\n return promiseSeries(tasks)\n // run parallel: true\n .then(() => Promise.all(\n hooks.parallel\n .map((hook: any) => hook(data, instance))\n ));\n }\n\n /**\n * does the same as ._runHooks() but with non-async-functions\n */\n _runHooksSync(when: HookWhenType, key: HookKeyType, data: any, instance: any) {\n if (!this.hasHooks(when, key)) {\n return;\n }\n const hooks = this.getHooks(when, key);\n if (!hooks) return;\n hooks.series.forEach((hook: any) => hook(data, instance));\n }\n\n /**\n * Returns a promise that resolves after the given time.\n * Ensures that is properly cleans up when the collection is destroyed\n * so that no running timeouts prevent the exit of the JavaScript process.\n */\n promiseWait(time: number): Promise {\n const ret = new Promise(res => {\n const timeout = setTimeout(() => {\n this.timeouts.delete(timeout);\n res();\n }, time);\n this.timeouts.add(timeout);\n });\n return ret;\n }\n\n async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n\n await Promise.all(this.onDestroy.map(fn => fn()));\n\n /**\n * Settings destroyed = true\n * must be the first thing to do,\n * so for example the replication can directly stop\n * instead of sending requests to a closed storage.\n */\n this.destroyed = true;\n\n\n Array.from(this.timeouts).forEach(timeout => clearTimeout(timeout));\n if (this._changeEventBuffer) {\n this._changeEventBuffer.destroy();\n }\n /**\n * First wait until the whole database is idle.\n * This ensures that the storage does not get closed\n * while some operation is running.\n * It is important that we do not intercept a running call\n * because it might lead to undefined behavior like when a doc is written\n * but the change is not added to the changes collection.\n */\n return this.database.requestIdlePromise()\n .then(() => this.storageInstance.close())\n .then(() => {\n /**\n * Unsubscribing must be done AFTER the storageInstance.close()\n * Because the conflict handling is part of the subscriptions and\n * otherwise there might be open conflicts to be resolved which\n * will then stuck and never resolve.\n */\n this._subs.forEach(sub => sub.unsubscribe());\n\n delete this.database.collections[this.name];\n return runAsyncPluginHooks('postDestroyRxCollection', this).then(() => true);\n });\n }\n\n /**\n * remove all data of the collection\n */\n async remove(): Promise {\n await this.destroy();\n await Promise.all(this.onRemove.map(fn => fn()));\n await removeCollectionStorages(\n this.database.storage,\n this.database.internalStore,\n this.database.token,\n this.database.name,\n this.name,\n this.database.password,\n this.database.hashFunction\n );\n }\n\n get asRxCollection(): RxCollection {\n return this as any;\n }\n}\n\n/**\n * adds the hook-functions to the collections prototype\n * this runs only once\n */\nfunction _applyHookFunctions(\n collection: RxCollection\n) {\n if (hooksApplied) return; // already run\n hooksApplied = true;\n const colProto = Object.getPrototypeOf(collection);\n HOOKS_KEYS.forEach(key => {\n HOOKS_WHEN.map(when => {\n const fnName = when + ucfirst(key);\n colProto[fnName] = function (fun: string, parallel: boolean) {\n return this.addHook(when, key, fun, parallel);\n };\n });\n });\n}\n\nfunction _incrementalUpsertUpdate(\n doc: RxDocumentBase,\n json: RxDocumentData\n): Promise> {\n return doc.incrementalModify((_innerDoc) => {\n return json;\n });\n}\n\n/**\n * ensures that the given document exists\n * @return promise that resolves with new doc and flag if inserted\n */\nfunction _incrementalUpsertEnsureRxDocumentExists(\n rxCollection: RxCollection,\n primary: string,\n json: any\n): Promise<\n {\n doc: RxDocument;\n inserted: boolean;\n }\n> {\n /**\n * Optimisation shortcut,\n * first try to find the document in the doc-cache\n */\n const docDataFromCache = rxCollection._docCache.getLatestDocumentDataIfExists(primary);\n if (docDataFromCache) {\n return Promise.resolve({\n doc: rxCollection._docCache.getCachedRxDocuments([docDataFromCache])[0],\n inserted: false\n });\n }\n return rxCollection.findOne(primary).exec()\n .then(doc => {\n if (!doc) {\n return rxCollection.insert(json).then(newDoc => ({\n doc: newDoc,\n inserted: true\n }));\n } else {\n return {\n doc,\n inserted: false\n };\n }\n });\n}\n\n/**\n * creates and prepares a new collection\n */\nexport function createRxCollection(\n {\n database,\n name,\n schema,\n instanceCreationOptions = {},\n migrationStrategies = {},\n autoMigrate = true,\n statics = {},\n methods = {},\n attachments = {},\n options = {},\n localDocuments = false,\n cacheReplacementPolicy = defaultCacheReplacementPolicy,\n conflictHandler = defaultConflictHandler\n }: any\n): Promise {\n const storageInstanceCreationParams: RxStorageInstanceCreationParams = {\n databaseInstanceToken: database.token,\n databaseName: database.name,\n collectionName: name,\n schema: schema.jsonSchema,\n options: instanceCreationOptions,\n multiInstance: database.multiInstance,\n password: database.password,\n devMode: overwritable.isDevMode()\n };\n\n runPluginHooks(\n 'preCreateRxStorageInstance',\n storageInstanceCreationParams\n );\n\n return createRxCollectionStorageInstance(\n database,\n storageInstanceCreationParams\n ).then(storageInstance => {\n const collection = new RxCollectionBase(\n database,\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n statics,\n conflictHandler\n );\n\n return collection\n .prepare()\n .then(() => {\n // ORM add statics\n Object\n .entries(statics)\n .forEach(([funName, fun]) => {\n Object.defineProperty(collection, funName, {\n get: () => (fun as any).bind(collection)\n });\n });\n\n let ret = PROMISE_RESOLVE_VOID;\n if (autoMigrate && collection.schema.version !== 0) {\n ret = collection.migratePromise();\n }\n return ret;\n })\n .then(() => {\n runPluginHooks('createRxCollection', {\n collection,\n creator: {\n name,\n schema,\n storageInstance,\n instanceCreationOptions,\n migrationStrategies,\n methods,\n attachments,\n options,\n cacheReplacementPolicy,\n localDocuments,\n statics\n }\n });\n return collection as any;\n })\n /**\n * If the collection creation fails,\n * we yet have to close the storage instances.\n */\n .catch(err => {\n return storageInstance.close()\n .then(() => Promise.reject(err));\n });\n });\n}\n\nexport function isRxCollection(obj: any): boolean {\n return obj instanceof RxCollectionBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/rx-database.js.map b/dist/esm/rx-database.js.map index 3656ce91fbb..29a486d5347 100644 --- a/dist/esm/rx-database.js.map +++ b/dist/esm/rx-database.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-database.js","names":["IdleQueue","pluginMissing","flatClone","PROMISE_RESOLVE_FALSE","randomCouchString","ensureNotFalsy","getDefaultRevision","getDefaultRxDocumentMeta","defaultHashSha256","RXDB_VERSION","newRxError","createRxSchema","runPluginHooks","runAsyncPluginHooks","Subject","mergeMap","createRxCollection","flatCloneDocWithMeta","getSingleDocument","getWrappedStorageInstance","INTERNAL_STORAGE_NAME","ObliviousSet","ensureStorageTokenDocumentExists","getAllCollectionDocuments","getPrimaryKeyOfInternalDocument","INTERNAL_CONTEXT_COLLECTION","INTERNAL_STORE_SCHEMA","_collectionNamePrimary","removeCollectionStorages","overwritable","USED_DATABASE_NAMES","Set","DB_COUNT","RxDatabaseBase","name","token","storage","instanceCreationOptions","password","multiInstance","eventReduce","options","internalStore","hashFunction","cleanupPolicy","allowSlowCount","reactivity","idleQueue","rxdbVersion","storageInstances","_subs","startupErrors","onDestroy","destroyed","collections","states","eventBulks$","observable$","pipe","changeEventBulk","events","storageToken","storageTokenDocument","emittedEventBulkIds","asRxDatabase","catch","err","push","then","doc","data","_proto","prototype","getReactivityFactory","database","$emit","has","id","add","next","removeCollectionDoc","schema","writeDoc","_deleted","bulkWrite","document","previous","addCollections","collectionCreators","jsonSchemas","schemas","bulkPutDocs","useArgsByCollectionName","Promise","all","Object","entries","map","args","collectionName","rxJsonSchema","collectionNameWithVersion","collectionDocData","key","context","schemaHash","hash","jsonSchema","version","connectedStorages","_meta","_rev","_attachments","useArgs","assign","hookData","conflictHandler","putDocsResult","ensureNoStartupErrors","error","status","writeError","docInDb","documentInDb","collection","previousSchemaHash","previousSchema","ret","keys","defineProperty","get","lockedRun","fn","wrapCall","requestIdlePromise","exportJSON","_collections","addState","_name","importJSON","_exportedJSON","backup","_options","leaderElector","isLeader","waitForLeadership","migrationStates","destroy","complete","sub","unsubscribe","col","close","delete","remove","removeRxDatabase","_createClass","throwIfDatabaseNameUsed","link","createRxDatabaseStorageInstance","databaseInstanceToken","databaseName","createStorageInstance","devMode","isDevMode","createRxDatabase","ignoreDuplicate","localDocuments","storageInstance","rxDatabase","creator","dbInternalsStorageInstance","collectionDocs","collectionNames","forEach","removedCollectionNames","Array","from","isRxDatabase","obj","dbCount","isRxDatabaseFirstTimeInstantiated","tokenDoc","instanceToken"],"sources":["../../src/rx-database.ts"],"sourcesContent":["import { IdleQueue } from 'custom-idle-queue';\nimport type {\n LeaderElector\n} from 'broadcast-channel';\nimport type {\n CollectionsOfDatabase,\n RxDatabase,\n RxCollectionCreator,\n RxJsonSchema,\n RxCollection,\n RxDumpDatabase,\n RxDumpDatabaseAny,\n BackupOptions,\n RxStorage,\n RxStorageInstance,\n BulkWriteRow,\n RxChangeEvent,\n RxDatabaseCreator,\n RxChangeEventBulk,\n RxDocumentData,\n RxCleanupPolicy,\n InternalStoreDocType,\n InternalStoreStorageTokenDocType,\n InternalStoreCollectionDocType,\n RxTypeError,\n RxError,\n HashFunction,\n MaybePromise,\n RxState\n} from './types/index.d.ts';\n\nimport {\n pluginMissing,\n flatClone,\n PROMISE_RESOLVE_FALSE,\n randomCouchString,\n ensureNotFalsy,\n getDefaultRevision,\n getDefaultRxDocumentMeta,\n defaultHashSha256,\n RXDB_VERSION\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n createRxSchema,\n RxSchema\n} from './rx-schema.ts';\nimport {\n runPluginHooks,\n runAsyncPluginHooks\n} from './hooks.ts';\nimport {\n Subject,\n Subscription,\n Observable\n} from 'rxjs';\nimport {\n mergeMap\n} from 'rxjs/operators';\nimport {\n createRxCollection\n} from './rx-collection.ts';\nimport {\n flatCloneDocWithMeta,\n getSingleDocument,\n getWrappedStorageInstance,\n INTERNAL_STORAGE_NAME,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport type { RxBackupState } from './plugins/backup/index.ts';\nimport { ObliviousSet } from 'oblivious-set';\nimport {\n ensureStorageTokenDocumentExists,\n getAllCollectionDocuments,\n getPrimaryKeyOfInternalDocument,\n INTERNAL_CONTEXT_COLLECTION,\n INTERNAL_STORE_SCHEMA,\n _collectionNamePrimary\n} from './rx-database-internal-store.ts';\nimport { removeCollectionStorages } from './rx-collection-helper.ts';\nimport { overwritable } from './overwritable.ts';\nimport type { RxMigrationState } from './plugins/migration-schema/index.ts';\nimport type { RxReactivityFactory } from './types/plugins/reactivity.d.ts';\n\n/**\n * stores the used database names+storage names\n * so we can throw when the same database is created more then once.\n */\nconst USED_DATABASE_NAMES: Set = new Set();\n\nlet DB_COUNT = 0;\n\nexport class RxDatabaseBase<\n Internals,\n InstanceCreationOptions,\n Collections = CollectionsOfDatabase,\n Reactivity = unknown\n> {\n\n public readonly idleQueue: IdleQueue = new IdleQueue();\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Contains all known non-closed storage instances\n * that belong to this database.\n * Used in plugins and unit tests.\n */\n public readonly storageInstances = new Set>();\n\n constructor(\n public readonly name: string,\n /**\n * Uniquely identifies the instance\n * of this RxDatabase.\n */\n public readonly token: string,\n public readonly storage: RxStorage,\n public readonly instanceCreationOptions: InstanceCreationOptions,\n public readonly password: any,\n public readonly multiInstance: boolean,\n public readonly eventReduce: boolean = false,\n public options: any = {},\n /**\n * Stores information documents about the collections of the database\n */\n public readonly internalStore: RxStorageInstance,\n public readonly hashFunction: HashFunction,\n public readonly cleanupPolicy?: Partial,\n public readonly allowSlowCount?: boolean,\n public readonly reactivity?: RxReactivityFactory\n ) {\n DB_COUNT++;\n\n /**\n * In the dev-mode, we create a pseudoInstance\n * to get all properties of RxDatabase and ensure they do not\n * conflict with the collection names etc.\n * So only if it is not pseudoInstance,\n * we have all values to prepare a real RxDatabase.\n *\n * TODO this is ugly, we should use a different way in the dev-mode\n * so that all non-dev-mode code can be cleaner.\n */\n if (this.name !== 'pseudoInstance') {\n /**\n * Wrap the internal store\n * to ensure that calls to it also end up in\n * calculation of the idle state and the hooks.\n */\n this.internalStore = getWrappedStorageInstance(\n this.asRxDatabase,\n internalStore,\n INTERNAL_STORE_SCHEMA\n );\n\n /**\n * Start writing the storage token.\n * Do not await the creation because it would run\n * in a critical path that increases startup time.\n *\n * Writing the token takes about 20 milliseconds\n * even on a fast adapter, so this is worth it.\n */\n this.storageTokenDocument = ensureStorageTokenDocumentExists(this.asRxDatabase)\n .catch(err => this.startupErrors.push(err) as any);\n this.storageToken = this.storageTokenDocument\n .then(doc => doc.data.token)\n .catch(err => this.startupErrors.push(err) as any);\n }\n }\n\n get $(): Observable> {\n return this.observable$;\n }\n\n public getReactivityFactory(): RxReactivityFactory {\n if (!this.reactivity) {\n throw newRxError('DB14', { database: this.name });\n }\n return this.reactivity;\n }\n\n public _subs: Subscription[] = [];\n\n /**\n * Because having unhandled exceptions would fail,\n * we have to store the async errors of the constructor here\n * so we can throw them later.\n */\n public startupErrors: (RxError | RxTypeError)[] = [];\n\n /**\n * When the database is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed: boolean = false;\n public collections: Collections = {} as any;\n public states: { [name: string]: RxState; } = {};\n public readonly eventBulks$: Subject> = new Subject();\n private observable$: Observable> = this.eventBulks$\n .pipe(\n mergeMap(changeEventBulk => changeEventBulk.events)\n );\n\n /**\n * Unique token that is stored with the data.\n * Used to detect if the dataset has been deleted\n * and if two RxDatabase instances work on the same dataset or not.\n *\n * Because reading and writing the storageToken runs in the hot path\n * of database creation, we do not await the storageWrites but instead\n * work with the promise when we need the value.\n */\n public storageToken: Promise = PROMISE_RESOLVE_FALSE as any;\n /**\n * Stores the whole state of the internal storage token document.\n * We need this in some plugins.\n */\n public storageTokenDocument: Promise> = PROMISE_RESOLVE_FALSE as any;\n\n /**\n * Contains the ids of all event bulks that have been emitted\n * by the database.\n * Used to detect duplicates that come in again via BroadcastChannel\n * or other streams.\n * TODO instead of having this here, we should add a test to ensure each RxStorage\n * behaves equal and does never emit duplicate eventBulks.\n */\n public emittedEventBulkIds: ObliviousSet = new ObliviousSet(60 * 1000);\n\n /**\n * This is the main handle-point for all change events\n * ChangeEvents created by this instance go:\n * RxDocument -> RxCollection -> RxDatabase.$emit -> MultiInstance\n * ChangeEvents created by other instances go:\n * MultiInstance -> RxDatabase.$emit -> RxCollection -> RxDatabase\n */\n $emit(changeEventBulk: RxChangeEventBulk) {\n if (this.emittedEventBulkIds.has(changeEventBulk.id)) {\n return;\n }\n this.emittedEventBulkIds.add(changeEventBulk.id);\n\n // emit into own stream\n this.eventBulks$.next(changeEventBulk);\n }\n\n /**\n * removes the collection-doc from the internalStore\n */\n async removeCollectionDoc(name: string, schema: any): Promise {\n const doc = await getSingleDocument(\n this.internalStore,\n getPrimaryKeyOfInternalDocument(\n _collectionNamePrimary(name, schema),\n INTERNAL_CONTEXT_COLLECTION\n )\n );\n if (!doc) {\n throw newRxError('SNH', { name, schema });\n }\n const writeDoc = flatCloneDocWithMeta(doc);\n writeDoc._deleted = true;\n\n await this.internalStore.bulkWrite([{\n document: writeDoc,\n previous: doc\n }], 'rx-database-remove-collection');\n }\n\n /**\n * creates multiple RxCollections at once\n * to be much faster by saving db txs and doing stuff in bulk-operations\n * This function is not called often, but mostly in the critical path at the initial page load\n * So it must be as fast as possible.\n */\n async addCollections>(collectionCreators: {\n [key in keyof CreatedCollections]: RxCollectionCreator\n }): Promise<{ [key in keyof CreatedCollections]: RxCollection }> {\n const jsonSchemas: { [key in keyof CreatedCollections]: RxJsonSchema } = {} as any;\n const schemas: { [key in keyof CreatedCollections]: RxSchema } = {} as any;\n const bulkPutDocs: BulkWriteRow[] = [];\n const useArgsByCollectionName: any = {};\n\n await Promise.all(\n Object.entries(collectionCreators).map(async ([name, args]) => {\n const collectionName: keyof CreatedCollections = name as any;\n const rxJsonSchema = (args as RxCollectionCreator).schema;\n jsonSchemas[collectionName] = rxJsonSchema;\n const schema = createRxSchema(rxJsonSchema, this.hashFunction);\n schemas[collectionName] = schema;\n\n // collection already exists\n if ((this.collections as any)[name]) {\n throw newRxError('DB3', {\n name\n });\n }\n\n const collectionNameWithVersion = _collectionNamePrimary(name, rxJsonSchema);\n const collectionDocData: RxDocumentData = {\n id: getPrimaryKeyOfInternalDocument(\n collectionNameWithVersion,\n INTERNAL_CONTEXT_COLLECTION\n ),\n key: collectionNameWithVersion,\n context: INTERNAL_CONTEXT_COLLECTION,\n data: {\n name: collectionName as any,\n schemaHash: await schema.hash,\n schema: schema.jsonSchema,\n version: schema.version,\n connectedStorages: []\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n bulkPutDocs.push({\n document: collectionDocData\n });\n\n const useArgs: any = Object.assign(\n {},\n args,\n {\n name: collectionName,\n schema,\n database: this\n }\n );\n\n // run hooks\n const hookData: RxCollectionCreator & { name: string; } = flatClone(args) as any;\n (hookData as any).database = this;\n hookData.name = name;\n runPluginHooks('preCreateRxCollection', hookData);\n useArgs.conflictHandler = hookData.conflictHandler;\n\n useArgsByCollectionName[collectionName] = useArgs;\n })\n );\n\n\n const putDocsResult = await this.internalStore.bulkWrite(\n bulkPutDocs,\n 'rx-database-add-collection'\n );\n\n await ensureNoStartupErrors(this);\n\n await Promise.all(\n putDocsResult.error.map(async (error) => {\n if (error.status !== 409) {\n throw newRxError('DB12', {\n database: this.name,\n writeError: error\n });\n }\n const docInDb: RxDocumentData = ensureNotFalsy(error.documentInDb);\n const collectionName = docInDb.data.name;\n const schema = (schemas as any)[collectionName];\n // collection already exists but has different schema\n if (docInDb.data.schemaHash !== await schema.hash) {\n throw newRxError('DB6', {\n database: this.name,\n collection: collectionName,\n previousSchemaHash: docInDb.data.schemaHash,\n schemaHash: await schema.hash,\n previousSchema: docInDb.data.schema,\n schema: ensureNotFalsy((jsonSchemas as any)[collectionName])\n });\n }\n })\n );\n\n const ret: { [key in keyof CreatedCollections]: RxCollection } = {} as any;\n await Promise.all(\n Object.keys(collectionCreators).map(async (collectionName) => {\n const useArgs = useArgsByCollectionName[collectionName];\n const collection = await createRxCollection(useArgs);\n (ret as any)[collectionName] = collection;\n\n // set as getter to the database\n (this.collections as any)[collectionName] = collection;\n if (!(this as any)[collectionName]) {\n Object.defineProperty(this, collectionName, {\n get: () => (this.collections as any)[collectionName]\n });\n }\n })\n );\n\n return ret;\n }\n\n /**\n * runs the given function between idleQueue-locking\n */\n lockedRun(fn: (...args: any[]) => T): T extends Promise ? T : Promise {\n return this.idleQueue.wrapCall(fn) as any;\n }\n\n requestIdlePromise() {\n return this.idleQueue.requestIdlePromise();\n }\n\n /**\n * Export database to a JSON friendly format.\n */\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise {\n throw pluginMissing('json-dump');\n }\n\n addState(_name?: string): Promise> {\n throw pluginMissing('state');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n * @note When an interface is loaded in this collection all base properties of the type are typed as `any`\n * since data could be encrypted.\n */\n importJSON(_exportedJSON: RxDumpDatabaseAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n backup(_options: BackupOptions): RxBackupState {\n throw pluginMissing('backup');\n }\n\n public leaderElector(): LeaderElector {\n throw pluginMissing('leader-election');\n }\n\n public isLeader(): boolean {\n throw pluginMissing('leader-election');\n }\n /**\n * returns a promise which resolves when the instance becomes leader\n */\n public waitForLeadership(): Promise {\n throw pluginMissing('leader-election');\n }\n\n public migrationStates(): Observable {\n throw pluginMissing('migration-schema');\n }\n\n /**\n * destroys the database-instance and all collections\n */\n public async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n // settings destroyed = true must be the first thing to do.\n this.destroyed = true;\n\n await runAsyncPluginHooks('preDestroyRxDatabase', this);\n /**\n * Complete the event stream\n * to stop all subscribers who forgot to unsubscribe.\n */\n this.eventBulks$.complete();\n\n DB_COUNT--;\n this._subs.map(sub => sub.unsubscribe());\n\n /**\n * Destroying the pseudo instance will throw\n * because stuff is missing\n * TODO we should not need the pseudo instance on runtime.\n * we should generate the property list on build time.\n */\n if (this.name === 'pseudoInstance') {\n return PROMISE_RESOLVE_FALSE;\n }\n\n /**\n * First wait until the database is idle\n */\n return this.requestIdlePromise()\n .then(() => Promise.all(this.onDestroy.map(fn => fn())))\n // destroy all collections\n .then(() => Promise.all(\n Object.keys(this.collections as any)\n .map(key => (this.collections as any)[key])\n .map(col => col.destroy())\n ))\n // destroy internal storage instances\n .then(() => this.internalStore.close())\n // remove combination from USED_COMBINATIONS-map\n .then(() => USED_DATABASE_NAMES.delete(this.storage.name + '|' + this.name))\n .then(() => true);\n }\n\n /**\n * deletes the database and its stored data.\n * Returns the names of all removed collections.\n */\n remove(): Promise {\n return this\n .destroy()\n .then(() => removeRxDatabase(this.name, this.storage, this.password));\n }\n\n get asRxDatabase(): RxDatabase<\n {},\n Internals,\n InstanceCreationOptions,\n Reactivity\n > {\n return this as any;\n }\n}\n\n/**\n * checks if an instance with same name and storage already exists\n * @throws {RxError} if used\n */\nfunction throwIfDatabaseNameUsed(\n name: string,\n storage: RxStorage\n) {\n const key = storage.name + '|' + name;\n if (!USED_DATABASE_NAMES.has(key)) {\n return;\n } else {\n throw newRxError('DB8', {\n name,\n storage: storage.name,\n link: 'https://rxdb.info/rx-database.html#ignoreduplicate'\n });\n }\n}\n\n/**\n * Creates the storage instances that are used internally in the database\n * to store schemas and other configuration stuff.\n */\nexport async function createRxDatabaseStorageInstance(\n databaseInstanceToken: string,\n storage: RxStorage,\n databaseName: string,\n options: InstanceCreationOptions,\n multiInstance: boolean,\n password?: string\n): Promise> {\n const internalStore = await storage.createStorageInstance(\n {\n databaseInstanceToken,\n databaseName,\n collectionName: INTERNAL_STORAGE_NAME,\n schema: INTERNAL_STORE_SCHEMA,\n options,\n multiInstance,\n password,\n devMode: overwritable.isDevMode()\n }\n );\n return internalStore;\n}\n\nexport function createRxDatabase<\n Collections = { [key: string]: RxCollection; },\n Internals = any,\n InstanceCreationOptions = any,\n Reactivity = unknown\n>(\n {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance = true,\n eventReduce = true,\n ignoreDuplicate = false,\n options = {},\n cleanupPolicy,\n allowSlowCount = false,\n localDocuments = false,\n hashFunction = defaultHashSha256,\n reactivity\n }: RxDatabaseCreator\n): Promise<\n RxDatabase\n> {\n runPluginHooks('preCreateRxDatabase', {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n });\n // check if combination already used\n if (!ignoreDuplicate) {\n throwIfDatabaseNameUsed(name, storage);\n }\n USED_DATABASE_NAMES.add(storage.name + '|' + name);\n\n const databaseInstanceToken = randomCouchString(10);\n\n return createRxDatabaseStorageInstance<\n Internals,\n InstanceCreationOptions\n >(\n databaseInstanceToken,\n storage,\n name,\n instanceCreationOptions as any,\n multiInstance,\n password\n )\n /**\n * Creating the internal store might fail\n * if some RxStorage wrapper is used that does some checks\n * and then throw.\n * In that case we have to properly clean up the database.\n */\n .catch(err => {\n USED_DATABASE_NAMES.delete(storage.name + '|' + name);\n throw err;\n })\n .then(storageInstance => {\n const rxDatabase: RxDatabase = new RxDatabaseBase(\n name,\n databaseInstanceToken,\n storage,\n instanceCreationOptions,\n password,\n multiInstance,\n eventReduce,\n options,\n storageInstance,\n hashFunction,\n cleanupPolicy,\n allowSlowCount,\n reactivity\n ) as any;\n\n return runAsyncPluginHooks('createRxDatabase', {\n database: rxDatabase,\n creator: {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n }\n }).then(() => rxDatabase);\n });\n}\n\n/**\n * Removes the database and all its known data\n * with all known collections and all internal meta data.\n *\n * Returns the names of the removed collections.\n */\nexport async function removeRxDatabase(\n databaseName: string,\n storage: RxStorage,\n password?: string\n): Promise {\n const databaseInstanceToken = randomCouchString(10);\n const dbInternalsStorageInstance = await createRxDatabaseStorageInstance(\n databaseInstanceToken,\n storage,\n databaseName,\n {},\n false,\n password\n );\n const collectionDocs = await getAllCollectionDocuments(dbInternalsStorageInstance);\n const collectionNames = new Set();\n collectionDocs.forEach(doc => collectionNames.add(doc.data.name));\n const removedCollectionNames: string[] = Array.from(collectionNames);\n\n await Promise.all(\n removedCollectionNames.map(collectionName => removeCollectionStorages(\n storage,\n dbInternalsStorageInstance,\n databaseInstanceToken,\n databaseName,\n collectionName,\n password\n ))\n );\n\n await runAsyncPluginHooks('postRemoveRxDatabase', {\n databaseName,\n storage\n });\n\n await dbInternalsStorageInstance.remove();\n return removedCollectionNames;\n}\n\nexport function isRxDatabase(obj: any) {\n return obj instanceof RxDatabaseBase;\n}\n\nexport function dbCount(): number {\n return DB_COUNT;\n}\n\n\n/**\n * Returns true if the given RxDatabase was the first\n * instance that was created on the storage with this name.\n *\n * Can be used for some optimizations because on the first instantiation,\n * we can assume that no data was written before.\n */\nexport async function isRxDatabaseFirstTimeInstantiated(\n database: RxDatabase\n): Promise {\n const tokenDoc = await database.storageTokenDocument;\n return tokenDoc.data.instanceToken === database.token;\n}\n\n\n/**\n * For better performance some tasks run async\n * and are awaited later.\n * But we still have to ensure that there have been no errors\n * on database creation.\n */\nexport async function ensureNoStartupErrors(\n rxDatabase: RxDatabaseBase\n) {\n await rxDatabase.storageToken;\n if (rxDatabase.startupErrors[0]) {\n throw rxDatabase.startupErrors[0];\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-database.js","names":["IdleQueue","pluginMissing","flatClone","PROMISE_RESOLVE_FALSE","randomCouchString","ensureNotFalsy","getDefaultRevision","getDefaultRxDocumentMeta","defaultHashSha256","RXDB_VERSION","newRxError","createRxSchema","runPluginHooks","runAsyncPluginHooks","Subject","mergeMap","createRxCollection","flatCloneDocWithMeta","getSingleDocument","getWrappedStorageInstance","INTERNAL_STORAGE_NAME","ObliviousSet","ensureStorageTokenDocumentExists","getAllCollectionDocuments","getPrimaryKeyOfInternalDocument","INTERNAL_CONTEXT_COLLECTION","INTERNAL_STORE_SCHEMA","_collectionNamePrimary","removeCollectionStorages","overwritable","USED_DATABASE_NAMES","Set","DB_COUNT","RxDatabaseBase","name","token","storage","instanceCreationOptions","password","multiInstance","eventReduce","options","internalStore","hashFunction","cleanupPolicy","allowSlowCount","reactivity","idleQueue","rxdbVersion","storageInstances","_subs","startupErrors","onDestroy","destroyed","collections","states","eventBulks$","observable$","pipe","changeEventBulk","events","storageToken","storageTokenDocument","emittedEventBulkIds","asRxDatabase","catch","err","push","then","doc","data","_proto","prototype","getReactivityFactory","database","$emit","has","id","add","next","removeCollectionDoc","schema","writeDoc","_deleted","bulkWrite","document","previous","addCollections","collectionCreators","jsonSchemas","schemas","bulkPutDocs","useArgsByCollectionName","Promise","all","Object","entries","map","args","collectionName","rxJsonSchema","collectionNameWithVersion","collectionDocData","key","context","schemaHash","hash","jsonSchema","version","connectedStorages","_meta","_rev","_attachments","useArgs","assign","hookData","conflictHandler","putDocsResult","ensureNoStartupErrors","error","status","writeError","docInDb","documentInDb","collection","previousSchemaHash","previousSchema","ret","keys","defineProperty","get","lockedRun","fn","wrapCall","requestIdlePromise","exportJSON","_collections","addState","_name","importJSON","_exportedJSON","backup","_options","leaderElector","isLeader","waitForLeadership","migrationStates","destroy","complete","sub","unsubscribe","col","close","delete","remove","removeRxDatabase","_createClass","throwIfDatabaseNameUsed","link","createRxDatabaseStorageInstance","databaseInstanceToken","databaseName","createStorageInstance","devMode","isDevMode","createRxDatabase","ignoreDuplicate","localDocuments","storageInstance","rxDatabase","creator","dbInternalsStorageInstance","collectionDocs","collectionNames","forEach","removedCollectionNames","Array","from","isRxDatabase","obj","dbCount","isRxDatabaseFirstTimeInstantiated","tokenDoc","instanceToken"],"sources":["../../src/rx-database.ts"],"sourcesContent":["import { IdleQueue } from 'custom-idle-queue';\nimport type {\n LeaderElector\n} from 'broadcast-channel';\nimport type {\n CollectionsOfDatabase,\n RxDatabase,\n RxCollectionCreator,\n RxJsonSchema,\n RxCollection,\n RxDumpDatabase,\n RxDumpDatabaseAny,\n BackupOptions,\n RxStorage,\n RxStorageInstance,\n BulkWriteRow,\n RxChangeEvent,\n RxDatabaseCreator,\n RxChangeEventBulk,\n RxDocumentData,\n RxCleanupPolicy,\n InternalStoreDocType,\n InternalStoreStorageTokenDocType,\n InternalStoreCollectionDocType,\n RxTypeError,\n RxError,\n HashFunction,\n MaybePromise,\n RxState\n} from './types/index.d.ts';\n\nimport {\n pluginMissing,\n flatClone,\n PROMISE_RESOLVE_FALSE,\n randomCouchString,\n ensureNotFalsy,\n getDefaultRevision,\n getDefaultRxDocumentMeta,\n defaultHashSha256,\n RXDB_VERSION\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n createRxSchema,\n RxSchema\n} from './rx-schema.ts';\nimport {\n runPluginHooks,\n runAsyncPluginHooks\n} from './hooks.ts';\nimport {\n Subject,\n Subscription,\n Observable\n} from 'rxjs';\nimport {\n mergeMap\n} from 'rxjs/operators';\nimport {\n createRxCollection\n} from './rx-collection.ts';\nimport {\n flatCloneDocWithMeta,\n getSingleDocument,\n getWrappedStorageInstance,\n INTERNAL_STORAGE_NAME,\n WrappedRxStorageInstance\n} from './rx-storage-helper.ts';\nimport type { RxBackupState } from './plugins/backup/index.ts';\nimport { ObliviousSet } from 'oblivious-set';\nimport {\n ensureStorageTokenDocumentExists,\n getAllCollectionDocuments,\n getPrimaryKeyOfInternalDocument,\n INTERNAL_CONTEXT_COLLECTION,\n INTERNAL_STORE_SCHEMA,\n _collectionNamePrimary\n} from './rx-database-internal-store.ts';\nimport { removeCollectionStorages } from './rx-collection-helper.ts';\nimport { overwritable } from './overwritable.ts';\nimport type { RxMigrationState } from './plugins/migration-schema/index.ts';\nimport type { RxReactivityFactory } from './types/plugins/reactivity.d.ts';\n\n/**\n * stores the used database names+storage names\n * so we can throw when the same database is created more then once.\n */\nconst USED_DATABASE_NAMES: Set = new Set();\n\nlet DB_COUNT = 0;\n\nexport class RxDatabaseBase<\n Internals,\n InstanceCreationOptions,\n Collections = CollectionsOfDatabase,\n Reactivity = unknown\n> {\n\n public readonly idleQueue: IdleQueue = new IdleQueue();\n public readonly rxdbVersion = RXDB_VERSION;\n\n /**\n * Contains all known non-closed storage instances\n * that belong to this database.\n * Used in plugins and unit tests.\n */\n public readonly storageInstances = new Set>();\n\n constructor(\n public readonly name: string,\n /**\n * Uniquely identifies the instance\n * of this RxDatabase.\n */\n public readonly token: string,\n public readonly storage: RxStorage,\n public readonly instanceCreationOptions: InstanceCreationOptions,\n public readonly password: any,\n public readonly multiInstance: boolean,\n public readonly eventReduce: boolean = false,\n public options: any = {},\n /**\n * Stores information documents about the collections of the database\n */\n public readonly internalStore: RxStorageInstance,\n public readonly hashFunction: HashFunction,\n public readonly cleanupPolicy?: Partial,\n public readonly allowSlowCount?: boolean,\n public readonly reactivity?: RxReactivityFactory\n ) {\n DB_COUNT++;\n\n /**\n * In the dev-mode, we create a pseudoInstance\n * to get all properties of RxDatabase and ensure they do not\n * conflict with the collection names etc.\n * So only if it is not pseudoInstance,\n * we have all values to prepare a real RxDatabase.\n *\n * TODO this is ugly, we should use a different way in the dev-mode\n * so that all non-dev-mode code can be cleaner.\n */\n if (this.name !== 'pseudoInstance') {\n /**\n * Wrap the internal store\n * to ensure that calls to it also end up in\n * calculation of the idle state and the hooks.\n */\n this.internalStore = getWrappedStorageInstance(\n this.asRxDatabase,\n internalStore,\n INTERNAL_STORE_SCHEMA\n );\n\n /**\n * Start writing the storage token.\n * Do not await the creation because it would run\n * in a critical path that increases startup time.\n *\n * Writing the token takes about 20 milliseconds\n * even on a fast adapter, so this is worth it.\n */\n this.storageTokenDocument = ensureStorageTokenDocumentExists(this.asRxDatabase)\n .catch(err => this.startupErrors.push(err) as any);\n this.storageToken = this.storageTokenDocument\n .then(doc => doc.data.token)\n .catch(err => this.startupErrors.push(err) as any);\n }\n }\n\n get $(): Observable> {\n return this.observable$;\n }\n\n public getReactivityFactory(): RxReactivityFactory {\n if (!this.reactivity) {\n throw newRxError('DB14', { database: this.name });\n }\n return this.reactivity;\n }\n\n public _subs: Subscription[] = [];\n\n /**\n * Because having unhandled exceptions would fail,\n * we have to store the async errors of the constructor here\n * so we can throw them later.\n */\n public startupErrors: (RxError | RxTypeError)[] = [];\n\n /**\n * When the database is destroyed,\n * these functions will be called an awaited.\n * Used to automatically clean up stuff that\n * belongs to this collection.\n */\n public onDestroy: (() => MaybePromise)[] = [];\n public destroyed: boolean = false;\n public collections: Collections = {} as any;\n public states: { [name: string]: RxState; } = {};\n public readonly eventBulks$: Subject> = new Subject();\n private observable$: Observable> = this.eventBulks$\n .pipe(\n mergeMap(changeEventBulk => changeEventBulk.events)\n );\n\n /**\n * Unique token that is stored with the data.\n * Used to detect if the dataset has been deleted\n * and if two RxDatabase instances work on the same dataset or not.\n *\n * Because reading and writing the storageToken runs in the hot path\n * of database creation, we do not await the storageWrites but instead\n * work with the promise when we need the value.\n */\n public storageToken: Promise = PROMISE_RESOLVE_FALSE as any;\n /**\n * Stores the whole state of the internal storage token document.\n * We need this in some plugins.\n */\n public storageTokenDocument: Promise> = PROMISE_RESOLVE_FALSE as any;\n\n /**\n * Contains the ids of all event bulks that have been emitted\n * by the database.\n * Used to detect duplicates that come in again via BroadcastChannel\n * or other streams.\n * TODO instead of having this here, we should add a test to ensure each RxStorage\n * behaves equal and does never emit duplicate eventBulks.\n */\n public emittedEventBulkIds: ObliviousSet = new ObliviousSet(60 * 1000);\n\n /**\n * This is the main handle-point for all change events\n * ChangeEvents created by this instance go:\n * RxDocument -> RxCollection -> RxDatabase.$emit -> MultiInstance\n * ChangeEvents created by other instances go:\n * MultiInstance -> RxDatabase.$emit -> RxCollection -> RxDatabase\n */\n $emit(changeEventBulk: RxChangeEventBulk) {\n if (this.emittedEventBulkIds.has(changeEventBulk.id)) {\n return;\n }\n this.emittedEventBulkIds.add(changeEventBulk.id);\n\n // emit into own stream\n this.eventBulks$.next(changeEventBulk);\n }\n\n /**\n * removes the collection-doc from the internalStore\n */\n async removeCollectionDoc(name: string, schema: any): Promise {\n const doc = await getSingleDocument(\n this.internalStore,\n getPrimaryKeyOfInternalDocument(\n _collectionNamePrimary(name, schema),\n INTERNAL_CONTEXT_COLLECTION\n )\n );\n if (!doc) {\n throw newRxError('SNH', { name, schema });\n }\n const writeDoc = flatCloneDocWithMeta(doc);\n writeDoc._deleted = true;\n\n await this.internalStore.bulkWrite([{\n document: writeDoc,\n previous: doc\n }], 'rx-database-remove-collection');\n }\n\n /**\n * creates multiple RxCollections at once\n * to be much faster by saving db txs and doing stuff in bulk-operations\n * This function is not called often, but mostly in the critical path at the initial page load\n * So it must be as fast as possible.\n */\n async addCollections>(collectionCreators: {\n [key in keyof CreatedCollections]: RxCollectionCreator\n }): Promise<{ [key in keyof CreatedCollections]: RxCollection }> {\n const jsonSchemas: { [key in keyof CreatedCollections]: RxJsonSchema } = {} as any;\n const schemas: { [key in keyof CreatedCollections]: RxSchema } = {} as any;\n const bulkPutDocs: BulkWriteRow[] = [];\n const useArgsByCollectionName: any = {};\n\n await Promise.all(\n Object.entries(collectionCreators).map(async ([name, args]) => {\n const collectionName: keyof CreatedCollections = name as any;\n const rxJsonSchema = (args as RxCollectionCreator).schema;\n jsonSchemas[collectionName] = rxJsonSchema;\n const schema = createRxSchema(rxJsonSchema, this.hashFunction);\n schemas[collectionName] = schema;\n\n // collection already exists\n if ((this.collections as any)[name]) {\n throw newRxError('DB3', {\n name\n });\n }\n\n const collectionNameWithVersion = _collectionNamePrimary(name, rxJsonSchema);\n const collectionDocData: RxDocumentData = {\n id: getPrimaryKeyOfInternalDocument(\n collectionNameWithVersion,\n INTERNAL_CONTEXT_COLLECTION\n ),\n key: collectionNameWithVersion,\n context: INTERNAL_CONTEXT_COLLECTION,\n data: {\n name: collectionName as any,\n schemaHash: await schema.hash,\n schema: schema.jsonSchema,\n version: schema.version,\n connectedStorages: []\n },\n _deleted: false,\n _meta: getDefaultRxDocumentMeta(),\n _rev: getDefaultRevision(),\n _attachments: {}\n };\n bulkPutDocs.push({\n document: collectionDocData\n });\n\n const useArgs: any = Object.assign(\n {},\n args,\n {\n name: collectionName,\n schema,\n database: this\n }\n );\n\n // run hooks\n const hookData: RxCollectionCreator & { name: string; } = flatClone(args) as any;\n (hookData as any).database = this;\n hookData.name = name;\n runPluginHooks('preCreateRxCollection', hookData);\n useArgs.conflictHandler = hookData.conflictHandler;\n\n useArgsByCollectionName[collectionName] = useArgs;\n })\n );\n\n\n const putDocsResult = await this.internalStore.bulkWrite(\n bulkPutDocs,\n 'rx-database-add-collection'\n );\n\n await ensureNoStartupErrors(this);\n\n await Promise.all(\n putDocsResult.error.map(async (error) => {\n if (error.status !== 409) {\n throw newRxError('DB12', {\n database: this.name,\n writeError: error\n });\n }\n const docInDb: RxDocumentData = ensureNotFalsy(error.documentInDb);\n const collectionName = docInDb.data.name;\n const schema = (schemas as any)[collectionName];\n // collection already exists but has different schema\n if (docInDb.data.schemaHash !== await schema.hash) {\n throw newRxError('DB6', {\n database: this.name,\n collection: collectionName,\n previousSchemaHash: docInDb.data.schemaHash,\n schemaHash: await schema.hash,\n previousSchema: docInDb.data.schema,\n schema: ensureNotFalsy((jsonSchemas as any)[collectionName])\n });\n }\n })\n );\n\n const ret: { [key in keyof CreatedCollections]: RxCollection } = {} as any;\n await Promise.all(\n Object.keys(collectionCreators).map(async (collectionName) => {\n const useArgs = useArgsByCollectionName[collectionName];\n const collection = await createRxCollection(useArgs);\n (ret as any)[collectionName] = collection;\n\n // set as getter to the database\n (this.collections as any)[collectionName] = collection;\n if (!(this as any)[collectionName]) {\n Object.defineProperty(this, collectionName, {\n get: () => (this.collections as any)[collectionName]\n });\n }\n })\n );\n\n return ret;\n }\n\n /**\n * runs the given function between idleQueue-locking\n */\n lockedRun(fn: (...args: any[]) => T): T extends Promise ? T : Promise {\n return this.idleQueue.wrapCall(fn) as any;\n }\n\n requestIdlePromise() {\n return this.idleQueue.requestIdlePromise();\n }\n\n /**\n * Export database to a JSON friendly format.\n */\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise>;\n exportJSON(_collections?: string[]): Promise {\n throw pluginMissing('json-dump');\n }\n\n addState(_name?: string): Promise> {\n throw pluginMissing('state');\n }\n\n /**\n * Import the parsed JSON export into the collection.\n * @param _exportedJSON The previously exported data from the `.exportJSON()` method.\n * @note When an interface is loaded in this collection all base properties of the type are typed as `any`\n * since data could be encrypted.\n */\n importJSON(_exportedJSON: RxDumpDatabaseAny): Promise {\n throw pluginMissing('json-dump');\n }\n\n backup(_options: BackupOptions): RxBackupState {\n throw pluginMissing('backup');\n }\n\n public leaderElector(): LeaderElector {\n throw pluginMissing('leader-election');\n }\n\n public isLeader(): boolean {\n throw pluginMissing('leader-election');\n }\n /**\n * returns a promise which resolves when the instance becomes leader\n */\n public waitForLeadership(): Promise {\n throw pluginMissing('leader-election');\n }\n\n public migrationStates(): Observable {\n throw pluginMissing('migration-schema');\n }\n\n /**\n * destroys the database-instance and all collections\n */\n public async destroy(): Promise {\n if (this.destroyed) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n // settings destroyed = true must be the first thing to do.\n this.destroyed = true;\n\n await runAsyncPluginHooks('preDestroyRxDatabase', this);\n /**\n * Complete the event stream\n * to stop all subscribers who forgot to unsubscribe.\n */\n this.eventBulks$.complete();\n\n DB_COUNT--;\n this._subs.map(sub => sub.unsubscribe());\n\n /**\n * Destroying the pseudo instance will throw\n * because stuff is missing\n * TODO we should not need the pseudo instance on runtime.\n * we should generate the property list on build time.\n */\n if (this.name === 'pseudoInstance') {\n return PROMISE_RESOLVE_FALSE;\n }\n\n /**\n * First wait until the database is idle\n */\n return this.requestIdlePromise()\n .then(() => Promise.all(this.onDestroy.map(fn => fn())))\n // destroy all collections\n .then(() => Promise.all(\n Object.keys(this.collections as any)\n .map(key => (this.collections as any)[key])\n .map(col => col.destroy())\n ))\n // destroy internal storage instances\n .then(() => this.internalStore.close())\n // remove combination from USED_COMBINATIONS-map\n .then(() => USED_DATABASE_NAMES.delete(this.storage.name + '|' + this.name))\n .then(() => true);\n }\n\n /**\n * deletes the database and its stored data.\n * Returns the names of all removed collections.\n */\n remove(): Promise {\n return this\n .destroy()\n .then(() => removeRxDatabase(this.name, this.storage, this.password));\n }\n\n get asRxDatabase(): RxDatabase<\n {},\n Internals,\n InstanceCreationOptions,\n Reactivity\n > {\n return this as any;\n }\n}\n\n/**\n * checks if an instance with same name and storage already exists\n * @throws {RxError} if used\n */\nfunction throwIfDatabaseNameUsed(\n name: string,\n storage: RxStorage\n) {\n const key = storage.name + '|' + name;\n if (!USED_DATABASE_NAMES.has(key)) {\n return;\n } else {\n throw newRxError('DB8', {\n name,\n storage: storage.name,\n link: 'https://rxdb.info/rx-database.html#ignoreduplicate'\n });\n }\n}\n\n/**\n * Creates the storage instances that are used internally in the database\n * to store schemas and other configuration stuff.\n */\nexport async function createRxDatabaseStorageInstance(\n databaseInstanceToken: string,\n storage: RxStorage,\n databaseName: string,\n options: InstanceCreationOptions,\n multiInstance: boolean,\n password?: string\n): Promise> {\n const internalStore = await storage.createStorageInstance(\n {\n databaseInstanceToken,\n databaseName,\n collectionName: INTERNAL_STORAGE_NAME,\n schema: INTERNAL_STORE_SCHEMA,\n options,\n multiInstance,\n password,\n devMode: overwritable.isDevMode()\n }\n );\n return internalStore;\n}\n\nexport function createRxDatabase<\n Collections = { [key: string]: RxCollection; },\n Internals = any,\n InstanceCreationOptions = any,\n Reactivity = unknown\n>(\n {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance = true,\n eventReduce = true,\n ignoreDuplicate = false,\n options = {},\n cleanupPolicy,\n allowSlowCount = false,\n localDocuments = false,\n hashFunction = defaultHashSha256,\n reactivity\n }: RxDatabaseCreator\n): Promise<\n RxDatabase\n> {\n runPluginHooks('preCreateRxDatabase', {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n });\n // check if combination already used\n if (!ignoreDuplicate) {\n throwIfDatabaseNameUsed(name, storage);\n }\n USED_DATABASE_NAMES.add(storage.name + '|' + name);\n\n const databaseInstanceToken = randomCouchString(10);\n\n return createRxDatabaseStorageInstance<\n Internals,\n InstanceCreationOptions\n >(\n databaseInstanceToken,\n storage,\n name,\n instanceCreationOptions as any,\n multiInstance,\n password\n )\n /**\n * Creating the internal store might fail\n * if some RxStorage wrapper is used that does some checks\n * and then throw.\n * In that case we have to properly clean up the database.\n */\n .catch(err => {\n USED_DATABASE_NAMES.delete(storage.name + '|' + name);\n throw err;\n })\n .then(storageInstance => {\n const rxDatabase: RxDatabase = new RxDatabaseBase(\n name,\n databaseInstanceToken,\n storage,\n instanceCreationOptions,\n password,\n multiInstance,\n eventReduce,\n options,\n storageInstance,\n hashFunction,\n cleanupPolicy,\n allowSlowCount,\n reactivity\n ) as any;\n\n return runAsyncPluginHooks('createRxDatabase', {\n database: rxDatabase,\n creator: {\n storage,\n instanceCreationOptions,\n name,\n password,\n multiInstance,\n eventReduce,\n ignoreDuplicate,\n options,\n localDocuments\n }\n }).then(() => rxDatabase);\n });\n}\n\n/**\n * Removes the database and all its known data\n * with all known collections and all internal meta data.\n *\n * Returns the names of the removed collections.\n */\nexport async function removeRxDatabase(\n databaseName: string,\n storage: RxStorage,\n password?: string\n): Promise {\n const databaseInstanceToken = randomCouchString(10);\n const dbInternalsStorageInstance = await createRxDatabaseStorageInstance(\n databaseInstanceToken,\n storage,\n databaseName,\n {},\n false,\n password\n );\n const collectionDocs = await getAllCollectionDocuments(dbInternalsStorageInstance);\n const collectionNames = new Set();\n collectionDocs.forEach(doc => collectionNames.add(doc.data.name));\n const removedCollectionNames: string[] = Array.from(collectionNames);\n\n await Promise.all(\n removedCollectionNames.map(collectionName => removeCollectionStorages(\n storage,\n dbInternalsStorageInstance,\n databaseInstanceToken,\n databaseName,\n collectionName,\n password\n ))\n );\n\n await runAsyncPluginHooks('postRemoveRxDatabase', {\n databaseName,\n storage\n });\n\n await dbInternalsStorageInstance.remove();\n return removedCollectionNames;\n}\n\nexport function isRxDatabase(obj: any) {\n return obj instanceof RxDatabaseBase;\n}\n\nexport function dbCount(): number {\n return DB_COUNT;\n}\n\n\n/**\n * Returns true if the given RxDatabase was the first\n * instance that was created on the storage with this name.\n *\n * Can be used for some optimizations because on the first instantiation,\n * we can assume that no data was written before.\n */\nexport async function isRxDatabaseFirstTimeInstantiated(\n database: RxDatabase\n): Promise {\n const tokenDoc = await database.storageTokenDocument;\n return tokenDoc.data.instanceToken === database.token;\n}\n\n\n/**\n * For better performance some tasks run async\n * and are awaited later.\n * But we still have to ensure that there have been no errors\n * on database creation.\n */\nexport async function ensureNoStartupErrors(\n rxDatabase: RxDatabaseBase\n) {\n await rxDatabase.storageToken;\n if (rxDatabase.startupErrors[0]) {\n throw rxDatabase.startupErrors[0];\n }\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/rx-error.js b/dist/esm/rx-error.js index ace6e521bf3..a2ac8ea78af 100644 --- a/dist/esm/rx-error.js +++ b/dist/esm/rx-error.js @@ -62,7 +62,7 @@ export var RxError = /*#__PURE__*/function (_Error) { return false; } }]); -}(/*#__PURE__*/_wrapNativeSuper(Error)); +}( /*#__PURE__*/_wrapNativeSuper(Error)); export var RxTypeError = /*#__PURE__*/function (_TypeError) { // always true, use this to detect if its an rxdb-error @@ -93,7 +93,7 @@ export var RxTypeError = /*#__PURE__*/function (_TypeError) { return true; } }]); -}(/*#__PURE__*/_wrapNativeSuper(TypeError)); +}( /*#__PURE__*/_wrapNativeSuper(TypeError)); export function getErrorUrl(code) { return 'https://rxdb.info/errors.html?console=errors#' + code; } diff --git a/dist/esm/rx-error.js.map b/dist/esm/rx-error.js.map index 1c6913e51e4..c840de637f2 100644 --- a/dist/esm/rx-error.js.map +++ b/dist/esm/rx-error.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-error.js","names":["overwritable","parametersToString","parameters","ret","Object","keys","length","map","k","paramStr","err","JSON","stringify","getOwnPropertyNames","_k","v","undefined","e","join","messageForError","message","code","RxError","_Error","_this","mes","call","url","getErrorUrl","rxdb","_inheritsLoose","_proto","prototype","toString","_createClass","key","get","_wrapNativeSuper","Error","RxTypeError","_TypeError","_this2","_proto2","TypeError","errorUrlHint","newRxError","tunnelErrorMessage","newRxTypeError","isBulkWriteConflictError","status","STORAGE_WRITE_ERROR_CODE_TO_MESSAGE","rxStorageWriteErrorToRxError","name","document","documentId","writeError"],"sources":["../../src/rx-error.ts"],"sourcesContent":["/**\n * here we use custom errors with the additional field 'parameters'\n */\n\nimport { overwritable } from './overwritable.ts';\nimport type {\n RxErrorParameters,\n RxErrorKey,\n RxStorageWriteError,\n RxStorageWriteErrorConflict\n} from './types/index.d.ts';\n\n/**\n * transform an object of parameters to a presentable string\n */\nfunction parametersToString(parameters: any): string {\n let ret = '';\n if (Object.keys(parameters).length === 0)\n return ret;\n ret += 'Given parameters: {\\n';\n ret += Object.keys(parameters)\n .map(k => {\n let paramStr = '[object Object]';\n try {\n if (k === 'errors') {\n paramStr = parameters[k].map((err: any) => JSON.stringify(err, Object.getOwnPropertyNames(err)));\n } else {\n paramStr = JSON.stringify(parameters[k], function (_k, v) {\n return v === undefined ? null : v;\n }, 2);\n }\n } catch (e) { }\n return k + ':' + paramStr;\n })\n .join('\\n');\n ret += '}';\n return ret;\n}\n\nfunction messageForError(\n message: string,\n code: string,\n parameters: any\n): string {\n return 'RxError (' + code + '):' + '\\n' +\n message + '\\n' +\n parametersToString(parameters);\n}\n\nexport class RxError extends Error {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return false;\n }\n}\n\nexport class RxTypeError extends TypeError {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxTypeError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return true;\n }\n}\n\n\nexport function getErrorUrl(code: RxErrorKey) {\n return 'https://rxdb.info/errors.html?console=errors#' + code;\n}\n\nexport function errorUrlHint(code: RxErrorKey) {\n return '\\n You can find out more about this error here: ' + getErrorUrl(code) + ' ';\n}\n\nexport function newRxError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxError {\n return new RxError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\nexport function newRxTypeError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxTypeError {\n return new RxTypeError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\n\n/**\n * Returns the error if it is a 409 conflict,\n * return false if it is another error.\n */\nexport function isBulkWriteConflictError(\n err?: RxStorageWriteError | any\n): RxStorageWriteErrorConflict | false {\n if (\n err &&\n err.status === 409\n ) {\n return err;\n } else {\n return false;\n }\n}\n\n\nconst STORAGE_WRITE_ERROR_CODE_TO_MESSAGE: { [k: number]: string; } = {\n 409: 'document write conflict',\n 422: 'schema validation error',\n 510: 'attachment data missing'\n};\n\nexport function rxStorageWriteErrorToRxError(err: RxStorageWriteError): RxError {\n return newRxError('COL20', {\n name: STORAGE_WRITE_ERROR_CODE_TO_MESSAGE[err.status],\n document: err.documentId,\n writeError: err\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-error.js","names":["overwritable","parametersToString","parameters","ret","Object","keys","length","map","k","paramStr","err","JSON","stringify","getOwnPropertyNames","_k","v","undefined","e","join","messageForError","message","code","RxError","_Error","_this","mes","call","url","getErrorUrl","rxdb","_inheritsLoose","_proto","prototype","toString","_createClass","key","get","_wrapNativeSuper","Error","RxTypeError","_TypeError","_this2","_proto2","TypeError","errorUrlHint","newRxError","tunnelErrorMessage","newRxTypeError","isBulkWriteConflictError","status","STORAGE_WRITE_ERROR_CODE_TO_MESSAGE","rxStorageWriteErrorToRxError","name","document","documentId","writeError"],"sources":["../../src/rx-error.ts"],"sourcesContent":["/**\n * here we use custom errors with the additional field 'parameters'\n */\n\nimport { overwritable } from './overwritable.ts';\nimport type {\n RxErrorParameters,\n RxErrorKey,\n RxStorageWriteError,\n RxStorageWriteErrorConflict\n} from './types/index.d.ts';\n\n/**\n * transform an object of parameters to a presentable string\n */\nfunction parametersToString(parameters: any): string {\n let ret = '';\n if (Object.keys(parameters).length === 0)\n return ret;\n ret += 'Given parameters: {\\n';\n ret += Object.keys(parameters)\n .map(k => {\n let paramStr = '[object Object]';\n try {\n if (k === 'errors') {\n paramStr = parameters[k].map((err: any) => JSON.stringify(err, Object.getOwnPropertyNames(err)));\n } else {\n paramStr = JSON.stringify(parameters[k], function (_k, v) {\n return v === undefined ? null : v;\n }, 2);\n }\n } catch (e) { }\n return k + ':' + paramStr;\n })\n .join('\\n');\n ret += '}';\n return ret;\n}\n\nfunction messageForError(\n message: string,\n code: string,\n parameters: any\n): string {\n return 'RxError (' + code + '):' + '\\n' +\n message + '\\n' +\n parametersToString(parameters);\n}\n\nexport class RxError extends Error {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return false;\n }\n}\n\nexport class RxTypeError extends TypeError {\n public code: RxErrorKey;\n public message: string;\n public url: string;\n public parameters: RxErrorParameters;\n // always true, use this to detect if its an rxdb-error\n public rxdb: true;\n constructor(\n code: RxErrorKey,\n message: string,\n parameters: RxErrorParameters = {}\n ) {\n const mes = messageForError(message, code, parameters);\n super(mes);\n this.code = code;\n this.message = mes;\n this.url = getErrorUrl(code);\n this.parameters = parameters;\n this.rxdb = true; // tag them as internal\n }\n get name(): string {\n return 'RxTypeError (' + this.code + ')';\n }\n toString(): string {\n return this.message;\n }\n get typeError(): boolean {\n return true;\n }\n}\n\n\nexport function getErrorUrl(code: RxErrorKey) {\n return 'https://rxdb.info/errors.html?console=errors#' + code;\n}\n\nexport function errorUrlHint(code: RxErrorKey) {\n return '\\n You can find out more about this error here: ' + getErrorUrl(code) + ' ';\n}\n\nexport function newRxError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxError {\n return new RxError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\nexport function newRxTypeError(\n code: RxErrorKey,\n parameters?: RxErrorParameters\n): RxTypeError {\n return new RxTypeError(\n code,\n overwritable.tunnelErrorMessage(code) + errorUrlHint(code),\n parameters\n );\n}\n\n\n/**\n * Returns the error if it is a 409 conflict,\n * return false if it is another error.\n */\nexport function isBulkWriteConflictError(\n err?: RxStorageWriteError | any\n): RxStorageWriteErrorConflict | false {\n if (\n err &&\n err.status === 409\n ) {\n return err;\n } else {\n return false;\n }\n}\n\n\nconst STORAGE_WRITE_ERROR_CODE_TO_MESSAGE: { [k: number]: string; } = {\n 409: 'document write conflict',\n 422: 'schema validation error',\n 510: 'attachment data missing'\n};\n\nexport function rxStorageWriteErrorToRxError(err: RxStorageWriteError): RxError {\n return newRxError('COL20', {\n name: STORAGE_WRITE_ERROR_CODE_TO_MESSAGE[err.status],\n document: err.documentId,\n writeError: err\n });\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/rx-query.js.map b/dist/esm/rx-query.js.map index 3463d7c712d..d7191439d67 100644 --- a/dist/esm/rx-query.js.map +++ b/dist/esm/rx-query.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-query.js","names":["BehaviorSubject","firstValueFrom","merge","mergeMap","filter","map","startWith","distinctUntilChanged","shareReplay","appendToArray","areRxDocumentArraysEqual","now","overwriteGetterForCaching","pluginMissing","PROMISE_RESOLVE_FALSE","RX_META_LWT_MINIMUM","RXJS_SHARE_REPLAY_DEFAULTS","sortObject","newRxError","runPluginHooks","calculateNewResults","triggerCacheReplacement","getQueryMatcher","getSortComparator","normalizeMangoQuery","runQueryUpdateFunction","selectorIncludesDeleted","RxQuerySingleResult","getQueryPlan","ensureNotFalsy","getChangedDocumentsSince","_queryCount","newQueryID","RESTORE_QUERY_UPDATE_DRIFT","RESTORE_QUERY_MAX_DOCS_CHANGED","RESTORE_QUERY_MAX_TIME_AGO","RxQueryBase","op","mangoQuery","collection","other","id","_execOverDatabaseCount","_creationTime","_lastEnsureEqual","uncached","refCount$","_result","_latestChangeEvent","_lastExecStart","_lastExecEnd","_limitBufferSize","_limitBufferResults","_persistentQueryCacheResult","undefined","_persistentQueryCacheResultLwt","_ensureEqualQueue","_getDefaultQuery","isFindOneByIdQuery","schema","primaryPath","_proto","prototype","_setResultData","newResultData","Map","Array","from","values","docsDataMap","docsMap","docs","docData","_docCache","getCachedRxDocument","docsData","doc","set","primary","_data","length","_execOverDatabase","preparedQuery","getPreparedQuery","result","storageInstance","count","mode","database","allowSlowCount","queryObj","ids","selector","$in","ret","mustBeQueried","forEach","getLatestDocumentDataIfExists","_deleted","push","findDocumentsById","docsPromise","queryCollection","then","exec","throwIfMissing","name","query","_ensureEqual","$","toString","stringObj","value","JSON","stringify","persistentQueryId","String","hashFunction","hookInput","rxQuery","jsonSchema","includesDeleted","$eq","index","unshift","limit","prepareQuery","doesDocumentDataMatch","queryMatcher","remove","isArray","Promise","all","incrementalRemove","asRxQuery","update","_updateObj","patch","incrementalPatch","modify","mutationFunction","incrementalModify","where","_queryObj","sort","_params","skip","_amount","enableLimitBuffer","bufferSize","console","error","enablePersistentQueryCache","backend","_persistentQueryCacheBackend","_persistentQueryCacheLoaded","_restoreQueryCacheFromPersistedState","getItem","log","persistedQueryCacheIds","Set","limitBufferIds","startsWith","add","replace","time","lwt","Number","documents","changedDocs","Math","floor","changedDocIds","d","docIdsWeNeedToFetch","has","otherPotentialMatchingDocs","_queryCollectionByIds","concat","normalizedMangoQuery","sortComparator","Infinity","lastValidIndex","findLastIndex","slice","unchangedItemsMayNowBeInResults","size","pastLimitItems","finalResults","_changeEventBuffer","counter","timeEnd","_createClass","key","get","_$","results$","pipe","changeEvent","isLocal","prev","curr","useResult","reactivity","getReactivityFactory","fromObservable","normalizedQuery","tunnelQueryCache","_queryCache","getByQuery","createRxQuery","_isResultsInSync","currentLatestEventNumber","getCounter","destroyed","__ensureEqual","mustReExec","missedChangeEvents","getFrom","runChangeEvents","reduceByLastOfDoc","_loop","cE","find","documentId","previousCount","newCount","didMatchBefore","previousDocumentData","doesMatchNow","documentData","eventReduceResult","runFullQueryAgain","changed","newResults","returnValue","updatePersistentQueryCache","docsKeys","idsToPersist","setItem","docResults","docIds","docId","Object","mutateableQuery","queryPlan","docsFromStorage","fromStorageList","queryResult","splice","keys","r","isRxQuery","obj"],"sources":["../../src/rx-query.ts"],"sourcesContent":["import {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n merge\n} from 'rxjs';\nimport {\n mergeMap,\n filter,\n map,\n startWith,\n distinctUntilChanged,\n shareReplay\n} from 'rxjs/operators';\nimport {\n appendToArray,\n areRxDocumentArraysEqual,\n now,\n overwriteGetterForCaching,\n pluginMissing,\n PROMISE_RESOLVE_FALSE, RX_META_LWT_MINIMUM,\n RXJS_SHARE_REPLAY_DEFAULTS,\n sortObject\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\nimport type {\n MangoQuery,\n PreparedQuery,\n QueryMatcher,\n RxChangeEvent,\n RxCollection,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n FilledMangoQuery,\n ModifyFunction,\n RxDocumentWriteData,\n RxQuery,\n RxQueryOP, MangoQuerySelector, MangoQuerySortPart\n} from './types/index.d.ts';\nimport { calculateNewResults } from './event-reduce.ts';\nimport { triggerCacheReplacement } from './query-cache.ts';\nimport {\n getQueryMatcher,\n getSortComparator,\n normalizeMangoQuery,\n runQueryUpdateFunction,\n selectorIncludesDeleted\n\n} from './rx-query-helper.ts';\nimport { RxQuerySingleResult } from './rx-query-single-result.ts';\nimport { getQueryPlan } from './query-planner.ts';\nimport { ensureNotFalsy } from 'event-reduce-js';\nimport { getChangedDocumentsSince } from './rx-storage-helper.ts';\n\n\nexport interface QueryCacheBackend {\n getItem(key: string): Promise;\n setItem(key: string, value: T): Promise;\n}\n\nlet _queryCount = 0;\nconst newQueryID = function (): number {\n return ++_queryCount;\n};\n\n// allow changes to be 100ms older than the actual lwt value\nconst RESTORE_QUERY_UPDATE_DRIFT = 100;\n\n// 5000 seems like a sane number where re-executing the query will be easier than trying to restore\nconst RESTORE_QUERY_MAX_DOCS_CHANGED = 5000;\n\n// If a query was persisted more than a week ago, just re-execute it\nexport const RESTORE_QUERY_MAX_TIME_AGO = 7 * 24 * 60 * 60 * 1000;\n\nexport class RxQueryBase<\n RxDocType,\n RxQueryResult,\n OrmMethods = {},\n Reactivity = unknown,\n> {\n\n public id: number = newQueryID();\n\n /**\n * Some stats then are used for debugging and cache replacement policies\n */\n public _execOverDatabaseCount: number = 0;\n public _creationTime = now();\n\n // used in the query-cache to determine if the RxQuery can be cleaned up.\n public _lastEnsureEqual = 0;\n\n public uncached = false;\n\n // used to count the subscribers to the query\n public refCount$ = new BehaviorSubject(null);\n\n public isFindOneByIdQuery: false | string | string[];\n\n\n /**\n * Contains the current result state\n * or null if query has not run yet.\n */\n public _result: RxQuerySingleResult | null = null;\n\n\n constructor(\n public op: RxQueryOP,\n public mangoQuery: Readonly>,\n public collection: RxCollection,\n // used by some plugins\n public other: any = {}\n ) {\n if (!mangoQuery) {\n this.mangoQuery = _getDefaultQuery();\n }\n\n this.isFindOneByIdQuery = isFindOneByIdQuery(\n this.collection.schema.primaryPath as string,\n mangoQuery\n );\n }\n get $(): BehaviorSubject {\n if (!this._$) {\n\n const results$ = this.collection.$.pipe(\n /**\n * Performance shortcut.\n * Changes to local documents are not relevant for the query.\n */\n filter(changeEvent => !changeEvent.isLocal),\n /**\n * Start once to ensure the querying also starts\n * when there where no changes.\n */\n startWith(null),\n // ensure query results are up to date.\n mergeMap(() => _ensureEqual(this as any)),\n // use the current result set, written by _ensureEqual().\n map(() => this._result),\n // do not run stuff above for each new subscriber, only once.\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n // do not proceed if result set has not changed.\n distinctUntilChanged((prev, curr) => {\n if (prev && prev.time === ensureNotFalsy(curr).time) {\n return true;\n } else {\n return false;\n }\n }),\n filter(result => !!result),\n /**\n * Map the result set to a single RxDocument or an array,\n * depending on query type\n */\n map((result) => {\n const useResult = ensureNotFalsy(result);\n if (this.op === 'count') {\n return useResult.count;\n } else if (this.op === 'findOne') {\n // findOne()-queries emit RxDocument or null\n return useResult.documents.length === 0 ? null : useResult.documents[0];\n } else if (this.op === 'findByIds') {\n return useResult.docsMap;\n } else {\n // find()-queries emit RxDocument[]\n // Flat copy the array so it won't matter if the user modifies it.\n return useResult.documents.slice(0);\n }\n })\n );\n\n this._$ = merge(\n results$,\n /**\n * Also add the refCount$ to the query observable\n * to allow us to count the amount of subscribers.\n */\n this.refCount$.pipe(\n filter(() => false)\n )\n );\n }\n return this._$ as any;\n }\n\n get $$(): Reactivity {\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n this.$,\n undefined,\n this.collection.database\n ) as any;\n }\n\n get includesDeleted(): boolean {\n return selectorIncludesDeleted(this.mangoQuery.selector);\n }\n\n // stores the changeEvent-number of the last handled change-event\n public _latestChangeEvent: -1 | number = -1;\n\n // time stamps on when the last full exec over the database has run\n // used to properly handle events that happen while the find-query is running\n public _lastExecStart: number = 0;\n public _lastExecEnd: number = 0;\n\n // Fields used for the Limit Buffer when enabled:\n public _limitBufferSize: number | null = null;\n public _limitBufferResults: RxDocumentData[] | null = null;\n\n // Fields used for the persistent query cache when enabled:\n public _persistentQueryCacheResult?: string[] | string = undefined;\n public _persistentQueryCacheResultLwt?: string = undefined; // lwt = latest write time\n public _persistentQueryCacheLoaded?: Promise;\n public _persistentQueryCacheBackend?: QueryCacheBackend;\n\n /**\n * ensures that the exec-runs\n * are not run in parallel\n */\n public _ensureEqualQueue: Promise = PROMISE_RESOLVE_FALSE;\n\n /**\n * Returns an observable that emits the results\n * This should behave like an rxjs-BehaviorSubject which means:\n * - Emit the current result-set on subscribe\n * - Emit the new result-set when an RxChangeEvent comes in\n * - Do not emit anything before the first result-set was created (no null)\n */\n public _$?: Observable;\n\n /**\n * set the new result-data as result-docs of the query\n * @param newResultData json-docs that were received from the storage\n */\n _setResultData(newResultData: RxDocumentData[] | number | Map>): void {\n if (typeof newResultData === 'number') {\n this._result = new RxQuerySingleResult(\n this.collection,\n [],\n newResultData\n );\n return;\n } else if (newResultData instanceof Map) {\n newResultData = Array.from((newResultData as Map>).values());\n }\n\n const docsDataMap = new Map();\n const docsMap = new Map();\n\n\n const docs = newResultData.map(docData => this.collection._docCache.getCachedRxDocument(docData));\n\n /**\n * Instead of using the newResultData in the result cache,\n * we directly use the objects that are stored in the RxDocument\n * to ensure we do not store the same data twice and fill up the memory.\n */\n const docsData = docs.map(doc => {\n docsDataMap.set(doc.primary, doc._data);\n docsMap.set(doc.primary, doc);\n return doc._data;\n });\n\n this._result = new RxQuerySingleResult(this.collection, docsData, docsData.length);\n }\n\n /**\n * executes the query on the database\n * @return results-array with document-data\n */\n async _execOverDatabase(): Promise[] | number> {\n this._execOverDatabaseCount = this._execOverDatabaseCount + 1;\n this._lastExecStart = now();\n\n\n if (this.op === 'count') {\n const preparedQuery = this.getPreparedQuery();\n const result = await this.collection.storageInstance.count(preparedQuery);\n if (result.mode === 'slow' && !this.collection.database.allowSlowCount) {\n throw newRxError('QU14', {\n collection: this.collection,\n queryObj: this.mangoQuery\n });\n } else {\n return result.count;\n }\n }\n\n if (this.op === 'findByIds') {\n const ids: string[] = ensureNotFalsy(this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\n const ret = new Map>();\n const mustBeQueried: string[] = [];\n // first try to fill from docCache\n ids.forEach(id => {\n const docData = this.collection._docCache.getLatestDocumentDataIfExists(id);\n if (docData) {\n if (!docData._deleted) {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(id, doc);\n }\n } else {\n mustBeQueried.push(id);\n }\n });\n // everything which was not in docCache must be fetched from the storage\n if (mustBeQueried.length > 0) {\n const docs = await this.collection.storageInstance.findDocumentsById(mustBeQueried, false);\n docs.forEach(docData => {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(doc.primary, doc);\n });\n }\n return ret as any;\n }\n\n\n const docsPromise = queryCollection(this as any);\n return docsPromise.then(docs => {\n this._lastExecEnd = now();\n return docs;\n });\n }\n\n /**\n * Execute the query\n * To have an easier implementations,\n * just subscribe and use the first result\n */\n public exec(throwIfMissing: true): Promise>;\n public exec(): Promise;\n public exec(throwIfMissing?: boolean): Promise {\n if (throwIfMissing && this.op !== 'findOne') {\n throw newRxError('QU9', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n }\n\n\n /**\n * run _ensureEqual() here,\n * this will make sure that errors in the query which throw inside of the RxStorage,\n * will be thrown at this execution context and not in the background.\n */\n return _ensureEqual(this as any)\n .then(() => firstValueFrom(this.$))\n .then(result => {\n if (!result && throwIfMissing) {\n throw newRxError('QU10', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n } else {\n return result;\n }\n });\n }\n\n\n\n /**\n * cached call to get the queryMatcher\n * @overwrites itself with the actual value\n */\n get queryMatcher(): QueryMatcher> {\n const schema = this.collection.schema.jsonSchema;\n const normalizedQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n return overwriteGetterForCaching(\n this,\n 'queryMatcher',\n getQueryMatcher(\n schema,\n normalizedQuery\n ) as any\n );\n }\n\n /**\n * returns a string that is used for equal-comparisons\n * @overwrites itself with the actual value\n */\n toString(): string {\n const stringObj = sortObject({\n op: this.op,\n query: this.mangoQuery,\n other: this.other\n }, true);\n const value = JSON.stringify(stringObj);\n this.toString = () => value;\n return value;\n }\n\n persistentQueryId() {\n return String(this.collection.database.hashFunction(this.toString()));\n }\n\n /**\n * returns the prepared query\n * which can be send to the storage instance to query for documents.\n * @overwrites itself with the actual value.\n */\n getPreparedQuery(): PreparedQuery {\n const hookInput = {\n rxQuery: this,\n // can be mutated by the hooks so we have to deep clone first.\n mangoQuery: normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n )\n };\n\n // Set _deleted to false if not explicitly set in selector\n if (!this.includesDeleted) {\n hookInput.mangoQuery.selector = {\n ...hookInput.mangoQuery.selector,\n _deleted: { $eq: false },\n };\n }\n\n if (hookInput.mangoQuery.index) {\n hookInput.mangoQuery.index.unshift('_deleted');\n }\n\n if (this._limitBufferSize !== null && hookInput.mangoQuery.limit) {\n hookInput.mangoQuery.limit = hookInput.mangoQuery.limit + this._limitBufferSize;\n }\n\n runPluginHooks('prePrepareQuery', hookInput);\n\n const value = prepareQuery(\n this.collection.schema.jsonSchema,\n hookInput.mangoQuery as any\n );\n\n this.getPreparedQuery = () => value;\n return value;\n }\n\n /**\n * returns true if the document matches the query,\n * does not use the 'skip' and 'limit'\n */\n doesDocumentDataMatch(docData: RxDocType | any): boolean {\n // if doc is deleted, it cannot match\n if (docData._deleted) {\n return false;\n }\n\n return this.queryMatcher(docData);\n }\n\n /**\n * deletes all found documents\n * @return promise with deleted documents\n */\n remove(): Promise {\n return this\n .exec()\n .then(docs => {\n if (Array.isArray(docs)) {\n // TODO use a bulk operation instead of running .remove() on each document\n return Promise.all(docs.map(doc => doc.remove()));\n } else {\n return (docs as any).remove();\n }\n });\n }\n incrementalRemove(): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalRemove(),\n );\n }\n\n\n /**\n * helper function to transform RxQueryBase to RxQuery type\n */\n get asRxQuery(): RxQuery {\n return this as any;\n }\n\n /**\n * updates all found documents\n * @overwritten by plugin (optional)\n */\n update(_updateObj: any): Promise {\n throw pluginMissing('update');\n }\n\n patch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.patch(patch),\n );\n }\n incrementalPatch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalPatch(patch),\n );\n }\n modify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.modify(mutationFunction),\n );\n }\n incrementalModify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalModify(mutationFunction),\n );\n }\n\n\n // we only set some methods of query-builder here\n // because the others depend on these ones\n where(_queryObj: MangoQuerySelector | keyof RxDocType | string): RxQuery {\n throw pluginMissing('query-builder');\n }\n sort(_params: string | MangoQuerySortPart): RxQuery {\n throw pluginMissing('query-builder');\n }\n skip(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n limit(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n\n enableLimitBuffer(bufferSize: number) {\n if (this._limitBufferSize !== null) {\n // Limit buffer has already been enabled, do nothing:\n return this;\n }\n if (this._lastExecStart !== 0) {\n console.error('Can\\'t use limit buffer if query has already executed');\n return this;\n }\n if (this.mangoQuery.skip || !this.mangoQuery.limit) {\n console.error('Right now, limit buffer only works on non-skip, limit queries.');\n return this;\n }\n this._limitBufferSize = bufferSize;\n return this;\n }\n\n enablePersistentQueryCache(backend: QueryCacheBackend) {\n if (this._persistentQueryCacheBackend) {\n // We've already tried to enable the query cache\n return this;\n }\n this._persistentQueryCacheBackend = backend;\n this._persistentQueryCacheLoaded = this._restoreQueryCacheFromPersistedState();\n return this;\n }\n\n private async _restoreQueryCacheFromPersistedState() {\n if (!this._persistentQueryCacheBackend) {\n // no cache backend provided, do nothing\n return;\n }\n if (this._persistentQueryCacheResult) {\n // we already restored the cache once, no need to run twice\n return;\n }\n if (this.mangoQuery.skip || this.op === 'count') {\n console.error('The persistent query cache only works on non-skip, non-count queries.');\n return;\n }\n\n // First, check if there are any query results persisted:\n const persistentQueryId = this.persistentQueryId();\n const value = await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}`);\n if (!value || !Array.isArray(value) || value.length === 0) {\n // eslint-disable-next-line no-console\n console.log(`no persistent query cache found in the backend, returning early ${this.toString()}`);\n return;\n }\n\n // If there are persisted ids, create our two Sets of ids from the cache:\n const persistedQueryCacheIds = new Set();\n const limitBufferIds = new Set();\n\n for (const id of value) {\n if (id.startsWith('lb-')) {\n limitBufferIds.add(id.replace('lb-', ''));\n } else {\n persistedQueryCacheIds.add(id);\n }\n }\n\n // eslint-disable-next-line no-console\n console.time(`Restoring persistent querycache ${this.toString()}`);\n\n // Next, pull the lwt from the cache:\n // TODO: if lwt is too old, should we just give up here? What if there are too many changedDocs?\n const lwt = (await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}:lwt`)) as string | null;\n if (!lwt) {\n return;\n }\n\n // If the query was persisted too long ago, just re-execute it.\n if (now() - Number(lwt) > RESTORE_QUERY_MAX_TIME_AGO) {\n return;\n }\n\n const primaryPath = this.collection.schema.primaryPath;\n\n const {documents: changedDocs} = await getChangedDocumentsSince(this.collection.storageInstance,\n RESTORE_QUERY_MAX_DOCS_CHANGED,\n // make sure we remove the monotonic clock (xxx.01, xxx.02) from the lwt timestamp to avoid issues with\n // lookups in indices (dexie)\n {id: '', lwt: Math.floor(Number(lwt)) - RESTORE_QUERY_UPDATE_DRIFT}\n );\n\n // If too many docs have changed, just give up and re-execute the query\n if (changedDocs.length === RESTORE_QUERY_MAX_DOCS_CHANGED) {\n return;\n }\n\n const changedDocIds = new Set(changedDocs.map((d) => d[primaryPath] as string));\n\n const docIdsWeNeedToFetch = [...persistedQueryCacheIds, ...limitBufferIds].filter((id) => !changedDocIds.has(id));\n\n // We use _queryCollectionByIds to fetch the remaining docs we need efficiently, pulling\n // from query cache if we can (and the storageInstance by ids if we can't):\n const otherPotentialMatchingDocs: RxDocumentData[] = [];\n await _queryCollectionByIds(this as any, otherPotentialMatchingDocs, docIdsWeNeedToFetch);\n\n // Now that we have all potential documents, we just filter (in-memory) the ones that still match our query:\n let docsData: RxDocumentData[] = [];\n for (const doc of changedDocs.concat(otherPotentialMatchingDocs)) {\n if (this.doesDocumentDataMatch(doc)) {\n docsData.push(doc);\n }\n }\n\n // Sort the documents by the query's sort field:\n const normalizedMangoQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n const sortComparator = getSortComparator(this.collection.schema.jsonSchema, normalizedMangoQuery);\n const limit = normalizedMangoQuery.limit ? normalizedMangoQuery.limit : Infinity;\n docsData = docsData.sort(sortComparator);\n\n // We know for sure that all persisted and limit buffer ids (and changed docs before them) are in the correct\n // result set. And we can't be sure about any past that point. So cut it off there:\n const lastValidIndex = docsData.findLastIndex((d) => limitBufferIds.has(d[primaryPath] as string) || persistedQueryCacheIds.has(d[primaryPath] as string));\n docsData = docsData.slice(0, lastValidIndex + 1);\n\n // Now this is the trickiest part.\n // If we somehow have fewer docs than the limit of our query\n // (and this wasn't the case because before persistence)\n // then there is no way for us to know the correct results, and we re-exec:\n const unchangedItemsMayNowBeInResults = (\n this.mangoQuery.limit &&\n docsData.length < this.mangoQuery.limit &&\n persistedQueryCacheIds.size >= this.mangoQuery.limit\n );\n if (unchangedItemsMayNowBeInResults) {\n return;\n }\n\n // Our finalResults are the actual results of this query, and pastLimitItems are any remaining matching\n // documents we have left over (past the limit).\n const pastLimitItems = docsData.slice(limit);\n const finalResults = docsData.slice(0, limit);\n\n // If there are still items past the first LIMIT items, try to restore the limit buffer with them:\n if (limitBufferIds.size && pastLimitItems.length > 0) {\n this._limitBufferResults = pastLimitItems;\n } else {\n this._limitBufferResults = [];\n }\n\n // Finally, set the query's results to what we've pulled from disk:\n this._lastEnsureEqual = now();\n this._latestChangeEvent = this.collection._changeEventBuffer.counter;\n this._setResultData(finalResults);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Restoring persistent querycache ${this.toString()}`);\n }\n}\n\nexport function _getDefaultQuery(): MangoQuery {\n return {\n selector: {}\n };\n}\n\n/**\n * run this query through the QueryCache\n */\nexport function tunnelQueryCache(\n rxQuery: RxQueryBase\n): RxQuery {\n return rxQuery.collection._queryCache.getByQuery(rxQuery as any);\n}\n\nexport function createRxQuery(\n op: RxQueryOP,\n queryObj: MangoQuery,\n collection: RxCollection,\n other?: any\n) {\n runPluginHooks('preCreateRxQuery', {\n op,\n queryObj,\n collection,\n other\n });\n\n let ret = new RxQueryBase(op, queryObj, collection, other);\n\n // ensure when created with same params, only one is created\n ret = tunnelQueryCache(ret);\n // TODO: clear persistent query cache as well\n triggerCacheReplacement(collection);\n\n return ret;\n}\n\n/**\n * Check if the current results-state is in sync with the database\n * which means that no write event happened since the last run.\n * @return false if not which means it should re-execute\n */\nfunction _isResultsInSync(rxQuery: RxQueryBase): boolean {\n const currentLatestEventNumber = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n if (rxQuery._latestChangeEvent >= currentLatestEventNumber) {\n return true;\n } else {\n return false;\n }\n}\n\n\n/**\n * wraps __ensureEqual()\n * to ensure it does not run in parallel\n * @return true if has changed, false if not\n */\nfunction _ensureEqual(rxQuery: RxQueryBase): Promise {\n // Optimisation shortcut\n if (\n rxQuery.collection.database.destroyed ||\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\n .then(() => __ensureEqual(rxQuery));\n return rxQuery._ensureEqualQueue;\n}\n\n\n/**\n * ensures that the results of this query is equal to the results which a query over the database would give\n * @return true if results have changed\n */\nasync function __ensureEqual(rxQuery: RxQueryBase): Promise {\n await rxQuery._persistentQueryCacheLoaded;\n\n rxQuery._lastEnsureEqual = now();\n\n /**\n * Optimisation shortcuts\n */\n if (\n // db is closed\n rxQuery.collection.database.destroyed ||\n // nothing happened since last run\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n let ret = false;\n let mustReExec = false; // if this becomes true, a whole execution over the database is made\n if (rxQuery._latestChangeEvent === -1) {\n // have not executed yet -> must run\n mustReExec = true;\n }\n\n /**\n * try to use EventReduce to calculate the new results\n */\n if (!mustReExec) {\n const missedChangeEvents = rxQuery.asRxQuery.collection._changeEventBuffer.getFrom(rxQuery._latestChangeEvent + 1);\n if (missedChangeEvents === null) {\n // changeEventBuffer is of bounds -> we must re-execute over the database\n mustReExec = true;\n } else {\n rxQuery._latestChangeEvent = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n\n const runChangeEvents: RxChangeEvent[] = rxQuery.asRxQuery.collection\n ._changeEventBuffer\n .reduceByLastOfDoc(missedChangeEvents);\n\n if (rxQuery._limitBufferResults !== null) {\n // Check if any item in our limit buffer was modified by a change event\n for (const cE of runChangeEvents) {\n if (rxQuery._limitBufferResults.find((doc) => doc[rxQuery.collection.schema.primaryPath] === cE.documentId)) {\n // If so, the limit buffer is potential invalid -- let's just blow it up\n // TODO: could we instead update the documents in the limit buffer?\n rxQuery._limitBufferResults = null;\n break;\n }\n }\n }\n\n if (rxQuery.includesDeleted) {\n return rxQuery._execOverDatabase().then((newResultData) => {\n rxQuery._setResultData(newResultData);\n return true;\n });\n } else if (rxQuery.op === 'count') {\n // 'count' query\n const previousCount = ensureNotFalsy(rxQuery._result).count;\n let newCount = previousCount;\n runChangeEvents.forEach(cE => {\n const didMatchBefore = cE.previousDocumentData && rxQuery.doesDocumentDataMatch(cE.previousDocumentData);\n const doesMatchNow = rxQuery.doesDocumentDataMatch(cE.documentData);\n\n if (!didMatchBefore && doesMatchNow) {\n newCount++;\n }\n if (didMatchBefore && !doesMatchNow) {\n newCount--;\n }\n });\n if (newCount !== previousCount) {\n ret = true; // true because results changed\n rxQuery._setResultData(newCount as any);\n }\n } else {\n // 'find' or 'findOne' query\n const eventReduceResult = calculateNewResults(\n rxQuery as any,\n runChangeEvents\n );\n if (eventReduceResult.runFullQueryAgain) {\n // could not calculate the new results, execute must be done\n mustReExec = true;\n } else if (eventReduceResult.changed) {\n // we got the new results, we do not have to re-execute, mustReExec stays false\n ret = true; // true because results changed\n rxQuery._setResultData(eventReduceResult.newResults as any);\n }\n }\n }\n }\n\n // oh no we have to re-execute the whole query over the database\n if (mustReExec) {\n return rxQuery._execOverDatabase()\n .then(newResultData => {\n\n /**\n * The RxStorage is defined to always first emit events and then return\n * on bulkWrite() calls. So here we have to use the counter AFTER the execOverDatabase()\n * has been run, not the one from before.\n */\n rxQuery._latestChangeEvent = rxQuery.collection._changeEventBuffer.getCounter();\n\n // A count query needs a different has-changed check.\n if (typeof newResultData === 'number') {\n if (\n !rxQuery._result ||\n newResultData !== rxQuery._result.count\n ) {\n ret = true;\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n }\n if (\n !rxQuery._result ||\n !areRxDocumentArraysEqual(\n rxQuery.collection.schema.primaryPath,\n newResultData,\n rxQuery._result.docsData\n )\n ) {\n ret = true; // true because results changed\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n })\n .then(async (returnValue) => {\n await updatePersistentQueryCache(rxQuery);\n return returnValue;\n });\n }\n\n return ret; // true if results have changed\n}\n\n\nasync function updatePersistentQueryCache(rxQuery: RxQueryBase) {\n if (!rxQuery._persistentQueryCacheBackend) {\n return;\n }\n\n const backend = rxQuery._persistentQueryCacheBackend;\n\n const key = rxQuery.persistentQueryId();\n\n // update _persistedQueryCacheResult\n rxQuery._persistentQueryCacheResult = rxQuery._result?.docsKeys ?? [];\n\n const idsToPersist = [...rxQuery._persistentQueryCacheResult];\n if (rxQuery._limitBufferResults) {\n rxQuery._limitBufferResults.forEach((d) => {\n idsToPersist.push(`lb-${d[rxQuery.collection.schema.primaryPath]}`);\n });\n }\n // eslint-disable-next-line no-console\n console.time(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n // persist query cache\n const lwt = rxQuery._result?.time ?? RX_META_LWT_MINIMUM;\n\n await Promise.all([\n backend.setItem(`qc:${String(key)}`, idsToPersist),\n backend.setItem(`qc:${String(key)}:lwt`, lwt.toString()),\n ]);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n}\n\n\n// Refactored out of `queryCollection`: modifies the docResults array to fill it with data\nasync function _queryCollectionByIds(rxQuery: RxQuery | RxQueryBase, docResults: RxDocumentData[], docIds: string[]) {\n const collection = rxQuery.collection;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docResults.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsMap = await collection.storageInstance.findDocumentsById(docIds, false);\n Object.values(docsMap).forEach(docData => {\n docResults.push(docData);\n });\n }\n}\n\n/**\n * @returns a format of the query that can be used with the storage\n * when calling RxStorageInstance().query()\n */\nexport function prepareQuery(\n schema: RxJsonSchema>,\n mutateableQuery: FilledMangoQuery\n): PreparedQuery {\n if (!mutateableQuery.sort) {\n throw newRxError('SNH', {\n query: mutateableQuery\n });\n }\n\n /**\n * Store the query plan together with the\n * prepared query to save performance.\n */\n const queryPlan = getQueryPlan(\n schema,\n mutateableQuery\n );\n\n return {\n query: mutateableQuery,\n queryPlan\n };\n}\n\n/**\n * Runs the query over the storage instance\n * of the collection.\n * Does some optimizations to ensure findById is used\n * when specific queries are used.\n */\nexport async function queryCollection(\n rxQuery: RxQuery | RxQueryBase\n): Promise[]> {\n await rxQuery._persistentQueryCacheLoaded;\n\n let docs: RxDocumentData[] = [];\n const collection = rxQuery.collection;\n\n /**\n * Optimizations shortcut.\n * If query is find-one-document-by-id,\n * then we do not have to use the slow query() method\n * but instead can use findDocumentsById()\n */\n if (rxQuery.isFindOneByIdQuery) {\n if (Array.isArray(rxQuery.isFindOneByIdQuery)) {\n let docIds = rxQuery.isFindOneByIdQuery;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docs.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsFromStorage = await collection.storageInstance.findDocumentsById(docIds, false);\n appendToArray(docs, docsFromStorage);\n }\n await _queryCollectionByIds(rxQuery, docs, rxQuery.isFindOneByIdQuery);\n } else {\n const docId = rxQuery.isFindOneByIdQuery;\n\n // first try to fill from docCache\n let docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (!docData) {\n // otherwise get from storage\n const fromStorageList = await collection.storageInstance.findDocumentsById([docId], false);\n if (fromStorageList[0]) {\n docData = fromStorageList[0];\n }\n }\n if (docData && !docData._deleted) {\n docs.push(docData);\n }\n }\n } else {\n const preparedQuery = rxQuery.getPreparedQuery();\n const queryResult = await collection.storageInstance.query(preparedQuery);\n if (rxQuery._limitBufferSize !== null && rxQuery.mangoQuery.limit && queryResult.documents.length > rxQuery.mangoQuery.limit) {\n // If there are more than query.limit results, we pull out our buffer items from the\n // last rxQuery._limitBufferSize items of the results.\n rxQuery._limitBufferResults = queryResult.documents.splice(rxQuery.mangoQuery.limit);\n }\n docs = queryResult.documents;\n }\n return docs;\n}\n\n/**\n * Returns true if the given query\n * selects exactly one document by its id.\n * Used to optimize performance because these kind of\n * queries do not have to run over an index and can use get-by-id instead.\n * Returns false if no query of that kind.\n * Returns the document id otherwise.\n */\nexport function isFindOneByIdQuery(\n primaryPath: string,\n query: MangoQuery\n): false | string | string[] {\n // must have exactly one operator which must be $eq || $in\n if (\n !query.skip &&\n query.selector &&\n Object.keys(query.selector).length === 1 &&\n query.selector[primaryPath]\n ) {\n const value: any = query.selector[primaryPath];\n if (typeof value === 'string') {\n return value;\n } else if (\n Object.keys(value).length === 1 &&\n typeof value.$eq === 'string'\n ) {\n return value.$eq;\n }\n\n // same with $in string arrays\n if (\n Object.keys(value).length === 1 &&\n Array.isArray(value.$eq) &&\n // must only contain strings\n !(value.$eq as any[]).find(r => typeof r !== 'string')\n ) {\n return value.$eq;\n }\n }\n return false;\n}\n\n\nexport function isRxQuery(obj: any): boolean {\n return obj instanceof RxQueryBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-query.js","names":["BehaviorSubject","firstValueFrom","merge","mergeMap","filter","map","startWith","distinctUntilChanged","shareReplay","appendToArray","areRxDocumentArraysEqual","now","overwriteGetterForCaching","pluginMissing","PROMISE_RESOLVE_FALSE","RX_META_LWT_MINIMUM","RXJS_SHARE_REPLAY_DEFAULTS","sortObject","newRxError","runPluginHooks","calculateNewResults","triggerCacheReplacement","getQueryMatcher","getSortComparator","normalizeMangoQuery","runQueryUpdateFunction","selectorIncludesDeleted","RxQuerySingleResult","getQueryPlan","ensureNotFalsy","getChangedDocumentsSince","_queryCount","newQueryID","RESTORE_QUERY_UPDATE_DRIFT","RESTORE_QUERY_MAX_DOCS_CHANGED","RESTORE_QUERY_MAX_TIME_AGO","RxQueryBase","op","mangoQuery","collection","other","id","_execOverDatabaseCount","_creationTime","_lastEnsureEqual","uncached","refCount$","_result","_latestChangeEvent","_lastExecStart","_lastExecEnd","_limitBufferSize","_limitBufferResults","_persistentQueryCacheResult","undefined","_persistentQueryCacheResultLwt","_ensureEqualQueue","_getDefaultQuery","isFindOneByIdQuery","schema","primaryPath","_proto","prototype","_setResultData","newResultData","Map","Array","from","values","docsDataMap","docsMap","docs","docData","_docCache","getCachedRxDocument","docsData","doc","set","primary","_data","length","_execOverDatabase","preparedQuery","getPreparedQuery","result","storageInstance","count","mode","database","allowSlowCount","queryObj","ids","selector","$in","ret","mustBeQueried","forEach","getLatestDocumentDataIfExists","_deleted","push","findDocumentsById","docsPromise","queryCollection","then","exec","throwIfMissing","name","query","_ensureEqual","$","toString","stringObj","value","JSON","stringify","persistentQueryId","String","hashFunction","hookInput","rxQuery","jsonSchema","includesDeleted","$eq","index","unshift","limit","prepareQuery","doesDocumentDataMatch","queryMatcher","remove","isArray","Promise","all","incrementalRemove","asRxQuery","update","_updateObj","patch","incrementalPatch","modify","mutationFunction","incrementalModify","where","_queryObj","sort","_params","skip","_amount","enableLimitBuffer","bufferSize","console","error","enablePersistentQueryCache","backend","_persistentQueryCacheBackend","_persistentQueryCacheLoaded","_restoreQueryCacheFromPersistedState","getItem","log","persistedQueryCacheIds","Set","limitBufferIds","startsWith","add","replace","time","lwt","Number","documents","changedDocs","Math","floor","changedDocIds","d","docIdsWeNeedToFetch","has","otherPotentialMatchingDocs","_queryCollectionByIds","concat","normalizedMangoQuery","sortComparator","Infinity","lastValidIndex","findLastIndex","slice","unchangedItemsMayNowBeInResults","size","pastLimitItems","finalResults","_changeEventBuffer","counter","timeEnd","_createClass","key","get","_$","results$","pipe","changeEvent","isLocal","prev","curr","useResult","reactivity","getReactivityFactory","fromObservable","normalizedQuery","tunnelQueryCache","_queryCache","getByQuery","createRxQuery","_isResultsInSync","currentLatestEventNumber","getCounter","destroyed","__ensureEqual","mustReExec","missedChangeEvents","getFrom","runChangeEvents","reduceByLastOfDoc","_loop","cE","find","documentId","previousCount","newCount","didMatchBefore","previousDocumentData","doesMatchNow","documentData","eventReduceResult","runFullQueryAgain","changed","newResults","returnValue","updatePersistentQueryCache","docsKeys","idsToPersist","setItem","docResults","docIds","docId","Object","mutateableQuery","queryPlan","docsFromStorage","fromStorageList","queryResult","splice","keys","r","isRxQuery","obj"],"sources":["../../src/rx-query.ts"],"sourcesContent":["import {\n BehaviorSubject,\n firstValueFrom,\n Observable,\n merge\n} from 'rxjs';\nimport {\n mergeMap,\n filter,\n map,\n startWith,\n distinctUntilChanged,\n shareReplay\n} from 'rxjs/operators';\nimport {\n appendToArray,\n areRxDocumentArraysEqual,\n now,\n overwriteGetterForCaching,\n pluginMissing,\n PROMISE_RESOLVE_FALSE, RX_META_LWT_MINIMUM,\n RXJS_SHARE_REPLAY_DEFAULTS,\n sortObject\n} from './plugins/utils/index.ts';\nimport {\n newRxError\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\nimport type {\n MangoQuery,\n PreparedQuery,\n QueryMatcher,\n RxChangeEvent,\n RxCollection,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n FilledMangoQuery,\n ModifyFunction,\n RxDocumentWriteData,\n RxQuery,\n RxQueryOP, MangoQuerySelector, MangoQuerySortPart\n} from './types/index.d.ts';\nimport { calculateNewResults } from './event-reduce.ts';\nimport { triggerCacheReplacement } from './query-cache.ts';\nimport {\n getQueryMatcher,\n getSortComparator,\n normalizeMangoQuery,\n runQueryUpdateFunction,\n selectorIncludesDeleted\n\n} from './rx-query-helper.ts';\nimport { RxQuerySingleResult } from './rx-query-single-result.ts';\nimport { getQueryPlan } from './query-planner.ts';\nimport { ensureNotFalsy } from 'event-reduce-js';\nimport { getChangedDocumentsSince } from './rx-storage-helper.ts';\n\n\nexport interface QueryCacheBackend {\n getItem(key: string): Promise;\n setItem(key: string, value: T): Promise;\n}\n\nlet _queryCount = 0;\nconst newQueryID = function (): number {\n return ++_queryCount;\n};\n\n// allow changes to be 100ms older than the actual lwt value\nconst RESTORE_QUERY_UPDATE_DRIFT = 100;\n\n// 5000 seems like a sane number where re-executing the query will be easier than trying to restore\nconst RESTORE_QUERY_MAX_DOCS_CHANGED = 5000;\n\n// If a query was persisted more than a week ago, just re-execute it\nexport const RESTORE_QUERY_MAX_TIME_AGO = 7 * 24 * 60 * 60 * 1000;\n\nexport class RxQueryBase<\n RxDocType,\n RxQueryResult,\n OrmMethods = {},\n Reactivity = unknown,\n> {\n\n public id: number = newQueryID();\n\n /**\n * Some stats then are used for debugging and cache replacement policies\n */\n public _execOverDatabaseCount: number = 0;\n public _creationTime = now();\n\n // used in the query-cache to determine if the RxQuery can be cleaned up.\n public _lastEnsureEqual = 0;\n\n public uncached = false;\n\n // used to count the subscribers to the query\n public refCount$ = new BehaviorSubject(null);\n\n public isFindOneByIdQuery: false | string | string[];\n\n\n /**\n * Contains the current result state\n * or null if query has not run yet.\n */\n public _result: RxQuerySingleResult | null = null;\n\n\n constructor(\n public op: RxQueryOP,\n public mangoQuery: Readonly>,\n public collection: RxCollection,\n // used by some plugins\n public other: any = {}\n ) {\n if (!mangoQuery) {\n this.mangoQuery = _getDefaultQuery();\n }\n\n this.isFindOneByIdQuery = isFindOneByIdQuery(\n this.collection.schema.primaryPath as string,\n mangoQuery\n );\n }\n get $(): BehaviorSubject {\n if (!this._$) {\n\n const results$ = this.collection.$.pipe(\n /**\n * Performance shortcut.\n * Changes to local documents are not relevant for the query.\n */\n filter(changeEvent => !changeEvent.isLocal),\n /**\n * Start once to ensure the querying also starts\n * when there where no changes.\n */\n startWith(null),\n // ensure query results are up to date.\n mergeMap(() => _ensureEqual(this as any)),\n // use the current result set, written by _ensureEqual().\n map(() => this._result),\n // do not run stuff above for each new subscriber, only once.\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\n // do not proceed if result set has not changed.\n distinctUntilChanged((prev, curr) => {\n if (prev && prev.time === ensureNotFalsy(curr).time) {\n return true;\n } else {\n return false;\n }\n }),\n filter(result => !!result),\n /**\n * Map the result set to a single RxDocument or an array,\n * depending on query type\n */\n map((result) => {\n const useResult = ensureNotFalsy(result);\n if (this.op === 'count') {\n return useResult.count;\n } else if (this.op === 'findOne') {\n // findOne()-queries emit RxDocument or null\n return useResult.documents.length === 0 ? null : useResult.documents[0];\n } else if (this.op === 'findByIds') {\n return useResult.docsMap;\n } else {\n // find()-queries emit RxDocument[]\n // Flat copy the array so it won't matter if the user modifies it.\n return useResult.documents.slice(0);\n }\n })\n );\n\n this._$ = merge(\n results$,\n /**\n * Also add the refCount$ to the query observable\n * to allow us to count the amount of subscribers.\n */\n this.refCount$.pipe(\n filter(() => false)\n )\n );\n }\n return this._$ as any;\n }\n\n get $$(): Reactivity {\n const reactivity = this.collection.database.getReactivityFactory();\n return reactivity.fromObservable(\n this.$,\n undefined,\n this.collection.database\n ) as any;\n }\n\n get includesDeleted(): boolean {\n return selectorIncludesDeleted(this.mangoQuery.selector);\n }\n\n // stores the changeEvent-number of the last handled change-event\n public _latestChangeEvent: -1 | number = -1;\n\n // time stamps on when the last full exec over the database has run\n // used to properly handle events that happen while the find-query is running\n public _lastExecStart: number = 0;\n public _lastExecEnd: number = 0;\n\n // Fields used for the Limit Buffer when enabled:\n public _limitBufferSize: number | null = null;\n public _limitBufferResults: RxDocumentData[] | null = null;\n\n // Fields used for the persistent query cache when enabled:\n public _persistentQueryCacheResult?: string[] | string = undefined;\n public _persistentQueryCacheResultLwt?: string = undefined; // lwt = latest write time\n public _persistentQueryCacheLoaded?: Promise;\n public _persistentQueryCacheBackend?: QueryCacheBackend;\n\n /**\n * ensures that the exec-runs\n * are not run in parallel\n */\n public _ensureEqualQueue: Promise = PROMISE_RESOLVE_FALSE;\n\n /**\n * Returns an observable that emits the results\n * This should behave like an rxjs-BehaviorSubject which means:\n * - Emit the current result-set on subscribe\n * - Emit the new result-set when an RxChangeEvent comes in\n * - Do not emit anything before the first result-set was created (no null)\n */\n public _$?: Observable;\n\n /**\n * set the new result-data as result-docs of the query\n * @param newResultData json-docs that were received from the storage\n */\n _setResultData(newResultData: RxDocumentData[] | number | Map>): void {\n if (typeof newResultData === 'number') {\n this._result = new RxQuerySingleResult(\n this.collection,\n [],\n newResultData\n );\n return;\n } else if (newResultData instanceof Map) {\n newResultData = Array.from((newResultData as Map>).values());\n }\n\n const docsDataMap = new Map();\n const docsMap = new Map();\n\n\n const docs = newResultData.map(docData => this.collection._docCache.getCachedRxDocument(docData));\n\n /**\n * Instead of using the newResultData in the result cache,\n * we directly use the objects that are stored in the RxDocument\n * to ensure we do not store the same data twice and fill up the memory.\n */\n const docsData = docs.map(doc => {\n docsDataMap.set(doc.primary, doc._data);\n docsMap.set(doc.primary, doc);\n return doc._data;\n });\n\n this._result = new RxQuerySingleResult(this.collection, docsData, docsData.length);\n }\n\n /**\n * executes the query on the database\n * @return results-array with document-data\n */\n async _execOverDatabase(): Promise[] | number> {\n this._execOverDatabaseCount = this._execOverDatabaseCount + 1;\n this._lastExecStart = now();\n\n\n if (this.op === 'count') {\n const preparedQuery = this.getPreparedQuery();\n const result = await this.collection.storageInstance.count(preparedQuery);\n if (result.mode === 'slow' && !this.collection.database.allowSlowCount) {\n throw newRxError('QU14', {\n collection: this.collection,\n queryObj: this.mangoQuery\n });\n } else {\n return result.count;\n }\n }\n\n if (this.op === 'findByIds') {\n const ids: string[] = ensureNotFalsy(this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\n const ret = new Map>();\n const mustBeQueried: string[] = [];\n // first try to fill from docCache\n ids.forEach(id => {\n const docData = this.collection._docCache.getLatestDocumentDataIfExists(id);\n if (docData) {\n if (!docData._deleted) {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(id, doc);\n }\n } else {\n mustBeQueried.push(id);\n }\n });\n // everything which was not in docCache must be fetched from the storage\n if (mustBeQueried.length > 0) {\n const docs = await this.collection.storageInstance.findDocumentsById(mustBeQueried, false);\n docs.forEach(docData => {\n const doc = this.collection._docCache.getCachedRxDocument(docData);\n ret.set(doc.primary, doc);\n });\n }\n return ret as any;\n }\n\n\n const docsPromise = queryCollection(this as any);\n return docsPromise.then(docs => {\n this._lastExecEnd = now();\n return docs;\n });\n }\n\n /**\n * Execute the query\n * To have an easier implementations,\n * just subscribe and use the first result\n */\n public exec(throwIfMissing: true): Promise>;\n public exec(): Promise;\n public exec(throwIfMissing?: boolean): Promise {\n if (throwIfMissing && this.op !== 'findOne') {\n throw newRxError('QU9', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n }\n\n\n /**\n * run _ensureEqual() here,\n * this will make sure that errors in the query which throw inside of the RxStorage,\n * will be thrown at this execution context and not in the background.\n */\n return _ensureEqual(this as any)\n .then(() => firstValueFrom(this.$))\n .then(result => {\n if (!result && throwIfMissing) {\n throw newRxError('QU10', {\n collection: this.collection.name,\n query: this.mangoQuery,\n op: this.op\n });\n } else {\n return result;\n }\n });\n }\n\n\n\n /**\n * cached call to get the queryMatcher\n * @overwrites itself with the actual value\n */\n get queryMatcher(): QueryMatcher> {\n const schema = this.collection.schema.jsonSchema;\n const normalizedQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n return overwriteGetterForCaching(\n this,\n 'queryMatcher',\n getQueryMatcher(\n schema,\n normalizedQuery\n ) as any\n );\n }\n\n /**\n * returns a string that is used for equal-comparisons\n * @overwrites itself with the actual value\n */\n toString(): string {\n const stringObj = sortObject({\n op: this.op,\n query: this.mangoQuery,\n other: this.other\n }, true);\n const value = JSON.stringify(stringObj);\n this.toString = () => value;\n return value;\n }\n\n persistentQueryId() {\n return String(this.collection.database.hashFunction(this.toString()));\n }\n\n /**\n * returns the prepared query\n * which can be send to the storage instance to query for documents.\n * @overwrites itself with the actual value.\n */\n getPreparedQuery(): PreparedQuery {\n const hookInput = {\n rxQuery: this,\n // can be mutated by the hooks so we have to deep clone first.\n mangoQuery: normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n )\n };\n\n // Set _deleted to false if not explicitly set in selector\n if (!this.includesDeleted) {\n hookInput.mangoQuery.selector = {\n ...hookInput.mangoQuery.selector,\n _deleted: { $eq: false },\n };\n }\n\n if (hookInput.mangoQuery.index) {\n hookInput.mangoQuery.index.unshift('_deleted');\n }\n\n if (this._limitBufferSize !== null && hookInput.mangoQuery.limit) {\n hookInput.mangoQuery.limit = hookInput.mangoQuery.limit + this._limitBufferSize;\n }\n\n runPluginHooks('prePrepareQuery', hookInput);\n\n const value = prepareQuery(\n this.collection.schema.jsonSchema,\n hookInput.mangoQuery as any\n );\n\n this.getPreparedQuery = () => value;\n return value;\n }\n\n /**\n * returns true if the document matches the query,\n * does not use the 'skip' and 'limit'\n */\n doesDocumentDataMatch(docData: RxDocType | any): boolean {\n // if doc is deleted, it cannot match\n if (docData._deleted) {\n return false;\n }\n\n return this.queryMatcher(docData);\n }\n\n /**\n * deletes all found documents\n * @return promise with deleted documents\n */\n remove(): Promise {\n return this\n .exec()\n .then(docs => {\n if (Array.isArray(docs)) {\n // TODO use a bulk operation instead of running .remove() on each document\n return Promise.all(docs.map(doc => doc.remove()));\n } else {\n return (docs as any).remove();\n }\n });\n }\n incrementalRemove(): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalRemove(),\n );\n }\n\n\n /**\n * helper function to transform RxQueryBase to RxQuery type\n */\n get asRxQuery(): RxQuery {\n return this as any;\n }\n\n /**\n * updates all found documents\n * @overwritten by plugin (optional)\n */\n update(_updateObj: any): Promise {\n throw pluginMissing('update');\n }\n\n patch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.patch(patch),\n );\n }\n incrementalPatch(patch: Partial): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalPatch(patch),\n );\n }\n modify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.modify(mutationFunction),\n );\n }\n incrementalModify(mutationFunction: ModifyFunction): Promise {\n return runQueryUpdateFunction(\n this.asRxQuery,\n (doc) => doc.incrementalModify(mutationFunction),\n );\n }\n\n\n // we only set some methods of query-builder here\n // because the others depend on these ones\n where(_queryObj: MangoQuerySelector | keyof RxDocType | string): RxQuery {\n throw pluginMissing('query-builder');\n }\n sort(_params: string | MangoQuerySortPart): RxQuery {\n throw pluginMissing('query-builder');\n }\n skip(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n limit(_amount: number | null): RxQuery {\n throw pluginMissing('query-builder');\n }\n\n enableLimitBuffer(bufferSize: number) {\n if (this._limitBufferSize !== null) {\n // Limit buffer has already been enabled, do nothing:\n return this;\n }\n if (this._lastExecStart !== 0) {\n console.error('Can\\'t use limit buffer if query has already executed');\n return this;\n }\n if (this.mangoQuery.skip || !this.mangoQuery.limit) {\n console.error('Right now, limit buffer only works on non-skip, limit queries.');\n return this;\n }\n this._limitBufferSize = bufferSize;\n return this;\n }\n\n enablePersistentQueryCache(backend: QueryCacheBackend) {\n if (this._persistentQueryCacheBackend) {\n // We've already tried to enable the query cache\n return this;\n }\n this._persistentQueryCacheBackend = backend;\n this._persistentQueryCacheLoaded = this._restoreQueryCacheFromPersistedState();\n return this;\n }\n\n private async _restoreQueryCacheFromPersistedState() {\n if (!this._persistentQueryCacheBackend) {\n // no cache backend provided, do nothing\n return;\n }\n if (this._persistentQueryCacheResult) {\n // we already restored the cache once, no need to run twice\n return;\n }\n if (this.mangoQuery.skip || this.op === 'count') {\n console.error('The persistent query cache only works on non-skip, non-count queries.');\n return;\n }\n\n // First, check if there are any query results persisted:\n const persistentQueryId = this.persistentQueryId();\n const value = await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}`);\n if (!value || !Array.isArray(value) || value.length === 0) {\n // eslint-disable-next-line no-console\n console.log(`no persistent query cache found in the backend, returning early ${this.toString()}`);\n return;\n }\n\n // If there are persisted ids, create our two Sets of ids from the cache:\n const persistedQueryCacheIds = new Set();\n const limitBufferIds = new Set();\n\n for (const id of value) {\n if (id.startsWith('lb-')) {\n limitBufferIds.add(id.replace('lb-', ''));\n } else {\n persistedQueryCacheIds.add(id);\n }\n }\n\n // eslint-disable-next-line no-console\n console.time(`Restoring persistent querycache ${this.toString()}`);\n\n // Next, pull the lwt from the cache:\n // TODO: if lwt is too old, should we just give up here? What if there are too many changedDocs?\n const lwt = (await this._persistentQueryCacheBackend.getItem(`qc:${persistentQueryId}:lwt`)) as string | null;\n if (!lwt) {\n return;\n }\n\n // If the query was persisted too long ago, just re-execute it.\n if (now() - Number(lwt) > RESTORE_QUERY_MAX_TIME_AGO) {\n return;\n }\n\n const primaryPath = this.collection.schema.primaryPath;\n\n const {documents: changedDocs} = await getChangedDocumentsSince(this.collection.storageInstance,\n RESTORE_QUERY_MAX_DOCS_CHANGED,\n // make sure we remove the monotonic clock (xxx.01, xxx.02) from the lwt timestamp to avoid issues with\n // lookups in indices (dexie)\n {id: '', lwt: Math.floor(Number(lwt)) - RESTORE_QUERY_UPDATE_DRIFT}\n );\n\n // If too many docs have changed, just give up and re-execute the query\n if (changedDocs.length === RESTORE_QUERY_MAX_DOCS_CHANGED) {\n return;\n }\n\n const changedDocIds = new Set(changedDocs.map((d) => d[primaryPath] as string));\n\n const docIdsWeNeedToFetch = [...persistedQueryCacheIds, ...limitBufferIds].filter((id) => !changedDocIds.has(id));\n\n // We use _queryCollectionByIds to fetch the remaining docs we need efficiently, pulling\n // from query cache if we can (and the storageInstance by ids if we can't):\n const otherPotentialMatchingDocs: RxDocumentData[] = [];\n await _queryCollectionByIds(this as any, otherPotentialMatchingDocs, docIdsWeNeedToFetch);\n\n // Now that we have all potential documents, we just filter (in-memory) the ones that still match our query:\n let docsData: RxDocumentData[] = [];\n for (const doc of changedDocs.concat(otherPotentialMatchingDocs)) {\n if (this.doesDocumentDataMatch(doc)) {\n docsData.push(doc);\n }\n }\n\n // Sort the documents by the query's sort field:\n const normalizedMangoQuery = normalizeMangoQuery(\n this.collection.schema.jsonSchema,\n this.mangoQuery\n );\n const sortComparator = getSortComparator(this.collection.schema.jsonSchema, normalizedMangoQuery);\n const limit = normalizedMangoQuery.limit ? normalizedMangoQuery.limit : Infinity;\n docsData = docsData.sort(sortComparator);\n\n // We know for sure that all persisted and limit buffer ids (and changed docs before them) are in the correct\n // result set. And we can't be sure about any past that point. So cut it off there:\n const lastValidIndex = docsData.findLastIndex((d) => limitBufferIds.has(d[primaryPath] as string) || persistedQueryCacheIds.has(d[primaryPath] as string));\n docsData = docsData.slice(0, lastValidIndex + 1);\n\n // Now this is the trickiest part.\n // If we somehow have fewer docs than the limit of our query\n // (and this wasn't the case because before persistence)\n // then there is no way for us to know the correct results, and we re-exec:\n const unchangedItemsMayNowBeInResults = (\n this.mangoQuery.limit &&\n docsData.length < this.mangoQuery.limit &&\n persistedQueryCacheIds.size >= this.mangoQuery.limit\n );\n if (unchangedItemsMayNowBeInResults) {\n return;\n }\n\n // Our finalResults are the actual results of this query, and pastLimitItems are any remaining matching\n // documents we have left over (past the limit).\n const pastLimitItems = docsData.slice(limit);\n const finalResults = docsData.slice(0, limit);\n\n // If there are still items past the first LIMIT items, try to restore the limit buffer with them:\n if (limitBufferIds.size && pastLimitItems.length > 0) {\n this._limitBufferResults = pastLimitItems;\n } else {\n this._limitBufferResults = [];\n }\n\n // Finally, set the query's results to what we've pulled from disk:\n this._lastEnsureEqual = now();\n this._latestChangeEvent = this.collection._changeEventBuffer.counter;\n this._setResultData(finalResults);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Restoring persistent querycache ${this.toString()}`);\n }\n}\n\nexport function _getDefaultQuery(): MangoQuery {\n return {\n selector: {}\n };\n}\n\n/**\n * run this query through the QueryCache\n */\nexport function tunnelQueryCache(\n rxQuery: RxQueryBase\n): RxQuery {\n return rxQuery.collection._queryCache.getByQuery(rxQuery as any);\n}\n\nexport function createRxQuery(\n op: RxQueryOP,\n queryObj: MangoQuery,\n collection: RxCollection,\n other?: any\n) {\n runPluginHooks('preCreateRxQuery', {\n op,\n queryObj,\n collection,\n other\n });\n\n let ret = new RxQueryBase(op, queryObj, collection, other);\n\n // ensure when created with same params, only one is created\n ret = tunnelQueryCache(ret);\n // TODO: clear persistent query cache as well\n triggerCacheReplacement(collection);\n\n return ret;\n}\n\n/**\n * Check if the current results-state is in sync with the database\n * which means that no write event happened since the last run.\n * @return false if not which means it should re-execute\n */\nfunction _isResultsInSync(rxQuery: RxQueryBase): boolean {\n const currentLatestEventNumber = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n if (rxQuery._latestChangeEvent >= currentLatestEventNumber) {\n return true;\n } else {\n return false;\n }\n}\n\n\n/**\n * wraps __ensureEqual()\n * to ensure it does not run in parallel\n * @return true if has changed, false if not\n */\nfunction _ensureEqual(rxQuery: RxQueryBase): Promise {\n // Optimisation shortcut\n if (\n rxQuery.collection.database.destroyed ||\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\n .then(() => __ensureEqual(rxQuery));\n return rxQuery._ensureEqualQueue;\n}\n\n\n/**\n * ensures that the results of this query is equal to the results which a query over the database would give\n * @return true if results have changed\n */\nasync function __ensureEqual(rxQuery: RxQueryBase): Promise {\n await rxQuery._persistentQueryCacheLoaded;\n\n rxQuery._lastEnsureEqual = now();\n\n /**\n * Optimisation shortcuts\n */\n if (\n // db is closed\n rxQuery.collection.database.destroyed ||\n // nothing happened since last run\n _isResultsInSync(rxQuery)\n ) {\n return PROMISE_RESOLVE_FALSE;\n }\n\n let ret = false;\n let mustReExec = false; // if this becomes true, a whole execution over the database is made\n if (rxQuery._latestChangeEvent === -1) {\n // have not executed yet -> must run\n mustReExec = true;\n }\n\n /**\n * try to use EventReduce to calculate the new results\n */\n if (!mustReExec) {\n const missedChangeEvents = rxQuery.asRxQuery.collection._changeEventBuffer.getFrom(rxQuery._latestChangeEvent + 1);\n if (missedChangeEvents === null) {\n // changeEventBuffer is of bounds -> we must re-execute over the database\n mustReExec = true;\n } else {\n rxQuery._latestChangeEvent = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\n\n const runChangeEvents: RxChangeEvent[] = rxQuery.asRxQuery.collection\n ._changeEventBuffer\n .reduceByLastOfDoc(missedChangeEvents);\n\n if (rxQuery._limitBufferResults !== null) {\n // Check if any item in our limit buffer was modified by a change event\n for (const cE of runChangeEvents) {\n if (rxQuery._limitBufferResults.find((doc) => doc[rxQuery.collection.schema.primaryPath] === cE.documentId)) {\n // If so, the limit buffer is potential invalid -- let's just blow it up\n // TODO: could we instead update the documents in the limit buffer?\n rxQuery._limitBufferResults = null;\n break;\n }\n }\n }\n\n if (rxQuery.includesDeleted) {\n return rxQuery._execOverDatabase().then((newResultData) => {\n rxQuery._setResultData(newResultData);\n return true;\n });\n } else if (rxQuery.op === 'count') {\n // 'count' query\n const previousCount = ensureNotFalsy(rxQuery._result).count;\n let newCount = previousCount;\n runChangeEvents.forEach(cE => {\n const didMatchBefore = cE.previousDocumentData && rxQuery.doesDocumentDataMatch(cE.previousDocumentData);\n const doesMatchNow = rxQuery.doesDocumentDataMatch(cE.documentData);\n\n if (!didMatchBefore && doesMatchNow) {\n newCount++;\n }\n if (didMatchBefore && !doesMatchNow) {\n newCount--;\n }\n });\n if (newCount !== previousCount) {\n ret = true; // true because results changed\n rxQuery._setResultData(newCount as any);\n }\n } else {\n // 'find' or 'findOne' query\n const eventReduceResult = calculateNewResults(\n rxQuery as any,\n runChangeEvents\n );\n if (eventReduceResult.runFullQueryAgain) {\n // could not calculate the new results, execute must be done\n mustReExec = true;\n } else if (eventReduceResult.changed) {\n // we got the new results, we do not have to re-execute, mustReExec stays false\n ret = true; // true because results changed\n rxQuery._setResultData(eventReduceResult.newResults as any);\n }\n }\n }\n }\n\n // oh no we have to re-execute the whole query over the database\n if (mustReExec) {\n return rxQuery._execOverDatabase()\n .then(newResultData => {\n\n /**\n * The RxStorage is defined to always first emit events and then return\n * on bulkWrite() calls. So here we have to use the counter AFTER the execOverDatabase()\n * has been run, not the one from before.\n */\n rxQuery._latestChangeEvent = rxQuery.collection._changeEventBuffer.getCounter();\n\n // A count query needs a different has-changed check.\n if (typeof newResultData === 'number') {\n if (\n !rxQuery._result ||\n newResultData !== rxQuery._result.count\n ) {\n ret = true;\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n }\n if (\n !rxQuery._result ||\n !areRxDocumentArraysEqual(\n rxQuery.collection.schema.primaryPath,\n newResultData,\n rxQuery._result.docsData\n )\n ) {\n ret = true; // true because results changed\n rxQuery._setResultData(newResultData as any);\n }\n return ret;\n })\n .then(async (returnValue) => {\n await updatePersistentQueryCache(rxQuery);\n return returnValue;\n });\n }\n\n return ret; // true if results have changed\n}\n\n\nasync function updatePersistentQueryCache(rxQuery: RxQueryBase) {\n if (!rxQuery._persistentQueryCacheBackend) {\n return;\n }\n\n const backend = rxQuery._persistentQueryCacheBackend;\n\n const key = rxQuery.persistentQueryId();\n\n // update _persistedQueryCacheResult\n rxQuery._persistentQueryCacheResult = rxQuery._result?.docsKeys ?? [];\n\n const idsToPersist = [...rxQuery._persistentQueryCacheResult];\n if (rxQuery._limitBufferResults) {\n rxQuery._limitBufferResults.forEach((d) => {\n idsToPersist.push(`lb-${d[rxQuery.collection.schema.primaryPath]}`);\n });\n }\n // eslint-disable-next-line no-console\n console.time(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n // persist query cache\n const lwt = rxQuery._result?.time ?? RX_META_LWT_MINIMUM;\n\n await Promise.all([\n backend.setItem(`qc:${String(key)}`, idsToPersist),\n backend.setItem(`qc:${String(key)}:lwt`, lwt.toString()),\n ]);\n\n // eslint-disable-next-line no-console\n console.timeEnd(`Query persistence: persisting results of ${JSON.stringify(rxQuery.mangoQuery)}`);\n}\n\n\n// Refactored out of `queryCollection`: modifies the docResults array to fill it with data\nasync function _queryCollectionByIds(rxQuery: RxQuery | RxQueryBase, docResults: RxDocumentData[], docIds: string[]) {\n const collection = rxQuery.collection;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docResults.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsMap = await collection.storageInstance.findDocumentsById(docIds, false);\n Object.values(docsMap).forEach(docData => {\n docResults.push(docData);\n });\n }\n}\n\n/**\n * @returns a format of the query that can be used with the storage\n * when calling RxStorageInstance().query()\n */\nexport function prepareQuery(\n schema: RxJsonSchema>,\n mutateableQuery: FilledMangoQuery\n): PreparedQuery {\n if (!mutateableQuery.sort) {\n throw newRxError('SNH', {\n query: mutateableQuery\n });\n }\n\n /**\n * Store the query plan together with the\n * prepared query to save performance.\n */\n const queryPlan = getQueryPlan(\n schema,\n mutateableQuery\n );\n\n return {\n query: mutateableQuery,\n queryPlan\n };\n}\n\n/**\n * Runs the query over the storage instance\n * of the collection.\n * Does some optimizations to ensure findById is used\n * when specific queries are used.\n */\nexport async function queryCollection(\n rxQuery: RxQuery | RxQueryBase\n): Promise[]> {\n await rxQuery._persistentQueryCacheLoaded;\n\n let docs: RxDocumentData[] = [];\n const collection = rxQuery.collection;\n\n /**\n * Optimizations shortcut.\n * If query is find-one-document-by-id,\n * then we do not have to use the slow query() method\n * but instead can use findDocumentsById()\n */\n if (rxQuery.isFindOneByIdQuery) {\n if (Array.isArray(rxQuery.isFindOneByIdQuery)) {\n let docIds = rxQuery.isFindOneByIdQuery;\n docIds = docIds.filter(docId => {\n // first try to fill from docCache\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (docData) {\n if (!docData._deleted) {\n docs.push(docData);\n }\n return false;\n } else {\n return true;\n }\n });\n // otherwise get from storage\n if (docIds.length > 0) {\n const docsFromStorage = await collection.storageInstance.findDocumentsById(docIds, false);\n appendToArray(docs, docsFromStorage);\n }\n await _queryCollectionByIds(rxQuery, docs, rxQuery.isFindOneByIdQuery);\n } else {\n const docId = rxQuery.isFindOneByIdQuery;\n\n // first try to fill from docCache\n let docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\n if (!docData) {\n // otherwise get from storage\n const fromStorageList = await collection.storageInstance.findDocumentsById([docId], false);\n if (fromStorageList[0]) {\n docData = fromStorageList[0];\n }\n }\n if (docData && !docData._deleted) {\n docs.push(docData);\n }\n }\n } else {\n const preparedQuery = rxQuery.getPreparedQuery();\n const queryResult = await collection.storageInstance.query(preparedQuery);\n if (rxQuery._limitBufferSize !== null && rxQuery.mangoQuery.limit && queryResult.documents.length > rxQuery.mangoQuery.limit) {\n // If there are more than query.limit results, we pull out our buffer items from the\n // last rxQuery._limitBufferSize items of the results.\n rxQuery._limitBufferResults = queryResult.documents.splice(rxQuery.mangoQuery.limit);\n }\n docs = queryResult.documents;\n }\n return docs;\n}\n\n/**\n * Returns true if the given query\n * selects exactly one document by its id.\n * Used to optimize performance because these kind of\n * queries do not have to run over an index and can use get-by-id instead.\n * Returns false if no query of that kind.\n * Returns the document id otherwise.\n */\nexport function isFindOneByIdQuery(\n primaryPath: string,\n query: MangoQuery\n): false | string | string[] {\n // must have exactly one operator which must be $eq || $in\n if (\n !query.skip &&\n query.selector &&\n Object.keys(query.selector).length === 1 &&\n query.selector[primaryPath]\n ) {\n const value: any = query.selector[primaryPath];\n if (typeof value === 'string') {\n return value;\n } else if (\n Object.keys(value).length === 1 &&\n typeof value.$eq === 'string'\n ) {\n return value.$eq;\n }\n\n // same with $in string arrays\n if (\n Object.keys(value).length === 1 &&\n Array.isArray(value.$eq) &&\n // must only contain strings\n !(value.$eq as any[]).find(r => typeof r !== 'string')\n ) {\n return value.$eq;\n }\n }\n return false;\n}\n\n\nexport function isRxQuery(obj: any): boolean {\n return obj instanceof RxQueryBase;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/dist/esm/rx-schema.js.map b/dist/esm/rx-schema.js.map index 9be43771bd5..9188bc2802f 100644 --- a/dist/esm/rx-schema.js.map +++ b/dist/esm/rx-schema.js.map @@ -1 +1 @@ -{"version":3,"file":"rx-schema.js","names":["overwriteGetterForCaching","isMaybeReadonlyArray","deepEqual","newRxError","runPluginHooks","fillWithDefaultSettings","getComposedPrimaryKeyOfDocumentData","getFinalFields","getPrimaryFieldOfPrimaryKey","getSchemaByObjectPath","normalizeRxJsonSchema","overwritable","RxSchema","jsonSchema","hashFunction","indexes","getIndexes","primaryPath","primaryKey","finalFields","_proto","prototype","validateChange","dataBefore","dataAfter","forEach","fieldName","schema","getDocumentPrototype","proto","pathProperties","Object","keys","key","fullPath","__defineGetter__","get","undefined","ret","defineProperty","get$","enumerable","configurable","get$$","populate","getPrimaryOfDocumentData","documentData","_createClass","version","values","entries","properties","filter","v","hasOwnProperty","call","k","default","JSON","stringify","map","index","getPreviousVersions","c","Array","fill","createRxSchema","runPreCreateHooks","useJsonSchema","deepFreezeWhenDevMode","isRxSchema","obj","toTypedRxJsonSchema"],"sources":["../../src/rx-schema.ts"],"sourcesContent":["import {\n overwriteGetterForCaching,\n isMaybeReadonlyArray,\n deepEqual\n} from './plugins/utils/index.ts';\nimport {\n newRxError,\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\n\nimport type {\n DeepMutable,\n DeepReadonly,\n HashFunction,\n MaybeReadonly,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n StringKeys\n} from './types/index.d.ts';\nimport {\n fillWithDefaultSettings,\n getComposedPrimaryKeyOfDocumentData,\n getFinalFields,\n getPrimaryFieldOfPrimaryKey,\n getSchemaByObjectPath,\n normalizeRxJsonSchema\n} from './rx-schema-helper.ts';\nimport { overwritable } from './overwritable.ts';\n\nexport class RxSchema {\n public indexes: MaybeReadonly[];\n public readonly primaryPath: StringKeys>;\n public finalFields: string[];\n\n constructor(\n public readonly jsonSchema: RxJsonSchema>,\n public readonly hashFunction: HashFunction\n ) {\n this.indexes = getIndexes(this.jsonSchema);\n\n // primary is always required\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.jsonSchema.primaryKey);\n\n this.finalFields = getFinalFields(this.jsonSchema);\n }\n\n public get version(): number {\n return this.jsonSchema.version;\n }\n\n public get defaultValues(): { [P in keyof RxDocType]: RxDocType[P] } {\n const values = {} as { [P in keyof RxDocType]: RxDocType[P] };\n Object\n .entries(this.jsonSchema.properties)\n .filter(([, v]) => Object.prototype.hasOwnProperty.call(v, 'default'))\n .forEach(([k, v]) => (values as any)[k] = (v as any).default);\n return overwriteGetterForCaching(\n this,\n 'defaultValues',\n values\n );\n }\n\n /**\n * @overrides itself on the first call\n *\n * TODO this should be a pure function that\n * caches the hash in a WeakMap.\n */\n public get hash(): Promise {\n return overwriteGetterForCaching(\n this,\n 'hash',\n this.hashFunction(JSON.stringify(this.jsonSchema))\n );\n }\n\n /**\n * checks if a given change on a document is allowed\n * Ensures that:\n * - final fields are not modified\n * @throws {Error} if not valid\n */\n validateChange(dataBefore: any, dataAfter: any): void {\n this.finalFields.forEach(fieldName => {\n if (!deepEqual(dataBefore[fieldName], dataAfter[fieldName])) {\n throw newRxError('DOC9', {\n dataBefore,\n dataAfter,\n fieldName,\n schema: this.jsonSchema\n });\n }\n });\n }\n\n /**\n * creates the schema-based document-prototype,\n * see RxCollection.getDocumentPrototype()\n */\n public getDocumentPrototype(): any {\n const proto: any = {};\n\n /**\n * On the top level, we know all keys\n * and therefore do not have to create a new Proxy object\n * for each document. Instead we define the getter in the prototype once.\n */\n const pathProperties = getSchemaByObjectPath(\n this.jsonSchema,\n ''\n );\n Object.keys(pathProperties)\n .forEach(key => {\n const fullPath = key;\n\n // getter - value\n proto.__defineGetter__(\n key,\n function (this: RxDocument) {\n if (!this.get || typeof this.get !== 'function') {\n /**\n * When an object gets added to the state of a vuejs-component,\n * it happens that this getter is called with another scope.\n * To prevent errors, we have to return undefined in this case\n */\n return undefined;\n }\n const ret = this.get(fullPath);\n return ret;\n }\n );\n // getter - observable$\n Object.defineProperty(proto, key + '$', {\n get: function () {\n return this.get$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - reactivity$$\n Object.defineProperty(proto, key + '$$', {\n get: function () {\n return this.get$$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - populate_\n Object.defineProperty(proto, key + '_', {\n get: function () {\n return this.populate(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n });\n\n overwriteGetterForCaching(\n this,\n 'getDocumentPrototype',\n () => proto\n );\n return proto;\n }\n\n\n getPrimaryOfDocumentData(\n documentData: Partial\n ): string {\n return getComposedPrimaryKeyOfDocumentData(\n this.jsonSchema,\n documentData\n );\n }\n}\n\nexport function getIndexes(\n jsonSchema: RxJsonSchema\n): MaybeReadonly[] {\n return (jsonSchema.indexes || []).map(index => isMaybeReadonlyArray(index) ? index : [index]);\n}\n\n/**\n * array with previous version-numbers\n */\nexport function getPreviousVersions(schema: RxJsonSchema): number[] {\n const version = schema.version ? schema.version : 0;\n let c = 0;\n return new Array(version)\n .fill(0)\n .map(() => c++);\n}\n\nexport function createRxSchema(\n jsonSchema: RxJsonSchema,\n hashFunction: HashFunction,\n runPreCreateHooks = true\n): RxSchema {\n if (runPreCreateHooks) {\n runPluginHooks('preCreateRxSchema', jsonSchema);\n }\n\n let useJsonSchema = fillWithDefaultSettings(jsonSchema);\n useJsonSchema = normalizeRxJsonSchema(useJsonSchema);\n overwritable.deepFreezeWhenDevMode(useJsonSchema);\n\n const schema = new RxSchema(useJsonSchema, hashFunction);\n runPluginHooks('createRxSchema', schema);\n return schema;\n}\n\nexport function isRxSchema(obj: any): boolean {\n return obj instanceof RxSchema;\n}\n\n/**\n * Used as helper function the generate the document type out of the schema via typescript.\n * @link https://github.com/pubkey/rxdb/discussions/3467\n */\nexport function toTypedRxJsonSchema>>(schema: T): DeepMutable {\n return schema as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file +{"version":3,"file":"rx-schema.js","names":["overwriteGetterForCaching","isMaybeReadonlyArray","deepEqual","newRxError","runPluginHooks","fillWithDefaultSettings","getComposedPrimaryKeyOfDocumentData","getFinalFields","getPrimaryFieldOfPrimaryKey","getSchemaByObjectPath","normalizeRxJsonSchema","overwritable","RxSchema","jsonSchema","hashFunction","indexes","getIndexes","primaryPath","primaryKey","finalFields","_proto","prototype","validateChange","dataBefore","dataAfter","forEach","fieldName","schema","getDocumentPrototype","proto","pathProperties","Object","keys","key","fullPath","__defineGetter__","get","undefined","ret","defineProperty","get$","enumerable","configurable","get$$","populate","getPrimaryOfDocumentData","documentData","_createClass","version","values","entries","properties","filter","v","hasOwnProperty","call","k","default","JSON","stringify","map","index","getPreviousVersions","c","Array","fill","createRxSchema","runPreCreateHooks","useJsonSchema","deepFreezeWhenDevMode","isRxSchema","obj","toTypedRxJsonSchema"],"sources":["../../src/rx-schema.ts"],"sourcesContent":["import {\n overwriteGetterForCaching,\n isMaybeReadonlyArray,\n deepEqual\n} from './plugins/utils/index.ts';\nimport {\n newRxError,\n} from './rx-error.ts';\nimport {\n runPluginHooks\n} from './hooks.ts';\n\nimport type {\n DeepMutable,\n DeepReadonly,\n HashFunction,\n MaybeReadonly,\n RxDocument,\n RxDocumentData,\n RxJsonSchema,\n StringKeys\n} from './types/index.d.ts';\nimport {\n fillWithDefaultSettings,\n getComposedPrimaryKeyOfDocumentData,\n getFinalFields,\n getPrimaryFieldOfPrimaryKey,\n getSchemaByObjectPath,\n normalizeRxJsonSchema\n} from './rx-schema-helper.ts';\nimport { overwritable } from './overwritable.ts';\n\nexport class RxSchema {\n public indexes: MaybeReadonly[];\n public readonly primaryPath: StringKeys>;\n public finalFields: string[];\n\n constructor(\n public readonly jsonSchema: RxJsonSchema>,\n public readonly hashFunction: HashFunction\n ) {\n this.indexes = getIndexes(this.jsonSchema);\n\n // primary is always required\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.jsonSchema.primaryKey);\n\n this.finalFields = getFinalFields(this.jsonSchema);\n }\n\n public get version(): number {\n return this.jsonSchema.version;\n }\n\n public get defaultValues(): { [P in keyof RxDocType]: RxDocType[P] } {\n const values = {} as { [P in keyof RxDocType]: RxDocType[P] };\n Object\n .entries(this.jsonSchema.properties)\n .filter(([, v]) => Object.prototype.hasOwnProperty.call(v, 'default'))\n .forEach(([k, v]) => (values as any)[k] = (v as any).default);\n return overwriteGetterForCaching(\n this,\n 'defaultValues',\n values\n );\n }\n\n /**\n * @overrides itself on the first call\n *\n * TODO this should be a pure function that\n * caches the hash in a WeakMap.\n */\n public get hash(): Promise {\n return overwriteGetterForCaching(\n this,\n 'hash',\n this.hashFunction(JSON.stringify(this.jsonSchema))\n );\n }\n\n /**\n * checks if a given change on a document is allowed\n * Ensures that:\n * - final fields are not modified\n * @throws {Error} if not valid\n */\n validateChange(dataBefore: any, dataAfter: any): void {\n this.finalFields.forEach(fieldName => {\n if (!deepEqual(dataBefore[fieldName], dataAfter[fieldName])) {\n throw newRxError('DOC9', {\n dataBefore,\n dataAfter,\n fieldName,\n schema: this.jsonSchema\n });\n }\n });\n }\n\n /**\n * creates the schema-based document-prototype,\n * see RxCollection.getDocumentPrototype()\n */\n public getDocumentPrototype(): any {\n const proto: any = {};\n\n /**\n * On the top level, we know all keys\n * and therefore do not have to create a new Proxy object\n * for each document. Instead we define the getter in the prototype once.\n */\n const pathProperties = getSchemaByObjectPath(\n this.jsonSchema,\n ''\n );\n Object.keys(pathProperties)\n .forEach(key => {\n const fullPath = key;\n\n // getter - value\n proto.__defineGetter__(\n key,\n function (this: RxDocument) {\n if (!this.get || typeof this.get !== 'function') {\n /**\n * When an object gets added to the state of a vuejs-component,\n * it happens that this getter is called with another scope.\n * To prevent errors, we have to return undefined in this case\n */\n return undefined;\n }\n const ret = this.get(fullPath);\n return ret;\n }\n );\n // getter - observable$\n Object.defineProperty(proto, key + '$', {\n get: function () {\n return this.get$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - reactivity$$\n Object.defineProperty(proto, key + '$$', {\n get: function () {\n return this.get$$(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n // getter - populate_\n Object.defineProperty(proto, key + '_', {\n get: function () {\n return this.populate(fullPath);\n },\n enumerable: false,\n configurable: false\n });\n });\n\n overwriteGetterForCaching(\n this,\n 'getDocumentPrototype',\n () => proto\n );\n return proto;\n }\n\n\n getPrimaryOfDocumentData(\n documentData: Partial\n ): string {\n return getComposedPrimaryKeyOfDocumentData(\n this.jsonSchema,\n documentData\n );\n }\n}\n\nexport function getIndexes(\n jsonSchema: RxJsonSchema\n): MaybeReadonly[] {\n return (jsonSchema.indexes || []).map(index => isMaybeReadonlyArray(index) ? index : [index]);\n}\n\n/**\n * array with previous version-numbers\n */\nexport function getPreviousVersions(schema: RxJsonSchema): number[] {\n const version = schema.version ? schema.version : 0;\n let c = 0;\n return new Array(version)\n .fill(0)\n .map(() => c++);\n}\n\nexport function createRxSchema(\n jsonSchema: RxJsonSchema,\n hashFunction: HashFunction,\n runPreCreateHooks = true\n): RxSchema {\n if (runPreCreateHooks) {\n runPluginHooks('preCreateRxSchema', jsonSchema);\n }\n\n let useJsonSchema = fillWithDefaultSettings(jsonSchema);\n useJsonSchema = normalizeRxJsonSchema(useJsonSchema);\n overwritable.deepFreezeWhenDevMode(useJsonSchema);\n\n const schema = new RxSchema(useJsonSchema, hashFunction);\n runPluginHooks('createRxSchema', schema);\n return schema;\n}\n\nexport function isRxSchema(obj: any): boolean {\n return obj instanceof RxSchema;\n}\n\n/**\n * Used as helper function the generate the document type out of the schema via typescript.\n * @link https://github.com/pubkey/rxdb/discussions/3467\n */\nexport function toTypedRxJsonSchema>>(schema: T): DeepMutable {\n return schema as any;\n}\n"],"mappings":"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","ignoreList":[]} \ No newline at end of file diff --git a/examples/vite-vanilla-ts/package.json b/examples/vite-vanilla-ts/package.json index ecbe06f65a8..2b2134a0f0a 100644 --- a/examples/vite-vanilla-ts/package.json +++ b/examples/vite-vanilla-ts/package.json @@ -14,6 +14,7 @@ "test:e2e": "testcafe chrome -e test/ --hostname localhost --selector-timeout 8000 --retry-test-pages" }, "devDependencies": { + "@swc/core": "1.6.0", "async-test-util": "2.5.0", "concurrently": "8.2.2", "copyfiles": "2.4.1",