@powersync/service-module-mongodb 0.0.0-dev-20241111122558 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +18 -17
  2. package/dist/api/MongoRouteAPIAdapter.d.ts +1 -0
  3. package/dist/api/MongoRouteAPIAdapter.js +54 -21
  4. package/dist/api/MongoRouteAPIAdapter.js.map +1 -1
  5. package/dist/replication/ChangeStream.d.ts +23 -2
  6. package/dist/replication/ChangeStream.js +178 -42
  7. package/dist/replication/ChangeStream.js.map +1 -1
  8. package/dist/replication/ChangeStreamReplicationJob.js +7 -4
  9. package/dist/replication/ChangeStreamReplicationJob.js.map +1 -1
  10. package/dist/replication/MongoErrorRateLimiter.js +0 -6
  11. package/dist/replication/MongoErrorRateLimiter.js.map +1 -1
  12. package/dist/replication/MongoRelation.js +5 -2
  13. package/dist/replication/MongoRelation.js.map +1 -1
  14. package/dist/replication/replication-utils.d.ts +1 -0
  15. package/dist/replication/replication-utils.js +1 -0
  16. package/dist/replication/replication-utils.js.map +1 -1
  17. package/dist/types/types.d.ts +35 -0
  18. package/dist/types/types.js +38 -2
  19. package/dist/types/types.js.map +1 -1
  20. package/package.json +6 -9
  21. package/src/api/MongoRouteAPIAdapter.ts +53 -21
  22. package/src/replication/ChangeStream.ts +277 -121
  23. package/src/replication/ChangeStreamReplicationJob.ts +6 -4
  24. package/src/replication/MongoErrorRateLimiter.ts +1 -8
  25. package/src/replication/MongoRelation.ts +5 -2
  26. package/src/replication/replication-utils.ts +2 -1
  27. package/src/types/types.ts +43 -3
  28. package/test/src/change_stream.test.ts +442 -231
  29. package/test/src/change_stream_utils.ts +54 -27
  30. package/test/src/mongo_test.test.ts +180 -46
  31. package/test/src/slow_tests.test.ts +109 -0
  32. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,25 +1,26 @@
1
1
  # @powersync/service-module-mongodb
2
2
 
3
- ## 0.0.0-dev-20241111122558
3
+ ## 0.1.0
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - c6307d8: Reduce permissions required for replicating a single mongodb database
8
- - 6f54a28: Add MongoDB support (Alpha)
7
+ - 57bd18b: Reduce permissions required for replicating a single mongodb database
8
+ - 57bd18b: Add MongoDB support (Alpha)
9
9
 
10
10
  ### Patch Changes
11
11
 
