@powersync/service-module-mongodb 0.0.0-dev-20260602073133 → 0.0.0-dev-20260909133214
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +153 -5
- package/dist/api/MongoRouteAPIAdapter.d.ts +4 -2
- package/dist/api/MongoRouteAPIAdapter.js +23 -32
- package/dist/api/MongoRouteAPIAdapter.js.map +1 -1
- package/dist/common/SentinelLSN.d.ts +37 -0
- package/dist/common/SentinelLSN.js +59 -0
- package/dist/common/SentinelLSN.js.map +1 -0
- package/dist/module/MongoModule.js +2 -1
- package/dist/module/MongoModule.js.map +1 -1
- package/dist/replication/ChangeStream.d.ts +24 -0
- package/dist/replication/ChangeStream.js +203 -67
- package/dist/replication/ChangeStream.js.map +1 -1
- package/dist/replication/ChangeStreamReplicationJob.js +3 -2
- package/dist/replication/ChangeStreamReplicationJob.js.map +1 -1
- package/dist/replication/ChangeStreamReplicator.js +1 -1
- package/dist/replication/ChangeStreamReplicator.js.map +1 -1
- package/dist/replication/MongoRelation.d.ts +36 -1
- package/dist/replication/MongoRelation.js +133 -18
- package/dist/replication/MongoRelation.js.map +1 -1
- package/dist/replication/MongoSnapshotter.d.ts +9 -1
- package/dist/replication/MongoSnapshotter.js +129 -67
- package/dist/replication/MongoSnapshotter.js.map +1 -1
- package/dist/replication/RawChangeStream.d.ts +4 -1
- package/dist/replication/RawChangeStream.js +6 -10
- package/dist/replication/RawChangeStream.js.map +1 -1
- package/dist/replication/checkpoints/CheckpointImplementation.d.ts +135 -0
- package/dist/replication/checkpoints/CheckpointImplementation.js +22 -0
- package/dist/replication/checkpoints/CheckpointImplementation.js.map +1 -0
- package/dist/replication/checkpoints/SentinelCheckpointImplementation.d.ts +58 -0
- package/dist/replication/checkpoints/SentinelCheckpointImplementation.js +224 -0
- package/dist/replication/checkpoints/SentinelCheckpointImplementation.js.map +1 -0
- package/dist/replication/checkpoints/TimestampCheckpointImplementation.d.ts +27 -0
- package/dist/replication/checkpoints/TimestampCheckpointImplementation.js +116 -0
- package/dist/replication/checkpoints/TimestampCheckpointImplementation.js.map +1 -0
- package/dist/replication/checkpoints/create-checkpoint-implementation.d.ts +6 -0
- package/dist/replication/checkpoints/create-checkpoint-implementation.js +10 -0
- package/dist/replication/checkpoints/create-checkpoint-implementation.js.map +1 -0
- package/dist/replication/replication-utils.d.ts +6 -0
- package/dist/replication/replication-utils.js +19 -2
- package/dist/replication/replication-utils.js.map +1 -1
- package/dist/types/types.d.ts +7 -2
- package/dist/types/types.js +20 -2
- package/dist/types/types.js.map +1 -1
- package/package.json +11 -21
- package/src/api/MongoRouteAPIAdapter.ts +28 -39
- package/src/common/SentinelLSN.ts +78 -0
- package/src/module/MongoModule.ts +2 -1
- package/src/replication/ChangeStream.ts +223 -78
- package/src/replication/ChangeStreamReplicationJob.ts +3 -2
- package/src/replication/ChangeStreamReplicator.ts +1 -1
- package/src/replication/MongoRelation.ts +153 -21
- package/src/replication/MongoSnapshotter.ts +148 -73
- package/src/replication/RawChangeStream.ts +27 -32
- package/src/replication/checkpoints/CheckpointImplementation.ts +167 -0
- package/src/replication/checkpoints/SentinelCheckpointImplementation.ts +269 -0
- package/src/replication/checkpoints/TimestampCheckpointImplementation.ts +145 -0
- package/src/replication/checkpoints/create-checkpoint-implementation.ts +14 -0
- package/src/replication/replication-utils.ts +23 -2
- package/src/types/types.ts +27 -2
- package/test/DOCUMENTDB_TESTING.md +115 -0
- package/test/src/DatabaseType.ts +25 -0
- package/test/src/change_stream.test.ts +180 -71
- package/test/src/change_stream_utils.ts +117 -29
- package/test/src/checkpoint_retry.test.ts +134 -0
- package/test/src/config.test.ts +34 -0
- package/test/src/documentdb_helpers.test.ts +124 -0
- package/test/src/documentdb_mode.test.ts +1039 -0
- package/test/src/mongo_test.test.ts +15 -5
- package/test/src/raw_change_stream.test.ts +147 -126
- package/test/src/resume.test.ts +2 -2
- package/test/src/resume_token.test.ts +30 -0
- package/test/src/slow_tests.test.ts +4 -1
- package/test/src/test-timeouts.ts +23 -0
- package/test/src/util.ts +14 -32
- package/tsconfig.json +1 -4
- package/tsconfig.scripts.json +1 -2
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeStreamReplicationJob.js","sourceRoot":"","sources":["../../src/replication/ChangeStreamReplicationJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAO/E,MAAM,OAAO,0BAA2B,SAAQ,WAAW,CAAC,sBAAsB;IACxE,iBAAiB,CAA2B;IAC5C,UAAU,GAAwB,IAAI,CAAC;IAE/C,YAAY,OAA0C;QACpD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,kDAAkD;QAClD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,sBAAsB;IACxB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,
|
|
1
|
+
{"version":3,"file":"ChangeStreamReplicationJob.js","sourceRoot":"","sources":["../../src/replication/ChangeStreamReplicationJob.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export class ChangeStreamReplicator extends replication.AbstractReplicator {
|
|
|
9
9
|
}
|
|
10
10
|
createJob(options) {
|
|
11
11
|
return new ChangeStreamReplicationJob({
|
|
12
|
-
id: this.createJobId(options.storage.
|
|
12
|
+
id: this.createJobId(options.storage.replicationStreamId),
|
|
13
13
|
storage: options.storage,
|
|
14
14
|
metrics: this.metrics,
|
|
15
15
|
connectionFactory: this.connectionFactory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeStreamReplicator.js","sourceRoot":"","sources":["../../src/replication/ChangeStreamReplicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAW,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAO7E,MAAM,OAAO,sBAAuB,SAAQ,WAAW,CAAC,kBAA8C;IACnF,iBAAiB,CAA2B;IAE7D,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED,SAAS,CAAC,OAAqC;QAC7C,OAAO,IAAI,0BAA0B,CAAC;YACpC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"ChangeStreamReplicator.js","sourceRoot":"","sources":["../../src/replication/ChangeStreamReplicator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAW,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAO7E,MAAM,OAAO,sBAAuB,SAAQ,WAAW,CAAC,kBAA8C;IACnF,iBAAiB,CAA2B;IAE7D,YAAY,OAAsC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACrD,CAAC;IAED,SAAS,CAAC,OAAqC;QAC7C,OAAO,IAAI,0BAA0B,CAAC;YACpC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;YACzD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,gBAAgD;QAC5D,4BAA4B;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,MAAM,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;IACrF,CAAC;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { mongo } from '@powersync/lib-service-mongodb';
|
|
2
2
|
import { storage } from '@powersync/service-core';
|
|
3
3
|
import { SqliteInputRow, SqliteInputValue } from '@powersync/service-sync-rules';
|
|
4
|
+
import { ObjectId } from 'bson';
|
|
4
5
|
export declare function getMongoRelation(source: mongo.ChangeStreamNameSpace, connectionTag: string): storage.SourceEntityDescriptor;
|
|
5
6
|
/**
|
|
6
7
|
* For in-memory cache only.
|
|
@@ -15,4 +16,38 @@ export declare function toMongoSyncRulesValue(data: any): SqliteInputValue;
|
|
|
15
16
|
* the checkpoint immediately, and not wait for batching.
|
|
16
17
|
*/
|
|
17
18
|
export declare const STANDALONE_CHECKPOINT_ID = "_standalone_checkpoint";
|
|
18
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Id for checkpoint records managed by the {@link SentinelCheckpointImplementation} implementation.
|
|
21
|
+
*/
|
|
22
|
+
export declare const SENTINEL_CHECKPOINT_ID = "_sentinel_checkpoint";
|
|
23
|
+
/**
|
|
24
|
+
* Create a checkpoint by upserting a document in _powersync_checkpoints, and
|
|
25
|
+
* return a comparable LSN string derived from the write's operationTime.
|
|
26
|
+
*
|
|
27
|
+
* Standard MongoDB only: this requires session.operationTime, which DocumentDB
|
|
28
|
+
* does not provide (it throws PSYNC_S1004 when it is missing). The DocumentDB /
|
|
29
|
+
* sentinel path builds LSNs via {@link createSentinelCheckpointLsn} instead.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createCheckpoint(db: mongo.Db, id: mongo.ObjectId | string): Promise<string>;
|
|
32
|
+
/**
|
|
33
|
+
* Create a DocumentDB comparable LSN by advancing the shared sentinel checkpoint
|
|
34
|
+
* document ({@link SENTINEL_CHECKPOINT_ID}). The returned LSN encodes the
|
|
35
|
+
* checkpoint counter in the same 16-hex shape as a MongoDB timestamp LSN (see
|
|
36
|
+
* {@link SentinelLSN}), so the two formats are directly comparable. The counter is
|
|
37
|
+
* seeded in the epoch-seconds range (see below), so a sentinel LSN always sorts
|
|
38
|
+
* above any real-timestamp LSN issued in the past.
|
|
39
|
+
*
|
|
40
|
+
* This counter is intentionally global to the source database. It is used for
|
|
41
|
+
* storage/client checkpoint comparisons and write checkpoint heads, so it must
|
|
42
|
+
* not reset when a new ChangeStream instance or new sync rules start.
|
|
43
|
+
*
|
|
44
|
+
* The document is a single shared record whose `stream_id` field alternates:
|
|
45
|
+
* batch/keepalive bumps stamp it with the calling stream's id (so a stream can
|
|
46
|
+
* recognise its own private barriers), while standalone bumps (write checkpoint
|
|
47
|
+
* heads, snapshot markers) clear it to null. `i` advances globally regardless.
|
|
48
|
+
*
|
|
49
|
+
* @param changeStreamId
|
|
50
|
+
* When provided, the bump is attributed to this stream (a private barrier).
|
|
51
|
+
* When omitted, it is a standalone bump and stream_id is cleared to null.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createSentinelCheckpointLsn(client: mongo.MongoClient, db: mongo.Db, changeStreamId?: ObjectId): Promise<string>;
|
|
@@ -2,9 +2,9 @@ import { mongo } from '@powersync/lib-service-mongodb';
|
|
|
2
2
|
import { storage } from '@powersync/service-core';
|
|
3
3
|
import { JsonContainer } from '@powersync/service-jsonbig';
|
|
4
4
|
import { CustomArray, CustomObject, CustomSqliteValue, DateTimeValue, TimeValuePrecision } from '@powersync/service-sync-rules';
|
|
5
|
-
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
5
|
+
import { ErrorCode, logger, ServiceAssertionError, ServiceError } from '@powersync/lib-services-framework';
|
|
6
6
|
import { MongoLSN } from '../common/MongoLSN.js';
|
|
7
|
-
import {
|
|
7
|
+
import { SentinelLSN } from '../common/SentinelLSN.js';
|
|
8
8
|
export function getMongoRelation(source, connectionTag) {
|
|
9
9
|
return {
|
|
10
10
|
connectionTag,
|
|
@@ -192,24 +192,139 @@ function filterJsonData(data, context, depth = 0) {
|
|
|
192
192
|
* the checkpoint immediately, and not wait for batching.
|
|
193
193
|
*/
|
|
194
194
|
export const STANDALONE_CHECKPOINT_ID = '_standalone_checkpoint';
|
|
195
|
-
|
|
195
|
+
/**
|
|
196
|
+
* Id for checkpoint records managed by the {@link SentinelCheckpointImplementation} implementation.
|
|
197
|
+
*/
|
|
198
|
+
export const SENTINEL_CHECKPOINT_ID = '_sentinel_checkpoint';
|
|
199
|
+
/**
|
|
200
|
+
* Create a checkpoint by upserting a document in _powersync_checkpoints, and
|
|
201
|
+
* return a comparable LSN string derived from the write's operationTime.
|
|
202
|
+
*
|
|
203
|
+
* Standard MongoDB only: this requires session.operationTime, which DocumentDB
|
|
204
|
+
* does not provide (it throws PSYNC_S1004 when it is missing). The DocumentDB /
|
|
205
|
+
* sentinel path builds LSNs via {@link createSentinelCheckpointLsn} instead.
|
|
206
|
+
*/
|
|
207
|
+
export async function createCheckpoint(db, id) {
|
|
208
|
+
const TRIES = 2;
|
|
209
|
+
for (let i = 0; i < TRIES; i++) {
|
|
210
|
+
try {
|
|
211
|
+
return await createCheckpointInner(db, id);
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
if (i < TRIES - 1) {
|
|
215
|
+
logger.warn(`Failed to create checkpoint on attempt ${i + 1}`, e);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
throw e;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
throw new ServiceAssertionError(`Unreachable code`);
|
|
223
|
+
}
|
|
224
|
+
async function createCheckpointInner(db, id) {
|
|
225
|
+
// We use an unique id per process, and clear documents on startup.
|
|
226
|
+
// This is so that we can filter events for our own process only, and ignore
|
|
227
|
+
// events from other processes.
|
|
228
|
+
// We use a command instead of a regular update to avoid auto retries on writes.
|
|
229
|
+
// An auto retry on the write can trigger a weird edge case where the change stream event
|
|
230
|
+
// has the clusterTime of the first write, while the returned operation time is for the second no-op write.
|
|
231
|
+
// Instead, we do manual retries, which does not have the same write de-duplication logic.
|
|
232
|
+
// A sentinal-based approach would be better here, but that is a much bigger change.
|
|
233
|
+
const update = { $inc: { i: 1 } };
|
|
234
|
+
const response = await db.command({
|
|
235
|
+
findAndModify: '_powersync_checkpoints',
|
|
236
|
+
query: {
|
|
237
|
+
_id: id
|
|
238
|
+
},
|
|
239
|
+
new: true,
|
|
240
|
+
upsert: true,
|
|
241
|
+
update
|
|
242
|
+
});
|
|
243
|
+
const time = response.operationTime;
|
|
244
|
+
if (time == null) {
|
|
245
|
+
throw new ServiceError(ErrorCode.PSYNC_S1004, `clusterTime not available for checkpoint`);
|
|
246
|
+
}
|
|
247
|
+
return new MongoLSN({ timestamp: time }).comparable;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Create a DocumentDB comparable LSN by advancing the shared sentinel checkpoint
|
|
251
|
+
* document ({@link SENTINEL_CHECKPOINT_ID}). The returned LSN encodes the
|
|
252
|
+
* checkpoint counter in the same 16-hex shape as a MongoDB timestamp LSN (see
|
|
253
|
+
* {@link SentinelLSN}), so the two formats are directly comparable. The counter is
|
|
254
|
+
* seeded in the epoch-seconds range (see below), so a sentinel LSN always sorts
|
|
255
|
+
* above any real-timestamp LSN issued in the past.
|
|
256
|
+
*
|
|
257
|
+
* This counter is intentionally global to the source database. It is used for
|
|
258
|
+
* storage/client checkpoint comparisons and write checkpoint heads, so it must
|
|
259
|
+
* not reset when a new ChangeStream instance or new sync rules start.
|
|
260
|
+
*
|
|
261
|
+
* The document is a single shared record whose `stream_id` field alternates:
|
|
262
|
+
* batch/keepalive bumps stamp it with the calling stream's id (so a stream can
|
|
263
|
+
* recognise its own private barriers), while standalone bumps (write checkpoint
|
|
264
|
+
* heads, snapshot markers) clear it to null. `i` advances globally regardless.
|
|
265
|
+
*
|
|
266
|
+
* @param changeStreamId
|
|
267
|
+
* When provided, the bump is attributed to this stream (a private barrier).
|
|
268
|
+
* When omitted, it is a standalone bump and stream_id is cleared to null.
|
|
269
|
+
*/
|
|
270
|
+
export async function createSentinelCheckpointLsn(client, db, changeStreamId) {
|
|
196
271
|
const session = client.startSession();
|
|
197
272
|
try {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
273
|
+
const collection = db.collection('_powersync_checkpoints');
|
|
274
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
275
|
+
// Common path: increment the existing counter.
|
|
276
|
+
const result = await collection.findOneAndUpdate({
|
|
277
|
+
_id: SENTINEL_CHECKPOINT_ID,
|
|
278
|
+
i: { $exists: true }
|
|
279
|
+
}, {
|
|
280
|
+
$inc: { i: 1 },
|
|
281
|
+
// Standalone bumps (no changeStreamId) must explicitly clear the
|
|
282
|
+
// stream_id left by a previous batch bump — this is a single shared
|
|
283
|
+
// document whose stream_id alternates. Write null rather than relying
|
|
284
|
+
// on `undefined` being serialized (which depends on the driver's
|
|
285
|
+
// ignoreUndefined option, and collapses to an empty $set if enabled).
|
|
286
|
+
$set: {
|
|
287
|
+
stream_id: changeStreamId ?? null
|
|
288
|
+
}
|
|
289
|
+
}, {
|
|
290
|
+
returnDocument: 'after',
|
|
291
|
+
session
|
|
292
|
+
});
|
|
293
|
+
if (result != null) {
|
|
294
|
+
// `i` is a bigint: the client is configured with useBigInt64, and the
|
|
295
|
+
// seed exceeds 2^53 so it could not be safely represented as a number.
|
|
296
|
+
return new SentinelLSN({ sentinel: result.i }).comparable;
|
|
297
|
+
}
|
|
298
|
+
// The counter document does not exist: first run, or a consumer deleted
|
|
299
|
+
// it in their source database. Seed the counter in the epoch-SECONDS range
|
|
300
|
+
// (seconds in the high 32 bits, mirroring a MongoDB timestamp) rather than
|
|
301
|
+
// starting at 1. Two properties follow:
|
|
302
|
+
//
|
|
303
|
+
// - A sentinel LSN sorts above any real-timestamp LSN issued in the past,
|
|
304
|
+
// because its high 32 bits are the current epoch seconds.
|
|
305
|
+
// - A re-created counter jumps forward instead of backward across deletion:
|
|
306
|
+
// the seed advances by 2^32 each wall-clock second, while checkpoints add
|
|
307
|
+
// 1 each, so any later re-seed exceeds the previously issued coordinate
|
|
308
|
+
// (keeping the LSN domain monotonic; otherwise new write checkpoint heads
|
|
309
|
+
// could resolve against old, higher committed LSNs).
|
|
310
|
+
//
|
|
311
|
+
// $setOnInsert cannot be combined with $inc on the same field, so this
|
|
312
|
+
// is a separate upsert; the loop then retries the increment. The
|
|
313
|
+
// $setOnInsert is a no-op if another process created the document
|
|
314
|
+
// concurrently.
|
|
315
|
+
await collection.updateOne({
|
|
316
|
+
_id: SENTINEL_CHECKPOINT_ID
|
|
317
|
+
}, {
|
|
318
|
+
$setOnInsert: {
|
|
319
|
+
i: BigInt(Math.floor(Date.now() / 1000)) << 32n,
|
|
320
|
+
stream_id: changeStreamId ?? null
|
|
321
|
+
}
|
|
322
|
+
}, {
|
|
323
|
+
upsert: true,
|
|
324
|
+
session
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
throw new ServiceError(ErrorCode.PSYNC_S1301, `Failed to increment the sentinel checkpoint counter - the checkpoint document may be getting deleted concurrently.`);
|
|
213
328
|
}
|
|
214
329
|
finally {
|
|
215
330
|
await session.endSession();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoRelation.js","sourceRoot":"","sources":["../../src/replication/MongoRelation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAEL,WAAW,EACX,YAAY,EACZ,iBAAiB,EAEjB,aAAa,EAGb,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"MongoRelation.js","sourceRoot":"","sources":["../../src/replication/MongoRelation.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,12 +41,20 @@ export declare class MongoSnapshotter {
|
|
|
41
41
|
private readonly queue;
|
|
42
42
|
private initialSnapshotDone;
|
|
43
43
|
private nextItemQueued;
|
|
44
|
-
private lastSnapshotOpId;
|
|
45
44
|
private lastTouchedAt;
|
|
45
|
+
private isDocumentDb;
|
|
46
|
+
private _checkpointImplementation;
|
|
46
47
|
constructor(options: MongoSnapshotterOptions);
|
|
47
48
|
private get usePostImages();
|
|
48
49
|
private get configurePostImages();
|
|
49
50
|
get supportsConcurrentSnapshots(): boolean;
|
|
51
|
+
/** The active checkpoint strategy. Only valid after ensureDetected(). */
|
|
52
|
+
private get checkpointImplementation();
|
|
53
|
+
/**
|
|
54
|
+
* Detect DocumentDB and select the checkpoint implementation. Idempotent.
|
|
55
|
+
* Also validates server topology (sharded/standalone) for standard MongoDB.
|
|
56
|
+
*/
|
|
57
|
+
private ensureDetected;
|
|
50
58
|
checkSlot(): Promise<InitResult>;
|
|
51
59
|
setupCheckpointsCollection(): Promise<void>;
|
|
52
60
|
queueSnapshotTables(snapshotLsn: string | null): Promise<void>;
|