@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
|
@@ -4,8 +4,8 @@ import { getStartIndexStringFromLowerBound, getStartIndexStringFromUpperBound }
|
|
|
4
4
|
import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js";
|
|
5
5
|
import { categorizeBulkWriteRows } from "../../rx-storage-helper.js";
|
|
6
6
|
import { deepEqual, ensureNotFalsy, now, PROMISE_RESOLVE_TRUE, PROMISE_RESOLVE_VOID, randomToken, requestIdlePromiseNoQueue } from "../../plugins/utils/index.js";
|
|
7
|
-
import {
|
|
8
|
-
import { attachmentMapKey, bulkInsertToState,
|
|
7
|
+
import { boundGEByIndexString, boundGTByIndexString, boundLEByIndexString, boundLTByIndexString } from "./binary-search-bounds.js";
|
|
8
|
+
import { attachmentMapKey, bulkInsertToState, ensureNotRemoved, getMemoryCollectionKey, putWriteRowToState, removeDocFromState } from "./memory-helper.js";
|
|
9
9
|
import { addIndexesToInternalsState, getMemoryIndexName } from "./memory-indexes.js";
|
|
10
10
|
import { getQueryMatcher, getSortComparator } from "../../rx-query-helper.js";
|
|
11
11
|
import { newRxError } from "../../rx-error.js";
|
|
@@ -92,15 +92,15 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
92
92
|
return;
|
|
93
93
|
}
|
|
94
94
|
var internals = this.internals;
|
|
95
|
-
var documentsById = this.internals.documents;
|
|
96
95
|
var primaryPath = this.primaryPath;
|
|
97
96
|
var categorized = this.internals.ensurePersistenceTask;
|
|
98
97
|
this.internals.ensurePersistenceTask = undefined;
|
|
99
98
|
|
|
100
99
|
/**
|
|
101
100
|
* Do inserts/updates
|
|
101
|
+
* @performance Use cached byIndexArray instead of Object.values()
|
|
102
102
|
*/
|
|
103
|
-
var stateByIndex =
|
|
103
|
+
var stateByIndex = internals.byIndexArray;
|
|
104
104
|
|
|
105
105
|
/**
|
|
106
106
|
* @performance Use batch insert for bulk inserts to avoid
|
|
@@ -117,7 +117,14 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
117
117
|
var writeRow = bulkUpdateDocs[i];
|
|
118
118
|
var doc = writeRow.document;
|
|
119
119
|
var docId = doc[primaryPath];
|
|
120
|
-
|
|
120
|
+
/**
|
|
121
|
+
* @performance
|
|
122
|
+
* Pass writeRow.previous directly as the old document state
|
|
123
|
+
* instead of re-looking it up from the documents Map.
|
|
124
|
+
* This is safe because categorizeBulkWriteRows already verified
|
|
125
|
+
* that previous._rev matches the document in the Map (conflict check).
|
|
126
|
+
*/
|
|
127
|
+
putWriteRowToState(docId, internals, stateByIndex, doc, writeRow.previous);
|
|
121
128
|
}
|
|
122
129
|
|
|
123
130
|
/**
|
|
@@ -151,11 +158,23 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
151
158
|
if (documentsById.size === 0) {
|
|
152
159
|
return Promise.resolve(ret);
|
|
153
160
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
161
|
+
/**
|
|
162
|
+
* @performance
|
|
163
|
+
* Split into two paths to avoid checking withDeleted on every iteration.
|
|
164
|
+
*/
|
|
165
|
+
if (withDeleted) {
|
|
166
|
+
for (var i = 0; i < docIds.length; ++i) {
|
|
167
|
+
var docInDb = documentsById.get(docIds[i]);
|
|
168
|
+
if (docInDb) {
|
|
169
|
+
ret.push(docInDb);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
} else {
|
|
173
|
+
for (var _i = 0; _i < docIds.length; ++_i) {
|
|
174
|
+
var _docInDb = documentsById.get(docIds[_i]);
|
|
175
|
+
if (_docInDb && !_docInDb._deleted) {
|
|
176
|
+
ret.push(_docInDb);
|
|
177
|
+
}
|
|
159
178
|
}
|
|
160
179
|
}
|
|
161
180
|
return Promise.resolve(ret);
|
|
@@ -183,8 +202,13 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
183
202
|
throw new Error('index does not exist ' + indexName);
|
|
184
203
|
}
|
|
185
204
|
var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
|
|
186
|
-
|
|
187
|
-
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* @performance Use string-specialized binary search to avoid
|
|
208
|
+
* temporary array allocations on every query.
|
|
209
|
+
*/
|
|
210
|
+
var indexOfLower = queryPlan.inclusiveStart ? boundGEByIndexString(docsWithIndex, lowerBoundString) : boundGTByIndexString(docsWithIndex, lowerBoundString);
|
|
211
|
+
var indexOfUpper = queryPlan.inclusiveEnd ? boundLEByIndexString(docsWithIndex, upperBoundString) : boundLTByIndexString(docsWithIndex, upperBoundString);
|
|
188
212
|
var rows = [];
|
|
189
213
|
|
|
190
214
|
/**
|
|
@@ -243,35 +267,65 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
243
267
|
* If the selector is satisfied by the index,
|
|
244
268
|
* we can compute the count directly from the index range
|
|
245
269
|
* without extracting document data into an array.
|
|
270
|
+
* Uses string-specialized binary search to avoid allocations.
|
|
246
271
|
*/
|
|
247
272
|
if (queryPlan.selectorSatisfiedByIndex) {
|
|
248
|
-
var
|
|
249
|
-
var
|
|
250
|
-
var
|
|
251
|
-
var
|
|
252
|
-
var
|
|
253
|
-
var
|
|
254
|
-
var
|
|
255
|
-
if (!this.internals.byIndex[
|
|
273
|
+
var _queryPlanFields = queryPlan.index;
|
|
274
|
+
var _index = _queryPlanFields;
|
|
275
|
+
var _lowerBound = queryPlan.startKeys;
|
|
276
|
+
var _lowerBoundString = getStartIndexStringFromLowerBound(this.schema, _index, _lowerBound);
|
|
277
|
+
var _upperBound = queryPlan.endKeys;
|
|
278
|
+
var _upperBoundString = getStartIndexStringFromUpperBound(this.schema, _index, _upperBound);
|
|
279
|
+
var _indexName = getMemoryIndexName(_index);
|
|
280
|
+
if (!this.internals.byIndex[_indexName]) {
|
|
256
281
|
throw newRxError('SNH', {
|
|
257
282
|
args: {
|
|
258
|
-
indexName
|
|
283
|
+
indexName: _indexName
|
|
259
284
|
}
|
|
260
285
|
});
|
|
261
286
|
}
|
|
262
|
-
var
|
|
263
|
-
var
|
|
264
|
-
var
|
|
265
|
-
var _count = Math.max(0,
|
|
287
|
+
var _docsWithIndex = this.internals.byIndex[_indexName].docsWithIndex;
|
|
288
|
+
var _indexOfLower = queryPlan.inclusiveStart ? boundGEByIndexString(_docsWithIndex, _lowerBoundString) : boundGTByIndexString(_docsWithIndex, _lowerBoundString);
|
|
289
|
+
var _indexOfUpper = queryPlan.inclusiveEnd ? boundLEByIndexString(_docsWithIndex, _upperBoundString) : boundLTByIndexString(_docsWithIndex, _upperBoundString);
|
|
290
|
+
var _count = Math.max(0, _indexOfUpper - _indexOfLower + 1);
|
|
266
291
|
return Promise.resolve({
|
|
267
292
|
count: _count,
|
|
268
293
|
mode: 'fast'
|
|
269
294
|
});
|
|
270
295
|
}
|
|
271
|
-
|
|
272
|
-
|
|
296
|
+
var queryMatcher = getQueryMatcher(this.schema, preparedQuery.query);
|
|
297
|
+
var queryPlanFields = queryPlan.index;
|
|
298
|
+
var index = queryPlanFields;
|
|
299
|
+
var lowerBound = queryPlan.startKeys;
|
|
300
|
+
var lowerBoundString = getStartIndexStringFromLowerBound(this.schema, index, lowerBound);
|
|
301
|
+
var upperBound = queryPlan.endKeys;
|
|
302
|
+
var upperBoundString = getStartIndexStringFromUpperBound(this.schema, index, upperBound);
|
|
303
|
+
var indexName = getMemoryIndexName(index);
|
|
304
|
+
if (!this.internals.byIndex[indexName]) {
|
|
305
|
+
throw newRxError('SNH', {
|
|
306
|
+
args: {
|
|
307
|
+
indexName
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
|
|
312
|
+
var indexOfLower = queryPlan.inclusiveStart ? boundGEByIndexString(docsWithIndex, lowerBoundString) : boundGTByIndexString(docsWithIndex, lowerBoundString);
|
|
313
|
+
var indexOfUpper = queryPlan.inclusiveEnd ? boundLEByIndexString(docsWithIndex, upperBoundString) : boundLTByIndexString(docsWithIndex, upperBoundString);
|
|
314
|
+
var count = 0;
|
|
315
|
+
while (indexOfLower <= indexOfUpper) {
|
|
316
|
+
var currentRow = docsWithIndex[indexOfLower];
|
|
317
|
+
if (!currentRow) {
|
|
318
|
+
break;
|
|
319
|
+
}
|
|
320
|
+
if (queryMatcher(currentRow[1])) {
|
|
321
|
+
count++;
|
|
322
|
+
}
|
|
323
|
+
indexOfLower++;
|
|
324
|
+
}
|
|
325
|
+
return Promise.resolve({
|
|
326
|
+
count,
|
|
273
327
|
mode: 'fast'
|
|
274
|
-
})
|
|
328
|
+
});
|
|
275
329
|
};
|
|
276
330
|
_proto.cleanup = function cleanup(minimumDeletedTime) {
|
|
277
331
|
this.ensurePersistence();
|
|
@@ -280,7 +334,7 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
280
334
|
var indexName = getMemoryIndexName(index);
|
|
281
335
|
var docsWithIndex = this.internals.byIndex[indexName].docsWithIndex;
|
|
282
336
|
var lowerBoundString = getStartIndexStringFromLowerBound(this.schema, index, [true, 0, '']);
|
|
283
|
-
var indexOfLower =
|
|
337
|
+
var indexOfLower = boundGTByIndexString(docsWithIndex, lowerBoundString);
|
|
284
338
|
var done = false;
|
|
285
339
|
while (!done) {
|
|
286
340
|
var currentDoc = docsWithIndex[indexOfLower];
|
|
@@ -288,7 +342,12 @@ export var RxStorageInstanceMemory = /*#__PURE__*/function () {
|
|
|
288
342
|
done = true;
|
|
289
343
|
} else {
|
|
290
344
|
removeDocFromState(this.primaryPath, this.schema, this.internals, currentDoc[1]);
|
|
291
|
-
|
|
345
|
+
/**
|
|
346
|
+
* Do NOT increment indexOfLower after removal.
|
|
347
|
+
* removeDocFromState() splices the element out of the array,
|
|
348
|
+
* so the next element shifts into the current position.
|
|
349
|
+
* Incrementing would skip it.
|
|
350
|
+
*/
|
|
292
351
|
}
|
|
293
352
|
}
|
|
294
353
|
return PROMISE_RESOLVE_TRUE;
|
|
@@ -341,6 +400,7 @@ export function createMemoryStorageInstance(storage, params, settings) {
|
|
|
341
400
|
documents: new Map(),
|
|
342
401
|
attachments: params.schema.attachments ? new Map() : undefined,
|
|
343
402
|
byIndex: {},
|
|
403
|
+
byIndexArray: [],
|
|
344
404
|
changes$: new Subject()
|
|
345
405
|
};
|
|
346
406
|
addIndexesToInternalsState(internals, params.schema);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rx-storage-instance-memory.js","names":["Subject","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","deepEqual","ensureNotFalsy","now","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","randomToken","requestIdlePromiseNoQueue","boundGE","boundGT","boundLE","boundLT","attachmentMapKey","bulkInsertToState","compareDocsWithIndex","ensureNotRemoved","getMemoryCollectionKey","putWriteRowToState","removeDocFromState","addIndexesToInternalsState","getMemoryIndexName","getQueryMatcher","getSortComparator","newRxError","OPEN_MEMORY_INSTANCES","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","documentsById","documents","categorized","error","errors","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","then","undefined","eventBulk","events","length","lastState","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","Object","values","byIndex","bulkInsertDocs","bulkUpdateDocs","i","writeRow","doc","docId","get","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","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","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","upperBound","endKeys","upperBoundString","indexName","Error","docsWithIndex","indexOfLower","inclusiveStart","indexOfUpper","inclusiveEnd","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","sort","slice","count","args","max","mode","result","cleanup","minimumDeletedTime","maxDeletionTime","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","version","close","refCount","createMemoryStorageInstance","params","collectionKey","Map","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":["Subject","getStartIndexStringFromLowerBound","getStartIndexStringFromUpperBound","getPrimaryFieldOfPrimaryKey","categorizeBulkWriteRows","deepEqual","ensureNotFalsy","now","PROMISE_RESOLVE_TRUE","PROMISE_RESOLVE_VOID","randomToken","requestIdlePromiseNoQueue","boundGEByIndexString","boundGTByIndexString","boundLEByIndexString","boundLTByIndexString","attachmentMapKey","bulkInsertToState","ensureNotRemoved","getMemoryCollectionKey","putWriteRowToState","removeDocFromState","addIndexesToInternalsState","getMemoryIndexName","getQueryMatcher","getSortComparator","newRxError","OPEN_MEMORY_INSTANCES","Set","RxStorageInstanceMemory","storage","databaseName","collectionName","schema","internals","options","settings","devMode","closed","categorizedByWriteInput","WeakMap","add","primaryPath","primaryKey","_proto","prototype","bulkWrite","documentWrites","context","ensurePersistence","documentsById","documents","categorized","error","errors","awaitMe","Promise","resolve","set","ensurePersistenceTask","ensurePersistenceIdlePromise","then","undefined","eventBulk","events","length","lastState","newestRow","document","checkpoint","id","lwt","_meta","changes$","next","stateByIndex","byIndexArray","bulkInsertDocs","bulkUpdateDocs","i","writeRow","doc","docId","previous","attachments","attachmentsMap","attachmentsAdd","forEach","attachment","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","queryPlanFields","index","mustManuallyResort","sortSatisfiedByIndex","lowerBound","startKeys","lowerBoundString","upperBound","endKeys","upperBoundString","indexName","byIndex","Error","docsWithIndex","indexOfLower","inclusiveStart","indexOfUpper","inclusiveEnd","rows","rangeLength","extractLength","Math","min","Array","done","currentRow","currentDoc","sortComparator","sort","slice","count","args","max","mode","cleanup","minimumDeletedTime","maxDeletionTime","getAttachmentData","key","data","changeStream","asObservable","remove","removed","collectionStates","version","close","refCount","createMemoryStorageInstance","params","collectionKey","Map","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":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MongoClient } from 'mongodb';
|
|
1
2
|
import { RXDB_VERSION, flatClone } from "../utils/index.js";
|
|
2
3
|
import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js";
|
|
3
4
|
export var RX_STORAGE_NAME_MONGODB = 'mongodb';
|
|
@@ -82,4 +83,42 @@ export function swapToMongoSort(sort) {
|
|
|
82
83
|
export function getMongoDBIndexName(index) {
|
|
83
84
|
return index.join('|');
|
|
84
85
|
}
|
|
86
|
+
export var MONGO_CLIENT_CACHE = new Map();
|
|
87
|
+
export async function getMongoDBClient(connection) {
|
|
88
|
+
var cached = MONGO_CLIENT_CACHE.get(connection);
|
|
89
|
+
if (!cached) {
|
|
90
|
+
var client = new MongoClient(connection, MONGO_OPTIONS_DRIVER_INFO);
|
|
91
|
+
cached = {
|
|
92
|
+
client,
|
|
93
|
+
refCount: 1,
|
|
94
|
+
promise: client.connect().then(() => client)
|
|
95
|
+
};
|
|
96
|
+
MONGO_CLIENT_CACHE.set(connection, cached);
|
|
97
|
+
return cached.promise;
|
|
98
|
+
}
|
|
99
|
+
cached.refCount++;
|
|
100
|
+
if (cached.closeTimeout) {
|
|
101
|
+
clearTimeout(cached.closeTimeout);
|
|
102
|
+
cached.closeTimeout = undefined;
|
|
103
|
+
}
|
|
104
|
+
return cached.promise;
|
|
105
|
+
}
|
|
106
|
+
export async function closeMongoDBClient(connection) {
|
|
107
|
+
var cached = MONGO_CLIENT_CACHE.get(connection);
|
|
108
|
+
if (cached) {
|
|
109
|
+
cached.refCount--;
|
|
110
|
+
if (cached.refCount === 0) {
|
|
111
|
+
if (cached.closeTimeout) {
|
|
112
|
+
clearTimeout(cached.closeTimeout);
|
|
113
|
+
}
|
|
114
|
+
cached.closeTimeout = setTimeout(() => {
|
|
115
|
+
var innerCached = MONGO_CLIENT_CACHE.get(connection);
|
|
116
|
+
if (innerCached && innerCached.refCount === 0) {
|
|
117
|
+
MONGO_CLIENT_CACHE.delete(connection);
|
|
118
|
+
innerCached.client.close().catch(() => {});
|
|
119
|
+
}
|
|
120
|
+
}, 2000); // 2 second delay to allow reuse
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
85
124
|
//# sourceMappingURL=mongodb-helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongodb-helper.js","names":["RXDB_VERSION","flatClone","getPrimaryFieldOfPrimaryKey","RX_STORAGE_NAME_MONGODB","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","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":["MongoClient","RXDB_VERSION","flatClone","getPrimaryFieldOfPrimaryKey","RX_STORAGE_NAME_MONGODB","MONGO_OPTIONS_DRIVER_INFO","driverInfo","name","version","MONGO_ID_SUBSTITUTE_FIELDNAME","primarySwapMongoDBQuerySelector","primaryKey","selector","Array","isArray","map","item","ret","Object","entries","forEach","k","v","_id","startsWith","prepareMongoDBQuery","schema","mutateableQuery","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","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":"AAOA,SAEIA,WAAW,QACR,SAAS;AAChB,SAASC,YAAY,EAAEC,SAAS,QAAQ,mBAAmB;AAE3D,SAASC,2BAA2B,QAAQ,2BAA2B;AACvE,OAAO,IAAMC,uBAAuB,GAAG,SAAS;AAEhD,OAAO,IAAMC,yBAAyB,GAAG;EACrCC,UAAU,EAAE;IACRC,IAAI,EAAE,MAAM;IACZC,OAAO,EAAEP;EACb;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,OAAO,IAAMQ,6BAA6B,GAAG,MAAM;AAEnD,OAAO,SAASC,+BAA+BA,CAC3CC,UAA2B,EAC3BC,QAAuC,EACV;EAC7BA,QAAQ,GAAGV,SAAS,CAACU,QAAQ,CAAC;EAE9B,IAAID,UAAU,KAAK,KAAK,EAAE;IACtB,OAAOC,QAAQ;EACnB;EACA,IAAIC,KAAK,CAACC,OAAO,CAACF,QAAQ,CAAC,EAAE;IACzB,OAAOA,QAAQ,CAACG,GAAG,CAACC,IAAI,IAAIN,+BAA+B,CAACC,UAAU,EAAEK,IAAI,CAAC,CAAC;EAClF,CAAC,MAAM,IAAI,OAAOJ,QAAQ,KAAK,QAAQ,EAAE;IACrC,IAAMK,GAAQ,GAAG,CAAC,CAAC;IACnBC,MAAM,CAACC,OAAO,CAACP,QAAQ,CAAC,CAACQ,OAAO,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAK;MACzC,IAAID,CAAC,KAAKV,UAAU,EAAE;QAClBM,GAAG,CAACM,GAAG,GAAGD,CAAC;MACf,CAAC,MAAM;QACH,IAAID,CAAC,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;UACnBP,GAAG,CAACI,CAAC,CAAC,GAAGX,+BAA+B,CAACC,UAAU,EAAEW,CAAQ,CAAC;QAClE,CAAC,MAAM;UACHL,GAAG,CAACI,CAAC,CAAC,GAAGC,CAAC;QACd;MACJ;IACJ,CAAC,CAAC;IACF,OAAOL,GAAG;EACd,CAAC,MAAM;IACH,OAAOL,QAAQ;EACnB;AACJ;AAGA,OAAO,SAASa,mBAAmBA,CAC/BC,MAA+C,EAC/CC,eAA4C,EAC9C;EACE,IAAMhB,UAAU,GAAGR,2BAA2B,CAACuB,MAAM,CAACf,UAAU,CAAQ;EACxE,IAAMiB,aAA8C,GAAG;IACnDC,KAAK,EAAEF,eAAe;IACtBG,aAAa,EAAEpB,+BAA+B,CAC1CC,UAAU,EACVgB,eAAe,CAACf,QACpB,CAAC;IACDmB,SAAS,EAAEC,eAAe,CAACL,eAAe,CAACM,IAAI;EACnD,CAAC;EACD,OAAOL,aAAa;AACxB;AAAC;AAGD,OAAO,SAASM,gBAAgBA,CAC5BC,OAAY,EACa;EACzBA,OAAO,GAAGjC,SAAS,CAACiC,OAAO,CAAC;EAC5B,IAAKA,OAAO,CAAS1B,6BAA6B,CAAC,EAAE;IACjD,IAAM2B,KAAK,GAAID,OAAO,CAAS1B,6BAA6B,CAAC;IAC7D,OAAQ0B,OAAO,CAAS1B,6BAA6B,CAAC;IACrD0B,OAAO,CAASZ,GAAG,GAAGa,KAAK;EAChC,CAAC,MAAM;IACH,OAAQD,OAAO,CAASZ,GAAG;EAC/B;EACA,OAAOY,OAAO;AAClB;AAEA,OAAO,SAASE,gBAAgBA,CAC5BF,OAAkC,EAC/B;EACHA,OAAO,GAAGjC,SAAS,CAACiC,OAAO,CAAC;EAC5B,IAAKA,OAAO,CAASZ,GAAG,EAAE;IACtB,IAAMa,KAAK,GAAID,OAAO,CAASZ,GAAG;IAClC,OAAQY,OAAO,CAASZ,GAAG;IAC1BY,OAAO,CAAS1B,6BAA6B,CAAC,GAAG2B,KAAK;EAC3D;EACA,OAAOD,OAAO;AAClB;AAEA,OAAO,SAASH,eAAeA,CAC3BC,IAAqC,EAC5B;EACT,IAAMhB,GAAQ,GAAG,CAAC,CAAC;EACnBgB,IAAI,CAACb,OAAO,CAACkB,QAAQ,IAAI;IACrB,IAAM,CAACC,GAAG,EAAEC,SAAS,CAAC,GAAGtB,MAAM,CAACC,OAAO,CAACmB,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,IAAMG,QAAQ,GAAGF,GAAG,KAAK,KAAK,GAAG9B,6BAA6B,GAAG8B,GAAG;IACpE,IAAMG,cAAc,GAAGF,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IACnDvB,GAAG,CAACwB,QAAQ,CAAC,GAAGC,cAAc;EAClC,CAAC,CAAC;EACF,OAAOzB,GAAG;AACd;AAEA,OAAO,SAAS0B,mBAAmBA,CAACC,KAAe,EAAU;EACzD,OAAOA,KAAK,CAACC,IAAI,CAAC,GAAG,CAAC;AAC1B;AAEA,OAAO,IAAMC,kBAAkB,GAAG,IAAIC,GAAG,CAAiI,CAAC;AAE3K,OAAO,eAAeC,gBAAgBA,CAACC,UAAkB,EAAwB;EAC7E,IAAIC,MAAM,GAAGJ,kBAAkB,CAACK,GAAG,CAACF,UAAU,CAAC;EAC/C,IAAI,CAACC,MAAM,EAAE;IACT,IAAME,MAAM,GAAG,IAAIpD,WAAW,CAACiD,UAAU,EAAE5C,yBAAyB,CAAC;IACrE6C,MAAM,GAAG;MACLE,MAAM;MACNC,QAAQ,EAAE,CAAC;MACXC,OAAO,EAAEF,MAAM,CAACG,OAAO,CAAC,CAAC,CAACC,IAAI,CAAC,MAAMJ,MAAM;IAC/C,CAAC;IACDN,kBAAkB,CAACW,GAAG,CAACR,UAAU,EAAEC,MAAM,CAAC;IAC1C,OAAOA,MAAM,CAACI,OAAO;EACzB;EACAJ,MAAM,CAACG,QAAQ,EAAE;EACjB,IAAIH,MAAM,CAACQ,YAAY,EAAE;IACrBC,YAAY,CAACT,MAAM,CAACQ,YAAY,CAAC;IACjCR,MAAM,CAACQ,YAAY,GAAGE,SAAS;EACnC;EACA,OAAOV,MAAM,CAACI,OAAO;AACzB;AAEA,OAAO,eAAeO,kBAAkBA,CAACZ,UAAkB,EAAiB;EACxE,IAAMC,MAAM,GAAGJ,kBAAkB,CAACK,GAAG,CAACF,UAAU,CAAC;EACjD,IAAIC,MAAM,EAAE;IACRA,MAAM,CAACG,QAAQ,EAAE;IACjB,IAAIH,MAAM,CAACG,QAAQ,KAAK,CAAC,EAAE;MACvB,IAAIH,MAAM,CAACQ,YAAY,EAAE;QACrBC,YAAY,CAACT,MAAM,CAACQ,YAAY,CAAC;MACrC;MACAR,MAAM,CAACQ,YAAY,GAAGI,UAAU,CAAC,MAAM;QACnC,IAAMC,WAAW,GAAGjB,kBAAkB,CAACK,GAAG,CAACF,UAAU,CAAC;QACtD,IAAIc,WAAW,IAAIA,WAAW,CAACV,QAAQ,KAAK,CAAC,EAAE;UAC3CP,kBAAkB,CAACkB,MAAM,CAACf,UAAU,CAAC;UACrCc,WAAW,CAACX,MAAM,CAACa,KAAK,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC;QAC/C;MACJ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACd;EACJ;AACJ","ignoreList":[]}
|
|
@@ -2,9 +2,8 @@ import _readOnlyError from "@babel/runtime/helpers/readOnlyError";
|
|
|
2
2
|
import { BehaviorSubject, Subject, filter, firstValueFrom } from 'rxjs';
|
|
3
3
|
import { getPrimaryFieldOfPrimaryKey } from "../../rx-schema-helper.js";
|
|
4
4
|
import { ensureNotFalsy, getFromMapOrThrow, isMaybeReadonlyArray, now, PROMISE_RESOLVE_VOID, requestIdlePromise } from "../../plugins/utils/index.js";
|
|
5
|
-
import { MongoClient } from 'mongodb';
|
|
6
5
|
import { categorizeBulkWriteRows } from "../../rx-storage-helper.js";
|
|
7
|
-
import { MONGO_ID_SUBSTITUTE_FIELDNAME,
|
|
6
|
+
import { MONGO_ID_SUBSTITUTE_FIELDNAME, getMongoDBIndexName, prepareMongoDBQuery, swapMongoToRxDoc, swapRxDocToMongo, getMongoDBClient, closeMongoDBClient } from "./mongodb-helper.js";
|
|
8
7
|
export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
|
|
9
8
|
// public mongoChangeStream?: MongoChangeStream<any, ChangeStreamDocument<any>>;
|
|
10
9
|
|
|
@@ -21,7 +20,7 @@ export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
|
|
|
21
20
|
* to RxDB
|
|
22
21
|
*/
|
|
23
22
|
|
|
24
|
-
function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings) {
|
|
23
|
+
function RxStorageInstanceMongoDB(storage, databaseName, collectionName, schema, internals, options, settings, mongoClient) {
|
|
25
24
|
this.changes$ = new Subject();
|
|
26
25
|
this.runningOperations = new BehaviorSubject(0);
|
|
27
26
|
this.writeQueue = PROMISE_RESOLVE_VOID;
|
|
@@ -33,12 +32,12 @@ export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
|
|
|
33
32
|
this.internals = internals;
|
|
34
33
|
this.options = options;
|
|
35
34
|
this.settings = settings;
|
|
35
|
+
this.mongoClient = mongoClient;
|
|
36
36
|
if (this.schema.attachments) {
|
|
37
37
|
throw new Error('attachments not supported in mongodb storage, make a PR if you need that');
|
|
38
38
|
}
|
|
39
39
|
this.primaryPath = getPrimaryFieldOfPrimaryKey(this.schema.primaryKey);
|
|
40
40
|
this.inMongoPrimaryPath = this.primaryPath === '_id' ? MONGO_ID_SUBSTITUTE_FIELDNAME : this.primaryPath;
|
|
41
|
-
this.mongoClient = new MongoClient(storage.databaseSettings.connection, MONGO_OPTIONS_DRIVER_INFO);
|
|
42
41
|
this.mongoDatabase = this.mongoClient.db(databaseName + '-v' + this.schema.version);
|
|
43
42
|
var indexes = (this.schema.indexes ? this.schema.indexes.slice() : []).map(index => {
|
|
44
43
|
var arIndex = isMaybeReadonlyArray(index) ? index.slice(0) : [index];
|
|
@@ -303,14 +302,15 @@ export var RxStorageInstanceMongoDB = /*#__PURE__*/function () {
|
|
|
303
302
|
await this.mongoCollectionPromise;
|
|
304
303
|
await firstValueFrom(this.runningOperations.pipe(filter(c => c === 0)));
|
|
305
304
|
// await ensureNotFalsy(this.mongoChangeStream).close();
|
|
306
|
-
await this.
|
|
305
|
+
await closeMongoDBClient(this.storage.databaseSettings.connection);
|
|
307
306
|
})();
|
|
308
307
|
return this.closed;
|
|
309
308
|
};
|
|
310
309
|
return RxStorageInstanceMongoDB;
|
|
311
310
|
}();
|
|
312
|
-
export function createMongoDBStorageInstance(storage, params, settings) {
|
|
313
|
-
var
|
|
314
|
-
|
|
311
|
+
export async function createMongoDBStorageInstance(storage, params, settings) {
|
|
312
|
+
var mongoClient = await getMongoDBClient(storage.databaseSettings.connection);
|
|
313
|
+
var instance = new RxStorageInstanceMongoDB(storage, params.databaseName, params.collectionName, params.schema, {}, params.options, settings, mongoClient);
|
|
314
|
+
return instance;
|
|
315
315
|
}
|
|
316
316
|
//# sourceMappingURL=rx-storage-instance-mongodb.js.map
|