12
- - 04ddc98: Fix diagnostics schema authorization issues for MongoDB
13
- - Updated dependencies [ac03d8f]
14
- - Updated dependencies [e4d19b2]
15
- - Updated dependencies [d2ece1b]
16
- - Updated dependencies [d2ece1b]
17
- - Updated dependencies [8610431]
18
- - Updated dependencies [2ccd6af]
19
- - Updated dependencies [d2ece1b]
20
- - Updated dependencies [d51921f]
21
- - Updated dependencies [4ecaee2]
22
- - @powersync/service-core@0.0.0-dev-20241111122558
23
- - @powersync/lib-services-framework@0.0.0-dev-20241111122558
24
- - @powersync/service-sync-rules@0.0.0-dev-20241111122558
25
- - @powersync/service-types@0.0.0-dev-20241111122558
12
+ - 57bd18b: Fix diagnostics schema authorization issues for MongoDB
13
+ - Updated dependencies [57bd18b]
14
+ - Updated dependencies [57bd18b]
15
+ - Updated dependencies [57bd18b]
16
+ - Updated dependencies [57bd18b]
17
+ - Updated dependencies [57bd18b]
18
+ - Updated dependencies [57bd18b]
19
+ - Updated dependencies [57bd18b]
20
+ - Updated dependencies [57bd18b]
21
+ - Updated dependencies [57bd18b]
22
+ - Updated dependencies [57bd18b]
23
+ - @powersync/service-core@0.9.0
24
+ - @powersync/lib-services-framework@0.2.0
25
+ - @powersync/service-sync-rules@0.21.0
26
+ - @powersync/service-types@0.3.0
@@ -12,6 +12,7 @@ export declare class MongoRouteAPIAdapter implements api.RouteAPI {
12
12
  constructor(config: types.ResolvedConnectionConfig);
13
13
  getParseSyncRulesOptions(): ParseSyncRulesOptions;
14
14
  shutdown(): Promise<void>;
15
+ [Symbol.asyncDispose](): Promise<void>;
15
16
  getSourceConfig(): Promise<service_types.configFile.ResolvedDataSourceConfig>;
16
17
  getConnectionStatus(): Promise<service_types.ConnectionStatusV2>;
17
18
  executeQuery(query: string, params: any[]): Promise<service_types.internal_routes.ExecuteSqlResponse>;
@@ -6,6 +6,7 @@ import { MongoManager } from '../replication/MongoManager.js';
6
6
  import { constructAfterRecord, createCheckpoint } from '../replication/MongoRelation.js';
7
7
  import * as types from '../types/types.js';
8
8
  import { escapeRegExp } from '../utils.js';
9
+ import { CHECKPOINTS_COLLECTION } from '../replication/replication-utils.js';
9
10
  export class MongoRouteAPIAdapter {
10
11
  constructor(config) {
11
12
  this.config = config;
@@ -23,6 +24,9 @@ export class MongoRouteAPIAdapter {
23
24
  async shutdown() {
24
25
  await this.client.close();
25
26
  }
27
+ async [Symbol.asyncDispose]() {
28
+ await this.shutdown();
29
+ }
26
30
  async getSourceConfig() {
27
31
  return this.config;
28
32
  }
@@ -60,6 +64,29 @@ export class MongoRouteAPIAdapter {
60
64
  }
61
65
  async getDebugTablesInfo(tablePatterns, sqlSyncRules) {
62
66
  let result = [];
67
+ const validatePostImages = (schema, collection) => {
68
+ if (this.config.postImages == types.PostImagesOption.OFF) {
69
+ return [];
70
+ }
71
+ else if (!collection.options?.changeStreamPreAndPostImages?.enabled) {
72
+ if (this.config.postImages == types.PostImagesOption.READ_ONLY) {
73
+ return [
74
+ { level: 'fatal', message: `changeStreamPreAndPostImages not enabled on ${schema}.${collection.name}` }
75
+ ];
76
+ }
77
+ else {
78
+ return [
79
+ {
80
+ level: 'warning',
81
+ message: `changeStreamPreAndPostImages not enabled on ${schema}.${collection.name}, will be enabled automatically`
82
+ }
83
+ ];
84
+ }
85
+ }
86
+ else {
87
+ return [];
88
+ }
89
+ };
63
90
  for (let tablePattern of tablePatterns) {
64
91
  const schema = tablePattern.schema;
65
92
  let patternResult = {
@@ -80,12 +107,19 @@ export class MongoRouteAPIAdapter {
80
107
  .db(schema)
81
108
  .listCollections({
82
109
  name: nameFilter
83
- }, { nameOnly: true })
110
+ }, { nameOnly: false })
84
111
  .toArray();
85
112
  if (tablePattern.isWildcard) {
86
113
  patternResult.tables = [];
87
114
  for (let collection of collections) {
88
115
  const sourceTable = new SourceTable(0, this.connectionTag, collection.name, schema, collection.name, [], true);
116
+ let errors = [];
117
+ if (collection.type == 'view') {
118
+ errors.push({ level: 'warning', message: `Collection ${schema}.${tablePattern.name} is a view` });
119
+ }
120
+ else {
121
+ errors.push(...validatePostImages(schema, collection));
122
+ }
89
123
  const syncData = sqlSyncRules.tableSyncsData(sourceTable);
90
124
  const syncParameters = sqlSyncRules.tableSyncsParameters(sourceTable);
91
125
  patternResult.tables.push({
@@ -94,7 +128,7 @@ export class MongoRouteAPIAdapter {
94
128
  replication_id: ['_id'],
95
129
  data_queries: syncData,
96
130
  parameter_queries: syncParameters,
97
- errors: []
131
+ errors: errors
98
132
  });
99
133
  }
100
134
  }
@@ -102,26 +136,25 @@ export class MongoRouteAPIAdapter {
102
136
  const sourceTable = new SourceTable(0, this.connectionTag, tablePattern.name, schema, tablePattern.name, [], true);
103
137
  const syncData = sqlSyncRules.tableSyncsData(sourceTable);
104
138
  const syncParameters = sqlSyncRules.tableSyncsParameters(sourceTable);
105
- if (collections.length == 1) {
106
- patternResult.table = {
107
- schema,
108
- name: tablePattern.name,
109
- replication_id: ['_id'],
110
- data_queries: syncData,
111
- parameter_queries: syncParameters,
112
- errors: []
113
- };
139
+ const collection = collections[0];
140
+ let errors = [];
141
+ if (collections.length != 1) {
142
+ errors.push({ level: 'warning', message: `Collection ${schema}.${tablePattern.name} not found` });
114
143
  }
115
- else {
116
- patternResult.table = {
117
- schema,
118
- name: tablePattern.name,
119
- replication_id: ['_id'],
120
- data_queries: syncData,
121
- parameter_queries: syncParameters,
122
- errors: [{ level: 'warning', message: `Collection ${schema}.${tablePattern.name} not found` }]
123
- };
144
+ else if (collection.type == 'view') {
145
+ errors.push({ level: 'warning', message: `Collection ${schema}.${tablePattern.name} is a view` });
146
+ }
147
+ else if (!collection.options?.changeStreamPreAndPostImages?.enabled) {
148
+ errors.push(...validatePostImages(schema, collection));
124
149
  }
150
+ patternResult.table = {
151
+ schema,
152
+ name: tablePattern.name,
153
+ replication_id: ['_id'],
154
+ data_queries: syncData,
155
+ parameter_queries: syncParameters,
156
+ errors
157
+ };
125
158
  }
126
159
  }
127
160
  return result;
@@ -159,7 +192,7 @@ export class MongoRouteAPIAdapter {
159
192
  }
160
193
  let tables = [];
161
194
  for (let collection of collections) {
162
- if (['_powersync_checkpoints'].includes(collection.name)) {
195
+ if ([CHECKPOINTS_COLLECTION].includes(collection.name)) {
163
196
  continue;
164
197
  }
165
198
  if (collection.name.startsWith('system.')) {
@@ -1 +1 @@
1
- {"version":3,"file":"MongoRouteAPIAdapter.js","sourceRoot":"","sources":["../../src/api/MongoRouteAPIAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MongoRouteAPIAdapter.js","sourceRoot":"","sources":["../../src/api/MongoRouteAPIAdapter.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,15 @@ export interface ChangeStreamOptions {
11
11
  interface InitResult {
12
12
  needsInitialSync: boolean;
13
13
  }
14
- export declare class MissingReplicationSlotError extends Error {
14
+ /**
15
+ * Thrown when the change stream is not valid anymore, and replication
16
+ * must be restarted.
17
+ *
18
+ * Possible reasons:
19
+ * * Some change stream documents do not have postImages.
20
+ * * startAfter/resumeToken is not valid anymore.
21
+ */
22
+ export declare class ChangeStreamInvalidatedError extends Error {
15
23
  constructor(message: string);
16
24
  }
17
25
  export declare class ChangeStream {
@@ -26,7 +34,15 @@ export declare class ChangeStream {
26
34
  private relation_cache;
27
35
  constructor(options: ChangeStreamOptions);
28
36
  get stopped(): boolean;
29
- getQualifiedTableNames(batch: storage.BucketStorageBatch, tablePattern: TablePattern): Promise<storage.SourceTable[]>;
37
+ private get usePostImages();
38
+ private get configurePostImages();
39
+ /**
40
+ * This resolves a pattern, persists the related metadata, and returns
41
+ * the resulting SourceTables.
42
+ *
43
+ * This implicitly checks the collection postImage configuration.
44
+ */
45
+ resolveQualifiedTableNames(batch: storage.BucketStorageBatch, tablePattern: TablePattern): Promise<storage.SourceTable[]>;
30
46
  initSlot(): Promise<InitResult>;
31
47
  estimatedCount(table: storage.SourceTable): Promise<string>;
32
48
  /**
@@ -37,16 +53,21 @@ export declare class ChangeStream {
37
53
  */
38
54
  startInitialReplication(): Promise<void>;
39
55
  initialReplication(): Promise<void>;
56
+ private setupCheckpointsCollection;
40
57
  private getSourceNamespaceFilters;
41
58
  static getQueryData(results: Iterable<DatabaseInputRow>): Generator<SqliteRow>;
42
59
  private snapshotTable;
43
60
  private getRelation;
61
+ private getCollectionInfo;
62
+ private checkPostImages;
44
63
  handleRelation(batch: storage.BucketStorageBatch, descriptor: SourceEntityDescriptor, options: {
45
64
  snapshot: boolean;
65
+ collectionInfo: mongo.CollectionInfo | undefined;
46
66
  }): Promise<SourceTable>;
47
67
  writeChange(batch: storage.BucketStorageBatch, table: storage.SourceTable, change: mongo.ChangeStreamDocument): Promise<storage.FlushedResult | null>;
48
68
  replicate(): Promise<void>;
49
69
  initReplication(): Promise<void>;
50
70
  streamChanges(): Promise<void>;
71
+ streamChangesInternal(): Promise<void>;
51
72
  }
52
73
  export {};
@@ -1,9 +1,20 @@
1
1
  import { container, logger } from '@powersync/lib-services-framework';
2
2
  import { Metrics, SaveOperationTag } from '@powersync/service-core';
3
+ import * as mongo from 'mongodb';
3
4
  import { constructAfterRecord, createCheckpoint, getMongoLsn, getMongoRelation, mongoLsnToTimestamp } from './MongoRelation.js';
4
5
  import { escapeRegExp } from '../utils.js';
6
+ import { CHECKPOINTS_COLLECTION } from './replication-utils.js';
7
+ import { PostImagesOption } from '../types/types.js';
5
8
  export const ZERO_LSN = '0000000000000000';
6
- export class MissingReplicationSlotError extends Error {
9
+ /**
10
+ * Thrown when the change stream is not valid anymore, and replication
11
+ * must be restarted.
12
+ *
13
+ * Possible reasons:
14
+ * * Some change stream documents do not have postImages.
15
+ * * startAfter/resumeToken is not valid anymore.
16
+ */
17
+ export class ChangeStreamInvalidatedError extends Error {
7
18
  constructor(message) {
8
19
  super(message);
9
20
  }
@@ -28,7 +39,19 @@ export class ChangeStream {
28
39
  get stopped() {
29
40
  return this.abort_signal.aborted;
30
41
  }
31
- async getQualifiedTableNames(batch, tablePattern) {
42
+ get usePostImages() {
43
+ return this.connections.options.postImages != PostImagesOption.OFF;
44
+ }
45
+ get configurePostImages() {
46
+ return this.connections.options.postImages == PostImagesOption.AUTO_CONFIGURE;
47
+ }
48
+ /**
49
+ * This resolves a pattern, persists the related metadata, and returns
50
+ * the resulting SourceTables.
51
+ *
52
+ * This implicitly checks the collection postImage configuration.
53
+ */
54
+ async resolveQualifiedTableNames(batch, tablePattern) {
32
55
  const schema = tablePattern.schema;
33
56
  if (tablePattern.connectionTag != this.connections.connectionTag) {
34
57
  return [];
@@ -46,8 +69,11 @@ export class ChangeStream {
46
69
  .db(schema)
47
70
  .listCollections({
48
71
  name: nameFilter
49
- }, { nameOnly: true })
72
+ }, { nameOnly: false })
50
73
  .toArray();
74
+ if (!tablePattern.isWildcard && collections.length == 0) {
75
+ logger.warn(`Collection ${schema}.${tablePattern.name} not found`);
76
+ }
51
77
  for (let collection of collections) {
52
78
  const table = await this.handleRelation(batch, {
53
79
  name: collection.name,
@@ -56,7 +82,7 @@ export class ChangeStream {
56
82
  replicationColumns: [{ name: '_id' }]
57
83
  },
58
84
  // This is done as part of the initial setup - snapshot is handled elsewhere
59
- { snapshot: false });
85
+ { snapshot: false, collectionInfo: collection });
60
86
  result.push(table);
61
87
  }
62
88
  return result;
@@ -87,51 +113,67 @@ export class ChangeStream {
87
113
  async initialReplication() {
88
114
  const sourceTables = this.sync_rules.getSourceTables();
89
115
  await this.client.connect();
116
+ // We need to get the snapshot time before taking the initial snapshot.
90
117
  const hello = await this.defaultDb.command({ hello: 1 });
91
- const startTime = hello.lastWrite?.majorityOpTime?.ts;
118
+ const snapshotTime = hello.lastWrite?.majorityOpTime?.ts;
92
119
  if (hello.msg == 'isdbgrid') {
93
120
  throw new Error('Sharded MongoDB Clusters are not supported yet (including MongoDB Serverless instances).');
94
121
  }
95
122
  else if (hello.setName == null) {
96
123
  throw new Error('Standalone MongoDB instances are not supported - use a replicaset.');
97
124
  }
98
- else if (startTime == null) {
125
+ else if (snapshotTime == null) {
99
126
  // Not known where this would happen apart from the above cases
100
127
  throw new Error('MongoDB lastWrite timestamp not found.');
101
128
  }
102
- const session = await this.client.startSession({
103
- snapshot: true
104
- });
129
+ // We previously used {snapshot: true} for the snapshot session.
130
+ // While it gives nice consistency guarantees, it fails when the
131
+ // snapshot takes longer than 5 minutes, due to minSnapshotHistoryWindowInSeconds
132
+ // expiring the snapshot.
133
+ const session = await this.client.startSession();
105
134
  try {
106
- await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName }, async (batch) => {
135
+ await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
136
+ // Start by resolving all tables.
137
+ // This checks postImage configuration, and that should fail as
138
+ // earlier as possible.
139
+ let allSourceTables = [];
107
140
  for (let tablePattern of sourceTables) {
108
- const tables = await this.getQualifiedTableNames(batch, tablePattern);
109
- for (let table of tables) {
110
- await this.snapshotTable(batch, table, session);
111
- await batch.markSnapshotDone([table], ZERO_LSN);
112
- await touch();
113
- }
114
- }
115
- const snapshotTime = session.clusterTime?.clusterTime ?? startTime;
116
- if (snapshotTime != null) {
117
- const lsn = getMongoLsn(snapshotTime);
118
- logger.info(`Snapshot commit at ${snapshotTime.inspect()} / ${lsn}`);
119
- // keepalive() does an auto-commit if there is data
120
- await batch.flush();
121
- await batch.keepalive(lsn);
141
+ const tables = await this.resolveQualifiedTableNames(batch, tablePattern);
142
+ allSourceTables.push(...tables);
122
143
  }
123
- else {
124
- throw new Error(`No snapshot clusterTime available.`);
144
+ for (let table of allSourceTables) {
145
+ await this.snapshotTable(batch, table, session);
146
+ await batch.markSnapshotDone([table], ZERO_LSN);
147
+ await touch();
125
148
  }
149
+ const lsn = getMongoLsn(snapshotTime);
150
+ logger.info(`Snapshot commit at ${snapshotTime.inspect()} / ${lsn}`);
151
+ await batch.commit(lsn);
126
152
  });
127
153
  }
128
154
  finally {
129
155
  session.endSession();
130
156
  }
131
157
  }
158
+ async setupCheckpointsCollection() {
159
+ const collection = await this.getCollectionInfo(this.defaultDb.databaseName, CHECKPOINTS_COLLECTION);
160
+ if (collection == null) {
161
+ await this.defaultDb.createCollection(CHECKPOINTS_COLLECTION, {
162
+ changeStreamPreAndPostImages: { enabled: true }
163
+ });
164
+ }
165
+ else if (this.usePostImages && collection.options?.changeStreamPreAndPostImages?.enabled != true) {
166
+ // Drop + create requires less permissions than collMod,
167
+ // and we don't care about the data in this collection.
168
+ await this.defaultDb.dropCollection(CHECKPOINTS_COLLECTION);
169
+ await this.defaultDb.createCollection(CHECKPOINTS_COLLECTION, {
170
+ changeStreamPreAndPostImages: { enabled: true }
171
+ });
172
+ }
173
+ }
132
174
  getSourceNamespaceFilters() {
133
175
  const sourceTables = this.sync_rules.getSourceTables();
134
- let $inFilters = [{ db: this.defaultDb.databaseName, coll: '_powersync_checkpoints' }];
176
+ let $inFilters = [{ db: this.defaultDb.databaseName, coll: CHECKPOINTS_COLLECTION }];
135
177
  let $refilters = [];
136
178
  let multipleDatabases = false;
137
179
  for (let tablePattern of sourceTables) {
@@ -142,7 +184,10 @@ export class ChangeStream {
142
184
  multipleDatabases = true;
143
185
  }
144
186
  if (tablePattern.isWildcard) {
145
- $refilters.push({ db: tablePattern.schema, coll: new RegExp('^' + escapeRegExp(tablePattern.tablePrefix)) });
187
+ $refilters.push({
188
+ 'ns.db': tablePattern.schema,
189
+ 'ns.coll': new RegExp('^' + escapeRegExp(tablePattern.tablePrefix))
190
+ });
146
191
  }
147
192
  else {
148
193
  $inFilters.push({
@@ -167,12 +212,13 @@ export class ChangeStream {
167
212
  let at = 0;
168
213
  const db = this.client.db(table.schema);
169
214
  const collection = db.collection(table.table);
170
- const query = collection.find({}, { session });
215
+ const query = collection.find({}, { session, readConcern: { level: 'majority' } });
171
216
  const cursor = query.stream();
172
217
  for await (let document of cursor) {
173
218
  if (this.abort_signal.aborted) {
174
219
  throw new Error(`Aborted initial replication`);
175
220
  }
221
+ at += 1;
176
222
  const record = constructAfterRecord(document);
177
223
  // This auto-flushes when the batch reaches its size limit
178
224
  await batch.save({
@@ -188,15 +234,52 @@ export class ChangeStream {
188
234
  await touch();
189
235
  }
190
236
  await batch.flush();
237
+ logger.info(`Replicated ${at} documents for ${table.qualifiedName}`);
191
238
  }
192
239
  async getRelation(batch, descriptor) {
193
240
  const existing = this.relation_cache.get(descriptor.objectId);
194
241
  if (existing != null) {
195
242
  return existing;
196
243
  }
197
- return this.handleRelation(batch, descriptor, { snapshot: false });
244
+ // Note: collection may have been dropped at this point, so we handle
245
+ // missing values.
246
+ const collection = await this.getCollectionInfo(descriptor.schema, descriptor.name);
247
+ return this.handleRelation(batch, descriptor, { snapshot: false, collectionInfo: collection });
248
+ }
249
+ async getCollectionInfo(db, name) {
250
+ const collection = (await this.client
251
+ .db(db)
252
+ .listCollections({
253
+ name: name
254
+ }, { nameOnly: false })
255
+ .toArray())[0];
256
+ return collection;
257
+ }
258
+ async checkPostImages(db, collectionInfo) {
259
+ if (!this.usePostImages) {
260
+ // Nothing to check
261
+ return;
262
+ }
263
+ const enabled = collectionInfo.options?.changeStreamPreAndPostImages?.enabled == true;
264
+ if (!enabled && this.configurePostImages) {
265
+ await this.client.db(db).command({
266
+ collMod: collectionInfo.name,
267
+ changeStreamPreAndPostImages: { enabled: true }
268
+ });
269
+ logger.info(`Enabled postImages on ${db}.${collectionInfo.name}`);
270
+ }
271
+ else if (!enabled) {
272
+ throw new Error(`postImages not enabled on ${db}.${collectionInfo.name}`);
273
+ }
198
274
  }
199
275
  async handleRelation(batch, descriptor, options) {
276
+ if (options.collectionInfo != null) {
277
+ await this.checkPostImages(descriptor.schema, options.collectionInfo);
278
+ }
279
+ else {
280
+ // If collectionInfo is null, the collection may have been dropped.
281
+ // Ignore the postImages check in this case.
282
+ }
200
283
  const snapshot = options.snapshot;
201
284
  if (!descriptor.objectId && typeof descriptor.objectId != 'string') {
202
285
  throw new Error('objectId expected');
@@ -289,30 +372,54 @@ export class ChangeStream {
289
372
  }
290
373
  async initReplication() {
291
374
  const result = await this.initSlot();
375
+ await this.setupCheckpointsCollection();
292
376
  if (result.needsInitialSync) {
293
377
  await this.startInitialReplication();
294
378
  }
295
379
  }
296
380
  async streamChanges() {
381
+ try {
382
+ await this.streamChangesInternal();
383
+ }
384
+ catch (e) {
385
+ if (e instanceof mongo.MongoServerError &&
386
+ e.codeName == 'NoMatchingDocument' &&
387
+ e.errmsg?.includes('post-image was not found')) {
388
+ throw new ChangeStreamInvalidatedError(e.errmsg);
389
+ }
390
+ throw e;
391
+ }
392
+ }
393
+ async streamChangesInternal() {
297
394
  // Auto-activate as soon as initial replication is done
298
395
  await this.storage.autoActivate();
299
- await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName }, async (batch) => {
396
+ await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
300
397
  const lastLsn = batch.lastCheckpointLsn;
301
398
  const startAfter = mongoLsnToTimestamp(lastLsn) ?? undefined;
302
399
  logger.info(`Resume streaming at ${startAfter?.inspect()} / ${lastLsn}`);
303
- // TODO: Use changeStreamSplitLargeEvent
304
400
  const filters = this.getSourceNamespaceFilters();
305
401
  const pipeline = [
306
402
  {
307
403
  $match: filters.$match
308
- }
404
+ },
405
+ { $changeStreamSplitLargeEvent: {} }
309
406
  ];
407
+ let fullDocument;
408
+ if (this.usePostImages) {
409
+ // 'read_only' or 'auto_configure'
410
+ // Configuration happens during snapshot, or when we see new
411
+ // collections.
412
+ fullDocument = 'required';
413
+ }
414
+ else {
415
+ fullDocument = 'updateLookup';
416
+ }
310
417
  const streamOptions = {
311
418
  startAtOperationTime: startAfter,
312
419
  showExpandedEvents: true,
313
420
  useBigInt64: true,
314
421
  maxAwaitTimeMS: 200,
315
- fullDocument: 'updateLookup'
422
+ fullDocument: fullDocument
316
423
  };
317
424
  let stream;
318
425
  if (filters.multipleDatabases) {
@@ -330,30 +437,58 @@ export class ChangeStream {
330
437
  this.abort_signal.addEventListener('abort', () => {
331
438
  stream.close();
332
439
  });
333
- let waitForCheckpointLsn = null;
440
+ // Always start with a checkpoint.
441
+ // This helps us to clear erorrs when restarting, even if there is
442
+ // no data to replicate.
443
+ let waitForCheckpointLsn = await createCheckpoint(this.client, this.defaultDb);
444
+ let splitDocument = null;
334
445
  while (true) {
335
446
  if (this.abort_signal.aborted) {
336
447
  break;
337
448
  }
338
- const changeDocument = await stream.tryNext();
339
- if (changeDocument == null || this.abort_signal.aborted) {
449
+ const originalChangeDocument = await stream.tryNext();
450
+ if (originalChangeDocument == null || this.abort_signal.aborted) {
340
451
  continue;
341
452
  }
342
453
  await touch();
343
- if (startAfter != null && changeDocument.clusterTime?.lte(startAfter)) {
454
+ if (startAfter != null && originalChangeDocument.clusterTime?.lte(startAfter)) {
344
455
  continue;
345
456
  }
457
+ let changeDocument = originalChangeDocument;
458
+ if (originalChangeDocument?.splitEvent != null) {
459
+ // Handle split events from $changeStreamSplitLargeEvent.
460
+ // This is only relevant for very large update operations.
461
+ const splitEvent = originalChangeDocument?.splitEvent;
462
+ if (splitDocument == null) {
463
+ splitDocument = originalChangeDocument;
464
+ }
465
+ else {
466
+ splitDocument = Object.assign(splitDocument, originalChangeDocument);
467
+ }
468
+ if (splitEvent.fragment == splitEvent.of) {
469
+ // Got all fragments
470
+ changeDocument = splitDocument;
471
+ splitDocument = null;
472
+ }
473
+ else {
474
+ // Wait for more fragments
475
+ continue;
476
+ }
477
+ }
478
+ else if (splitDocument != null) {
479
+ // We were waiting for fragments, but got a different event
480
+ throw new Error(`Incomplete splitEvent: ${JSON.stringify(splitDocument.splitEvent)}`);
481
+ }
346
482
  // console.log('event', changeDocument);
347
483
  if ((changeDocument.operationType == 'insert' ||
348
484
  changeDocument.operationType == 'update' ||
349
485
  changeDocument.operationType == 'replace') &&
350
- changeDocument.ns.coll == '_powersync_checkpoints') {
486
+ changeDocument.ns.coll == CHECKPOINTS_COLLECTION) {
351
487
  const lsn = getMongoLsn(changeDocument.clusterTime);
352
488
  if (waitForCheckpointLsn != null && lsn >= waitForCheckpointLsn) {
353
489
  waitForCheckpointLsn = null;
354
490
  }
355
- await batch.flush();
356
- await batch.keepalive(lsn);
491
+ await batch.commit(lsn);
357
492
  }
358
493
  else if (changeDocument.operationType == 'insert' ||
359
494
  changeDocument.operationType == 'update' ||
@@ -385,7 +520,8 @@ export class ChangeStream {
385
520
  this.relation_cache.delete(tableFrom.objectId);
386
521
  }
387
522
  // Here we do need to snapshot the new table
388
- await this.handleRelation(batch, relTo, { snapshot: true });
523
+ const collection = await this.getCollectionInfo(relTo.schema, relTo.name);
524
+ await this.handleRelation(batch, relTo, { snapshot: true, collectionInfo: collection });
389
525
  }
390
526
  }
391
527
  });