@powersync/service-module-mongodb-storage 0.0.0-dev-20260602073133 → 0.0.0-dev-20260909133214
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 +177 -5
- package/dist/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.d.ts +3 -0
- package/dist/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.js +41 -0
- package/dist/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.js.map +1 -0
- package/dist/storage/MongoBucketStorage.d.ts +71 -18
- package/dist/storage/MongoBucketStorage.js +516 -202
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatch.d.ts +71 -29
- package/dist/storage/implementation/MongoBucketBatch.js +140 -66
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoChecksums.d.ts +41 -13
- package/dist/storage/implementation/MongoChecksums.js +36 -121
- package/dist/storage/implementation/MongoChecksums.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +28 -90
- package/dist/storage/implementation/MongoCompactor.js +87 -481
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoHydrationState.d.ts +11 -0
- package/dist/storage/implementation/MongoHydrationState.js +49 -0
- package/dist/storage/implementation/MongoHydrationState.js.map +1 -0
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +82 -8
- package/dist/storage/implementation/MongoParameterCompactor.js +312 -76
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParsedSyncConfigSet.d.ts +21 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js +93 -0
- package/dist/storage/implementation/MongoParsedSyncConfigSet.js.map +1 -0
- package/dist/storage/implementation/MongoPersistedReplicationStream.d.ts +36 -0
- package/dist/storage/implementation/MongoPersistedReplicationStream.js +90 -0
- package/dist/storage/implementation/MongoPersistedReplicationStream.js.map +1 -0
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.d.ts +25 -0
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js +125 -0
- package/dist/storage/implementation/MongoPersistedSyncConfigContent.js.map +1 -0
- package/dist/storage/implementation/MongoStorageProvider.js +41 -4
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +81 -37
- package/dist/storage/implementation/MongoSyncBucketStorage.js +159 -86
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.d.ts +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.js +23 -11
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +11 -8
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +159 -33
- 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 +28 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.js +2 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageCheckpoint.js.map +1 -0
- package/dist/storage/implementation/common/PersistedBatch.d.ts +34 -2
- package/dist/storage/implementation/common/PersistedBatch.js +63 -10
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -1
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +1 -1
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -1
- package/dist/storage/implementation/createMongoSyncBucketStorage.d.ts +2 -2
- package/dist/storage/implementation/createMongoSyncBucketStorage.js +4 -4
- package/dist/storage/implementation/createMongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/db.d.ts +4 -1
- package/dist/storage/implementation/db.js +31 -16
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +55 -13
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +15 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +135 -107
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoChecksumsV1.d.ts +4 -4
- package/dist/storage/implementation/v1/MongoChecksumsV1.js +119 -7
- package/dist/storage/implementation/v1/MongoChecksumsV1.js.map +1 -1
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +47 -7
- package/dist/storage/implementation/v1/MongoCompactorV1.js +478 -8
- 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 +33 -27
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +146 -73
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -1
- package/dist/storage/implementation/v1/SingleBucketStoreV1.d.ts +9 -10
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js +2 -8
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js.map +1 -1
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.d.ts +2 -1
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js +3 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js.map +1 -1
- package/dist/storage/implementation/v1/models.d.ts +10 -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/BucketDataContextV3.d.ts +13 -0
- package/dist/storage/implementation/v3/BucketDataContextV3.js +23 -0
- package/dist/storage/implementation/v3/BucketDataContextV3.js.map +1 -0
- 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 +16 -5
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +393 -262
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoChecksumsV3.d.ts +30 -9
- package/dist/storage/implementation/v3/MongoChecksumsV3.js +161 -20
- package/dist/storage/implementation/v3/MongoChecksumsV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +108 -18
- package/dist/storage/implementation/v3/MongoCompactorV3.js +1115 -47
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +12 -3
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +13 -8
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -1
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.d.ts +54 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js +319 -0
- package/dist/storage/implementation/v3/MongoStoppedSyncConfigCleanup.js.map +1 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +61 -36
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +353 -161
- 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 +8 -3
- package/dist/storage/implementation/v3/PersistedBatchV3.js +131 -29
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -1
- package/dist/storage/implementation/v3/SourceRecordStoreV3.d.ts +3 -3
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js +13 -11
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js.map +1 -1
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +26 -14
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +73 -29
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -1
- package/dist/storage/implementation/v3/bucket-format.d.ts +13 -0
- package/dist/storage/implementation/v3/bucket-format.js +79 -0
- package/dist/storage/implementation/v3/bucket-format.js.map +1 -0
- package/dist/storage/implementation/v3/chunking.d.ts +10 -0
- package/dist/storage/implementation/v3/chunking.js +30 -0
- package/dist/storage/implementation/v3/chunking.js.map +1 -0
- 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 +187 -23
- package/dist/storage/implementation/v3/models.js +11 -28
- package/dist/storage/implementation/v3/models.js.map +1 -1
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.d.ts +20 -0
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js +48 -0
- package/dist/storage/implementation/v3/object-storage/BucketDataObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.d.ts +33 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.js +12 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.d.ts +68 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js +154 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageLifecycle.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.d.ts +37 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js +167 -0
- package/dist/storage/implementation/v3/object-storage/ObjectStorageUsage.js.map +1 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.d.ts +67 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js +439 -0
- package/dist/storage/implementation/v3/object-storage/S3ObjectStorage.js.map +1 -0
- package/dist/storage/implementation/v3/source-table-utils.d.ts +63 -0
- package/dist/storage/implementation/v3/source-table-utils.js +206 -0
- package/dist/storage/implementation/v3/source-table-utils.js.map +1 -0
- package/dist/storage/storage-index.d.ts +5 -4
- package/dist/storage/storage-index.js +5 -4
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/types/types.d.ts +71 -3
- package/dist/types/types.js +58 -2
- package/dist/types/types.js.map +1 -1
- package/dist/utils/test-utils.d.ts +1 -2
- package/dist/utils/test-utils.js +7 -1
- package/dist/utils/test-utils.js.map +1 -1
- package/dist/utils/util.d.ts +9 -2
- package/dist/utils/util.js +131 -5
- package/dist/utils/util.js.map +1 -1
- package/package.json +13 -19
- package/src/migrations/db/migrations/1782950400000-checkpoint-requested-at-index.ts +55 -0
- package/src/storage/MongoBucketStorage.ts +728 -242
- package/src/storage/implementation/MongoBucketBatch.ts +196 -91
- package/src/storage/implementation/MongoChecksums.ts +93 -153
- package/src/storage/implementation/MongoCompactor.ts +106 -631
- package/src/storage/implementation/MongoHydrationState.ts +61 -0
- package/src/storage/implementation/MongoParameterCompactor.ts +392 -87
- package/src/storage/implementation/MongoParsedSyncConfigSet.ts +122 -0
- package/src/storage/implementation/MongoPersistedReplicationStream.ts +118 -0
- package/src/storage/implementation/MongoPersistedSyncConfigContent.ts +156 -0
- package/src/storage/implementation/MongoStorageProvider.ts +48 -4
- package/src/storage/implementation/MongoSyncBucketStorage.ts +226 -118
- package/src/storage/implementation/MongoSyncRulesLock.ts +28 -12
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +194 -52
- package/src/storage/implementation/SyncRuleStateUpdate.ts +13 -6
- package/src/storage/implementation/common/MongoSyncBucketStorageCheckpoint.ts +31 -0
- package/src/storage/implementation/common/PersistedBatch.ts +83 -15
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +1 -1
- package/src/storage/implementation/createMongoSyncBucketStorage.ts +21 -7
- package/src/storage/implementation/db.ts +40 -22
- package/src/storage/implementation/models.ts +58 -14
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +174 -125
- package/src/storage/implementation/v1/MongoChecksumsV1.ts +154 -12
- package/src/storage/implementation/v1/MongoCompactorV1.ts +594 -25
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +25 -9
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +226 -129
- package/src/storage/implementation/v1/SingleBucketStoreV1.ts +18 -27
- package/src/storage/implementation/v1/VersionedPowerSyncMongoV1.ts +11 -1
- package/src/storage/implementation/v1/models.ts +12 -1
- package/src/storage/implementation/v3/BucketDataContextV3.ts +32 -0
- package/src/storage/implementation/v3/CompactionLease.ts +152 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +502 -324
- package/src/storage/implementation/v3/MongoChecksumsV3.ts +250 -32
- package/src/storage/implementation/v3/MongoCompactorV3.ts +1439 -70
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +19 -9
- package/src/storage/implementation/v3/MongoStoppedSyncConfigCleanup.ts +473 -0
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +453 -211
- package/src/storage/implementation/v3/MongoWriteCheckpointAPIV3.ts +111 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +169 -45
- package/src/storage/implementation/v3/SourceRecordStoreV3.ts +12 -12
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +99 -38
- package/src/storage/implementation/v3/bucket-format.ts +99 -0
- package/src/storage/implementation/v3/chunking.ts +40 -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 +228 -58
- package/src/storage/implementation/v3/object-storage/BucketDataObjectStorage.ts +62 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorage.ts +44 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorageLifecycle.ts +182 -0
- package/src/storage/implementation/v3/object-storage/ObjectStorageUsage.ts +230 -0
- package/src/storage/implementation/v3/object-storage/S3ObjectStorage.ts +573 -0
- package/src/storage/implementation/v3/source-table-utils.ts +398 -0
- package/src/storage/storage-index.ts +14 -4
- package/src/types/types.ts +76 -2
- package/src/utils/test-utils.ts +8 -3
- package/src/utils/util.ts +188 -7
- package/test/src/__snapshots__/storage.test.ts.snap +4 -54
- package/test/src/__snapshots__/storage_sync.test.ts.snap +652 -645
- package/test/src/cleanup-stopped-sync-configs.test.ts +698 -0
- package/test/src/compact-utils.test.ts +226 -0
- package/test/src/helpers/MemoryObjectStorage.ts +61 -0
- package/test/src/helpers/s3TestFactory.ts +69 -0
- package/test/src/object_storage_lifecycle.test.ts +59 -0
- package/test/src/object_storage_usage.test.ts +255 -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/setup.ts +6 -1
- package/test/src/storage.test.ts +478 -13
- package/test/src/storage_compacting.test.ts +2516 -107
- package/test/src/storage_object_storage_inline_threshold.test.ts +116 -0
- package/test/src/storage_s3_checksums.test.ts +190 -0
- package/test/src/storage_s3_compaction_lifecycle.test.ts +543 -0
- package/test/src/storage_s3_reading.test.ts +768 -0
- package/test/src/storage_s3_writing.test.ts +136 -0
- package/test/src/storage_sync.test.ts +1507 -76
- package/test/src/storeCurrentData.test.ts +227 -0
- package/test/src/util.ts +3 -2
- package/tsconfig.json +1 -4
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/implementation/BucketDefinitionMapping.d.ts +0 -15
- package/dist/storage/implementation/BucketDefinitionMapping.js +0 -58
- package/dist/storage/implementation/BucketDefinitionMapping.js.map +0 -1
- package/dist/storage/implementation/MongoPersistedSyncRules.d.ts +0 -14
- package/dist/storage/implementation/MongoPersistedSyncRules.js +0 -67
- package/dist/storage/implementation/MongoPersistedSyncRules.js.map +0 -1
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.d.ts +0 -29
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js +0 -76
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js.map +0 -1
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.d.ts +0 -13
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js +0 -2
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js.map +0 -1
- package/dist/storage/implementation/common/SingleBucketStore.d.ts +0 -54
- package/dist/storage/implementation/common/SingleBucketStore.js +0 -3
- package/dist/storage/implementation/common/SingleBucketStore.js.map +0 -1
- package/dist/storage/implementation/v3/MongoParameterLookupV3.d.ts +0 -4
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js +0 -9
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js.map +0 -1
- package/dist/storage/implementation/v3/SingleBucketStoreV3.d.ts +0 -18
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js +0 -48
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js.map +0 -1
- package/src/storage/implementation/BucketDefinitionMapping.ts +0 -75
- package/src/storage/implementation/MongoPersistedSyncRules.ts +0 -82
- package/src/storage/implementation/MongoPersistedSyncRulesContent.ts +0 -101
- package/src/storage/implementation/common/MongoSyncBucketStorageContext.ts +0 -15
- package/src/storage/implementation/common/SingleBucketStore.ts +0 -63
- package/src/storage/implementation/v3/MongoParameterLookupV3.ts +0 -11
- package/src/storage/implementation/v3/SingleBucketStoreV3.ts +0 -68
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
2
|
import { retryOnMongoMaxTimeMSExpired } from '../../../utils/util.js';
|
|
3
3
|
import { cacheKey } from '../OperationBatch.js';
|
|
4
|
-
import {
|
|
4
|
+
import { serializeParameterLookup } from './models.js';
|
|
5
5
|
export class SourceRecordStoreV3 {
|
|
6
6
|
db;
|
|
7
|
-
|
|
7
|
+
replicationStreamId;
|
|
8
8
|
mapping;
|
|
9
|
-
constructor(db,
|
|
9
|
+
constructor(db, replicationStreamId, mapping) {
|
|
10
10
|
this.db = db;
|
|
11
|
-
this.
|
|
11
|
+
this.replicationStreamId = replicationStreamId;
|
|
12
12
|
this.mapping = mapping;
|
|
13
13
|
}
|
|
14
14
|
mapEvaluatedBuckets(evaluated) {
|
|
@@ -22,7 +22,7 @@ export class SourceRecordStoreV3 {
|
|
|
22
22
|
mapParameterLookups(paramEvaluated) {
|
|
23
23
|
return paramEvaluated.map((entry) => ({
|
|
24
24
|
indexId: this.mapping.parameterLookupId(entry.lookup.source),
|
|
25
|
-
lookup:
|
|
25
|
+
lookup: serializeParameterLookup(entry.lookup)
|
|
26
26
|
}));
|
|
27
27
|
}
|
|
28
28
|
createLoadedDocument(sourceTableId, id, data, buckets, lookups) {
|
|
@@ -50,7 +50,7 @@ export class SourceRecordStoreV3 {
|
|
|
50
50
|
_id: { $in: replicaIds }
|
|
51
51
|
};
|
|
52
52
|
const sizeCursor = this.db
|
|
53
|
-
.
|
|
53
|
+
.sourceRecords(this.replicationStreamId, sourceTableId)
|
|
54
54
|
.aggregate([
|
|
55
55
|
{
|
|
56
56
|
$match: filter
|
|
@@ -75,7 +75,9 @@ export class SourceRecordStoreV3 {
|
|
|
75
75
|
const filter = {
|
|
76
76
|
_id: { $in: replicaIds }
|
|
77
77
|
};
|
|
78
|
-
const cursor = this.db
|
|
78
|
+
const cursor = this.db
|
|
79
|
+
.sourceRecords(this.replicationStreamId, sourceTableId)
|
|
80
|
+
.find(filter, { session, projection });
|
|
79
81
|
for await (const doc of cursor.stream()) {
|
|
80
82
|
const loaded = this.createLoadedDocument(sourceTableId, doc._id, idsOnly ? null : doc.data, idsOnly ? [] : doc.buckets, idsOnly ? [] : doc.lookups);
|
|
81
83
|
documents.set(loaded.cacheKey, loaded);
|
|
@@ -84,7 +86,7 @@ export class SourceRecordStoreV3 {
|
|
|
84
86
|
return documents;
|
|
85
87
|
}
|
|
86
88
|
async loadTruncateBatch(session, sourceTableId, limit) {
|
|
87
|
-
const cursor = this.db.
|
|
89
|
+
const cursor = this.db.sourceRecords(this.replicationStreamId, sourceTableId).find({
|
|
88
90
|
pending_delete: { $exists: false }
|
|
89
91
|
}, {
|
|
90
92
|
projection: {
|
|
@@ -102,7 +104,7 @@ export class SourceRecordStoreV3 {
|
|
|
102
104
|
// Since there may be a lot (100+) of these collections in some cases, we track which
|
|
103
105
|
// ones have dirty deletes in source_tables.
|
|
104
106
|
const dirtySourceTables = await this.db
|
|
105
|
-
.
|
|
107
|
+
.sourceTables(this.replicationStreamId)
|
|
106
108
|
.find({
|
|
107
109
|
latest_pending_delete: { $exists: true }
|
|
108
110
|
}, {
|
|
@@ -112,7 +114,7 @@ export class SourceRecordStoreV3 {
|
|
|
112
114
|
let deletedCount = 0;
|
|
113
115
|
const sourceTableUpdates = [];
|
|
114
116
|
for (const sourceTable of dirtySourceTables) {
|
|
115
|
-
const collection = this.db.
|
|
117
|
+
const collection = this.db.sourceRecords(this.replicationStreamId, sourceTable._id);
|
|
116
118
|
const result = await this.deletePendingDeletes(collection, sourceTable._id, lastCheckpoint, logger);
|
|
117
119
|
deletedCount += result.deletedCount;
|
|
118
120
|
if (sourceTable.latest_pending_delete != null && sourceTable.latest_pending_delete <= lastCheckpoint) {
|
|
@@ -133,7 +135,7 @@ export class SourceRecordStoreV3 {
|
|
|
133
135
|
}
|
|
134
136
|
}
|
|
135
137
|
if (sourceTableUpdates.length > 0) {
|
|
136
|
-
await this.db.
|
|
138
|
+
await this.db.sourceTables(this.replicationStreamId).bulkWrite(sourceTableUpdates, { ordered: false });
|
|
137
139
|
}
|
|
138
140
|
if (deletedCount > 0) {
|
|
139
141
|
logger.info(`Cleaned up ${deletedCount} pending delete current_data records for checkpoint ${lastCheckpoint}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SourceRecordStoreV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/SourceRecordStoreV3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAM5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"SourceRecordStoreV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/SourceRecordStoreV3.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
-
import { BucketDefinitionId, ParameterIndexId } from '@powersync/service-sync-rules';
|
|
2
|
+
import { BucketDefinitionId, EventDefinitionId, ParameterIndexId } from '@powersync/service-sync-rules';
|
|
3
3
|
import { BaseVersionedPowerSyncMongo } from '../common/VersionedPowerSyncMongoBase.js';
|
|
4
4
|
import { CommonSourceTableDocument } from '../models.js';
|
|
5
|
-
import { BucketDataDocumentV3, BucketParameterDocumentV3, BucketStateDocumentV3, CurrentDataDocumentV3, SourceTableDocumentV3, SyncConfigDefinition } from './models.js';
|
|
5
|
+
import { BucketDataDocumentV3, BucketParameterDocumentV3, BucketStateDocumentV3, CurrentDataDocumentV3, CustomCheckpointRequestDocumentV3, ObjectStorageDeletionMarker, ObjectStorageUsageDocument, SourceTableDocumentV3, SyncConfigDefinition } from './models.js';
|
|
6
|
+
export declare const OBJECT_STORAGE_USAGE_COLLECTION = "object_storage_usage";
|
|
7
|
+
export type CustomCheckpointRequestCollectionSpecifier = {
|
|
8
|
+
replicationStreamId: number;
|
|
9
|
+
eventId: EventDefinitionId;
|
|
10
|
+
};
|
|
6
11
|
export declare class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
12
|
+
constructor(upstream: ConstructorParameters<typeof BaseVersionedPowerSyncMongo>[0], storageConfig: ConstructorParameters<typeof BaseVersionedPowerSyncMongo>[1]);
|
|
7
13
|
get syncConfigDefinitions(): mongo.Collection<SyncConfigDefinition>;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
initializeSourceRecordsCollection(replicationStreamId: number, sourceTableId: mongo.ObjectId): Promise<void>;
|
|
14
|
+
sourceRecords(replicationStreamId: number, sourceTableId: mongo.ObjectId): mongo.Collection<CurrentDataDocumentV3>;
|
|
15
|
+
listSourceRecordCollections(replicationStreamId: number): Promise<mongo.Collection<CurrentDataDocumentV3>[]>;
|
|
16
|
+
initializeSourceRecordsCollection(replicationStreamId: number, sourceTableId: mongo.ObjectId, session?: mongo.ClientSession): Promise<void>;
|
|
11
17
|
commonSourceTables(replicationStreamId: number): mongo.Collection<CommonSourceTableDocument>;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
bucketState(replicationStreamId: number): mongo.Collection<BucketStateDocumentV3>;
|
|
19
|
+
parameterIndex(replicationStreamId: number, indexId: ParameterIndexId): mongo.Collection<BucketParameterDocumentV3>;
|
|
20
|
+
sourceTables(replicationStreamId: number): mongo.Collection<SourceTableDocumentV3>;
|
|
21
|
+
bucketData(replicationStreamId: number, definitionId: BucketDefinitionId): mongo.Collection<BucketDataDocumentV3>;
|
|
22
|
+
pendingObjectStorageDeletes(replicationStreamId: number): mongo.Collection<ObjectStorageDeletionMarker>;
|
|
23
|
+
get objectStorageUsage(): mongo.Collection<ObjectStorageUsageDocument>;
|
|
24
|
+
customCheckpointRequests(options: CustomCheckpointRequestCollectionSpecifier): mongo.Collection<CustomCheckpointRequestDocumentV3>;
|
|
25
|
+
initializeCustomCheckpointRequestsCollection(options: CustomCheckpointRequestCollectionSpecifier): Promise<void>;
|
|
26
|
+
listCustomCheckpointRequestCollections(replicationStreamId: number): Promise<mongo.Collection<CustomCheckpointRequestDocumentV3>[]>;
|
|
27
|
+
listBucketDataCollections(replicationStreamId: number): Promise<mongo.Collection<mongo.BSON.Document>[]>;
|
|
28
|
+
listParameterIndexCollections(replicationStreamId: number): Promise<{
|
|
29
|
+
collection: mongo.Collection<mongo.BSON.Document>;
|
|
30
|
+
indexId: string;
|
|
21
31
|
}[]>;
|
|
32
|
+
initializeStreamStorage(replicationStreamId: number): Promise<void>;
|
|
33
|
+
customCheckpointRequestCollectionName(options: CustomCheckpointRequestCollectionSpecifier): string;
|
|
22
34
|
}
|
|
@@ -1,38 +1,92 @@
|
|
|
1
1
|
import { BaseVersionedPowerSyncMongo } from '../common/VersionedPowerSyncMongoBase.js';
|
|
2
|
+
export const OBJECT_STORAGE_USAGE_COLLECTION = 'object_storage_usage';
|
|
2
3
|
export class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
4
|
+
constructor(upstream, storageConfig) {
|
|
5
|
+
super(upstream, storageConfig);
|
|
6
|
+
}
|
|
3
7
|
get syncConfigDefinitions() {
|
|
4
8
|
return this.db.collection('sync_config');
|
|
5
9
|
}
|
|
6
|
-
|
|
10
|
+
sourceRecords(replicationStreamId, sourceTableId) {
|
|
7
11
|
const collectionName = this.sourceRecordsCollectionName(replicationStreamId, sourceTableId);
|
|
8
12
|
return this.db.collection(collectionName);
|
|
9
13
|
}
|
|
10
|
-
async
|
|
14
|
+
async listSourceRecordCollections(replicationStreamId) {
|
|
11
15
|
return this.listCollectionsByPrefix(`source_records_${replicationStreamId}_`);
|
|
12
16
|
}
|
|
13
|
-
async initializeSourceRecordsCollection(replicationStreamId, sourceTableId) {
|
|
14
|
-
await this.
|
|
17
|
+
async initializeSourceRecordsCollection(replicationStreamId, sourceTableId, session) {
|
|
18
|
+
await this.sourceRecords(replicationStreamId, sourceTableId).createIndex({
|
|
15
19
|
pending_delete: 1
|
|
16
20
|
}, {
|
|
17
21
|
partialFilterExpression: { pending_delete: { $exists: true } },
|
|
18
|
-
name: 'pending_delete'
|
|
22
|
+
name: 'pending_delete',
|
|
23
|
+
session
|
|
19
24
|
});
|
|
20
25
|
}
|
|
21
26
|
commonSourceTables(replicationStreamId) {
|
|
22
|
-
return this.
|
|
27
|
+
return this.sourceTables(replicationStreamId);
|
|
23
28
|
}
|
|
24
|
-
|
|
29
|
+
bucketState(replicationStreamId) {
|
|
25
30
|
return this.db.collection(`bucket_state_${replicationStreamId}`);
|
|
26
31
|
}
|
|
27
|
-
|
|
32
|
+
parameterIndex(replicationStreamId, indexId) {
|
|
28
33
|
return this.db.collection(`parameter_index_${replicationStreamId}_${indexId}`);
|
|
29
34
|
}
|
|
30
|
-
|
|
35
|
+
sourceTables(replicationStreamId) {
|
|
31
36
|
return this.db.collection(this.sourceTableCollectionName(replicationStreamId));
|
|
32
37
|
}
|
|
38
|
+
bucketData(replicationStreamId, definitionId) {
|
|
39
|
+
return this.db.collection(`bucket_data_${replicationStreamId}_${definitionId}`);
|
|
40
|
+
}
|
|
41
|
+
pendingObjectStorageDeletes(replicationStreamId) {
|
|
42
|
+
return this.db.collection(`pending_object_storage_deletes_${replicationStreamId}`);
|
|
43
|
+
}
|
|
44
|
+
get objectStorageUsage() {
|
|
45
|
+
return this.db.collection(OBJECT_STORAGE_USAGE_COLLECTION);
|
|
46
|
+
}
|
|
47
|
+
customCheckpointRequests(options) {
|
|
48
|
+
const collectionName = this.customCheckpointRequestCollectionName(options);
|
|
49
|
+
return this.db.collection(collectionName);
|
|
50
|
+
}
|
|
51
|
+
async initializeCustomCheckpointRequestsCollection(options) {
|
|
52
|
+
// createIndexes also creates the collection on first use. Callers invoke
|
|
53
|
+
// this lazily before the transaction which writes the first checkpoint.
|
|
54
|
+
await this.customCheckpointRequests(options).createIndexes([
|
|
55
|
+
{
|
|
56
|
+
key: { user_id: 1 },
|
|
57
|
+
name: 'user_unique',
|
|
58
|
+
unique: true
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
// Find checkpoint changes over an operation-id range.
|
|
62
|
+
key: { op_id: 1 },
|
|
63
|
+
name: 'op_id'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
// Limit retention scans to temporary client-requested checkpoints.
|
|
67
|
+
key: { checkpoint_requested_at: 1 },
|
|
68
|
+
name: 'checkpoint_requested_at',
|
|
69
|
+
partialFilterExpression: { checkpoint_requested_at: { $exists: true } }
|
|
70
|
+
}
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
listCustomCheckpointRequestCollections(replicationStreamId) {
|
|
74
|
+
return this.upstream.listCustomCheckpointRequestCollections(replicationStreamId);
|
|
75
|
+
}
|
|
76
|
+
listBucketDataCollections(replicationStreamId) {
|
|
77
|
+
return this.listCollectionsByPrefix(`bucket_data_${replicationStreamId}_`);
|
|
78
|
+
}
|
|
79
|
+
async listParameterIndexCollections(replicationStreamId) {
|
|
80
|
+
const prefix = `parameter_index_${replicationStreamId}_`;
|
|
81
|
+
const collections = await this.listCollectionsByPrefix(prefix);
|
|
82
|
+
return collections.map((collection) => ({
|
|
83
|
+
collection,
|
|
84
|
+
indexId: collection.collectionName.slice(prefix.length)
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
33
87
|
async initializeStreamStorage(replicationStreamId) {
|
|
34
|
-
const sourceTables = this.
|
|
35
|
-
const bucketState = this.
|
|
88
|
+
const sourceTables = this.sourceTables(replicationStreamId);
|
|
89
|
+
const bucketState = this.bucketState(replicationStreamId);
|
|
36
90
|
await sourceTables.createIndex({
|
|
37
91
|
connection_id: 1,
|
|
38
92
|
schema_name: 1,
|
|
@@ -50,25 +104,15 @@ export class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
|
50
104
|
await bucketState.createIndex({
|
|
51
105
|
last_op: 1
|
|
52
106
|
}, { name: 'bucket_updates', unique: true });
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
listBucketDataCollectionsV3(replicationStreamId) {
|
|
61
|
-
return this.upstream.listBucketDataCollectionsV3(replicationStreamId);
|
|
107
|
+
// V3 workers claim only buckets that have reached their scheduled check
|
|
108
|
+
// time, keeping scheduled scans proportional to pending work.
|
|
109
|
+
await bucketState.createIndex({ next_compact_check: 1 }, {
|
|
110
|
+
name: 'next_compact_check',
|
|
111
|
+
partialFilterExpression: { next_compact_check: { $exists: true } }
|
|
112
|
+
});
|
|
62
113
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const collections = await this.db.listCollections({ name: new RegExp(`^${prefix}`) }, { nameOnly: true }).toArray();
|
|
66
|
-
return collections
|
|
67
|
-
.filter((collection) => collection.name.startsWith(prefix))
|
|
68
|
-
.map((collection) => ({
|
|
69
|
-
collection: this.db.collection(collection.name),
|
|
70
|
-
indexId: collection.name.slice(prefix.length)
|
|
71
|
-
}));
|
|
114
|
+
customCheckpointRequestCollectionName(options) {
|
|
115
|
+
return this.upstream.customCheckpointRequestCollectionName(options);
|
|
72
116
|
}
|
|
73
117
|
}
|
|
74
118
|
//# sourceMappingURL=VersionedPowerSyncMongoV3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionedPowerSyncMongoV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"VersionedPowerSyncMongoV3.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { InternalOpId } from '@powersync/service-core';
|
|
2
|
+
import { BucketDataDoc, BucketKey } from '../common/BucketDataDoc.js';
|
|
3
|
+
import { BucketDataDocumentV3 } from './models.js';
|
|
4
|
+
/**
|
|
5
|
+
* Serialize a non-empty list of operations in strictly ascending `o` order.
|
|
6
|
+
* Preserving that order establishes the {@link BucketDataDocumentV3} range
|
|
7
|
+
* invariants used by metadata-only queries.
|
|
8
|
+
*/
|
|
9
|
+
export declare function serializeBucketData(bucket: string, operations: BucketDataDoc[], options?: {
|
|
10
|
+
targetOp?: InternalOpId | null;
|
|
11
|
+
}): BucketDataDocumentV3;
|
|
12
|
+
export declare function loadBucketDataDocument(context: Pick<BucketKey, 'replicationStreamId' | 'definitionId'>, doc: BucketDataDocumentV3): Generator<BucketDataDoc>;
|
|
13
|
+
export declare function maxOpId(a: InternalOpId | null | undefined, b: InternalOpId | null | undefined): InternalOpId | null;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { bson } from '@powersync/service-core';
|
|
3
|
+
/**
|
|
4
|
+
* Serialize a non-empty list of operations in strictly ascending `o` order.
|
|
5
|
+
* Preserving that order establishes the {@link BucketDataDocumentV3} range
|
|
6
|
+
* invariants used by metadata-only queries.
|
|
7
|
+
*/
|
|
8
|
+
export function serializeBucketData(bucket, operations, options) {
|
|
9
|
+
const minOp = operations[0].o;
|
|
10
|
+
const maxOp = operations[operations.length - 1].o;
|
|
11
|
+
let totalChecksum = 0n;
|
|
12
|
+
let maxTargetOp = options?.targetOp ?? null;
|
|
13
|
+
let hasClearOp = false;
|
|
14
|
+
const ops = operations.map((op) => {
|
|
15
|
+
totalChecksum += op.checksum;
|
|
16
|
+
if (op.op == 'CLEAR') {
|
|
17
|
+
hasClearOp = true;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
o: op.o,
|
|
21
|
+
op: op.op,
|
|
22
|
+
source_table: op.source_table,
|
|
23
|
+
source_key: op.source_key,
|
|
24
|
+
subkey: op.subkey,
|
|
25
|
+
table: op.table,
|
|
26
|
+
row_id: op.row_id,
|
|
27
|
+
checksum: op.checksum,
|
|
28
|
+
data: op.data
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
const size = bson.calculateObjectSize(ops);
|
|
32
|
+
return {
|
|
33
|
+
_id: {
|
|
34
|
+
b: bucket,
|
|
35
|
+
o: maxOp
|
|
36
|
+
},
|
|
37
|
+
min_op: minOp,
|
|
38
|
+
checksum: totalChecksum,
|
|
39
|
+
count: operations.length,
|
|
40
|
+
size,
|
|
41
|
+
target_op: maxTargetOp,
|
|
42
|
+
...(hasClearOp ? { has_clear_op: true } : {}),
|
|
43
|
+
ops
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function* loadBucketDataDocument(context, doc) {
|
|
47
|
+
const { _id, ops } = doc;
|
|
48
|
+
if (!ops) {
|
|
49
|
+
throw new ServiceAssertionError(`Missing ops array on BucketDataDocumentV3 at _id.o=${_id.o}. Callers must patch doc.ops from S3 before calling this function.`);
|
|
50
|
+
}
|
|
51
|
+
const bucketKey = {
|
|
52
|
+
...context,
|
|
53
|
+
bucket: _id.b
|
|
54
|
+
};
|
|
55
|
+
for (const op of ops) {
|
|
56
|
+
yield {
|
|
57
|
+
bucketKey,
|
|
58
|
+
o: op.o,
|
|
59
|
+
op: op.op,
|
|
60
|
+
source_table: op.source_table,
|
|
61
|
+
source_key: op.source_key,
|
|
62
|
+
subkey: op.subkey,
|
|
63
|
+
table: op.table,
|
|
64
|
+
row_id: op.row_id,
|
|
65
|
+
checksum: op.checksum,
|
|
66
|
+
data: op.data
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function maxOpId(a, b) {
|
|
71
|
+
if (a == null) {
|
|
72
|
+
return b ?? null;
|
|
73
|
+
}
|
|
74
|
+
if (b == null) {
|
|
75
|
+
return a ?? null;
|
|
76
|
+
}
|
|
77
|
+
return a > b ? a : b;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=bucket-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-format.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/bucket-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BucketDataDoc } from '../common/BucketDataDoc.js';
|
|
2
|
+
export declare const DEFAULT_MAX_DOC_SIZE_BYTES: number;
|
|
3
|
+
/**
|
|
4
|
+
* Split an array of bucket data operations into chunks where each chunk's
|
|
5
|
+
* total data size stays close to `maxDocSizeBytes`.
|
|
6
|
+
*
|
|
7
|
+
* The threshold is a target, not a hard ceiling — a single operation whose
|
|
8
|
+
* `data` field exceeds the limit is placed in its own chunk and is NOT split.
|
|
9
|
+
*/
|
|
10
|
+
export declare function chunkBucketData(operations: BucketDataDoc[], maxDocSizeBytes?: number): BucketDataDoc[][];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { bson } from '@powersync/service-core';
|
|
2
|
+
export const DEFAULT_MAX_DOC_SIZE_BYTES = 1024 * 1024; // 1MB
|
|
3
|
+
/**
|
|
4
|
+
* Split an array of bucket data operations into chunks where each chunk's
|
|
5
|
+
* total data size stays close to `maxDocSizeBytes`.
|
|
6
|
+
*
|
|
7
|
+
* The threshold is a target, not a hard ceiling — a single operation whose
|
|
8
|
+
* `data` field exceeds the limit is placed in its own chunk and is NOT split.
|
|
9
|
+
*/
|
|
10
|
+
export function chunkBucketData(operations, maxDocSizeBytes = DEFAULT_MAX_DOC_SIZE_BYTES) {
|
|
11
|
+
const chunks = [];
|
|
12
|
+
let currentChunk = [];
|
|
13
|
+
let currentSize = 0;
|
|
14
|
+
for (const op of operations) {
|
|
15
|
+
// Add 5 to account for array index up to 4 digits (9999) plus null byte.
|
|
16
|
+
const opSize = bson.calculateObjectSize(op) + 5;
|
|
17
|
+
if (currentSize + opSize > maxDocSizeBytes && currentChunk.length > 0) {
|
|
18
|
+
chunks.push(currentChunk);
|
|
19
|
+
currentChunk = [];
|
|
20
|
+
currentSize = 0;
|
|
21
|
+
}
|
|
22
|
+
currentChunk.push(op);
|
|
23
|
+
currentSize += opSize;
|
|
24
|
+
}
|
|
25
|
+
if (currentChunk.length > 0) {
|
|
26
|
+
chunks.push(currentChunk);
|
|
27
|
+
}
|
|
28
|
+
return chunks;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=chunking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunking.js","sourceRoot":"","sources":["../../../../src/storage/implementation/v3/chunking.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAG/C,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM;AAE7D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA2B,EAC3B,eAAe,GAAG,0BAA0B;IAE5C,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,IAAI,YAAY,GAAoB,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,yEAAyE;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAEhD,IAAI,WAAW,GAAG,MAAM,GAAG,eAAe,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1B,YAAY,GAAG,EAAE,CAAC;YAClB,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,WAAW,IAAI,MAAM,CAAC;IACxB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { InternalOpId } from '@powersync/service-core';
|
|
3
|
+
import { BucketDataDoc } from '../common/BucketDataDoc.js';
|
|
4
|
+
import { CompactionLease } from './CompactionLease.js';
|
|
5
|
+
import { BucketDataDocumentV3, BucketStateDocumentV3 } from './models.js';
|
|
6
|
+
export declare const FULL_COMPACT_RESCHEDULE_MARGIN_MS: number;
|
|
7
|
+
export interface PendingCompactionGroup {
|
|
8
|
+
/**
|
|
9
|
+
* Input documents are ordered from oldest to newest, matching `ops`.
|
|
10
|
+
* Keeping the inputs intact lets unchanged singletons retain their object.
|
|
11
|
+
*/
|
|
12
|
+
inputs: BucketDataDocumentV3[];
|
|
13
|
+
ops: BucketDataDoc[];
|
|
14
|
+
changed: boolean;
|
|
15
|
+
targetOp: InternalOpId | null;
|
|
16
|
+
}
|
|
17
|
+
export interface CompactIntervalConfig {
|
|
18
|
+
readonly minCompactChunkIntervalMs: number;
|
|
19
|
+
readonly minCompactFullIntervalMs: number;
|
|
20
|
+
readonly maxCompactFullIntervalMs: number;
|
|
21
|
+
}
|
|
22
|
+
export interface CompactTargetConfig {
|
|
23
|
+
readonly maxOpIdCap: InternalOpId | undefined;
|
|
24
|
+
}
|
|
25
|
+
export declare enum CompactionKind {
|
|
26
|
+
Full = "full",
|
|
27
|
+
Chunks = "chunks"
|
|
28
|
+
}
|
|
29
|
+
export interface CompactionDecision {
|
|
30
|
+
kind: CompactionKind | null;
|
|
31
|
+
nextCompactCheck: mongo.Document;
|
|
32
|
+
}
|
|
33
|
+
export interface ScheduledCompactionOptions {
|
|
34
|
+
/** Process checks scheduled this far after the captured job start. */
|
|
35
|
+
dueAheadMs?: number;
|
|
36
|
+
/** Used by initial replication, which must not run a full compact. */
|
|
37
|
+
forceKind?: CompactionKind;
|
|
38
|
+
}
|
|
39
|
+
export declare class CompactionContext {
|
|
40
|
+
readonly lease: CompactionLease;
|
|
41
|
+
readonly kind: CompactionKind;
|
|
42
|
+
readonly decision: CompactionDecision;
|
|
43
|
+
readonly rescheduleNotBefore: Date | undefined;
|
|
44
|
+
readonly targetOp: InternalOpId;
|
|
45
|
+
constructor(lease: CompactionLease, kind: CompactionKind, decision: CompactionDecision, rescheduleNotBefore: Date | undefined, targetOp: InternalOpId);
|
|
46
|
+
get state(): BucketStateDocumentV3;
|
|
47
|
+
get startedAt(): Date;
|
|
48
|
+
get lastOp(): bigint;
|
|
49
|
+
}
|
|
50
|
+
export interface BucketStats {
|
|
51
|
+
count: number;
|
|
52
|
+
bytes: bigint;
|
|
53
|
+
chunks: number;
|
|
54
|
+
}
|
|
55
|
+
/** Bucket stats read from bucket-data documents, including their checksum. */
|
|
56
|
+
export interface BucketStatsWithChecksum extends BucketStats {
|
|
57
|
+
checksum: number;
|
|
58
|
+
}
|
|
59
|
+
export interface CompactionResult {
|
|
60
|
+
/** Metadata cached at compacted_state.op_id. */
|
|
61
|
+
compactedState: BucketStatsWithChecksum;
|
|
62
|
+
/** Complete bucket metadata through the op head captured at claim time. */
|
|
63
|
+
bucketStats: BucketStats;
|
|
64
|
+
}
|
|
65
|
+
export declare function bucketStats(state: BucketStateDocumentV3): BucketStats;
|
|
66
|
+
export declare function emptyBucketStats(): BucketStatsWithChecksum;
|
|
67
|
+
export declare function statsForDocument(document: Pick<BucketDataDocumentV3, 'count' | 'size' | 'checksum'>): BucketStatsWithChecksum;
|
|
68
|
+
export declare function statsForDocuments(documents: Iterable<Pick<BucketDataDocumentV3, 'count' | 'size' | 'checksum'>>): BucketStatsWithChecksum;
|
|
69
|
+
/** A scheduled bucket always has writes awaiting a full compact. */
|
|
70
|
+
export declare function firstUncompactedWrite(state: BucketStateDocumentV3): Date;
|
|
71
|
+
export declare function combineChunkStats(previous: NonNullable<BucketStateDocumentV3['compacted_state']>, compactedTail: BucketStatsWithChecksum, overlappingCompactedChunk: BucketStatsWithChecksum): BucketStatsWithChecksum;
|
|
72
|
+
export declare function combineAdjacentStats(first: BucketStatsWithChecksum, second: BucketStatsWithChecksum): BucketStatsWithChecksum;
|
|
73
|
+
export declare function applyCompactionDelta(total: BucketStats, before: BucketStatsWithChecksum, after: BucketStatsWithChecksum): BucketStats;
|
|
74
|
+
/** Replace one stored range in an accumulated statistics snapshot. */
|
|
75
|
+
export declare function applyStatsReplacement(total: BucketStatsWithChecksum, before: BucketStatsWithChecksum, after: BucketStatsWithChecksum): BucketStatsWithChecksum;
|
|
76
|
+
/**
|
|
77
|
+
* This checks that the bucket state hasn't changed by a concurrent write since we checked.
|
|
78
|
+
*
|
|
79
|
+
* If it has changed, we'll re-check in the next batch.
|
|
80
|
+
*/
|
|
81
|
+
export declare function unclaimedSnapshotFilter(state: BucketStateDocumentV3): mongo.Filter<BucketStateDocumentV3>;
|
|
82
|
+
/**
|
|
83
|
+
* Calculate the earliest full compaction time from the first uncompacted
|
|
84
|
+
* write, bounded by the maximum retention interval.
|
|
85
|
+
*/
|
|
86
|
+
export declare function fullCompactionCheckAt(state: BucketStateDocumentV3, config: CompactIntervalConfig): Date;
|
|
87
|
+
export declare function chooseCompactionKind(state: BucketStateDocumentV3, now: Date, config: CompactIntervalConfig): CompactionDecision;
|
|
88
|
+
export declare function forcedCompactionKind(state: BucketStateDocumentV3, forceKind: CompactionKind | undefined, config: CompactTargetConfig): CompactionKind | null;
|
|
89
|
+
/**
|
|
90
|
+
* Read one bounded prefix from a compaction cursor.
|
|
91
|
+
*
|
|
92
|
+
* The document that would cross the byte limit is deliberately not returned:
|
|
93
|
+
* pagination resumes past the last returned `_id`, so that document remains
|
|
94
|
+
* eligible for the next query. The first document is always accepted to
|
|
95
|
+
* ensure progress when a single document exceeds the configured byte limit.
|
|
96
|
+
*
|
|
97
|
+
* `hasMore` is conservative when the document limit is reached. An extra empty
|
|
98
|
+
* query is preferable to exhausting the cursor just to determine whether the
|
|
99
|
+
* limited MongoDB query contained another document.
|
|
100
|
+
*/
|
|
101
|
+
export declare function readCompactionBatch(cursor: mongo.AggregationCursor<BucketDataDocumentV3>, options: {
|
|
102
|
+
byteLimit: number;
|
|
103
|
+
documentLimit: number;
|
|
104
|
+
}): Promise<{
|
|
105
|
+
documents: BucketDataDocumentV3[];
|
|
106
|
+
hasMore: boolean;
|
|
107
|
+
}>;
|