@powersync/service-module-mongodb-storage 0.0.0-dev-20260313100403 → 0.0.0-dev-20260515144844
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 +96 -8
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js +1 -1
- package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js.map +1 -1
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +3 -3
- package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -1
- package/dist/migrations/db/migrations/1770213298299-storage-version.js.map +1 -1
- package/dist/storage/MongoBucketStorage.d.ts +5 -3
- package/dist/storage/MongoBucketStorage.js +50 -36
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/MongoReportStorage.d.ts +3 -3
- package/dist/storage/MongoReportStorage.js +5 -5
- package/dist/storage/MongoReportStorage.js.map +1 -1
- package/dist/storage/implementation/BucketDefinitionMapping.d.ts +17 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js +58 -0
- package/dist/storage/implementation/BucketDefinitionMapping.js.map +1 -0
- package/dist/storage/implementation/MongoBucketBatch.d.ts +16 -14
- package/dist/storage/implementation/MongoBucketBatch.js +80 -115
- package/dist/storage/implementation/MongoBucketBatch.js.map +1 -1
- package/dist/storage/implementation/MongoBucketBatchShared.d.ts +5 -0
- package/dist/storage/implementation/MongoBucketBatchShared.js +8 -0
- package/dist/storage/implementation/MongoBucketBatchShared.js.map +1 -0
- package/dist/storage/implementation/MongoChecksums.d.ts +28 -17
- package/dist/storage/implementation/MongoChecksums.js +13 -72
- package/dist/storage/implementation/MongoChecksums.js.map +1 -1
- package/dist/storage/implementation/MongoCompactor.d.ts +98 -52
- package/dist/storage/implementation/MongoCompactor.js +256 -295
- package/dist/storage/implementation/MongoCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoParameterCompactor.d.ts +11 -6
- package/dist/storage/implementation/MongoParameterCompactor.js +24 -9
- package/dist/storage/implementation/MongoParameterCompactor.js.map +1 -1
- package/dist/storage/implementation/MongoPersistedSyncRules.d.ts +14 -0
- package/dist/storage/implementation/MongoPersistedSyncRules.js +64 -0
- package/dist/storage/implementation/MongoPersistedSyncRules.js.map +1 -0
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.d.ts +3 -0
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js +9 -0
- package/dist/storage/implementation/MongoPersistedSyncRulesContent.js.map +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js +1 -1
- package/dist/storage/implementation/MongoStorageProvider.js.map +1 -1
- package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +49 -30
- package/dist/storage/implementation/MongoSyncBucketStorage.js +100 -456
- package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/implementation/MongoSyncRulesLock.d.ts +5 -3
- package/dist/storage/implementation/MongoSyncRulesLock.js +12 -10
- package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js +1 -1
- package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -1
- package/dist/storage/implementation/OperationBatch.js +1 -1
- package/dist/storage/implementation/common/BucketDataDoc.d.ts +35 -0
- package/dist/storage/implementation/common/BucketDataDoc.js +2 -0
- package/dist/storage/implementation/common/BucketDataDoc.js.map +1 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.d.ts +13 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js +2 -0
- package/dist/storage/implementation/common/MongoSyncBucketStorageContext.js.map +1 -0
- package/dist/storage/implementation/common/PersistedBatch.d.ts +108 -0
- package/dist/storage/implementation/common/PersistedBatch.js +237 -0
- package/dist/storage/implementation/common/PersistedBatch.js.map +1 -0
- package/dist/storage/implementation/common/SingleBucketStore.d.ts +54 -0
- package/dist/storage/implementation/common/SingleBucketStore.js +3 -0
- package/dist/storage/implementation/common/SingleBucketStore.js.map +1 -0
- package/dist/storage/implementation/common/SourceRecordStore.d.ts +36 -0
- package/dist/storage/implementation/common/SourceRecordStore.js +2 -0
- package/dist/storage/implementation/common/SourceRecordStore.js.map +1 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.d.ts +27 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js +57 -0
- package/dist/storage/implementation/common/VersionedPowerSyncMongoBase.js.map +1 -0
- package/dist/storage/implementation/createMongoSyncBucketStorage.d.ts +7 -0
- package/dist/storage/implementation/createMongoSyncBucketStorage.js +9 -0
- package/dist/storage/implementation/createMongoSyncBucketStorage.js.map +1 -0
- package/dist/storage/implementation/db.d.ts +34 -34
- package/dist/storage/implementation/db.js +78 -98
- package/dist/storage/implementation/db.js.map +1 -1
- package/dist/storage/implementation/models.d.ts +65 -36
- package/dist/storage/implementation/models.js +21 -2
- package/dist/storage/implementation/models.js.map +1 -1
- package/dist/storage/implementation/v1/MongoBucketBatchV1.d.ts +13 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js +22 -0
- package/dist/storage/implementation/v1/MongoBucketBatchV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoChecksumsV1.d.ts +12 -0
- package/dist/storage/implementation/v1/MongoChecksumsV1.js +56 -0
- package/dist/storage/implementation/v1/MongoChecksumsV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoCompactorV1.d.ts +23 -0
- package/dist/storage/implementation/v1/MongoCompactorV1.js +52 -0
- package/dist/storage/implementation/v1/MongoCompactorV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.d.ts +9 -0
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js +20 -0
- package/dist/storage/implementation/v1/MongoParameterCompactorV1.js.map +1 -0
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.d.ts +41 -0
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js +283 -0
- package/dist/storage/implementation/v1/MongoSyncBucketStorageV1.js.map +1 -0
- package/dist/storage/implementation/v1/PersistedBatchV1.d.ts +26 -0
- package/dist/storage/implementation/v1/PersistedBatchV1.js +183 -0
- package/dist/storage/implementation/v1/PersistedBatchV1.js.map +1 -0
- package/dist/storage/implementation/v1/SingleBucketStoreV1.d.ts +18 -0
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js +57 -0
- package/dist/storage/implementation/v1/SingleBucketStoreV1.js.map +1 -0
- package/dist/storage/implementation/v1/SourceRecordStoreV1.d.ts +19 -0
- package/dist/storage/implementation/v1/SourceRecordStoreV1.js +105 -0
- package/dist/storage/implementation/v1/SourceRecordStoreV1.js.map +1 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.d.ts +12 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js +20 -0
- package/dist/storage/implementation/v1/VersionedPowerSyncMongoV1.js.map +1 -0
- package/dist/storage/implementation/v1/models.d.ts +34 -0
- package/dist/storage/implementation/v1/models.js +37 -0
- package/dist/storage/implementation/v1/models.js.map +1 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.d.ts +13 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js +34 -0
- package/dist/storage/implementation/v3/MongoBucketBatchV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.d.ts +15 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.js +84 -0
- package/dist/storage/implementation/v3/MongoChecksumsV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoCompactorV3.d.ts +23 -0
- package/dist/storage/implementation/v3/MongoCompactorV3.js +68 -0
- package/dist/storage/implementation/v3/MongoCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.d.ts +9 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js +18 -0
- package/dist/storage/implementation/v3/MongoParameterCompactorV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoParameterLookupV3.d.ts +5 -0
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js +9 -0
- package/dist/storage/implementation/v3/MongoParameterLookupV3.js.map +1 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.d.ts +41 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js +407 -0
- package/dist/storage/implementation/v3/MongoSyncBucketStorageV3.js.map +1 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.d.ts +29 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.js +259 -0
- package/dist/storage/implementation/v3/PersistedBatchV3.js.map +1 -0
- package/dist/storage/implementation/v3/SingleBucketStoreV3.d.ts +18 -0
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js +48 -0
- package/dist/storage/implementation/v3/SingleBucketStoreV3.js.map +1 -0
- package/dist/storage/implementation/v3/SourceRecordStoreV3.d.ts +22 -0
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js +164 -0
- package/dist/storage/implementation/v3/SourceRecordStoreV3.js.map +1 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.d.ts +21 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js +71 -0
- package/dist/storage/implementation/v3/VersionedPowerSyncMongoV3.js.map +1 -0
- package/dist/storage/implementation/v3/models.d.ts +43 -0
- package/dist/storage/implementation/v3/models.js +34 -0
- package/dist/storage/implementation/v3/models.js.map +1 -0
- package/dist/storage/storage-index.d.ts +8 -5
- package/dist/storage/storage-index.js +8 -5
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/utils/util.d.ts +11 -4
- package/dist/utils/util.js +25 -4
- package/dist/utils/util.js.map +1 -1
- package/package.json +9 -9
- package/src/migrations/db/migrations/1688556755264-initial-sync-rules.ts +1 -1
- package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +7 -7
- package/src/migrations/db/migrations/1770213298299-storage-version.ts +1 -1
- package/src/storage/MongoBucketStorage.ts +97 -62
- package/src/storage/MongoReportStorage.ts +7 -7
- package/src/storage/implementation/BucketDefinitionMapping.ts +72 -0
- package/src/storage/implementation/MongoBucketBatch.ts +110 -144
- package/src/storage/implementation/MongoBucketBatchShared.ts +11 -0
- package/src/storage/implementation/MongoChecksums.ts +53 -76
- package/src/storage/implementation/MongoCompactor.ts +401 -403
- package/src/storage/implementation/MongoParameterCompactor.ts +51 -25
- package/src/storage/implementation/MongoPersistedSyncRules.ts +76 -0
- package/src/storage/implementation/MongoPersistedSyncRulesContent.ts +18 -1
- package/src/storage/implementation/MongoStorageProvider.ts +1 -1
- package/src/storage/implementation/MongoSyncBucketStorage.ts +190 -457
- package/src/storage/implementation/MongoSyncRulesLock.ts +12 -14
- package/src/storage/implementation/MongoWriteCheckpointAPI.ts +4 -2
- package/src/storage/implementation/OperationBatch.ts +1 -1
- package/src/storage/implementation/common/BucketDataDoc.ts +37 -0
- package/src/storage/implementation/common/MongoSyncBucketStorageContext.ts +15 -0
- package/src/storage/implementation/common/PersistedBatch.ts +364 -0
- package/src/storage/implementation/common/SingleBucketStore.ts +63 -0
- package/src/storage/implementation/common/SourceRecordStore.ts +49 -0
- package/src/storage/implementation/common/VersionedPowerSyncMongoBase.ts +80 -0
- package/src/storage/implementation/createMongoSyncBucketStorage.ts +25 -0
- package/src/storage/implementation/db.ts +107 -128
- package/src/storage/implementation/models.ts +86 -40
- package/src/storage/implementation/v1/MongoBucketBatchV1.ts +32 -0
- package/src/storage/implementation/v1/MongoChecksumsV1.ts +75 -0
- package/src/storage/implementation/v1/MongoCompactorV1.ts +93 -0
- package/src/storage/implementation/v1/MongoParameterCompactorV1.ts +26 -0
- package/src/storage/implementation/v1/MongoSyncBucketStorageV1.ts +448 -0
- package/src/storage/implementation/v1/PersistedBatchV1.ts +230 -0
- package/src/storage/implementation/v1/SingleBucketStoreV1.ts +74 -0
- package/src/storage/implementation/v1/SourceRecordStoreV1.ts +156 -0
- package/src/storage/implementation/v1/VersionedPowerSyncMongoV1.ts +28 -0
- package/src/storage/implementation/v1/models.ts +84 -0
- package/src/storage/implementation/v3/MongoBucketBatchV3.ts +44 -0
- package/src/storage/implementation/v3/MongoChecksumsV3.ts +120 -0
- package/src/storage/implementation/v3/MongoCompactorV3.ts +107 -0
- package/src/storage/implementation/v3/MongoParameterCompactorV3.ts +24 -0
- package/src/storage/implementation/v3/MongoParameterLookupV3.ts +12 -0
- package/src/storage/implementation/v3/MongoSyncBucketStorageV3.ts +550 -0
- package/src/storage/implementation/v3/PersistedBatchV3.ts +318 -0
- package/src/storage/implementation/v3/SingleBucketStoreV3.ts +68 -0
- package/src/storage/implementation/v3/SourceRecordStoreV3.ts +226 -0
- package/src/storage/implementation/v3/VersionedPowerSyncMongoV3.ts +112 -0
- package/src/storage/implementation/v3/models.ts +96 -0
- package/src/storage/storage-index.ts +8 -5
- package/src/utils/util.ts +36 -7
- package/test/src/__snapshots__/{client-connections-storage.test.ts.snap → connection-report-storage.test.ts.snap} +68 -68
- package/test/src/__snapshots__/storage_sync.test.ts.snap +282 -0
- package/test/src/{client-connections-storage.test.ts → connection-report-storage.test.ts} +4 -4
- package/test/src/setup.ts +1 -1
- package/test/src/storage.test.ts +2 -2
- package/test/src/storage_compacting.test.ts +94 -3
- package/test/src/storage_sync.test.ts +351 -5
- package/test/tsconfig.json +0 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/implementation/PersistedBatch.d.ts +0 -71
- package/dist/storage/implementation/PersistedBatch.js +0 -354
- package/dist/storage/implementation/PersistedBatch.js.map +0 -1
- package/src/storage/implementation/PersistedBatch.ts +0 -432
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { BucketDefinitionId, ParameterIndexId } from '../BucketDefinitionMapping.js';
|
|
3
|
+
import { BaseVersionedPowerSyncMongo } from '../common/VersionedPowerSyncMongoBase.js';
|
|
4
|
+
import { CommonSourceTableDocument } from '../models.js';
|
|
5
|
+
import {
|
|
6
|
+
BucketDataDocumentV3,
|
|
7
|
+
BucketParameterDocumentV3,
|
|
8
|
+
BucketStateDocumentV3,
|
|
9
|
+
CurrentDataDocumentV3,
|
|
10
|
+
SourceTableDocumentV3
|
|
11
|
+
} from './models.js';
|
|
12
|
+
|
|
13
|
+
export class VersionedPowerSyncMongoV3 extends BaseVersionedPowerSyncMongo {
|
|
14
|
+
sourceRecordsV3(replicationStreamId: number, sourceTableId: mongo.ObjectId): mongo.Collection<CurrentDataDocumentV3> {
|
|
15
|
+
const collectionName = this.sourceRecordsCollectionName(replicationStreamId, sourceTableId);
|
|
16
|
+
return this.db.collection<CurrentDataDocumentV3>(collectionName);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async listSourceRecordCollectionsV3(replicationStreamId: number): Promise<mongo.Collection<CurrentDataDocumentV3>[]> {
|
|
20
|
+
return this.listCollectionsByPrefix<CurrentDataDocumentV3>(`source_records_${replicationStreamId}_`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async initializeSourceRecordsCollection(replicationStreamId: number, sourceTableId: mongo.ObjectId) {
|
|
24
|
+
await this.sourceRecordsV3(replicationStreamId, sourceTableId).createIndex(
|
|
25
|
+
{
|
|
26
|
+
pending_delete: 1
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
partialFilterExpression: { pending_delete: { $exists: true } },
|
|
30
|
+
name: 'pending_delete'
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
commonSourceTables(replicationStreamId: number): mongo.Collection<CommonSourceTableDocument> {
|
|
36
|
+
return this.sourceTablesV3(replicationStreamId) as mongo.Collection<CommonSourceTableDocument>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
bucketStateV3(replicationStreamId: number): mongo.Collection<BucketStateDocumentV3> {
|
|
40
|
+
return this.db.collection(`bucket_state_${replicationStreamId}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
parameterIndexV3(
|
|
44
|
+
replicationStreamId: number,
|
|
45
|
+
indexId: ParameterIndexId
|
|
46
|
+
): mongo.Collection<BucketParameterDocumentV3> {
|
|
47
|
+
return this.db.collection(`parameter_index_${replicationStreamId}_${indexId}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
sourceTablesV3(replicationStreamId: number): mongo.Collection<SourceTableDocumentV3> {
|
|
51
|
+
return this.db.collection<SourceTableDocumentV3>(this.sourceTableCollectionName(replicationStreamId));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async initializeStreamStorage(replicationStreamId: number) {
|
|
55
|
+
const sourceTables = this.sourceTablesV3(replicationStreamId);
|
|
56
|
+
const bucketState = this.bucketStateV3(replicationStreamId);
|
|
57
|
+
await sourceTables.createIndex(
|
|
58
|
+
{
|
|
59
|
+
connection_id: 1,
|
|
60
|
+
schema_name: 1,
|
|
61
|
+
table_name: 1,
|
|
62
|
+
relation_id: 1
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'source_lookup'
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
await sourceTables.createIndex(
|
|
69
|
+
{
|
|
70
|
+
latest_pending_delete: 1
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
partialFilterExpression: { latest_pending_delete: { $exists: true } },
|
|
74
|
+
name: 'latest_pending_delete'
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
await bucketState.createIndex(
|
|
78
|
+
{
|
|
79
|
+
last_op: 1
|
|
80
|
+
},
|
|
81
|
+
{ name: 'bucket_updates', unique: true }
|
|
82
|
+
);
|
|
83
|
+
await bucketState.createIndex(
|
|
84
|
+
{
|
|
85
|
+
'estimate_since_compact.count': -1
|
|
86
|
+
},
|
|
87
|
+
{ name: 'dirty_count' }
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
bucketDataV3(replicationStreamId: number, definitionId: BucketDefinitionId) {
|
|
92
|
+
return this.db.collection<BucketDataDocumentV3>(`bucket_data_${replicationStreamId}_${definitionId}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
listBucketDataCollectionsV3(replicationStreamId: number) {
|
|
96
|
+
return this.upstream.listBucketDataCollectionsV3(replicationStreamId);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async listParameterIndexCollectionsV3(
|
|
100
|
+
replicationStreamId: number
|
|
101
|
+
): Promise<{ collection: mongo.Collection<BucketParameterDocumentV3>; indexId: ParameterIndexId }[]> {
|
|
102
|
+
const prefix = `parameter_index_${replicationStreamId}_`;
|
|
103
|
+
const collections = await this.db.listCollections({ name: new RegExp(`^${prefix}`) }, { nameOnly: true }).toArray();
|
|
104
|
+
|
|
105
|
+
return collections
|
|
106
|
+
.filter((collection) => collection.name.startsWith(prefix))
|
|
107
|
+
.map((collection) => ({
|
|
108
|
+
collection: this.db.collection<BucketParameterDocumentV3>(collection.name),
|
|
109
|
+
indexId: collection.name.slice(prefix.length)
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { InternalOpId } from '@powersync/service-core';
|
|
2
|
+
import * as bson from 'bson';
|
|
3
|
+
import { BucketDefinitionId, ParameterIndexId } from '../BucketDefinitionMapping.js';
|
|
4
|
+
import { BucketDataDoc, BucketKey } from '../common/BucketDataDoc.js';
|
|
5
|
+
import {
|
|
6
|
+
BucketDataDocumentBase,
|
|
7
|
+
BucketDataKey,
|
|
8
|
+
BucketParameterDocumentBase,
|
|
9
|
+
BucketStateDocumentBase,
|
|
10
|
+
CurrentBucket,
|
|
11
|
+
ReplicaId,
|
|
12
|
+
SourceTableDocument,
|
|
13
|
+
SourceTableKey,
|
|
14
|
+
TaggedBucketParameterDocument
|
|
15
|
+
} from '../models.js';
|
|
16
|
+
|
|
17
|
+
export interface CurrentBucketV3 extends CurrentBucket {
|
|
18
|
+
def: BucketDefinitionId;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface RecordedLookupV3 {
|
|
22
|
+
i: ParameterIndexId;
|
|
23
|
+
l: bson.Binary;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CurrentDataDocumentV3 {
|
|
27
|
+
_id: ReplicaId;
|
|
28
|
+
data: bson.Binary | null;
|
|
29
|
+
buckets: CurrentBucketV3[];
|
|
30
|
+
lookups: RecordedLookupV3[];
|
|
31
|
+
/**
|
|
32
|
+
* If set, this can be deleted, once there is a consistent checkpoint >= pending_delete.
|
|
33
|
+
*
|
|
34
|
+
* This must only be set if buckets = [], lookups = [].
|
|
35
|
+
*/
|
|
36
|
+
pending_delete?: bigint;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface BucketParameterDocumentV3 extends BucketParameterDocumentBase<SourceTableKey> {}
|
|
40
|
+
|
|
41
|
+
export type BucketDataKeyV3 = BucketDataKey;
|
|
42
|
+
|
|
43
|
+
export interface BucketDataDocumentV3 extends BucketDataDocumentBase {
|
|
44
|
+
_id: BucketDataKeyV3;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function serializeBucketDataV3(document: BucketDataDoc): BucketDataDocumentV3 {
|
|
48
|
+
const { bucketKey, o } = document;
|
|
49
|
+
return {
|
|
50
|
+
_id: {
|
|
51
|
+
b: bucketKey.bucket,
|
|
52
|
+
o: o
|
|
53
|
+
},
|
|
54
|
+
// List fields directly, so that we don't accidentally persist any unknown fields
|
|
55
|
+
op: document.op,
|
|
56
|
+
source_table: document.source_table,
|
|
57
|
+
source_key: document.source_key,
|
|
58
|
+
table: document.table,
|
|
59
|
+
row_id: document.row_id,
|
|
60
|
+
checksum: document.checksum,
|
|
61
|
+
data: document.data,
|
|
62
|
+
target_op: document.target_op
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function loadBucketDataDocumentV3(
|
|
67
|
+
context: Pick<BucketKey, 'replicationStreamId' | 'definitionId'>,
|
|
68
|
+
doc: BucketDataDocumentV3
|
|
69
|
+
): BucketDataDoc {
|
|
70
|
+
const { _id, ...rest } = doc;
|
|
71
|
+
return {
|
|
72
|
+
bucketKey: {
|
|
73
|
+
...context,
|
|
74
|
+
bucket: _id.b
|
|
75
|
+
},
|
|
76
|
+
o: _id.o,
|
|
77
|
+
...rest
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function taggedBucketParameterDocumentToV3(document: TaggedBucketParameterDocument): BucketParameterDocumentV3 {
|
|
82
|
+
const { index: _index, ...rest } = document;
|
|
83
|
+
return rest as BucketParameterDocumentV3;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface SourceTableDocumentV3 extends SourceTableDocument {
|
|
87
|
+
bucket_data_source_ids: BucketDefinitionId[];
|
|
88
|
+
parameter_lookup_source_ids: ParameterIndexId[];
|
|
89
|
+
latest_pending_delete?: InternalOpId | undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface BucketStateDocumentV3 extends BucketStateDocumentBase {
|
|
93
|
+
_id: BucketStateDocumentBase['_id'] & {
|
|
94
|
+
d: BucketDefinitionId;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
export * as test_utils from '../utils/test-utils.js';
|
|
2
|
+
export * from '../utils/util.js';
|
|
3
|
+
export * from './implementation/BucketDefinitionMapping.js';
|
|
4
|
+
export * from './implementation/common/PersistedBatch.js';
|
|
5
|
+
export * from './implementation/createMongoSyncBucketStorage.js';
|
|
1
6
|
export * from './implementation/db.js';
|
|
2
7
|
export * from './implementation/models.js';
|
|
3
|
-
export * from './implementation/MongoBucketBatch.js';
|
|
4
8
|
export * from './implementation/MongoIdSequence.js';
|
|
9
|
+
export * from './implementation/MongoPersistedSyncRules.js';
|
|
5
10
|
export * from './implementation/MongoPersistedSyncRulesContent.js';
|
|
6
11
|
export * from './implementation/MongoStorageProvider.js';
|
|
7
|
-
export * from './implementation/MongoSyncBucketStorage.js';
|
|
8
12
|
export * from './implementation/MongoSyncRulesLock.js';
|
|
9
13
|
export * from './implementation/OperationBatch.js';
|
|
10
|
-
export * from './implementation/
|
|
11
|
-
export * from '
|
|
14
|
+
export * from './implementation/v1/models.js';
|
|
15
|
+
export * from './implementation/v3/models.js';
|
|
12
16
|
export * from './MongoBucketStorage.js';
|
|
13
17
|
export * from './MongoReportStorage.js';
|
|
14
|
-
export * as test_utils from '../utils/test-utils.js';
|
package/src/utils/util.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import * as lib_mongo from '@powersync/lib-service-mongodb';
|
|
2
|
+
import { mongo } from '@powersync/lib-service-mongodb';
|
|
3
|
+
import { ReplicationAbortedError, ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
4
|
+
import { storage, utils } from '@powersync/service-core';
|
|
1
5
|
import * as bson from 'bson';
|
|
2
6
|
import * as crypto from 'crypto';
|
|
7
|
+
import * as timers from 'node:timers/promises';
|
|
3
8
|
import * as uuid from 'uuid';
|
|
4
|
-
import {
|
|
5
|
-
import { storage, utils } from '@powersync/service-core';
|
|
6
|
-
import { ServiceAssertionError } from '@powersync/lib-services-framework';
|
|
7
|
-
import { BucketDataDocument } from '../storage/implementation/models.js';
|
|
9
|
+
import { BucketDataDoc } from '../storage/implementation/common/BucketDataDoc.js';
|
|
8
10
|
|
|
9
11
|
export function idPrefixFilter<T>(prefix: Partial<T>, rest: (keyof T)[]): mongo.Condition<T> {
|
|
10
12
|
let filter = {
|
|
@@ -69,10 +71,10 @@ export async function readSingleBatch<T>(cursor: mongo.AbstractCursor<T>): Promi
|
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
73
|
|
|
72
|
-
export function mapOpEntry(row:
|
|
74
|
+
export function mapOpEntry(row: BucketDataDoc): utils.OplogEntry {
|
|
73
75
|
if (row.op == 'PUT' || row.op == 'REMOVE') {
|
|
74
76
|
return {
|
|
75
|
-
op_id: utils.internalToExternalOpId(row.
|
|
77
|
+
op_id: utils.internalToExternalOpId(row.o),
|
|
76
78
|
op: row.op,
|
|
77
79
|
object_type: row.table,
|
|
78
80
|
object_id: row.row_id,
|
|
@@ -84,7 +86,7 @@ export function mapOpEntry(row: BucketDataDocument): utils.OplogEntry {
|
|
|
84
86
|
// MOVE, CLEAR
|
|
85
87
|
|
|
86
88
|
return {
|
|
87
|
-
op_id: utils.internalToExternalOpId(row.
|
|
89
|
+
op_id: utils.internalToExternalOpId(row.o),
|
|
88
90
|
op: row.op,
|
|
89
91
|
checksum: Number(row.checksum)
|
|
90
92
|
};
|
|
@@ -129,6 +131,33 @@ export function setSessionSnapshotTime(session: mongo.ClientSession, time: bson.
|
|
|
129
131
|
}
|
|
130
132
|
}
|
|
131
133
|
|
|
134
|
+
export async function retryOnMongoMaxTimeMSExpired<T>(
|
|
135
|
+
operation: () => Promise<T>,
|
|
136
|
+
options: {
|
|
137
|
+
signal?: AbortSignal;
|
|
138
|
+
abortMessage?: string;
|
|
139
|
+
retryDelayMs: number;
|
|
140
|
+
onRetry?: (retryCount: number) => void;
|
|
141
|
+
}
|
|
142
|
+
): Promise<T> {
|
|
143
|
+
let retryCount = 0;
|
|
144
|
+
while (true) {
|
|
145
|
+
if (options.signal?.aborted) {
|
|
146
|
+
throw new ReplicationAbortedError(options.abortMessage ?? 'Aborted MongoDB operation', options.signal.reason);
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
return await operation();
|
|
150
|
+
} catch (e) {
|
|
151
|
+
if (!lib_mongo.isMongoServerError(e) || e.codeName !== 'MaxTimeMSExpired') {
|
|
152
|
+
throw e;
|
|
153
|
+
}
|
|
154
|
+
retryCount += 1;
|
|
155
|
+
options.onRetry?.(retryCount);
|
|
156
|
+
await timers.setTimeout(options.retryDelayMs);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
132
161
|
export const createPaginatedConnectionQuery = async <T extends mongo.Document>(
|
|
133
162
|
query: mongo.Filter<T>,
|
|
134
163
|
collection: mongo.Collection<T>,
|
|
@@ -19,7 +19,7 @@ exports[`Connection reporting storage > Should create a connection report if its
|
|
|
19
19
|
|
|
20
20
|
exports[`Connection reporting storage > Should delete rows older than specified range 1`] = `
|
|
21
21
|
{
|
|
22
|
-
"
|
|
22
|
+
"sdks": [
|
|
23
23
|
{
|
|
24
24
|
"clients": 1,
|
|
25
25
|
"sdk": "powersync-dart/1.6.4",
|
|
@@ -51,7 +51,7 @@ exports[`Connection reporting storage > Should delete rows older than specified
|
|
|
51
51
|
"users": 1,
|
|
52
52
|
},
|
|
53
53
|
],
|
|
54
|
-
"
|
|
54
|
+
"users": 5,
|
|
55
55
|
}
|
|
56
56
|
`;
|
|
57
57
|
|
|
@@ -77,9 +77,9 @@ exports[`Connection reporting storage > Should update a connection report if its
|
|
|
77
77
|
]
|
|
78
78
|
`;
|
|
79
79
|
|
|
80
|
-
exports[`Report storage tests >
|
|
80
|
+
exports[`Report storage tests > Should show connection report data for user over the past day 1`] = `
|
|
81
81
|
{
|
|
82
|
-
"
|
|
82
|
+
"sdks": [
|
|
83
83
|
{
|
|
84
84
|
"clients": 1,
|
|
85
85
|
"sdk": "powersync-dart/1.6.4",
|
|
@@ -101,13 +101,13 @@ exports[`Report storage tests > getClientConnectionsSummary returns the past day
|
|
|
101
101
|
"users": 1,
|
|
102
102
|
},
|
|
103
103
|
],
|
|
104
|
-
"
|
|
104
|
+
"users": 3,
|
|
105
105
|
}
|
|
106
106
|
`;
|
|
107
107
|
|
|
108
|
-
exports[`Report storage tests >
|
|
108
|
+
exports[`Report storage tests > Should show connection report data for user over the past month 1`] = `
|
|
109
109
|
{
|
|
110
|
-
"
|
|
110
|
+
"sdks": [
|
|
111
111
|
{
|
|
112
112
|
"clients": 1,
|
|
113
113
|
"sdk": "powersync-dart/1.6.4",
|
|
@@ -149,13 +149,13 @@ exports[`Report storage tests > getClientConnectionsSummary returns the past mon
|
|
|
149
149
|
"users": 1,
|
|
150
150
|
},
|
|
151
151
|
],
|
|
152
|
-
"
|
|
152
|
+
"users": 7,
|
|
153
153
|
}
|
|
154
154
|
`;
|
|
155
155
|
|
|
156
|
-
exports[`Report storage tests >
|
|
156
|
+
exports[`Report storage tests > Should show connection report data for user over the past week 1`] = `
|
|
157
157
|
{
|
|
158
|
-
"
|
|
158
|
+
"sdks": [
|
|
159
159
|
{
|
|
160
160
|
"clients": 1,
|
|
161
161
|
"sdk": "powersync-dart/1.6.4",
|
|
@@ -187,11 +187,50 @@ exports[`Report storage tests > getClientConnectionsSummary returns the past wee
|
|
|
187
187
|
"users": 1,
|
|
188
188
|
},
|
|
189
189
|
],
|
|
190
|
-
"
|
|
190
|
+
"users": 5,
|
|
191
191
|
}
|
|
192
192
|
`;
|
|
193
193
|
|
|
194
|
-
exports[`Report storage tests >
|
|
194
|
+
exports[`Report storage tests > Should show currently connected users 1`] = `
|
|
195
|
+
{
|
|
196
|
+
"sdks": [
|
|
197
|
+
{
|
|
198
|
+
"clients": 1,
|
|
199
|
+
"sdk": "powersync-dart/1.6.4",
|
|
200
|
+
"users": 1,
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"clients": 1,
|
|
204
|
+
"sdk": "powersync-js/1.21.1",
|
|
205
|
+
"users": 1,
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"clients": 1,
|
|
209
|
+
"sdk": "unknown",
|
|
210
|
+
"users": 1,
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
"users": 2,
|
|
214
|
+
}
|
|
215
|
+
`;
|
|
216
|
+
|
|
217
|
+
exports[`Report storage tests > Should show paginated response of all connections of specified client_id 1`] = `
|
|
218
|
+
{
|
|
219
|
+
"count": 1,
|
|
220
|
+
"cursor": undefined,
|
|
221
|
+
"items": [
|
|
222
|
+
{
|
|
223
|
+
"client_id": "client_two",
|
|
224
|
+
"sdk": "powersync-js/1.21.1",
|
|
225
|
+
"user_agent": "powersync-js/1.21.0 powersync-web Chromium/138 linux",
|
|
226
|
+
"user_id": "user_two",
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
"more": false,
|
|
230
|
+
}
|
|
231
|
+
`;
|
|
232
|
+
|
|
233
|
+
exports[`Report storage tests > Should show paginated response of all connections with a limit 1`] = `
|
|
195
234
|
{
|
|
196
235
|
"count": 4,
|
|
197
236
|
"cursor": "<removed-for-snapshot>",
|
|
@@ -225,7 +264,7 @@ exports[`Report storage tests > getClientSessions returns paginated sessions wit
|
|
|
225
264
|
}
|
|
226
265
|
`;
|
|
227
266
|
|
|
228
|
-
exports[`Report storage tests >
|
|
267
|
+
exports[`Report storage tests > Should show paginated response of all connections with a limit 2`] = `
|
|
229
268
|
{
|
|
230
269
|
"count": 4,
|
|
231
270
|
"cursor": undefined,
|
|
@@ -259,7 +298,7 @@ exports[`Report storage tests > getClientSessions returns paginated sessions wit
|
|
|
259
298
|
}
|
|
260
299
|
`;
|
|
261
300
|
|
|
262
|
-
exports[`Report storage tests >
|
|
301
|
+
exports[`Report storage tests > Should show paginated response of all connections with a limit with date range 1`] = `
|
|
263
302
|
{
|
|
264
303
|
"count": 4,
|
|
265
304
|
"cursor": "<removed-for-snapshot>",
|
|
@@ -293,7 +332,7 @@ exports[`Report storage tests > getClientSessions returns paginated sessions wit
|
|
|
293
332
|
}
|
|
294
333
|
`;
|
|
295
334
|
|
|
296
|
-
exports[`Report storage tests >
|
|
335
|
+
exports[`Report storage tests > Should show paginated response of all connections with a limit with date range 2`] = `
|
|
297
336
|
{
|
|
298
337
|
"count": 2,
|
|
299
338
|
"cursor": undefined,
|
|
@@ -327,23 +366,29 @@ exports[`Report storage tests > getClientSessions returns paginated sessions wit
|
|
|
327
366
|
}
|
|
328
367
|
`;
|
|
329
368
|
|
|
330
|
-
exports[`Report storage tests >
|
|
369
|
+
exports[`Report storage tests > Should show paginated response of connections of specified user_id 1`] = `
|
|
331
370
|
{
|
|
332
|
-
"count":
|
|
371
|
+
"count": 2,
|
|
333
372
|
"cursor": undefined,
|
|
334
373
|
"items": [
|
|
335
374
|
{
|
|
336
|
-
"client_id": "
|
|
337
|
-
"sdk": "powersync-
|
|
338
|
-
"user_agent": "powersync-
|
|
339
|
-
"user_id": "
|
|
375
|
+
"client_id": "client_one",
|
|
376
|
+
"sdk": "powersync-dart/1.6.4",
|
|
377
|
+
"user_agent": "powersync-dart/1.6.4 Dart (flutter-web) Chrome/128 android",
|
|
378
|
+
"user_id": "user_one",
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"client_id": "",
|
|
382
|
+
"sdk": "unknown",
|
|
383
|
+
"user_agent": "Dart (flutter-web) Chrome/128 android",
|
|
384
|
+
"user_id": "user_one",
|
|
340
385
|
},
|
|
341
386
|
],
|
|
342
387
|
"more": false,
|
|
343
388
|
}
|
|
344
389
|
`;
|
|
345
390
|
|
|
346
|
-
exports[`Report storage tests >
|
|
391
|
+
exports[`Report storage tests > Should show paginated response of connections over a date range 1`] = `
|
|
347
392
|
{
|
|
348
393
|
"count": 6,
|
|
349
394
|
"cursor": undefined,
|
|
@@ -389,29 +434,7 @@ exports[`Report storage tests > getClientSessions returns sessions for a date ra
|
|
|
389
434
|
}
|
|
390
435
|
`;
|
|
391
436
|
|
|
392
|
-
exports[`Report storage tests >
|
|
393
|
-
{
|
|
394
|
-
"count": 2,
|
|
395
|
-
"cursor": undefined,
|
|
396
|
-
"items": [
|
|
397
|
-
{
|
|
398
|
-
"client_id": "client_one",
|
|
399
|
-
"sdk": "powersync-dart/1.6.4",
|
|
400
|
-
"user_agent": "powersync-dart/1.6.4 Dart (flutter-web) Chrome/128 android",
|
|
401
|
-
"user_id": "user_one",
|
|
402
|
-
},
|
|
403
|
-
{
|
|
404
|
-
"client_id": "",
|
|
405
|
-
"sdk": "unknown",
|
|
406
|
-
"user_agent": "Dart (flutter-web) Chrome/128 android",
|
|
407
|
-
"user_id": "user_one",
|
|
408
|
-
},
|
|
409
|
-
],
|
|
410
|
-
"more": false,
|
|
411
|
-
}
|
|
412
|
-
`;
|
|
413
|
-
|
|
414
|
-
exports[`Report storage tests > getClientSessions returns sessions for client_id and user_id within a date range 1`] = `
|
|
437
|
+
exports[`Report storage tests > Should show paginated response of connections over a date range of specified client_id and user_id 1`] = `
|
|
415
438
|
{
|
|
416
439
|
"count": 1,
|
|
417
440
|
"cursor": undefined,
|
|
@@ -426,26 +449,3 @@ exports[`Report storage tests > getClientSessions returns sessions for client_id
|
|
|
426
449
|
"more": false,
|
|
427
450
|
}
|
|
428
451
|
`;
|
|
429
|
-
|
|
430
|
-
exports[`Report storage tests > getCurrentConnections returns current connections 1`] = `
|
|
431
|
-
{
|
|
432
|
-
"sdk_breakdown": [
|
|
433
|
-
{
|
|
434
|
-
"clients": 1,
|
|
435
|
-
"sdk": "powersync-dart/1.6.4",
|
|
436
|
-
"users": 1,
|
|
437
|
-
},
|
|
438
|
-
{
|
|
439
|
-
"clients": 1,
|
|
440
|
-
"sdk": "powersync-js/1.21.1",
|
|
441
|
-
"users": 1,
|
|
442
|
-
},
|
|
443
|
-
{
|
|
444
|
-
"clients": 1,
|
|
445
|
-
"sdk": "unknown",
|
|
446
|
-
"users": 1,
|
|
447
|
-
},
|
|
448
|
-
],
|
|
449
|
-
"total_users": 2,
|
|
450
|
-
}
|
|
451
|
-
`;
|