@powersync/service-module-mongodb 0.0.0-dev-20250117095455 → 0.0.0-dev-20250214100224

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 (43) hide show
  1. package/CHANGELOG.md +57 -9
  2. package/dist/api/MongoRouteAPIAdapter.d.ts +2 -1
  3. package/dist/api/MongoRouteAPIAdapter.js +39 -0
  4. package/dist/api/MongoRouteAPIAdapter.js.map +1 -1
  5. package/dist/common/MongoLSN.d.ts +31 -0
  6. package/dist/common/MongoLSN.js +47 -0
  7. package/dist/common/MongoLSN.js.map +1 -0
  8. package/dist/module/MongoModule.d.ts +3 -2
  9. package/dist/module/MongoModule.js +15 -6
  10. package/dist/module/MongoModule.js.map +1 -1
  11. package/dist/replication/ChangeStream.d.ts +3 -3
  12. package/dist/replication/ChangeStream.js +74 -30
  13. package/dist/replication/ChangeStream.js.map +1 -1
  14. package/dist/replication/ChangeStreamReplicationJob.js +5 -4
  15. package/dist/replication/ChangeStreamReplicationJob.js.map +1 -1
  16. package/dist/replication/ChangeStreamReplicator.d.ts +1 -0
  17. package/dist/replication/ChangeStreamReplicator.js +5 -0
  18. package/dist/replication/ChangeStreamReplicator.js.map +1 -1
  19. package/dist/replication/ConnectionManagerFactory.d.ts +1 -1
  20. package/dist/replication/ConnectionManagerFactory.js +2 -0
  21. package/dist/replication/ConnectionManagerFactory.js.map +1 -1
  22. package/dist/replication/MongoErrorRateLimiter.js +5 -7
  23. package/dist/replication/MongoErrorRateLimiter.js.map +1 -1
  24. package/dist/replication/MongoManager.js +10 -4
  25. package/dist/replication/MongoManager.js.map +1 -1
  26. package/dist/replication/MongoRelation.d.ts +0 -2
  27. package/dist/replication/MongoRelation.js +4 -15
  28. package/dist/replication/MongoRelation.js.map +1 -1
  29. package/dist/replication/replication-utils.js +49 -2
  30. package/dist/replication/replication-utils.js.map +1 -1
  31. package/package.json +9 -9
  32. package/src/api/MongoRouteAPIAdapter.ts +41 -1
  33. package/src/common/MongoLSN.ts +74 -0
  34. package/src/module/MongoModule.ts +24 -8
  35. package/src/replication/ChangeStream.ts +87 -37
  36. package/src/replication/ChangeStreamReplicationJob.ts +4 -4
  37. package/src/replication/ChangeStreamReplicator.ts +5 -0
  38. package/src/replication/ConnectionManagerFactory.ts +1 -1
  39. package/src/replication/MongoRelation.ts +4 -17
  40. package/src/replication/replication-utils.ts +77 -2
  41. package/test/src/change_stream_utils.ts +2 -2
  42. package/test/src/resume.test.ts +152 -0
  43. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,20 +1,68 @@
1
1
  # @powersync/service-module-mongodb
2
2
 
3
- ## 0.0.0-dev-20250117095455
3
+ ## 0.0.0-dev-20250214100224
4
+
5
+ ### Patch Changes
6
+
7
+ - 84d03b8: Fix write checkpoint race condition
8
+ - Updated dependencies [84d03b8]
9
+ - @powersync/service-core@0.0.0-dev-20250214100224
10
+
11
+ ## 0.5.0
12
+
13
+ ### Minor Changes
14
+
15
+ - a4e387c: Added progress logs to initial snapshot
16
+ - d053e84: Added support for MongoDB resume tokens. This should help detect Change Stream error edge cases such as changing the replication connection details after replication has begun.
17
+ - 4b43cdb: Exit replication process when sync rules are not valid; configurable with a new `sync_rules.exit_on_error` option.
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [e26e434]
22
+ - Updated dependencies [4b43cdb]
23
+ - Updated dependencies [9a9e668]
24
+ - @powersync/service-sync-rules@0.23.4
25
+ - @powersync/service-core@0.18.0
26
+ - @powersync/service-types@0.8.0
27
+ - @powersync/lib-services-framework@0.5.1
28
+ - @powersync/lib-service-mongodb@0.4.1
29
+
30
+ ## 0.4.2
31
+
32
+ ### Patch Changes
33
+
34
+ - Updated dependencies [23fb49f]
35
+ - @powersync/service-core@0.17.0
36
+
37
+ ## 0.4.1
38
+
39
+ ### Patch Changes
40
+
41
+ - Updated dependencies [5043a82]
42
+ - @powersync/service-sync-rules@0.23.3
43
+ - @powersync/service-core@0.16.1
44
+
45
+ ## 0.4.0
4
46
 
