@syncular/client 0.0.1-106 → 0.0.1-109
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/dist/pull-engine.d.ts.map +1 -1
- package/dist/pull-engine.js +241 -34
- package/dist/pull-engine.js.map +1 -1
- package/package.json +1 -1
- package/src/pull-engine.test.ts +147 -0
- package/src/pull-engine.ts +304 -40
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull-engine.d.ts","sourceRoot":"","sources":["../src/pull-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,
|
|
1
|
+
{"version":3,"file":"pull-engine.d.ts","sourceRoot":"","sources":["../src/pull-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAEhB,uBAAuB,EACvB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,KAAK,MAAM,EAAyB,MAAM,QAAQ,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAodzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B;;;OAGG;IACH,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,SAAS,YAAY,EAC5D,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IACT,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAuCD;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,SAAS,YAAY,EAC7D,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,EAC/B,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE;IACT,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB,EACD,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAgL3B;AAED,wBAAsB,YAAY,CAAC,EAAE,SAAS,YAAY,EACxD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,mBAAmB,CAAC,EAAE,CAAC,EAC/B,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAe3B"}
|
package/dist/pull-engine.js
CHANGED
|
@@ -8,6 +8,9 @@ import { sql } from 'kysely';
|
|
|
8
8
|
const jsonCache = new WeakMap();
|
|
9
9
|
const jsonCacheStats = { hits: 0, misses: 0 };
|
|
10
10
|
const SNAPSHOT_CHUNK_CONCURRENCY = 8;
|
|
11
|
+
const SNAPSHOT_APPLY_BATCH_ROWS = 500;
|
|
12
|
+
const SNAPSHOT_ROW_FRAME_MAGIC = new Uint8Array([0x53, 0x52, 0x46, 0x31]); // "SRF1"
|
|
13
|
+
const FRAME_LENGTH_BYTES = 4;
|
|
11
14
|
function serializeJsonCached(obj) {
|
|
12
15
|
if (obj === null || typeof obj !== 'object') {
|
|
13
16
|
return JSON.stringify(obj);
|
|
@@ -28,46 +31,191 @@ function serializeJsonCached(obj) {
|
|
|
28
31
|
function isGzipBytes(bytes) {
|
|
29
32
|
return bytes.length >= 2 && bytes[0] === 0x1f && bytes[1] === 0x8b;
|
|
30
33
|
}
|
|
34
|
+
function bytesToReadableStream(bytes) {
|
|
35
|
+
return new ReadableStream({
|
|
36
|
+
start(controller) {
|
|
37
|
+
controller.enqueue(bytes);
|
|
38
|
+
controller.close();
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function concatBytes(chunks) {
|
|
43
|
+
if (chunks.length === 1) {
|
|
44
|
+
return chunks[0] ?? new Uint8Array();
|
|
45
|
+
}
|
|
46
|
+
let total = 0;
|
|
47
|
+
for (const chunk of chunks)
|
|
48
|
+
total += chunk.length;
|
|
49
|
+
const out = new Uint8Array(total);
|
|
50
|
+
let offset = 0;
|
|
51
|
+
for (const chunk of chunks) {
|
|
52
|
+
out.set(chunk, offset);
|
|
53
|
+
offset += chunk.length;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
function appendBytes(base, next) {
|
|
58
|
+
if (base.length === 0)
|
|
59
|
+
return next;
|
|
60
|
+
if (next.length === 0)
|
|
61
|
+
return base;
|
|
62
|
+
const out = new Uint8Array(base.length + next.length);
|
|
63
|
+
out.set(base, 0);
|
|
64
|
+
out.set(next, base.length);
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
function toOwnedUint8Array(chunk) {
|
|
68
|
+
const out = new ArrayBuffer(chunk.byteLength);
|
|
69
|
+
const bytes = new Uint8Array(out);
|
|
70
|
+
bytes.set(chunk);
|
|
71
|
+
return bytes;
|
|
72
|
+
}
|
|
73
|
+
async function streamToBytes(stream) {
|
|
74
|
+
const reader = stream.getReader();
|
|
75
|
+
try {
|
|
76
|
+
const chunks = [];
|
|
77
|
+
while (true) {
|
|
78
|
+
const { done, value } = await reader.read();
|
|
79
|
+
if (done)
|
|
80
|
+
break;
|
|
81
|
+
if (!value || value.length === 0)
|
|
82
|
+
continue;
|
|
83
|
+
chunks.push(value);
|
|
84
|
+
}
|
|
85
|
+
return concatBytes(chunks);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
reader.releaseLock();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function maybeGunzipStream(stream) {
|
|
92
|
+
const reader = stream.getReader();
|
|
93
|
+
const prefetched = [];
|
|
94
|
+
let prefetchedBytes = 0;
|
|
95
|
+
while (prefetchedBytes < 2) {
|
|
96
|
+
const { done, value } = await reader.read();
|
|
97
|
+
if (done)
|
|
98
|
+
break;
|
|
99
|
+
if (!value || value.length === 0)
|
|
100
|
+
continue;
|
|
101
|
+
prefetched.push(value);
|
|
102
|
+
prefetchedBytes += value.length;
|
|
103
|
+
}
|
|
104
|
+
const prefetchedCombined = concatBytes(prefetched);
|
|
105
|
+
const gzip = isGzipBytes(prefetchedCombined);
|
|
106
|
+
const replayStream = new ReadableStream({
|
|
107
|
+
start(controller) {
|
|
108
|
+
if (prefetchedCombined.length > 0) {
|
|
109
|
+
controller.enqueue(toOwnedUint8Array(prefetchedCombined));
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
async pull(controller) {
|
|
113
|
+
const { done, value } = await reader.read();
|
|
114
|
+
if (done) {
|
|
115
|
+
controller.close();
|
|
116
|
+
reader.releaseLock();
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!value || value.length === 0)
|
|
120
|
+
return;
|
|
121
|
+
controller.enqueue(toOwnedUint8Array(value));
|
|
122
|
+
},
|
|
123
|
+
async cancel(reason) {
|
|
124
|
+
await reader.cancel(reason);
|
|
125
|
+
reader.releaseLock();
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
if (!gzip)
|
|
129
|
+
return replayStream;
|
|
130
|
+
if (typeof DecompressionStream !== 'undefined') {
|
|
131
|
+
return replayStream.pipeThrough(new DecompressionStream('gzip'));
|
|
132
|
+
}
|
|
133
|
+
throw new Error('Snapshot chunk appears gzip-compressed but gzip decompression is not available in this runtime');
|
|
134
|
+
}
|
|
31
135
|
async function maybeGunzip(bytes) {
|
|
32
136
|
if (!isGzipBytes(bytes))
|
|
33
137
|
return bytes;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
138
|
+
const decompressedStream = await maybeGunzipStream(bytesToReadableStream(bytes));
|
|
139
|
+
return streamToBytes(decompressedStream);
|
|
140
|
+
}
|
|
141
|
+
async function* decodeSnapshotRowStreamBatches(stream, batchSize) {
|
|
142
|
+
const reader = stream.getReader();
|
|
143
|
+
const decoder = new TextDecoder();
|
|
144
|
+
let pending = new Uint8Array(0);
|
|
145
|
+
let headerValidated = false;
|
|
146
|
+
let rows = [];
|
|
147
|
+
try {
|
|
148
|
+
while (true) {
|
|
149
|
+
const { done, value } = await reader.read();
|
|
150
|
+
if (done)
|
|
151
|
+
break;
|
|
152
|
+
if (!value || value.length === 0)
|
|
153
|
+
continue;
|
|
154
|
+
pending = appendBytes(pending, value);
|
|
155
|
+
if (!headerValidated) {
|
|
156
|
+
if (pending.length < SNAPSHOT_ROW_FRAME_MAGIC.length) {
|
|
52
157
|
continue;
|
|
53
|
-
|
|
54
|
-
|
|
158
|
+
}
|
|
159
|
+
for (let index = 0; index < SNAPSHOT_ROW_FRAME_MAGIC.length; index++) {
|
|
160
|
+
if (pending[index] !== SNAPSHOT_ROW_FRAME_MAGIC[index]) {
|
|
161
|
+
throw new Error('Unexpected snapshot chunk format');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
pending = pending.subarray(SNAPSHOT_ROW_FRAME_MAGIC.length);
|
|
165
|
+
headerValidated = true;
|
|
55
166
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
167
|
+
while (pending.length >= FRAME_LENGTH_BYTES) {
|
|
168
|
+
const view = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);
|
|
169
|
+
const payloadLength = view.getUint32(0, false);
|
|
170
|
+
if (pending.length < FRAME_LENGTH_BYTES + payloadLength) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
const payload = pending.subarray(FRAME_LENGTH_BYTES, FRAME_LENGTH_BYTES + payloadLength);
|
|
174
|
+
rows.push(JSON.parse(decoder.decode(payload)));
|
|
175
|
+
pending = pending.subarray(FRAME_LENGTH_BYTES + payloadLength);
|
|
176
|
+
if (rows.length >= batchSize) {
|
|
177
|
+
yield rows;
|
|
178
|
+
rows = [];
|
|
179
|
+
}
|
|
61
180
|
}
|
|
62
|
-
return out;
|
|
63
181
|
}
|
|
64
|
-
|
|
65
|
-
|
|
182
|
+
if (!headerValidated) {
|
|
183
|
+
throw new Error('Snapshot chunk payload is too small');
|
|
184
|
+
}
|
|
185
|
+
if (pending.length > 0) {
|
|
186
|
+
if (pending.length < FRAME_LENGTH_BYTES) {
|
|
187
|
+
throw new Error('Snapshot chunk payload ended mid-frame header');
|
|
188
|
+
}
|
|
189
|
+
const view = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);
|
|
190
|
+
const payloadLength = view.getUint32(0, false);
|
|
191
|
+
if (pending.length < FRAME_LENGTH_BYTES + payloadLength) {
|
|
192
|
+
throw new Error('Snapshot chunk payload ended mid-frame body');
|
|
193
|
+
}
|
|
194
|
+
while (pending.length >= FRAME_LENGTH_BYTES) {
|
|
195
|
+
const nextView = new DataView(pending.buffer, pending.byteOffset, pending.byteLength);
|
|
196
|
+
const nextLength = nextView.getUint32(0, false);
|
|
197
|
+
if (pending.length < FRAME_LENGTH_BYTES + nextLength) {
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
const payload = pending.subarray(FRAME_LENGTH_BYTES, FRAME_LENGTH_BYTES + nextLength);
|
|
201
|
+
rows.push(JSON.parse(decoder.decode(payload)));
|
|
202
|
+
pending = pending.subarray(FRAME_LENGTH_BYTES + nextLength);
|
|
203
|
+
if (rows.length >= batchSize) {
|
|
204
|
+
yield rows;
|
|
205
|
+
rows = [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (pending.length > 0) {
|
|
209
|
+
throw new Error('Snapshot chunk payload ended mid-frame body');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (rows.length > 0) {
|
|
213
|
+
yield rows;
|
|
66
214
|
}
|
|
67
215
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
216
|
+
finally {
|
|
217
|
+
reader.releaseLock();
|
|
218
|
+
}
|
|
71
219
|
}
|
|
72
220
|
async function computeSha256Hex(bytes) {
|
|
73
221
|
// Use crypto.subtle if available (browsers, modern Node/Bun)
|
|
@@ -88,6 +236,13 @@ async function computeSha256Hex(bytes) {
|
|
|
88
236
|
throw new Error('No crypto implementation available for SHA-256. ' +
|
|
89
237
|
'Ensure crypto.subtle is available or running in Node.js/Bun.');
|
|
90
238
|
}
|
|
239
|
+
async function fetchSnapshotChunkStream(transport, chunkId) {
|
|
240
|
+
if (transport.fetchSnapshotChunkStream) {
|
|
241
|
+
return transport.fetchSnapshotChunkStream({ chunkId });
|
|
242
|
+
}
|
|
243
|
+
const bytes = await transport.fetchSnapshotChunk({ chunkId });
|
|
244
|
+
return bytesToReadableStream(bytes);
|
|
245
|
+
}
|
|
91
246
|
async function mapWithConcurrency(items, concurrency, mapper) {
|
|
92
247
|
if (items.length === 0)
|
|
93
248
|
return [];
|
|
@@ -146,6 +301,50 @@ async function materializeChunkedSnapshots(transport, response) {
|
|
|
146
301
|
chunkCache.clear();
|
|
147
302
|
return { ...response, subscriptions };
|
|
148
303
|
}
|
|
304
|
+
async function applyChunkedSnapshot(transport, handler, trx, snapshot) {
|
|
305
|
+
const chunks = snapshot.chunks ?? [];
|
|
306
|
+
if (chunks.length === 0) {
|
|
307
|
+
await handler.applySnapshot({ trx }, snapshot);
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
let nextIsFirstPage = snapshot.isFirstPage;
|
|
311
|
+
for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex += 1) {
|
|
312
|
+
const chunk = chunks[chunkIndex];
|
|
313
|
+
if (!chunk)
|
|
314
|
+
continue;
|
|
315
|
+
const rawStream = await fetchSnapshotChunkStream(transport, chunk.id);
|
|
316
|
+
const decodedStream = await maybeGunzipStream(rawStream);
|
|
317
|
+
const rowBatchIterator = decodeSnapshotRowStreamBatches(decodedStream, SNAPSHOT_APPLY_BATCH_ROWS);
|
|
318
|
+
let pendingBatch = null;
|
|
319
|
+
// eslint-disable-next-line no-await-in-loop
|
|
320
|
+
for await (const batch of rowBatchIterator) {
|
|
321
|
+
if (pendingBatch) {
|
|
322
|
+
// eslint-disable-next-line no-await-in-loop
|
|
323
|
+
await handler.applySnapshot({ trx }, {
|
|
324
|
+
...snapshot,
|
|
325
|
+
rows: pendingBatch,
|
|
326
|
+
chunks: undefined,
|
|
327
|
+
isFirstPage: nextIsFirstPage,
|
|
328
|
+
isLastPage: false,
|
|
329
|
+
});
|
|
330
|
+
nextIsFirstPage = false;
|
|
331
|
+
}
|
|
332
|
+
pendingBatch = batch;
|
|
333
|
+
}
|
|
334
|
+
if (pendingBatch) {
|
|
335
|
+
const isLastChunk = chunkIndex === chunks.length - 1;
|
|
336
|
+
// eslint-disable-next-line no-await-in-loop
|
|
337
|
+
await handler.applySnapshot({ trx }, {
|
|
338
|
+
...snapshot,
|
|
339
|
+
rows: pendingBatch,
|
|
340
|
+
chunks: undefined,
|
|
341
|
+
isFirstPage: nextIsFirstPage,
|
|
342
|
+
isLastPage: isLastChunk ? snapshot.isLastPage : false,
|
|
343
|
+
});
|
|
344
|
+
nextIsFirstPage = false;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
149
348
|
function parseBootstrapState(value) {
|
|
150
349
|
if (!value)
|
|
151
350
|
return null;
|
|
@@ -215,13 +414,15 @@ export async function buildPullRequest(db, options) {
|
|
|
215
414
|
*/
|
|
216
415
|
export async function applyPullResponse(db, transport, shapes, options, pullState, rawResponse) {
|
|
217
416
|
const { request, existing, existingById, stateId } = pullState;
|
|
218
|
-
const hydrated = await materializeChunkedSnapshots(transport, rawResponse);
|
|
219
417
|
const ctx = {
|
|
220
418
|
actorId: options.actorId ?? 'unknown',
|
|
221
419
|
clientId: options.clientId,
|
|
222
420
|
};
|
|
223
421
|
const plugins = options.plugins ?? [];
|
|
224
|
-
|
|
422
|
+
const requiresMaterializedSnapshots = plugins.some((plugin) => !!plugin.afterPull);
|
|
423
|
+
let responseToApply = requiresMaterializedSnapshots
|
|
424
|
+
? await materializeChunkedSnapshots(transport, rawResponse)
|
|
425
|
+
: rawResponse;
|
|
225
426
|
for (const plugin of plugins) {
|
|
226
427
|
if (!plugin.afterPull)
|
|
227
428
|
continue;
|
|
@@ -288,6 +489,7 @@ export async function applyPullResponse(db, transport, shapes, options, pullStat
|
|
|
288
489
|
if (sub.bootstrap) {
|
|
289
490
|
for (const snapshot of sub.snapshots ?? []) {
|
|
290
491
|
const handler = shapes.getOrThrow(snapshot.table);
|
|
492
|
+
const hasChunkRefs = Array.isArray(snapshot.chunks) && snapshot.chunks.length > 0;
|
|
291
493
|
// Call onSnapshotStart hook when starting a new snapshot
|
|
292
494
|
if (snapshot.isFirstPage && handler.onSnapshotStart) {
|
|
293
495
|
await handler.onSnapshotStart({
|
|
@@ -296,7 +498,12 @@ export async function applyPullResponse(db, transport, shapes, options, pullStat
|
|
|
296
498
|
scopes: sub.scopes,
|
|
297
499
|
});
|
|
298
500
|
}
|
|
299
|
-
|
|
501
|
+
if (hasChunkRefs) {
|
|
502
|
+
await applyChunkedSnapshot(transport, handler, trx, snapshot);
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
await handler.applySnapshot({ trx }, snapshot);
|
|
506
|
+
}
|
|
300
507
|
// Call onSnapshotEnd hook when snapshot is complete
|
|
301
508
|
if (snapshot.isLastPage && handler.onSnapshotEnd) {
|
|
302
509
|
await handler.onSnapshotEnd({
|
package/dist/pull-engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull-engine.js","sourceRoot":"","sources":["../src/pull-engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pull-engine.js","sourceRoot":"","sources":["../src/pull-engine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
|
|
2
|
+
import { gzipSync } from 'node:zlib';
|
|
3
|
+
import {
|
|
4
|
+
encodeSnapshotRows,
|
|
5
|
+
type SyncPullResponse,
|
|
6
|
+
type SyncTransport,
|
|
7
|
+
} from '@syncular/core';
|
|
8
|
+
import { type Kysely, sql } from 'kysely';
|
|
9
|
+
import { createBunSqliteDb } from '../../dialect-bun-sqlite/src';
|
|
10
|
+
import { createClientHandler } from './handlers/create-handler';
|
|
11
|
+
import { ClientTableRegistry } from './handlers/registry';
|
|
12
|
+
import { ensureClientSyncSchema } from './migrate';
|
|
13
|
+
import { applyPullResponse, buildPullRequest } from './pull-engine';
|
|
14
|
+
import type { SyncClientDb } from './schema';
|
|
15
|
+
|
|
16
|
+
interface ItemsTable {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface TestDb extends SyncClientDb {
|
|
22
|
+
items: ItemsTable;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function createStreamFromBytes(
|
|
26
|
+
bytes: Uint8Array,
|
|
27
|
+
chunkSize = 1024
|
|
28
|
+
): ReadableStream<Uint8Array> {
|
|
29
|
+
return new ReadableStream<Uint8Array>({
|
|
30
|
+
start(controller) {
|
|
31
|
+
for (let index = 0; index < bytes.length; index += chunkSize) {
|
|
32
|
+
controller.enqueue(bytes.subarray(index, index + chunkSize));
|
|
33
|
+
}
|
|
34
|
+
controller.close();
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe('applyPullResponse chunk streaming', () => {
|
|
40
|
+
let db: Kysely<TestDb>;
|
|
41
|
+
|
|
42
|
+
beforeEach(async () => {
|
|
43
|
+
db = createBunSqliteDb<TestDb>({ path: ':memory:' });
|
|
44
|
+
await ensureClientSyncSchema(db);
|
|
45
|
+
await db.schema
|
|
46
|
+
.createTable('items')
|
|
47
|
+
.addColumn('id', 'text', (col) => col.primaryKey())
|
|
48
|
+
.addColumn('name', 'text', (col) => col.notNull())
|
|
49
|
+
.execute();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
afterEach(async () => {
|
|
53
|
+
await db.destroy();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('applies chunked bootstrap snapshots using streaming transport', async () => {
|
|
57
|
+
const rows = Array.from({ length: 5000 }, (_, index) => ({
|
|
58
|
+
id: `${index + 1}`,
|
|
59
|
+
name: `Item ${index + 1}`,
|
|
60
|
+
}));
|
|
61
|
+
const encoded = encodeSnapshotRows(rows);
|
|
62
|
+
const compressed = new Uint8Array(gzipSync(encoded));
|
|
63
|
+
|
|
64
|
+
let streamFetchCount = 0;
|
|
65
|
+
const transport: SyncTransport = {
|
|
66
|
+
async sync() {
|
|
67
|
+
return {};
|
|
68
|
+
},
|
|
69
|
+
async fetchSnapshotChunk() {
|
|
70
|
+
throw new Error('fetchSnapshotChunk should not be used');
|
|
71
|
+
},
|
|
72
|
+
async fetchSnapshotChunkStream() {
|
|
73
|
+
streamFetchCount += 1;
|
|
74
|
+
return createStreamFromBytes(compressed, 257);
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const shapes = new ClientTableRegistry<TestDb>().register(
|
|
79
|
+
createClientHandler({
|
|
80
|
+
table: 'items',
|
|
81
|
+
scopes: ['items:{id}'],
|
|
82
|
+
})
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const options = {
|
|
86
|
+
clientId: 'client-1',
|
|
87
|
+
subscriptions: [
|
|
88
|
+
{
|
|
89
|
+
id: 'items-sub',
|
|
90
|
+
shape: 'items',
|
|
91
|
+
scopes: {},
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
stateId: 'default',
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const pullState = await buildPullRequest(db, options);
|
|
98
|
+
|
|
99
|
+
const response: SyncPullResponse = {
|
|
100
|
+
ok: true,
|
|
101
|
+
subscriptions: [
|
|
102
|
+
{
|
|
103
|
+
id: 'items-sub',
|
|
104
|
+
status: 'active',
|
|
105
|
+
scopes: {},
|
|
106
|
+
bootstrap: true,
|
|
107
|
+
bootstrapState: null,
|
|
108
|
+
nextCursor: 1,
|
|
109
|
+
commits: [],
|
|
110
|
+
snapshots: [
|
|
111
|
+
{
|
|
112
|
+
table: 'items',
|
|
113
|
+
rows: [],
|
|
114
|
+
chunks: [
|
|
115
|
+
{
|
|
116
|
+
id: 'chunk-1',
|
|
117
|
+
byteLength: compressed.length,
|
|
118
|
+
sha256: '',
|
|
119
|
+
encoding: 'json-row-frame-v1',
|
|
120
|
+
compression: 'gzip',
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
isFirstPage: true,
|
|
124
|
+
isLastPage: true,
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
await applyPullResponse(
|
|
132
|
+
db,
|
|
133
|
+
transport,
|
|
134
|
+
shapes,
|
|
135
|
+
options,
|
|
136
|
+
pullState,
|
|
137
|
+
response
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const countResult = await sql<{ count: number }>`
|
|
141
|
+
select count(*) as count
|
|
142
|
+
from ${sql.table('items')}
|
|
143
|
+
`.execute(db);
|
|
144
|
+
expect(Number(countResult.rows[0]?.count ?? 0)).toBe(rows.length);
|
|
145
|
+
expect(streamFetchCount).toBe(1);
|
|
146
|
+
});
|
|
147
|
+
});
|
package/src/pull-engine.ts
CHANGED
|
@@ -6,12 +6,14 @@ import type {
|
|
|
6
6
|
SyncBootstrapState,
|
|
7
7
|
SyncPullRequest,
|
|
8
8
|
SyncPullResponse,
|
|
9
|
+
SyncSnapshot,
|
|
9
10
|
SyncSubscriptionRequest,
|
|
10
11
|
SyncTransport,
|
|
11
12
|
} from '@syncular/core';
|
|
12
13
|
import { decodeSnapshotRows } from '@syncular/core';
|
|
13
|
-
import { type Kysely, sql } from 'kysely';
|
|
14
|
+
import { type Kysely, sql, type Transaction } from 'kysely';
|
|
14
15
|
import type { ClientTableRegistry } from './handlers/registry';
|
|
16
|
+
import type { ClientTableHandler } from './handlers/types';
|
|
15
17
|
import type {
|
|
16
18
|
SyncClientPlugin,
|
|
17
19
|
SyncClientPluginContext,
|
|
@@ -23,6 +25,9 @@ import type { SyncClientDb, SyncSubscriptionStateTable } from './schema';
|
|
|
23
25
|
const jsonCache = new WeakMap<object, string>();
|
|
24
26
|
const jsonCacheStats = { hits: 0, misses: 0 };
|
|
25
27
|
const SNAPSHOT_CHUNK_CONCURRENCY = 8;
|
|
28
|
+
const SNAPSHOT_APPLY_BATCH_ROWS = 500;
|
|
29
|
+
const SNAPSHOT_ROW_FRAME_MAGIC = new Uint8Array([0x53, 0x52, 0x46, 0x31]); // "SRF1"
|
|
30
|
+
const FRAME_LENGTH_BYTES = 4;
|
|
26
31
|
|
|
27
32
|
function serializeJsonCached(obj: object): string {
|
|
28
33
|
if (obj === null || typeof obj !== 'object') {
|
|
@@ -46,53 +51,229 @@ function isGzipBytes(bytes: Uint8Array): boolean {
|
|
|
46
51
|
return bytes.length >= 2 && bytes[0] === 0x1f && bytes[1] === 0x8b;
|
|
47
52
|
}
|
|
48
53
|
|
|
49
|
-
|
|
50
|
-
|
|
54
|
+
function bytesToReadableStream(bytes: Uint8Array): ReadableStream<Uint8Array> {
|
|
55
|
+
return new ReadableStream<Uint8Array>({
|
|
56
|
+
start(controller) {
|
|
57
|
+
controller.enqueue(bytes);
|
|
58
|
+
controller.close();
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
51
62
|
|
|
52
|
-
|
|
53
|
-
if (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
function concatBytes(chunks: readonly Uint8Array[]): Uint8Array {
|
|
64
|
+
if (chunks.length === 1) {
|
|
65
|
+
return chunks[0] ?? new Uint8Array();
|
|
66
|
+
}
|
|
67
|
+
let total = 0;
|
|
68
|
+
for (const chunk of chunks) total += chunk.length;
|
|
69
|
+
const out = new Uint8Array(total);
|
|
70
|
+
let offset = 0;
|
|
71
|
+
for (const chunk of chunks) {
|
|
72
|
+
out.set(chunk, offset);
|
|
73
|
+
offset += chunk.length;
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
60
77
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
78
|
+
function appendBytes(base: Uint8Array, next: Uint8Array): Uint8Array {
|
|
79
|
+
if (base.length === 0) return next;
|
|
80
|
+
if (next.length === 0) return base;
|
|
81
|
+
const out = new Uint8Array(base.length + next.length);
|
|
82
|
+
out.set(base, 0);
|
|
83
|
+
out.set(next, base.length);
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function toOwnedUint8Array(chunk: Uint8Array): Uint8Array<ArrayBuffer> {
|
|
88
|
+
const out = new ArrayBuffer(chunk.byteLength);
|
|
89
|
+
const bytes = new Uint8Array(out);
|
|
90
|
+
bytes.set(chunk);
|
|
91
|
+
return bytes;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function streamToBytes(
|
|
95
|
+
stream: ReadableStream<Uint8Array>
|
|
96
|
+
): Promise<Uint8Array> {
|
|
97
|
+
const reader = stream.getReader();
|
|
98
|
+
try {
|
|
99
|
+
const chunks: Uint8Array[] = [];
|
|
100
|
+
while (true) {
|
|
101
|
+
const { done, value } = await reader.read();
|
|
102
|
+
if (done) break;
|
|
103
|
+
if (!value || value.length === 0) continue;
|
|
104
|
+
chunks.push(value);
|
|
105
|
+
}
|
|
106
|
+
return concatBytes(chunks);
|
|
107
|
+
} finally {
|
|
108
|
+
reader.releaseLock();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function maybeGunzipStream(
|
|
113
|
+
stream: ReadableStream<Uint8Array>
|
|
114
|
+
): Promise<ReadableStream<Uint8Array>> {
|
|
115
|
+
const reader = stream.getReader();
|
|
116
|
+
const prefetched: Uint8Array[] = [];
|
|
117
|
+
let prefetchedBytes = 0;
|
|
118
|
+
|
|
119
|
+
while (prefetchedBytes < 2) {
|
|
120
|
+
const { done, value } = await reader.read();
|
|
121
|
+
if (done) break;
|
|
122
|
+
if (!value || value.length === 0) continue;
|
|
123
|
+
prefetched.push(value);
|
|
124
|
+
prefetchedBytes += value.length;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const prefetchedCombined = concatBytes(prefetched);
|
|
128
|
+
const gzip = isGzipBytes(prefetchedCombined);
|
|
76
129
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
offset += chunk.length;
|
|
130
|
+
const replayStream = new ReadableStream<Uint8Array<ArrayBuffer>>({
|
|
131
|
+
start(controller) {
|
|
132
|
+
if (prefetchedCombined.length > 0) {
|
|
133
|
+
controller.enqueue(toOwnedUint8Array(prefetchedCombined));
|
|
82
134
|
}
|
|
83
|
-
|
|
84
|
-
|
|
135
|
+
},
|
|
136
|
+
async pull(controller) {
|
|
137
|
+
const { done, value } = await reader.read();
|
|
138
|
+
if (done) {
|
|
139
|
+
controller.close();
|
|
140
|
+
reader.releaseLock();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (!value || value.length === 0) return;
|
|
144
|
+
controller.enqueue(toOwnedUint8Array(value));
|
|
145
|
+
},
|
|
146
|
+
async cancel(reason) {
|
|
147
|
+
await reader.cancel(reason);
|
|
85
148
|
reader.releaseLock();
|
|
86
|
-
}
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
if (!gzip) return replayStream;
|
|
153
|
+
|
|
154
|
+
if (typeof DecompressionStream !== 'undefined') {
|
|
155
|
+
return replayStream.pipeThrough(new DecompressionStream('gzip'));
|
|
87
156
|
}
|
|
88
157
|
|
|
89
|
-
// If the runtime didn't auto-decompress `Content-Encoding: gzip`, and doesn't
|
|
90
|
-
// support DecompressionStream, we can't safely decode the chunk.
|
|
91
158
|
throw new Error(
|
|
92
159
|
'Snapshot chunk appears gzip-compressed but gzip decompression is not available in this runtime'
|
|
93
160
|
);
|
|
94
161
|
}
|
|
95
162
|
|
|
163
|
+
async function maybeGunzip(bytes: Uint8Array): Promise<Uint8Array> {
|
|
164
|
+
if (!isGzipBytes(bytes)) return bytes;
|
|
165
|
+
const decompressedStream = await maybeGunzipStream(
|
|
166
|
+
bytesToReadableStream(bytes)
|
|
167
|
+
);
|
|
168
|
+
return streamToBytes(decompressedStream);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function* decodeSnapshotRowStreamBatches(
|
|
172
|
+
stream: ReadableStream<Uint8Array>,
|
|
173
|
+
batchSize: number
|
|
174
|
+
): AsyncGenerator<unknown[]> {
|
|
175
|
+
const reader = stream.getReader();
|
|
176
|
+
const decoder = new TextDecoder();
|
|
177
|
+
let pending: Uint8Array = new Uint8Array(0);
|
|
178
|
+
let headerValidated = false;
|
|
179
|
+
let rows: unknown[] = [];
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
while (true) {
|
|
183
|
+
const { done, value } = await reader.read();
|
|
184
|
+
if (done) break;
|
|
185
|
+
if (!value || value.length === 0) continue;
|
|
186
|
+
pending = appendBytes(pending, value);
|
|
187
|
+
|
|
188
|
+
if (!headerValidated) {
|
|
189
|
+
if (pending.length < SNAPSHOT_ROW_FRAME_MAGIC.length) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
for (let index = 0; index < SNAPSHOT_ROW_FRAME_MAGIC.length; index++) {
|
|
193
|
+
if (pending[index] !== SNAPSHOT_ROW_FRAME_MAGIC[index]) {
|
|
194
|
+
throw new Error('Unexpected snapshot chunk format');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
pending = pending.subarray(SNAPSHOT_ROW_FRAME_MAGIC.length);
|
|
198
|
+
headerValidated = true;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
while (pending.length >= FRAME_LENGTH_BYTES) {
|
|
202
|
+
const view = new DataView(
|
|
203
|
+
pending.buffer,
|
|
204
|
+
pending.byteOffset,
|
|
205
|
+
pending.byteLength
|
|
206
|
+
);
|
|
207
|
+
const payloadLength = view.getUint32(0, false);
|
|
208
|
+
if (pending.length < FRAME_LENGTH_BYTES + payloadLength) {
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const payload = pending.subarray(
|
|
213
|
+
FRAME_LENGTH_BYTES,
|
|
214
|
+
FRAME_LENGTH_BYTES + payloadLength
|
|
215
|
+
);
|
|
216
|
+
rows.push(JSON.parse(decoder.decode(payload)));
|
|
217
|
+
pending = pending.subarray(FRAME_LENGTH_BYTES + payloadLength);
|
|
218
|
+
|
|
219
|
+
if (rows.length >= batchSize) {
|
|
220
|
+
yield rows;
|
|
221
|
+
rows = [];
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (!headerValidated) {
|
|
227
|
+
throw new Error('Snapshot chunk payload is too small');
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (pending.length > 0) {
|
|
231
|
+
if (pending.length < FRAME_LENGTH_BYTES) {
|
|
232
|
+
throw new Error('Snapshot chunk payload ended mid-frame header');
|
|
233
|
+
}
|
|
234
|
+
const view = new DataView(
|
|
235
|
+
pending.buffer,
|
|
236
|
+
pending.byteOffset,
|
|
237
|
+
pending.byteLength
|
|
238
|
+
);
|
|
239
|
+
const payloadLength = view.getUint32(0, false);
|
|
240
|
+
if (pending.length < FRAME_LENGTH_BYTES + payloadLength) {
|
|
241
|
+
throw new Error('Snapshot chunk payload ended mid-frame body');
|
|
242
|
+
}
|
|
243
|
+
while (pending.length >= FRAME_LENGTH_BYTES) {
|
|
244
|
+
const nextView = new DataView(
|
|
245
|
+
pending.buffer,
|
|
246
|
+
pending.byteOffset,
|
|
247
|
+
pending.byteLength
|
|
248
|
+
);
|
|
249
|
+
const nextLength = nextView.getUint32(0, false);
|
|
250
|
+
if (pending.length < FRAME_LENGTH_BYTES + nextLength) {
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
const payload = pending.subarray(
|
|
254
|
+
FRAME_LENGTH_BYTES,
|
|
255
|
+
FRAME_LENGTH_BYTES + nextLength
|
|
256
|
+
);
|
|
257
|
+
rows.push(JSON.parse(decoder.decode(payload)));
|
|
258
|
+
pending = pending.subarray(FRAME_LENGTH_BYTES + nextLength);
|
|
259
|
+
if (rows.length >= batchSize) {
|
|
260
|
+
yield rows;
|
|
261
|
+
rows = [];
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (pending.length > 0) {
|
|
265
|
+
throw new Error('Snapshot chunk payload ended mid-frame body');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (rows.length > 0) {
|
|
270
|
+
yield rows;
|
|
271
|
+
}
|
|
272
|
+
} finally {
|
|
273
|
+
reader.releaseLock();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
96
277
|
async function computeSha256Hex(bytes: Uint8Array): Promise<string> {
|
|
97
278
|
// Use crypto.subtle if available (browsers, modern Node/Bun)
|
|
98
279
|
if (typeof crypto !== 'undefined' && crypto.subtle) {
|
|
@@ -119,6 +300,17 @@ async function computeSha256Hex(bytes: Uint8Array): Promise<string> {
|
|
|
119
300
|
);
|
|
120
301
|
}
|
|
121
302
|
|
|
303
|
+
async function fetchSnapshotChunkStream(
|
|
304
|
+
transport: SyncTransport,
|
|
305
|
+
chunkId: string
|
|
306
|
+
): Promise<ReadableStream<Uint8Array>> {
|
|
307
|
+
if (transport.fetchSnapshotChunkStream) {
|
|
308
|
+
return transport.fetchSnapshotChunkStream({ chunkId });
|
|
309
|
+
}
|
|
310
|
+
const bytes = await transport.fetchSnapshotChunk({ chunkId });
|
|
311
|
+
return bytesToReadableStream(bytes);
|
|
312
|
+
}
|
|
313
|
+
|
|
122
314
|
async function mapWithConcurrency<T, U>(
|
|
123
315
|
items: readonly T[],
|
|
124
316
|
concurrency: number,
|
|
@@ -209,6 +401,69 @@ async function materializeChunkedSnapshots(
|
|
|
209
401
|
return { ...response, subscriptions };
|
|
210
402
|
}
|
|
211
403
|
|
|
404
|
+
async function applyChunkedSnapshot<DB extends SyncClientDb>(
|
|
405
|
+
transport: SyncTransport,
|
|
406
|
+
handler: Pick<ClientTableHandler<DB>, 'applySnapshot'>,
|
|
407
|
+
trx: Transaction<DB>,
|
|
408
|
+
snapshot: SyncSnapshot
|
|
409
|
+
): Promise<void> {
|
|
410
|
+
const chunks = snapshot.chunks ?? [];
|
|
411
|
+
if (chunks.length === 0) {
|
|
412
|
+
await handler.applySnapshot({ trx }, snapshot);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
let nextIsFirstPage = snapshot.isFirstPage;
|
|
417
|
+
|
|
418
|
+
for (let chunkIndex = 0; chunkIndex < chunks.length; chunkIndex += 1) {
|
|
419
|
+
const chunk = chunks[chunkIndex];
|
|
420
|
+
if (!chunk) continue;
|
|
421
|
+
|
|
422
|
+
const rawStream = await fetchSnapshotChunkStream(transport, chunk.id);
|
|
423
|
+
const decodedStream = await maybeGunzipStream(rawStream);
|
|
424
|
+
const rowBatchIterator = decodeSnapshotRowStreamBatches(
|
|
425
|
+
decodedStream,
|
|
426
|
+
SNAPSHOT_APPLY_BATCH_ROWS
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
let pendingBatch: unknown[] | null = null;
|
|
430
|
+
// eslint-disable-next-line no-await-in-loop
|
|
431
|
+
for await (const batch of rowBatchIterator) {
|
|
432
|
+
if (pendingBatch) {
|
|
433
|
+
// eslint-disable-next-line no-await-in-loop
|
|
434
|
+
await handler.applySnapshot(
|
|
435
|
+
{ trx },
|
|
436
|
+
{
|
|
437
|
+
...snapshot,
|
|
438
|
+
rows: pendingBatch,
|
|
439
|
+
chunks: undefined,
|
|
440
|
+
isFirstPage: nextIsFirstPage,
|
|
441
|
+
isLastPage: false,
|
|
442
|
+
}
|
|
443
|
+
);
|
|
444
|
+
nextIsFirstPage = false;
|
|
445
|
+
}
|
|
446
|
+
pendingBatch = batch;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
if (pendingBatch) {
|
|
450
|
+
const isLastChunk = chunkIndex === chunks.length - 1;
|
|
451
|
+
// eslint-disable-next-line no-await-in-loop
|
|
452
|
+
await handler.applySnapshot(
|
|
453
|
+
{ trx },
|
|
454
|
+
{
|
|
455
|
+
...snapshot,
|
|
456
|
+
rows: pendingBatch,
|
|
457
|
+
chunks: undefined,
|
|
458
|
+
isFirstPage: nextIsFirstPage,
|
|
459
|
+
isLastPage: isLastChunk ? snapshot.isLastPage : false,
|
|
460
|
+
}
|
|
461
|
+
);
|
|
462
|
+
nextIsFirstPage = false;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
|
|
212
467
|
function parseBootstrapState(
|
|
213
468
|
value: string | object | null | undefined
|
|
214
469
|
): SyncBootstrapState | null {
|
|
@@ -319,15 +574,18 @@ export async function applyPullResponse<DB extends SyncClientDb>(
|
|
|
319
574
|
): Promise<SyncPullResponse> {
|
|
320
575
|
const { request, existing, existingById, stateId } = pullState;
|
|
321
576
|
|
|
322
|
-
const hydrated = await materializeChunkedSnapshots(transport, rawResponse);
|
|
323
|
-
|
|
324
577
|
const ctx: SyncClientPluginContext = {
|
|
325
578
|
actorId: options.actorId ?? 'unknown',
|
|
326
579
|
clientId: options.clientId,
|
|
327
580
|
};
|
|
328
581
|
const plugins = options.plugins ?? [];
|
|
582
|
+
const requiresMaterializedSnapshots = plugins.some(
|
|
583
|
+
(plugin) => !!plugin.afterPull
|
|
584
|
+
);
|
|
329
585
|
|
|
330
|
-
let responseToApply =
|
|
586
|
+
let responseToApply = requiresMaterializedSnapshots
|
|
587
|
+
? await materializeChunkedSnapshots(transport, rawResponse)
|
|
588
|
+
: rawResponse;
|
|
331
589
|
for (const plugin of plugins) {
|
|
332
590
|
if (!plugin.afterPull) continue;
|
|
333
591
|
responseToApply = await plugin.afterPull(ctx, {
|
|
@@ -398,6 +656,8 @@ export async function applyPullResponse<DB extends SyncClientDb>(
|
|
|
398
656
|
if (sub.bootstrap) {
|
|
399
657
|
for (const snapshot of sub.snapshots ?? []) {
|
|
400
658
|
const handler = shapes.getOrThrow(snapshot.table);
|
|
659
|
+
const hasChunkRefs =
|
|
660
|
+
Array.isArray(snapshot.chunks) && snapshot.chunks.length > 0;
|
|
401
661
|
|
|
402
662
|
// Call onSnapshotStart hook when starting a new snapshot
|
|
403
663
|
if (snapshot.isFirstPage && handler.onSnapshotStart) {
|
|
@@ -408,7 +668,11 @@ export async function applyPullResponse<DB extends SyncClientDb>(
|
|
|
408
668
|
});
|
|
409
669
|
}
|
|
410
670
|
|
|
411
|
-
|
|
671
|
+
if (hasChunkRefs) {
|
|
672
|
+
await applyChunkedSnapshot(transport, handler, trx, snapshot);
|
|
673
|
+
} else {
|
|
674
|
+
await handler.applySnapshot({ trx }, snapshot);
|
|
675
|
+
}
|
|
412
676
|
|
|
413
677
|
// Call onSnapshotEnd hook when snapshot is complete
|
|
414
678
|
if (snapshot.isLastPage && handler.onSnapshotEnd) {
|