@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +47 -4
- package/CLAUDE.md +2 -0
- package/dist/cjs/change-event-buffer.js +2 -1
- package/dist/cjs/change-event-buffer.js.map +1 -1
- package/dist/cjs/custom-index.js +85 -12
- package/dist/cjs/custom-index.js.map +1 -1
- package/dist/cjs/doc-cache.js +117 -35
- package/dist/cjs/doc-cache.js.map +1 -1
- package/dist/cjs/event-reduce.js +10 -1
- package/dist/cjs/event-reduce.js.map +1 -1
- package/dist/cjs/plugin-helpers.js +16 -0
- package/dist/cjs/plugin-helpers.js.map +1 -1
- package/dist/cjs/plugins/attachments/index.js +3 -3
- package/dist/cjs/plugins/attachments/index.js.map +1 -1
- package/dist/cjs/plugins/cleanup/cleanup.js +5 -3
- package/dist/cjs/plugins/cleanup/cleanup.js.map +1 -1
- package/dist/cjs/plugins/crdt/index.js +52 -0
- package/dist/cjs/plugins/crdt/index.js.map +1 -1
- package/dist/cjs/plugins/dev-mode/check-query.js +7 -1
- package/dist/cjs/plugins/dev-mode/check-query.js.map +1 -1
- package/dist/cjs/plugins/dev-mode/check-schema.js +2 -1
- package/dist/cjs/plugins/dev-mode/check-schema.js.map +1 -1
- package/dist/cjs/plugins/dev-mode/error-messages.js +43 -5
- package/dist/cjs/plugins/dev-mode/error-messages.js.map +1 -1
- package/dist/cjs/plugins/encryption-crypto-js/index.js +22 -6
- package/dist/cjs/plugins/encryption-crypto-js/index.js.map +1 -1
- package/dist/cjs/plugins/leader-election/index.js +5 -5
- package/dist/cjs/plugins/leader-election/index.js.map +1 -1
- package/dist/cjs/plugins/local-documents/local-documents.js +20 -13
- package/dist/cjs/plugins/local-documents/local-documents.js.map +1 -1
- package/dist/cjs/plugins/migration-schema/migration-helpers.js +3 -0
- package/dist/cjs/plugins/migration-schema/migration-helpers.js.map +1 -1
- package/dist/cjs/plugins/migration-schema/rx-migration-state.js +1 -1
- package/dist/cjs/plugins/migration-schema/rx-migration-state.js.map +1 -1
- package/dist/cjs/plugins/pipeline/rx-pipeline.js +5 -1
- package/dist/cjs/plugins/pipeline/rx-pipeline.js.map +1 -1
- package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
- package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
- package/dist/cjs/plugins/replication/index.js +40 -2
- package/dist/cjs/plugins/replication/index.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/document-handling.js +17 -6
- package/dist/cjs/plugins/replication-google-drive/document-handling.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js +1 -1
- package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/google-drive-types.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/signaling.js +4 -1
- package/dist/cjs/plugins/replication-google-drive/signaling.js.map +1 -1
- package/dist/cjs/plugins/replication-google-drive/upstream.js +7 -4
- package/dist/cjs/plugins/replication-google-drive/upstream.js.map +1 -1
- package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js +4 -1
- package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
- package/dist/cjs/plugins/state/rx-state.js +14 -3
- package/dist/cjs/plugins/state/rx-state.js.map +1 -1
- package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js +10 -17
- package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/binary-search-bounds.js +112 -40
- package/dist/cjs/plugins/storage-memory/binary-search-bounds.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/memory-helper.js +127 -40
- package/dist/cjs/plugins/storage-memory/memory-helper.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/memory-indexes.js +1 -0
- package/dist/cjs/plugins/storage-memory/memory-indexes.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/memory-types.js.map +1 -1
- package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js +97 -37
- package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
- package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js +42 -1
- package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
- package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js +7 -7
- package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
- package/dist/cjs/plugins/test-utils/config.js +1 -1
- package/dist/cjs/plugins/test-utils/config.js.map +1 -1
- package/dist/cjs/plugins/test-utils/performance.js +122 -92
- package/dist/cjs/plugins/test-utils/performance.js.map +1 -1
- package/dist/cjs/plugins/test-utils/schema-objects.js +1 -1
- package/dist/cjs/plugins/test-utils/schema-objects.js.map +1 -1
- package/dist/cjs/plugins/test-utils/test-util.js +62 -0
- package/dist/cjs/plugins/test-utils/test-util.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-map.js +2 -2
- package/dist/cjs/plugins/utils/utils-map.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-object-deep-equal.js +3 -2
- package/dist/cjs/plugins/utils/utils-object-deep-equal.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-object-dot-prop.js +25 -0
- package/dist/cjs/plugins/utils/utils-object-dot-prop.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-object.js +102 -27
- package/dist/cjs/plugins/utils/utils-object.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-other.js +9 -4
- package/dist/cjs/plugins/utils/utils-other.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-premium.js +1 -19
- package/dist/cjs/plugins/utils/utils-premium.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-revision.js +20 -10
- package/dist/cjs/plugins/utils/utils-revision.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-rxdb-version.js +1 -1
- package/dist/cjs/plugins/utils/utils-rxdb-version.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-string.js +11 -8
- package/dist/cjs/plugins/utils/utils-string.js.map +1 -1
- package/dist/cjs/plugins/utils/utils-time.js +21 -16
- package/dist/cjs/plugins/utils/utils-time.js.map +1 -1
- package/dist/cjs/query-cache.js +6 -4
- package/dist/cjs/query-cache.js.map +1 -1
- package/dist/cjs/query-planner.js +2 -2
- package/dist/cjs/query-planner.js.map +1 -1
- package/dist/cjs/replication-protocol/downstream.js +1 -1
- package/dist/cjs/replication-protocol/downstream.js.map +1 -1
- package/dist/cjs/rx-collection-helper.js +11 -6
- package/dist/cjs/rx-collection-helper.js.map +1 -1
- package/dist/cjs/rx-collection.js +34 -6
- package/dist/cjs/rx-collection.js.map +1 -1
- package/dist/cjs/rx-database.js +40 -7
- package/dist/cjs/rx-database.js.map +1 -1
- package/dist/cjs/rx-document.js +10 -3
- package/dist/cjs/rx-document.js.map +1 -1
- package/dist/cjs/rx-query-helper.js +35 -12
- package/dist/cjs/rx-query-helper.js.map +1 -1
- package/dist/cjs/rx-query-single-result.js +9 -2
- package/dist/cjs/rx-query-single-result.js.map +1 -1
- package/dist/cjs/rx-query.js +72 -29
- package/dist/cjs/rx-query.js.map +1 -1
- package/dist/cjs/rx-schema-helper.js +9 -3
- package/dist/cjs/rx-schema-helper.js.map +1 -1
- package/dist/cjs/rx-schema.js +1 -0
- package/dist/cjs/rx-schema.js.map +1 -1
- package/dist/cjs/rx-storage-helper.js +212 -129
- package/dist/cjs/rx-storage-helper.js.map +1 -1
- package/dist/cjs/types/rx-error.d.js.map +1 -1
- package/dist/cjs/types/rx-schema.d.js.map +1 -1
- package/dist/esm/change-event-buffer.js +2 -1
- package/dist/esm/change-event-buffer.js.map +1 -1
- package/dist/esm/custom-index.js +85 -12
- package/dist/esm/custom-index.js.map +1 -1
- package/dist/esm/doc-cache.js +118 -36
- package/dist/esm/doc-cache.js.map +1 -1
- package/dist/esm/event-reduce.js +10 -1
- package/dist/esm/event-reduce.js.map +1 -1
- package/dist/esm/plugin-helpers.js +16 -0
- package/dist/esm/plugin-helpers.js.map +1 -1
- package/dist/esm/plugins/attachments/index.js +3 -3
- package/dist/esm/plugins/attachments/index.js.map +1 -1
- package/dist/esm/plugins/cleanup/cleanup.js +5 -3
- package/dist/esm/plugins/cleanup/cleanup.js.map +1 -1
- package/dist/esm/plugins/crdt/index.js +52 -0
- package/dist/esm/plugins/crdt/index.js.map +1 -1
- package/dist/esm/plugins/dev-mode/check-query.js +7 -1
- package/dist/esm/plugins/dev-mode/check-query.js.map +1 -1
- package/dist/esm/plugins/dev-mode/check-schema.js +2 -1
- package/dist/esm/plugins/dev-mode/check-schema.js.map +1 -1
- package/dist/esm/plugins/dev-mode/error-messages.js +43 -5
- package/dist/esm/plugins/dev-mode/error-messages.js.map +1 -1
- package/dist/esm/plugins/encryption-crypto-js/index.js +22 -6
- package/dist/esm/plugins/encryption-crypto-js/index.js.map +1 -1
- package/dist/esm/plugins/leader-election/index.js +4 -4
- package/dist/esm/plugins/leader-election/index.js.map +1 -1
- package/dist/esm/plugins/local-documents/local-documents.js +20 -13
- package/dist/esm/plugins/local-documents/local-documents.js.map +1 -1
- package/dist/esm/plugins/migration-schema/migration-helpers.js +3 -0
- package/dist/esm/plugins/migration-schema/migration-helpers.js.map +1 -1
- package/dist/esm/plugins/migration-schema/rx-migration-state.js +1 -1
- package/dist/esm/plugins/migration-schema/rx-migration-state.js.map +1 -1
- package/dist/esm/plugins/pipeline/rx-pipeline.js +5 -1
- package/dist/esm/plugins/pipeline/rx-pipeline.js.map +1 -1
- package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
- package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
- package/dist/esm/plugins/replication/index.js +40 -2
- package/dist/esm/plugins/replication/index.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/document-handling.js +17 -6
- package/dist/esm/plugins/replication-google-drive/document-handling.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/google-drive-helper.js +1 -1
- package/dist/esm/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/google-drive-types.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/signaling.js +4 -1
- package/dist/esm/plugins/replication-google-drive/signaling.js.map +1 -1
- package/dist/esm/plugins/replication-google-drive/upstream.js +7 -4
- package/dist/esm/plugins/replication-google-drive/upstream.js.map +1 -1
- package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js +4 -1
- package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
- package/dist/esm/plugins/state/rx-state.js +15 -4
- package/dist/esm/plugins/state/rx-state.js.map +1 -1
- package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js +11 -18
- package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
- package/dist/esm/plugins/storage-memory/binary-search-bounds.js +107 -40
- package/dist/esm/plugins/storage-memory/binary-search-bounds.js.map +1 -1
- package/dist/esm/plugins/storage-memory/memory-helper.js +128 -41
- package/dist/esm/plugins/storage-memory/memory-helper.js.map +1 -1
- package/dist/esm/plugins/storage-memory/memory-indexes.js +1 -0
- package/dist/esm/plugins/storage-memory/memory-indexes.js.map +1 -1
- package/dist/esm/plugins/storage-memory/memory-types.js.map +1 -1
- package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js +90 -30
- package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
- package/dist/esm/plugins/storage-mongodb/mongodb-helper.js +39 -0
- package/dist/esm/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
- package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js +8 -8
- package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
- package/dist/esm/plugins/test-utils/config.js +1 -1
- package/dist/esm/plugins/test-utils/config.js.map +1 -1
- package/dist/esm/plugins/test-utils/performance.js +122 -92
- package/dist/esm/plugins/test-utils/performance.js.map +1 -1
- package/dist/esm/plugins/test-utils/schema-objects.js +1 -1
- package/dist/esm/plugins/test-utils/schema-objects.js.map +1 -1
- package/dist/esm/plugins/test-utils/test-util.js +59 -0
- package/dist/esm/plugins/test-utils/test-util.js.map +1 -1
- package/dist/esm/plugins/utils/utils-map.js +2 -2
- package/dist/esm/plugins/utils/utils-map.js.map +1 -1
- package/dist/esm/plugins/utils/utils-object-deep-equal.js +3 -2
- package/dist/esm/plugins/utils/utils-object-deep-equal.js.map +1 -1
- package/dist/esm/plugins/utils/utils-object-dot-prop.js +25 -0
- package/dist/esm/plugins/utils/utils-object-dot-prop.js.map +1 -1
- package/dist/esm/plugins/utils/utils-object.js +102 -27
- package/dist/esm/plugins/utils/utils-object.js.map +1 -1
- package/dist/esm/plugins/utils/utils-other.js +9 -4
- package/dist/esm/plugins/utils/utils-other.js.map +1 -1
- package/dist/esm/plugins/utils/utils-premium.js +1 -19
- package/dist/esm/plugins/utils/utils-premium.js.map +1 -1
- package/dist/esm/plugins/utils/utils-revision.js +20 -10
- package/dist/esm/plugins/utils/utils-revision.js.map +1 -1
- package/dist/esm/plugins/utils/utils-rxdb-version.js +1 -1
- package/dist/esm/plugins/utils/utils-rxdb-version.js.map +1 -1
- package/dist/esm/plugins/utils/utils-string.js +11 -8
- package/dist/esm/plugins/utils/utils-string.js.map +1 -1
- package/dist/esm/plugins/utils/utils-time.js +21 -16
- package/dist/esm/plugins/utils/utils-time.js.map +1 -1
- package/dist/esm/query-cache.js +7 -5
- package/dist/esm/query-cache.js.map +1 -1
- package/dist/esm/query-planner.js +2 -2
- package/dist/esm/query-planner.js.map +1 -1
- package/dist/esm/replication-protocol/downstream.js +1 -1
- package/dist/esm/replication-protocol/downstream.js.map +1 -1
- package/dist/esm/rx-collection-helper.js +12 -7
- package/dist/esm/rx-collection-helper.js.map +1 -1
- package/dist/esm/rx-collection.js +35 -7
- package/dist/esm/rx-collection.js.map +1 -1
- package/dist/esm/rx-database.js +40 -7
- package/dist/esm/rx-database.js.map +1 -1
- package/dist/esm/rx-document.js +11 -4
- package/dist/esm/rx-document.js.map +1 -1
- package/dist/esm/rx-query-helper.js +35 -12
- package/dist/esm/rx-query-helper.js.map +1 -1
- package/dist/esm/rx-query-single-result.js +10 -3
- package/dist/esm/rx-query-single-result.js.map +1 -1
- package/dist/esm/rx-query.js +72 -29
- package/dist/esm/rx-query.js.map +1 -1
- package/dist/esm/rx-schema-helper.js +9 -3
- package/dist/esm/rx-schema-helper.js.map +1 -1
- package/dist/esm/rx-schema.js +1 -0
- package/dist/esm/rx-schema.js.map +1 -1
- package/dist/esm/rx-storage-helper.js +176 -94
- package/dist/esm/rx-storage-helper.js.map +1 -1
- package/dist/esm/types/rx-error.d.js.map +1 -1
- package/dist/esm/types/rx-schema.d.js.map +1 -1
- package/dist/types/custom-index.d.ts +5 -0
- package/dist/types/doc-cache.d.ts +1 -1
- package/dist/types/index.d.ts +25 -26
- package/dist/types/plugins/dev-mode/error-messages.d.ts +36 -0
- package/dist/types/plugins/leader-election/index.d.ts +1 -0
- package/dist/types/plugins/replication-google-drive/document-handling.d.ts +4 -1
- package/dist/types/plugins/replication-google-drive/google-drive-types.d.ts +1 -0
- package/dist/types/plugins/state/rx-state.d.ts +1 -1
- package/dist/types/plugins/storage-denokv/index.d.ts +1 -1
- package/dist/types/plugins/storage-dexie/rx-storage-dexie.d.ts +1 -1
- package/dist/types/plugins/storage-localstorage/index.d.ts +1 -1
- package/dist/types/plugins/storage-memory/binary-search-bounds.d.ts +21 -10
- package/dist/types/plugins/storage-memory/memory-helper.d.ts +7 -3
- package/dist/types/plugins/storage-memory/memory-types.d.ts +5 -0
- package/dist/types/plugins/storage-mongodb/mongodb-helper.d.ts +9 -1
- package/dist/types/plugins/storage-mongodb/rx-storage-instance-mongodb.d.ts +2 -2
- package/dist/types/plugins/storage-mongodb/rx-storage-mongodb.d.ts +1 -1
- package/dist/types/plugins/storage-remote/rx-storage-remote.d.ts +1 -1
- package/dist/types/plugins/storage-sqlite/index.d.ts +1 -1
- package/dist/types/plugins/test-utils/performance.d.ts +36 -0
- package/dist/types/plugins/test-utils/test-util.d.ts +17 -0
- package/dist/types/plugins/utils/utils-object.d.ts +8 -3
- package/dist/types/plugins/utils/utils-premium.d.ts +0 -2
- package/dist/types/plugins/utils/utils-rxdb-version.d.ts +1 -1
- package/dist/types/rx-database.d.ts +1 -1
- package/dist/types/rx-query-single-result.d.ts +1 -1
- package/dist/types/rx-query.d.ts +3 -2
- package/dist/types/rx-storage-helper.d.ts +15 -0
- package/eslint.config.mjs +2 -1
- package/package.json +732 -729
- package/scripts/check-code-block-line-length.js +91 -0
- package/scripts/check-em-dashes.js +53 -0
- package/scripts/docs-fetch-git-history.mjs +36 -0
- package/scripts/install-foundationdb.sh +0 -6
- package/scripts/notify-indexnow.mjs +171 -0
- package/scripts/start-foundationdb-docker.sh +73 -0
- package/src/change-event-buffer.ts +4 -1
- package/src/custom-index.ts +93 -16
- package/src/doc-cache.ts +117 -41
- package/src/event-reduce.ts +10 -1
- package/src/plugin-helpers.ts +10 -0
- package/src/plugins/attachments/index.ts +10 -12
- package/src/plugins/cleanup/cleanup.ts +5 -3
- package/src/plugins/crdt/index.ts +55 -0
- package/src/plugins/dev-mode/check-query.ts +7 -1
- package/src/plugins/dev-mode/check-schema.ts +2 -1
- package/src/plugins/dev-mode/error-messages.ts +45 -5
- package/src/plugins/encryption-crypto-js/index.ts +18 -6
- package/src/plugins/leader-election/index.ts +9 -8
- package/src/plugins/local-documents/local-documents.ts +21 -12
- package/src/plugins/migration-schema/migration-helpers.ts +3 -0
- package/src/plugins/migration-schema/rx-migration-state.ts +1 -1
- package/src/plugins/pipeline/rx-pipeline.ts +5 -1
- package/src/plugins/query-builder/mquery/nosql-query-builder.ts +8 -2
- package/src/plugins/replication/index.ts +41 -3
- package/src/plugins/replication-google-drive/document-handling.ts +17 -5
- package/src/plugins/replication-google-drive/google-drive-helper.ts +1 -1
- package/src/plugins/replication-google-drive/google-drive-types.ts +1 -0
- package/src/plugins/replication-google-drive/signaling.ts +4 -1
- package/src/plugins/replication-google-drive/upstream.ts +7 -4
- package/src/plugins/replication-microsoft-onedrive/signaling.ts +4 -1
- package/src/plugins/state/rx-state.ts +17 -5
- package/src/plugins/storage-dexie/rx-storage-instance-dexie.ts +0 -27
- package/src/plugins/storage-memory/binary-search-bounds.ts +105 -40
- package/src/plugins/storage-memory/memory-helper.ts +158 -67
- package/src/plugins/storage-memory/memory-indexes.ts +1 -0
- package/src/plugins/storage-memory/memory-types.ts +5 -0
- package/src/plugins/storage-memory/rx-storage-instance-memory.ts +104 -53
- package/src/plugins/storage-mongodb/mongodb-helper.ts +43 -1
- package/src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts +11 -9
- package/src/plugins/test-utils/config.ts +2 -1
- package/src/plugins/test-utils/performance.ts +159 -85
- package/src/plugins/test-utils/schema-objects.ts +1 -1
- package/src/plugins/test-utils/test-util.ts +71 -0
- package/src/plugins/utils/utils-map.ts +2 -2
- package/src/plugins/utils/utils-object-deep-equal.ts +2 -4
- package/src/plugins/utils/utils-object-dot-prop.ts +25 -0
- package/src/plugins/utils/utils-object.ts +103 -28
- package/src/plugins/utils/utils-other.ts +9 -4
- package/src/plugins/utils/utils-premium.ts +11 -37
- package/src/plugins/utils/utils-revision.ts +20 -9
- package/src/plugins/utils/utils-rxdb-version.ts +1 -1
- package/src/plugins/utils/utils-string.ts +11 -9
- package/src/plugins/utils/utils-time.ts +21 -17
- package/src/query-cache.ts +6 -5
- package/src/query-planner.ts +2 -2
- package/src/replication-protocol/downstream.ts +1 -1
- package/src/rx-collection-helper.ts +12 -6
- package/src/rx-collection.ts +39 -8
- package/src/rx-database.ts +49 -17
- package/src/rx-document.ts +12 -3
- package/src/rx-query-helper.ts +36 -15
- package/src/rx-query-single-result.ts +10 -3
- package/src/rx-query.ts +48 -8
- package/src/rx-schema-helper.ts +7 -4
- package/src/rx-schema.ts +1 -0
- package/src/rx-storage-helper.ts +210 -139
- package/src/types/rx-error.d.ts +3 -0
- package/src/types/rx-schema.d.ts +5 -0
- package/dist/esm/package.json +0 -1
- package/dist/types/types/conflict-handling.d.ts +0 -48
- package/dist/types/types/couchdb.d.ts +0 -293
- package/dist/types/types/index.d.ts +0 -32
- package/dist/types/types/modules/index.d.ts +0 -0
- package/dist/types/types/modules/mocha.parallel.d.ts +0 -1
- package/dist/types/types/plugins/backup.d.ts +0 -35
- package/dist/types/types/plugins/cleanup.d.ts +0 -38
- package/dist/types/types/plugins/crdt.d.ts +0 -76
- package/dist/types/types/plugins/dexie.d.ts +0 -30
- package/dist/types/types/plugins/local-documents.d.ts +0 -49
- package/dist/types/types/plugins/migration.d.ts +0 -14
- package/dist/types/types/plugins/reactivity.d.ts +0 -40
- package/dist/types/types/plugins/replication-graphql.d.ts +0 -98
- package/dist/types/types/plugins/replication.d.ts +0 -175
- package/dist/types/types/plugins/state.d.ts +0 -4
- package/dist/types/types/plugins/update.d.ts +0 -23
- package/dist/types/types/plugins/webmcp.d.ts +0 -40
- package/dist/types/types/query-planner.d.ts +0 -47
- package/dist/types/types/replication-protocol.d.ts +0 -296
- package/dist/types/types/rx-attachment.d.ts +0 -46
- package/dist/types/types/rx-change-event.d.ts +0 -85
- package/dist/types/types/rx-collection.d.ts +0 -117
- package/dist/types/types/rx-database-internal-store.d.ts +0 -54
- package/dist/types/types/rx-database.d.ts +0 -124
- package/dist/types/types/rx-document.d.ts +0 -160
- package/dist/types/types/rx-error.d.ts +0 -222
- package/dist/types/types/rx-plugin.d.ts +0 -167
- package/dist/types/types/rx-query.d.ts +0 -144
- package/dist/types/types/rx-schema.d.ts +0 -209
- package/dist/types/types/rx-storage.d.ts +0 -347
- package/dist/types/types/rx-storage.interface.d.ts +0 -312
- package/dist/types/types/util.d.ts +0 -180
|
@@ -11,7 +11,7 @@ var _rxjs = require("rxjs");
|
|
|
11
11
|
var _customIndex = require("../../custom-index.js");
|
|
12
12
|
var _rxSchemaHelper = require("../../rx-schema-helper.js");
|
|
13
13
|
var _rxStorageHelper = require("../../rx-storage-helper.js");
|
|
14
|
-
var
|
|
14
|
+
var _index2 = require("../../plugins/utils/index.js");
|
|
15
15
|
var _binarySearchBounds = require("./binary-search-bounds.js");
|
|
16
16
|
var _memoryHelper = require("./memory-helper.js");
|
|
17
17
|
var _memoryIndexes = require("./memory-indexes.js");
|
|
@@ -65,7 +65,7 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
65
65
|
this.categorizedByWriteInput.set(documentWrites, categorized);
|
|
66
66
|
this.internals.ensurePersistenceTask = categorized;
|
|
67
67
|
if (!this.internals.ensurePersistenceIdlePromise) {
|
|
68
|
-
this.internals.ensurePersistenceIdlePromise = (0,
|
|
68
|
+
this.internals.ensurePersistenceIdlePromise = (0, _index2.requestIdlePromiseNoQueue)().then(() => {
|
|
69
69
|
this.internals.ensurePersistenceIdlePromise = undefined;
|
|
70
70
|
this.ensurePersistence();
|
|
71
71
|
});
|
|
@@ -76,7 +76,7 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
76
76
|
* task has been added.
|
|
77
77
|
*/
|
|
78
78
|
if (categorized.eventBulk.events.length > 0) {
|
|
79
|
-
var lastState = (0,
|
|
79
|
+
var lastState = (0, _index2.ensureNotFalsy)(categorized.newestRow).document;
|
|
80
80
|
categorized.eventBulk.checkpoint = {
|
|
81
81
|
id: lastState[primaryPath],
|
|
82
82
|
lwt: lastState._meta.lwt
|
|
@@ -99,15 +99,15 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
var internals = this.internals;
|
|
102
|
-
var documentsById = this.internals.documents;
|
|
103
102
|
var primaryPath = this.primaryPath;
|
|
104
103
|
var categorized = this.internals.ensurePersistenceTask;
|
|
105
104
|
this.internals.ensurePersistenceTask = undefined;
|
|
106
105
|
|
|
107
106
|
/**
|
|
108
107
|
* Do inserts/updates
|
|
108
|
+
* @performance Use cached byIndexArray instead of Object.values()
|
|
109
109
|
*/
|
|
110
|
-
var stateByIndex =
|
|
110
|
+
var stateByIndex = internals.byIndexArray;
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
113
|
* @performance Use batch insert for bulk inserts to avoid
|
|
@@ -124,7 +124,14 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
124
124
|
var writeRow = bulkUpdateDocs[i];
|
|
125
125
|
var doc = writeRow.document;
|
|
126
126
|
var docId = doc[primaryPath];
|
|
127
|
-
|
|
127
|
+
/**
|
|
128
|
+
* @performance
|
|
129
|
+
* Pass writeRow.previous directly as the old document state
|
|
130
|
+
* instead of re-looking it up from the documents Map.
|
|
131
|
+
* This is safe because categorizeBulkWriteRows already verified
|
|
132
|
+
* that previous._rev matches the document in the Map (conflict check).
|
|
133
|
+
*/
|
|
134
|
+
(0, _memoryHelper.putWriteRowToState)(docId, internals, stateByIndex, doc, writeRow.previous);
|
|
128
135
|
}
|
|
129
136
|
|
|
130
137
|
/**
|
|
@@ -158,11 +165,23 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
158
165
|
if (documentsById.size === 0) {
|
|
159
166
|
return Promise.resolve(ret);
|
|
160
167
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
/**
|
|
169
|
+
* @performance
|
|
170
|
+
* Split into two paths to avoid checking withDeleted on every iteration.
|
|
171
|
+
*/
|
|
172
|
+
if (withDeleted) {
|
|
173
|
+
for (var i = 0; i < docIds.length; ++i) {
|
|
174
|
+
var docInDb = documentsById.get(docIds[i]);
|
|
175
|
+
if (docInDb) {
|
|
176
|
+
ret.push(docInDb);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
for (var _i = 0; _i < docIds.length; ++_i) {
|
|
181
|
+
var _docInDb = documentsById.get(docIds[_i]);
|
|
182
|
+
if (_docInDb && !_docInDb._deleted) {
|
|
183
|
+
ret.push(_docInDb);
|
|
184
|
+
}
|
|
166
185
|
}
|
|
167
186
|
}
|
|
168
187
|
return Promise.resolve(ret);
|
|
@@ -190,8 +209,13 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
190
209
|
throw new Error('index does not exist ' + indexName);
|
|
191
210
|
}
|
|
192
211
|
var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
|
|
193
|
-
|
|
194
|
-
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @performance Use string-specialized binary search to avoid
|
|
215
|
+
* temporary array allocations on every query.
|
|
216
|
+
*/
|
|
217
|
+
var indexOfLower = queryPlan.inclusiveStart ? (0, _binarySearchBounds.boundGEByIndexString)(docsWithIndex, lowerBoundString) : (0, _binarySearchBounds.boundGTByIndexString)(docsWithIndex, lowerBoundString);
|
|
218
|
+
var indexOfUpper = queryPlan.inclusiveEnd ? (0, _binarySearchBounds.boundLEByIndexString)(docsWithIndex, upperBoundString) : (0, _binarySearchBounds.boundLTByIndexString)(docsWithIndex, upperBoundString);
|
|
195
219
|
var rows = [];
|
|
196
220
|
|
|
197
221
|
/**
|
|
@@ -250,44 +274,74 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
250
274
|
* If the selector is satisfied by the index,
|
|
251
275
|
* we can compute the count directly from the index range
|
|
252
276
|
* without extracting document data into an array.
|
|
277
|
+
* Uses string-specialized binary search to avoid allocations.
|
|
253
278
|
*/
|
|
254
279
|
if (queryPlan.selectorSatisfiedByIndex) {
|
|
255
|
-
var
|
|
256
|
-
var
|
|
257
|
-
var
|
|
258
|
-
var
|
|
259
|
-
var
|
|
260
|
-
var
|
|
261
|
-
var
|
|
262
|
-
if (!this.internals.byIndex[
|
|
280
|
+
var _queryPlanFields = queryPlan.index;
|
|
281
|
+
var _index = _queryPlanFields;
|
|
282
|
+
var _lowerBound = queryPlan.startKeys;
|
|
283
|
+
var _lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, _index, _lowerBound);
|
|
284
|
+
var _upperBound = queryPlan.endKeys;
|
|
285
|
+
var _upperBoundString = (0, _customIndex.getStartIndexStringFromUpperBound)(this.schema, _index, _upperBound);
|
|
286
|
+
var _indexName = (0, _memoryIndexes.getMemoryIndexName)(_index);
|
|
287
|
+
if (!this.internals.byIndex[_indexName]) {
|
|
263
288
|
throw (0, _rxError.newRxError)('SNH', {
|
|
264
289
|
args: {
|
|
265
|
-
indexName
|
|
290
|
+
indexName: _indexName
|
|
266
291
|
}
|
|
267
292
|
});
|
|
268
293
|
}
|
|
269
|
-
var
|
|
270
|
-
var
|
|
271
|
-
var
|
|
272
|
-
var _count = Math.max(0,
|
|
294
|
+
var _docsWithIndex = this.internals.byIndex[_indexName].docsWithIndex;
|
|
295
|
+
var _indexOfLower = queryPlan.inclusiveStart ? (0, _binarySearchBounds.boundGEByIndexString)(_docsWithIndex, _lowerBoundString) : (0, _binarySearchBounds.boundGTByIndexString)(_docsWithIndex, _lowerBoundString);
|
|
296
|
+
var _indexOfUpper = queryPlan.inclusiveEnd ? (0, _binarySearchBounds.boundLEByIndexString)(_docsWithIndex, _upperBoundString) : (0, _binarySearchBounds.boundLTByIndexString)(_docsWithIndex, _upperBoundString);
|
|
297
|
+
var _count = Math.max(0, _indexOfUpper - _indexOfLower + 1);
|
|
273
298
|
return Promise.resolve({
|
|
274
299
|
count: _count,
|
|
275
300
|
mode: 'fast'
|
|
276
301
|
});
|
|
277
302
|
}
|
|
278
|
-
|
|
279
|
-
|
|
303
|
+
var queryMatcher = (0, _rxQueryHelper.getQueryMatcher)(this.schema, preparedQuery.query);
|
|
304
|
+
var queryPlanFields = queryPlan.index;
|
|
305
|
+
var index = queryPlanFields;
|
|
306
|
+
var lowerBound = queryPlan.startKeys;
|
|
307
|
+
var lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, index, lowerBound);
|
|
308
|
+
var upperBound = queryPlan.endKeys;
|
|
309
|
+
var upperBoundString = (0, _customIndex.getStartIndexStringFromUpperBound)(this.schema, index, upperBound);
|
|
310
|
+
var indexName = (0, _memoryIndexes.getMemoryIndexName)(index);
|
|
311
|
+
if (!this.internals.byIndex[indexName]) {
|
|
312
|
+
throw (0, _rxError.newRxError)('SNH', {
|
|
313
|
+
args: {
|
|
314
|
+
indexName
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
|
|
319
|
+
var indexOfLower = queryPlan.inclusiveStart ? (0, _binarySearchBounds.boundGEByIndexString)(docsWithIndex, lowerBoundString) : (0, _binarySearchBounds.boundGTByIndexString)(docsWithIndex, lowerBoundString);
|
|
320
|
+
var indexOfUpper = queryPlan.inclusiveEnd ? (0, _binarySearchBounds.boundLEByIndexString)(docsWithIndex, upperBoundString) : (0, _binarySearchBounds.boundLTByIndexString)(docsWithIndex, upperBoundString);
|
|
321
|
+
var count = 0;
|
|
322
|
+
while (indexOfLower <= indexOfUpper) {
|
|
323
|
+
var currentRow = docsWithIndex[indexOfLower];
|
|
324
|
+
if (!currentRow) {
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
if (queryMatcher(currentRow[1])) {
|
|
328
|
+
count++;
|
|
329
|
+
}
|
|
330
|
+
indexOfLower++;
|
|
331
|
+
}
|
|
332
|
+
return Promise.resolve({
|
|
333
|
+
count,
|
|
280
334
|
mode: 'fast'
|
|
281
|
-
})
|
|
335
|
+
});
|
|
282
336
|
};
|
|
283
337
|
_proto.cleanup = function cleanup(minimumDeletedTime) {
|
|
284
338
|
this.ensurePersistence();
|
|
285
|
-
var maxDeletionTime = (0,
|
|
339
|
+
var maxDeletionTime = (0, _index2.now)() - minimumDeletedTime;
|
|
286
340
|
var index = ['_deleted', '_meta.lwt', this.primaryPath];
|
|
287
341
|
var indexName = (0, _memoryIndexes.getMemoryIndexName)(index);
|
|
288
342
|
var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
|
|
289
343
|
var lowerBoundString = (0, _customIndex.getStartIndexStringFromLowerBound)(this.schema, index, [true, 0, '']);
|
|
290
|
-
var indexOfLower = (0, _binarySearchBounds.
|
|
344
|
+
var indexOfLower = (0, _binarySearchBounds.boundGTByIndexString)(docsWithIndex, lowerBoundString);
|
|
291
345
|
var done = false;
|
|
292
346
|
while (!done) {
|
|
293
347
|
var currentDoc = docsWithIndex[indexOfLower];
|
|
@@ -295,10 +349,15 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
295
349
|
done = true;
|
|
296
350
|
} else {
|
|
297
351
|
(0, _memoryHelper.removeDocFromState)(this.primaryPath, this.schema, this.internals, currentDoc[1]);
|
|
298
|
-
|
|
352
|
+
/**
|
|
353
|
+
* Do NOT increment indexOfLower after removal.
|
|
354
|
+
* removeDocFromState() splices the element out of the array,
|
|
355
|
+
* so the next element shifts into the current position.
|
|
356
|
+
* Incrementing would skip it.
|
|
357
|
+
*/
|
|
299
358
|
}
|
|
300
359
|
}
|
|
301
|
-
return
|
|
360
|
+
return _index2.PROMISE_RESOLVE_TRUE;
|
|
302
361
|
};
|
|
303
362
|
_proto.getAttachmentData = function getAttachmentData(documentId, attachmentId, digest) {
|
|
304
363
|
this.ensurePersistence();
|
|
@@ -328,11 +387,11 @@ var RxStorageInstanceMemory = exports.RxStorageInstanceMemory = /*#__PURE__*/fun
|
|
|
328
387
|
OPEN_MEMORY_INSTANCES.delete(this);
|
|
329
388
|
this.ensurePersistence();
|
|
330
389
|
if (this.closed) {
|
|
331
|
-
return
|
|
390
|
+
return _index2.PROMISE_RESOLVE_VOID;
|
|
332
391
|
}
|
|
333
392
|
this.closed = true;
|
|
334
393
|
this.internals.refCount = this.internals.refCount - 1;
|
|
335
|
-
return
|
|
394
|
+
return _index2.PROMISE_RESOLVE_VOID;
|
|
336
395
|
};
|
|
337
396
|
return RxStorageInstanceMemory;
|
|
338
397
|
}();
|
|
@@ -341,13 +400,14 @@ function createMemoryStorageInstance(storage, params, settings) {
|
|
|
341
400
|
var internals = storage.collectionStates.get(collectionKey);
|
|
342
401
|
if (!internals) {
|
|
343
402
|
internals = {
|
|
344
|
-
id: (0,
|
|
403
|
+
id: (0, _index2.randomToken)(5),
|
|
345
404
|
schema: params.schema,
|
|
346
405
|
removed: false,
|
|
347
406
|
refCount: 1,
|
|
348
407
|
documents: new Map(),
|
|
349
408
|
attachments: params.schema.attachments ? new Map() : undefined,
|
|
350
409
|
byIndex: {},
|
|
410
|
+
byIndexArray: [],
|
|
351
411
|
changes$: new _rxjs.Subject()
|
|
352
412
|
};
|
|
353
413
|
(0, _memoryIndexes.addIndexesToInternalsState)(internals, params.schema);
|
|
@@ -360,7 +420,7 @@ function createMemoryStorageInstance(storage, params, settings) {
|
|
|
360
420
|
* does not exist here, we have hard-to-debug problems
|
|
361
421
|
* downstream.
|
|
362
422
|
*/
|
|
363
|
-
if (params.devMode && !(0,
|
|
423
|
+
if (params.devMode && !(0, _index2.deepEqual)(internals.schema, params.schema)) {
|
|
364
424
|
throw new Error('storage was already created with a different schema');
|
|
365
425
|
}
|
|
366
426
|
internals.refCount = internals.refCount + 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rx-storage-instance-memory.js","names":["_rxjs","require","_customIndex","_rxSchemaHelper","_rxStorageHelper","_index","_binarySearchBounds","_memoryHelper","_memoryIndexes","_rxQueryHelper","_rxError","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","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","requestIdlePromiseNoQueue","then","undefined","eventBulk","events","length","lastState","ensureNotFalsy","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","Object","values","byIndex","bulkInsertDocs","bulkInsertToState","bulkUpdateDocs","i","writeRow","doc","docId","putWriteRowToState","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","attachmentMapKey","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","_deleted","push","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","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","getSortComparator","sort","slice","count","newRxError","args","max","mode","result","cleanup","minimumDeletedTime","maxDeletionTime","now","removeDocFromState","PROMISE_RESOLVE_TRUE","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","getMemoryCollectionKey","version","close","PROMISE_RESOLVE_VOID","refCount","createMemoryStorageInstance","params","collectionKey","randomToken","Map","Subject","addIndexesToInternalsState","deepEqual","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject\r\n} from 'rxjs';\r\nimport {\r\n getStartIndexStringFromLowerBound,\r\n getStartIndexStringFromUpperBound\r\n} from '../../custom-index.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nimport {\r\n categorizeBulkWriteRows\r\n} from '../../rx-storage-helper.ts';\r\nimport type {\r\n BulkWriteRow,\r\n CategorizeBulkWriteRowsOutput,\r\n EventBulk,\r\n PreparedQuery,\r\n QueryMatcher,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxStorageBulkWriteResponse,\r\n RxStorageChangeEvent,\r\n RxStorageCountResult,\r\n RxStorageDefaultCheckpoint,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n RxStorageQueryResult,\r\n StringKeys\r\n} from '../../types/index.d.ts';\r\nimport {\r\n deepEqual,\r\n ensureNotFalsy,\r\n now,\r\n PROMISE_RESOLVE_TRUE,\r\n PROMISE_RESOLVE_VOID,\r\n randomToken,\r\n requestIdlePromiseNoQueue\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n boundGE,\r\n boundGT,\r\n boundLE,\r\n boundLT\r\n} from './binary-search-bounds.ts';\r\nimport {\r\n attachmentMapKey,\r\n bulkInsertToState,\r\n compareDocsWithIndex,\r\n ensureNotRemoved,\r\n getMemoryCollectionKey,\r\n putWriteRowToState,\r\n removeDocFromState\r\n} from './memory-helper.ts';\r\nimport {\r\n addIndexesToInternalsState,\r\n getMemoryIndexName\r\n} from './memory-indexes.ts';\r\nimport type {\r\n MemoryStorageInternals,\r\n RxStorageMemory,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageMemorySettings\r\n} from './memory-types.ts';\r\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\n\r\n/**\r\n * Used in tests to ensure everything\r\n * is closed correctly\r\n */\r\nexport const OPEN_MEMORY_INSTANCES = new Set<RxStorageInstanceMemory<any>>();\r\n\r\nexport class RxStorageInstanceMemory<RxDocType> implements RxStorageInstance<\r\n RxDocType,\r\n MemoryStorageInternals<RxDocType>,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageDefaultCheckpoint\r\n> {\r\n\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n public closed = false;\r\n\r\n /**\r\n * Used by some plugins and storage wrappers\r\n * to find out details about the internals of a write operation.\r\n * For example if you want to know which documents really have been replaced\r\n * or newly inserted.\r\n */\r\n public categorizedByWriteInput = new WeakMap<BulkWriteRow<RxDocType>[], CategorizeBulkWriteRowsOutput<RxDocType>>();\r\n\r\n constructor(\r\n public readonly storage: RxStorageMemory,\r\n public readonly databaseName: string,\r\n public readonly collectionName: string,\r\n public readonly schema: Readonly<RxJsonSchema<RxDocumentData<RxDocType>>>,\r\n public readonly internals: MemoryStorageInternals<RxDocType>,\r\n public readonly options: Readonly<RxStorageMemoryInstanceCreationOptions>,\r\n public readonly settings: RxStorageMemorySettings,\r\n public readonly devMode: boolean\r\n ) {\r\n OPEN_MEMORY_INSTANCES.add(this);\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\r\n }\r\n\r\n bulkWrite(\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ): Promise<RxStorageBulkWriteResponse<RxDocType>> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const internals = this.internals;\r\n const documentsById = this.internals.documents;\r\n const primaryPath = this.primaryPath;\r\n\r\n\r\n const categorized = categorizeBulkWriteRows<RxDocType>(\r\n this,\r\n primaryPath as any,\r\n documentsById,\r\n documentWrites,\r\n context\r\n );\r\n const error = categorized.errors;\r\n /**\r\n * @performance\r\n * We have to return a Promise but we do not want to wait\r\n * one tick, so we directly create the promise\r\n * which makes it likely to be already resolved later.\r\n */\r\n const awaitMe = Promise.resolve({ error });\r\n\r\n this.categorizedByWriteInput.set(documentWrites, categorized);\r\n this.internals.ensurePersistenceTask = categorized;\r\n\r\n if (!this.internals.ensurePersistenceIdlePromise) {\r\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\r\n this.internals.ensurePersistenceIdlePromise = undefined;\r\n this.ensurePersistence();\r\n });\r\n }\r\n\r\n /**\r\n * Important: The events must be emitted AFTER the persistence\r\n * task has been added.\r\n */\r\n if (categorized.eventBulk.events.length > 0) {\r\n const lastState = ensureNotFalsy(categorized.newestRow).document;\r\n categorized.eventBulk.checkpoint = {\r\n id: lastState[primaryPath],\r\n lwt: lastState._meta.lwt\r\n };\r\n internals.changes$.next(categorized.eventBulk);\r\n }\r\n\r\n return awaitMe;\r\n }\r\n\r\n /**\r\n * Instead of directly inserting the documents into all indexes,\r\n * we do it lazy in the background. This gives the application time\r\n * to directly work with the write-result and to do stuff like rendering DOM\r\n * notes and processing RxDB queries.\r\n * Then in some later time, or just before the next read/write,\r\n * it is ensured that the indexes have been written.\r\n */\r\n public ensurePersistence() {\r\n if (\r\n !this.internals.ensurePersistenceTask\r\n ) {\r\n return;\r\n }\r\n const internals = this.internals;\r\n const documentsById = this.internals.documents;\r\n const primaryPath = this.primaryPath;\r\n\r\n const categorized = this.internals.ensurePersistenceTask;\r\n this.internals.ensurePersistenceTask = undefined;\r\n\r\n /**\r\n * Do inserts/updates\r\n */\r\n const stateByIndex = Object.values(this.internals.byIndex);\r\n\r\n /**\r\n * @performance Use batch insert for bulk inserts to avoid\r\n * repeated Array.splice() calls which are O(n) each.\r\n * Instead, batch-compute index entries, sort them,\r\n * and merge into existing sorted arrays.\r\n */\r\n const bulkInsertDocs = categorized.bulkInsertDocs;\r\n if (bulkInsertDocs.length > 0) {\r\n bulkInsertToState(\r\n primaryPath as any,\r\n internals,\r\n stateByIndex,\r\n bulkInsertDocs\r\n );\r\n }\r\n\r\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\r\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\r\n const writeRow = bulkUpdateDocs[i];\r\n const doc = writeRow.document;\r\n const docId = doc[primaryPath];\r\n putWriteRowToState(\r\n docId as any,\r\n internals,\r\n stateByIndex,\r\n doc,\r\n documentsById.get(docId as any)\r\n );\r\n }\r\n\r\n /**\r\n * Handle attachments\r\n */\r\n if (this.schema.attachments) {\r\n const attachmentsMap = internals.attachments;\r\n categorized.attachmentsAdd.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n if (this.schema.attachments) {\r\n categorized.attachmentsUpdate.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n categorized.attachmentsRemove.forEach(attachment => {\r\n attachmentsMap.delete(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n findDocumentsById(\r\n docIds: string[],\r\n withDeleted: boolean\r\n ): Promise<RxDocumentData<RxDocType>[]> {\r\n this.ensurePersistence();\r\n const documentsById = this.internals.documents;\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n if (documentsById.size === 0) {\r\n return Promise.resolve(ret);\r\n }\r\n for (let i = 0; i < docIds.length; ++i) {\r\n const docId = docIds[i];\r\n const docInDb = documentsById.get(docId);\r\n if (\r\n docInDb &&\r\n (\r\n !docInDb._deleted ||\r\n withDeleted\r\n )\r\n ) {\r\n ret.push(docInDb);\r\n }\r\n }\r\n return Promise.resolve(ret);\r\n }\r\n\r\n query(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageQueryResult<RxDocType>> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n const query = preparedQuery.query;\r\n\r\n const skip = query.skip ? query.skip : 0;\r\n const limit = query.limit ? query.limit : Infinity;\r\n const skipPlusLimit = skip + limit;\r\n\r\n let queryMatcher: QueryMatcher<RxDocumentData<RxDocType>> | false = false;\r\n if (!queryPlan.selectorSatisfiedByIndex) {\r\n queryMatcher = getQueryMatcher(\r\n this.schema,\r\n preparedQuery.query\r\n );\r\n }\r\n\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\r\n const index: string[] | undefined = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw new Error('index does not exist ' + indexName);\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n\r\n\r\n let indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\r\n docsWithIndex,\r\n [\r\n lowerBoundString\r\n ] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\r\n docsWithIndex,\r\n [\r\n upperBoundString\r\n ] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n let rows: RxDocumentData<RxDocType>[] = [];\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can extract all documents in the range without\r\n * running a per-document queryMatcher check.\r\n * This is a common case for queries like find-by-query\r\n * where the selector is empty or fully covered by the index.\r\n */\r\n if (!queryMatcher) {\r\n const rangeLength = indexOfUpper - indexOfLower + 1;\r\n if (rangeLength > 0) {\r\n const extractLength = mustManuallyResort\r\n ? rangeLength\r\n : Math.min(rangeLength, skipPlusLimit);\r\n rows = new Array(extractLength);\r\n for (let i = 0; i < extractLength; i++) {\r\n rows[i] = docsWithIndex[indexOfLower + i][1];\r\n }\r\n }\r\n } else {\r\n let done = false;\r\n while (!done) {\r\n const currentRow = docsWithIndex[indexOfLower];\r\n if (\r\n !currentRow ||\r\n indexOfLower > indexOfUpper\r\n ) {\r\n break;\r\n }\r\n const currentDoc = currentRow[1];\r\n\r\n if (queryMatcher(currentDoc)) {\r\n rows.push(currentDoc);\r\n }\r\n\r\n if (\r\n (rows.length >= skipPlusLimit && !mustManuallyResort)\r\n ) {\r\n done = true;\r\n }\r\n\r\n indexOfLower++;\r\n }\r\n }\r\n\r\n if (mustManuallyResort) {\r\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\r\n rows = rows.sort(sortComparator);\r\n }\r\n\r\n // apply skip and limit boundaries.\r\n if (skip !== 0 || rows.length > skipPlusLimit) {\r\n rows = rows.slice(skip, skipPlusLimit);\r\n }\r\n\r\n return Promise.resolve({\r\n documents: rows\r\n });\r\n }\r\n\r\n count(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageCountResult> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can compute the count directly from the index range\r\n * without extracting document data into an array.\r\n */\r\n if (queryPlan.selectorSatisfiedByIndex) {\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const index: string[] = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw newRxError('SNH', { args: { indexName } });\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const indexOfLower = (queryPlan.inclusiveStart ? boundGE : boundGT)(\r\n docsWithIndex,\r\n [lowerBoundString] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n const indexOfUpper = (queryPlan.inclusiveEnd ? boundLE : boundLT)(\r\n docsWithIndex,\r\n [upperBoundString] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n const count = Math.max(0, indexOfUpper - indexOfLower + 1);\r\n return Promise.resolve({\r\n count,\r\n mode: 'fast'\r\n });\r\n }\r\n\r\n return this.query(preparedQuery).then(result => ({\r\n count: result.documents.length,\r\n mode: 'fast' as const\r\n }));\r\n }\r\n\r\n cleanup(minimumDeletedTime: number): Promise<boolean> {\r\n this.ensurePersistence();\r\n const maxDeletionTime = now() - minimumDeletedTime;\r\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\r\n const indexName = getMemoryIndexName(index);\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n [\r\n true,\r\n 0,\r\n ''\r\n ]\r\n );\r\n\r\n let indexOfLower = boundGT(\r\n docsWithIndex,\r\n [\r\n lowerBoundString\r\n ] as any,\r\n compareDocsWithIndex\r\n );\r\n\r\n let done = false;\r\n while (!done) {\r\n const currentDoc = docsWithIndex[indexOfLower];\r\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\r\n done = true;\r\n } else {\r\n removeDocFromState(\r\n this.primaryPath as any,\r\n this.schema,\r\n this.internals,\r\n currentDoc[1]\r\n );\r\n indexOfLower++;\r\n }\r\n }\r\n return PROMISE_RESOLVE_TRUE;\r\n }\r\n\r\n getAttachmentData(\r\n documentId: string,\r\n attachmentId: string,\r\n digest: string\r\n ): Promise<Blob> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const key = attachmentMapKey(documentId, attachmentId);\r\n const data = this.internals.attachments.get(key);\r\n\r\n if (\r\n !digest ||\r\n !data ||\r\n data.digest !== digest\r\n ) {\r\n throw new Error('attachment does not exist: ' + key);\r\n }\r\n return Promise.resolve(data.writeData.data);\r\n }\r\n\r\n changeStream(): Observable<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> {\r\n ensureNotRemoved(this);\r\n return this.internals.changes$.asObservable();\r\n }\r\n\r\n async remove(): Promise<void> {\r\n if (this.closed) {\r\n throw new Error('closed');\r\n }\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n\r\n this.internals.removed = true;\r\n this.storage.collectionStates.delete(\r\n getMemoryCollectionKey(\r\n this.databaseName,\r\n this.collectionName,\r\n this.schema.version\r\n )\r\n );\r\n await this.close();\r\n }\r\n\r\n close(): Promise<void> {\r\n OPEN_MEMORY_INSTANCES.delete(this);\r\n\r\n this.ensurePersistence();\r\n if (this.closed) {\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n this.closed = true;\r\n\r\n this.internals.refCount = this.internals.refCount - 1;\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n}\r\n\r\nexport function createMemoryStorageInstance<RxDocType>(\r\n storage: RxStorageMemory,\r\n params: RxStorageInstanceCreationParams<RxDocType, RxStorageMemoryInstanceCreationOptions>,\r\n settings: RxStorageMemorySettings\r\n): Promise<RxStorageInstanceMemory<RxDocType>> {\r\n const collectionKey = getMemoryCollectionKey(\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema.version\r\n );\r\n\r\n let internals = storage.collectionStates.get(collectionKey);\r\n if (!internals) {\r\n internals = {\r\n id: randomToken(5),\r\n schema: params.schema,\r\n removed: false,\r\n refCount: 1,\r\n documents: new Map(),\r\n attachments: params.schema.attachments ? new Map() : undefined as any,\r\n byIndex: {},\r\n changes$: new Subject()\r\n };\r\n addIndexesToInternalsState(internals, params.schema);\r\n storage.collectionStates.set(collectionKey, internals);\r\n } else {\r\n /**\r\n * Ensure that the storage was not already\r\n * created with a different schema.\r\n * This is very important because if this check\r\n * does not exist here, we have hard-to-debug problems\r\n * downstream.\r\n */\r\n if (\r\n params.devMode &&\r\n !deepEqual(internals.schema, params.schema)\r\n ) {\r\n throw new Error('storage was already created with a different schema');\r\n }\r\n internals.refCount = internals.refCount + 1;\r\n }\r\n\r\n const instance = new RxStorageInstanceMemory(\r\n storage,\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema,\r\n internals,\r\n params.options,\r\n settings,\r\n params.devMode\r\n );\r\n return Promise.resolve(instance);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"rx-storage-instance-memory.js","names":["_rxjs","require","_customIndex","_rxSchemaHelper","_rxStorageHelper","_index2","_binarySearchBounds","_memoryHelper","_memoryIndexes","_rxQueryHelper","_rxError","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","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","requestIdlePromiseNoQueue","then","undefined","eventBulk","events","length","lastState","ensureNotFalsy","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","byIndexArray","bulkInsertDocs","bulkInsertToState","bulkUpdateDocs","i","writeRow","doc","docId","putWriteRowToState","previous","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","attachmentMapKey","documentId","attachmentId","writeData","attachmentData","digest","attachmentsUpdate","attachmentsRemove","delete","findDocumentsById","docIds","withDeleted","ret","size","docInDb","get","push","_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","byIndex","Error","docsWithIndex","indexOfLower","inclusiveStart","boundGEByIndexString","boundGTByIndexString","indexOfUpper","inclusiveEnd","boundLEByIndexString","boundLTByIndexString","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","getSortComparator","sort","slice","count","newRxError","args","max","mode","cleanup","minimumDeletedTime","maxDeletionTime","now","removeDocFromState","PROMISE_RESOLVE_TRUE","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","getMemoryCollectionKey","version","close","PROMISE_RESOLVE_VOID","refCount","createMemoryStorageInstance","params","collectionKey","randomToken","Map","Subject","addIndexesToInternalsState","deepEqual","instance"],"sources":["../../../../src/plugins/storage-memory/rx-storage-instance-memory.ts"],"sourcesContent":["import {\r\n Observable,\r\n Subject\r\n} from 'rxjs';\r\nimport {\r\n getStartIndexStringFromLowerBound,\r\n getStartIndexStringFromUpperBound\r\n} from '../../custom-index.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nimport {\r\n categorizeBulkWriteRows\r\n} from '../../rx-storage-helper.ts';\r\nimport type {\r\n BulkWriteRow,\r\n CategorizeBulkWriteRowsOutput,\r\n EventBulk,\r\n PreparedQuery,\r\n QueryMatcher,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxStorageBulkWriteResponse,\r\n RxStorageChangeEvent,\r\n RxStorageCountResult,\r\n RxStorageDefaultCheckpoint,\r\n RxStorageInstance,\r\n RxStorageInstanceCreationParams,\r\n RxStorageQueryResult,\r\n StringKeys\r\n} from '../../types/index.d.ts';\r\nimport {\r\n deepEqual,\r\n ensureNotFalsy,\r\n now,\r\n PROMISE_RESOLVE_TRUE,\r\n PROMISE_RESOLVE_VOID,\r\n randomToken,\r\n requestIdlePromiseNoQueue\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n boundGEByIndexString,\r\n boundGTByIndexString,\r\n boundLEByIndexString,\r\n boundLTByIndexString\r\n} from './binary-search-bounds.ts';\r\nimport {\r\n attachmentMapKey,\r\n bulkInsertToState,\r\n ensureNotRemoved,\r\n getMemoryCollectionKey,\r\n putWriteRowToState,\r\n removeDocFromState\r\n} from './memory-helper.ts';\r\nimport {\r\n addIndexesToInternalsState,\r\n getMemoryIndexName\r\n} from './memory-indexes.ts';\r\nimport type {\r\n MemoryStorageInternals,\r\n RxStorageMemory,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageMemorySettings\r\n} from './memory-types.ts';\r\nimport { getQueryMatcher, getSortComparator } from '../../rx-query-helper.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\n\r\n/**\r\n * Used in tests to ensure everything\r\n * is closed correctly\r\n */\r\nexport const OPEN_MEMORY_INSTANCES = new Set<RxStorageInstanceMemory<any>>();\r\n\r\nexport class RxStorageInstanceMemory<RxDocType> implements RxStorageInstance<\r\n RxDocType,\r\n MemoryStorageInternals<RxDocType>,\r\n RxStorageMemoryInstanceCreationOptions,\r\n RxStorageDefaultCheckpoint\r\n> {\r\n\r\n public readonly primaryPath: StringKeys<RxDocumentData<RxDocType>>;\r\n public closed = false;\r\n\r\n /**\r\n * Used by some plugins and storage wrappers\r\n * to find out details about the internals of a write operation.\r\n * For example if you want to know which documents really have been replaced\r\n * or newly inserted.\r\n */\r\n public categorizedByWriteInput = new WeakMap<BulkWriteRow<RxDocType>[], CategorizeBulkWriteRowsOutput<RxDocType>>();\r\n\r\n constructor(\r\n public readonly storage: RxStorageMemory,\r\n public readonly databaseName: string,\r\n public readonly collectionName: string,\r\n public readonly schema: Readonly<RxJsonSchema<RxDocumentData<RxDocType>>>,\r\n public readonly internals: MemoryStorageInternals<RxDocType>,\r\n public readonly options: Readonly<RxStorageMemoryInstanceCreationOptions>,\r\n public readonly settings: RxStorageMemorySettings,\r\n public readonly devMode: boolean\r\n ) {\r\n OPEN_MEMORY_INSTANCES.add(this);\r\n this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);\r\n }\r\n\r\n bulkWrite(\r\n documentWrites: BulkWriteRow<RxDocType>[],\r\n context: string\r\n ): Promise<RxStorageBulkWriteResponse<RxDocType>> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const internals = this.internals;\r\n const documentsById = this.internals.documents;\r\n const primaryPath = this.primaryPath;\r\n\r\n\r\n const categorized = categorizeBulkWriteRows<RxDocType>(\r\n this,\r\n primaryPath as any,\r\n documentsById,\r\n documentWrites,\r\n context\r\n );\r\n const error = categorized.errors;\r\n /**\r\n * @performance\r\n * We have to return a Promise but we do not want to wait\r\n * one tick, so we directly create the promise\r\n * which makes it likely to be already resolved later.\r\n */\r\n const awaitMe = Promise.resolve({ error });\r\n\r\n this.categorizedByWriteInput.set(documentWrites, categorized);\r\n this.internals.ensurePersistenceTask = categorized;\r\n\r\n if (!this.internals.ensurePersistenceIdlePromise) {\r\n this.internals.ensurePersistenceIdlePromise = requestIdlePromiseNoQueue().then(() => {\r\n this.internals.ensurePersistenceIdlePromise = undefined;\r\n this.ensurePersistence();\r\n });\r\n }\r\n\r\n /**\r\n * Important: The events must be emitted AFTER the persistence\r\n * task has been added.\r\n */\r\n if (categorized.eventBulk.events.length > 0) {\r\n const lastState = ensureNotFalsy(categorized.newestRow).document;\r\n categorized.eventBulk.checkpoint = {\r\n id: lastState[primaryPath],\r\n lwt: lastState._meta.lwt\r\n };\r\n internals.changes$.next(categorized.eventBulk);\r\n }\r\n\r\n return awaitMe;\r\n }\r\n\r\n /**\r\n * Instead of directly inserting the documents into all indexes,\r\n * we do it lazy in the background. This gives the application time\r\n * to directly work with the write-result and to do stuff like rendering DOM\r\n * notes and processing RxDB queries.\r\n * Then in some later time, or just before the next read/write,\r\n * it is ensured that the indexes have been written.\r\n */\r\n public ensurePersistence() {\r\n if (\r\n !this.internals.ensurePersistenceTask\r\n ) {\r\n return;\r\n }\r\n const internals = this.internals;\r\n const primaryPath = this.primaryPath;\r\n\r\n const categorized = this.internals.ensurePersistenceTask;\r\n this.internals.ensurePersistenceTask = undefined;\r\n\r\n /**\r\n * Do inserts/updates\r\n * @performance Use cached byIndexArray instead of Object.values()\r\n */\r\n const stateByIndex = internals.byIndexArray;\r\n\r\n /**\r\n * @performance Use batch insert for bulk inserts to avoid\r\n * repeated Array.splice() calls which are O(n) each.\r\n * Instead, batch-compute index entries, sort them,\r\n * and merge into existing sorted arrays.\r\n */\r\n const bulkInsertDocs = categorized.bulkInsertDocs;\r\n if (bulkInsertDocs.length > 0) {\r\n bulkInsertToState(\r\n primaryPath as any,\r\n internals,\r\n stateByIndex,\r\n bulkInsertDocs\r\n );\r\n }\r\n\r\n const bulkUpdateDocs = categorized.bulkUpdateDocs;\r\n for (let i = 0; i < bulkUpdateDocs.length; ++i) {\r\n const writeRow = bulkUpdateDocs[i];\r\n const doc = writeRow.document;\r\n const docId = doc[primaryPath];\r\n /**\r\n * @performance\r\n * Pass writeRow.previous directly as the old document state\r\n * instead of re-looking it up from the documents Map.\r\n * This is safe because categorizeBulkWriteRows already verified\r\n * that previous._rev matches the document in the Map (conflict check).\r\n */\r\n putWriteRowToState(\r\n docId as any,\r\n internals,\r\n stateByIndex,\r\n doc,\r\n writeRow.previous\r\n );\r\n }\r\n\r\n /**\r\n * Handle attachments\r\n */\r\n if (this.schema.attachments) {\r\n const attachmentsMap = internals.attachments;\r\n categorized.attachmentsAdd.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n if (this.schema.attachments) {\r\n categorized.attachmentsUpdate.forEach(attachment => {\r\n attachmentsMap.set(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId),\r\n {\r\n writeData: attachment.attachmentData,\r\n digest: attachment.digest\r\n }\r\n );\r\n });\r\n categorized.attachmentsRemove.forEach(attachment => {\r\n attachmentsMap.delete(\r\n attachmentMapKey(attachment.documentId, attachment.attachmentId)\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n findDocumentsById(\r\n docIds: string[],\r\n withDeleted: boolean\r\n ): Promise<RxDocumentData<RxDocType>[]> {\r\n this.ensurePersistence();\r\n const documentsById = this.internals.documents;\r\n const ret: RxDocumentData<RxDocType>[] = [];\r\n if (documentsById.size === 0) {\r\n return Promise.resolve(ret);\r\n }\r\n /**\r\n * @performance\r\n * Split into two paths to avoid checking withDeleted on every iteration.\r\n */\r\n if (withDeleted) {\r\n for (let i = 0; i < docIds.length; ++i) {\r\n const docInDb = documentsById.get(docIds[i]);\r\n if (docInDb) {\r\n ret.push(docInDb);\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < docIds.length; ++i) {\r\n const docInDb = documentsById.get(docIds[i]);\r\n if (docInDb && !docInDb._deleted) {\r\n ret.push(docInDb);\r\n }\r\n }\r\n }\r\n return Promise.resolve(ret);\r\n }\r\n\r\n query(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageQueryResult<RxDocType>> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n const query = preparedQuery.query;\r\n\r\n const skip = query.skip ? query.skip : 0;\r\n const limit = query.limit ? query.limit : Infinity;\r\n const skipPlusLimit = skip + limit;\r\n\r\n let queryMatcher: QueryMatcher<RxDocumentData<RxDocType>> | false = false;\r\n if (!queryPlan.selectorSatisfiedByIndex) {\r\n queryMatcher = getQueryMatcher(\r\n this.schema,\r\n preparedQuery.query\r\n );\r\n }\r\n\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const mustManuallyResort = !queryPlan.sortSatisfiedByIndex;\r\n const index: string[] | undefined = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw new Error('index does not exist ' + indexName);\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n\r\n /**\r\n * @performance Use string-specialized binary search to avoid\r\n * temporary array allocations on every query.\r\n */\r\n let indexOfLower = queryPlan.inclusiveStart\r\n ? boundGEByIndexString(docsWithIndex, lowerBoundString)\r\n : boundGTByIndexString(docsWithIndex, lowerBoundString);\r\n\r\n const indexOfUpper = queryPlan.inclusiveEnd\r\n ? boundLEByIndexString(docsWithIndex, upperBoundString)\r\n : boundLTByIndexString(docsWithIndex, upperBoundString);\r\n\r\n let rows: RxDocumentData<RxDocType>[] = [];\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can extract all documents in the range without\r\n * running a per-document queryMatcher check.\r\n * This is a common case for queries like find-by-query\r\n * where the selector is empty or fully covered by the index.\r\n */\r\n if (!queryMatcher) {\r\n const rangeLength = indexOfUpper - indexOfLower + 1;\r\n if (rangeLength > 0) {\r\n const extractLength = mustManuallyResort\r\n ? rangeLength\r\n : Math.min(rangeLength, skipPlusLimit);\r\n rows = new Array(extractLength);\r\n for (let i = 0; i < extractLength; i++) {\r\n rows[i] = docsWithIndex[indexOfLower + i][1];\r\n }\r\n }\r\n } else {\r\n let done = false;\r\n while (!done) {\r\n const currentRow = docsWithIndex[indexOfLower];\r\n if (\r\n !currentRow ||\r\n indexOfLower > indexOfUpper\r\n ) {\r\n break;\r\n }\r\n const currentDoc = currentRow[1];\r\n\r\n if (queryMatcher(currentDoc)) {\r\n rows.push(currentDoc);\r\n }\r\n\r\n if (\r\n (rows.length >= skipPlusLimit && !mustManuallyResort)\r\n ) {\r\n done = true;\r\n }\r\n\r\n indexOfLower++;\r\n }\r\n }\r\n\r\n if (mustManuallyResort) {\r\n const sortComparator = getSortComparator(this.schema, preparedQuery.query);\r\n rows = rows.sort(sortComparator);\r\n }\r\n\r\n // apply skip and limit boundaries.\r\n if (skip !== 0 || rows.length > skipPlusLimit) {\r\n rows = rows.slice(skip, skipPlusLimit);\r\n }\r\n\r\n return Promise.resolve({\r\n documents: rows\r\n });\r\n }\r\n\r\n count(\r\n preparedQuery: PreparedQuery<RxDocType>\r\n ): Promise<RxStorageCountResult> {\r\n this.ensurePersistence();\r\n\r\n const queryPlan = preparedQuery.queryPlan;\r\n\r\n /**\r\n * @performance\r\n * If the selector is satisfied by the index,\r\n * we can compute the count directly from the index range\r\n * without extracting document data into an array.\r\n * Uses string-specialized binary search to avoid allocations.\r\n */\r\n if (queryPlan.selectorSatisfiedByIndex) {\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const index: string[] = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n\r\n if (!this.internals.byIndex[indexName]) {\r\n throw newRxError('SNH', { args: { indexName } });\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const indexOfLower = queryPlan.inclusiveStart\r\n ? boundGEByIndexString(docsWithIndex, lowerBoundString)\r\n : boundGTByIndexString(docsWithIndex, lowerBoundString);\r\n\r\n const indexOfUpper = queryPlan.inclusiveEnd\r\n ? boundLEByIndexString(docsWithIndex, upperBoundString)\r\n : boundLTByIndexString(docsWithIndex, upperBoundString);\r\n\r\n const count = Math.max(0, indexOfUpper - indexOfLower + 1);\r\n return Promise.resolve({\r\n count,\r\n mode: 'fast'\r\n });\r\n }\r\n\r\n const queryMatcher = getQueryMatcher(\r\n this.schema,\r\n preparedQuery.query\r\n );\r\n const queryPlanFields: string[] = queryPlan.index;\r\n const index: string[] = queryPlanFields;\r\n const lowerBound: any[] = queryPlan.startKeys;\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n lowerBound\r\n );\r\n const upperBound: any[] = queryPlan.endKeys;\r\n const upperBoundString = getStartIndexStringFromUpperBound(\r\n this.schema,\r\n index,\r\n upperBound\r\n );\r\n const indexName = getMemoryIndexName(index);\r\n if (!this.internals.byIndex[indexName]) {\r\n throw newRxError('SNH', { args: { indexName } });\r\n }\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n let indexOfLower = queryPlan.inclusiveStart\r\n ? boundGEByIndexString(docsWithIndex, lowerBoundString)\r\n : boundGTByIndexString(docsWithIndex, lowerBoundString);\r\n\r\n const indexOfUpper = queryPlan.inclusiveEnd\r\n ? boundLEByIndexString(docsWithIndex, upperBoundString)\r\n : boundLTByIndexString(docsWithIndex, upperBoundString);\r\n\r\n let count = 0;\r\n while (indexOfLower <= indexOfUpper) {\r\n const currentRow = docsWithIndex[indexOfLower];\r\n if (!currentRow) {\r\n break;\r\n }\r\n if (queryMatcher(currentRow[1])) {\r\n count++;\r\n }\r\n indexOfLower++;\r\n }\r\n\r\n return Promise.resolve({\r\n count,\r\n mode: 'fast' as const\r\n });\r\n }\r\n\r\n cleanup(minimumDeletedTime: number): Promise<boolean> {\r\n this.ensurePersistence();\r\n const maxDeletionTime = now() - minimumDeletedTime;\r\n const index = ['_deleted', '_meta.lwt', this.primaryPath as any];\r\n const indexName = getMemoryIndexName(index);\r\n const docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;\r\n\r\n const lowerBoundString = getStartIndexStringFromLowerBound(\r\n this.schema,\r\n index,\r\n [\r\n true,\r\n 0,\r\n ''\r\n ]\r\n );\r\n\r\n let indexOfLower = boundGTByIndexString(\r\n docsWithIndex,\r\n lowerBoundString\r\n );\r\n\r\n let done = false;\r\n while (!done) {\r\n const currentDoc = docsWithIndex[indexOfLower];\r\n if (!currentDoc || currentDoc[1]._meta.lwt > maxDeletionTime) {\r\n done = true;\r\n } else {\r\n removeDocFromState(\r\n this.primaryPath as any,\r\n this.schema,\r\n this.internals,\r\n currentDoc[1]\r\n );\r\n /**\r\n * Do NOT increment indexOfLower after removal.\r\n * removeDocFromState() splices the element out of the array,\r\n * so the next element shifts into the current position.\r\n * Incrementing would skip it.\r\n */\r\n }\r\n }\r\n return PROMISE_RESOLVE_TRUE;\r\n }\r\n\r\n getAttachmentData(\r\n documentId: string,\r\n attachmentId: string,\r\n digest: string\r\n ): Promise<Blob> {\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n const key = attachmentMapKey(documentId, attachmentId);\r\n const data = this.internals.attachments.get(key);\r\n\r\n if (\r\n !digest ||\r\n !data ||\r\n data.digest !== digest\r\n ) {\r\n throw new Error('attachment does not exist: ' + key);\r\n }\r\n return Promise.resolve(data.writeData.data);\r\n }\r\n\r\n changeStream(): Observable<EventBulk<RxStorageChangeEvent<RxDocumentData<RxDocType>>, RxStorageDefaultCheckpoint>> {\r\n ensureNotRemoved(this);\r\n return this.internals.changes$.asObservable();\r\n }\r\n\r\n async remove(): Promise<void> {\r\n if (this.closed) {\r\n throw new Error('closed');\r\n }\r\n this.ensurePersistence();\r\n ensureNotRemoved(this);\r\n\r\n this.internals.removed = true;\r\n this.storage.collectionStates.delete(\r\n getMemoryCollectionKey(\r\n this.databaseName,\r\n this.collectionName,\r\n this.schema.version\r\n )\r\n );\r\n await this.close();\r\n }\r\n\r\n close(): Promise<void> {\r\n OPEN_MEMORY_INSTANCES.delete(this);\r\n\r\n this.ensurePersistence();\r\n if (this.closed) {\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n this.closed = true;\r\n\r\n this.internals.refCount = this.internals.refCount - 1;\r\n return PROMISE_RESOLVE_VOID;\r\n }\r\n}\r\n\r\nexport function createMemoryStorageInstance<RxDocType>(\r\n storage: RxStorageMemory,\r\n params: RxStorageInstanceCreationParams<RxDocType, RxStorageMemoryInstanceCreationOptions>,\r\n settings: RxStorageMemorySettings\r\n): Promise<RxStorageInstanceMemory<RxDocType>> {\r\n const collectionKey = getMemoryCollectionKey(\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema.version\r\n );\r\n\r\n let internals = storage.collectionStates.get(collectionKey);\r\n if (!internals) {\r\n internals = {\r\n id: randomToken(5),\r\n schema: params.schema,\r\n removed: false,\r\n refCount: 1,\r\n documents: new Map(),\r\n attachments: params.schema.attachments ? new Map() : undefined as any,\r\n byIndex: {},\r\n byIndexArray: [],\r\n changes$: new Subject()\r\n };\r\n addIndexesToInternalsState(internals, params.schema);\r\n storage.collectionStates.set(collectionKey, internals);\r\n } else {\r\n /**\r\n * Ensure that the storage was not already\r\n * created with a different schema.\r\n * This is very important because if this check\r\n * does not exist here, we have hard-to-debug problems\r\n * downstream.\r\n */\r\n if (\r\n params.devMode &&\r\n !deepEqual(internals.schema, params.schema)\r\n ) {\r\n throw new Error('storage was already created with a different schema');\r\n }\r\n internals.refCount = internals.refCount + 1;\r\n }\r\n\r\n const instance = new RxStorageInstanceMemory(\r\n storage,\r\n params.databaseName,\r\n params.collectionName,\r\n params.schema,\r\n internals,\r\n params.options,\r\n settings,\r\n params.devMode\r\n );\r\n return Promise.resolve(instance);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.RX_STORAGE_NAME_MONGODB = exports.MONGO_OPTIONS_DRIVER_INFO = exports.MONGO_ID_SUBSTITUTE_FIELDNAME = void 0;
|
|
6
|
+
exports.RX_STORAGE_NAME_MONGODB = exports.MONGO_OPTIONS_DRIVER_INFO = exports.MONGO_ID_SUBSTITUTE_FIELDNAME = exports.MONGO_CLIENT_CACHE = void 0;
|
|
7
|
+
exports.closeMongoDBClient = closeMongoDBClient;
|
|
8
|
+
exports.getMongoDBClient = getMongoDBClient;
|
|
7
9
|
exports.getMongoDBIndexName = getMongoDBIndexName;
|
|
8
10
|
exports.prepareMongoDBQuery = prepareMongoDBQuery;
|
|
9
11
|
exports.primarySwapMongoDBQuerySelector = primarySwapMongoDBQuerySelector;
|
|
10
12
|
exports.swapMongoToRxDoc = swapMongoToRxDoc;
|
|
11
13
|
exports.swapRxDocToMongo = swapRxDocToMongo;
|
|
12
14
|
exports.swapToMongoSort = swapToMongoSort;
|
|
15
|
+
var _mongodb = require("mongodb");
|
|
13
16
|
var _index = require("../utils/index.js");
|
|
14
17
|
var _rxSchemaHelper = require("../../rx-schema-helper.js");
|
|
15
18
|
var RX_STORAGE_NAME_MONGODB = exports.RX_STORAGE_NAME_MONGODB = 'mongodb';
|
|
@@ -94,4 +97,42 @@ function swapToMongoSort(sort) {
|
|
|
94
97
|
function getMongoDBIndexName(index) {
|
|
95
98
|
return index.join('|');
|
|
96
99
|
}
|
|
100
|
+
var MONGO_CLIENT_CACHE = exports.MONGO_CLIENT_CACHE = new Map();
|
|
101
|
+
async function getMongoDBClient(connection) {
|
|
102
|
+
var cached = MONGO_CLIENT_CACHE.get(connection);
|
|
103
|
+
if (!cached) {
|
|
104
|
+
var client = new _mongodb.MongoClient(connection, MONGO_OPTIONS_DRIVER_INFO);
|
|
105
|
+
cached = {
|
|
106
|
+
client,
|
|
107
|
+
refCount: 1,
|
|
108
|
+
promise: client.connect().then(() => client)
|
|
109
|
+
};
|
|
110
|
+
MONGO_CLIENT_CACHE.set(connection, cached);
|
|
111
|
+
return cached.promise;
|
|
112
|
+
}
|
|
113
|
+
cached.refCount++;
|
|
114
|
+
if (cached.closeTimeout) {
|
|
115
|
+
clearTimeout(cached.closeTimeout);
|
|
116
|
+
cached.closeTimeout = undefined;
|
|
117
|
+
}
|
|
118
|
+
return cached.promise;
|
|
119
|
+
}
|
|
120
|
+
async function closeMongoDBClient(connection) {
|
|
121
|
+
var cached = MONGO_CLIENT_CACHE.get(connection);
|
|
122
|
+
if (cached) {
|
|
123
|
+
cached.refCount--;
|
|
124
|
+
if (cached.refCount === 0) {
|
|
125
|
+
if (cached.closeTimeout) {
|
|
126
|
+
clearTimeout(cached.closeTimeout);
|
|
127
|
+
}
|
|
128
|
+
cached.closeTimeout = setTimeout(() => {
|
|
129
|
+
var innerCached = MONGO_CLIENT_CACHE.get(connection);
|
|
130
|
+
if (innerCached && innerCached.refCount === 0) {
|
|
131
|
+
MONGO_CLIENT_CACHE.delete(connection);
|
|
132
|
+
innerCached.client.close().catch(() => {});
|
|
133
|
+
}
|
|
134
|
+
}, 2000); // 2 second delay to allow reuse
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
97
138
|
//# sourceMappingURL=mongodb-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-helper.js","names":["_index","require","_rxSchemaHelper","RX_STORAGE_NAME_MONGODB","exports","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","RXDB_VERSION","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","flatClone","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","getPrimaryFieldOfPrimaryKey","preparedQuery","query","mongoSelector","mongoSort","swapToMongoSort","sort","swapMongoToRxDoc","docData","value","swapRxDocToMongo","sortPart","key","direction","mongoKey","mongoDirection","getMongoDBIndexName","index","join"],"sources":["../../../../src/plugins/storage-mongodb/mongodb-helper.ts"],"sourcesContent":["import type {\r\n FilledMangoQuery,\r\n MangoQuerySelector,\r\n MangoQuerySortPart,\r\n RxDocumentData,\r\n RxJsonSchema\r\n} from '../../types/index.d.ts';\r\nimport {\r\n Sort as MongoSort\r\n} from 'mongodb';\r\nimport { RXDB_VERSION, flatClone } from '../utils/index.ts';\r\nimport { MongoDBPreparedQuery, MongoQuerySelector } from './mongodb-types.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nexport const RX_STORAGE_NAME_MONGODB = 'mongodb';\r\n\r\nexport const MONGO_OPTIONS_DRIVER_INFO = {\r\n driverInfo: {\r\n name: 'RxDB',\r\n version: RXDB_VERSION\r\n }\r\n};\r\n\r\n/**\r\n * MongoDB uses the _id field by itself (max 12 bytes)\r\n * so we have to substitute the _id field if\r\n * it is used in the RxDocType.\r\n */\r\nexport const MONGO_ID_SUBSTITUTE_FIELDNAME = '__id';\r\n\r\nexport function primarySwapMongoDBQuerySelector<RxDocType>(\r\n primaryKey: keyof RxDocType,\r\n selector: MangoQuerySelector<RxDocType>\r\n): MongoQuerySelector<RxDocType> {\r\n selector = flatClone(selector);\r\n\r\n if (primaryKey !== '_id') {\r\n return selector as any;\r\n }\r\n if (Array.isArray(selector)) {\r\n return selector.map(item => primarySwapMongoDBQuerySelector(primaryKey, item)) as any;\r\n } else if (typeof selector === 'object') {\r\n const ret: any = {};\r\n Object.entries(selector).forEach(([k, v]) => {\r\n if (k === primaryKey) {\r\n ret._id = v;\r\n } else {\r\n if (k.startsWith('$')) {\r\n ret[k] = primarySwapMongoDBQuerySelector(primaryKey, v as any);\r\n } else {\r\n ret[k] = v;\r\n }\r\n }\r\n });\r\n return ret;\r\n } else {\r\n return selector;\r\n }\r\n}\r\n\r\n\r\nexport function prepareMongoDBQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mutateableQuery: FilledMangoQuery<RxDocType>\r\n) {\r\n const primaryKey = getPrimaryFieldOfPrimaryKey(schema.primaryKey) as any;\r\n const preparedQuery: MongoDBPreparedQuery<RxDocType> = {\r\n query: mutateableQuery,\r\n mongoSelector: primarySwapMongoDBQuerySelector(\r\n primaryKey,\r\n mutateableQuery.selector\r\n ),\r\n mongoSort: swapToMongoSort(mutateableQuery.sort)\r\n };\r\n return preparedQuery;\r\n};\r\n\r\n\r\nexport function swapMongoToRxDoc<RxDocType>(\r\n docData: any\r\n): RxDocumentData<RxDocType> {\r\n docData = flatClone(docData);\r\n if ((docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME]) {\r\n const value = (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n delete (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n (docData as any)._id = value;\r\n } else {\r\n delete (docData as any)._id;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapRxDocToMongo<RxDocType>(\r\n docData: RxDocumentData<RxDocType>\r\n): any {\r\n docData = flatClone(docData);\r\n if ((docData as any)._id) {\r\n const value = (docData as any)._id;\r\n delete (docData as any)._id;\r\n (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME] = value;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapToMongoSort<RxDocType>(\r\n sort: MangoQuerySortPart<RxDocType>[]\r\n): MongoSort {\r\n const ret: any = {};\r\n sort.forEach(sortPart => {\r\n const [key, direction] = Object.entries(sortPart)[0];\r\n const mongoKey = key === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : key;\r\n const mongoDirection = direction === 'asc' ? 1 : -1;\r\n ret[mongoKey] = mongoDirection;\r\n });\r\n return ret;\r\n}\r\n\r\nexport function getMongoDBIndexName(index: string[]): string {\r\n return index.join('|');\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"mongodb-helper.js","names":["_mongodb","require","_index","_rxSchemaHelper","RX_STORAGE_NAME_MONGODB","exports","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","RXDB_VERSION","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","flatClone","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","getPrimaryFieldOfPrimaryKey","preparedQuery","query","mongoSelector","mongoSort","swapToMongoSort","sort","swapMongoToRxDoc","docData","value","swapRxDocToMongo","sortPart","key","direction","mongoKey","mongoDirection","getMongoDBIndexName","index","join","MONGO_CLIENT_CACHE","Map","getMongoDBClient","connection","cached","get","client","MongoClient","refCount","promise","connect","then","set","closeTimeout","clearTimeout","undefined","closeMongoDBClient","setTimeout","innerCached","delete","close","catch"],"sources":["../../../../src/plugins/storage-mongodb/mongodb-helper.ts"],"sourcesContent":["import type {\r\n FilledMangoQuery,\r\n MangoQuerySelector,\r\n MangoQuerySortPart,\r\n RxDocumentData,\r\n RxJsonSchema\r\n} from '../../types/index.d.ts';\r\nimport {\r\n Sort as MongoSort,\r\n MongoClient\r\n} from 'mongodb';\r\nimport { RXDB_VERSION, flatClone } from '../utils/index.ts';\r\nimport { MongoDBPreparedQuery, MongoQuerySelector } from './mongodb-types.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from '../../rx-schema-helper.ts';\r\nexport const RX_STORAGE_NAME_MONGODB = 'mongodb';\r\n\r\nexport const MONGO_OPTIONS_DRIVER_INFO = {\r\n driverInfo: {\r\n name: 'RxDB',\r\n version: RXDB_VERSION\r\n }\r\n};\r\n\r\n/**\r\n * MongoDB uses the _id field by itself (max 12 bytes)\r\n * so we have to substitute the _id field if\r\n * it is used in the RxDocType.\r\n */\r\nexport const MONGO_ID_SUBSTITUTE_FIELDNAME = '__id';\r\n\r\nexport function primarySwapMongoDBQuerySelector<RxDocType>(\r\n primaryKey: keyof RxDocType,\r\n selector: MangoQuerySelector<RxDocType>\r\n): MongoQuerySelector<RxDocType> {\r\n selector = flatClone(selector);\r\n\r\n if (primaryKey !== '_id') {\r\n return selector as any;\r\n }\r\n if (Array.isArray(selector)) {\r\n return selector.map(item => primarySwapMongoDBQuerySelector(primaryKey, item)) as any;\r\n } else if (typeof selector === 'object') {\r\n const ret: any = {};\r\n Object.entries(selector).forEach(([k, v]) => {\r\n if (k === primaryKey) {\r\n ret._id = v;\r\n } else {\r\n if (k.startsWith('$')) {\r\n ret[k] = primarySwapMongoDBQuerySelector(primaryKey, v as any);\r\n } else {\r\n ret[k] = v;\r\n }\r\n }\r\n });\r\n return ret;\r\n } else {\r\n return selector;\r\n }\r\n}\r\n\r\n\r\nexport function prepareMongoDBQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mutateableQuery: FilledMangoQuery<RxDocType>\r\n) {\r\n const primaryKey = getPrimaryFieldOfPrimaryKey(schema.primaryKey) as any;\r\n const preparedQuery: MongoDBPreparedQuery<RxDocType> = {\r\n query: mutateableQuery,\r\n mongoSelector: primarySwapMongoDBQuerySelector(\r\n primaryKey,\r\n mutateableQuery.selector\r\n ),\r\n mongoSort: swapToMongoSort(mutateableQuery.sort)\r\n };\r\n return preparedQuery;\r\n};\r\n\r\n\r\nexport function swapMongoToRxDoc<RxDocType>(\r\n docData: any\r\n): RxDocumentData<RxDocType> {\r\n docData = flatClone(docData);\r\n if ((docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME]) {\r\n const value = (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n delete (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME];\r\n (docData as any)._id = value;\r\n } else {\r\n delete (docData as any)._id;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapRxDocToMongo<RxDocType>(\r\n docData: RxDocumentData<RxDocType>\r\n): any {\r\n docData = flatClone(docData);\r\n if ((docData as any)._id) {\r\n const value = (docData as any)._id;\r\n delete (docData as any)._id;\r\n (docData as any)[MONGO_ID_SUBSTITUTE_FIELDNAME] = value;\r\n }\r\n return docData;\r\n}\r\n\r\nexport function swapToMongoSort<RxDocType>(\r\n sort: MangoQuerySortPart<RxDocType>[]\r\n): MongoSort {\r\n const ret: any = {};\r\n sort.forEach(sortPart => {\r\n const [key, direction] = Object.entries(sortPart)[0];\r\n const mongoKey = key === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : key;\r\n const mongoDirection = direction === 'asc' ? 1 : -1;\r\n ret[mongoKey] = mongoDirection;\r\n });\r\n return ret;\r\n}\r\n\r\nexport function getMongoDBIndexName(index: string[]): string {\r\n return index.join('|');\r\n}\r\n\r\nexport const MONGO_CLIENT_CACHE = new Map<string, { client: MongoClient, refCount: number, promise: Promise<MongoClient>, closeTimeout?: ReturnType<typeof setTimeout> }>();\r\n\r\nexport async function getMongoDBClient(connection: string): Promise<MongoClient> {\r\n let cached = MONGO_CLIENT_CACHE.get(connection);\r\n if (!cached) {\r\n const client = new MongoClient(connection, MONGO_OPTIONS_DRIVER_INFO);\r\n cached = {\r\n client,\r\n refCount: 1,\r\n promise: client.connect().then(() => client)\r\n };\r\n MONGO_CLIENT_CACHE.set(connection, cached);\r\n return cached.promise;\r\n }\r\n cached.refCount++;\r\n if (cached.closeTimeout) {\r\n clearTimeout(cached.closeTimeout);\r\n cached.closeTimeout = undefined;\r\n }\r\n return cached.promise;\r\n}\r\n\r\nexport async function closeMongoDBClient(connection: string): Promise<void> {\r\n const cached = MONGO_CLIENT_CACHE.get(connection);\r\n if (cached) {\r\n cached.refCount--;\r\n if (cached.refCount === 0) {\r\n if (cached.closeTimeout) {\r\n clearTimeout(cached.closeTimeout);\r\n }\r\n cached.closeTimeout = setTimeout(() => {\r\n const innerCached = MONGO_CLIENT_CACHE.get(connection);\r\n if (innerCached && innerCached.refCount === 0) {\r\n MONGO_CLIENT_CACHE.delete(connection);\r\n innerCached.client.close().catch(() => { });\r\n }\r\n }, 2000); // 2 second delay to allow reuse\r\n }\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,7 +10,6 @@ var _readOnlyError2 = _interopRequireDefault(require("@babel/runtime/helpers/rea
|
|
|
10
10
|
var _rxjs = require("rxjs");
|
|
11
11
|
var _rxSchemaHelper = require("../../rx-schema-helper.js");
|
|
12
12
|
var _index = require("../../plugins/utils/index.js");
|
|
13
|
-
var _mongodb = require("mongodb");
|
|
14
13
|
var _rxStorageHelper = require("../../rx-storage-helper.js");
|
|
15
14
|
var _mongodbHelper = require("./mongodb-helper.js");
|
|
16
15
|
var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/function () {
|
|
@@ -29,7 +28,7 @@ var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/f
|
|
|
29
28
|
* to RxDB
|
|
30
29
|
*/
|
|
31
30
|
|
|
32
|
-
function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings) {
|
|
31
|
+
function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings, mongoClient) {
|
|
33
32
|
this.changes$ = new _rxjs.Subject();
|
|
34
33
|
this.runningOperations = new _rxjs.BehaviorSubject(0);
|
|
35
34
|
this.writeQueue = _index.PROMISE_RESOLVE_VOID;
|
|
@@ -41,12 +40,12 @@ var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/f
|
|
|
41
40
|
this.internals = internals;
|
|
42
41
|
this.options = options;
|
|
43
42
|
this.settings = settings;
|
|
43
|
+
this.mongoClient = mongoClient;
|
|
44
44
|
if (this.schema.attachments) {
|
|
45
45
|
throw new Error('attachments not supported in mongodb storage, make a PR if you need that');
|
|
46
46
|
}
|
|
47
47
|
this.primaryPath = (0, _rxSchemaHelper.getPrimaryFieldOfPrimaryKey)(this.schema.primaryKey);
|
|
48
48
|
this.inMongoPrimaryPath = this.primaryPath === '_id' ? _mongodbHelper.MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;
|
|
49
|
-
this.mongoClient = new _mongodb.MongoClient(storage.databaseSettings.connection, _mongodbHelper.MONGO_OPTIONS_DRIVER_INFO);
|
|
50
49
|
this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);
|
|
51
50
|
var indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {
|
|
52
51
|
var arIndex = (0, _index.isMaybeReadonlyArray)(index) ? index.slice(0) : [index];
|
|
@@ -311,14 +310,15 @@ var RxStorageInstanceMongoDB = exports.RxStorageInstanceMongoDB = /*#__PURE__*/f
|
|
|
311
310
|
await this.mongoCollectionPromise;
|
|
312
311
|
await (0, _rxjs.firstValueFrom)(this.runningOperations.pipe((0, _rxjs.filter)(c => c === 0)));
|
|
313
312
|
// await ensureNotFalsy(this.mongoChangeStream).close();
|
|
314
|
-
await this.
|
|
313
|
+
await (0, _mongodbHelper.closeMongoDBClient)(this.storage.databaseSettings.connection);
|
|
315
314
|
})();
|
|
316
315
|
return this.closed;
|
|
317
316
|
};
|
|
318
317
|
return RxStorageInstanceMongoDB;
|
|
319
318
|
}();
|
|
320
|
-
function createMongoDBStorageInstance(storage, params, settings) {
|
|
321
|
-
var
|
|
322
|
-
|
|
319
|
+
async function createMongoDBStorageInstance(storage, params, settings) {
|
|
320
|
+
var mongoClient = await (0, _mongodbHelper.getMongoDBClient)(storage.databaseSettings.connection);
|
|
321
|
+
var instance = new RxStorageInstanceMongoDB(storage, params.databaseName, params.collectionName, params.schema, {}, params.options, settings, mongoClient);
|
|
322
|
+
return instance;
|
|
323
323
|
}
|
|
324
324
|
//# sourceMappingURL=rx-storage-instance-mongodb.js.map
|