@powersync/service-module-mongodb-storage 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +62 -0
- package/dist/storage/MongoBucketStorage.d.ts +36 -3
- package/dist/storage/MongoBucketStorage.js +372 -207
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +17 -5
- package/dist/storage/implementation/MongoBucketBatch.js +44 -17
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +19 -79
- package/dist/storage/implementation/MongoCompactor.js +27 -238
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +83 -10
- package/dist/storage/implementation/MongoParameterCompactor.js +309 -96
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.d.ts +9 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js +29 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +4 -2
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +7 -3
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +27 -11
- package/dist/storage/implementation/MongoSyncBucketStorage.js +78 -31
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.js +21 -9
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteBatch.d.ts +49 -0
- package/dist/storage/implementation/MongoWriteBatch.js +149 -0
- package/dist/storage/implementation/MongoWriteBatch.js.map +1 -0
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +9 -7
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +9 -30
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/SyncRuleStateUpdate.d.ts +11 -5
- package/dist/storage/implementation/SyncRuleStateUpdate.js +14 -6
- package/dist/storage/implementation/SyncRuleStateUpdate.js.map +1 -1
- package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.d.ts +22 -2
- package/dist/storage/implementation/common/PersistedBatch.d.ts +32 -4
- package/dist/storage/implementation/common/PersistedBatch.js +49 -6
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.d.ts +3 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +3 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -1
- package/dist/storage/implementation/db.d.ts +9 -1
- package/dist/storage/implementation/db.js +27 -1
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +31 -0
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +2 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +33 -4
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +38 -6
- package/dist/storage/implementation/v1/MongoCompactorV1.js +247 -20
- package/dist/storage/implementation/v1/MongoCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.d.ts +16 -2
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js +20 -9
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.d.ts +18 -11
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +65 -16
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -1
- package/dist/storage/implementation/v1/PersistedBatchV1.d.ts +7 -5
- package/dist/storage/implementation/v1/PersistedBatchV1.js +22 -28
- package/dist/storage/implementation/v1/PersistedBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/models.js +1 -0
- package/dist/storage/implementation/v1/models.js.map +1 -1
- package/dist/storage/implementation/v3/CompactionLease.d.ts +50 -0
- package/dist/storage/implementation/v3/CompactionLease.js +131 -0
- package/dist/storage/implementation/v3/CompactionLease.js.map +1 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.d.ts +10 -2
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +100 -26
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +82 -25
- package/dist/storage/implementation/v3/MongoCompactorV3.js +698 -159
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +18 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +23 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +2 -15
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +60 -92
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -1
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +19 -9
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +91 -31
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.d.ts +26 -0
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.js +82 -0
- package/dist/storage/implementation/v3/MongoWriteCheckpointAPIV3.js.map +1 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +14 -8
- package/dist/storage/implementation/v3/PersistedBatchV3.js +76 -42
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +12 -2
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +42 -3
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
- package/dist/storage/implementation/v3/bucket-format.js +2 -0
- package/dist/storage/implementation/v3/bucket-format.js.map +1 -1
- package/dist/storage/implementation/v3/compact-utils.d.ts +107 -0
- package/dist/storage/implementation/v3/compact-utils.js +216 -0
- package/dist/storage/implementation/v3/compact-utils.js.map +1 -0
- package/dist/storage/implementation/v3/compaction-constants.d.ts +5 -0
- package/dist/storage/implementation/v3/compaction-constants.js +6 -0
- package/dist/storage/implementation/v3/compaction-constants.js.map +1 -0
- package/dist/storage/implementation/v3/models.d.ts +84 -4
- package/dist/storage/implementation/v3/models.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.d.ts +7 -8
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js +16 -5
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.d.ts +14 -11
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.d.ts +6 -8
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +17 -11
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.d.ts +38 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js +164 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.d.ts +37 -12
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js +197 -25
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js.map +1 -1
- package/dist/storage/implementation/v3/source-table-utils.d.ts +6 -6
- package/dist/storage/implementation/v3/source-table-utils.js +30 -37
- package/dist/storage/implementation/v3/source-table-utils.js.map +1 -1
- package/dist/storage/storage-index.d.ts +2 -1
- package/dist/storage/storage-index.js +1 -0
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/types/types.d.ts +28 -1
- package/dist/types/types.js +28 -7
- package/dist/types/types.js.map +1 -1
- package/dist/utils/test-utils.js +1 -0
- package/dist/utils/test-utils.js.map +1 -1
- package/dist/utils/util.js +3 -1
- package/dist/utils/util.js.map +1 -1
- package/package.json +10 -9
- package/src/storage/MongoBucketStorage.ts +507 -269
- package/src/storage/implementation/MongoBucketBatch.ts +67 -24
- package/src/storage/implementation/MongoCompactor.ts +35 -346
- package/src/storage/implementation/MongoParameterCompactor.ts +388 -102
- package/src/storage/implementation/MongoParsedSyncConfigSet.ts +34 -0
- package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +4 -2
- package/src/storage/implementation/MongoStorageProvider.ts +15 -3
- package/src/storage/implementation/MongoSyncBucketStorage.ts +114 -40
- package/src/storage/implementation/MongoSyncRulesLock.ts +22 -9
- package/src/storage/implementation/MongoWriteBatch.ts +172 -0
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +16 -46
- package/src/storage/implementation/SyncRuleStateUpdate.ts +13 -6
- package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +24 -2
- package/src/storage/implementation/common/PersistedBatch.ts +66 -10
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +4 -0
- package/src/storage/implementation/db.ts +35 -2
- package/src/storage/implementation/models.ts +34 -0
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +46 -6
- package/src/storage/implementation/v1/MongoCompactorV1.ts +327 -40
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +25 -9
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +87 -27
- package/src/storage/implementation/v1/PersistedBatchV1.ts +25 -30
- package/src/storage/implementation/v1/models.ts +1 -0
- package/src/storage/implementation/v3/CompactionLease.ts +152 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +138 -34
- package/src/storage/implementation/v3/MongoCompactorV3.ts +958 -225
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +34 -0
- package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +100 -109
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +111 -41
- package/src/storage/implementation/v3/MongoWriteCheckpointAPIV3.ts +111 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +93 -48
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +55 -4
- package/src/storage/implementation/v3/bucket-format.ts +2 -0
- package/src/storage/implementation/v3/compact-utils.ts +320 -0
- package/src/storage/implementation/v3/compaction-constants.ts +5 -0
- package/src/storage/implementation/v3/models.ts +91 -3
- package/src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts +24 -9
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +20 -5
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +26 -14
- package/src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts +229 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +279 -29
- package/src/storage/implementation/v3/source-table-utils.ts +39 -41
- package/src/storage/storage-index.ts +2 -0
- package/src/types/types.ts +42 -7
- package/src/utils/test-utils.ts +1 -0
- package/src/utils/util.ts +3 -1
- package/test/src/__snapshots__/storage.test.ts.snap +25 -0
- package/test/src/__snapshots__/storage_sync.test.ts.snap +605 -16
- package/test/src/chunk_compaction_config.test.ts +38 -0
- package/test/src/cleanup-stopped-sync-configs.test.ts +40 -13
- package/test/src/compact-utils.test.ts +226 -0
- package/test/src/helpers/MemoryObjectStorage.ts +14 -6
- package/test/src/object_storage_usage.test.ts +267 -0
- package/test/src/parameter_compacting_v1.test.ts +120 -0
- package/test/src/parameter_compacting_v3.test.ts +192 -0
- package/test/src/parameter_compaction_fence.test.ts +276 -0
- package/test/src/storage.test.ts +273 -22
- package/test/src/storage_compacting.test.ts +968 -246
- package/test/src/storage_s3_checksums.test.ts +3 -4
- package/test/src/storage_s3_compaction_lifecycle.test.ts +138 -12
- package/test/src/storage_s3_reading.test.ts +290 -2
- package/test/src/storage_s3_writing.test.ts +1 -0
- package/test/src/storage_sync.test.ts +336 -41
- package/test/src/util.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,130 +1,343 @@
|
|
|
1
|
-
import { logger } from '@powersync/lib-services-framework';
|
|
1
|
+
import { logger as defaultLogger } from '@powersync/lib-services-framework';
|
|
2
2
|
import { bson } from '@powersync/service-core';
|
|
3
3
|
import { LRUCache } from 'lru-cache';
|
|
4
|
+
const PARAMETER_COMPACTION_BATCH_SIZE = 10_000;
|
|
5
|
+
const PARAMETER_COMPACTION_DELETE_BATCH_SIZE = 1_000;
|
|
6
|
+
const PARAMETER_COMPACTION_CACHE_SIZE = 50_000;
|
|
7
|
+
/**
|
|
8
|
+
* How often progress is persisted during a pass.
|
|
9
|
+
*
|
|
10
|
+
* Kept coarse: replication also updates the `sync_rules` document on every commit.
|
|
11
|
+
*/
|
|
12
|
+
const PARAMETER_COMPACTION_PERSIST_INTERVAL_MS = 60_000;
|
|
4
13
|
/**
|
|
5
14
|
* Compacts parameter lookup data (the bucket_parameters collection).
|
|
6
15
|
*
|
|
7
|
-
*
|
|
16
|
+
* Both storage versions persist a per-stream compaction cursor, so a run only scans entries in the
|
|
17
|
+
* un-compacted operation-id range. V1 scans its shared collection using only the `_id` index, so it
|
|
18
|
+
* additionally filters by stream in code.
|
|
19
|
+
*
|
|
20
|
+
* The cursor is a single value covering every collection of the stream, so it can only be advanced
|
|
21
|
+
* to a boundary that all collections have passed. To keep it moving during a long pass, collections
|
|
22
|
+
* are processed in lock-step rather than one after another - see {@link compactCollections}.
|
|
8
23
|
*
|
|
9
24
|
* For background, see the `/docs/storage/parameter-lookups.md` file.
|
|
10
25
|
*/
|
|
11
26
|
export class MongoParameterCompactor {
|
|
12
27
|
db;
|
|
13
|
-
|
|
28
|
+
replicationStreamId;
|
|
14
29
|
checkpoint;
|
|
15
30
|
options;
|
|
16
|
-
|
|
17
|
-
|
|
31
|
+
parameterCompactionBatchSize;
|
|
32
|
+
parameterCompactionPersistIntervalMs;
|
|
33
|
+
logger;
|
|
34
|
+
signal;
|
|
35
|
+
constructor(db, replicationStreamId, checkpoint, options, parameterCompactionBatchSize = PARAMETER_COMPACTION_BATCH_SIZE, parameterCompactionPersistIntervalMs = PARAMETER_COMPACTION_PERSIST_INTERVAL_MS) {
|
|
18
36
|
this.db = db;
|
|
19
|
-
this.
|
|
37
|
+
this.replicationStreamId = replicationStreamId;
|
|
20
38
|
this.checkpoint = checkpoint;
|
|
21
39
|
this.options = options;
|
|
22
|
-
this.
|
|
40
|
+
this.parameterCompactionBatchSize = parameterCompactionBatchSize;
|
|
41
|
+
this.parameterCompactionPersistIntervalMs = parameterCompactionPersistIntervalMs;
|
|
42
|
+
this.logger = options.logger ?? defaultLogger;
|
|
43
|
+
this.signal = options.signal;
|
|
23
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Set once the invalidation fence for this pass has been persisted. See
|
|
47
|
+
* {@link ensureInvalidationFence}.
|
|
48
|
+
*/
|
|
49
|
+
#invalidationFencePersisted = false;
|
|
24
50
|
async compact() {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
51
|
+
const startedAt = Date.now();
|
|
52
|
+
this.signal?.throwIfAborted();
|
|
53
|
+
const compactedBefore = await this.readCompactedBefore();
|
|
54
|
+
this.logger.info(`Incrementally compacting parameters from ${compactedBefore} up to checkpoint ${this.checkpoint}`);
|
|
55
|
+
const result = await this.compactCollections(compactedBefore);
|
|
56
|
+
// Persist only after every collection has completed. This uses $max so an overlapping
|
|
57
|
+
// compactor cannot move the cursor backwards.
|
|
58
|
+
await this.persistCompactedBefore(this.checkpoint);
|
|
59
|
+
const durationSeconds = (Date.now() - startedAt) / 1000;
|
|
60
|
+
this.logger.info(`Incremental parameter compaction completed: ` +
|
|
61
|
+
`collections=${result.collections}, scanned=${result.scannedEntries}, ` +
|
|
62
|
+
`deleted=${result.deletedEntries}, cursor=${compactedBefore}->${this.checkpoint}, ` +
|
|
63
|
+
`fence=${this.#invalidationFencePersisted ? this.checkpoint : 'unchanged'}, duration=${durationSeconds.toFixed(1)}s`);
|
|
29
64
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
collectionFilter() {
|
|
40
|
-
return {};
|
|
65
|
+
/**
|
|
66
|
+
* The exclusive operation-id boundary through which this stream's parameter indexes have all
|
|
67
|
+
* been compacted.
|
|
68
|
+
*/
|
|
69
|
+
async readCompactedBefore() {
|
|
70
|
+
const stream = await this.db.sync_rules.findOne({ _id: this.replicationStreamId }, { projection: { parameter_compaction: 1 } });
|
|
71
|
+
return stream?.parameter_compaction?.compacted_before == null
|
|
72
|
+
? 0n
|
|
73
|
+
: BigInt(stream.parameter_compaction.compacted_before);
|
|
41
74
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
key: doc.key
|
|
47
|
-
};
|
|
75
|
+
async persistCompactedBefore(compactedBefore) {
|
|
76
|
+
await this.db.sync_rules.updateOne({ _id: this.replicationStreamId }, {
|
|
77
|
+
$max: { 'parameter_compaction.compacted_before': compactedBefore }
|
|
78
|
+
});
|
|
48
79
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Commits the checkpoint-change invalidation fence before the first delete of this pass.
|
|
82
|
+
*
|
|
83
|
+
* Checkpoint change detection finds changed lookups by querying parameter entries in
|
|
84
|
+
* (lastCheckpoint, nextCheckpoint]. Compaction physically removes entries in that range, so a
|
|
85
|
+
* checkpoint that can no longer see the full history must instead invalidate all parameter
|
|
86
|
+
* buckets. The fence records the boundary below which that history may be missing.
|
|
87
|
+
*
|
|
88
|
+
* The fence must be committed before the first delete: MongoDB snapshot ordering then
|
|
89
|
+
* guarantees that a checkpoint snapshot which observes a deletion also observes the fence.
|
|
90
|
+
*
|
|
91
|
+
* This deliberately isn't the same value as the compaction cursor. If the pass fails halfway,
|
|
92
|
+
* the fence only causes conservative invalidation, while an advanced cursor would skip
|
|
93
|
+
* deletion work that never completed.
|
|
94
|
+
*/
|
|
95
|
+
async ensureInvalidationFence() {
|
|
96
|
+
// We can consider incrementally updating the fence based on the current cursor position instead
|
|
97
|
+
// of the checkpoint. That would result in lower risk of triggering invalidations, but it would
|
|
98
|
+
// result in a higher number of updates to the `sync_rules` collection, which can make it
|
|
99
|
+
// counter-productive.
|
|
100
|
+
// Another option is to introduce an artificial delay of a couple of seconds before writing the fence,
|
|
101
|
+
// giving some chance for every API process to catch up. Note that the delay would have to apply
|
|
102
|
+
// to both the deletes and the fence - the fence write must still happen before we do any deletes.
|
|
103
|
+
if (this.#invalidationFencePersisted) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
await this.db.sync_rules.updateOne({ _id: this.replicationStreamId }, {
|
|
107
|
+
$max: { 'parameter_compaction.checkpoint_changes_invalid_before': this.checkpoint }
|
|
63
108
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
109
|
+
this.#invalidationFencePersisted = true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Processes every collection of the stream, in lock-step: each turn takes one batch from the
|
|
113
|
+
* collection that has processed the least so far.
|
|
114
|
+
*
|
|
115
|
+
* The persisted cursor is the minimum position over all collections, which is exactly the
|
|
116
|
+
* boundary that all of them have passed, so it can be advanced periodically during the pass.
|
|
117
|
+
* Always picking the collection that is furthest behind also keeps each of them within one batch
|
|
118
|
+
* of that boundary, bounding the work an interrupted pass has to repeat.
|
|
119
|
+
*
|
|
120
|
+
* V1 storage always has a single collection; V3 has a collection per defined index. So in V1 the
|
|
121
|
+
* ame process collapses to compacting the single collection in order, while V3 can alternate between
|
|
122
|
+
* collections.
|
|
123
|
+
*/
|
|
124
|
+
async compactCollections(compactedBefore) {
|
|
125
|
+
const scopes = (await this.getCollections()).map((collection) => ({
|
|
126
|
+
collection,
|
|
127
|
+
position: compactedBefore,
|
|
128
|
+
scannedEntries: 0,
|
|
129
|
+
deletedEntries: 0
|
|
130
|
+
}));
|
|
131
|
+
// Shared by all scopes, so the memory bound does not depend on the number of parameter indexes.
|
|
132
|
+
// It is safe for items to be evicted: that just changes deletes from "delete by _id" to
|
|
133
|
+
// the more expensive "delete by range filter".
|
|
134
|
+
const previousByIdentity = new LRUCache({
|
|
135
|
+
max: this.options.compactParameterCacheLimit ?? PARAMETER_COMPACTION_CACHE_SIZE
|
|
67
136
|
});
|
|
68
|
-
let
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
137
|
+
let persistedFrontier = compactedBefore;
|
|
138
|
+
let lastPersistedAt = Date.now();
|
|
139
|
+
while (true) {
|
|
140
|
+
// Interrupting between batches is equivalent to a crash: deletes are idempotent, and the
|
|
141
|
+
// cursor never covers a batch that did not complete.
|
|
142
|
+
this.signal?.throwIfAborted();
|
|
143
|
+
const { frontier, scope } = this.frontier(scopes);
|
|
144
|
+
if (frontier > persistedFrontier && Date.now() - lastPersistedAt >= this.parameterCompactionPersistIntervalMs) {
|
|
145
|
+
await this.persistCompactedBefore(frontier);
|
|
146
|
+
persistedFrontier = frontier;
|
|
147
|
+
lastPersistedAt = Date.now();
|
|
148
|
+
this.logger.info(`Parameter compaction progress: ` + `cursor=${frontier}, target=${this.checkpoint}`);
|
|
149
|
+
}
|
|
150
|
+
if (scope == null) {
|
|
151
|
+
// All scopes have been processed up to the target checkpoint.
|
|
152
|
+
break;
|
|
79
153
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
154
|
+
// The scope on the frontier has processed the least, so taking its next batch is what keeps
|
|
155
|
+
// every scope within one batch of the cursor.
|
|
156
|
+
await this.compactBatch(scope, previousByIdentity);
|
|
157
|
+
if (scope.position >= this.checkpoint && scope.scannedEntries > 0) {
|
|
158
|
+
this.logger.info(`Parameter compaction completed for ${scope.collection.collectionName}: ` +
|
|
159
|
+
`scanned=${scope.scannedEntries}, deleted=${scope.deletedEntries}`);
|
|
84
160
|
}
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
collections: scopes.length,
|
|
164
|
+
scannedEntries: scopes.reduce((total, scope) => total + scope.scannedEntries, 0),
|
|
165
|
+
deletedEntries: scopes.reduce((total, scope) => total + scope.deletedEntries, 0)
|
|
85
166
|
};
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* The boundary that every scope has processed past, capped at the target checkpoint, and the
|
|
170
|
+
* scope sitting on it.
|
|
171
|
+
*
|
|
172
|
+
* The frontier is the furthest the cursor may be advanced. The scope is the one that has
|
|
173
|
+
* processed the least, or null once all of them have reached the target checkpoint.
|
|
174
|
+
*/
|
|
175
|
+
frontier(scopes) {
|
|
176
|
+
let frontier = this.checkpoint;
|
|
177
|
+
let scope = null;
|
|
178
|
+
for (const candidate of scopes) {
|
|
179
|
+
if (candidate.position < frontier) {
|
|
180
|
+
frontier = candidate.position;
|
|
181
|
+
scope = candidate;
|
|
97
182
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
183
|
+
}
|
|
184
|
+
return { frontier, scope };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Reads and processes one batch from the scope, and advances its position past that batch.
|
|
188
|
+
*/
|
|
189
|
+
async compactBatch(scope, previousByIdentity) {
|
|
190
|
+
const batchStartedAt = Date.now();
|
|
191
|
+
const collection = scope.collection;
|
|
192
|
+
// Typed as Document: `_id` here is an InternalOpId (bigint), not the driver's default ObjectId.
|
|
193
|
+
const filter = { _id: { $gte: scope.position, $lt: this.checkpoint } };
|
|
194
|
+
const batch = (await collection
|
|
195
|
+
.find(filter, {
|
|
196
|
+
sort: { _id: 1 },
|
|
197
|
+
limit: this.parameterCompactionBatchSize,
|
|
198
|
+
batchSize: this.parameterCompactionBatchSize + 1,
|
|
199
|
+
projection: { _id: 1, key: 1, lookup: 1, bucket_parameters: { $slice: 1 } }
|
|
200
|
+
})
|
|
201
|
+
.toArray());
|
|
202
|
+
if (batch.length < this.parameterCompactionBatchSize) {
|
|
203
|
+
// Fewer documents than we asked for: this collection has nothing left in the range.
|
|
204
|
+
scope.position = this.checkpoint;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
scope.position = batch.at(-1)._id + 1n;
|
|
208
|
+
}
|
|
209
|
+
if (batch.length == 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
scope.scannedEntries += batch.length;
|
|
213
|
+
const deletedBeforeBatch = scope.deletedEntries;
|
|
214
|
+
// Keep the latest document for each identity and remove all earlier documents from this
|
|
215
|
+
// batch by _id, avoiding a range query for documents that have already been read.
|
|
216
|
+
const newestByIdentity = new Map();
|
|
217
|
+
const supersededIds = [];
|
|
218
|
+
for (const document of batch) {
|
|
219
|
+
if (!this.shouldCompactDocument(document)) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const identity = identityKey(scope, document);
|
|
223
|
+
const previous = newestByIdentity.get(identity);
|
|
224
|
+
if (previous != null) {
|
|
225
|
+
supersededIds.push(previous._id);
|
|
226
|
+
}
|
|
227
|
+
newestByIdentity.set(identity, document);
|
|
228
|
+
}
|
|
229
|
+
const leadingHistoryDeletes = new Map();
|
|
230
|
+
const tombstoneIds = [];
|
|
231
|
+
for (const [identity, document] of newestByIdentity) {
|
|
232
|
+
const previous = previousByIdentity.get(identity);
|
|
233
|
+
if (previous == null) {
|
|
234
|
+
// Have not seen this (key, lookup) before, or it has been evicted from the cache.
|
|
235
|
+
// Delete the entire leading range.
|
|
236
|
+
// This should have decent performance on V3 storage; can be slow in some cases on V1.
|
|
237
|
+
const lookupIdentity = document.lookup.toString('base64');
|
|
238
|
+
const existing = leadingHistoryDeletes.get(lookupIdentity);
|
|
239
|
+
if (existing == null) {
|
|
240
|
+
leadingHistoryDeletes.set(lookupIdentity, { lookup: document.lookup, keys: [document.key] });
|
|
101
241
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
l: doc.lookup
|
|
105
|
-
}).toString('base64');
|
|
106
|
-
const previous = lastByKey.get(uniqueKey);
|
|
107
|
-
if (previous != null && previous < doc._id) {
|
|
108
|
-
// We have a newer entry for the same key, so we can remove the old one.
|
|
109
|
-
removeIds.push(previous);
|
|
242
|
+
else {
|
|
243
|
+
existing.keys.push(document.key);
|
|
110
244
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
245
|
+
}
|
|
246
|
+
else if (previous.retainedId != null) {
|
|
247
|
+
// We have already deleted the leading range for this (key, lookup). Only delete the last remaining
|
|
248
|
+
// one by _id. This is always fast.
|
|
249
|
+
supersededIds.push(previous.retainedId);
|
|
250
|
+
}
|
|
251
|
+
if (document.bucket_parameters?.length == 0) {
|
|
252
|
+
tombstoneIds.push(document._id);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Phase 1: Delete documents read in this batch, plus retained documents from a prior batch.
|
|
256
|
+
scope.deletedEntries += await this.deleteByIds(collection, supersededIds);
|
|
257
|
+
// Phase 2: Delete leading history once per lookup group. The batch is read with
|
|
258
|
+
// `_id < checkpoint`, so this range is checkpoint-bounded.
|
|
259
|
+
const deleteBefore = batch[0]._id;
|
|
260
|
+
// The deletes are collected into bulkWrite commands: With high lookup cardinality there is a
|
|
261
|
+
// group per identity, and a command per group would mean a round trip per identity.
|
|
262
|
+
let deleteOperations = [];
|
|
263
|
+
let pendingKeys = 0;
|
|
264
|
+
const flushDeleteOperations = async () => {
|
|
265
|
+
if (deleteOperations.length == 0) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
// Safe to stop here: an interrupted batch leaves phase 3 tombstones in place, and the
|
|
269
|
+
// remaining deletes are repeated by the next pass.
|
|
270
|
+
this.signal?.throwIfAborted();
|
|
271
|
+
await this.ensureInvalidationFence();
|
|
272
|
+
const result = await collection.bulkWrite(deleteOperations, { ordered: false });
|
|
273
|
+
scope.deletedEntries += result.deletedCount;
|
|
274
|
+
deleteOperations = [];
|
|
275
|
+
pendingKeys = 0;
|
|
276
|
+
};
|
|
277
|
+
for (const { lookup, keys } of leadingHistoryDeletes.values()) {
|
|
278
|
+
for (const keyBatch of chunk(keys, PARAMETER_COMPACTION_DELETE_BATCH_SIZE)) {
|
|
279
|
+
deleteOperations.push({
|
|
280
|
+
deleteMany: { filter: this.leadingHistoryDeleteFilter(lookup, keyBatch, deleteBefore) }
|
|
281
|
+
});
|
|
282
|
+
// Bound the command size by the total number of keys it covers, not by the number of
|
|
283
|
+
// operations: a single group may already cover the entire batch.
|
|
284
|
+
pendingKeys += keyBatch.length;
|
|
285
|
+
if (pendingKeys >= PARAMETER_COMPACTION_DELETE_BATCH_SIZE) {
|
|
286
|
+
await flushDeleteOperations();
|
|
122
287
|
}
|
|
123
288
|
}
|
|
124
|
-
await flush(false);
|
|
125
289
|
}
|
|
126
|
-
|
|
127
|
-
|
|
290
|
+
// Phase 3 requires all leading history to be deleted first.
|
|
291
|
+
await flushDeleteOperations();
|
|
292
|
+
// Phase 3: A tombstone is removed only after all preceding history has been removed.
|
|
293
|
+
scope.deletedEntries += await this.deleteByIds(collection, tombstoneIds);
|
|
294
|
+
// Update the LRU only after all phases succeed. An evicted identity safely falls back to a
|
|
295
|
+
// grouped leading-history delete when it appears again.
|
|
296
|
+
for (const [identity, document] of newestByIdentity) {
|
|
297
|
+
// Tombstones are recorded as `retainedId: null`: phases 2 and 3 removed the entire history
|
|
298
|
+
// for the identity, including the tombstone, so a later sighting needs neither delete.
|
|
299
|
+
previousByIdentity.set(identity, {
|
|
300
|
+
retainedId: document.bucket_parameters?.length == 0 ? null : document._id
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
const batchDurationSeconds = (Date.now() - batchStartedAt) / 1000;
|
|
304
|
+
this.logger.info(`Compacted parameter batch in ${collection.collectionName}: ` +
|
|
305
|
+
`_id ${batch[0]._id}..${batch.at(-1)._id}, scanned=${batch.length} (${scope.scannedEntries} total), ` +
|
|
306
|
+
`batchIdentities=${newestByIdentity.size}, exactIds=${supersededIds.length + tombstoneIds.length}, ` +
|
|
307
|
+
`lookupGroups=${leadingHistoryDeletes.size}, deleted=${scope.deletedEntries - deletedBeforeBatch}, ` +
|
|
308
|
+
`duration=${batchDurationSeconds.toFixed(1)}s`);
|
|
309
|
+
}
|
|
310
|
+
/** Deletes documents by `_id`, chunked to bound the command size. Returns the number deleted. */
|
|
311
|
+
async deleteByIds(collection, ids) {
|
|
312
|
+
let deletedEntries = 0;
|
|
313
|
+
for (const idBatch of chunk(ids, PARAMETER_COMPACTION_DELETE_BATCH_SIZE)) {
|
|
314
|
+
this.signal?.throwIfAborted();
|
|
315
|
+
await this.ensureInvalidationFence();
|
|
316
|
+
// Cast: `_id` here is an InternalOpId (bigint), not the driver's default ObjectId.
|
|
317
|
+
const result = await collection.deleteMany({ _id: { $in: idBatch } });
|
|
318
|
+
deletedEntries += result.deletedCount;
|
|
319
|
+
}
|
|
320
|
+
return deletedEntries;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Identifies a (key, lookup) pair within one collection.
|
|
325
|
+
*
|
|
326
|
+
* The collection is part of the identity: V3 keeps the parameter index id in the collection name
|
|
327
|
+
* rather than in the lookup, so the same (key, lookup) can appear in multiple collections meaning
|
|
328
|
+
* different things. Deleting the history of one says nothing about the other.
|
|
329
|
+
*/
|
|
330
|
+
function identityKey(scope, document) {
|
|
331
|
+
const serialized = bson.serialize({
|
|
332
|
+
c: scope.collection.collectionName,
|
|
333
|
+
k: document.key,
|
|
334
|
+
l: document.lookup
|
|
335
|
+
});
|
|
336
|
+
return serialized.toString('base64');
|
|
337
|
+
}
|
|
338
|
+
function* chunk(items, size) {
|
|
339
|
+
for (let offset = 0; offset < items.length; offset += size) {
|
|
340
|
+
yield items.slice(offset, offset + size);
|
|
128
341
|
}
|
|
129
342
|
}
|
|
130
343
|
//# sourceMappingURL=MongoParameterCompactor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoParameterCompactor.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoParameterCompactor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MongoParameterCompactor.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoParameterCompactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BucketDefinitionMapping, storage, SyncConfigWithMapping } from '@powersync/service-core';
|
|
2
|
-
import { HydratedSyncConfig, HydrationState, SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
2
|
+
import { EventDefinitionId, HydratedEventDescriptor, HydratedSyncConfig, HydrationState, SyncConfigWithErrors } from '@powersync/service-sync-rules';
|
|
3
3
|
import { StorageConfig } from './models.js';
|
|
4
4
|
export declare class MongoParsedSyncConfigSet implements storage.ParsedSyncConfigSet {
|
|
5
5
|
#private;
|
|
@@ -10,4 +10,12 @@ export declare class MongoParsedSyncConfigSet implements storage.ParsedSyncConfi
|
|
|
10
10
|
readonly mapping: BucketDefinitionMapping;
|
|
11
11
|
constructor(replicationStreamId: number, storageConfig: StorageConfig, slotName: string, syncConfigs: SyncConfigWithMapping[]);
|
|
12
12
|
get hydratedSyncConfig(): HydratedSyncConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Hydrated events for the replication stream, keyed by their assigned storage id.
|
|
15
|
+
*
|
|
16
|
+
* Each config's events are resolved against that config's own (single-config) mapping, so the resolution is
|
|
17
|
+
* unambiguous, and the result is deduplicated by assigned id: unchanged events shared across configs collapse to
|
|
18
|
+
* one entry, while a changed event keeps a separate entry under its new id.
|
|
19
|
+
*/
|
|
20
|
+
get eventById(): ReadonlyMap<EventDefinitionId, HydratedEventDescriptor>;
|
|
13
21
|
}
|
|
@@ -9,9 +9,11 @@ export class MongoParsedSyncConfigSet {
|
|
|
9
9
|
syncConfigs;
|
|
10
10
|
replicationStreamName;
|
|
11
11
|
mapping;
|
|
12
|
+
#configsWithMapping;
|
|
12
13
|
constructor(replicationStreamId, storageConfig, slotName, syncConfigs) {
|
|
13
14
|
this.replicationStreamId = replicationStreamId;
|
|
14
15
|
this.replicationStreamName = slotName;
|
|
16
|
+
this.#configsWithMapping = [...syncConfigs];
|
|
15
17
|
this.syncConfigs = syncConfigs.map((config) => config.syncConfig);
|
|
16
18
|
if (this.syncConfigs.length == 0) {
|
|
17
19
|
throw new ServiceAssertionError(`At least one sync config is required`);
|
|
@@ -60,5 +62,32 @@ export class MongoParsedSyncConfigSet {
|
|
|
60
62
|
});
|
|
61
63
|
return this.#hydratedSyncConfig;
|
|
62
64
|
}
|
|
65
|
+
#eventById;
|
|
66
|
+
/**
|
|
67
|
+
* Hydrated events for the replication stream, keyed by their assigned storage id.
|
|
68
|
+
*
|
|
69
|
+
* Each config's events are resolved against that config's own (single-config) mapping, so the resolution is
|
|
70
|
+
* unambiguous, and the result is deduplicated by assigned id: unchanged events shared across configs collapse to
|
|
71
|
+
* one entry, while a changed event keeps a separate entry under its new id.
|
|
72
|
+
*/
|
|
73
|
+
get eventById() {
|
|
74
|
+
if (this.#eventById == null) {
|
|
75
|
+
const map = new Map();
|
|
76
|
+
const byDefinition = this.hydratedSyncConfig.eventDescriptorsByDefinition;
|
|
77
|
+
for (const config of this.#configsWithMapping) {
|
|
78
|
+
if (config.mapping == null) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
for (const event of byDefinition.get(config.syncConfig.config) ?? []) {
|
|
82
|
+
const id = config.mapping.eventId(event);
|
|
83
|
+
if (!map.has(id)) {
|
|
84
|
+
map.set(id, event);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
this.#eventById = map;
|
|
89
|
+
}
|
|
90
|
+
return this.#eventById;
|
|
91
|
+
}
|
|
63
92
|
}
|
|
64
93
|
//# sourceMappingURL=MongoParsedSyncConfigSet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoParsedSyncConfigSet.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoParsedSyncConfigSet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAEL,sCAAsC,EACtC,uCAAuC,EAIxC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"MongoParsedSyncConfigSet.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoParsedSyncConfigSet.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,7 +51,8 @@ export class MongoPersistedSyncConfigContentV1 extends MongoPersistedSyncConfigC
|
|
|
51
51
|
storageVersion: doc.storage_version ?? storage.LEGACY_STORAGE_VERSION,
|
|
52
52
|
mapping: new SingleSyncConfigBucketDefinitionMapping(),
|
|
53
53
|
syncConfigId: null,
|
|
54
|
-
syncConfigState: doc.state
|
|
54
|
+
syncConfigState: doc.state,
|
|
55
|
+
version_label: doc.version_label ?? undefined
|
|
55
56
|
});
|
|
56
57
|
}
|
|
57
58
|
async getSyncConfigStatus() {
|
|
@@ -76,7 +77,8 @@ export class MongoPersistedSyncConfigContentV3 extends MongoPersistedSyncConfigC
|
|
|
76
77
|
storageVersion: doc.storage_version,
|
|
77
78
|
mapping: SingleSyncConfigBucketDefinitionMapping.fromPersistedMapping(config.rule_mapping),
|
|
78
79
|
syncConfigId: config._id,
|
|
79
|
-
syncConfigState: state.state
|
|
80
|
+
syncConfigState: state.state,
|
|
81
|
+
version_label: config.version_label
|
|
80
82
|
});
|
|
81
83
|
}
|
|
82
84
|
async getSyncConfigStatus() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoPersistedSyncConfigContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,uCAAuC,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAS3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,OAAgB,mCAAoC,SAAQ,OAAO,CAAC,0BAA0B;IAK7E;IAJL,OAAO,CAA0C;IACjD,kBAAkB,CAAuB;IAEzD,YACqB,EAAkB,EACrC,OAGC;QAED,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACnD,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,IAAI;SAClD,CAAC,CAAC;QAVgB,OAAE,GAAF,EAAE,CAAgB;QAWrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;IACzC,CAAC;IAED,gBAAgB;QACd,OAAO,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,OAAuC;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC;QACxC,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,qBAAqB,CAAC,iCAAiC,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,aAAa,CAAC,uBAAuB,EAAE,CAAC;YAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACvC,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;gBACzB,MAAM,IAAI,qBAAqB,CAAC,qDAAqD,CAAC,CAAC;YACzF,CAAC;YAED,OAAO,IAAI,wBAAwB,CAAC,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE;gBAC3G,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aACpD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,wBAAwB,CAAC,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,MAAM,CAAC,qBAAqB,EAAE;YAC3G,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;CACF;AACD,MAAM,OAAO,iCAAkC,SAAQ,mCAAmC;IACxF,YAAY,EAAkB,EAAE,GAAuB;QACrD,KAAK,CAAC,EAAE,EAAE;YACR,mBAAmB,EAAE,GAAG,CAAC,GAAG;YAC5B,kBAAkB,EAAE,GAAG,CAAC,OAAO;YAC/B,aAAa,EAAE,GAAG,CAAC,eAAe,IAAI,IAAI;YAC1C,uBAAuB;YACvB,qBAAqB,EAAE,GAAG,CAAC,SAAS,IAAI,aAAa,GAAG,CAAC,GAAG,EAAE;YAC9D,cAAc,EAAE,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,sBAAsB;YACrE,OAAO,EAAE,IAAI,uCAAuC,EAAE;YACtD,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,GAAG,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"MongoPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/implementation/MongoPersistedSyncConfigContent.ts"],"names":[],"mappings":"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"}
|