@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.1
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 +0 -7
- 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 +5 -23
- 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 +1 -8
- 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 +5 -23
- 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/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/dist/types/types/rx-error.d.ts +3 -0
- package/dist/types/types/rx-schema.d.ts +5 -0
- package/eslint.config.mjs +2 -1
- package/package.json +38 -35
- package/scripts/check-code-block-line-length.js +91 -0
- package/scripts/check-em-dashes.js +53 -0
- package/scripts/copy-path.mjs +20 -0
- package/scripts/docs-fetch-git-history.mjs +36 -0
- package/scripts/fix-types.mjs +15 -8
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rx-pipeline.js","names":["_rxjs","require","_index","_rxStorageHelper","_docCache","_rxDatabaseInternalStore","_flaggedFunctions","RxPipeline","exports","identifier","source","destination","handler","batchSize","processQueue","PROMISE_RESOLVE_VOID","subs","stopped","toRun","lastSourceDocTime","BehaviorSubject","lastProcessedDocTime","somethingChanged","Subject","secretFunctionName","randomToken","waitBeforeWriteFn","stack","Error","includes","awaitIdle","checkpointId","onClose","push","close","awaitBeforeReads","add","eventBulks$","pipe","filter","bulk","isLocal","subscribe","next","events","documentData","_meta","lwt","database","internalStore","changeStream","eventBulk","index","length","event","context","INTERNAL_CONTEXT_PIPELINE_CHECKPOINT","key","data","lastDocTime","_proto","prototype","trigger","_this2","then","done","_loop","checkpointDoc","getCheckpointDoc","checkpoint","undefined","docsSinceResult","getChangedDocumentsSince","storageInstance","lastTime","documents","rxDocuments","mapDocumentsDataToCacheDocs","_this","fnKey","blockFlaggedFunctionKey","FLAGGED_FUNCTIONS","err","error","releaseFlaggedFunctionKey","v","ensureNotFalsy","lastOfArray","closed","setCheckpointDoc","_ret","getValue","firstValueFrom","delete","forEach","s","unsubscribe","remove","insternalStore","newDoc","clone","_deleted","writeResult","bulkWrite","previous","document","pipeline","getPrimaryKeyOfInternalDocument","results","findDocumentsById","result","newCheckpoint","_attachments","now","_rev","createRevision","token","id","addPipeline","options","waitForLeadership","startPromise"],"sources":["../../../../src/plugins/pipeline/rx-pipeline.ts"],"sourcesContent":["import {\r\n BehaviorSubject,\r\n Subject,\r\n Subscription,\r\n filter,\r\n firstValueFrom,\r\n race\r\n} from 'rxjs';\r\nimport type {\r\n EventBulk,\r\n InternalStoreDocType,\r\n RxChangeEventBulk,\r\n RxCollection,\r\n RxDocument,\r\n RxDocumentData,\r\n RxStorageChangeEvent\r\n} from '../../types';\r\nimport type {\r\n CheckpointDocData,\r\n RxPipelineHandler,\r\n RxPipelineOptions\r\n} from './types';\r\nimport {\r\n PROMISE_RESOLVE_VOID,\r\n clone,\r\n createRevision,\r\n ensureNotFalsy,\r\n lastOfArray,\r\n nameFunction,\r\n now,\r\n promiseWait,\r\n randomToken\r\n} from '../utils/index.ts';\r\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\r\nimport { mapDocumentsDataToCacheDocs } from '../../doc-cache.ts';\r\nimport { INTERNAL_CONTEXT_PIPELINE_CHECKPOINT, getPrimaryKeyOfInternalDocument } from '../../rx-database-internal-store.ts';\r\nimport { FLAGGED_FUNCTIONS, blockFlaggedFunctionKey, releaseFlaggedFunctionKey } from './flagged-functions.ts';\r\n\r\nexport class RxPipeline<RxDocType> {\r\n processQueue = PROMISE_RESOLVE_VOID;\r\n subs: Subscription[] = [];\r\n stopped: boolean = false;\r\n\r\n toRun = 1;\r\n checkpointId: string;\r\n\r\n lastSourceDocTime = new BehaviorSubject(-1);\r\n lastProcessedDocTime = new BehaviorSubject(0);\r\n somethingChanged = new Subject();\r\n\r\n\r\n secretFunctionName = 'tx_fn_' + randomToken(10)\r\n\r\n waitBeforeWriteFn = async () => {\r\n const stack = new Error().stack;\r\n if (stack && (\r\n stack.includes(this.secretFunctionName)\r\n )) {\r\n } else {\r\n await this.awaitIdle();\r\n }\r\n }\r\n\r\n /**\r\n * The handler of the pipeline must never throw.\r\n * If it did anyway, the pipeline will be stuck and always\r\n * throw the previous error on all operations.\r\n */\r\n error: any;\r\n\r\n constructor(\r\n public readonly identifier: string,\r\n public readonly source: RxCollection<RxDocType>,\r\n public readonly destination: RxCollection<any>,\r\n public readonly handler: RxPipelineHandler<RxDocType>,\r\n public readonly batchSize = 100\r\n ) {\r\n this.checkpointId = 'rx-pipeline-' + identifier;\r\n this.source.onClose.push(() => this.close());\r\n this.destination.awaitBeforeReads.add(this.waitBeforeWriteFn);\r\n this.subs.push(\r\n this.source.eventBulks$.pipe(\r\n filter((bulk: RxChangeEventBulk<RxDocType>) => !this.stopped && !bulk.isLocal)\r\n ).subscribe((bulk: RxChangeEventBulk<RxDocType>) => {\r\n this.lastSourceDocTime.next(bulk.events[0].documentData._meta.lwt);\r\n this.somethingChanged.next({});\r\n })\r\n );\r\n this.subs.push(\r\n this.destination.database.internalStore\r\n .changeStream()\r\n .subscribe((eventBulk: EventBulk<RxStorageChangeEvent<InternalStoreDocType>, any>) => {\r\n const events = eventBulk.events;\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n if (\r\n event.documentData.context === INTERNAL_CONTEXT_PIPELINE_CHECKPOINT &&\r\n event.documentData.key === this.checkpointId\r\n ) {\r\n this.lastProcessedDocTime.next(event.documentData.data.lastDocTime);\r\n this.somethingChanged.next({});\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n trigger() {\r\n /**\r\n * Do not stack up too many\r\n * so that fast writes to the source collection\r\n * do not block anything too long.\r\n */\r\n if (this.toRun > 2) {\r\n return;\r\n }\r\n this.toRun = this.toRun + 1;\r\n\r\n this.processQueue = this.processQueue.then(async () => {\r\n this.toRun = this.toRun - 1;\r\n\r\n let done = false;\r\n while (\r\n !done &&\r\n !this.stopped &&\r\n !this.destination.closed &&\r\n !this.source.closed &&\r\n !this.error\r\n ) {\r\n const checkpointDoc = await getCheckpointDoc(this);\r\n const checkpoint = checkpointDoc ? checkpointDoc.data.checkpoint : undefined;\r\n const docsSinceResult = await getChangedDocumentsSince(\r\n this.source.storageInstance,\r\n this.batchSize,\r\n checkpoint\r\n );\r\n\r\n let lastTime = checkpointDoc ? checkpointDoc.data.lastDocTime : 0;\r\n if (docsSinceResult.documents.length > 0) {\r\n const rxDocuments = mapDocumentsDataToCacheDocs(this.source._docCache, docsSinceResult.documents);\r\n const _this = this;\r\n\r\n\r\n\r\n // const o: any = {};\r\n // eval(`\r\n // async function ${this.secretFunctionName}(docs){ const x = await _this.handler(docs); return x; }\r\n // o.${this.secretFunctionName} = ${this.secretFunctionName};\r\n // `);\r\n // await o[this.secretFunctionName](rxDocuments);\r\n\r\n const fnKey = blockFlaggedFunctionKey();\r\n this.secretFunctionName = fnKey;\r\n try {\r\n await FLAGGED_FUNCTIONS[fnKey](() => _this.handler(rxDocuments));\r\n } catch (err: any) {\r\n this.error = err;\r\n } finally {\r\n releaseFlaggedFunctionKey(fnKey);\r\n }\r\n\r\n if (this.error) {\r\n return;\r\n }\r\n\r\n lastTime = ensureNotFalsy(lastOfArray(docsSinceResult.documents))._meta.lwt;\r\n }\r\n if (!this.destination.closed) {\r\n await setCheckpointDoc(this, { checkpoint: docsSinceResult.checkpoint, lastDocTime: lastTime }, checkpointDoc);\r\n }\r\n if (docsSinceResult.documents.length < this.batchSize) {\r\n done = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n async awaitIdle() {\r\n if (this.error) {\r\n throw this.error;\r\n }\r\n let done = false;\r\n while (!done) {\r\n await this.processQueue;\r\n if (this.error) {\r\n throw this.error;\r\n }\r\n if (this.lastProcessedDocTime.getValue() >= this.lastSourceDocTime.getValue()) {\r\n done = true;\r\n } else {\r\n await firstValueFrom(this.somethingChanged);\r\n }\r\n }\r\n }\r\n\r\n async close() {\r\n await this.processQueue;\r\n this.stopped = true;\r\n this.destination.awaitBeforeReads.delete(this.waitBeforeWriteFn);\r\n this.subs.forEach(s => s.unsubscribe());\r\n await this.processQueue;\r\n }\r\n\r\n /**\r\n * Remove the pipeline and all metadata which it has stored\r\n */\r\n async remove() {\r\n const insternalStore = this.destination.database.internalStore;\r\n const checkpointDoc = await getCheckpointDoc(this);\r\n if (checkpointDoc) {\r\n const newDoc: RxDocumentData<InternalStoreDocType> = clone(checkpointDoc);\r\n newDoc._deleted = true;\r\n const writeResult = await insternalStore.bulkWrite([{\r\n previous: checkpointDoc,\r\n document: newDoc,\r\n }], 'rx-pipeline');\r\n if (writeResult.error.length > 0) {\r\n throw writeResult.error;\r\n }\r\n }\r\n return this.close();\r\n }\r\n}\r\n\r\n\r\nexport async function getCheckpointDoc<RxDocType>(\r\n pipeline: RxPipeline<RxDocType>\r\n): Promise<RxDocumentData<InternalStoreDocType<CheckpointDocData>> | undefined> {\r\n const insternalStore = pipeline.destination.database.internalStore;\r\n const checkpointId = getPrimaryKeyOfInternalDocument(\r\n pipeline.checkpointId,\r\n INTERNAL_CONTEXT_PIPELINE_CHECKPOINT\r\n );\r\n const results = await insternalStore.findDocumentsById([checkpointId], false);\r\n const result: RxDocumentData<InternalStoreDocType> = results[0];\r\n if (result) {\r\n return result;\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport async function setCheckpointDoc<RxDocType>(\r\n pipeline: RxPipeline<RxDocType>,\r\n newCheckpoint: CheckpointDocData,\r\n previous?: RxDocumentData<InternalStoreDocType>\r\n): Promise<void> {\r\n const insternalStore = pipeline.destination.database.internalStore;\r\n const newDoc: RxDocumentData<InternalStoreDocType<CheckpointDocData>> = {\r\n _attachments: {},\r\n _deleted: false,\r\n _meta: {\r\n lwt: now()\r\n },\r\n _rev: createRevision(pipeline.destination.database.token, previous),\r\n context: INTERNAL_CONTEXT_PIPELINE_CHECKPOINT,\r\n data: newCheckpoint,\r\n id: getPrimaryKeyOfInternalDocument(\r\n pipeline.checkpointId,\r\n INTERNAL_CONTEXT_PIPELINE_CHECKPOINT\r\n ),\r\n key: pipeline.checkpointId\r\n };\r\n\r\n const writeResult = await insternalStore.bulkWrite([{\r\n previous,\r\n document: newDoc,\r\n }], 'rx-pipeline');\r\n if (writeResult.error.length > 0) {\r\n throw writeResult.error;\r\n }\r\n}\r\n\r\n\r\nexport async function addPipeline<RxDocType>(\r\n this: RxCollection<RxDocType>,\r\n options: RxPipelineOptions<RxDocType>\r\n): Promise<RxPipeline<RxDocType>> {\r\n const pipeline = new RxPipeline<RxDocType>(\r\n options.identifier,\r\n this,\r\n options.destination,\r\n options.handler,\r\n options.batchSize\r\n );\r\n const waitForLeadership = typeof options.waitForLeadership === 'undefined' ? true : options.waitForLeadership;\r\n const startPromise = waitForLeadership ? this.database.waitForLeadership() : PROMISE_RESOLVE_VOID;\r\n startPromise.then(() => {\r\n pipeline.trigger();\r\n pipeline.subs.push(\r\n this.eventBulks$.pipe(\r\n filter((bulk: RxChangeEventBulk<RxDocType>) => {\r\n if (pipeline.stopped) {\r\n return false;\r\n }\r\n return !bulk.isLocal;\r\n })\r\n ).subscribe(() => pipeline.trigger())\r\n );\r\n });\r\n\r\n return pipeline;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"rx-pipeline.js","names":["_rxjs","require","_index","_rxStorageHelper","_docCache","_rxDatabaseInternalStore","_flaggedFunctions","RxPipeline","exports","identifier","source","destination","handler","batchSize","processQueue","PROMISE_RESOLVE_VOID","subs","stopped","toRun","lastSourceDocTime","BehaviorSubject","lastProcessedDocTime","somethingChanged","Subject","secretFunctionName","randomToken","waitBeforeWriteFn","stack","Error","includes","awaitIdle","checkpointId","onClose","push","close","awaitBeforeReads","add","eventBulks$","pipe","filter","bulk","isLocal","subscribe","next","events","documentData","_meta","lwt","database","internalStore","changeStream","eventBulk","index","length","event","context","INTERNAL_CONTEXT_PIPELINE_CHECKPOINT","key","data","lastDocTime","_proto","prototype","trigger","_this2","then","done","_loop","checkpointDoc","getCheckpointDoc","checkpoint","undefined","docsSinceResult","getChangedDocumentsSince","storageInstance","lastTime","documents","rxDocuments","mapDocumentsDataToCacheDocs","_this","fnKey","blockFlaggedFunctionKey","FLAGGED_FUNCTIONS","err","error","releaseFlaggedFunctionKey","v","ensureNotFalsy","lastOfArray","closed","setCheckpointDoc","_ret","catch","getValue","firstValueFrom","delete","forEach","s","unsubscribe","remove","insternalStore","newDoc","clone","_deleted","now","_rev","createRevision","token","writeResult","bulkWrite","previous","document","pipeline","getPrimaryKeyOfInternalDocument","results","findDocumentsById","result","newCheckpoint","_attachments","id","addPipeline","options","waitForLeadership","startPromise"],"sources":["../../../../src/plugins/pipeline/rx-pipeline.ts"],"sourcesContent":["import {\r\n BehaviorSubject,\r\n Subject,\r\n Subscription,\r\n filter,\r\n firstValueFrom,\r\n race\r\n} from 'rxjs';\r\nimport type {\r\n EventBulk,\r\n InternalStoreDocType,\r\n RxChangeEventBulk,\r\n RxCollection,\r\n RxDocument,\r\n RxDocumentData,\r\n RxStorageChangeEvent\r\n} from '../../types';\r\nimport type {\r\n CheckpointDocData,\r\n RxPipelineHandler,\r\n RxPipelineOptions\r\n} from './types';\r\nimport {\r\n PROMISE_RESOLVE_VOID,\r\n clone,\r\n createRevision,\r\n ensureNotFalsy,\r\n lastOfArray,\r\n nameFunction,\r\n now,\r\n promiseWait,\r\n randomToken\r\n} from '../utils/index.ts';\r\nimport { getChangedDocumentsSince } from '../../rx-storage-helper.ts';\r\nimport { mapDocumentsDataToCacheDocs } from '../../doc-cache.ts';\r\nimport { INTERNAL_CONTEXT_PIPELINE_CHECKPOINT, getPrimaryKeyOfInternalDocument } from '../../rx-database-internal-store.ts';\r\nimport { FLAGGED_FUNCTIONS, blockFlaggedFunctionKey, releaseFlaggedFunctionKey } from './flagged-functions.ts';\r\n\r\nexport class RxPipeline<RxDocType> {\r\n processQueue = PROMISE_RESOLVE_VOID;\r\n subs: Subscription[] = [];\r\n stopped: boolean = false;\r\n\r\n toRun = 1;\r\n checkpointId: string;\r\n\r\n lastSourceDocTime = new BehaviorSubject(-1);\r\n lastProcessedDocTime = new BehaviorSubject(0);\r\n somethingChanged = new Subject();\r\n\r\n\r\n secretFunctionName = 'tx_fn_' + randomToken(10)\r\n\r\n waitBeforeWriteFn = async () => {\r\n const stack = new Error().stack;\r\n if (stack && (\r\n stack.includes(this.secretFunctionName)\r\n )) {\r\n } else {\r\n await this.awaitIdle();\r\n }\r\n }\r\n\r\n /**\r\n * The handler of the pipeline must never throw.\r\n * If it did anyway, the pipeline will be stuck and always\r\n * throw the previous error on all operations.\r\n */\r\n error: any;\r\n\r\n constructor(\r\n public readonly identifier: string,\r\n public readonly source: RxCollection<RxDocType>,\r\n public readonly destination: RxCollection<any>,\r\n public readonly handler: RxPipelineHandler<RxDocType>,\r\n public readonly batchSize = 100\r\n ) {\r\n this.checkpointId = 'rx-pipeline-' + identifier;\r\n this.source.onClose.push(() => this.close());\r\n this.destination.awaitBeforeReads.add(this.waitBeforeWriteFn);\r\n this.subs.push(\r\n this.source.eventBulks$.pipe(\r\n filter((bulk: RxChangeEventBulk<RxDocType>) => !this.stopped && !bulk.isLocal)\r\n ).subscribe((bulk: RxChangeEventBulk<RxDocType>) => {\r\n this.lastSourceDocTime.next(bulk.events[0].documentData._meta.lwt);\r\n this.somethingChanged.next({});\r\n })\r\n );\r\n this.subs.push(\r\n this.destination.database.internalStore\r\n .changeStream()\r\n .subscribe((eventBulk: EventBulk<RxStorageChangeEvent<InternalStoreDocType>, any>) => {\r\n const events = eventBulk.events;\r\n for (let index = 0; index < events.length; index++) {\r\n const event = events[index];\r\n if (\r\n event.documentData.context === INTERNAL_CONTEXT_PIPELINE_CHECKPOINT &&\r\n event.documentData.key === this.checkpointId\r\n ) {\r\n this.lastProcessedDocTime.next(event.documentData.data.lastDocTime);\r\n this.somethingChanged.next({});\r\n }\r\n }\r\n })\r\n );\r\n }\r\n\r\n trigger() {\r\n /**\r\n * Do not stack up too many\r\n * so that fast writes to the source collection\r\n * do not block anything too long.\r\n */\r\n if (this.toRun > 2) {\r\n return;\r\n }\r\n this.toRun = this.toRun + 1;\r\n\r\n this.processQueue = this.processQueue.then(async () => {\r\n this.toRun = this.toRun - 1;\r\n\r\n let done = false;\r\n while (\r\n !done &&\r\n !this.stopped &&\r\n !this.destination.closed &&\r\n !this.source.closed &&\r\n !this.error\r\n ) {\r\n const checkpointDoc = await getCheckpointDoc(this);\r\n const checkpoint = checkpointDoc ? checkpointDoc.data.checkpoint : undefined;\r\n const docsSinceResult = await getChangedDocumentsSince(\r\n this.source.storageInstance,\r\n this.batchSize,\r\n checkpoint\r\n );\r\n\r\n let lastTime = checkpointDoc ? checkpointDoc.data.lastDocTime : 0;\r\n if (docsSinceResult.documents.length > 0) {\r\n const rxDocuments = mapDocumentsDataToCacheDocs(this.source._docCache, docsSinceResult.documents);\r\n const _this = this;\r\n\r\n\r\n\r\n // const o: any = {};\r\n // eval(`\r\n // async function ${this.secretFunctionName}(docs){ const x = await _this.handler(docs); return x; }\r\n // o.${this.secretFunctionName} = ${this.secretFunctionName};\r\n // `);\r\n // await o[this.secretFunctionName](rxDocuments);\r\n\r\n const fnKey = blockFlaggedFunctionKey();\r\n this.secretFunctionName = fnKey;\r\n try {\r\n await FLAGGED_FUNCTIONS[fnKey](() => _this.handler(rxDocuments));\r\n } catch (err: any) {\r\n this.error = err;\r\n } finally {\r\n releaseFlaggedFunctionKey(fnKey);\r\n }\r\n\r\n if (this.error) {\r\n return;\r\n }\r\n\r\n lastTime = ensureNotFalsy(lastOfArray(docsSinceResult.documents))._meta.lwt;\r\n }\r\n if (!this.destination.closed) {\r\n await setCheckpointDoc(this, { checkpoint: docsSinceResult.checkpoint, lastDocTime: lastTime }, checkpointDoc);\r\n }\r\n if (docsSinceResult.documents.length < this.batchSize) {\r\n done = true;\r\n }\r\n }\r\n }).catch(err => {\r\n this.error = err;\r\n });\r\n }\r\n\r\n async awaitIdle() {\r\n if (this.error) {\r\n throw this.error;\r\n }\r\n let done = false;\r\n while (!done) {\r\n await this.processQueue;\r\n if (this.error) {\r\n throw this.error;\r\n }\r\n if (this.lastProcessedDocTime.getValue() >= this.lastSourceDocTime.getValue()) {\r\n done = true;\r\n } else {\r\n await firstValueFrom(this.somethingChanged);\r\n }\r\n }\r\n }\r\n\r\n async close() {\r\n await this.processQueue;\r\n this.stopped = true;\r\n this.destination.awaitBeforeReads.delete(this.waitBeforeWriteFn);\r\n this.subs.forEach(s => s.unsubscribe());\r\n await this.processQueue;\r\n }\r\n\r\n /**\r\n * Remove the pipeline and all metadata which it has stored\r\n */\r\n async remove() {\r\n await this.close();\r\n const insternalStore = this.destination.database.internalStore;\r\n const checkpointDoc = await getCheckpointDoc(this);\r\n if (checkpointDoc) {\r\n const newDoc: RxDocumentData<InternalStoreDocType> = clone(checkpointDoc);\r\n newDoc._deleted = true;\r\n newDoc._meta.lwt = now();\r\n newDoc._rev = createRevision(this.destination.database.token, checkpointDoc);\r\n const writeResult = await insternalStore.bulkWrite([{\r\n previous: checkpointDoc,\r\n document: newDoc,\r\n }], 'rx-pipeline');\r\n if (writeResult.error.length > 0) {\r\n throw writeResult.error;\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function getCheckpointDoc<RxDocType>(\r\n pipeline: RxPipeline<RxDocType>\r\n): Promise<RxDocumentData<InternalStoreDocType<CheckpointDocData>> | undefined> {\r\n const insternalStore = pipeline.destination.database.internalStore;\r\n const checkpointId = getPrimaryKeyOfInternalDocument(\r\n pipeline.checkpointId,\r\n INTERNAL_CONTEXT_PIPELINE_CHECKPOINT\r\n );\r\n const results = await insternalStore.findDocumentsById([checkpointId], false);\r\n const result: RxDocumentData<InternalStoreDocType> = results[0];\r\n if (result) {\r\n return result;\r\n } else {\r\n return undefined;\r\n }\r\n}\r\n\r\nexport async function setCheckpointDoc<RxDocType>(\r\n pipeline: RxPipeline<RxDocType>,\r\n newCheckpoint: CheckpointDocData,\r\n previous?: RxDocumentData<InternalStoreDocType>\r\n): Promise<void> {\r\n const insternalStore = pipeline.destination.database.internalStore;\r\n const newDoc: RxDocumentData<InternalStoreDocType<CheckpointDocData>> = {\r\n _attachments: {},\r\n _deleted: false,\r\n _meta: {\r\n lwt: now()\r\n },\r\n _rev: createRevision(pipeline.destination.database.token, previous),\r\n context: INTERNAL_CONTEXT_PIPELINE_CHECKPOINT,\r\n data: newCheckpoint,\r\n id: getPrimaryKeyOfInternalDocument(\r\n pipeline.checkpointId,\r\n INTERNAL_CONTEXT_PIPELINE_CHECKPOINT\r\n ),\r\n key: pipeline.checkpointId\r\n };\r\n\r\n const writeResult = await insternalStore.bulkWrite([{\r\n previous,\r\n document: newDoc,\r\n }], 'rx-pipeline');\r\n if (writeResult.error.length > 0) {\r\n throw writeResult.error;\r\n }\r\n}\r\n\r\n\r\nexport async function addPipeline<RxDocType>(\r\n this: RxCollection<RxDocType>,\r\n options: RxPipelineOptions<RxDocType>\r\n): Promise<RxPipeline<RxDocType>> {\r\n const pipeline = new RxPipeline<RxDocType>(\r\n options.identifier,\r\n this,\r\n options.destination,\r\n options.handler,\r\n options.batchSize\r\n );\r\n const waitForLeadership = typeof options.waitForLeadership === 'undefined' ? true : options.waitForLeadership;\r\n const startPromise = waitForLeadership ? this.database.waitForLeadership() : PROMISE_RESOLVE_VOID;\r\n startPromise.then(() => {\r\n pipeline.trigger();\r\n pipeline.subs.push(\r\n this.eventBulks$.pipe(\r\n filter((bulk: RxChangeEventBulk<RxDocType>) => {\r\n if (pipeline.stopped) {\r\n return false;\r\n }\r\n return !bulk.isLocal;\r\n })\r\n ).subscribe(() => pipeline.trigger())\r\n );\r\n });\r\n\r\n return pipeline;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -76,7 +76,8 @@ var NoSqlQueryBuilderClass = exports.NoSqlQueryBuilderClass = /*#__PURE__*/funct
|
|
|
76
76
|
_proto.equals = function equals(val) {
|
|
77
77
|
this._ensurePath('equals');
|
|
78
78
|
var path = this._path;
|
|
79
|
-
this._conditions[path] =
|
|
79
|
+
var conds = this._conditions[path] !== null && typeof this._conditions[path] === 'object' ? this._conditions[path] : this._conditions[path] = {};
|
|
80
|
+
conds.$eq = val;
|
|
80
81
|
return this;
|
|
81
82
|
}
|
|
82
83
|
|
|
@@ -87,7 +88,8 @@ var NoSqlQueryBuilderClass = exports.NoSqlQueryBuilderClass = /*#__PURE__*/funct
|
|
|
87
88
|
_proto.eq = function eq(val) {
|
|
88
89
|
this._ensurePath('eq');
|
|
89
90
|
var path = this._path;
|
|
90
|
-
this._conditions[path] =
|
|
91
|
+
var conds = this._conditions[path] !== null && typeof this._conditions[path] === 'object' ? this._conditions[path] : this._conditions[path] = {};
|
|
92
|
+
conds.$eq = val;
|
|
91
93
|
return this;
|
|
92
94
|
}
|
|
93
95
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nosql-query-builder.js","names":["_mqueryUtils","require","_rxError","NoSqlQueryBuilderClass","exports","mangoQuery","_path","options","_conditions","_fields","queryBuilder","selector","find","limit","skip","sort","forEach","s","_proto","prototype","where","_val","arguments","length","type","Array","isArray","merge","newRxTypeError","path","equals","val","_ensurePath","eq","or","array","$or","push","apply","nor","$nor","and","$and","mod","slice","conds","$mod","exists","$exists","elemMatch","_criteria","fn","criteria","isObject","$elemMatch","arg","len","i","_pushArr","split","field","ascend","substring","keys","Object","args","source","canMerge","_distinct","method","newRxError","toJSON","query","mQuerySortToRxDBSort","entries","map","k","v","direction","part","OTHER_MANGO_ATTRIBUTES","OTHER_MANGO_OPERATORS","$conditional","RegExp","$regex","$options","opts","value","$meta","String","toLowerCase","test","valueStr","toString","replace","parseInt","createQueryBuilder"],"sources":["../../../../../src/plugins/query-builder/mquery/nosql-query-builder.ts"],"sourcesContent":["/**\r\n * this is based on\r\n * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js\r\n */\r\nimport {\r\n isObject,\r\n merge\r\n} from './mquery-utils.ts';\r\nimport {\r\n newRxTypeError,\r\n newRxError\r\n} from '../../../rx-error.ts';\r\nimport type {\r\n MangoQuery,\r\n MangoQuerySelector,\r\n MangoQuerySortPart,\r\n MangoQuerySortDirection\r\n} from '../../../types/index.d.ts';\r\n\r\n\r\ndeclare type MQueryOptions = {\r\n limit?: number;\r\n skip?: number;\r\n sort?: any;\r\n};\r\n\r\nexport class NoSqlQueryBuilderClass<DocType> {\r\n\r\n public options: MQueryOptions = {};\r\n public _conditions: MangoQuerySelector<DocType> = {};\r\n public _fields: any = {};\r\n private _distinct: any;\r\n\r\n /**\r\n * MQuery constructor used for building queries.\r\n *\r\n * ####Example:\r\n * var query = new MQuery({ name: 'mquery' });\r\n * query.where('age').gte(21).exec(callback);\r\n *\r\n */\r\n constructor(\r\n mangoQuery?: MangoQuery<DocType>,\r\n public _path?: any\r\n ) {\r\n if (mangoQuery) {\r\n const queryBuilder: NoSqlQueryBuilder<DocType> = this as any;\r\n\r\n if (mangoQuery.selector) {\r\n queryBuilder.find(mangoQuery.selector);\r\n }\r\n if (mangoQuery.limit) {\r\n queryBuilder.limit(mangoQuery.limit);\r\n }\r\n if (mangoQuery.skip) {\r\n queryBuilder.skip(mangoQuery.skip);\r\n }\r\n if (mangoQuery.sort) {\r\n mangoQuery.sort.forEach(s => queryBuilder.sort(s));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies a `path` for use with chaining.\r\n */\r\n where(_path: string, _val?: MangoQuerySelector<DocType>): NoSqlQueryBuilder<DocType> {\r\n if (!arguments.length) return this as any;\r\n const type = typeof arguments[0];\r\n if ('string' === type) {\r\n this._path = arguments[0];\r\n if (2 === arguments.length) {\r\n (this._conditions as any)[this._path] = arguments[1];\r\n }\r\n return this as any;\r\n }\r\n\r\n if ('object' === type && !Array.isArray(arguments[0])) {\r\n return this.merge(arguments[0]);\r\n }\r\n\r\n throw newRxTypeError('MQ1', {\r\n path: arguments[0]\r\n });\r\n }\r\n\r\n /**\r\n * Specifies the complementary comparison value for paths specified with `where()`\r\n * ####Example\r\n * User.where('age').equals(49);\r\n */\r\n equals(val: any): NoSqlQueryBuilder<DocType> {\r\n this._ensurePath('equals');\r\n const path = this._path;\r\n (this._conditions as any)[path] = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies the complementary comparison value for paths specified with `where()`\r\n * This is alias of `equals`\r\n */\r\n eq(val: any): NoSqlQueryBuilder<DocType> {\r\n this._ensurePath('eq');\r\n const path = this._path;\r\n (this._conditions as any)[path] = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies arguments for an `$or` condition.\r\n * ####Example\r\n * query.or([{ color: 'red' }, { status: 'emergency' }])\r\n */\r\n or(array: any[]): NoSqlQueryBuilder<DocType> {\r\n const or = this._conditions.$or || (this._conditions.$or = []);\r\n if (!Array.isArray(array)) array = [array];\r\n or.push.apply(or, array);\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies arguments for a `$nor` condition.\r\n * ####Example\r\n * query.nor([{ color: 'green' }, { status: 'ok' }])\r\n */\r\n nor(array: any[]): NoSqlQueryBuilder<DocType> {\r\n const nor = this._conditions.$nor || (this._conditions.$nor = []);\r\n if (!Array.isArray(array)) array = [array];\r\n nor.push.apply(nor, array);\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies arguments for a `$and` condition.\r\n * ####Example\r\n * query.and([{ color: 'green' }, { status: 'ok' }])\r\n * @see $and http://docs.mongodb.org/manual/reference/operator/and/\r\n */\r\n and(array: any[]): NoSqlQueryBuilder<DocType> {\r\n const and = this._conditions.$and || (this._conditions.$and = []);\r\n if (!Array.isArray(array)) array = [array];\r\n and.push.apply(and, array);\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies a `$mod` condition\r\n */\r\n mod(_path: string, _val: number): NoSqlQueryBuilder<DocType> {\r\n let val;\r\n let path;\r\n\r\n if (1 === arguments.length) {\r\n this._ensurePath('mod');\r\n val = arguments[0];\r\n path = this._path;\r\n } else if (2 === arguments.length && !Array.isArray(arguments[1])) {\r\n this._ensurePath('mod');\r\n val = (arguments as any).slice();\r\n path = this._path;\r\n } else if (3 === arguments.length) {\r\n val = (arguments as any).slice(1);\r\n path = arguments[0];\r\n } else {\r\n val = arguments[1];\r\n path = arguments[0];\r\n }\r\n\r\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\r\n conds.$mod = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies an `$exists` condition\r\n * ####Example\r\n * // { name: { $exists: true }}\r\n * Thing.where('name').exists()\r\n * Thing.where('name').exists(true)\r\n * Thing.find().exists('name')\r\n */\r\n exists(_path: string, _val: number): NoSqlQueryBuilder<DocType> {\r\n let path;\r\n let val;\r\n if (0 === arguments.length) {\r\n this._ensurePath('exists');\r\n path = this._path;\r\n val = true;\r\n } else if (1 === arguments.length) {\r\n if ('boolean' === typeof arguments[0]) {\r\n this._ensurePath('exists');\r\n path = this._path;\r\n val = arguments[0];\r\n } else {\r\n path = arguments[0];\r\n val = true;\r\n }\r\n } else if (2 === arguments.length) {\r\n path = arguments[0];\r\n val = arguments[1];\r\n }\r\n\r\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\r\n conds.$exists = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies an `$elemMatch` condition\r\n * ####Example\r\n * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})\r\n * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})\r\n * query.elemMatch('comment', function (elem) {\r\n * elem.where('author').equals('autobot');\r\n * elem.where('votes').gte(5);\r\n * })\r\n * query.where('comment').elemMatch(function (elem) {\r\n * elem.where({ author: 'autobot' });\r\n * elem.where('votes').gte(5);\r\n * })\r\n */\r\n elemMatch(_path: string, _criteria: any): NoSqlQueryBuilder<DocType> {\r\n if (null === arguments[0])\r\n throw newRxTypeError('MQ2');\r\n\r\n let fn;\r\n let path;\r\n let criteria;\r\n\r\n if ('function' === typeof arguments[0]) {\r\n this._ensurePath('elemMatch');\r\n path = this._path;\r\n fn = arguments[0];\r\n } else if (isObject(arguments[0])) {\r\n this._ensurePath('elemMatch');\r\n path = this._path;\r\n criteria = arguments[0];\r\n } else if ('function' === typeof arguments[1]) {\r\n path = arguments[0];\r\n fn = arguments[1];\r\n } else if (arguments[1] && isObject(arguments[1])) {\r\n path = arguments[0];\r\n criteria = arguments[1];\r\n } else\r\n throw newRxTypeError('MQ2');\r\n\r\n if (fn) {\r\n criteria = new NoSqlQueryBuilderClass;\r\n fn(criteria);\r\n criteria = criteria._conditions;\r\n }\r\n\r\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\r\n conds.$elemMatch = criteria;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Sets the sort order\r\n * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1.\r\n * If a string is passed, it must be a space delimited list of path names.\r\n * The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.\r\n * ####Example\r\n * query.sort({ field: 'asc', test: -1 });\r\n * query.sort('field -test');\r\n * query.sort([['field', 1], ['test', -1]]);\r\n */\r\n sort(arg: any): NoSqlQueryBuilder<DocType> {\r\n if (!arg) return this as any;\r\n let len;\r\n const type = typeof arg;\r\n // .sort([['field', 1], ['test', -1]])\r\n if (Array.isArray(arg)) {\r\n len = arg.length;\r\n for (let i = 0; i < arg.length; ++i) {\r\n _pushArr(this.options, arg[i][0], arg[i][1]);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n // .sort('field -test')\r\n if (1 === arguments.length && 'string' === type) {\r\n arg = arg.split(/\\s+/);\r\n len = arg.length;\r\n for (let i = 0; i < len; ++i) {\r\n let field = arg[i];\r\n if (!field) continue;\r\n const ascend = '-' === field[0] ? -1 : 1;\r\n if (ascend === -1) field = field.substring(1);\r\n push(this.options, field, ascend);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n // .sort({ field: 1, test: -1 })\r\n if (isObject(arg)) {\r\n const keys = Object.keys(arg);\r\n keys.forEach(field => push(this.options, field, arg[field]));\r\n return this as any;\r\n }\r\n\r\n throw newRxTypeError('MQ3', {\r\n args: arguments\r\n });\r\n }\r\n\r\n /**\r\n * Merges another MQuery or conditions object into this one.\r\n *\r\n * When a MQuery is passed, conditions, field selection and options are merged.\r\n *\r\n */\r\n merge(source: any): NoSqlQueryBuilder<DocType> {\r\n if (!source) {\r\n return this as any;\r\n }\r\n\r\n if (!canMerge(source)) {\r\n throw newRxTypeError('MQ4', {\r\n source\r\n });\r\n }\r\n\r\n if (source instanceof NoSqlQueryBuilderClass) {\r\n // if source has a feature, apply it to ourselves\r\n\r\n if (source._conditions)\r\n merge(this._conditions, source._conditions);\r\n\r\n if (source._fields) {\r\n if (!this._fields) this._fields = {};\r\n merge(this._fields, source._fields);\r\n }\r\n\r\n if (source.options) {\r\n if (!this.options) this.options = {};\r\n merge(this.options, source.options);\r\n }\r\n\r\n if (source._distinct)\r\n this._distinct = source._distinct;\r\n\r\n return this as any;\r\n }\r\n\r\n // plain object\r\n merge(this._conditions, source);\r\n\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Finds documents.\r\n * ####Example\r\n * query.find()\r\n * query.find({ name: 'Burning Lights' })\r\n */\r\n find(criteria: any): NoSqlQueryBuilder<DocType> {\r\n if (canMerge(criteria)) {\r\n this.merge(criteria);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Make sure _path is set.\r\n *\r\n * @param {String} method\r\n */\r\n _ensurePath(method: any) {\r\n if (!this._path) {\r\n throw newRxError('MQ5', {\r\n method\r\n });\r\n }\r\n }\r\n\r\n toJSON(): {\r\n query: MangoQuery<DocType>;\r\n path?: string;\r\n } {\r\n const query: MangoQuery<DocType> = {\r\n selector: this._conditions,\r\n };\r\n\r\n if (this.options.skip) {\r\n query.skip = this.options.skip;\r\n }\r\n if (this.options.limit) {\r\n query.limit = this.options.limit;\r\n }\r\n if (this.options.sort) {\r\n query.sort = mQuerySortToRxDBSort(this.options.sort);\r\n }\r\n\r\n return {\r\n query,\r\n path: this._path\r\n };\r\n }\r\n}\r\n\r\nexport function mQuerySortToRxDBSort<DocType>(\r\n sort: { [k: string]: 1 | -1; }\r\n): MangoQuerySortPart<DocType>[] {\r\n return Object.entries(sort).map(([k, v]) => {\r\n const direction: MangoQuerySortDirection = v === 1 ? 'asc' : 'desc';\r\n const part: MangoQuerySortPart<DocType> = { [k]: direction } as any;\r\n return part;\r\n });\r\n}\r\n\r\n/**\r\n * Because some prototype-methods are generated,\r\n * we have to define the type of NoSqlQueryBuilder here\r\n */\r\n\r\nexport interface NoSqlQueryBuilder<DocType = any> extends NoSqlQueryBuilderClass<DocType> {\r\n maxScan: ReturnSelfNumberFunction<DocType>;\r\n batchSize: ReturnSelfNumberFunction<DocType>;\r\n limit: ReturnSelfNumberFunction<DocType>;\r\n skip: ReturnSelfNumberFunction<DocType>;\r\n comment: ReturnSelfFunction<DocType>;\r\n\r\n gt: ReturnSelfFunction<DocType>;\r\n gte: ReturnSelfFunction<DocType>;\r\n lt: ReturnSelfFunction<DocType>;\r\n lte: ReturnSelfFunction<DocType>;\r\n ne: ReturnSelfFunction<DocType>;\r\n in: ReturnSelfFunction<DocType>;\r\n nin: ReturnSelfFunction<DocType>;\r\n all: ReturnSelfFunction<DocType>;\r\n regex: ReturnSelfFunction<DocType>;\r\n size: ReturnSelfFunction<DocType>;\r\n\r\n}\r\n\r\ndeclare type ReturnSelfFunction<DocType> = (v: any) => NoSqlQueryBuilder<DocType>;\r\ndeclare type ReturnSelfNumberFunction<DocType> = (v: number | null) => NoSqlQueryBuilder<DocType>;\r\n\r\n/**\r\n * limit, skip, maxScan, batchSize, comment\r\n *\r\n * Sets these associated options.\r\n *\r\n * query.comment('feed query');\r\n */\r\nexport const OTHER_MANGO_ATTRIBUTES = ['limit', 'skip', 'maxScan', 'batchSize', 'comment'];\r\nOTHER_MANGO_ATTRIBUTES.forEach(function (method) {\r\n (NoSqlQueryBuilderClass.prototype as any)[method] = function (v: any) {\r\n this.options[method] = v;\r\n return this;\r\n };\r\n});\r\n\r\n\r\n/**\r\n * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance\r\n *\r\n * Thing.where('type').nin(array)\r\n */\r\nexport const OTHER_MANGO_OPERATORS = [\r\n 'gt', 'gte', 'lt', 'lte', 'ne',\r\n 'in', 'nin', 'all', 'regex', 'size'\r\n];\r\nOTHER_MANGO_OPERATORS.forEach(function ($conditional) {\r\n (NoSqlQueryBuilderClass.prototype as any)[$conditional] = function () {\r\n let path;\r\n let val;\r\n\r\n if (1 === arguments.length) {\r\n this._ensurePath($conditional);\r\n val = arguments[0];\r\n path = this._path;\r\n } else {\r\n val = arguments[1];\r\n path = arguments[0];\r\n }\r\n\r\n const conds = this._conditions[path] === null || typeof this._conditions[path] === 'object' ?\r\n this._conditions[path] :\r\n (this._conditions[path] = {});\r\n\r\n\r\n\r\n if ($conditional === 'regex') {\r\n if (val instanceof RegExp) {\r\n throw newRxError('QU16', {\r\n field: path,\r\n query: this._conditions,\r\n });\r\n }\r\n if (typeof val === 'string') {\r\n conds['$' + $conditional] = val;\r\n } else {\r\n conds['$' + $conditional] = val.$regex;\r\n if (val.$options) {\r\n conds.$options = val.$options;\r\n }\r\n }\r\n } else {\r\n conds['$' + $conditional] = val;\r\n }\r\n\r\n return this;\r\n };\r\n});\r\n\r\n\r\nfunction push(opts: any, field: string, value: any) {\r\n if (Array.isArray(opts.sort)) {\r\n throw newRxTypeError('MQ6', {\r\n opts,\r\n field,\r\n value\r\n });\r\n }\r\n\r\n if (value && value.$meta) {\r\n const sort = opts.sort || (opts.sort = {});\r\n sort[field] = {\r\n $meta: value.$meta\r\n };\r\n return;\r\n }\r\n\r\n const val = String(value || 1).toLowerCase();\r\n if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) {\r\n if (Array.isArray(value)) value = '[' + value + ']';\r\n throw newRxTypeError('MQ7', {\r\n field,\r\n value\r\n });\r\n }\r\n // store `sort` in a sane format\r\n const s = opts.sort || (opts.sort = {});\r\n const valueStr = value.toString()\r\n .replace('asc', '1')\r\n .replace('ascending', '1')\r\n .replace('desc', '-1')\r\n .replace('descending', '-1');\r\n s[field] = parseInt(valueStr, 10);\r\n}\r\n\r\nfunction _pushArr(opts: any, field: string, value: any) {\r\n opts.sort = opts.sort || [];\r\n if (!Array.isArray(opts.sort)) {\r\n throw newRxTypeError('MQ8', {\r\n opts,\r\n field,\r\n value\r\n });\r\n }\r\n\r\n /* const valueStr = value.toString()\r\n .replace('asc', '1')\r\n .replace('ascending', '1')\r\n .replace('desc', '-1')\r\n .replace('descending', '-1');*/\r\n opts.sort.push([field, value]);\r\n}\r\n\r\n\r\n/**\r\n * Determines if `conds` can be merged using `mquery().merge()`\r\n */\r\nexport function canMerge(conds: any): boolean {\r\n return conds instanceof NoSqlQueryBuilderClass || isObject(conds);\r\n}\r\n\r\n\r\nexport function createQueryBuilder<DocType>(query?: MangoQuery<DocType>, path?: any): NoSqlQueryBuilder<DocType> {\r\n return new NoSqlQueryBuilderClass(query, path) as NoSqlQueryBuilder<DocType>;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"nosql-query-builder.js","names":["_mqueryUtils","require","_rxError","NoSqlQueryBuilderClass","exports","mangoQuery","_path","options","_conditions","_fields","queryBuilder","selector","find","limit","skip","sort","forEach","s","_proto","prototype","where","_val","arguments","length","type","Array","isArray","merge","newRxTypeError","path","equals","val","_ensurePath","conds","$eq","eq","or","array","$or","push","apply","nor","$nor","and","$and","mod","slice","$mod","exists","$exists","elemMatch","_criteria","fn","criteria","isObject","$elemMatch","arg","len","i","_pushArr","split","field","ascend","substring","keys","Object","args","source","canMerge","_distinct","method","newRxError","toJSON","query","mQuerySortToRxDBSort","entries","map","k","v","direction","part","OTHER_MANGO_ATTRIBUTES","OTHER_MANGO_OPERATORS","$conditional","RegExp","$regex","$options","opts","value","$meta","String","toLowerCase","test","valueStr","toString","replace","parseInt","createQueryBuilder"],"sources":["../../../../../src/plugins/query-builder/mquery/nosql-query-builder.ts"],"sourcesContent":["/**\r\n * this is based on\r\n * @link https://github.com/aheckmann/mquery/blob/master/lib/mquery.js\r\n */\r\nimport {\r\n isObject,\r\n merge\r\n} from './mquery-utils.ts';\r\nimport {\r\n newRxTypeError,\r\n newRxError\r\n} from '../../../rx-error.ts';\r\nimport type {\r\n MangoQuery,\r\n MangoQuerySelector,\r\n MangoQuerySortPart,\r\n MangoQuerySortDirection\r\n} from '../../../types/index.d.ts';\r\n\r\n\r\ndeclare type MQueryOptions = {\r\n limit?: number;\r\n skip?: number;\r\n sort?: any;\r\n};\r\n\r\nexport class NoSqlQueryBuilderClass<DocType> {\r\n\r\n public options: MQueryOptions = {};\r\n public _conditions: MangoQuerySelector<DocType> = {};\r\n public _fields: any = {};\r\n private _distinct: any;\r\n\r\n /**\r\n * MQuery constructor used for building queries.\r\n *\r\n * ####Example:\r\n * var query = new MQuery({ name: 'mquery' });\r\n * query.where('age').gte(21).exec(callback);\r\n *\r\n */\r\n constructor(\r\n mangoQuery?: MangoQuery<DocType>,\r\n public _path?: any\r\n ) {\r\n if (mangoQuery) {\r\n const queryBuilder: NoSqlQueryBuilder<DocType> = this as any;\r\n\r\n if (mangoQuery.selector) {\r\n queryBuilder.find(mangoQuery.selector);\r\n }\r\n if (mangoQuery.limit) {\r\n queryBuilder.limit(mangoQuery.limit);\r\n }\r\n if (mangoQuery.skip) {\r\n queryBuilder.skip(mangoQuery.skip);\r\n }\r\n if (mangoQuery.sort) {\r\n mangoQuery.sort.forEach(s => queryBuilder.sort(s));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Specifies a `path` for use with chaining.\r\n */\r\n where(_path: string, _val?: MangoQuerySelector<DocType>): NoSqlQueryBuilder<DocType> {\r\n if (!arguments.length) return this as any;\r\n const type = typeof arguments[0];\r\n if ('string' === type) {\r\n this._path = arguments[0];\r\n if (2 === arguments.length) {\r\n (this._conditions as any)[this._path] = arguments[1];\r\n }\r\n return this as any;\r\n }\r\n\r\n if ('object' === type && !Array.isArray(arguments[0])) {\r\n return this.merge(arguments[0]);\r\n }\r\n\r\n throw newRxTypeError('MQ1', {\r\n path: arguments[0]\r\n });\r\n }\r\n\r\n /**\r\n * Specifies the complementary comparison value for paths specified with `where()`\r\n * ####Example\r\n * User.where('age').equals(49);\r\n */\r\n equals(val: any): NoSqlQueryBuilder<DocType> {\r\n this._ensurePath('equals');\r\n const path = this._path;\r\n const conds = (this._conditions as any)[path] !== null && typeof (this._conditions as any)[path] === 'object' ?\r\n (this._conditions as any)[path] :\r\n ((this._conditions as any)[path] = {});\r\n conds.$eq = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies the complementary comparison value for paths specified with `where()`\r\n * This is alias of `equals`\r\n */\r\n eq(val: any): NoSqlQueryBuilder<DocType> {\r\n this._ensurePath('eq');\r\n const path = this._path;\r\n const conds = (this._conditions as any)[path] !== null && typeof (this._conditions as any)[path] === 'object' ?\r\n (this._conditions as any)[path] :\r\n ((this._conditions as any)[path] = {});\r\n conds.$eq = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies arguments for an `$or` condition.\r\n * ####Example\r\n * query.or([{ color: 'red' }, { status: 'emergency' }])\r\n */\r\n or(array: any[]): NoSqlQueryBuilder<DocType> {\r\n const or = this._conditions.$or || (this._conditions.$or = []);\r\n if (!Array.isArray(array)) array = [array];\r\n or.push.apply(or, array);\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies arguments for a `$nor` condition.\r\n * ####Example\r\n * query.nor([{ color: 'green' }, { status: 'ok' }])\r\n */\r\n nor(array: any[]): NoSqlQueryBuilder<DocType> {\r\n const nor = this._conditions.$nor || (this._conditions.$nor = []);\r\n if (!Array.isArray(array)) array = [array];\r\n nor.push.apply(nor, array);\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies arguments for a `$and` condition.\r\n * ####Example\r\n * query.and([{ color: 'green' }, { status: 'ok' }])\r\n * @see $and http://docs.mongodb.org/manual/reference/operator/and/\r\n */\r\n and(array: any[]): NoSqlQueryBuilder<DocType> {\r\n const and = this._conditions.$and || (this._conditions.$and = []);\r\n if (!Array.isArray(array)) array = [array];\r\n and.push.apply(and, array);\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies a `$mod` condition\r\n */\r\n mod(_path: string, _val: number): NoSqlQueryBuilder<DocType> {\r\n let val;\r\n let path;\r\n\r\n if (1 === arguments.length) {\r\n this._ensurePath('mod');\r\n val = arguments[0];\r\n path = this._path;\r\n } else if (2 === arguments.length && !Array.isArray(arguments[1])) {\r\n this._ensurePath('mod');\r\n val = (arguments as any).slice();\r\n path = this._path;\r\n } else if (3 === arguments.length) {\r\n val = (arguments as any).slice(1);\r\n path = arguments[0];\r\n } else {\r\n val = arguments[1];\r\n path = arguments[0];\r\n }\r\n\r\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\r\n conds.$mod = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies an `$exists` condition\r\n * ####Example\r\n * // { name: { $exists: true }}\r\n * Thing.where('name').exists()\r\n * Thing.where('name').exists(true)\r\n * Thing.find().exists('name')\r\n */\r\n exists(_path: string, _val: number): NoSqlQueryBuilder<DocType> {\r\n let path;\r\n let val;\r\n if (0 === arguments.length) {\r\n this._ensurePath('exists');\r\n path = this._path;\r\n val = true;\r\n } else if (1 === arguments.length) {\r\n if ('boolean' === typeof arguments[0]) {\r\n this._ensurePath('exists');\r\n path = this._path;\r\n val = arguments[0];\r\n } else {\r\n path = arguments[0];\r\n val = true;\r\n }\r\n } else if (2 === arguments.length) {\r\n path = arguments[0];\r\n val = arguments[1];\r\n }\r\n\r\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\r\n conds.$exists = val;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Specifies an `$elemMatch` condition\r\n * ####Example\r\n * query.elemMatch('comment', { author: 'autobot', votes: {$gte: 5}})\r\n * query.where('comment').elemMatch({ author: 'autobot', votes: {$gte: 5}})\r\n * query.elemMatch('comment', function (elem) {\r\n * elem.where('author').equals('autobot');\r\n * elem.where('votes').gte(5);\r\n * })\r\n * query.where('comment').elemMatch(function (elem) {\r\n * elem.where({ author: 'autobot' });\r\n * elem.where('votes').gte(5);\r\n * })\r\n */\r\n elemMatch(_path: string, _criteria: any): NoSqlQueryBuilder<DocType> {\r\n if (null === arguments[0])\r\n throw newRxTypeError('MQ2');\r\n\r\n let fn;\r\n let path;\r\n let criteria;\r\n\r\n if ('function' === typeof arguments[0]) {\r\n this._ensurePath('elemMatch');\r\n path = this._path;\r\n fn = arguments[0];\r\n } else if (isObject(arguments[0])) {\r\n this._ensurePath('elemMatch');\r\n path = this._path;\r\n criteria = arguments[0];\r\n } else if ('function' === typeof arguments[1]) {\r\n path = arguments[0];\r\n fn = arguments[1];\r\n } else if (arguments[1] && isObject(arguments[1])) {\r\n path = arguments[0];\r\n criteria = arguments[1];\r\n } else\r\n throw newRxTypeError('MQ2');\r\n\r\n if (fn) {\r\n criteria = new NoSqlQueryBuilderClass;\r\n fn(criteria);\r\n criteria = criteria._conditions;\r\n }\r\n\r\n const conds = (this._conditions as any)[path] || ((this._conditions as any)[path] = {});\r\n conds.$elemMatch = criteria;\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Sets the sort order\r\n * If an object is passed, values allowed are 'asc', 'desc', 'ascending', 'descending', 1, and -1.\r\n * If a string is passed, it must be a space delimited list of path names.\r\n * The sort order of each path is ascending unless the path name is prefixed with `-` which will be treated as descending.\r\n * ####Example\r\n * query.sort({ field: 'asc', test: -1 });\r\n * query.sort('field -test');\r\n * query.sort([['field', 1], ['test', -1]]);\r\n */\r\n sort(arg: any): NoSqlQueryBuilder<DocType> {\r\n if (!arg) return this as any;\r\n let len;\r\n const type = typeof arg;\r\n // .sort([['field', 1], ['test', -1]])\r\n if (Array.isArray(arg)) {\r\n len = arg.length;\r\n for (let i = 0; i < arg.length; ++i) {\r\n _pushArr(this.options, arg[i][0], arg[i][1]);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n // .sort('field -test')\r\n if (1 === arguments.length && 'string' === type) {\r\n arg = arg.split(/\\s+/);\r\n len = arg.length;\r\n for (let i = 0; i < len; ++i) {\r\n let field = arg[i];\r\n if (!field) continue;\r\n const ascend = '-' === field[0] ? -1 : 1;\r\n if (ascend === -1) field = field.substring(1);\r\n push(this.options, field, ascend);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n // .sort({ field: 1, test: -1 })\r\n if (isObject(arg)) {\r\n const keys = Object.keys(arg);\r\n keys.forEach(field => push(this.options, field, arg[field]));\r\n return this as any;\r\n }\r\n\r\n throw newRxTypeError('MQ3', {\r\n args: arguments\r\n });\r\n }\r\n\r\n /**\r\n * Merges another MQuery or conditions object into this one.\r\n *\r\n * When a MQuery is passed, conditions, field selection and options are merged.\r\n *\r\n */\r\n merge(source: any): NoSqlQueryBuilder<DocType> {\r\n if (!source) {\r\n return this as any;\r\n }\r\n\r\n if (!canMerge(source)) {\r\n throw newRxTypeError('MQ4', {\r\n source\r\n });\r\n }\r\n\r\n if (source instanceof NoSqlQueryBuilderClass) {\r\n // if source has a feature, apply it to ourselves\r\n\r\n if (source._conditions)\r\n merge(this._conditions, source._conditions);\r\n\r\n if (source._fields) {\r\n if (!this._fields) this._fields = {};\r\n merge(this._fields, source._fields);\r\n }\r\n\r\n if (source.options) {\r\n if (!this.options) this.options = {};\r\n merge(this.options, source.options);\r\n }\r\n\r\n if (source._distinct)\r\n this._distinct = source._distinct;\r\n\r\n return this as any;\r\n }\r\n\r\n // plain object\r\n merge(this._conditions, source);\r\n\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Finds documents.\r\n * ####Example\r\n * query.find()\r\n * query.find({ name: 'Burning Lights' })\r\n */\r\n find(criteria: any): NoSqlQueryBuilder<DocType> {\r\n if (canMerge(criteria)) {\r\n this.merge(criteria);\r\n }\r\n\r\n return this as any;\r\n }\r\n\r\n /**\r\n * Make sure _path is set.\r\n *\r\n * @param {String} method\r\n */\r\n _ensurePath(method: any) {\r\n if (!this._path) {\r\n throw newRxError('MQ5', {\r\n method\r\n });\r\n }\r\n }\r\n\r\n toJSON(): {\r\n query: MangoQuery<DocType>;\r\n path?: string;\r\n } {\r\n const query: MangoQuery<DocType> = {\r\n selector: this._conditions,\r\n };\r\n\r\n if (this.options.skip) {\r\n query.skip = this.options.skip;\r\n }\r\n if (this.options.limit) {\r\n query.limit = this.options.limit;\r\n }\r\n if (this.options.sort) {\r\n query.sort = mQuerySortToRxDBSort(this.options.sort);\r\n }\r\n\r\n return {\r\n query,\r\n path: this._path\r\n };\r\n }\r\n}\r\n\r\nexport function mQuerySortToRxDBSort<DocType>(\r\n sort: { [k: string]: 1 | -1; }\r\n): MangoQuerySortPart<DocType>[] {\r\n return Object.entries(sort).map(([k, v]) => {\r\n const direction: MangoQuerySortDirection = v === 1 ? 'asc' : 'desc';\r\n const part: MangoQuerySortPart<DocType> = { [k]: direction } as any;\r\n return part;\r\n });\r\n}\r\n\r\n/**\r\n * Because some prototype-methods are generated,\r\n * we have to define the type of NoSqlQueryBuilder here\r\n */\r\n\r\nexport interface NoSqlQueryBuilder<DocType = any> extends NoSqlQueryBuilderClass<DocType> {\r\n maxScan: ReturnSelfNumberFunction<DocType>;\r\n batchSize: ReturnSelfNumberFunction<DocType>;\r\n limit: ReturnSelfNumberFunction<DocType>;\r\n skip: ReturnSelfNumberFunction<DocType>;\r\n comment: ReturnSelfFunction<DocType>;\r\n\r\n gt: ReturnSelfFunction<DocType>;\r\n gte: ReturnSelfFunction<DocType>;\r\n lt: ReturnSelfFunction<DocType>;\r\n lte: ReturnSelfFunction<DocType>;\r\n ne: ReturnSelfFunction<DocType>;\r\n in: ReturnSelfFunction<DocType>;\r\n nin: ReturnSelfFunction<DocType>;\r\n all: ReturnSelfFunction<DocType>;\r\n regex: ReturnSelfFunction<DocType>;\r\n size: ReturnSelfFunction<DocType>;\r\n\r\n}\r\n\r\ndeclare type ReturnSelfFunction<DocType> = (v: any) => NoSqlQueryBuilder<DocType>;\r\ndeclare type ReturnSelfNumberFunction<DocType> = (v: number | null) => NoSqlQueryBuilder<DocType>;\r\n\r\n/**\r\n * limit, skip, maxScan, batchSize, comment\r\n *\r\n * Sets these associated options.\r\n *\r\n * query.comment('feed query');\r\n */\r\nexport const OTHER_MANGO_ATTRIBUTES = ['limit', 'skip', 'maxScan', 'batchSize', 'comment'];\r\nOTHER_MANGO_ATTRIBUTES.forEach(function (method) {\r\n (NoSqlQueryBuilderClass.prototype as any)[method] = function (v: any) {\r\n this.options[method] = v;\r\n return this;\r\n };\r\n});\r\n\r\n\r\n/**\r\n * gt, gte, lt, lte, ne, in, nin, all, regex, size, maxDistance\r\n *\r\n * Thing.where('type').nin(array)\r\n */\r\nexport const OTHER_MANGO_OPERATORS = [\r\n 'gt', 'gte', 'lt', 'lte', 'ne',\r\n 'in', 'nin', 'all', 'regex', 'size'\r\n];\r\nOTHER_MANGO_OPERATORS.forEach(function ($conditional) {\r\n (NoSqlQueryBuilderClass.prototype as any)[$conditional] = function () {\r\n let path;\r\n let val;\r\n\r\n if (1 === arguments.length) {\r\n this._ensurePath($conditional);\r\n val = arguments[0];\r\n path = this._path;\r\n } else {\r\n val = arguments[1];\r\n path = arguments[0];\r\n }\r\n\r\n const conds = this._conditions[path] === null || typeof this._conditions[path] === 'object' ?\r\n this._conditions[path] :\r\n (this._conditions[path] = {});\r\n\r\n\r\n\r\n if ($conditional === 'regex') {\r\n if (val instanceof RegExp) {\r\n throw newRxError('QU16', {\r\n field: path,\r\n query: this._conditions,\r\n });\r\n }\r\n if (typeof val === 'string') {\r\n conds['$' + $conditional] = val;\r\n } else {\r\n conds['$' + $conditional] = val.$regex;\r\n if (val.$options) {\r\n conds.$options = val.$options;\r\n }\r\n }\r\n } else {\r\n conds['$' + $conditional] = val;\r\n }\r\n\r\n return this;\r\n };\r\n});\r\n\r\n\r\nfunction push(opts: any, field: string, value: any) {\r\n if (Array.isArray(opts.sort)) {\r\n throw newRxTypeError('MQ6', {\r\n opts,\r\n field,\r\n value\r\n });\r\n }\r\n\r\n if (value && value.$meta) {\r\n const sort = opts.sort || (opts.sort = {});\r\n sort[field] = {\r\n $meta: value.$meta\r\n };\r\n return;\r\n }\r\n\r\n const val = String(value || 1).toLowerCase();\r\n if (!/^(?:ascending|asc|descending|desc|1|-1)$/.test(val)) {\r\n if (Array.isArray(value)) value = '[' + value + ']';\r\n throw newRxTypeError('MQ7', {\r\n field,\r\n value\r\n });\r\n }\r\n // store `sort` in a sane format\r\n const s = opts.sort || (opts.sort = {});\r\n const valueStr = value.toString()\r\n .replace('asc', '1')\r\n .replace('ascending', '1')\r\n .replace('desc', '-1')\r\n .replace('descending', '-1');\r\n s[field] = parseInt(valueStr, 10);\r\n}\r\n\r\nfunction _pushArr(opts: any, field: string, value: any) {\r\n opts.sort = opts.sort || [];\r\n if (!Array.isArray(opts.sort)) {\r\n throw newRxTypeError('MQ8', {\r\n opts,\r\n field,\r\n value\r\n });\r\n }\r\n\r\n /* const valueStr = value.toString()\r\n .replace('asc', '1')\r\n .replace('ascending', '1')\r\n .replace('desc', '-1')\r\n .replace('descending', '-1');*/\r\n opts.sort.push([field, value]);\r\n}\r\n\r\n\r\n/**\r\n * Determines if `conds` can be merged using `mquery().merge()`\r\n */\r\nexport function canMerge(conds: any): boolean {\r\n return conds instanceof NoSqlQueryBuilderClass || isObject(conds);\r\n}\r\n\r\n\r\nexport function createQueryBuilder<DocType>(query?: MangoQuery<DocType>, path?: any): NoSqlQueryBuilder<DocType> {\r\n return new NoSqlQueryBuilderClass(query, path) as NoSqlQueryBuilder<DocType>;\r\n}\r\n"],"mappings":";;;;;;;;;;;AAIA,IAAAA,YAAA,GAAAC,OAAA;AAIA,IAAAC,QAAA,GAAAD,OAAA;AARA;AACA;AACA;AACA;AAHA,IA0BaE,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA;EAO/B;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;EACI,SAAAA,uBACIE,UAAgC,EACzBC,KAAW,EACpB;IAAA,KAhBKC,OAAO,GAAkB,CAAC,CAAC;IAAA,KAC3BC,WAAW,GAAgC,CAAC,CAAC;IAAA,KAC7CC,OAAO,GAAQ,CAAC,CAAC;IAAA,KAabH,KAAW,GAAXA,KAAW;IAElB,IAAID,UAAU,EAAE;MACZ,IAAMK,YAAwC,GAAG,IAAW;MAE5D,IAAIL,UAAU,CAACM,QAAQ,EAAE;QACrBD,YAAY,CAACE,IAAI,CAACP,UAAU,CAACM,QAAQ,CAAC;MAC1C;MACA,IAAIN,UAAU,CAACQ,KAAK,EAAE;QAClBH,YAAY,CAACG,KAAK,CAACR,UAAU,CAACQ,KAAK,CAAC;MACxC;MACA,IAAIR,UAAU,CAACS,IAAI,EAAE;QACjBJ,YAAY,CAACI,IAAI,CAACT,UAAU,CAACS,IAAI,CAAC;MACtC;MACA,IAAIT,UAAU,CAACU,IAAI,EAAE;QACjBV,UAAU,CAACU,IAAI,CAACC,OAAO,CAACC,CAAC,IAAIP,YAAY,CAACK,IAAI,CAACE,CAAC,CAAC,CAAC;MACtD;IACJ;EACJ;;EAEA;AACJ;AACA;EAFI,IAAAC,MAAA,GAAAf,sBAAA,CAAAgB,SAAA;EAAAD,MAAA,CAGAE,KAAK,GAAL,SAAAA,KAAKA,CAACd,KAAa,EAAEe,IAAkC,EAA8B;IACjF,IAAI,CAACC,SAAS,CAACC,MAAM,EAAE,OAAO,IAAI;IAClC,IAAMC,IAAI,GAAG,OAAOF,SAAS,CAAC,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAKE,IAAI,EAAE;MACnB,IAAI,CAAClB,KAAK,GAAGgB,SAAS,CAAC,CAAC,CAAC;MACzB,IAAI,CAAC,KAAKA,SAAS,CAACC,MAAM,EAAE;QACvB,IAAI,CAACf,WAAW,CAAS,IAAI,CAACF,KAAK,CAAC,GAAGgB,SAAS,CAAC,CAAC,CAAC;MACxD;MACA,OAAO,IAAI;IACf;IAEA,IAAI,QAAQ,KAAKE,IAAI,IAAI,CAACC,KAAK,CAACC,OAAO,CAACJ,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;MACnD,OAAO,IAAI,CAACK,KAAK,CAACL,SAAS,CAAC,CAAC,CAAC,CAAC;IACnC;IAEA,MAAM,IAAAM,uBAAc,EAAC,KAAK,EAAE;MACxBC,IAAI,EAAEP,SAAS,CAAC,CAAC;IACrB,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;AACA;AACA,KAJI;EAAAJ,MAAA,CAKAY,MAAM,GAAN,SAAAA,MAAMA,CAACC,GAAQ,EAA8B;IACzC,IAAI,CAACC,WAAW,CAAC,QAAQ,CAAC;IAC1B,IAAMH,IAAI,GAAG,IAAI,CAACvB,KAAK;IACvB,IAAM2B,KAAK,GAAI,IAAI,CAACzB,WAAW,CAASqB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAQ,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,KAAK,QAAQ,GACxG,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAC7B,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAAG,CAAC,CAAE;IAC1CI,KAAK,CAACC,GAAG,GAAGH,GAAG;IACf,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA,KAHI;EAAAb,MAAA,CAIAiB,EAAE,GAAF,SAAAA,EAAEA,CAACJ,GAAQ,EAA8B;IACrC,IAAI,CAACC,WAAW,CAAC,IAAI,CAAC;IACtB,IAAMH,IAAI,GAAG,IAAI,CAACvB,KAAK;IACvB,IAAM2B,KAAK,GAAI,IAAI,CAACzB,WAAW,CAASqB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAQ,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,KAAK,QAAQ,GACxG,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAC7B,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAAG,CAAC,CAAE;IAC1CI,KAAK,CAACC,GAAG,GAAGH,GAAG;IACf,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA,KAJI;EAAAb,MAAA,CAKAkB,EAAE,GAAF,SAAAA,EAAEA,CAACC,KAAY,EAA8B;IACzC,IAAMD,EAAE,GAAG,IAAI,CAAC5B,WAAW,CAAC8B,GAAG,KAAK,IAAI,CAAC9B,WAAW,CAAC8B,GAAG,GAAG,EAAE,CAAC;IAC9D,IAAI,CAACb,KAAK,CAACC,OAAO,CAACW,KAAK,CAAC,EAAEA,KAAK,GAAG,CAACA,KAAK,CAAC;IAC1CD,EAAE,CAACG,IAAI,CAACC,KAAK,CAACJ,EAAE,EAAEC,KAAK,CAAC;IACxB,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA,KAJI;EAAAnB,MAAA,CAKAuB,GAAG,GAAH,SAAAA,GAAGA,CAACJ,KAAY,EAA8B;IAC1C,IAAMI,GAAG,GAAG,IAAI,CAACjC,WAAW,CAACkC,IAAI,KAAK,IAAI,CAAClC,WAAW,CAACkC,IAAI,GAAG,EAAE,CAAC;IACjE,IAAI,CAACjB,KAAK,CAACC,OAAO,CAACW,KAAK,CAAC,EAAEA,KAAK,GAAG,CAACA,KAAK,CAAC;IAC1CI,GAAG,CAACF,IAAI,CAACC,KAAK,CAACC,GAAG,EAAEJ,KAAK,CAAC;IAC1B,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA,KALI;EAAAnB,MAAA,CAMAyB,GAAG,GAAH,SAAAA,GAAGA,CAACN,KAAY,EAA8B;IAC1C,IAAMM,GAAG,GAAG,IAAI,CAACnC,WAAW,CAACoC,IAAI,KAAK,IAAI,CAACpC,WAAW,CAACoC,IAAI,GAAG,EAAE,CAAC;IACjE,IAAI,CAACnB,KAAK,CAACC,OAAO,CAACW,KAAK,CAAC,EAAEA,KAAK,GAAG,CAACA,KAAK,CAAC;IAC1CM,GAAG,CAACJ,IAAI,CAACC,KAAK,CAACG,GAAG,EAAEN,KAAK,CAAC;IAC1B,OAAO,IAAI;EACf;;EAEA;AACJ;AACA,KAFI;EAAAnB,MAAA,CAGA2B,GAAG,GAAH,SAAAA,GAAGA,CAACvC,KAAa,EAAEe,IAAY,EAA8B;IACzD,IAAIU,GAAG;IACP,IAAIF,IAAI;IAER,IAAI,CAAC,KAAKP,SAAS,CAACC,MAAM,EAAE;MACxB,IAAI,CAACS,WAAW,CAAC,KAAK,CAAC;MACvBD,GAAG,GAAGT,SAAS,CAAC,CAAC,CAAC;MAClBO,IAAI,GAAG,IAAI,CAACvB,KAAK;IACrB,CAAC,MAAM,IAAI,CAAC,KAAKgB,SAAS,CAACC,MAAM,IAAI,CAACE,KAAK,CAACC,OAAO,CAACJ,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;MAC/D,IAAI,CAACU,WAAW,CAAC,KAAK,CAAC;MACvBD,GAAG,GAAIT,SAAS,CAASwB,KAAK,CAAC,CAAC;MAChCjB,IAAI,GAAG,IAAI,CAACvB,KAAK;IACrB,CAAC,MAAM,IAAI,CAAC,KAAKgB,SAAS,CAACC,MAAM,EAAE;MAC/BQ,GAAG,GAAIT,SAAS,CAASwB,KAAK,CAAC,CAAC,CAAC;MACjCjB,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;IACvB,CAAC,MAAM;MACHS,GAAG,GAAGT,SAAS,CAAC,CAAC,CAAC;MAClBO,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;IACvB;IAEA,IAAMW,KAAK,GAAI,IAAI,CAACzB,WAAW,CAASqB,IAAI,CAAC,KAAM,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvFI,KAAK,CAACc,IAAI,GAAGhB,GAAG;IAChB,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,KAPI;EAAAb,MAAA,CAQA8B,MAAM,GAAN,SAAAA,MAAMA,CAAC1C,KAAa,EAAEe,IAAY,EAA8B;IAC5D,IAAIQ,IAAI;IACR,IAAIE,GAAG;IACP,IAAI,CAAC,KAAKT,SAAS,CAACC,MAAM,EAAE;MACxB,IAAI,CAACS,WAAW,CAAC,QAAQ,CAAC;MAC1BH,IAAI,GAAG,IAAI,CAACvB,KAAK;MACjByB,GAAG,GAAG,IAAI;IACd,CAAC,MAAM,IAAI,CAAC,KAAKT,SAAS,CAACC,MAAM,EAAE;MAC/B,IAAI,SAAS,KAAK,OAAOD,SAAS,CAAC,CAAC,CAAC,EAAE;QACnC,IAAI,CAACU,WAAW,CAAC,QAAQ,CAAC;QAC1BH,IAAI,GAAG,IAAI,CAACvB,KAAK;QACjByB,GAAG,GAAGT,SAAS,CAAC,CAAC,CAAC;MACtB,CAAC,MAAM;QACHO,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;QACnBS,GAAG,GAAG,IAAI;MACd;IACJ,CAAC,MAAM,IAAI,CAAC,KAAKT,SAAS,CAACC,MAAM,EAAE;MAC/BM,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;MACnBS,GAAG,GAAGT,SAAS,CAAC,CAAC,CAAC;IACtB;IAEA,IAAMW,KAAK,GAAI,IAAI,CAACzB,WAAW,CAASqB,IAAI,CAAC,KAAM,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvFI,KAAK,CAACgB,OAAO,GAAGlB,GAAG;IACnB,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAbI;EAAAb,MAAA,CAcAgC,SAAS,GAAT,SAAAA,SAASA,CAAC5C,KAAa,EAAE6C,SAAc,EAA8B;IACjE,IAAI,IAAI,KAAK7B,SAAS,CAAC,CAAC,CAAC,EACrB,MAAM,IAAAM,uBAAc,EAAC,KAAK,CAAC;IAE/B,IAAIwB,EAAE;IACN,IAAIvB,IAAI;IACR,IAAIwB,QAAQ;IAEZ,IAAI,UAAU,KAAK,OAAO/B,SAAS,CAAC,CAAC,CAAC,EAAE;MACpC,IAAI,CAACU,WAAW,CAAC,WAAW,CAAC;MAC7BH,IAAI,GAAG,IAAI,CAACvB,KAAK;MACjB8C,EAAE,GAAG9B,SAAS,CAAC,CAAC,CAAC;IACrB,CAAC,MAAM,IAAI,IAAAgC,qBAAQ,EAAChC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;MAC/B,IAAI,CAACU,WAAW,CAAC,WAAW,CAAC;MAC7BH,IAAI,GAAG,IAAI,CAACvB,KAAK;MACjB+C,QAAQ,GAAG/B,SAAS,CAAC,CAAC,CAAC;IAC3B,CAAC,MAAM,IAAI,UAAU,KAAK,OAAOA,SAAS,CAAC,CAAC,CAAC,EAAE;MAC3CO,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;MACnB8B,EAAE,GAAG9B,SAAS,CAAC,CAAC,CAAC;IACrB,CAAC,MAAM,IAAIA,SAAS,CAAC,CAAC,CAAC,IAAI,IAAAgC,qBAAQ,EAAChC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;MAC/CO,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;MACnB+B,QAAQ,GAAG/B,SAAS,CAAC,CAAC,CAAC;IAC3B,CAAC,MACG,MAAM,IAAAM,uBAAc,EAAC,KAAK,CAAC;IAE/B,IAAIwB,EAAE,EAAE;MACJC,QAAQ,GAAG,IAAIlD,sBAAsB,CAAD,CAAC;MACrCiD,EAAE,CAACC,QAAQ,CAAC;MACZA,QAAQ,GAAGA,QAAQ,CAAC7C,WAAW;IACnC;IAEA,IAAMyB,KAAK,GAAI,IAAI,CAACzB,WAAW,CAASqB,IAAI,CAAC,KAAM,IAAI,CAACrB,WAAW,CAASqB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvFI,KAAK,CAACsB,UAAU,GAAGF,QAAQ;IAC3B,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KATI;EAAAnC,MAAA,CAUAH,IAAI,GAAJ,SAAAA,IAAIA,CAACyC,GAAQ,EAA8B;IACvC,IAAI,CAACA,GAAG,EAAE,OAAO,IAAI;IACrB,IAAIC,GAAG;IACP,IAAMjC,IAAI,GAAG,OAAOgC,GAAG;IACvB;IACA,IAAI/B,KAAK,CAACC,OAAO,CAAC8B,GAAG,CAAC,EAAE;MACpBC,GAAG,GAAGD,GAAG,CAACjC,MAAM;MAChB,KAAK,IAAImC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,GAAG,CAACjC,MAAM,EAAE,EAAEmC,CAAC,EAAE;QACjCC,QAAQ,CAAC,IAAI,CAACpD,OAAO,EAAEiD,GAAG,CAACE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAEF,GAAG,CAACE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAChD;MAEA,OAAO,IAAI;IACf;;IAEA;IACA,IAAI,CAAC,KAAKpC,SAAS,CAACC,MAAM,IAAI,QAAQ,KAAKC,IAAI,EAAE;MAC7CgC,GAAG,GAAGA,GAAG,CAACI,KAAK,CAAC,KAAK,CAAC;MACtBH,GAAG,GAAGD,GAAG,CAACjC,MAAM;MAChB,KAAK,IAAImC,EAAC,GAAG,CAAC,EAAEA,EAAC,GAAGD,GAAG,EAAE,EAAEC,EAAC,EAAE;QAC1B,IAAIG,KAAK,GAAGL,GAAG,CAACE,EAAC,CAAC;QAClB,IAAI,CAACG,KAAK,EAAE;QACZ,IAAMC,MAAM,GAAG,GAAG,KAAKD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACxC,IAAIC,MAAM,KAAK,CAAC,CAAC,EAAED,KAAK,GAAGA,KAAK,CAACE,SAAS,CAAC,CAAC,CAAC;QAC7CxB,IAAI,CAAC,IAAI,CAAChC,OAAO,EAAEsD,KAAK,EAAEC,MAAM,CAAC;MACrC;MAEA,OAAO,IAAI;IACf;;IAEA;IACA,IAAI,IAAAR,qBAAQ,EAACE,GAAG,CAAC,EAAE;MACf,IAAMQ,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACR,GAAG,CAAC;MAC7BQ,IAAI,CAAChD,OAAO,CAAC6C,KAAK,IAAItB,IAAI,CAAC,IAAI,CAAChC,OAAO,EAAEsD,KAAK,EAAEL,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC;MAC5D,OAAO,IAAI;IACf;IAEA,MAAM,IAAAjC,uBAAc,EAAC,KAAK,EAAE;MACxBsC,IAAI,EAAE5C;IACV,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;AACA;AACA;AACA,KALI;EAAAJ,MAAA,CAMAS,KAAK,GAAL,SAAAA,KAAKA,CAACwC,MAAW,EAA8B;IAC3C,IAAI,CAACA,MAAM,EAAE;MACT,OAAO,IAAI;IACf;IAEA,IAAI,CAACC,QAAQ,CAACD,MAAM,CAAC,EAAE;MACnB,MAAM,IAAAvC,uBAAc,EAAC,KAAK,EAAE;QACxBuC;MACJ,CAAC,CAAC;IACN;IAEA,IAAIA,MAAM,YAAYhE,sBAAsB,EAAE;MAC1C;;MAEA,IAAIgE,MAAM,CAAC3D,WAAW,EAClB,IAAAmB,kBAAK,EAAC,IAAI,CAACnB,WAAW,EAAE2D,MAAM,CAAC3D,WAAW,CAAC;MAE/C,IAAI2D,MAAM,CAAC1D,OAAO,EAAE;QAChB,IAAI,CAAC,IAAI,CAACA,OAAO,EAAE,IAAI,CAACA,OAAO,GAAG,CAAC,CAAC;QACpC,IAAAkB,kBAAK,EAAC,IAAI,CAAClB,OAAO,EAAE0D,MAAM,CAAC1D,OAAO,CAAC;MACvC;MAEA,IAAI0D,MAAM,CAAC5D,OAAO,EAAE;QAChB,IAAI,CAAC,IAAI,CAACA,OAAO,EAAE,IAAI,CAACA,OAAO,GAAG,CAAC,CAAC;QACpC,IAAAoB,kBAAK,EAAC,IAAI,CAACpB,OAAO,EAAE4D,MAAM,CAAC5D,OAAO,CAAC;MACvC;MAEA,IAAI4D,MAAM,CAACE,SAAS,EAChB,IAAI,CAACA,SAAS,GAAGF,MAAM,CAACE,SAAS;MAErC,OAAO,IAAI;IACf;;IAEA;IACA,IAAA1C,kBAAK,EAAC,IAAI,CAACnB,WAAW,EAAE2D,MAAM,CAAC;IAE/B,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA;AACA,KALI;EAAAjD,MAAA,CAMAN,IAAI,GAAJ,SAAAA,IAAIA,CAACyC,QAAa,EAA8B;IAC5C,IAAIe,QAAQ,CAACf,QAAQ,CAAC,EAAE;MACpB,IAAI,CAAC1B,KAAK,CAAC0B,QAAQ,CAAC;IACxB;IAEA,OAAO,IAAI;EACf;;EAEA;AACJ;AACA;AACA;AACA,KAJI;EAAAnC,MAAA,CAKAc,WAAW,GAAX,SAAAA,WAAWA,CAACsC,MAAW,EAAE;IACrB,IAAI,CAAC,IAAI,CAAChE,KAAK,EAAE;MACb,MAAM,IAAAiE,mBAAU,EAAC,KAAK,EAAE;QACpBD;MACJ,CAAC,CAAC;IACN;EACJ,CAAC;EAAApD,MAAA,CAEDsD,MAAM,GAAN,SAAAA,MAAMA,CAAA,EAGJ;IACE,IAAMC,KAA0B,GAAG;MAC/B9D,QAAQ,EAAE,IAAI,CAACH;IACnB,CAAC;IAED,IAAI,IAAI,CAACD,OAAO,CAACO,IAAI,EAAE;MACnB2D,KAAK,CAAC3D,IAAI,GAAG,IAAI,CAACP,OAAO,CAACO,IAAI;IAClC;IACA,IAAI,IAAI,CAACP,OAAO,CAACM,KAAK,EAAE;MACpB4D,KAAK,CAAC5D,KAAK,GAAG,IAAI,CAACN,OAAO,CAACM,KAAK;IACpC;IACA,IAAI,IAAI,CAACN,OAAO,CAACQ,IAAI,EAAE;MACnB0D,KAAK,CAAC1D,IAAI,GAAG2D,oBAAoB,CAAC,IAAI,CAACnE,OAAO,CAACQ,IAAI,CAAC;IACxD;IAEA,OAAO;MACH0D,KAAK;MACL5C,IAAI,EAAE,IAAI,CAACvB;IACf,CAAC;EACL,CAAC;EAAA,OAAAH,sBAAA;AAAA;AAGE,SAASuE,oBAAoBA,CAChC3D,IAA8B,EACD;EAC7B,OAAOkD,MAAM,CAACU,OAAO,CAAC5D,IAAI,CAAC,CAAC6D,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAK;IACxC,IAAMC,SAAkC,GAAGD,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM;IACnE,IAAME,IAAiC,GAAG;MAAE,CAACH,CAAC,GAAGE;IAAU,CAAQ;IACnE,OAAOC,IAAI;EACf,CAAC,CAAC;AACN;;AAEA;AACA;AACA;AACA;;AAyBA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,IAAMC,sBAAsB,GAAA7E,OAAA,CAAA6E,sBAAA,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC;AAC1FA,sBAAsB,CAACjE,OAAO,CAAC,UAAUsD,MAAM,EAAE;EAC5CnE,sBAAsB,CAACgB,SAAS,CAASmD,MAAM,CAAC,GAAG,UAAUQ,CAAM,EAAE;IAClE,IAAI,CAACvE,OAAO,CAAC+D,MAAM,CAAC,GAAGQ,CAAC;IACxB,OAAO,IAAI;EACf,CAAC;AACL,CAAC,CAAC;;AAGF;AACA;AACA;AACA;AACA;AACO,IAAMI,qBAAqB,GAAA9E,OAAA,CAAA8E,qBAAA,GAAG,CACjC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAC9B,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CACtC;AACDA,qBAAqB,CAAClE,OAAO,CAAC,UAAUmE,YAAY,EAAE;EACjDhF,sBAAsB,CAACgB,SAAS,CAASgE,YAAY,CAAC,GAAG,YAAY;IAClE,IAAItD,IAAI;IACR,IAAIE,GAAG;IAEP,IAAI,CAAC,KAAKT,SAAS,CAACC,MAAM,EAAE;MACxB,IAAI,CAACS,WAAW,CAACmD,YAAY,CAAC;MAC9BpD,GAAG,GAAGT,SAAS,CAAC,CAAC,CAAC;MAClBO,IAAI,GAAG,IAAI,CAACvB,KAAK;IACrB,CAAC,MAAM;MACHyB,GAAG,GAAGT,SAAS,CAAC,CAAC,CAAC;MAClBO,IAAI,GAAGP,SAAS,CAAC,CAAC,CAAC;IACvB;IAEA,IAAMW,KAAK,GAAG,IAAI,CAACzB,WAAW,CAACqB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,CAACrB,WAAW,CAACqB,IAAI,CAAC,KAAK,QAAQ,GACvF,IAAI,CAACrB,WAAW,CAACqB,IAAI,CAAC,GACrB,IAAI,CAACrB,WAAW,CAACqB,IAAI,CAAC,GAAG,CAAC,CAAE;IAIjC,IAAIsD,YAAY,KAAK,OAAO,EAAE;MAC1B,IAAIpD,GAAG,YAAYqD,MAAM,EAAE;QACvB,MAAM,IAAAb,mBAAU,EAAC,MAAM,EAAE;UACrBV,KAAK,EAAEhC,IAAI;UACX4C,KAAK,EAAE,IAAI,CAACjE;QAChB,CAAC,CAAC;MACN;MACA,IAAI,OAAOuB,GAAG,KAAK,QAAQ,EAAE;QACzBE,KAAK,CAAC,GAAG,GAAGkD,YAAY,CAAC,GAAGpD,GAAG;MACnC,CAAC,MAAM;QACHE,KAAK,CAAC,GAAG,GAAGkD,YAAY,CAAC,GAAGpD,GAAG,CAACsD,MAAM;QACtC,IAAItD,GAAG,CAACuD,QAAQ,EAAE;UACdrD,KAAK,CAACqD,QAAQ,GAAGvD,GAAG,CAACuD,QAAQ;QACjC;MACJ;IACJ,CAAC,MAAM;MACHrD,KAAK,CAAC,GAAG,GAAGkD,YAAY,CAAC,GAAGpD,GAAG;IACnC;IAEA,OAAO,IAAI;EACf,CAAC;AACL,CAAC,CAAC;AAGF,SAASQ,IAAIA,CAACgD,IAAS,EAAE1B,KAAa,EAAE2B,KAAU,EAAE;EAChD,IAAI/D,KAAK,CAACC,OAAO,CAAC6D,IAAI,CAACxE,IAAI,CAAC,EAAE;IAC1B,MAAM,IAAAa,uBAAc,EAAC,KAAK,EAAE;MACxB2D,IAAI;MACJ1B,KAAK;MACL2B;IACJ,CAAC,CAAC;EACN;EAEA,IAAIA,KAAK,IAAIA,KAAK,CAACC,KAAK,EAAE;IACtB,IAAM1E,IAAI,GAAGwE,IAAI,CAACxE,IAAI,KAAKwE,IAAI,CAACxE,IAAI,GAAG,CAAC,CAAC,CAAC;IAC1CA,IAAI,CAAC8C,KAAK,CAAC,GAAG;MACV4B,KAAK,EAAED,KAAK,CAACC;IACjB,CAAC;IACD;EACJ;EAEA,IAAM1D,GAAG,GAAG2D,MAAM,CAACF,KAAK,IAAI,CAAC,CAAC,CAACG,WAAW,CAAC,CAAC;EAC5C,IAAI,CAAC,0CAA0C,CAACC,IAAI,CAAC7D,GAAG,CAAC,EAAE;IACvD,IAAIN,KAAK,CAACC,OAAO,CAAC8D,KAAK,CAAC,EAAEA,KAAK,GAAG,GAAG,GAAGA,KAAK,GAAG,GAAG;IACnD,MAAM,IAAA5D,uBAAc,EAAC,KAAK,EAAE;MACxBiC,KAAK;MACL2B;IACJ,CAAC,CAAC;EACN;EACA;EACA,IAAMvE,CAAC,GAAGsE,IAAI,CAACxE,IAAI,KAAKwE,IAAI,CAACxE,IAAI,GAAG,CAAC,CAAC,CAAC;EACvC,IAAM8E,QAAQ,GAAGL,KAAK,CAACM,QAAQ,CAAC,CAAC,CAC5BC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CACzBA,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CACrBA,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;EAChC9E,CAAC,CAAC4C,KAAK,CAAC,GAAGmC,QAAQ,CAACH,QAAQ,EAAE,EAAE,CAAC;AACrC;AAEA,SAASlC,QAAQA,CAAC4B,IAAS,EAAE1B,KAAa,EAAE2B,KAAU,EAAE;EACpDD,IAAI,CAACxE,IAAI,GAAGwE,IAAI,CAACxE,IAAI,IAAI,EAAE;EAC3B,IAAI,CAACU,KAAK,CAACC,OAAO,CAAC6D,IAAI,CAACxE,IAAI,CAAC,EAAE;IAC3B,MAAM,IAAAa,uBAAc,EAAC,KAAK,EAAE;MACxB2D,IAAI;MACJ1B,KAAK;MACL2B;IACJ,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;AACA;AACA;EACID,IAAI,CAACxE,IAAI,CAACwB,IAAI,CAAC,CAACsB,KAAK,EAAE2B,KAAK,CAAC,CAAC;AAClC;;AAGA;AACA;AACA;AACO,SAASpB,QAAQA,CAACnC,KAAU,EAAW;EAC1C,OAAOA,KAAK,YAAY9B,sBAAsB,IAAI,IAAAmD,qBAAQ,EAACrB,KAAK,CAAC;AACrE;AAGO,SAASgE,kBAAkBA,CAAUxB,KAA2B,EAAE5C,IAAU,EAA8B;EAC7G,OAAO,IAAI1B,sBAAsB,CAACsE,KAAK,EAAE5C,IAAI,CAAC;AAClD","ignoreList":[]}
|
|
@@ -154,7 +154,7 @@ var RxReplicationState = exports.RxReplicationState = /*#__PURE__*/function () {
|
|
|
154
154
|
conflictHandler: this.collection.conflictHandler,
|
|
155
155
|
waitBeforePersist: this.push ? this.push.waitBeforePersist : undefined,
|
|
156
156
|
replicationHandler: {
|
|
157
|
-
masterChangeStream$: this.remoteEvents$.asObservable().pipe((0, _rxjs.filter)(_v => !!this.pull), (0, _rxjs.mergeMap)(async ev => {
|
|
157
|
+
masterChangeStream$: this.remoteEvents$.asObservable().pipe((0, _rxjs.filter)(_v => !!this.pull || _v === 'RESYNC'), (0, _rxjs.mergeMap)(async ev => {
|
|
158
158
|
if (ev === 'RESYNC') {
|
|
159
159
|
return ev;
|
|
160
160
|
}
|
|
@@ -402,13 +402,51 @@ var RxReplicationState = exports.RxReplicationState = /*#__PURE__*/function () {
|
|
|
402
402
|
this.subjects.error.complete();
|
|
403
403
|
this.subjects.received.complete();
|
|
404
404
|
this.subjects.sent.complete();
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Remove from the REPLICATION_STATE_BY_COLLECTION registry
|
|
408
|
+
* so that the cleanup plugin does not try to access a stopped
|
|
409
|
+
* replication's meta instance, and to prevent memory leaks
|
|
410
|
+
* from accumulating canceled replication state objects.
|
|
411
|
+
*/
|
|
412
|
+
var states = REPLICATION_STATE_BY_COLLECTION.get(this.collection);
|
|
413
|
+
if (states) {
|
|
414
|
+
var idx = states.indexOf(this);
|
|
415
|
+
if (idx !== -1) {
|
|
416
|
+
states.splice(idx, 1);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
405
419
|
return Promise.all(promises);
|
|
406
420
|
};
|
|
407
421
|
_proto.remove = async function remove() {
|
|
408
422
|
this.startQueue = this.startQueue.then(async () => {
|
|
409
423
|
var metaInfo = await this.metaInfoPromise;
|
|
410
424
|
await this._cancel(true);
|
|
411
|
-
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* If the replication was never started (e.g. autoStart: false
|
|
428
|
+
* and start() was never called), we still have to
|
|
429
|
+
* create the meta storage instance and then remove its data.
|
|
430
|
+
* This is required so that old meta data from a previous
|
|
431
|
+
* replication with the same identifier is properly deleted.
|
|
432
|
+
*/
|
|
433
|
+
if (!this.metaInstance) {
|
|
434
|
+
var database = this.collection.database;
|
|
435
|
+
this.metaInstance = await database.storage.createStorageInstance({
|
|
436
|
+
databaseName: database.name,
|
|
437
|
+
collectionName: metaInfo.collectionName,
|
|
438
|
+
databaseInstanceToken: database.token,
|
|
439
|
+
multiInstance: database.multiInstance,
|
|
440
|
+
options: {},
|
|
441
|
+
schema: metaInfo.schema,
|
|
442
|
+
password: database.password,
|
|
443
|
+
devMode: _overwritable.overwritable.isDevMode()
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
if (this.internalReplicationState) {
|
|
447
|
+
await this.internalReplicationState.checkpointQueue;
|
|
448
|
+
}
|
|
449
|
+
await (0, _index2.ensureNotFalsy)(this.metaInstance).remove();
|
|
412
450
|
await (0, _rxDatabaseInternalStore.removeConnectedStorageFromCollection)(this.collection, metaInfo.collectionName, metaInfo.schema);
|
|
413
451
|
});
|
|
414
452
|
return this.startQueue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_rxjs","require","_index","_index2","_index3","_rxError","_replicationHelper","_rxDatabaseInternalStore","_plugin","_rxStorageHelper","_overwritable","_hooks","REPLICATION_STATE_BY_COLLECTION","exports","WeakMap","RxReplicationState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","toggleOnDocumentVisible","subs","subjects","received","Subject","sent","error","canceled","BehaviorSubject","active","received$","asObservable","sent$","error$","canceled$","active$","wasStarted","startQueue","PROMISE_RESOLVE_VOID","onCancel","callOnStart","undefined","remoteEvents$","metaInfoPromise","metaInstanceCollectionName","database","hashFunction","name","join","metaInstanceSchema","getRxReplicationMetaInstanceSchema","schema","jsonSchema","hasEncryption","collectionName","replicationStates","getFromMapOrCreate","onClose","cancel","Object","keys","forEach","key","defineProperty","get","startPromise","Promise","res","_proto","prototype","start","then","_start","isStopped","internalReplicationState","events","paused","next","reSync","preventHibernateBrowserTab","pullModifier","modifier","DEFAULT_MODIFIER","pushModifier","metaInfo","metaInstance","all","storage","createStorageInstance","databaseName","databaseInstanceToken","token","multiInstance","options","password","devMode","overwritable","isDevMode","addConnectedStorageToCollection","replicateRxStorageInstance","pushBatchSize","batchSize","pullBatchSize","initialCheckpoint","upstream","downstream","forkInstance","storageInstance","skipStoringPullMeta","identifier","conflictHandler","waitBeforePersist","replicationHandler","masterChangeStream$","pipe","filter","_v","mergeMap","ev","useEv","flatClone","documents","handlePulledDocuments","map","d","masterChangesSince","checkpoint","done","result","isStoppedOrPaused","handler","err","emitError","newRxError","errors","toArray","er","errorToPlainJson","direction","awaitRetry","ensureNotFalsy","useResult","masterWrite","rows","runAsyncPluginHooks","useRowsOrNull","row","newDocumentState","assumedMasterState","swapDefaultDeletedTodeletedField","useRows","arrayFilterNotEmpty","length","Array","isArray","pushRows","args","rxdb","conflicts","subscribe","processed","down","document","up","writeToMasterRow","combineLatest","isActive","stream$","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","_cancel","pause","isPaused","getValue","awaitInitialReplication","awaitInSync","t","requestIdlePromise","emitEvent","catch","doNotClose","PROMISE_RESOLVE_FALSE","promises","fn","toPromise","cancelRxStorageReplication","checkpointQueue","close","sub","unsubscribe","complete","remove","removeConnectedStorageFromCollection","replicateRxCollection","waitForLeadership","addRxPlugin","RxDBLeaderElectionPlugin","replicationState","addEventListener","visibilityState","isVisible","isLeader","removeEventListener","startReplicationOnLeaderShip","mustWaitForLeadership","waitTillRun","PROMISE_RESOLVE_TRUE"],"sources":["../../../../src/plugins/replication/index.ts"],"sourcesContent":["/**\r\n * This plugin contains the primitives to create\r\n * a RxDB client-server replication.\r\n * It is used in the other replication plugins\r\n * but also can be used as standalone with a custom replication handler.\r\n */\r\n\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n filter,\r\n mergeMap,\r\n Observable,\r\n Subject,\r\n Subscription\r\n} from 'rxjs';\r\nimport type {\r\n BulkWriteRow,\r\n ReplicationOptions,\r\n ReplicationPullHandlerResult,\r\n ReplicationPullOptions,\r\n ReplicationPushOptions,\r\n RxCollection,\r\n RxDocumentData,\r\n RxError,\r\n RxJsonSchema,\r\n RxReplicationPullStreamItem,\r\n RxReplicationWriteToMasterRow,\r\n RxStorageInstance,\r\n RxStorageInstanceReplicationState,\r\n RxStorageReplicationMeta,\r\n RxTypeError,\r\n WithDeleted\r\n} from '../../types/index.d.ts';\r\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\r\nimport {\r\n arrayFilterNotEmpty,\r\n ensureNotFalsy,\r\n errorToPlainJson,\r\n flatClone,\r\n getFromMapOrCreate,\r\n PROMISE_RESOLVE_FALSE,\r\n PROMISE_RESOLVE_TRUE,\r\n PROMISE_RESOLVE_VOID,\r\n toArray,\r\n toPromise\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n awaitRxStorageReplicationFirstInSync,\r\n awaitRxStorageReplicationInSync,\r\n cancelRxStorageReplication,\r\n getRxReplicationMetaInstanceSchema,\r\n replicateRxStorageInstance\r\n} from '../../replication-protocol/index.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\nimport {\r\n awaitRetry,\r\n DEFAULT_MODIFIER,\r\n swapDefaultDeletedTodeletedField,\r\n handlePulledDocuments,\r\n preventHibernateBrowserTab\r\n} from './replication-helper.ts';\r\nimport {\r\n addConnectedStorageToCollection,\r\n removeConnectedStorageFromCollection\r\n} from '../../rx-database-internal-store.ts';\r\nimport { addRxPlugin } from '../../plugin.ts';\r\nimport { hasEncryption } from '../../rx-storage-helper.ts';\r\nimport { overwritable } from '../../overwritable.ts';\r\nimport {\r\n runAsyncPluginHooks\r\n} from '../../hooks.ts';\r\n\r\n\r\nexport const REPLICATION_STATE_BY_COLLECTION: WeakMap<RxCollection, RxReplicationState<any, any>[]> = new WeakMap();\r\n\r\nexport class RxReplicationState<RxDocType, CheckpointType> {\r\n public readonly subs: Subscription[] = [];\r\n public readonly subjects = {\r\n received: new Subject<RxDocumentData<RxDocType>>(), // all documents that are received from the endpoint\r\n sent: new Subject<WithDeleted<RxDocType>>(), // all documents that are sent to the endpoint\r\n error: new Subject<RxError | RxTypeError>(), // all errors that are received from the endpoint, emits new Error() objects\r\n canceled: new BehaviorSubject<boolean>(false), // true when the replication was canceled\r\n active: new BehaviorSubject<boolean>(false) // true when something is running, false when not\r\n };\r\n\r\n readonly received$: Observable<RxDocumentData<RxDocType>> = this.subjects.received.asObservable();\r\n readonly sent$: Observable<WithDeleted<RxDocType>> = this.subjects.sent.asObservable();\r\n readonly error$: Observable<RxError | RxTypeError> = this.subjects.error.asObservable();\r\n readonly canceled$: Observable<any> = this.subjects.canceled.asObservable();\r\n readonly active$: Observable<boolean> = this.subjects.active.asObservable();\r\n\r\n wasStarted: boolean = false;\r\n\r\n readonly metaInfoPromise: Promise<{ collectionName: string, schema: RxJsonSchema<RxDocumentData<RxStorageReplicationMeta<RxDocType, any>>> }>;\r\n\r\n public startPromise: Promise<void>;\r\n\r\n /**\r\n * start/pause/cancel/remove must never run\r\n * in parallel to avoid a wide range of bugs.\r\n */\r\n public startQueue: Promise<any> = PROMISE_RESOLVE_VOID;\r\n\r\n public onCancel: (() => void)[] = [];\r\n\r\n constructor(\r\n /**\r\n * The identifier, used to flag revisions\r\n * and to identify which documents state came from the remote.\r\n */\r\n public readonly replicationIdentifier: string,\r\n public readonly collection: RxCollection<RxDocType, unknown, unknown, unknown>,\r\n public readonly deletedField: string,\r\n public readonly pull?: ReplicationPullOptions<RxDocType, CheckpointType>,\r\n public readonly push?: ReplicationPushOptions<RxDocType>,\r\n public readonly live?: boolean,\r\n public retryTime?: number,\r\n public autoStart?: boolean,\r\n public toggleOnDocumentVisible?: boolean\r\n ) {\r\n this.metaInfoPromise = (async () => {\r\n const metaInstanceCollectionName = 'rx-replication-meta-' + await collection.database.hashFunction([\r\n this.collection.name,\r\n this.replicationIdentifier\r\n ].join('-'));\r\n const metaInstanceSchema = getRxReplicationMetaInstanceSchema(\r\n this.collection.schema.jsonSchema,\r\n hasEncryption(this.collection.schema.jsonSchema)\r\n );\r\n return {\r\n collectionName: metaInstanceCollectionName,\r\n schema: metaInstanceSchema\r\n };\r\n })();\r\n const replicationStates = getFromMapOrCreate(\r\n REPLICATION_STATE_BY_COLLECTION,\r\n collection,\r\n () => []\r\n );\r\n replicationStates.push(this);\r\n\r\n // stop the replication when the collection gets closed\r\n this.collection.onClose.push(() => this.cancel());\r\n\r\n // create getters for the observables\r\n Object.keys(this.subjects).forEach(key => {\r\n Object.defineProperty(this, key + '$', {\r\n get: function () {\r\n return this.subjects[key].asObservable();\r\n }\r\n });\r\n });\r\n const startPromise = new Promise<void>(res => {\r\n this.callOnStart = res;\r\n });\r\n this.startPromise = startPromise;\r\n }\r\n\r\n private callOnStart: () => void = undefined as any;\r\n\r\n public internalReplicationState?: RxStorageInstanceReplicationState<RxDocType>;\r\n public metaInstance?: RxStorageInstance<RxStorageReplicationMeta<RxDocType, CheckpointType>, any, {}, any>;\r\n public remoteEvents$: Subject<RxReplicationPullStreamItem<RxDocType, CheckpointType>> = new Subject();\r\n\r\n\r\n public start(): Promise<void> {\r\n this.startQueue = this.startQueue.then(() => {\r\n return this._start();\r\n });\r\n return this.startQueue;\r\n }\r\n\r\n public async _start(): Promise<void> {\r\n if (this.isStopped()) {\r\n return;\r\n }\r\n\r\n if (this.internalReplicationState) {\r\n this.internalReplicationState.events.paused.next(false);\r\n }\r\n\r\n /**\r\n * If started after a pause,\r\n * just re-sync once and continue.\r\n */\r\n if (this.wasStarted) {\r\n this.reSync();\r\n return;\r\n }\r\n this.wasStarted = true;\r\n\r\n\r\n if (!this.toggleOnDocumentVisible) {\r\n preventHibernateBrowserTab(this);\r\n }\r\n\r\n // fill in defaults for pull & push\r\n const pullModifier = this.pull && this.pull.modifier ? this.pull.modifier : DEFAULT_MODIFIER;\r\n const pushModifier = this.push && this.push.modifier ? this.push.modifier : DEFAULT_MODIFIER;\r\n\r\n const database = this.collection.database;\r\n const metaInfo = await this.metaInfoPromise;\r\n\r\n const [metaInstance] = await Promise.all([\r\n this.collection.database.storage.createStorageInstance<RxStorageReplicationMeta<RxDocType, CheckpointType>>({\r\n databaseName: database.name,\r\n collectionName: metaInfo.collectionName,\r\n databaseInstanceToken: database.token,\r\n multiInstance: database.multiInstance,\r\n options: {},\r\n schema: metaInfo.schema,\r\n password: database.password,\r\n devMode: overwritable.isDevMode()\r\n }),\r\n addConnectedStorageToCollection(\r\n this.collection,\r\n metaInfo.collectionName,\r\n metaInfo.schema\r\n )\r\n ]);\r\n this.metaInstance = metaInstance;\r\n\r\n this.internalReplicationState = replicateRxStorageInstance({\r\n pushBatchSize: this.push && this.push.batchSize ? this.push.batchSize : 100,\r\n pullBatchSize: this.pull && this.pull.batchSize ? this.pull.batchSize : 100,\r\n initialCheckpoint: {\r\n upstream: this.push ? this.push.initialCheckpoint : undefined,\r\n downstream: this.pull ? this.pull.initialCheckpoint : undefined\r\n },\r\n forkInstance: this.collection.storageInstance,\r\n metaInstance: this.metaInstance,\r\n hashFunction: database.hashFunction,\r\n skipStoringPullMeta: this.push ? false : true,\r\n identifier: 'rxdbreplication' + this.replicationIdentifier,\r\n conflictHandler: this.collection.conflictHandler,\r\n waitBeforePersist: this.push ? this.push.waitBeforePersist : undefined,\r\n replicationHandler: {\r\n masterChangeStream$: this.remoteEvents$.asObservable().pipe(\r\n filter((_v: RxReplicationPullStreamItem<RxDocType, CheckpointType>) => !!this.pull),\r\n mergeMap(async (ev: RxReplicationPullStreamItem<RxDocType, CheckpointType>) => {\r\n if (ev === 'RESYNC') {\r\n return ev;\r\n }\r\n const useEv = flatClone(ev);\r\n useEv.documents = handlePulledDocuments(this.collection, this.deletedField, useEv.documents);\r\n useEv.documents = await Promise.all(\r\n useEv.documents.map((d: WithDeleted<RxDocType>) => pullModifier(d))\r\n );\r\n return useEv;\r\n })\r\n ),\r\n masterChangesSince: async (\r\n checkpoint: CheckpointType | undefined,\r\n batchSize: number\r\n ) => {\r\n if (!this.pull) {\r\n return {\r\n checkpoint: null,\r\n documents: []\r\n };\r\n }\r\n /**\r\n * Retries must be done here in the replication primitives plugin,\r\n * because the replication protocol itself has no\r\n * error handling.\r\n */\r\n let done = false;\r\n let result: ReplicationPullHandlerResult<RxDocType, CheckpointType> = {} as any;\r\n while (!done && !this.isStoppedOrPaused()) {\r\n try {\r\n result = await this.pull.handler(\r\n checkpoint,\r\n batchSize\r\n );\r\n done = true;\r\n } catch (err: any | Error | Error[]) {\r\n const emitError = newRxError('RC_PULL', {\r\n checkpoint,\r\n errors: toArray(err).map(er => errorToPlainJson(er)),\r\n direction: 'pull'\r\n });\r\n this.subjects.error.next(emitError);\r\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\r\n }\r\n }\r\n\r\n if (this.isStoppedOrPaused()) {\r\n return {\r\n checkpoint: null,\r\n documents: []\r\n };\r\n }\r\n\r\n const useResult = flatClone(result);\r\n useResult.documents = handlePulledDocuments(this.collection, this.deletedField, useResult.documents);\r\n useResult.documents = await Promise.all(\r\n useResult.documents.map(d => pullModifier(d))\r\n );\r\n return useResult;\r\n },\r\n masterWrite: async (\r\n rows: RxReplicationWriteToMasterRow<RxDocType>[]\r\n ) => {\r\n if (!this.push) {\r\n return [];\r\n }\r\n let done = false;\r\n\r\n await runAsyncPluginHooks('preReplicationMasterWrite', {\r\n rows,\r\n collection: this.collection\r\n });\r\n\r\n const useRowsOrNull = await Promise.all(\r\n rows.map(async (row) => {\r\n row.newDocumentState = await pushModifier(row.newDocumentState);\r\n if (row.newDocumentState === null) {\r\n return null;\r\n }\r\n if (row.assumedMasterState) {\r\n row.assumedMasterState = await pushModifier(row.assumedMasterState);\r\n }\r\n if (this.deletedField !== '_deleted') {\r\n row.newDocumentState = swapDefaultDeletedTodeletedField(this.deletedField, row.newDocumentState) as any;\r\n if (row.assumedMasterState) {\r\n row.assumedMasterState = swapDefaultDeletedTodeletedField(this.deletedField, row.assumedMasterState) as any;\r\n }\r\n }\r\n return row;\r\n })\r\n );\r\n const useRows: RxReplicationWriteToMasterRow<RxDocType>[] = useRowsOrNull.filter(arrayFilterNotEmpty);\r\n\r\n let result: WithDeleted<RxDocType>[] = null as any;\r\n\r\n // In case all the rows have been filtered and nothing has to be sent\r\n if (useRows.length === 0) {\r\n done = true;\r\n result = [];\r\n }\r\n\r\n while (!done && !this.isStoppedOrPaused()) {\r\n try {\r\n result = await this.push.handler(useRows);\r\n /**\r\n * It is a common problem that people have wrongly behaving backend\r\n * that do not return an array with the conflicts on push requests.\r\n * So we run this check here to make it easier to debug.\r\n * @link https://github.com/pubkey/rxdb/issues/4103\r\n */\r\n if (!Array.isArray(result)) {\r\n throw newRxError(\r\n 'RC_PUSH_NO_AR',\r\n {\r\n pushRows: rows,\r\n direction: 'push',\r\n args: { result }\r\n }\r\n );\r\n }\r\n done = true;\r\n } catch (err: any | Error | Error[] | RxError) {\r\n const emitError = (err as RxError).rxdb ? err : newRxError('RC_PUSH', {\r\n pushRows: rows,\r\n errors: toArray(err).map(er => errorToPlainJson(er)),\r\n direction: 'push'\r\n });\r\n this.subjects.error.next(emitError);\r\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\r\n }\r\n }\r\n if (this.isStoppedOrPaused()) {\r\n return [];\r\n }\r\n\r\n await runAsyncPluginHooks('preReplicationMasterWriteDocumentsHandle', {\r\n result,\r\n collection: this.collection\r\n });\r\n\r\n const conflicts = handlePulledDocuments(this.collection, this.deletedField, ensureNotFalsy(result));\r\n return conflicts;\r\n }\r\n }\r\n });\r\n\r\n this.subs.push(\r\n this.internalReplicationState.events.error.subscribe((err: RxError | RxTypeError) => {\r\n this.subjects.error.next(err);\r\n }),\r\n this.internalReplicationState.events.processed.down\r\n .subscribe((row: BulkWriteRow<RxDocType>) => this.subjects.received.next(row.document as any)),\r\n this.internalReplicationState.events.processed.up\r\n .subscribe((writeToMasterRow: RxReplicationWriteToMasterRow<RxDocType>) => {\r\n this.subjects.sent.next(writeToMasterRow.newDocumentState);\r\n }),\r\n combineLatest([\r\n this.internalReplicationState.events.active.down,\r\n this.internalReplicationState.events.active.up\r\n ]).subscribe(([down, up]: [boolean, boolean]) => {\r\n const isActive = down || up;\r\n this.subjects.active.next(isActive);\r\n })\r\n );\r\n\r\n if (\r\n this.pull &&\r\n this.pull.stream$ &&\r\n this.live\r\n ) {\r\n this.subs.push(\r\n this.pull.stream$.subscribe({\r\n next: (ev: RxReplicationPullStreamItem<RxDocType, CheckpointType>) => {\r\n if (!this.isStoppedOrPaused()) {\r\n this.remoteEvents$.next(ev);\r\n }\r\n },\r\n error: (err: any) => {\r\n this.subjects.error.next(err);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Non-live replications run once\r\n * and then automatically get canceled.\r\n */\r\n if (!this.live) {\r\n await awaitRxStorageReplicationFirstInSync(this.internalReplicationState);\r\n await awaitRxStorageReplicationInSync(this.internalReplicationState);\r\n await this._cancel();\r\n }\r\n this.callOnStart();\r\n }\r\n\r\n pause() {\r\n this.startQueue = this.startQueue.then(() => {\r\n /**\r\n * It must be possible to .pause() the replication\r\n * at any time, even if it has not been started yet.\r\n */\r\n if (this.internalReplicationState) {\r\n this.internalReplicationState.events.paused.next(true);\r\n }\r\n });\r\n return this.startQueue;\r\n }\r\n\r\n isPaused(): boolean {\r\n return !!(this.internalReplicationState && this.internalReplicationState.events.paused.getValue());\r\n }\r\n\r\n isStopped(): boolean {\r\n return !!this.subjects.canceled.getValue();\r\n }\r\n\r\n isStoppedOrPaused() {\r\n return this.isPaused() || this.isStopped();\r\n }\r\n\r\n async awaitInitialReplication(): Promise<void> {\r\n await this.startPromise;\r\n return awaitRxStorageReplicationFirstInSync(\r\n ensureNotFalsy(this.internalReplicationState)\r\n );\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when:\r\n * - All local data is replicated with the remote\r\n * - No replication cycle is running or in retry-state\r\n *\r\n * WARNING: Using this function directly in a multi-tab browser application\r\n * is dangerous because only the leading instance will ever be replicated,\r\n * so this promise will not resolve in the other tabs.\r\n * For multi-tab support you should set and observe a flag in a local document.\r\n */\r\n async awaitInSync(): Promise<true> {\r\n await this.startPromise;\r\n await awaitRxStorageReplicationFirstInSync(ensureNotFalsy(this.internalReplicationState));\r\n\r\n /**\r\n * To reduce the amount of re-renders and make testing\r\n * and to make the whole behavior more predictable,\r\n * we await these things multiple times.\r\n * For example the state might be in sync already and at the\r\n * exact same time a pull.stream$ event comes in and we want to catch\r\n * that in the same call to awaitInSync() instead of resolving\r\n * while actually the state is not in sync.\r\n */\r\n let t = 2;\r\n while (t > 0) {\r\n t--;\r\n\r\n /**\r\n * Often awaitInSync() is called directly after a document write,\r\n * like in the unit tests.\r\n * So we first have to await the idleness to ensure that all RxChangeEvents\r\n * are processed already.\r\n */\r\n await this.collection.database.requestIdlePromise();\r\n await awaitRxStorageReplicationInSync(ensureNotFalsy(this.internalReplicationState));\r\n }\r\n\r\n return true;\r\n }\r\n\r\n reSync() {\r\n this.remoteEvents$.next('RESYNC');\r\n }\r\n emitEvent(ev: RxReplicationPullStreamItem<RxDocType, CheckpointType>) {\r\n this.remoteEvents$.next(ev);\r\n }\r\n\r\n\r\n async cancel() {\r\n this.startQueue = this.startQueue.catch(() => { }).then(async () => {\r\n await this._cancel();\r\n });\r\n await this.startQueue;\r\n }\r\n\r\n async _cancel(doNotClose = false): Promise<any> {\r\n if (this.isStopped()) {\r\n return PROMISE_RESOLVE_FALSE;\r\n }\r\n\r\n const promises: Promise<any>[] = this.onCancel.map(fn => toPromise(fn()));\r\n\r\n if (this.internalReplicationState) {\r\n await cancelRxStorageReplication(this.internalReplicationState);\r\n }\r\n if (this.metaInstance && !doNotClose) {\r\n promises.push(\r\n ensureNotFalsy(this.internalReplicationState).checkpointQueue\r\n .then(() => ensureNotFalsy(this.metaInstance).close())\r\n );\r\n }\r\n\r\n this.subs.forEach(sub => sub.unsubscribe());\r\n this.subjects.canceled.next(true);\r\n\r\n this.subjects.active.complete();\r\n this.subjects.canceled.complete();\r\n this.subjects.error.complete();\r\n this.subjects.received.complete();\r\n this.subjects.sent.complete();\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n async remove() {\r\n this.startQueue = this.startQueue.then(async () => {\r\n const metaInfo = await this.metaInfoPromise;\r\n await this._cancel(true);\r\n await ensureNotFalsy(this.internalReplicationState).checkpointQueue\r\n .then(() => ensureNotFalsy(this.metaInstance).remove());\r\n await removeConnectedStorageFromCollection(\r\n this.collection,\r\n metaInfo.collectionName,\r\n metaInfo.schema\r\n );\r\n });\r\n return this.startQueue;\r\n }\r\n}\r\n\r\n\r\nexport function replicateRxCollection<RxDocType, CheckpointType>(\r\n {\r\n replicationIdentifier,\r\n collection,\r\n deletedField = '_deleted',\r\n pull,\r\n push,\r\n live = true,\r\n retryTime = 1000 * 5,\r\n waitForLeadership = true,\r\n autoStart = true,\r\n toggleOnDocumentVisible = true\r\n }: ReplicationOptions<RxDocType, CheckpointType>\r\n): RxReplicationState<RxDocType, CheckpointType> {\r\n addRxPlugin(RxDBLeaderElectionPlugin);\r\n\r\n /**\r\n * It is a common error to forget to add these config\r\n * objects. So we check here because it makes no sense\r\n * to start a replication with neither push nor pull.\r\n */\r\n if (!pull && !push) {\r\n throw newRxError('UT3', {\r\n collection: collection.name,\r\n args: {\r\n replicationIdentifier\r\n }\r\n });\r\n }\r\n\r\n const replicationState = new RxReplicationState<RxDocType, CheckpointType>(\r\n replicationIdentifier,\r\n collection,\r\n deletedField,\r\n pull,\r\n push,\r\n live,\r\n retryTime,\r\n autoStart,\r\n toggleOnDocumentVisible\r\n );\r\n\r\n\r\n if (\r\n toggleOnDocumentVisible &&\r\n typeof document !== 'undefined' &&\r\n typeof document.addEventListener === 'function' &&\r\n typeof document.visibilityState === 'string'\r\n ) {\r\n const handler = () => {\r\n if (replicationState.isStopped()) {\r\n return;\r\n }\r\n const isVisible = document.visibilityState === 'visible';\r\n if (isVisible) {\r\n replicationState.start();\r\n } else {\r\n /**\r\n * Only pause if not the current leader.\r\n * If no tab is visible, the elected leader should still continue\r\n * the replication.\r\n */\r\n if (!collection.database.isLeader()) {\r\n replicationState.pause();\r\n }\r\n }\r\n }\r\n document.addEventListener('visibilitychange', handler);\r\n replicationState.onCancel.push(\r\n () => document.removeEventListener('visibilitychange', handler)\r\n );\r\n }\r\n\r\n\r\n startReplicationOnLeaderShip(waitForLeadership, replicationState);\r\n return replicationState as any;\r\n}\r\n\r\n\r\nexport function startReplicationOnLeaderShip(\r\n waitForLeadership: boolean,\r\n replicationState: RxReplicationState<any, any>\r\n) {\r\n /**\r\n * Always await this Promise to ensure that the current instance\r\n * is leader when waitForLeadership=true\r\n */\r\n const mustWaitForLeadership = waitForLeadership && replicationState.collection.database.multiInstance;\r\n const waitTillRun: Promise<any> = mustWaitForLeadership ? replicationState.collection.database.waitForLeadership() : PROMISE_RESOLVE_TRUE;\r\n return waitTillRun.then(() => {\r\n if (replicationState.isStopped()) {\r\n return;\r\n }\r\n if (replicationState.autoStart) {\r\n replicationState.start();\r\n }\r\n });\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_rxjs","require","_index","_index2","_index3","_rxError","_replicationHelper","_rxDatabaseInternalStore","_plugin","_rxStorageHelper","_overwritable","_hooks","REPLICATION_STATE_BY_COLLECTION","exports","WeakMap","RxReplicationState","replicationIdentifier","collection","deletedField","pull","push","live","retryTime","autoStart","toggleOnDocumentVisible","subs","subjects","received","Subject","sent","error","canceled","BehaviorSubject","active","received$","asObservable","sent$","error$","canceled$","active$","wasStarted","startQueue","PROMISE_RESOLVE_VOID","onCancel","callOnStart","undefined","remoteEvents$","metaInfoPromise","metaInstanceCollectionName","database","hashFunction","name","join","metaInstanceSchema","getRxReplicationMetaInstanceSchema","schema","jsonSchema","hasEncryption","collectionName","replicationStates","getFromMapOrCreate","onClose","cancel","Object","keys","forEach","key","defineProperty","get","startPromise","Promise","res","_proto","prototype","start","then","_start","isStopped","internalReplicationState","events","paused","next","reSync","preventHibernateBrowserTab","pullModifier","modifier","DEFAULT_MODIFIER","pushModifier","metaInfo","metaInstance","all","storage","createStorageInstance","databaseName","databaseInstanceToken","token","multiInstance","options","password","devMode","overwritable","isDevMode","addConnectedStorageToCollection","replicateRxStorageInstance","pushBatchSize","batchSize","pullBatchSize","initialCheckpoint","upstream","downstream","forkInstance","storageInstance","skipStoringPullMeta","identifier","conflictHandler","waitBeforePersist","replicationHandler","masterChangeStream$","pipe","filter","_v","mergeMap","ev","useEv","flatClone","documents","handlePulledDocuments","map","d","masterChangesSince","checkpoint","done","result","isStoppedOrPaused","handler","err","emitError","newRxError","errors","toArray","er","errorToPlainJson","direction","awaitRetry","ensureNotFalsy","useResult","masterWrite","rows","runAsyncPluginHooks","useRowsOrNull","row","newDocumentState","assumedMasterState","swapDefaultDeletedTodeletedField","useRows","arrayFilterNotEmpty","length","Array","isArray","pushRows","args","rxdb","conflicts","subscribe","processed","down","document","up","writeToMasterRow","combineLatest","isActive","stream$","awaitRxStorageReplicationFirstInSync","awaitRxStorageReplicationInSync","_cancel","pause","isPaused","getValue","awaitInitialReplication","awaitInSync","t","requestIdlePromise","emitEvent","catch","doNotClose","PROMISE_RESOLVE_FALSE","promises","fn","toPromise","cancelRxStorageReplication","checkpointQueue","close","sub","unsubscribe","complete","states","idx","indexOf","splice","remove","removeConnectedStorageFromCollection","replicateRxCollection","waitForLeadership","addRxPlugin","RxDBLeaderElectionPlugin","replicationState","addEventListener","visibilityState","isVisible","isLeader","removeEventListener","startReplicationOnLeaderShip","mustWaitForLeadership","waitTillRun","PROMISE_RESOLVE_TRUE"],"sources":["../../../../src/plugins/replication/index.ts"],"sourcesContent":["/**\r\n * This plugin contains the primitives to create\r\n * a RxDB client-server replication.\r\n * It is used in the other replication plugins\r\n * but also can be used as standalone with a custom replication handler.\r\n */\r\n\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n filter,\r\n mergeMap,\r\n Observable,\r\n Subject,\r\n Subscription\r\n} from 'rxjs';\r\nimport type {\r\n BulkWriteRow,\r\n ReplicationOptions,\r\n ReplicationPullHandlerResult,\r\n ReplicationPullOptions,\r\n ReplicationPushOptions,\r\n RxCollection,\r\n RxDocumentData,\r\n RxError,\r\n RxJsonSchema,\r\n RxReplicationPullStreamItem,\r\n RxReplicationWriteToMasterRow,\r\n RxStorageInstance,\r\n RxStorageInstanceReplicationState,\r\n RxStorageReplicationMeta,\r\n RxTypeError,\r\n WithDeleted\r\n} from '../../types/index.d.ts';\r\nimport { RxDBLeaderElectionPlugin } from '../leader-election/index.ts';\r\nimport {\r\n arrayFilterNotEmpty,\r\n ensureNotFalsy,\r\n errorToPlainJson,\r\n flatClone,\r\n getFromMapOrCreate,\r\n PROMISE_RESOLVE_FALSE,\r\n PROMISE_RESOLVE_TRUE,\r\n PROMISE_RESOLVE_VOID,\r\n toArray,\r\n toPromise\r\n} from '../../plugins/utils/index.ts';\r\nimport {\r\n awaitRxStorageReplicationFirstInSync,\r\n awaitRxStorageReplicationInSync,\r\n cancelRxStorageReplication,\r\n getRxReplicationMetaInstanceSchema,\r\n replicateRxStorageInstance\r\n} from '../../replication-protocol/index.ts';\r\nimport { newRxError } from '../../rx-error.ts';\r\nimport {\r\n awaitRetry,\r\n DEFAULT_MODIFIER,\r\n swapDefaultDeletedTodeletedField,\r\n handlePulledDocuments,\r\n preventHibernateBrowserTab\r\n} from './replication-helper.ts';\r\nimport {\r\n addConnectedStorageToCollection,\r\n removeConnectedStorageFromCollection\r\n} from '../../rx-database-internal-store.ts';\r\nimport { addRxPlugin } from '../../plugin.ts';\r\nimport { hasEncryption } from '../../rx-storage-helper.ts';\r\nimport { overwritable } from '../../overwritable.ts';\r\nimport {\r\n runAsyncPluginHooks\r\n} from '../../hooks.ts';\r\n\r\n\r\nexport const REPLICATION_STATE_BY_COLLECTION: WeakMap<RxCollection, RxReplicationState<any, any>[]> = new WeakMap();\r\n\r\nexport class RxReplicationState<RxDocType, CheckpointType> {\r\n public readonly subs: Subscription[] = [];\r\n public readonly subjects = {\r\n received: new Subject<RxDocumentData<RxDocType>>(), // all documents that are received from the endpoint\r\n sent: new Subject<WithDeleted<RxDocType>>(), // all documents that are sent to the endpoint\r\n error: new Subject<RxError | RxTypeError>(), // all errors that are received from the endpoint, emits new Error() objects\r\n canceled: new BehaviorSubject<boolean>(false), // true when the replication was canceled\r\n active: new BehaviorSubject<boolean>(false) // true when something is running, false when not\r\n };\r\n\r\n readonly received$: Observable<RxDocumentData<RxDocType>> = this.subjects.received.asObservable();\r\n readonly sent$: Observable<WithDeleted<RxDocType>> = this.subjects.sent.asObservable();\r\n readonly error$: Observable<RxError | RxTypeError> = this.subjects.error.asObservable();\r\n readonly canceled$: Observable<any> = this.subjects.canceled.asObservable();\r\n readonly active$: Observable<boolean> = this.subjects.active.asObservable();\r\n\r\n wasStarted: boolean = false;\r\n\r\n readonly metaInfoPromise: Promise<{ collectionName: string, schema: RxJsonSchema<RxDocumentData<RxStorageReplicationMeta<RxDocType, any>>> }>;\r\n\r\n public startPromise: Promise<void>;\r\n\r\n /**\r\n * start/pause/cancel/remove must never run\r\n * in parallel to avoid a wide range of bugs.\r\n */\r\n public startQueue: Promise<any> = PROMISE_RESOLVE_VOID;\r\n\r\n public onCancel: (() => void)[] = [];\r\n\r\n constructor(\r\n /**\r\n * The identifier, used to flag revisions\r\n * and to identify which documents state came from the remote.\r\n */\r\n public readonly replicationIdentifier: string,\r\n public readonly collection: RxCollection<RxDocType, unknown, unknown, unknown>,\r\n public readonly deletedField: string,\r\n public readonly pull?: ReplicationPullOptions<RxDocType, CheckpointType>,\r\n public readonly push?: ReplicationPushOptions<RxDocType>,\r\n public readonly live?: boolean,\r\n public retryTime?: number,\r\n public autoStart?: boolean,\r\n public toggleOnDocumentVisible?: boolean\r\n ) {\r\n this.metaInfoPromise = (async () => {\r\n const metaInstanceCollectionName = 'rx-replication-meta-' + await collection.database.hashFunction([\r\n this.collection.name,\r\n this.replicationIdentifier\r\n ].join('-'));\r\n const metaInstanceSchema = getRxReplicationMetaInstanceSchema(\r\n this.collection.schema.jsonSchema,\r\n hasEncryption(this.collection.schema.jsonSchema)\r\n );\r\n return {\r\n collectionName: metaInstanceCollectionName,\r\n schema: metaInstanceSchema\r\n };\r\n })();\r\n const replicationStates = getFromMapOrCreate(\r\n REPLICATION_STATE_BY_COLLECTION,\r\n collection,\r\n () => []\r\n );\r\n replicationStates.push(this);\r\n\r\n // stop the replication when the collection gets closed\r\n this.collection.onClose.push(() => this.cancel());\r\n\r\n // create getters for the observables\r\n Object.keys(this.subjects).forEach(key => {\r\n Object.defineProperty(this, key + '$', {\r\n get: function () {\r\n return this.subjects[key].asObservable();\r\n }\r\n });\r\n });\r\n const startPromise = new Promise<void>(res => {\r\n this.callOnStart = res;\r\n });\r\n this.startPromise = startPromise;\r\n }\r\n\r\n private callOnStart: () => void = undefined as any;\r\n\r\n public internalReplicationState?: RxStorageInstanceReplicationState<RxDocType>;\r\n public metaInstance?: RxStorageInstance<RxStorageReplicationMeta<RxDocType, CheckpointType>, any, {}, any>;\r\n public remoteEvents$: Subject<RxReplicationPullStreamItem<RxDocType, CheckpointType>> = new Subject();\r\n\r\n\r\n public start(): Promise<void> {\r\n this.startQueue = this.startQueue.then(() => {\r\n return this._start();\r\n });\r\n return this.startQueue;\r\n }\r\n\r\n public async _start(): Promise<void> {\r\n if (this.isStopped()) {\r\n return;\r\n }\r\n\r\n if (this.internalReplicationState) {\r\n this.internalReplicationState.events.paused.next(false);\r\n }\r\n\r\n /**\r\n * If started after a pause,\r\n * just re-sync once and continue.\r\n */\r\n if (this.wasStarted) {\r\n this.reSync();\r\n return;\r\n }\r\n this.wasStarted = true;\r\n\r\n\r\n if (!this.toggleOnDocumentVisible) {\r\n preventHibernateBrowserTab(this);\r\n }\r\n\r\n // fill in defaults for pull & push\r\n const pullModifier = this.pull && this.pull.modifier ? this.pull.modifier : DEFAULT_MODIFIER;\r\n const pushModifier = this.push && this.push.modifier ? this.push.modifier : DEFAULT_MODIFIER;\r\n\r\n const database = this.collection.database;\r\n const metaInfo = await this.metaInfoPromise;\r\n\r\n const [metaInstance] = await Promise.all([\r\n this.collection.database.storage.createStorageInstance<RxStorageReplicationMeta<RxDocType, CheckpointType>>({\r\n databaseName: database.name,\r\n collectionName: metaInfo.collectionName,\r\n databaseInstanceToken: database.token,\r\n multiInstance: database.multiInstance,\r\n options: {},\r\n schema: metaInfo.schema,\r\n password: database.password,\r\n devMode: overwritable.isDevMode()\r\n }),\r\n addConnectedStorageToCollection(\r\n this.collection,\r\n metaInfo.collectionName,\r\n metaInfo.schema\r\n )\r\n ]);\r\n this.metaInstance = metaInstance;\r\n\r\n this.internalReplicationState = replicateRxStorageInstance({\r\n pushBatchSize: this.push && this.push.batchSize ? this.push.batchSize : 100,\r\n pullBatchSize: this.pull && this.pull.batchSize ? this.pull.batchSize : 100,\r\n initialCheckpoint: {\r\n upstream: this.push ? this.push.initialCheckpoint : undefined,\r\n downstream: this.pull ? this.pull.initialCheckpoint : undefined\r\n },\r\n forkInstance: this.collection.storageInstance,\r\n metaInstance: this.metaInstance,\r\n hashFunction: database.hashFunction,\r\n skipStoringPullMeta: this.push ? false : true,\r\n identifier: 'rxdbreplication' + this.replicationIdentifier,\r\n conflictHandler: this.collection.conflictHandler,\r\n waitBeforePersist: this.push ? this.push.waitBeforePersist : undefined,\r\n replicationHandler: {\r\n masterChangeStream$: this.remoteEvents$.asObservable().pipe(\r\n filter((_v: RxReplicationPullStreamItem<RxDocType, CheckpointType>) => !!this.pull || _v === 'RESYNC'),\r\n mergeMap(async (ev: RxReplicationPullStreamItem<RxDocType, CheckpointType>) => {\r\n if (ev === 'RESYNC') {\r\n return ev;\r\n }\r\n const useEv = flatClone(ev);\r\n useEv.documents = handlePulledDocuments(this.collection, this.deletedField, useEv.documents);\r\n useEv.documents = await Promise.all(\r\n useEv.documents.map((d: WithDeleted<RxDocType>) => pullModifier(d))\r\n );\r\n return useEv;\r\n })\r\n ),\r\n masterChangesSince: async (\r\n checkpoint: CheckpointType | undefined,\r\n batchSize: number\r\n ) => {\r\n if (!this.pull) {\r\n return {\r\n checkpoint: null,\r\n documents: []\r\n };\r\n }\r\n /**\r\n * Retries must be done here in the replication primitives plugin,\r\n * because the replication protocol itself has no\r\n * error handling.\r\n */\r\n let done = false;\r\n let result: ReplicationPullHandlerResult<RxDocType, CheckpointType> = {} as any;\r\n while (!done && !this.isStoppedOrPaused()) {\r\n try {\r\n result = await this.pull.handler(\r\n checkpoint,\r\n batchSize\r\n );\r\n done = true;\r\n } catch (err: any | Error | Error[]) {\r\n const emitError = newRxError('RC_PULL', {\r\n checkpoint,\r\n errors: toArray(err).map(er => errorToPlainJson(er)),\r\n direction: 'pull'\r\n });\r\n this.subjects.error.next(emitError);\r\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\r\n }\r\n }\r\n\r\n if (this.isStoppedOrPaused()) {\r\n return {\r\n checkpoint: null,\r\n documents: []\r\n };\r\n }\r\n\r\n const useResult = flatClone(result);\r\n useResult.documents = handlePulledDocuments(this.collection, this.deletedField, useResult.documents);\r\n useResult.documents = await Promise.all(\r\n useResult.documents.map(d => pullModifier(d))\r\n );\r\n return useResult;\r\n },\r\n masterWrite: async (\r\n rows: RxReplicationWriteToMasterRow<RxDocType>[]\r\n ) => {\r\n if (!this.push) {\r\n return [];\r\n }\r\n let done = false;\r\n\r\n await runAsyncPluginHooks('preReplicationMasterWrite', {\r\n rows,\r\n collection: this.collection\r\n });\r\n\r\n const useRowsOrNull = await Promise.all(\r\n rows.map(async (row) => {\r\n row.newDocumentState = await pushModifier(row.newDocumentState);\r\n if (row.newDocumentState === null) {\r\n return null;\r\n }\r\n if (row.assumedMasterState) {\r\n row.assumedMasterState = await pushModifier(row.assumedMasterState);\r\n }\r\n if (this.deletedField !== '_deleted') {\r\n row.newDocumentState = swapDefaultDeletedTodeletedField(this.deletedField, row.newDocumentState) as any;\r\n if (row.assumedMasterState) {\r\n row.assumedMasterState = swapDefaultDeletedTodeletedField(this.deletedField, row.assumedMasterState) as any;\r\n }\r\n }\r\n return row;\r\n })\r\n );\r\n const useRows: RxReplicationWriteToMasterRow<RxDocType>[] = useRowsOrNull.filter(arrayFilterNotEmpty);\r\n\r\n let result: WithDeleted<RxDocType>[] = null as any;\r\n\r\n // In case all the rows have been filtered and nothing has to be sent\r\n if (useRows.length === 0) {\r\n done = true;\r\n result = [];\r\n }\r\n\r\n while (!done && !this.isStoppedOrPaused()) {\r\n try {\r\n result = await this.push.handler(useRows);\r\n /**\r\n * It is a common problem that people have wrongly behaving backend\r\n * that do not return an array with the conflicts on push requests.\r\n * So we run this check here to make it easier to debug.\r\n * @link https://github.com/pubkey/rxdb/issues/4103\r\n */\r\n if (!Array.isArray(result)) {\r\n throw newRxError(\r\n 'RC_PUSH_NO_AR',\r\n {\r\n pushRows: rows,\r\n direction: 'push',\r\n args: { result }\r\n }\r\n );\r\n }\r\n done = true;\r\n } catch (err: any | Error | Error[] | RxError) {\r\n const emitError = (err as RxError).rxdb ? err : newRxError('RC_PUSH', {\r\n pushRows: rows,\r\n errors: toArray(err).map(er => errorToPlainJson(er)),\r\n direction: 'push'\r\n });\r\n this.subjects.error.next(emitError);\r\n await awaitRetry(this.collection, ensureNotFalsy(this.retryTime));\r\n }\r\n }\r\n if (this.isStoppedOrPaused()) {\r\n return [];\r\n }\r\n\r\n await runAsyncPluginHooks('preReplicationMasterWriteDocumentsHandle', {\r\n result,\r\n collection: this.collection\r\n });\r\n\r\n const conflicts = handlePulledDocuments(this.collection, this.deletedField, ensureNotFalsy(result));\r\n return conflicts;\r\n }\r\n }\r\n });\r\n\r\n this.subs.push(\r\n this.internalReplicationState.events.error.subscribe((err: RxError | RxTypeError) => {\r\n this.subjects.error.next(err);\r\n }),\r\n this.internalReplicationState.events.processed.down\r\n .subscribe((row: BulkWriteRow<RxDocType>) => this.subjects.received.next(row.document as any)),\r\n this.internalReplicationState.events.processed.up\r\n .subscribe((writeToMasterRow: RxReplicationWriteToMasterRow<RxDocType>) => {\r\n this.subjects.sent.next(writeToMasterRow.newDocumentState);\r\n }),\r\n combineLatest([\r\n this.internalReplicationState.events.active.down,\r\n this.internalReplicationState.events.active.up\r\n ]).subscribe(([down, up]: [boolean, boolean]) => {\r\n const isActive = down || up;\r\n this.subjects.active.next(isActive);\r\n })\r\n );\r\n\r\n if (\r\n this.pull &&\r\n this.pull.stream$ &&\r\n this.live\r\n ) {\r\n this.subs.push(\r\n this.pull.stream$.subscribe({\r\n next: (ev: RxReplicationPullStreamItem<RxDocType, CheckpointType>) => {\r\n if (!this.isStoppedOrPaused()) {\r\n this.remoteEvents$.next(ev);\r\n }\r\n },\r\n error: (err: any) => {\r\n this.subjects.error.next(err);\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Non-live replications run once\r\n * and then automatically get canceled.\r\n */\r\n if (!this.live) {\r\n await awaitRxStorageReplicationFirstInSync(this.internalReplicationState);\r\n await awaitRxStorageReplicationInSync(this.internalReplicationState);\r\n await this._cancel();\r\n }\r\n this.callOnStart();\r\n }\r\n\r\n pause() {\r\n this.startQueue = this.startQueue.then(() => {\r\n /**\r\n * It must be possible to .pause() the replication\r\n * at any time, even if it has not been started yet.\r\n */\r\n if (this.internalReplicationState) {\r\n this.internalReplicationState.events.paused.next(true);\r\n }\r\n });\r\n return this.startQueue;\r\n }\r\n\r\n isPaused(): boolean {\r\n return !!(this.internalReplicationState && this.internalReplicationState.events.paused.getValue());\r\n }\r\n\r\n isStopped(): boolean {\r\n return !!this.subjects.canceled.getValue();\r\n }\r\n\r\n isStoppedOrPaused() {\r\n return this.isPaused() || this.isStopped();\r\n }\r\n\r\n async awaitInitialReplication(): Promise<void> {\r\n await this.startPromise;\r\n return awaitRxStorageReplicationFirstInSync(\r\n ensureNotFalsy(this.internalReplicationState)\r\n );\r\n }\r\n\r\n /**\r\n * Returns a promise that resolves when:\r\n * - All local data is replicated with the remote\r\n * - No replication cycle is running or in retry-state\r\n *\r\n * WARNING: Using this function directly in a multi-tab browser application\r\n * is dangerous because only the leading instance will ever be replicated,\r\n * so this promise will not resolve in the other tabs.\r\n * For multi-tab support you should set and observe a flag in a local document.\r\n */\r\n async awaitInSync(): Promise<true> {\r\n await this.startPromise;\r\n await awaitRxStorageReplicationFirstInSync(ensureNotFalsy(this.internalReplicationState));\r\n\r\n /**\r\n * To reduce the amount of re-renders and make testing\r\n * and to make the whole behavior more predictable,\r\n * we await these things multiple times.\r\n * For example the state might be in sync already and at the\r\n * exact same time a pull.stream$ event comes in and we want to catch\r\n * that in the same call to awaitInSync() instead of resolving\r\n * while actually the state is not in sync.\r\n */\r\n let t = 2;\r\n while (t > 0) {\r\n t--;\r\n\r\n /**\r\n * Often awaitInSync() is called directly after a document write,\r\n * like in the unit tests.\r\n * So we first have to await the idleness to ensure that all RxChangeEvents\r\n * are processed already.\r\n */\r\n await this.collection.database.requestIdlePromise();\r\n await awaitRxStorageReplicationInSync(ensureNotFalsy(this.internalReplicationState));\r\n }\r\n\r\n return true;\r\n }\r\n\r\n reSync() {\r\n this.remoteEvents$.next('RESYNC');\r\n }\r\n emitEvent(ev: RxReplicationPullStreamItem<RxDocType, CheckpointType>) {\r\n this.remoteEvents$.next(ev);\r\n }\r\n\r\n\r\n async cancel() {\r\n this.startQueue = this.startQueue.catch(() => { }).then(async () => {\r\n await this._cancel();\r\n });\r\n await this.startQueue;\r\n }\r\n\r\n async _cancel(doNotClose = false): Promise<any> {\r\n if (this.isStopped()) {\r\n return PROMISE_RESOLVE_FALSE;\r\n }\r\n\r\n const promises: Promise<any>[] = this.onCancel.map(fn => toPromise(fn()));\r\n\r\n if (this.internalReplicationState) {\r\n await cancelRxStorageReplication(this.internalReplicationState);\r\n }\r\n if (this.metaInstance && !doNotClose) {\r\n promises.push(\r\n ensureNotFalsy(this.internalReplicationState).checkpointQueue\r\n .then(() => ensureNotFalsy(this.metaInstance).close())\r\n );\r\n }\r\n\r\n this.subs.forEach(sub => sub.unsubscribe());\r\n this.subjects.canceled.next(true);\r\n\r\n this.subjects.active.complete();\r\n this.subjects.canceled.complete();\r\n this.subjects.error.complete();\r\n this.subjects.received.complete();\r\n this.subjects.sent.complete();\r\n\r\n /**\r\n * Remove from the REPLICATION_STATE_BY_COLLECTION registry\r\n * so that the cleanup plugin does not try to access a stopped\r\n * replication's meta instance, and to prevent memory leaks\r\n * from accumulating canceled replication state objects.\r\n */\r\n const states = REPLICATION_STATE_BY_COLLECTION.get(this.collection as any);\r\n if (states) {\r\n const idx = states.indexOf(this);\r\n if (idx !== -1) {\r\n states.splice(idx, 1);\r\n }\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n async remove() {\r\n this.startQueue = this.startQueue.then(async () => {\r\n const metaInfo = await this.metaInfoPromise;\r\n await this._cancel(true);\r\n\r\n /**\r\n * If the replication was never started (e.g. autoStart: false\r\n * and start() was never called), we still have to\r\n * create the meta storage instance and then remove its data.\r\n * This is required so that old meta data from a previous\r\n * replication with the same identifier is properly deleted.\r\n */\r\n if (!this.metaInstance) {\r\n const database = this.collection.database;\r\n this.metaInstance = await database.storage.createStorageInstance<RxStorageReplicationMeta<RxDocType, CheckpointType>>({\r\n databaseName: database.name,\r\n collectionName: metaInfo.collectionName,\r\n databaseInstanceToken: database.token,\r\n multiInstance: database.multiInstance,\r\n options: {},\r\n schema: metaInfo.schema,\r\n password: database.password,\r\n devMode: overwritable.isDevMode()\r\n });\r\n }\r\n\r\n if (this.internalReplicationState) {\r\n await this.internalReplicationState.checkpointQueue;\r\n }\r\n await ensureNotFalsy(this.metaInstance).remove();\r\n await removeConnectedStorageFromCollection(\r\n this.collection,\r\n metaInfo.collectionName,\r\n metaInfo.schema\r\n );\r\n });\r\n return this.startQueue;\r\n }\r\n}\r\n\r\n\r\nexport function replicateRxCollection<RxDocType, CheckpointType>(\r\n {\r\n replicationIdentifier,\r\n collection,\r\n deletedField = '_deleted',\r\n pull,\r\n push,\r\n live = true,\r\n retryTime = 1000 * 5,\r\n waitForLeadership = true,\r\n autoStart = true,\r\n toggleOnDocumentVisible = true\r\n }: ReplicationOptions<RxDocType, CheckpointType>\r\n): RxReplicationState<RxDocType, CheckpointType> {\r\n addRxPlugin(RxDBLeaderElectionPlugin);\r\n\r\n /**\r\n * It is a common error to forget to add these config\r\n * objects. So we check here because it makes no sense\r\n * to start a replication with neither push nor pull.\r\n */\r\n if (!pull && !push) {\r\n throw newRxError('UT3', {\r\n collection: collection.name,\r\n args: {\r\n replicationIdentifier\r\n }\r\n });\r\n }\r\n\r\n const replicationState = new RxReplicationState<RxDocType, CheckpointType>(\r\n replicationIdentifier,\r\n collection,\r\n deletedField,\r\n pull,\r\n push,\r\n live,\r\n retryTime,\r\n autoStart,\r\n toggleOnDocumentVisible\r\n );\r\n\r\n\r\n if (\r\n toggleOnDocumentVisible &&\r\n typeof document !== 'undefined' &&\r\n typeof document.addEventListener === 'function' &&\r\n typeof document.visibilityState === 'string'\r\n ) {\r\n const handler = () => {\r\n if (replicationState.isStopped()) {\r\n return;\r\n }\r\n const isVisible = document.visibilityState === 'visible';\r\n if (isVisible) {\r\n replicationState.start();\r\n } else {\r\n /**\r\n * Only pause if not the current leader.\r\n * If no tab is visible, the elected leader should still continue\r\n * the replication.\r\n */\r\n if (!collection.database.isLeader()) {\r\n replicationState.pause();\r\n }\r\n }\r\n }\r\n document.addEventListener('visibilitychange', handler);\r\n replicationState.onCancel.push(\r\n () => document.removeEventListener('visibilitychange', handler)\r\n );\r\n }\r\n\r\n\r\n startReplicationOnLeaderShip(waitForLeadership, replicationState);\r\n return replicationState as any;\r\n}\r\n\r\n\r\nexport function startReplicationOnLeaderShip(\r\n waitForLeadership: boolean,\r\n replicationState: RxReplicationState<any, any>\r\n) {\r\n /**\r\n * Always await this Promise to ensure that the current instance\r\n * is leader when waitForLeadership=true\r\n */\r\n const mustWaitForLeadership = waitForLeadership && replicationState.collection.database.multiInstance;\r\n const waitTillRun: Promise<any> = mustWaitForLeadership ? replicationState.collection.database.waitForLeadership() : PROMISE_RESOLVE_TRUE;\r\n return waitTillRun.then(() => {\r\n if (replicationState.isStopped()) {\r\n return;\r\n }\r\n if (replicationState.autoStart) {\r\n replicationState.start();\r\n }\r\n });\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|