@powersync/service-core 1.10.1 → 1.10.3
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/.probes/poll +1 -0
- package/CHANGELOG.md +12 -0
- package/dist/sync/sync.js +8 -1
- package/dist/sync/sync.js.map +1 -1
- package/package.json +3 -3
- package/src/sync/sync.ts +8 -1
- package/test/dist/auth.test.d.ts +1 -0
- package/test/dist/auth.test.js +332 -0
- package/test/dist/auth.test.js.map +1 -0
- package/test/dist/broadcast_iterable.test.d.ts +1 -0
- package/test/dist/broadcast_iterable.test.js +131 -0
- package/test/dist/broadcast_iterable.test.js.map +1 -0
- package/test/dist/bucket_validation.d.ts +26 -0
- package/test/dist/bucket_validation.js +56 -0
- package/test/dist/bucket_validation.js.map +1 -0
- package/test/dist/bucket_validation.test.d.ts +1 -0
- package/test/dist/bucket_validation.test.js +134 -0
- package/test/dist/bucket_validation.test.js.map +1 -0
- package/test/dist/checksum_cache.test.d.ts +1 -0
- package/test/dist/checksum_cache.test.js +375 -0
- package/test/dist/checksum_cache.test.js.map +1 -0
- package/test/dist/compacting.test.d.ts +1 -0
- package/test/dist/compacting.test.js +254 -0
- package/test/dist/compacting.test.js.map +1 -0
- package/test/dist/data_storage.test.d.ts +1 -0
- package/test/dist/data_storage.test.js +1306 -0
- package/test/dist/data_storage.test.js.map +1 -0
- package/test/dist/demultiplexer.test.d.ts +1 -0
- package/test/dist/demultiplexer.test.js +166 -0
- package/test/dist/demultiplexer.test.js.map +1 -0
- package/test/dist/env.d.ts +3 -0
- package/test/dist/env.js +5 -0
- package/test/dist/env.js.map +1 -0
- package/test/dist/merge_iterable.test.d.ts +1 -0
- package/test/dist/merge_iterable.test.js +321 -0
- package/test/dist/merge_iterable.test.js.map +1 -0
- package/test/dist/routes/probes.integration.test.d.ts +1 -0
- package/test/dist/routes/probes.integration.test.js +192 -0
- package/test/dist/routes/probes.integration.test.js.map +1 -0
- package/test/dist/routes/probes.test.d.ts +1 -0
- package/test/dist/routes/probes.test.js +119 -0
- package/test/dist/routes/probes.test.js.map +1 -0
- package/test/dist/setup.d.ts +1 -0
- package/test/dist/setup.js +7 -0
- package/test/dist/setup.js.map +1 -0
- package/test/dist/stream_utils.d.ts +6 -0
- package/test/dist/stream_utils.js +37 -0
- package/test/dist/stream_utils.js.map +1 -0
- package/test/dist/sync/BucketChecksumState.test.d.ts +1 -0
- package/test/dist/sync/BucketChecksumState.test.js +499 -0
- package/test/dist/sync/BucketChecksumState.test.js.map +1 -0
- package/test/dist/sync/checksum_state.test.d.ts +1 -0
- package/test/dist/sync/checksum_state.test.js +21 -0
- package/test/dist/sync/checksum_state.test.js.map +1 -0
- package/test/dist/sync/util.test.d.ts +1 -0
- package/test/dist/sync/util.test.js +28 -0
- package/test/dist/sync/util.test.js.map +1 -0
- package/test/dist/sync.test.d.ts +1 -0
- package/test/dist/sync.test.js +428 -0
- package/test/dist/sync.test.js.map +1 -0
- package/test/dist/util.d.ts +36 -0
- package/test/dist/util.js +114 -0
- package/test/dist/util.js.map +1 -0
- package/test/dist/util.test.d.ts +1 -0
- package/test/dist/util.test.js +45 -0
- package/test/dist/util.test.js.map +1 -0
- package/test/tsconfig.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import { SaveOperationTag } from '@/storage/storage-index.js';
|
|
2
|
+
import { RequestTracker } from '@/sync/RequestTracker.js';
|
|
3
|
+
import { streamResponse } from '@/sync/sync.js';
|
|
4
|
+
import { JSONBig } from '@powersync/service-jsonbig';
|
|
5
|
+
import { RequestParameters } from '@powersync/service-sync-rules';
|
|
6
|
+
import * as timers from 'timers/promises';
|
|
7
|
+
import { describe, expect, test } from 'vitest';
|
|
8
|
+
import { BATCH_OPTIONS, makeTestTable, MONGO_STORAGE_FACTORY, PARSE_OPTIONS } from './util.js';
|
|
9
|
+
describe('sync - mongodb', function () {
|
|
10
|
+
defineTests(MONGO_STORAGE_FACTORY);
|
|
11
|
+
});
|
|
12
|
+
const TEST_TABLE = makeTestTable('test', ['id']);
|
|
13
|
+
const BASIC_SYNC_RULES = `
|
|
14
|
+
bucket_definitions:
|
|
15
|
+
mybucket:
|
|
16
|
+
data:
|
|
17
|
+
- SELECT * FROM test
|
|
18
|
+
`;
|
|
19
|
+
function defineTests(factory) {
|
|
20
|
+
const tracker = new RequestTracker();
|
|
21
|
+
test('sync global data', async () => {
|
|
22
|
+
const f = await factory();
|
|
23
|
+
const syncRules = await f.updateSyncRules({
|
|
24
|
+
content: BASIC_SYNC_RULES
|
|
25
|
+
});
|
|
26
|
+
const storage = f.getInstance(syncRules);
|
|
27
|
+
await storage.autoActivate();
|
|
28
|
+
const result = await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
29
|
+
await batch.save({
|
|
30
|
+
sourceTable: TEST_TABLE,
|
|
31
|
+
tag: SaveOperationTag.INSERT,
|
|
32
|
+
after: {
|
|
33
|
+
id: 't1',
|
|
34
|
+
description: 'Test 1'
|
|
35
|
+
},
|
|
36
|
+
afterReplicaId: 't1'
|
|
37
|
+
});
|
|
38
|
+
await batch.save({
|
|
39
|
+
sourceTable: TEST_TABLE,
|
|
40
|
+
tag: SaveOperationTag.INSERT,
|
|
41
|
+
after: {
|
|
42
|
+
id: 't2',
|
|
43
|
+
description: 'Test 2'
|
|
44
|
+
},
|
|
45
|
+
afterReplicaId: 't2'
|
|
46
|
+
});
|
|
47
|
+
await batch.commit('0/1');
|
|
48
|
+
});
|
|
49
|
+
const stream = streamResponse({
|
|
50
|
+
storage: f,
|
|
51
|
+
params: {
|
|
52
|
+
buckets: [],
|
|
53
|
+
include_checksum: true,
|
|
54
|
+
raw_data: true
|
|
55
|
+
},
|
|
56
|
+
parseOptions: PARSE_OPTIONS,
|
|
57
|
+
tracker,
|
|
58
|
+
syncParams: new RequestParameters({ sub: '' }, {}),
|
|
59
|
+
token: { exp: Date.now() / 1000 + 10 }
|
|
60
|
+
});
|
|
61
|
+
const lines = await consumeCheckpointLines(stream);
|
|
62
|
+
expect(lines).toMatchSnapshot();
|
|
63
|
+
});
|
|
64
|
+
test('sync legacy non-raw data', async () => {
|
|
65
|
+
const f = await factory();
|
|
66
|
+
const syncRules = await f.updateSyncRules({
|
|
67
|
+
content: BASIC_SYNC_RULES
|
|
68
|
+
});
|
|
69
|
+
const storage = await f.getInstance(syncRules);
|
|
70
|
+
await storage.autoActivate();
|
|
71
|
+
const result = await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
72
|
+
await batch.save({
|
|
73
|
+
sourceTable: TEST_TABLE,
|
|
74
|
+
tag: SaveOperationTag.INSERT,
|
|
75
|
+
after: {
|
|
76
|
+
id: 't1',
|
|
77
|
+
description: 'Test\n"string"',
|
|
78
|
+
large_num: 12345678901234567890n
|
|
79
|
+
},
|
|
80
|
+
afterReplicaId: 't1'
|
|
81
|
+
});
|
|
82
|
+
await batch.commit('0/1');
|
|
83
|
+
});
|
|
84
|
+
const stream = streamResponse({
|
|
85
|
+
storage: f,
|
|
86
|
+
params: {
|
|
87
|
+
buckets: [],
|
|
88
|
+
include_checksum: true,
|
|
89
|
+
raw_data: false
|
|
90
|
+
},
|
|
91
|
+
parseOptions: PARSE_OPTIONS,
|
|
92
|
+
tracker,
|
|
93
|
+
syncParams: new RequestParameters({ sub: '' }, {}),
|
|
94
|
+
token: { exp: Date.now() / 1000 + 10 }
|
|
95
|
+
});
|
|
96
|
+
const lines = await consumeCheckpointLines(stream);
|
|
97
|
+
expect(lines).toMatchSnapshot();
|
|
98
|
+
// Specifically check the number - this is the important part of the test
|
|
99
|
+
expect(lines[1].data.data[0].data.large_num).toEqual(12345678901234567890n);
|
|
100
|
+
});
|
|
101
|
+
test('expired token', async () => {
|
|
102
|
+
const f = await factory();
|
|
103
|
+
const syncRules = await f.updateSyncRules({
|
|
104
|
+
content: BASIC_SYNC_RULES
|
|
105
|
+
});
|
|
106
|
+
const storage = await f.getInstance(syncRules);
|
|
107
|
+
await storage.autoActivate();
|
|
108
|
+
const stream = streamResponse({
|
|
109
|
+
storage: f,
|
|
110
|
+
params: {
|
|
111
|
+
buckets: [],
|
|
112
|
+
include_checksum: true,
|
|
113
|
+
raw_data: true
|
|
114
|
+
},
|
|
115
|
+
parseOptions: PARSE_OPTIONS,
|
|
116
|
+
tracker,
|
|
117
|
+
syncParams: new RequestParameters({ sub: '' }, {}),
|
|
118
|
+
token: { exp: 0 }
|
|
119
|
+
});
|
|
120
|
+
const lines = await consumeCheckpointLines(stream);
|
|
121
|
+
expect(lines).toMatchSnapshot();
|
|
122
|
+
});
|
|
123
|
+
test('sync updates to global data', async () => {
|
|
124
|
+
const f = await factory();
|
|
125
|
+
const syncRules = await f.updateSyncRules({
|
|
126
|
+
content: BASIC_SYNC_RULES
|
|
127
|
+
});
|
|
128
|
+
const storage = await f.getInstance(syncRules);
|
|
129
|
+
await storage.autoActivate();
|
|
130
|
+
const stream = streamResponse({
|
|
131
|
+
storage: f,
|
|
132
|
+
params: {
|
|
133
|
+
buckets: [],
|
|
134
|
+
include_checksum: true,
|
|
135
|
+
raw_data: true
|
|
136
|
+
},
|
|
137
|
+
parseOptions: PARSE_OPTIONS,
|
|
138
|
+
tracker,
|
|
139
|
+
syncParams: new RequestParameters({ sub: '' }, {}),
|
|
140
|
+
token: { exp: Date.now() / 1000 + 10 }
|
|
141
|
+
});
|
|
142
|
+
const iter = stream[Symbol.asyncIterator]();
|
|
143
|
+
expect(await getCheckpointLines(iter)).toMatchSnapshot();
|
|
144
|
+
await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
145
|
+
await batch.save({
|
|
146
|
+
sourceTable: TEST_TABLE,
|
|
147
|
+
tag: SaveOperationTag.INSERT,
|
|
148
|
+
after: {
|
|
149
|
+
id: 't1',
|
|
150
|
+
description: 'Test 1'
|
|
151
|
+
},
|
|
152
|
+
afterReplicaId: 't1'
|
|
153
|
+
});
|
|
154
|
+
await batch.commit('0/1');
|
|
155
|
+
});
|
|
156
|
+
expect(await getCheckpointLines(iter)).toMatchSnapshot();
|
|
157
|
+
await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
158
|
+
await batch.save({
|
|
159
|
+
sourceTable: TEST_TABLE,
|
|
160
|
+
tag: SaveOperationTag.INSERT,
|
|
161
|
+
after: {
|
|
162
|
+
id: 't2',
|
|
163
|
+
description: 'Test 2'
|
|
164
|
+
},
|
|
165
|
+
afterReplicaId: 't2'
|
|
166
|
+
});
|
|
167
|
+
await batch.commit('0/2');
|
|
168
|
+
});
|
|
169
|
+
expect(await getCheckpointLines(iter)).toMatchSnapshot();
|
|
170
|
+
iter.return?.();
|
|
171
|
+
});
|
|
172
|
+
test('expiring token', async () => {
|
|
173
|
+
const f = await factory();
|
|
174
|
+
const syncRules = await f.updateSyncRules({
|
|
175
|
+
content: BASIC_SYNC_RULES
|
|
176
|
+
});
|
|
177
|
+
const storage = await f.getInstance(syncRules);
|
|
178
|
+
await storage.autoActivate();
|
|
179
|
+
const exp = Date.now() / 1000 + 0.1;
|
|
180
|
+
const stream = streamResponse({
|
|
181
|
+
storage: f,
|
|
182
|
+
params: {
|
|
183
|
+
buckets: [],
|
|
184
|
+
include_checksum: true,
|
|
185
|
+
raw_data: true
|
|
186
|
+
},
|
|
187
|
+
parseOptions: PARSE_OPTIONS,
|
|
188
|
+
tracker,
|
|
189
|
+
syncParams: new RequestParameters({ sub: '' }, {}),
|
|
190
|
+
token: { exp: exp }
|
|
191
|
+
});
|
|
192
|
+
const iter = stream[Symbol.asyncIterator]();
|
|
193
|
+
const checkpoint = await getCheckpointLines(iter);
|
|
194
|
+
expect(checkpoint).toMatchSnapshot();
|
|
195
|
+
const expLines = await getCheckpointLines(iter);
|
|
196
|
+
expect(expLines).toMatchSnapshot();
|
|
197
|
+
});
|
|
198
|
+
test('compacting data - invalidate checkpoint', async () => {
|
|
199
|
+
// This tests a case of a compact operation invalidating a checkpoint in the
|
|
200
|
+
// middle of syncing data.
|
|
201
|
+
// This is expected to be rare in practice, but it is important to handle
|
|
202
|
+
// this case correctly to maintain consistency on the client.
|
|
203
|
+
const f = await factory();
|
|
204
|
+
const syncRules = await f.updateSyncRules({
|
|
205
|
+
content: BASIC_SYNC_RULES
|
|
206
|
+
});
|
|
207
|
+
const storage = await f.getInstance(syncRules);
|
|
208
|
+
await storage.autoActivate();
|
|
209
|
+
await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
210
|
+
await batch.save({
|
|
211
|
+
sourceTable: TEST_TABLE,
|
|
212
|
+
tag: SaveOperationTag.INSERT,
|
|
213
|
+
after: {
|
|
214
|
+
id: 't1',
|
|
215
|
+
description: 'Test 1'
|
|
216
|
+
},
|
|
217
|
+
afterReplicaId: 't1'
|
|
218
|
+
});
|
|
219
|
+
await batch.save({
|
|
220
|
+
sourceTable: TEST_TABLE,
|
|
221
|
+
tag: SaveOperationTag.INSERT,
|
|
222
|
+
after: {
|
|
223
|
+
id: 't2',
|
|
224
|
+
description: 'Test 2'
|
|
225
|
+
},
|
|
226
|
+
afterReplicaId: 't2'
|
|
227
|
+
});
|
|
228
|
+
await batch.commit('0/1');
|
|
229
|
+
});
|
|
230
|
+
const stream = streamResponse({
|
|
231
|
+
storage: f,
|
|
232
|
+
params: {
|
|
233
|
+
buckets: [],
|
|
234
|
+
include_checksum: true,
|
|
235
|
+
raw_data: true
|
|
236
|
+
},
|
|
237
|
+
parseOptions: PARSE_OPTIONS,
|
|
238
|
+
tracker,
|
|
239
|
+
syncParams: new RequestParameters({ sub: '' }, {}),
|
|
240
|
+
token: { exp: Date.now() / 1000 + 10 }
|
|
241
|
+
});
|
|
242
|
+
const iter = stream[Symbol.asyncIterator]();
|
|
243
|
+
// Only consume the first "checkpoint" message, and pause before receiving data.
|
|
244
|
+
const lines = await consumeIterator(iter, { consume: false, isDone: (line) => line?.checkpoint != null });
|
|
245
|
+
expect(lines).toMatchSnapshot();
|
|
246
|
+
expect(lines[0]).toEqual({
|
|
247
|
+
checkpoint: expect.objectContaining({
|
|
248
|
+
last_op_id: '2'
|
|
249
|
+
})
|
|
250
|
+
});
|
|
251
|
+
// Now we save additional data AND compact before continuing.
|
|
252
|
+
// This invalidates the checkpoint we've received above.
|
|
253
|
+
await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
254
|
+
await batch.save({
|
|
255
|
+
sourceTable: TEST_TABLE,
|
|
256
|
+
tag: SaveOperationTag.UPDATE,
|
|
257
|
+
after: {
|
|
258
|
+
id: 't1',
|
|
259
|
+
description: 'Test 1b'
|
|
260
|
+
},
|
|
261
|
+
afterReplicaId: 't1'
|
|
262
|
+
});
|
|
263
|
+
await batch.save({
|
|
264
|
+
sourceTable: TEST_TABLE,
|
|
265
|
+
tag: SaveOperationTag.UPDATE,
|
|
266
|
+
after: {
|
|
267
|
+
id: 't2',
|
|
268
|
+
description: 'Test 2b'
|
|
269
|
+
},
|
|
270
|
+
afterReplicaId: 't2'
|
|
271
|
+
});
|
|
272
|
+
await batch.commit('0/2');
|
|
273
|
+
});
|
|
274
|
+
await storage.compact();
|
|
275
|
+
const lines2 = await getCheckpointLines(iter, { consume: true });
|
|
276
|
+
// Snapshot test checks for changes in general.
|
|
277
|
+
// The tests after that documents the specific things we're looking for
|
|
278
|
+
// in this test.
|
|
279
|
+
expect(lines2).toMatchSnapshot();
|
|
280
|
+
expect(lines2[0]).toEqual({
|
|
281
|
+
data: expect.objectContaining({
|
|
282
|
+
has_more: false,
|
|
283
|
+
data: [
|
|
284
|
+
// The first two ops have been replaced by a single CLEAR op
|
|
285
|
+
expect.objectContaining({
|
|
286
|
+
op: 'CLEAR'
|
|
287
|
+
})
|
|
288
|
+
]
|
|
289
|
+
})
|
|
290
|
+
});
|
|
291
|
+
// Note: No checkpoint_complete here, since the checkpoint has been
|
|
292
|
+
// invalidated by the CLEAR op.
|
|
293
|
+
expect(lines2[1]).toEqual({
|
|
294
|
+
checkpoint_diff: expect.objectContaining({
|
|
295
|
+
last_op_id: '4'
|
|
296
|
+
})
|
|
297
|
+
});
|
|
298
|
+
expect(lines2[2]).toEqual({
|
|
299
|
+
data: expect.objectContaining({
|
|
300
|
+
has_more: false,
|
|
301
|
+
data: [
|
|
302
|
+
expect.objectContaining({
|
|
303
|
+
op: 'PUT'
|
|
304
|
+
}),
|
|
305
|
+
expect.objectContaining({
|
|
306
|
+
op: 'PUT'
|
|
307
|
+
})
|
|
308
|
+
]
|
|
309
|
+
})
|
|
310
|
+
});
|
|
311
|
+
// Now we get a checkpoint_complete
|
|
312
|
+
expect(lines2[3]).toEqual({
|
|
313
|
+
checkpoint_complete: expect.objectContaining({
|
|
314
|
+
last_op_id: '4'
|
|
315
|
+
})
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
test('write checkpoint', async () => {
|
|
319
|
+
const f = await factory();
|
|
320
|
+
const syncRules = await f.updateSyncRules({
|
|
321
|
+
content: BASIC_SYNC_RULES
|
|
322
|
+
});
|
|
323
|
+
const storage = f.getInstance(syncRules);
|
|
324
|
+
await storage.autoActivate();
|
|
325
|
+
await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
326
|
+
// <= the managed write checkpoint LSN below
|
|
327
|
+
await batch.commit('0/1');
|
|
328
|
+
});
|
|
329
|
+
const checkpoint = await storage.createManagedWriteCheckpoint({
|
|
330
|
+
user_id: 'test',
|
|
331
|
+
heads: { '1': '1/0' }
|
|
332
|
+
});
|
|
333
|
+
const params = {
|
|
334
|
+
storage: f,
|
|
335
|
+
params: {
|
|
336
|
+
buckets: [],
|
|
337
|
+
include_checksum: true,
|
|
338
|
+
raw_data: true
|
|
339
|
+
},
|
|
340
|
+
parseOptions: PARSE_OPTIONS,
|
|
341
|
+
tracker,
|
|
342
|
+
syncParams: new RequestParameters({ sub: 'test' }, {}),
|
|
343
|
+
token: { sub: 'test', exp: Date.now() / 1000 + 10 }
|
|
344
|
+
};
|
|
345
|
+
const stream1 = streamResponse(params);
|
|
346
|
+
const lines1 = await consumeCheckpointLines(stream1);
|
|
347
|
+
// If write checkpoints are not correctly filtered, this may already
|
|
348
|
+
// contain the write checkpoint.
|
|
349
|
+
expect(lines1[0]).toMatchObject({
|
|
350
|
+
checkpoint: expect.objectContaining({
|
|
351
|
+
last_op_id: '0',
|
|
352
|
+
write_checkpoint: undefined
|
|
353
|
+
})
|
|
354
|
+
});
|
|
355
|
+
await storage.startBatch(BATCH_OPTIONS, async (batch) => {
|
|
356
|
+
// must be >= the managed write checkpoint LSN
|
|
357
|
+
await batch.commit('1/0');
|
|
358
|
+
});
|
|
359
|
+
// At this point the LSN has advanced, so the write checkpoint should be
|
|
360
|
+
// included in the next checkpoint message.
|
|
361
|
+
const stream2 = streamResponse(params);
|
|
362
|
+
const lines2 = await consumeCheckpointLines(stream2);
|
|
363
|
+
expect(lines2[0]).toMatchObject({
|
|
364
|
+
checkpoint: expect.objectContaining({
|
|
365
|
+
last_op_id: '0',
|
|
366
|
+
write_checkpoint: `${checkpoint}`
|
|
367
|
+
})
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get lines on an iterator until isDone(line) == true.
|
|
373
|
+
*
|
|
374
|
+
* Does not stop the iterator unless options.consume is true.
|
|
375
|
+
*/
|
|
376
|
+
async function consumeIterator(iter, options) {
|
|
377
|
+
let lines = [];
|
|
378
|
+
try {
|
|
379
|
+
const controller = new AbortController();
|
|
380
|
+
const timeout = timers.setTimeout(1500, { value: null, done: 'timeout' }, { signal: controller.signal });
|
|
381
|
+
while (true) {
|
|
382
|
+
let { value, done } = await Promise.race([timeout, iter.next()]);
|
|
383
|
+
if (done == 'timeout') {
|
|
384
|
+
throw new Error('Timeout');
|
|
385
|
+
}
|
|
386
|
+
if (typeof value == 'string') {
|
|
387
|
+
value = JSONBig.parse(value);
|
|
388
|
+
}
|
|
389
|
+
if (value) {
|
|
390
|
+
lines.push(value);
|
|
391
|
+
}
|
|
392
|
+
if (done || options.isDone(value)) {
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
controller.abort();
|
|
397
|
+
if (options?.consume) {
|
|
398
|
+
iter.return?.();
|
|
399
|
+
}
|
|
400
|
+
return lines;
|
|
401
|
+
}
|
|
402
|
+
catch (e) {
|
|
403
|
+
if (options?.consume) {
|
|
404
|
+
iter.throw?.(e);
|
|
405
|
+
}
|
|
406
|
+
throw e;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Get lines on an iterator until the next checkpoint_complete.
|
|
411
|
+
*
|
|
412
|
+
* Does not stop the iterator unless options.consume is true.
|
|
413
|
+
*/
|
|
414
|
+
async function getCheckpointLines(iter, options) {
|
|
415
|
+
return consumeIterator(iter, {
|
|
416
|
+
consume: options?.consume,
|
|
417
|
+
isDone: (line) => line?.checkpoint_complete
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Get lines on an iterator until the next checkpoint_complete.
|
|
422
|
+
*
|
|
423
|
+
* Stops the iterator afterwards.
|
|
424
|
+
*/
|
|
425
|
+
async function consumeCheckpointLines(iterable) {
|
|
426
|
+
return getCheckpointLines(iterable[Symbol.asyncIterator](), { consume: true });
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=sync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.test.js","sourceRoot":"","sources":["../src/sync.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BucketStorageFactory, ParseSyncRulesOptions, PersistedSyncRulesContent, StartBatchOptions, SyncBucketDataBatch } from '@/storage/BucketStorage.js';
|
|
2
|
+
import { SourceTable } from '@/storage/SourceTable.js';
|
|
3
|
+
import { PowerSyncMongo } from '@/storage/mongo/db.js';
|
|
4
|
+
import { SyncBucketData } from '@/util/protocol-types.js';
|
|
5
|
+
import * as bson from 'bson';
|
|
6
|
+
export interface StorageOptions {
|
|
7
|
+
/**
|
|
8
|
+
* By default, collections are only cleared/
|
|
9
|
+
* Setting this to true will drop the collections completely.
|
|
10
|
+
*/
|
|
11
|
+
dropAll?: boolean;
|
|
12
|
+
doNotClear?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export type StorageFactory = (options?: StorageOptions) => Promise<BucketStorageFactory>;
|
|
15
|
+
export declare const MONGO_STORAGE_FACTORY: StorageFactory;
|
|
16
|
+
export declare const ZERO_LSN = "0/0";
|
|
17
|
+
export declare const PARSE_OPTIONS: ParseSyncRulesOptions;
|
|
18
|
+
export declare const BATCH_OPTIONS: StartBatchOptions;
|
|
19
|
+
export declare function testRules(content: string): PersistedSyncRulesContent;
|
|
20
|
+
export declare function connectMongo(): Promise<PowerSyncMongo>;
|
|
21
|
+
export declare function makeTestTable(name: string, columns?: string[] | undefined): SourceTable;
|
|
22
|
+
export declare function getBatchData(batch: SyncBucketData[] | SyncBucketDataBatch[] | SyncBucketDataBatch): {
|
|
23
|
+
op_id: string;
|
|
24
|
+
op: "PUT" | "REMOVE" | "MOVE" | "CLEAR";
|
|
25
|
+
object_id: string | undefined;
|
|
26
|
+
checksum: number | bigint;
|
|
27
|
+
}[];
|
|
28
|
+
export declare function getBatchMeta(batch: SyncBucketData[] | SyncBucketDataBatch[] | SyncBucketDataBatch): {
|
|
29
|
+
has_more: boolean;
|
|
30
|
+
after: string;
|
|
31
|
+
next_after: string;
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Replica id in the old Postgres format, for backwards-compatible tests.
|
|
35
|
+
*/
|
|
36
|
+
export declare function rid(id: string): bson.UUID;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Metrics } from '@/metrics/Metrics.js';
|
|
2
|
+
import { MongoBucketStorage } from '@/storage/MongoBucketStorage.js';
|
|
3
|
+
import { SourceTable } from '@/storage/SourceTable.js';
|
|
4
|
+
import { PowerSyncMongo } from '@/storage/mongo/db.js';
|
|
5
|
+
import { getUuidReplicaIdentityBson, hashData } from '@/util/utils.js';
|
|
6
|
+
import { SqlSyncRules } from '@powersync/service-sync-rules';
|
|
7
|
+
import * as bson from 'bson';
|
|
8
|
+
import * as mongo from 'mongodb';
|
|
9
|
+
import { env } from './env.js';
|
|
10
|
+
// The metrics need to be initialised before they can be used
|
|
11
|
+
await Metrics.initialise({
|
|
12
|
+
disable_telemetry_sharing: true,
|
|
13
|
+
powersync_instance_id: 'test',
|
|
14
|
+
internal_metrics_endpoint: 'unused.for.tests.com'
|
|
15
|
+
});
|
|
16
|
+
Metrics.getInstance().resetCounters();
|
|
17
|
+
export const MONGO_STORAGE_FACTORY = async (options) => {
|
|
18
|
+
const db = await connectMongo();
|
|
19
|
+
if (options?.dropAll) {
|
|
20
|
+
await db.drop();
|
|
21
|
+
}
|
|
22
|
+
else if (!options?.doNotClear) {
|
|
23
|
+
await db.clear();
|
|
24
|
+
}
|
|
25
|
+
return new MongoBucketStorage(db, { slot_name_prefix: 'test_' });
|
|
26
|
+
};
|
|
27
|
+
export const ZERO_LSN = '0/0';
|
|
28
|
+
export const PARSE_OPTIONS = {
|
|
29
|
+
defaultSchema: 'public'
|
|
30
|
+
};
|
|
31
|
+
export const BATCH_OPTIONS = {
|
|
32
|
+
...PARSE_OPTIONS,
|
|
33
|
+
zeroLSN: ZERO_LSN,
|
|
34
|
+
storeCurrentData: true
|
|
35
|
+
};
|
|
36
|
+
export function testRules(content) {
|
|
37
|
+
return {
|
|
38
|
+
id: 1,
|
|
39
|
+
sync_rules_content: content,
|
|
40
|
+
slot_name: 'test',
|
|
41
|
+
parsed(options) {
|
|
42
|
+
return {
|
|
43
|
+
id: 1,
|
|
44
|
+
sync_rules: SqlSyncRules.fromYaml(content, options),
|
|
45
|
+
slot_name: 'test'
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
lock() {
|
|
49
|
+
throw new Error('Not implemented');
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function connectMongo() {
|
|
54
|
+
// Short timeout for tests, to fail fast when the server is not available.
|
|
55
|
+
// Slightly longer timeouts for CI, to avoid arbitrary test failures
|
|
56
|
+
const client = new mongo.MongoClient(env.MONGO_TEST_URL, {
|
|
57
|
+
connectTimeoutMS: env.CI ? 15000 : 5000,
|
|
58
|
+
socketTimeoutMS: env.CI ? 15000 : 5000,
|
|
59
|
+
serverSelectionTimeoutMS: env.CI ? 15000 : 2500
|
|
60
|
+
});
|
|
61
|
+
return new PowerSyncMongo(client);
|
|
62
|
+
}
|
|
63
|
+
export function makeTestTable(name, columns) {
|
|
64
|
+
const relId = hashData('table', name, (columns ?? ['id']).join(','));
|
|
65
|
+
const id = new bson.ObjectId('6544e3899293153fa7b38331');
|
|
66
|
+
return new SourceTable(id, SourceTable.DEFAULT_TAG, relId, 'public', name, (columns ?? ['id']).map((column) => ({ name: column, type: 'VARCHAR', typeId: 25 })), true);
|
|
67
|
+
}
|
|
68
|
+
export function getBatchData(batch) {
|
|
69
|
+
const first = getFirst(batch);
|
|
70
|
+
if (first == null) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return first.data.map((d) => {
|
|
74
|
+
return {
|
|
75
|
+
op_id: d.op_id,
|
|
76
|
+
op: d.op,
|
|
77
|
+
object_id: d.object_id,
|
|
78
|
+
checksum: d.checksum
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export function getBatchMeta(batch) {
|
|
83
|
+
const first = getFirst(batch);
|
|
84
|
+
if (first == null) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
has_more: first.has_more,
|
|
89
|
+
after: first.after,
|
|
90
|
+
next_after: first.next_after
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function getFirst(batch) {
|
|
94
|
+
if (!Array.isArray(batch)) {
|
|
95
|
+
return batch.batch;
|
|
96
|
+
}
|
|
97
|
+
if (batch.length == 0) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
let first = batch[0];
|
|
101
|
+
if (first.batch != null) {
|
|
102
|
+
return first.batch;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return first;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Replica id in the old Postgres format, for backwards-compatible tests.
|
|
110
|
+
*/
|
|
111
|
+
export function rid(id) {
|
|
112
|
+
return getUuidReplicaIdentityBson({ id: id }, [{ name: 'id', type: 'VARCHAR', typeId: 25 }]);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getIntersection, hasIntersection } from '@/index.js';
|
|
2
|
+
import { describe, expect, test } from 'vitest';
|
|
3
|
+
describe('utils', () => {
|
|
4
|
+
function testInstersection(a, b, expected) {
|
|
5
|
+
expect(hasIntersection(a, b)).toBe(expected);
|
|
6
|
+
expect(hasIntersection(b, a)).toBe(expected);
|
|
7
|
+
const mapA = new Map([...a].map((v) => [v, 1]));
|
|
8
|
+
const mapB = new Map([...b].map((v) => [v, 1]));
|
|
9
|
+
expect(hasIntersection(mapA, b)).toBe(expected);
|
|
10
|
+
expect(hasIntersection(mapB, a)).toBe(expected);
|
|
11
|
+
expect(hasIntersection(mapA, mapB)).toBe(expected);
|
|
12
|
+
}
|
|
13
|
+
test('hasIntersection', async () => {
|
|
14
|
+
testInstersection(new Set(['a']), new Set(['a']), true);
|
|
15
|
+
testInstersection(new Set(['a', 'b', 'c']), new Set(['a', 'b', 'c']), true);
|
|
16
|
+
testInstersection(new Set(['a', 'b', 'c']), new Set(['d', 'e']), false);
|
|
17
|
+
testInstersection(new Set(['a', 'b', 'c']), new Set(['d', 'c', 'e']), true);
|
|
18
|
+
testInstersection(new Set(['a', 'b', 'c']), new Set(['c', 'e']), true);
|
|
19
|
+
testInstersection(new Set(['a', 'b', 'c', 2]), new Set([1, 2, 3]), true);
|
|
20
|
+
testInstersection(new Set(['a', 'b', 'c', 4]), new Set([1, 2, 3]), false);
|
|
21
|
+
testInstersection(new Set([]), new Set([1, 2, 3]), false);
|
|
22
|
+
testInstersection(new Set([]), new Set([]), false);
|
|
23
|
+
});
|
|
24
|
+
function testGetIntersection(a, b, expected) {
|
|
25
|
+
expect([...getIntersection(a, b)]).toEqual(expected);
|
|
26
|
+
expect([...getIntersection(b, a)]).toEqual(expected);
|
|
27
|
+
const mapA = new Map([...a].map((v) => [v, 1]));
|
|
28
|
+
const mapB = new Map([...b].map((v) => [v, 1]));
|
|
29
|
+
expect([...getIntersection(mapA, b)]).toEqual(expected);
|
|
30
|
+
expect([...getIntersection(mapB, a)]).toEqual(expected);
|
|
31
|
+
expect([...getIntersection(mapA, mapB)]).toEqual(expected);
|
|
32
|
+
}
|
|
33
|
+
test('getIntersection', async () => {
|
|
34
|
+
testGetIntersection(new Set(['a']), new Set(['a']), ['a']);
|
|
35
|
+
testGetIntersection(new Set(['a', 'b', 'c']), new Set(['a', 'b', 'c']), ['a', 'b', 'c']);
|
|
36
|
+
testGetIntersection(new Set(['a', 'b', 'c']), new Set(['d', 'e']), []);
|
|
37
|
+
testGetIntersection(new Set(['a', 'b', 'c']), new Set(['d', 'c', 'e']), ['c']);
|
|
38
|
+
testGetIntersection(new Set(['a', 'b', 'c']), new Set(['c', 'e']), ['c']);
|
|
39
|
+
testGetIntersection(new Set(['a', 'b', 'c', 2]), new Set([1, 2, 3]), [2]);
|
|
40
|
+
testGetIntersection(new Set(['a', 'b', 'c', 4]), new Set([1, 2, 3]), []);
|
|
41
|
+
testGetIntersection(new Set([]), new Set([1, 2, 3]), []);
|
|
42
|
+
testGetIntersection(new Set([]), new Set([]), []);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=util.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.test.js","sourceRoot":"","sources":["../src/util.test.ts"],"names":[],"mappings":"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"}
|