@powersync/service-module-mongodb 0.0.0-dev-20260909133214 → 0.0.0-dev-20260929095716
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 +38 -6
- package/ci/test-connection.yaml +12 -0
- package/dist/api/MongoRouteAPIAdapter.d.ts +2 -2
- package/dist/api/MongoRouteAPIAdapter.js +73 -143
- package/dist/api/MongoRouteAPIAdapter.js.map +1 -1
- package/dist/api/infer-collection-schema.d.ts +12 -0
- package/dist/api/infer-collection-schema.js +142 -0
- package/dist/api/infer-collection-schema.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/module/MongoModule.d.ts +1 -2
- package/dist/module/MongoModule.js +0 -1
- package/dist/module/MongoModule.js.map +1 -1
- package/dist/replication/ChangeStream.d.ts +10 -2
- package/dist/replication/ChangeStream.js +228 -317
- package/dist/replication/ChangeStream.js.map +1 -1
- package/dist/replication/ChangeStreamReplicationJob.d.ts +4 -1
- package/dist/replication/ChangeStreamReplicationJob.js +4 -1
- package/dist/replication/ChangeStreamReplicationJob.js.map +1 -1
- package/dist/replication/ChangeStreamReplicator.d.ts +3 -0
- package/dist/replication/ChangeStreamReplicator.js +3 -0
- package/dist/replication/ChangeStreamReplicator.js.map +1 -1
- package/dist/replication/MongoRelation.js +5 -2
- package/dist/replication/MongoRelation.js.map +1 -1
- package/dist/replication/MongoReplicationQueryProvider.d.ts +87 -0
- package/dist/replication/MongoReplicationQueryProvider.js +23 -0
- package/dist/replication/MongoReplicationQueryProvider.js.map +1 -0
- package/dist/replication/MongoReplicationStream.d.ts +85 -0
- package/dist/replication/MongoReplicationStream.js +101 -0
- package/dist/replication/MongoReplicationStream.js.map +1 -0
- package/dist/replication/MongoSnapshotQuery.d.ts +2 -0
- package/dist/replication/MongoSnapshotQuery.js +12 -2
- package/dist/replication/MongoSnapshotQuery.js.map +1 -1
- package/dist/replication/MongoSnapshotter.d.ts +7 -2
- package/dist/replication/MongoSnapshotter.js +58 -85
- package/dist/replication/MongoSnapshotter.js.map +1 -1
- package/dist/replication/RawChangeStream.d.ts +1 -1
- package/dist/replication/RawChangeStream.js +1 -1
- package/dist/replication/RawChangeStream.js.map +1 -1
- package/dist/replication/SourceRowConverter.d.ts +1 -0
- package/dist/replication/SourceRowConverter.js +4 -2
- package/dist/replication/SourceRowConverter.js.map +1 -1
- package/dist/replication/bufferToSqlite.d.ts +3 -1
- package/dist/replication/bufferToSqlite.js +35 -23
- package/dist/replication/bufferToSqlite.js.map +1 -1
- package/dist/replication/replication-index.d.ts +6 -0
- package/dist/replication/replication-index.js +6 -0
- package/dist/replication/replication-index.js.map +1 -1
- package/dist/test-utils/ChangeStreamTestContext.d.ts +131 -0
- package/dist/test-utils/ChangeStreamTestContext.js +391 -0
- package/dist/test-utils/ChangeStreamTestContext.js.map +1 -0
- package/dist/test-utils/test-utils-index.d.ts +1 -0
- package/dist/test-utils/test-utils-index.js +2 -0
- package/dist/test-utils/test-utils-index.js.map +1 -0
- package/package.json +8 -8
- package/src/api/MongoRouteAPIAdapter.ts +79 -127
- package/src/api/infer-collection-schema.ts +153 -0
- package/src/index.ts +1 -0
- package/src/module/MongoModule.ts +1 -3
- package/src/replication/ChangeStream.ts +253 -359
- package/src/replication/ChangeStreamReplicationJob.ts +7 -2
- package/src/replication/ChangeStreamReplicator.ts +5 -0
- package/src/replication/MongoRelation.ts +8 -1
- package/src/replication/MongoReplicationQueryProvider.ts +108 -0
- package/src/replication/MongoReplicationStream.ts +201 -0
- package/src/replication/MongoSnapshotQuery.ts +19 -3
- package/src/replication/MongoSnapshotter.ts +70 -92
- package/src/replication/RawChangeStream.ts +2 -2
- package/src/replication/SourceRowConverter.ts +4 -2
- package/src/replication/bufferToSqlite.ts +43 -23
- package/src/replication/replication-index.ts +6 -0
- package/src/test-utils/ChangeStreamTestContext.ts +520 -0
- package/src/test-utils/test-utils-index.ts +1 -0
- package/test/src/buffer_to_sqlite.test.ts +9 -0
- package/test/src/change_stream.test.ts +3 -3
- package/test/src/change_stream_test_setup.ts +38 -0
- package/test/src/chunked_snapshot.test.ts +3 -3
- package/test/src/documentdb_mode.test.ts +3 -3
- package/test/src/replication_stream.test.ts +311 -0
- package/test/src/resume.test.ts +10 -4
- package/test/src/resuming_snapshots.test.ts +3 -3
- package/test/src/schema.test.ts +223 -0
- package/test/src/slow_tests.test.ts +3 -3
- package/test/src/snapshot_query_provider.test.ts +95 -0
- package/test/src/stream_progress.test.ts +312 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/test/src/change_stream_utils.ts +0 -375
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { ReplicationAbortedError } from '@powersync/lib-services-framework';
|
|
2
|
+
import { createCoreReplicationMetrics, initializeCoreReplicationMetrics, isBatchEnd, LEGACY_STORAGE_VERSION, settledPromise, unsettledPromise, updateSyncRulesFromConfig } from '@powersync/service-core';
|
|
3
|
+
import { setTimeout } from 'node:timers/promises';
|
|
4
|
+
import { SentinelLSN } from '../common/SentinelLSN.js';
|
|
5
|
+
import { ChangeStream } from '../replication/ChangeStream.js';
|
|
6
|
+
import { MongoManager } from '../replication/MongoManager.js';
|
|
7
|
+
import { createCheckpoint, createSentinelCheckpointLsn, STANDALONE_CHECKPOINT_ID } from '../replication/MongoRelation.js';
|
|
8
|
+
import { detectDocumentDb } from '../replication/replication-utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Owns source/storage connections and real replication. Callers supply their environment and storage implementation.
|
|
11
|
+
*/
|
|
12
|
+
export class ChangeStreamTestContext {
|
|
13
|
+
_walStream;
|
|
14
|
+
abortController = new AbortController();
|
|
15
|
+
settledReplicationPromise;
|
|
16
|
+
syncRulesContent;
|
|
17
|
+
replicationLeases = new Map();
|
|
18
|
+
storage;
|
|
19
|
+
/**
|
|
20
|
+
* Open a fresh fixture by default; use doNotClear to resume its persisted source and storage state.
|
|
21
|
+
*/
|
|
22
|
+
static async open(options) {
|
|
23
|
+
return this.openWith({ options, createContext: (resources) => new ChangeStreamTestContext(resources) });
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Share resource setup and failure cleanup with subclasses that supply their own context and defaults.
|
|
27
|
+
*/
|
|
28
|
+
static async openWith({ options, createContext }) {
|
|
29
|
+
const factory = await options.factory({ doNotClear: options.doNotClear });
|
|
30
|
+
try {
|
|
31
|
+
const connectionManager = new MongoManager(options.connectionOptions);
|
|
32
|
+
try {
|
|
33
|
+
if (!options.doNotClear) {
|
|
34
|
+
await connectionManager.db.dropDatabase();
|
|
35
|
+
}
|
|
36
|
+
const documentDbMode = options.documentDbMode ?? (await detectDocumentDb(connectionManager.db));
|
|
37
|
+
// Await subclass setup so failures still close the shared connections below.
|
|
38
|
+
return await createContext({ ...options, factory, connectionManager, documentDbMode });
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
await connectionManager.end();
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
await factory[Symbol.asyncDispose]();
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
factory;
|
|
51
|
+
connectionManager;
|
|
52
|
+
metrics;
|
|
53
|
+
streamOptions;
|
|
54
|
+
storageVersion;
|
|
55
|
+
documentDbMode;
|
|
56
|
+
/**
|
|
57
|
+
* Takes ownership of an already configured storage factory and source connection.
|
|
58
|
+
*/
|
|
59
|
+
constructor({ factory, connectionManager, metrics, streamOptions = {}, storageVersion = LEGACY_STORAGE_VERSION, documentDbMode = false }) {
|
|
60
|
+
this.factory = factory;
|
|
61
|
+
this.connectionManager = connectionManager;
|
|
62
|
+
this.metrics = metrics;
|
|
63
|
+
this.streamOptions = streamOptions;
|
|
64
|
+
this.storageVersion = storageVersion;
|
|
65
|
+
this.documentDbMode = documentDbMode;
|
|
66
|
+
createCoreReplicationMetrics(metrics);
|
|
67
|
+
initializeCoreReplicationMetrics(metrics);
|
|
68
|
+
const unregister = factory.registerListener({
|
|
69
|
+
beforeDispose: async () => {
|
|
70
|
+
unregister();
|
|
71
|
+
try {
|
|
72
|
+
for (const lease of this.replicationLeases.values()) {
|
|
73
|
+
await (await lease).release();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
this.replicationLeases.clear();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Abort snapshot and/or replication, without actively closing connections.
|
|
84
|
+
*/
|
|
85
|
+
abort(cause) {
|
|
86
|
+
this.abortController.abort(cause);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Drain replication before inspecting its final persisted state or closing connections.
|
|
90
|
+
*/
|
|
91
|
+
async stop(cause) {
|
|
92
|
+
this.abort(cause);
|
|
93
|
+
await this.settledReplicationPromise;
|
|
94
|
+
}
|
|
95
|
+
async dispose() {
|
|
96
|
+
await this.stop(new Error('Disposing test context'));
|
|
97
|
+
try {
|
|
98
|
+
await this.factory[Symbol.asyncDispose]();
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
await this.connectionManager.end();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async [Symbol.asyncDispose]() {
|
|
105
|
+
await this.dispose();
|
|
106
|
+
}
|
|
107
|
+
get client() {
|
|
108
|
+
return this.connectionManager.client;
|
|
109
|
+
}
|
|
110
|
+
get db() {
|
|
111
|
+
return this.connectionManager.db;
|
|
112
|
+
}
|
|
113
|
+
get connectionTag() {
|
|
114
|
+
return this.connectionManager.connectionTag;
|
|
115
|
+
}
|
|
116
|
+
async updateSyncRules(content) {
|
|
117
|
+
const replicationStream = await this.factory.updateSyncRules(
|
|
118
|
+
// Deployment and resume must use the same parser, including caller-registered extensions.
|
|
119
|
+
updateSyncRulesFromConfig(this.factory.syncConfigParser.parseContent(content, {
|
|
120
|
+
defaultSchema: this.db.databaseName,
|
|
121
|
+
throwOnError: true
|
|
122
|
+
}), { storageVersion: this.storageVersion, defaultSchema: this.db.databaseName }));
|
|
123
|
+
this.syncRulesContent = replicationStream.syncConfigContent[0];
|
|
124
|
+
this.storage = await this.getWritableStorage(replicationStream);
|
|
125
|
+
return this.storage;
|
|
126
|
+
}
|
|
127
|
+
async loadNextSyncRules() {
|
|
128
|
+
const syncConfig = await this.factory.getDeployingSyncConfig();
|
|
129
|
+
if (syncConfig == null) {
|
|
130
|
+
throw new Error(`Next sync config not available`);
|
|
131
|
+
}
|
|
132
|
+
this.syncRulesContent = syncConfig.content;
|
|
133
|
+
this.storage = await this.getWritableStorage(syncConfig.replicationStream);
|
|
134
|
+
return this.storage;
|
|
135
|
+
}
|
|
136
|
+
async loadActiveSyncRules() {
|
|
137
|
+
const syncConfig = await this.factory.getActiveSyncConfig();
|
|
138
|
+
if (syncConfig == null) {
|
|
139
|
+
throw new Error(`Active sync config not found`);
|
|
140
|
+
}
|
|
141
|
+
this.syncRulesContent = syncConfig.content;
|
|
142
|
+
this.storage = await this.getWritableStorage(syncConfig.replicationStream);
|
|
143
|
+
return this.storage;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Reuse a replication lease per stream until the owning factory is disposed.
|
|
147
|
+
*/
|
|
148
|
+
async getWritableStorage(stream) {
|
|
149
|
+
let pending = this.replicationLeases.get(stream.replicationStreamId);
|
|
150
|
+
if (pending == null) {
|
|
151
|
+
pending = stream.lock();
|
|
152
|
+
this.replicationLeases.set(stream.replicationStreamId, pending);
|
|
153
|
+
}
|
|
154
|
+
let replicationLock;
|
|
155
|
+
try {
|
|
156
|
+
replicationLock = await pending;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
this.replicationLeases.delete(stream.replicationStreamId);
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
return this.factory.getInstance(stream, { replicationLock });
|
|
163
|
+
}
|
|
164
|
+
getSyncConfigContent() {
|
|
165
|
+
if (this.syncRulesContent == null) {
|
|
166
|
+
throw new Error('Sync config not configured - call updateSyncRules() first');
|
|
167
|
+
}
|
|
168
|
+
return this.syncRulesContent;
|
|
169
|
+
}
|
|
170
|
+
get streamer() {
|
|
171
|
+
if (this.storage == null) {
|
|
172
|
+
throw new Error('updateSyncRules() first');
|
|
173
|
+
}
|
|
174
|
+
if (this._walStream) {
|
|
175
|
+
return this._walStream;
|
|
176
|
+
}
|
|
177
|
+
const options = {
|
|
178
|
+
// Forward all supported stream options, including custom query providers and snapshot/storage hooks.
|
|
179
|
+
...this.streamOptions,
|
|
180
|
+
storage: this.storage,
|
|
181
|
+
metrics: this.metrics,
|
|
182
|
+
connections: this.connectionManager,
|
|
183
|
+
abort_signal: this.abortController.signal,
|
|
184
|
+
// A shorter await also keeps aborts responsive on MongoDB <= 6.0.
|
|
185
|
+
maxAwaitTimeMS: this.streamOptions.maxAwaitTimeMS ?? 200
|
|
186
|
+
};
|
|
187
|
+
this._walStream = new ChangeStream(options);
|
|
188
|
+
return this._walStream;
|
|
189
|
+
}
|
|
190
|
+
async replicateSnapshot() {
|
|
191
|
+
this.settledReplicationPromise ??= settledPromise(this.streamer.replicate());
|
|
192
|
+
try {
|
|
193
|
+
await Promise.race([unsettledPromise(this.settledReplicationPromise), this.streamer.waitForInitialSnapshot()]);
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
if (e instanceof ReplicationAbortedError && e.cause != null) {
|
|
197
|
+
throw e.cause;
|
|
198
|
+
}
|
|
199
|
+
throw e;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* A snapshot is not consistent until streaming replication has caught up.
|
|
204
|
+
* We simulate that for tests.
|
|
205
|
+
* Do not use if there are any writes performed while doing the snapshot, as that
|
|
206
|
+
* would result in inconsistent data.
|
|
207
|
+
*/
|
|
208
|
+
async markSnapshotConsistent() {
|
|
209
|
+
let checkpoint;
|
|
210
|
+
if (this.documentDbMode) {
|
|
211
|
+
const sentinelCheckpoint = SentinelLSN.fromSerialized(await createSentinelCheckpointLsn(this.client, this.db));
|
|
212
|
+
const status = await this.storage.getStatus();
|
|
213
|
+
const resumeFrom = status.resumeLsn;
|
|
214
|
+
const resumeToken = resumeFrom ? SentinelLSN.fromSerialized(resumeFrom).resumeToken : null;
|
|
215
|
+
// This helper artificially marks the snapshot as consistent without
|
|
216
|
+
// waiting for the stream to observe the sentinel. Keep the sentinel as the
|
|
217
|
+
// comparable position, but carry forward the existing snapshot resume
|
|
218
|
+
// token so later DocumentDB streaming still resumes from a real token.
|
|
219
|
+
checkpoint = new SentinelLSN({
|
|
220
|
+
sentinel: sentinelCheckpoint.sentinel,
|
|
221
|
+
resume_token: resumeToken
|
|
222
|
+
}).comparable;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
checkpoint = await createCheckpoint(this.db, STANDALONE_CHECKPOINT_ID);
|
|
226
|
+
}
|
|
227
|
+
await using writer = await this.storage.createWriter({
|
|
228
|
+
zeroLSN: '0000000000000000',
|
|
229
|
+
defaultSchema: this.db.databaseName,
|
|
230
|
+
storeCurrentData: true
|
|
231
|
+
});
|
|
232
|
+
await writer.keepalive(checkpoint);
|
|
233
|
+
await writer.flush();
|
|
234
|
+
}
|
|
235
|
+
startStreaming() {
|
|
236
|
+
this.settledReplicationPromise ??= settledPromise(this.streamer.replicate());
|
|
237
|
+
return this.settledReplicationPromise;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Wait for this stream to publish a real source marker; stop polling if replication exits first.
|
|
241
|
+
*/
|
|
242
|
+
async getCheckpoint(options) {
|
|
243
|
+
if (this.settledReplicationPromise == null) {
|
|
244
|
+
throw new Error('Start replication before requesting a checkpoint.');
|
|
245
|
+
}
|
|
246
|
+
const polling = new AbortController();
|
|
247
|
+
const wait = getClientCheckpoint({
|
|
248
|
+
client: this.client,
|
|
249
|
+
db: this.db,
|
|
250
|
+
storageFactory: this.factory,
|
|
251
|
+
storage: this.storage,
|
|
252
|
+
timeout: options?.timeout ?? 15_000,
|
|
253
|
+
documentDbMode: this.documentDbMode,
|
|
254
|
+
signal: polling.signal
|
|
255
|
+
});
|
|
256
|
+
try {
|
|
257
|
+
return await Promise.race([
|
|
258
|
+
wait,
|
|
259
|
+
unsettledPromise(this.settledReplicationPromise).then(() => {
|
|
260
|
+
throw new Error('Replication exited before publishing the requested checkpoint.');
|
|
261
|
+
})
|
|
262
|
+
]);
|
|
263
|
+
}
|
|
264
|
+
finally {
|
|
265
|
+
polling.abort();
|
|
266
|
+
await wait.catch(() => { });
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async getBucketsDataBatch(buckets, options) {
|
|
270
|
+
let checkpoint = await this.getCheckpoint(options);
|
|
271
|
+
const map = Object.entries(buckets).map(([bucket, start]) => this.bucketRequest(bucket, start));
|
|
272
|
+
const chunks = [];
|
|
273
|
+
for await (const chunk of this.storage.getBucketDataBatch(checkpoint, map)) {
|
|
274
|
+
chunks.push(chunk);
|
|
275
|
+
}
|
|
276
|
+
return chunks;
|
|
277
|
+
}
|
|
278
|
+
async getBucketData(bucket, start, options) {
|
|
279
|
+
const checkpoint = await this.getCheckpoint(options);
|
|
280
|
+
return this.getBucketDataAtCheckpoint(bucket, checkpoint, start);
|
|
281
|
+
}
|
|
282
|
+
async getBucketDataAtLatestCheckpoint(bucket, start) {
|
|
283
|
+
if (this.storage == null) {
|
|
284
|
+
throw new Error('updateSyncRules() first');
|
|
285
|
+
}
|
|
286
|
+
const checkpoint = await this.storage.getCheckpoint();
|
|
287
|
+
return this.getBucketDataAtCheckpoint(bucket, checkpoint, start);
|
|
288
|
+
}
|
|
289
|
+
async getBucketDataAtCheckpoint(bucket, checkpoint, start) {
|
|
290
|
+
start ??= 0n;
|
|
291
|
+
if (typeof start == 'string') {
|
|
292
|
+
start = BigInt(start);
|
|
293
|
+
}
|
|
294
|
+
let map = [this.bucketRequest(bucket, start)];
|
|
295
|
+
let data = [];
|
|
296
|
+
while (true) {
|
|
297
|
+
const batch = this.storage.getBucketDataBatch(checkpoint, map);
|
|
298
|
+
const chunks = [];
|
|
299
|
+
for await (const chunk of batch) {
|
|
300
|
+
chunks.push(chunk);
|
|
301
|
+
}
|
|
302
|
+
if (chunks.length == 0) {
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
for (let chunk of chunks) {
|
|
306
|
+
if (isBatchEnd(chunk)) {
|
|
307
|
+
if (!chunk.hasMore) {
|
|
308
|
+
return data;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
data = data.concat(chunk.chunkData.data ?? []);
|
|
313
|
+
map = [this.bucketRequest(bucket, BigInt(chunk.chunkData.next_after))];
|
|
314
|
+
if (!chunk.chunkData.has_more) {
|
|
315
|
+
return data;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return data;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Resolve a readable test bucket such as global[] to its persisted, versioned bucket name.
|
|
324
|
+
*/
|
|
325
|
+
bucketRequest(bucket, start) {
|
|
326
|
+
const parsed = this.getSyncConfigContent().parsed({ defaultSchema: this.db.databaseName });
|
|
327
|
+
const parameterStart = bucket.indexOf('[');
|
|
328
|
+
const definitionName = bucket.substring(0, parameterStart);
|
|
329
|
+
const source = parsed.syncConfigs
|
|
330
|
+
.flatMap((config) => config.config.bucketDataSources)
|
|
331
|
+
.find((source) => source.uniqueName == definitionName);
|
|
332
|
+
if (source == null) {
|
|
333
|
+
throw new Error(`Unknown bucket '${bucket}'.`);
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
bucket: parsed.hydrationState.getBucketSourceScope(source).bucketPrefix + bucket.substring(parameterStart),
|
|
337
|
+
source,
|
|
338
|
+
start
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
async getChecksums(buckets, options) {
|
|
342
|
+
let checkpoint = await this.getCheckpoint(options);
|
|
343
|
+
const versionedBuckets = buckets.map((bucket) => this.bucketRequest(bucket, 0n));
|
|
344
|
+
const checksums = await this.storage.getChecksums(checkpoint, versionedBuckets);
|
|
345
|
+
const unversioned = new Map();
|
|
346
|
+
for (let i = 0; i < buckets.length; i++) {
|
|
347
|
+
unversioned.set(buckets[i], checksums.get(versionedBuckets[i].bucket));
|
|
348
|
+
}
|
|
349
|
+
return unversioned;
|
|
350
|
+
}
|
|
351
|
+
async getChecksum(bucket, options) {
|
|
352
|
+
const checksums = await this.getChecksums([bucket], options);
|
|
353
|
+
return checksums.get(bucket);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
export async function getClientCheckpoint({ client, db, storageFactory, timeout = 50_000, documentDbMode: forcedDocumentDbMode, storage: expectedStorage, signal }) {
|
|
357
|
+
const start = Date.now();
|
|
358
|
+
const documentDbMode = forcedDocumentDbMode ?? (await detectDocumentDb(db));
|
|
359
|
+
const lsn = documentDbMode
|
|
360
|
+
? await createSentinelCheckpointLsn(client, db)
|
|
361
|
+
: await createCheckpoint(db, STANDALONE_CHECKPOINT_ID);
|
|
362
|
+
// The marker establishes a source position. Wait until replication publishes a client-visible checkpoint past it.
|
|
363
|
+
// DocumentDB: the streaming loop skips standalone checkpoint events while a
|
|
364
|
+
// batch barrier is pending (see ChangeStream.ts), so a single sentinel bump
|
|
365
|
+
// can be missed on an idle stream with no later event to advance the
|
|
366
|
+
// checkpoint. Periodically re-bump the sentinel so a standalone event
|
|
367
|
+
// eventually commits past `lsn`, mirroring getSnapshotLsn's retry loop.
|
|
368
|
+
const NUDGE_INTERVAL_MS = 1000;
|
|
369
|
+
let lastNudge = Date.now();
|
|
370
|
+
let lastCp = null;
|
|
371
|
+
while (Date.now() - start < timeout) {
|
|
372
|
+
signal?.throwIfAborted();
|
|
373
|
+
const activeStorage = (await storageFactory.getActiveSyncConfig())?.storage;
|
|
374
|
+
const cp = expectedStorage == null || activeStorage?.replicationStreamId == expectedStorage.replicationStreamId
|
|
375
|
+
? await activeStorage?.getCheckpoint()
|
|
376
|
+
: undefined;
|
|
377
|
+
if (cp != null) {
|
|
378
|
+
lastCp = cp;
|
|
379
|
+
if (cp.lsn && cp.lsn >= lsn) {
|
|
380
|
+
return cp;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
if (documentDbMode && Date.now() - lastNudge >= NUDGE_INTERVAL_MS) {
|
|
384
|
+
await createSentinelCheckpointLsn(client, db);
|
|
385
|
+
lastNudge = Date.now();
|
|
386
|
+
}
|
|
387
|
+
await setTimeout(30, undefined, { signal });
|
|
388
|
+
}
|
|
389
|
+
throw new Error(`Timeout while waiting for checkpoint ${lsn}. Last checkpoint: ${lastCp?.lsn}`);
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=ChangeStreamTestContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeStreamTestContext.js","sourceRoot":"","sources":["../../src/test-utils/ChangeStreamTestContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ChangeStreamTestContext.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils-index.js","sourceRoot":"","sources":["../../src/test-utils/test-utils-index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/service-module-mongodb",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
-
"version": "0.0.0-dev-
|
|
4
|
+
"version": "0.0.0-dev-20260929095716",
|
|
5
5
|
"license": "FSL-1.1-ALv2",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"publishConfig": {
|
|
@@ -15,17 +15,17 @@
|
|
|
15
15
|
"bson": "^6.10.4",
|
|
16
16
|
"ts-codec": "^1.3.0",
|
|
17
17
|
"uuid": "^14.0.0",
|
|
18
|
-
"@powersync/lib-service-mongodb": "0.0.0-dev-
|
|
19
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
20
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
18
|
+
"@powersync/lib-service-mongodb": "0.0.0-dev-20260929095716",
|
|
19
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20260929095716",
|
|
20
|
+
"@powersync/service-core": "0.0.0-dev-20260929095716",
|
|
21
21
|
"@powersync/service-jsonbig": "0.17.13",
|
|
22
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
22
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20260929095716",
|
|
23
23
|
"@powersync/service-types": "0.18.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
27
|
-
"@powersync/service-module-mongodb-storage": "0.0.0-dev-
|
|
28
|
-
"@powersync/service-module-postgres-storage": "0.0.0-dev-
|
|
26
|
+
"@powersync/service-core-tests": "0.0.0-dev-20260929095716",
|
|
27
|
+
"@powersync/service-module-mongodb-storage": "0.0.0-dev-20260929095716",
|
|
28
|
+
"@powersync/service-module-postgres-storage": "0.0.0-dev-20260929095716"
|
|
29
29
|
},
|
|
30
30
|
"scripts": {
|
|
31
31
|
"build": "tsc -b",
|