5
47
  ### Minor Changes
6
48
 
7
- - b07189d: Allow limiting IP ranges of outgoing connections
49
+ - 8675236: Allow limiting IP ranges of outgoing connections
8
50
 
9
51
  ### Patch Changes
10
52
 
11
- - Updated dependencies [b07189d]
12
- - Updated dependencies [b07189d]
13
- - Updated dependencies [b07189d]
14
- - @powersync/service-core@0.0.0-dev-20250117095455
15
- - @powersync/service-types@0.0.0-dev-20250117095455
16
- - @powersync/lib-services-framework@0.0.0-dev-20250117095455
17
- - @powersync/lib-service-mongodb@0.0.0-dev-20250117095455
53
+ - f049aa9: Improved error messages for "Test Connection".
54
+ - f049aa9: Introduce standard error codes
55
+ - Updated dependencies [f049aa9]
56
+ - Updated dependencies [8675236]
57
+ - Updated dependencies [f049aa9]
58
+ - Updated dependencies [8675236]
59
+ - Updated dependencies [8675236]
60
+ - Updated dependencies [f049aa9]
61
+ - @powersync/service-core@0.16.0
62
+ - @powersync/service-sync-rules@0.23.2
63
+ - @powersync/service-types@0.7.1
64
+ - @powersync/lib-services-framework@0.5.0
65
+ - @powersync/lib-service-mongodb@0.4.0
18
66
 
19
67
  ## 0.3.1
20
68
 
@@ -1,5 +1,5 @@
1
1
  import { mongo } from '@powersync/lib-service-mongodb';
2
- import { api, ParseSyncRulesOptions } from '@powersync/service-core';
2
+ import { api, ParseSyncRulesOptions, ReplicationHeadCallback } from '@powersync/service-core';
3
3
  import * as sync_rules from '@powersync/service-sync-rules';
4
4
  import * as service_types from '@powersync/service-types';
5
5
  import * as types from '../types/types.js';
@@ -19,6 +19,7 @@ export declare class MongoRouteAPIAdapter implements api.RouteAPI {
19
19
  getDebugTablesInfo(tablePatterns: sync_rules.TablePattern[], sqlSyncRules: sync_rules.SqlSyncRules): Promise<api.PatternResult[]>;
20
20
  getReplicationLag(options: api.ReplicationLagOptions): Promise<number | undefined>;
21
21
  getReplicationHead(): Promise<string>;
22
+ createReplicationHead<T>(callback: ReplicationHeadCallback<T>): Promise<T>;
22
23
  getConnectionSchema(): Promise<service_types.DatabaseSchema[]>;
23
24
  private getColumnsFromDocuments;
24
25
  private getBsonType;
@@ -8,7 +8,14 @@ import { constructAfterRecord, createCheckpoint } from '../replication/MongoRela
8
8
  import { CHECKPOINTS_COLLECTION } from '../replication/replication-utils.js';
9
9
  import * as types from '../types/types.js';
10
10
  import { escapeRegExp } from '../utils.js';
11
+ import { ServiceAssertionError } from '@powersync/lib-services-framework';
12
+ import { MongoLSN } from '../common/MongoLSN.js';
11
13
  export class MongoRouteAPIAdapter {
14
+ config;
15
+ client;
16
+ db;
17
+ connectionTag;
18
+ defaultSchema;
12
19
  constructor(config) {
13
20
  this.config = config;
14
21
  const manager = new MongoManager(config);
@@ -168,6 +175,38 @@ export class MongoRouteAPIAdapter {
168
175
  async getReplicationHead() {
169
176
  return createCheckpoint(this.client, this.db);
170
177
  }
178
+ async createReplicationHead(callback) {
179
+ const session = this.client.startSession();
180
+ try {
181
+ await this.db.command({ hello: 1 }, { session });
182
+ const head = session.clusterTime?.clusterTime;
183
+ if (head == null) {
184
+ throw new ServiceAssertionError(`clusterTime not available for write checkpoint`);
185
+ }
186
+ const r = await callback(new MongoLSN({ timestamp: head }).comparable);
187
+ // Trigger a change on the changestream.
188
+ await this.db.collection(CHECKPOINTS_COLLECTION).findOneAndUpdate({
189
+ _id: 'checkpoint'
190
+ }, {
191
+ $inc: { i: 1 }
192
+ }, {
193
+ upsert: true,
194
+ returnDocument: 'after',
195
+ session
196
+ });
197
+ const time = session.operationTime;
198
+ if (time == null) {
199
+ throw new ServiceAssertionError(`operationTime not available for write checkpoint`);
200
+ }
201
+ else if (time.lt(head)) {
202
+ throw new ServiceAssertionError(`operationTime must be > clusterTime`);
203
+ }
204
+ return r;
205
+ }
206
+ finally {
207
+ await session.endSession();
208
+ }
209
+ }
171
210
  async getConnectionSchema() {
172
211
  const sampleSize = 50;
173
212
  const databases = await this.db.admin().listDatabases({ nameOnly: true });
@@ -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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"}
@@ -0,0 +1,31 @@
1
+ import { mongo } from '@powersync/lib-service-mongodb';
2
+ export type MongoLSNSpecification = {
3
+ timestamp: mongo.Timestamp;
4
+ /**
5
+ * The ResumeToken type here is an alias for `unknown`.
6
+ * The docs mention the contents should be of the form:
7
+ * ```typescript
8
+ * {
9
+ * "_data" : <BinData|string>
10
+ * }
11
+ * ```
12
+ * We use BSON serialization to store the resume token.
13
+ */
14
+ resume_token?: mongo.ResumeToken;
15
+ };
16
+ export declare const ZERO_LSN = "0000000000000000";
17
+ /**
18
+ * Represent a Logical Sequence Number (LSN) for MongoDB replication sources.
19
+ * This stores a combination of the cluster timestamp and optional Change Stream resume token.
20
+ */
21
+ export declare class MongoLSN {
22
+ protected options: MongoLSNSpecification;
23
+ static fromSerialized(comparable: string): MongoLSN;
24
+ private static deserialize;
25
+ static ZERO: MongoLSN;
26
+ constructor(options: MongoLSNSpecification);
27
+ get timestamp(): mongo.BSON.Timestamp;
28
+ get resumeToken(): unknown;
29
+ get comparable(): string;
30
+ toString(): string;
31
+ }
@@ -0,0 +1,47 @@
1
+ import { mongo } from '@powersync/lib-service-mongodb';
2
+ import { storage } from '@powersync/service-core';
3
+ export const ZERO_LSN = '0000000000000000';
4
+ const DELIMINATOR = '|';
5
+ /**
6
+ * Represent a Logical Sequence Number (LSN) for MongoDB replication sources.
7
+ * This stores a combination of the cluster timestamp and optional Change Stream resume token.
8
+ */
9
+ export class MongoLSN {
10
+ options;
11
+ static fromSerialized(comparable) {
12
+ return new MongoLSN(MongoLSN.deserialize(comparable));
13
+ }
14
+ static deserialize(comparable) {
15
+ const [timestampString, resumeString] = comparable.split(DELIMINATOR);
16
+ const a = parseInt(timestampString.substring(0, 8), 16);
17
+ const b = parseInt(timestampString.substring(8, 16), 16);
18
+ return {
19
+ timestamp: mongo.Timestamp.fromBits(b, a),
20
+ resume_token: resumeString ? storage.deserializeBson(Buffer.from(resumeString, 'base64')).resumeToken : null
21
+ };
22
+ }
23
+ static ZERO = MongoLSN.fromSerialized(ZERO_LSN);
24
+ constructor(options) {
25
+ this.options = options;
26
+ }
27
+ get timestamp() {
28
+ return this.options.timestamp;
29
+ }
30
+ get resumeToken() {
31
+ return this.options.resume_token;
32
+ }
33
+ get comparable() {
34
+ const { timestamp, resumeToken } = this;
35
+ const a = timestamp.high.toString(16).padStart(8, '0');
36
+ const b = timestamp.low.toString(16).padStart(8, '0');
37
+ const segments = [`${a}${b}`];
38
+ if (resumeToken) {
39
+ segments.push(storage.serializeBson({ resumeToken }).toString('base64'));
40
+ }
41
+ return segments.join(DELIMINATOR);
42
+ }
43
+ toString() {
44
+ return this.comparable;
45
+ }
46
+ }
47
+ //# sourceMappingURL=MongoLSN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoLSN.js","sourceRoot":"","sources":["../../src/common/MongoLSN.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAiBlD,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAE3C,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB;;;GAGG;AACH,MAAM,OAAO,QAAQ;IAmBG;IAlBtB,MAAM,CAAC,cAAc,CAAC,UAAkB;QACtC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,UAAkB;QAC3C,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEtE,MAAM,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAEzD,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YACzC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;SAC7G,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEhD,YAAsB,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;IAAG,CAAC;IAExD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACnC,CAAC;IAED,IAAI,UAAU;QACZ,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAExC,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAEtD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE9B,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { api, replication, system, TearDownOptions } from '@powersync/service-core';
1
+ import { api, ConnectionTestResult, replication, system, TearDownOptions } from '@powersync/service-core';
2
2
  import * as types from '../types/types.js';
3
3
  export declare class MongoModule extends replication.ReplicationModule<types.MongoConnectionConfig> {
4
4
  constructor();
@@ -9,5 +9,6 @@ export declare class MongoModule extends replication.ReplicationModule<types.Mon
9
9
  */
10
10
  private resolveConfig;
11
11
  teardown(options: TearDownOptions): Promise<void>;
12
- testConnection(config: types.MongoConnectionConfig): Promise<void>;
12
+ testConnection(config: types.MongoConnectionConfig): Promise<ConnectionTestResult>;
13
+ static testConnection(normalizedConfig: types.NormalizedMongoConnectionConfig): Promise<ConnectionTestResult>;
13
14
  }
@@ -40,23 +40,32 @@ export class MongoModule extends replication.ReplicationModule {
40
40
  };
41
41
  }
42
42
  async teardown(options) {
43
- // TODO: Implement?
43
+ // No-op
44
44
  }
45
45
  async testConnection(config) {
46
46
  this.decodeConfig(config);
47
- const normalisedConfig = this.resolveConfig(this.decodedConfig);
48
- const connectionManager = new MongoManager(normalisedConfig, {
47
+ const normalizedConfig = this.resolveConfig(this.decodedConfig);
48
+ return await MongoModule.testConnection(normalizedConfig);
49
+ }
50
+ static async testConnection(normalizedConfig) {
51
+ const connectionManager = new MongoManager(normalizedConfig, {
49
52
  // Use short timeouts for testing connections.
50
53
  // Must be < 30s, to ensure we get a proper timeout error.
51
- socketTimeoutMS: 5000,
52
- serverSelectionTimeoutMS: 5000
54
+ socketTimeoutMS: 1_000,
55
+ serverSelectionTimeoutMS: 1_000
53
56
  });
54
57
  try {
55
- return await checkSourceConfiguration(connectionManager);
58
+ await checkSourceConfiguration(connectionManager);
59
+ }
60
+ catch (e) {
61
+ throw lib_mongo.mapConnectionError(e);
56
62
  }
57
63
  finally {
58
64
  await connectionManager.end();
59
65
  }
66
+ return {
67
+ connectionDescription: normalizedConfig.uri
68
+ };
60
69
  }
61
70
  }
62
71
  //# sourceMappingURL=MongoModule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MongoModule.js","sourceRoot":"","sources":["../../src/module/MongoModule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAO,kCAAkC,EAAE,WAAW,EAA2B,MAAM,yBAAyB,CAAC;AACxH,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,WAAY,SAAQ,WAAW,CAAC,iBAA8C;IACzF;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS,CAAC,qBAAqB;YACrC,YAAY,EAAE,KAAK,CAAC,qBAAqB;SAC1C,CAAC,CAAC;IACL,CAAC;IAES,qBAAqB;QAC7B,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC,CAAC;IAC3E,CAAC;IAES,gBAAgB,CAAC,OAA8B;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,IAAI,kCAAkC,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAClG,MAAM,iBAAiB,GAAG,IAAI,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAEzE,OAAO,IAAI,sBAAsB,CAAC;YAChC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtD,gBAAgB,EAAE,gBAAgB;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,iBAAiB,EAAE,iBAAiB;YACpC,WAAW,EAAE,IAAI,qBAAqB,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,MAAmC;QACvD,OAAO;YACL,GAAG,MAAM;YACT,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,mBAAmB;IACrB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAmC;QACtD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC;QACjE,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE;YAC3D,8CAA8C;YAC9C,0DAA0D;YAC1D,eAAe,EAAE,IAAK;YACtB,wBAAwB,EAAE,IAAK;SAChC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,OAAO,MAAM,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"MongoModule.js","sourceRoot":"","sources":["../../src/module/MongoModule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAEL,kCAAkC,EAElC,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,WAAY,SAAQ,WAAW,CAAC,iBAA8C;IACzF;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS,CAAC,qBAAqB;YACrC,YAAY,EAAE,KAAK,CAAC,qBAAqB;SAC1C,CAAC,CAAC;IACL,CAAC;IAES,qBAAqB;QAC7B,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC,CAAC;IAC3E,CAAC;IAES,gBAAgB,CAAC,OAA8B;QACvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,IAAI,kCAAkC,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAClG,MAAM,iBAAiB,GAAG,IAAI,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAEzE,OAAO,IAAI,sBAAsB,CAAC;YAChC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtD,gBAAgB,EAAE,gBAAgB;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,iBAAiB,EAAE,iBAAiB;YACpC,WAAW,EAAE,IAAI,qBAAqB,EAAE;SACzC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,MAAmC;QACvD,OAAO;YACL,GAAG,MAAM;YACT,GAAG,KAAK,CAAC,yBAAyB,CAAC,MAAM,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAwB;QACrC,QAAQ;IACV,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAmC;QACtD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC;QACjE,OAAO,MAAM,WAAW,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAuD;QACjF,MAAM,iBAAiB,GAAG,IAAI,YAAY,CAAC,gBAAgB,EAAE;YAC3D,8CAA8C;YAC9C,0DAA0D;YAC1D,eAAe,EAAE,KAAK;YACtB,wBAAwB,EAAE,KAAK;SAChC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC;QACD,OAAO;YACL,qBAAqB,EAAE,gBAAgB,CAAC,GAAG;SAC5C,CAAC;IACJ,CAAC;CACF"}
@@ -1,8 +1,8 @@
1
1
  import { mongo } from '@powersync/lib-service-mongodb';
2
+ import { DatabaseConnectionError } from '@powersync/lib-services-framework';
2
3
  import { SourceEntityDescriptor, SourceTable, storage } from '@powersync/service-core';
3
4
  import { DatabaseInputRow, SqliteRow, SqlSyncRules, TablePattern } from '@powersync/service-sync-rules';
4
5
  import { MongoManager } from './MongoManager.js';
5
- export declare const ZERO_LSN = "0000000000000000";
6
6
  export interface ChangeStreamOptions {
7
7
  connections: MongoManager;
8
8
  storage: storage.SyncRulesBucketStorage;
@@ -19,8 +19,8 @@ interface InitResult {
19
19
  * * Some change stream documents do not have postImages.
20
20
  * * startAfter/resumeToken is not valid anymore.
21
21
  */
22
- export declare class ChangeStreamInvalidatedError extends Error {
23
- constructor(message: string);
22
+ export declare class ChangeStreamInvalidatedError extends DatabaseConnectionError {
23
+ constructor(message: string, cause: any);
24
24
  }
25
25
  export declare class ChangeStream {
26
26
  sync_rules: SqlSyncRules;
@@ -1,11 +1,11 @@
1
1
  import { mongo } from '@powersync/lib-service-mongodb';
2
- import { container, logger } from '@powersync/lib-services-framework';
2
+ import { container, DatabaseConnectionError, ErrorCode, logger, ReplicationAbortedError, ReplicationAssertionError, ServiceError } from '@powersync/lib-services-framework';
3
3
  import { Metrics, SaveOperationTag } from '@powersync/service-core';
4
+ import { MongoLSN } from '../common/MongoLSN.js';
4
5
  import { PostImagesOption } from '../types/types.js';
5
6
  import { escapeRegExp } from '../utils.js';
6
- import { constructAfterRecord, createCheckpoint, getMongoLsn, getMongoRelation, mongoLsnToTimestamp } from './MongoRelation.js';
7
+ import { constructAfterRecord, createCheckpoint, getMongoRelation } from './MongoRelation.js';
7
8
  import { CHECKPOINTS_COLLECTION } from './replication-utils.js';
8
- export const ZERO_LSN = '0000000000000000';
9
9
  /**
10
10
  * Thrown when the change stream is not valid anymore, and replication
11
11
  * must be restarted.
@@ -14,15 +14,22 @@ export const ZERO_LSN = '0000000000000000';
14
14
  * * Some change stream documents do not have postImages.
15
15
  * * startAfter/resumeToken is not valid anymore.
16
16
  */
17
- export class ChangeStreamInvalidatedError extends Error {
18
- constructor(message) {
19
- super(message);
17
+ export class ChangeStreamInvalidatedError extends DatabaseConnectionError {
18
+ constructor(message, cause) {
19
+ super(ErrorCode.PSYNC_S1344, message, cause);
20
20
  }
21
21
  }
22
22
  export class ChangeStream {
23
+ sync_rules;
24
+ group_id;
25
+ connection_id = 1;
26
+ storage;
27
+ connections;
28
+ client;
29
+ defaultDb;
30
+ abort_signal;
31
+ relation_cache = new Map();
23
32
  constructor(options) {
24
- this.connection_id = 1;
25
- this.relation_cache = new Map();
26
33
  this.storage = options.storage;
27
34
  this.group_id = options.storage.group_id;
28
35
  this.connections = options.connections;
@@ -97,7 +104,7 @@ export class ChangeStream {
97
104
  }
98
105
  async estimatedCount(table) {
99
106
  const db = this.client.db(table.schema);
100
- const count = db.collection(table.table).estimatedDocumentCount();
107
+ const count = await db.collection(table.table).estimatedDocumentCount();
101
108
  return `~${count}`;
102
109
  }
103
110
  /**
@@ -117,14 +124,14 @@ export class ChangeStream {
117
124
  const hello = await this.defaultDb.command({ hello: 1 });
118
125
  const snapshotTime = hello.lastWrite?.majorityOpTime?.ts;
119
126
  if (hello.msg == 'isdbgrid') {
120
- throw new Error('Sharded MongoDB Clusters are not supported yet (including MongoDB Serverless instances).');
127
+ throw new ServiceError(ErrorCode.PSYNC_S1341, 'Sharded MongoDB Clusters are not supported yet (including MongoDB Serverless instances).');
121
128
  }
122
129
  else if (hello.setName == null) {
123
- throw new Error('Standalone MongoDB instances are not supported - use a replicaset.');
130
+ throw new ServiceError(ErrorCode.PSYNC_S1342, 'Standalone MongoDB instances are not supported - use a replicaset.');
124
131
  }
125
132
  else if (snapshotTime == null) {
126
133
  // Not known where this would happen apart from the above cases
127
- throw new Error('MongoDB lastWrite timestamp not found.');
134
+ throw new ReplicationAssertionError('MongoDB lastWrite timestamp not found.');
128
135
  }
129
136
  // We previously used {snapshot: true} for the snapshot session.
130
137
  // While it gives nice consistency guarantees, it fails when the
@@ -132,7 +139,7 @@ export class ChangeStream {
132
139
  // expiring the snapshot.
133
140
  const session = await this.client.startSession();
134
141
  try {
135
- await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
142
+ await this.storage.startBatch({ zeroLSN: MongoLSN.ZERO.comparable, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
136
143
  // Start by resolving all tables.
137
144
  // This checks postImage configuration, and that should fail as
138
145
  // earlier as possible.
@@ -143,10 +150,10 @@ export class ChangeStream {
143
150
  }
144
151
  for (let table of allSourceTables) {
145
152
  await this.snapshotTable(batch, table, session);
146
- await batch.markSnapshotDone([table], ZERO_LSN);
153
+ await batch.markSnapshotDone([table], MongoLSN.ZERO.comparable);
147
154
  await touch();
148
155
  }
149
- const lsn = getMongoLsn(snapshotTime);
156
+ const { comparable: lsn } = new MongoLSN({ timestamp: snapshotTime });
150
157
  logger.info(`Snapshot commit at ${snapshotTime.inspect()} / ${lsn}`);
151
158
  await batch.commit(lsn);
152
159
  });
@@ -210,15 +217,15 @@ export class ChangeStream {
210
217
  logger.info(`Replicating ${table.qualifiedName}`);
211
218
  const estimatedCount = await this.estimatedCount(table);
212
219
  let at = 0;
220
+ let lastLogIndex = 0;
213
221
  const db = this.client.db(table.schema);
214
222
  const collection = db.collection(table.table);
215
223
  const query = collection.find({}, { session, readConcern: { level: 'majority' } });
216
224
  const cursor = query.stream();
217
225
  for await (let document of cursor) {
218
226
  if (this.abort_signal.aborted) {
219
- throw new Error(`Aborted initial replication`);
227
+ throw new ReplicationAbortedError(`Aborted initial replication`);
220
228
  }
221
- at += 1;
222
229
  const record = constructAfterRecord(document);
223
230
  // This auto-flushes when the batch reaches its size limit
224
231
  await batch.save({
@@ -230,6 +237,10 @@ export class ChangeStream {
230
237
  afterReplicaId: document._id
231
238
  });
232
239
  at += 1;
240
+ if (at - lastLogIndex >= 5000) {
241
+ logger.info(`[${this.group_id}] Replicating ${table.qualifiedName} ${at}/${estimatedCount}`);
242
+ lastLogIndex = at;
243
+ }
233
244
  Metrics.getInstance().rows_replicated_total.add(1);
234
245
  await touch();
235
246
  }
@@ -269,7 +280,7 @@ export class ChangeStream {
269
280
  logger.info(`Enabled postImages on ${db}.${collectionInfo.name}`);
270
281
  }
271
282
  else if (!enabled) {
272
- throw new Error(`postImages not enabled on ${db}.${collectionInfo.name}`);
283
+ throw new ServiceError(ErrorCode.PSYNC_S1343, `postImages not enabled on ${db}.${collectionInfo.name}`);
273
284
  }
274
285
  }
275
286
  async handleRelation(batch, descriptor, options) {
@@ -282,7 +293,7 @@ export class ChangeStream {
282
293
  }
283
294
  const snapshot = options.snapshot;
284
295
  if (!descriptor.objectId && typeof descriptor.objectId != 'string') {
285
- throw new Error('objectId expected');
296
+ throw new ReplicationAssertionError('MongoDB replication - objectId expected');
286
297
  }
287
298
  const result = await this.storage.resolveTable({
288
299
  group_id: this.group_id,
@@ -355,7 +366,7 @@ export class ChangeStream {
355
366
  });
356
367
  }
357
368
  else {
358
- throw new Error(`Unsupported operation: ${change.operationType}`);
369
+ throw new ReplicationAssertionError(`Unsupported operation: ${change.operationType}`);
359
370
  }
360
371
  }
361
372
  async replicate() {
@@ -385,7 +396,7 @@ export class ChangeStream {
385
396
  if (e instanceof mongo.MongoServerError &&
386
397
  e.codeName == 'NoMatchingDocument' &&
387
398
  e.errmsg?.includes('post-image was not found')) {
388
- throw new ChangeStreamInvalidatedError(e.errmsg);
399
+ throw new ChangeStreamInvalidatedError(e.errmsg, e);
389
400
  }
390
401
  throw e;
391
402
  }
@@ -393,9 +404,11 @@ export class ChangeStream {
393
404
  async streamChangesInternal() {
394
405
  // Auto-activate as soon as initial replication is done
395
406
  await this.storage.autoActivate();
396
- await this.storage.startBatch({ zeroLSN: ZERO_LSN, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
397
- const lastLsn = batch.lastCheckpointLsn;
398
- const startAfter = mongoLsnToTimestamp(lastLsn) ?? undefined;
407
+ await this.storage.startBatch({ zeroLSN: MongoLSN.ZERO.comparable, defaultSchema: this.defaultDb.databaseName, storeCurrentData: false }, async (batch) => {
408
+ const { lastCheckpointLsn } = batch;
409
+ const lastLsn = lastCheckpointLsn ? MongoLSN.fromSerialized(lastCheckpointLsn) : null;
410
+ const startAfter = lastLsn?.timestamp;
411
+ const resumeAfter = lastLsn?.resumeToken;
399
412
  logger.info(`Resume streaming at ${startAfter?.inspect()} / ${lastLsn}`);
400
413
  const filters = this.getSourceNamespaceFilters();
401
414
  const pipeline = [
@@ -415,12 +428,20 @@ export class ChangeStream {
415
428
  fullDocument = 'updateLookup';
416
429
  }
417
430
  const streamOptions = {
418
- startAtOperationTime: startAfter,
419
431
  showExpandedEvents: true,
420
432
  useBigInt64: true,
421
433
  maxAwaitTimeMS: 200,
422
434
  fullDocument: fullDocument
423
435
  };
436
+ /**
437
+ * Only one of these options can be supplied at a time.
438
+ */
439
+ if (resumeAfter) {
440
+ streamOptions.resumeAfter = resumeAfter;
441
+ }
442
+ else {
443
+ streamOptions.startAtOperationTime = startAfter;
444
+ }
424
445
  let stream;
425
446
  if (filters.multipleDatabases) {
426
447
  // Requires readAnyDatabase@admin on Atlas
@@ -438,7 +459,7 @@ export class ChangeStream {
438
459
  stream.close();
439
460
  });
440
461
  // Always start with a checkpoint.
441
- // This helps us to clear erorrs when restarting, even if there is
462
+ // This helps us to clear errors when restarting, even if there is
442
463
  // no data to replicate.
443
464
  let waitForCheckpointLsn = await createCheckpoint(this.client, this.defaultDb);
444
465
  let splitDocument = null;
@@ -447,6 +468,10 @@ export class ChangeStream {
447
468
  break;
448
469
  }
449
470
  const originalChangeDocument = await stream.tryNext();
471
+ // The stream was closed, we will only ever receive `null` from it
472
+ if (!originalChangeDocument && stream.closed) {
473
+ break;
474
+ }
450
475
  if (originalChangeDocument == null || this.abort_signal.aborted) {
451
476
  continue;
452
477
  }
@@ -477,14 +502,33 @@ export class ChangeStream {
477
502
  }
478
503
  else if (splitDocument != null) {
479
504
  // We were waiting for fragments, but got a different event
480
- throw new Error(`Incomplete splitEvent: ${JSON.stringify(splitDocument.splitEvent)}`);
505
+ throw new ReplicationAssertionError(`Incomplete splitEvent: ${JSON.stringify(splitDocument.splitEvent)}`);
481
506
  }
482
- // console.log('event', changeDocument);
483
507
  if ((changeDocument.operationType == 'insert' ||
484
508
  changeDocument.operationType == 'update' ||
485
- changeDocument.operationType == 'replace') &&
509
+ changeDocument.operationType == 'replace' ||
510
+ changeDocument.operationType == 'drop') &&
486
511
  changeDocument.ns.coll == CHECKPOINTS_COLLECTION) {
487
- const lsn = getMongoLsn(changeDocument.clusterTime);
512
+ /**
513
+ * Dropping the database does not provide an `invalidate` event.
514
+ * We typically would receive `drop` events for the collection which we
515
+ * would process below.
516
+ *
517
+ * However we don't commit the LSN after collections are dropped.
518
+ * The prevents the `startAfter` or `resumeToken` from advancing past the drop events.
519
+ * The stream also closes after the drop events.
520
+ * This causes an infinite loop of processing the collection drop events.
521
+ *
522
+ * This check here invalidates the change stream if our `_checkpoints` collection
523
+ * is dropped. This allows for detecting when the DB is dropped.
524
+ */
525
+ if (changeDocument.operationType == 'drop') {
526
+ throw new ChangeStreamInvalidatedError('Internal collections have been dropped', new Error('_checkpoints collection was dropped'));
527
+ }
528
+ const { comparable: lsn } = new MongoLSN({
529
+ timestamp: changeDocument.clusterTime,
530
+ resume_token: changeDocument._id
531
+ });
488
532
  if (waitForCheckpointLsn != null && lsn >= waitForCheckpointLsn) {
489
533
  waitForCheckpointLsn = null;
490
534
  }