@syncular/core 0.0.1-97 → 0.0.1-98
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/sync.d.ts +5 -5
- package/dist/schemas/sync.d.ts.map +1 -1
- package/dist/schemas/sync.js +3 -2
- package/dist/schemas/sync.js.map +1 -1
- package/dist/snapshot-chunks.d.ts +26 -0
- package/dist/snapshot-chunks.d.ts.map +1 -0
- package/dist/snapshot-chunks.js +89 -0
- package/dist/snapshot-chunks.js.map +1 -0
- package/package.json +2 -1
- package/src/index.ts +2 -0
- package/src/schemas/sync.ts +6 -2
- package/src/snapshot-chunks.ts +112 -0
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,cAAc,SAAS,CAAC;AAExB,cAAc,YAAY,CAAC;AAE3B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,UAAU,CAAC;AAEzB,cAAc,SAAS,CAAC;AAExB,cAAc,WAAW,CAAC;AAE1B,cAAc,UAAU,CAAC;AAEzB,cAAc,aAAa,CAAC;AAE5B,cAAc,cAAc,CAAC;AAE7B,cAAc,SAAS,CAAC;AAExB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,cAAc,SAAS,CAAC;AAExB,cAAc,YAAY,CAAC;AAE3B,cAAc,oBAAoB,CAAC;AAEnC,cAAc,UAAU,CAAC;AAEzB,cAAc,SAAS,CAAC;AAExB,cAAc,WAAW,CAAC;AAE1B,cAAc,UAAU,CAAC;AAEzB,cAAc,mBAAmB,CAAC;AAElC,cAAc,aAAa,CAAC;AAE5B,cAAc,cAAc,CAAC;AAE7B,cAAc,SAAS,CAAC;AAExB,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,8 @@ export * from './proxy/index.js';
|
|
|
23
23
|
export * from './schemas/index.js';
|
|
24
24
|
// Scope types, patterns, and utilities
|
|
25
25
|
export * from './scopes/index.js';
|
|
26
|
+
// Snapshot chunk encoding helpers
|
|
27
|
+
export * from './snapshot-chunks.js';
|
|
26
28
|
// Telemetry abstraction
|
|
27
29
|
export * from './telemetry.js';
|
|
28
30
|
// Data transformation hooks
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,kFAAkF;AAClF,cAAc,SAAS,CAAC;AACxB,+BAA+B;AAC/B,cAAc,YAAY,CAAC;AAC3B,0BAA0B;AAC1B,cAAc,oBAAoB,CAAC;AACnC,oBAAoB;AACpB,cAAc,UAAU,CAAC;AACzB,uBAAuB;AACvB,cAAc,SAAS,CAAC;AACxB,gBAAgB;AAChB,cAAc,WAAW,CAAC;AAC1B,uCAAuC;AACvC,cAAc,UAAU,CAAC;AACzB,wBAAwB;AACxB,cAAc,aAAa,CAAC;AAC5B,4BAA4B;AAC5B,cAAc,cAAc,CAAC;AAC7B,oEAAoE;AACpE,cAAc,SAAS,CAAC;AACxB,2BAA2B;AAC3B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,kFAAkF;AAClF,cAAc,SAAS,CAAC;AACxB,+BAA+B;AAC/B,cAAc,YAAY,CAAC;AAC3B,0BAA0B;AAC1B,cAAc,oBAAoB,CAAC;AACnC,oBAAoB;AACpB,cAAc,UAAU,CAAC;AACzB,uBAAuB;AACvB,cAAc,SAAS,CAAC;AACxB,gBAAgB;AAChB,cAAc,WAAW,CAAC;AAC1B,uCAAuC;AACvC,cAAc,UAAU,CAAC;AACzB,kCAAkC;AAClC,cAAc,mBAAmB,CAAC;AAClC,wBAAwB;AACxB,cAAc,aAAa,CAAC;AAC5B,4BAA4B;AAC5B,cAAc,cAAc,CAAC;AAC7B,oEAAoE;AACpE,cAAc,SAAS,CAAC;AACxB,2BAA2B;AAC3B,cAAc,SAAS,CAAC"}
|
package/dist/schemas/sync.d.ts
CHANGED
|
@@ -161,7 +161,7 @@ export declare const SyncSnapshotChunkRefSchema: z.ZodObject<{
|
|
|
161
161
|
id: z.ZodString;
|
|
162
162
|
byteLength: z.ZodNumber;
|
|
163
163
|
sha256: z.ZodString;
|
|
164
|
-
encoding: z.ZodLiteral<"
|
|
164
|
+
encoding: z.ZodLiteral<"json-row-frame-v1">;
|
|
165
165
|
compression: z.ZodLiteral<"gzip">;
|
|
166
166
|
}, z.core.$strip>;
|
|
167
167
|
export type SyncSnapshotChunkRef = z.infer<typeof SyncSnapshotChunkRefSchema>;
|
|
@@ -172,7 +172,7 @@ export declare const SyncSnapshotSchema: z.ZodObject<{
|
|
|
172
172
|
id: z.ZodString;
|
|
173
173
|
byteLength: z.ZodNumber;
|
|
174
174
|
sha256: z.ZodString;
|
|
175
|
-
encoding: z.ZodLiteral<"
|
|
175
|
+
encoding: z.ZodLiteral<"json-row-frame-v1">;
|
|
176
176
|
compression: z.ZodLiteral<"gzip">;
|
|
177
177
|
}, z.core.$strip>>>;
|
|
178
178
|
isFirstPage: z.ZodBoolean;
|
|
@@ -217,7 +217,7 @@ export declare const SyncPullSubscriptionResponseSchema: z.ZodObject<{
|
|
|
217
217
|
id: z.ZodString;
|
|
218
218
|
byteLength: z.ZodNumber;
|
|
219
219
|
sha256: z.ZodString;
|
|
220
|
-
encoding: z.ZodLiteral<"
|
|
220
|
+
encoding: z.ZodLiteral<"json-row-frame-v1">;
|
|
221
221
|
compression: z.ZodLiteral<"gzip">;
|
|
222
222
|
}, z.core.$strip>>>;
|
|
223
223
|
isFirstPage: z.ZodBoolean;
|
|
@@ -265,7 +265,7 @@ export declare const SyncPullResponseSchema: z.ZodObject<{
|
|
|
265
265
|
id: z.ZodString;
|
|
266
266
|
byteLength: z.ZodNumber;
|
|
267
267
|
sha256: z.ZodString;
|
|
268
|
-
encoding: z.ZodLiteral<"
|
|
268
|
+
encoding: z.ZodLiteral<"json-row-frame-v1">;
|
|
269
269
|
compression: z.ZodLiteral<"gzip">;
|
|
270
270
|
}, z.core.$strip>>>;
|
|
271
271
|
isFirstPage: z.ZodBoolean;
|
|
@@ -378,7 +378,7 @@ export declare const SyncCombinedResponseSchema: z.ZodObject<{
|
|
|
378
378
|
id: z.ZodString;
|
|
379
379
|
byteLength: z.ZodNumber;
|
|
380
380
|
sha256: z.ZodString;
|
|
381
|
-
encoding: z.ZodLiteral<"
|
|
381
|
+
encoding: z.ZodLiteral<"json-row-frame-v1">;
|
|
382
382
|
compression: z.ZodLiteral<"gzip">;
|
|
383
383
|
}, z.core.$strip>>>;
|
|
384
384
|
isFirstPage: z.ZodBoolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/schemas/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/schemas/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas/sync.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - Type inference
|
|
8
8
|
*/
|
|
9
9
|
import { z } from 'zod';
|
|
10
|
+
import { SYNC_SNAPSHOT_CHUNK_COMPRESSION, SYNC_SNAPSHOT_CHUNK_ENCODING, } from '../snapshot-chunks.js';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Operation Types
|
|
12
13
|
// ============================================================================
|
|
@@ -116,8 +117,8 @@ export const SyncSnapshotChunkRefSchema = z.object({
|
|
|
116
117
|
id: z.string(),
|
|
117
118
|
byteLength: z.number().int(),
|
|
118
119
|
sha256: z.string(),
|
|
119
|
-
encoding: z.literal(
|
|
120
|
-
compression: z.literal(
|
|
120
|
+
encoding: z.literal(SYNC_SNAPSHOT_CHUNK_ENCODING),
|
|
121
|
+
compression: z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
|
|
121
122
|
});
|
|
122
123
|
export const SyncSnapshotSchema = z.object({
|
|
123
124
|
table: z.string(),
|
package/dist/schemas/sync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/schemas/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/schemas/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/core - Snapshot chunk encoding helpers
|
|
3
|
+
*/
|
|
4
|
+
export declare const SYNC_SNAPSHOT_CHUNK_ENCODING = "json-row-frame-v1";
|
|
5
|
+
export type SyncSnapshotChunkEncoding = typeof SYNC_SNAPSHOT_CHUNK_ENCODING;
|
|
6
|
+
export declare const SYNC_SNAPSHOT_CHUNK_COMPRESSION = "gzip";
|
|
7
|
+
export type SyncSnapshotChunkCompression = typeof SYNC_SNAPSHOT_CHUNK_COMPRESSION;
|
|
8
|
+
/**
|
|
9
|
+
* Encode rows as framed JSON bytes without the format header.
|
|
10
|
+
*/
|
|
11
|
+
export declare function encodeSnapshotRowFrames(rows: readonly unknown[]): Uint8Array;
|
|
12
|
+
/**
|
|
13
|
+
* Encode rows as framed JSON bytes with a format header.
|
|
14
|
+
*
|
|
15
|
+
* Format:
|
|
16
|
+
* - 4-byte magic header ("SRF1")
|
|
17
|
+
* - repeated frames of:
|
|
18
|
+
* - 4-byte big-endian payload byte length
|
|
19
|
+
* - UTF-8 JSON payload
|
|
20
|
+
*/
|
|
21
|
+
export declare function encodeSnapshotRows(rows: readonly unknown[]): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Decode framed JSON bytes into rows.
|
|
24
|
+
*/
|
|
25
|
+
export declare function decodeSnapshotRows(bytes: Uint8Array): unknown[];
|
|
26
|
+
//# sourceMappingURL=snapshot-chunks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-chunks.d.ts","sourceRoot":"","sources":["../src/snapshot-chunks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAChE,MAAM,MAAM,yBAAyB,GAAG,OAAO,4BAA4B,CAAC;AAE5E,eAAO,MAAM,+BAA+B,SAAS,CAAC;AACtD,MAAM,MAAM,4BAA4B,GACtC,OAAO,+BAA+B,CAAC;AAWzC;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CA2B5E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CASvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CAoC/D"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/core - Snapshot chunk encoding helpers
|
|
3
|
+
*/
|
|
4
|
+
export const SYNC_SNAPSHOT_CHUNK_ENCODING = 'json-row-frame-v1';
|
|
5
|
+
export const SYNC_SNAPSHOT_CHUNK_COMPRESSION = 'gzip';
|
|
6
|
+
const SNAPSHOT_ROW_FRAME_MAGIC = new Uint8Array([0x53, 0x52, 0x46, 0x31]); // "SRF1"
|
|
7
|
+
const FRAME_LENGTH_BYTES = 4;
|
|
8
|
+
const MAX_FRAME_BYTE_LENGTH = 0xffff_ffff;
|
|
9
|
+
function normalizeRowJson(row) {
|
|
10
|
+
const serialized = JSON.stringify(row);
|
|
11
|
+
return serialized === undefined ? 'null' : serialized;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Encode rows as framed JSON bytes without the format header.
|
|
15
|
+
*/
|
|
16
|
+
export function encodeSnapshotRowFrames(rows) {
|
|
17
|
+
const encoder = new TextEncoder();
|
|
18
|
+
const payloads = [];
|
|
19
|
+
let totalByteLength = 0;
|
|
20
|
+
for (const row of rows) {
|
|
21
|
+
const payload = encoder.encode(normalizeRowJson(row));
|
|
22
|
+
if (payload.length > MAX_FRAME_BYTE_LENGTH) {
|
|
23
|
+
throw new Error(`Snapshot row payload exceeds ${MAX_FRAME_BYTE_LENGTH} bytes`);
|
|
24
|
+
}
|
|
25
|
+
payloads.push(payload);
|
|
26
|
+
totalByteLength += FRAME_LENGTH_BYTES + payload.length;
|
|
27
|
+
}
|
|
28
|
+
const encoded = new Uint8Array(totalByteLength);
|
|
29
|
+
const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.length);
|
|
30
|
+
let offset = 0;
|
|
31
|
+
for (const payload of payloads) {
|
|
32
|
+
view.setUint32(offset, payload.length, false);
|
|
33
|
+
offset += FRAME_LENGTH_BYTES;
|
|
34
|
+
encoded.set(payload, offset);
|
|
35
|
+
offset += payload.length;
|
|
36
|
+
}
|
|
37
|
+
return encoded;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Encode rows as framed JSON bytes with a format header.
|
|
41
|
+
*
|
|
42
|
+
* Format:
|
|
43
|
+
* - 4-byte magic header ("SRF1")
|
|
44
|
+
* - repeated frames of:
|
|
45
|
+
* - 4-byte big-endian payload byte length
|
|
46
|
+
* - UTF-8 JSON payload
|
|
47
|
+
*/
|
|
48
|
+
export function encodeSnapshotRows(rows) {
|
|
49
|
+
const framedRows = encodeSnapshotRowFrames(rows);
|
|
50
|
+
const totalByteLength = SNAPSHOT_ROW_FRAME_MAGIC.length + framedRows.length;
|
|
51
|
+
const encoded = new Uint8Array(totalByteLength);
|
|
52
|
+
encoded.set(SNAPSHOT_ROW_FRAME_MAGIC, 0);
|
|
53
|
+
encoded.set(framedRows, SNAPSHOT_ROW_FRAME_MAGIC.length);
|
|
54
|
+
return encoded;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Decode framed JSON bytes into rows.
|
|
58
|
+
*/
|
|
59
|
+
export function decodeSnapshotRows(bytes) {
|
|
60
|
+
if (bytes.length < SNAPSHOT_ROW_FRAME_MAGIC.length) {
|
|
61
|
+
throw new Error('Snapshot chunk payload is too small');
|
|
62
|
+
}
|
|
63
|
+
for (let index = 0; index < SNAPSHOT_ROW_FRAME_MAGIC.length; index += 1) {
|
|
64
|
+
const expected = SNAPSHOT_ROW_FRAME_MAGIC[index];
|
|
65
|
+
const actual = bytes[index];
|
|
66
|
+
if (actual !== expected) {
|
|
67
|
+
throw new Error('Unexpected snapshot chunk format');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const rows = [];
|
|
71
|
+
const decoder = new TextDecoder();
|
|
72
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
73
|
+
let offset = SNAPSHOT_ROW_FRAME_MAGIC.length;
|
|
74
|
+
while (offset < bytes.length) {
|
|
75
|
+
if (offset + FRAME_LENGTH_BYTES > bytes.length) {
|
|
76
|
+
throw new Error('Snapshot chunk payload ended mid-frame header');
|
|
77
|
+
}
|
|
78
|
+
const payloadLength = view.getUint32(offset, false);
|
|
79
|
+
offset += FRAME_LENGTH_BYTES;
|
|
80
|
+
if (offset + payloadLength > bytes.length) {
|
|
81
|
+
throw new Error('Snapshot chunk payload ended mid-frame body');
|
|
82
|
+
}
|
|
83
|
+
const payload = bytes.subarray(offset, offset + payloadLength);
|
|
84
|
+
offset += payloadLength;
|
|
85
|
+
rows.push(JSON.parse(decoder.decode(payload)));
|
|
86
|
+
}
|
|
87
|
+
return rows;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=snapshot-chunks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot-chunks.js","sourceRoot":"","sources":["../src/snapshot-chunks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/core",
|
|
3
|
-
"version": "0.0.1-
|
|
3
|
+
"version": "0.0.1-98",
|
|
4
4
|
"description": "Core protocol types and shared utilities for the Syncular sync framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"exports": {
|
|
29
29
|
".": {
|
|
30
30
|
"bun": "./src/index.ts",
|
|
31
|
+
"browser": "./src/index.ts",
|
|
31
32
|
"import": {
|
|
32
33
|
"types": "./dist/index.d.ts",
|
|
33
34
|
"default": "./dist/index.js"
|
package/src/index.ts
CHANGED
|
@@ -24,6 +24,8 @@ export * from './proxy';
|
|
|
24
24
|
export * from './schemas';
|
|
25
25
|
// Scope types, patterns, and utilities
|
|
26
26
|
export * from './scopes';
|
|
27
|
+
// Snapshot chunk encoding helpers
|
|
28
|
+
export * from './snapshot-chunks';
|
|
27
29
|
// Telemetry abstraction
|
|
28
30
|
export * from './telemetry';
|
|
29
31
|
// Data transformation hooks
|
package/src/schemas/sync.ts
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
+
import {
|
|
12
|
+
SYNC_SNAPSHOT_CHUNK_COMPRESSION,
|
|
13
|
+
SYNC_SNAPSHOT_CHUNK_ENCODING,
|
|
14
|
+
} from '../snapshot-chunks';
|
|
11
15
|
|
|
12
16
|
// ============================================================================
|
|
13
17
|
// Operation Types
|
|
@@ -163,8 +167,8 @@ export const SyncSnapshotChunkRefSchema = z.object({
|
|
|
163
167
|
id: z.string(),
|
|
164
168
|
byteLength: z.number().int(),
|
|
165
169
|
sha256: z.string(),
|
|
166
|
-
encoding: z.literal(
|
|
167
|
-
compression: z.literal(
|
|
170
|
+
encoding: z.literal(SYNC_SNAPSHOT_CHUNK_ENCODING),
|
|
171
|
+
compression: z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
|
|
168
172
|
});
|
|
169
173
|
|
|
170
174
|
export type SyncSnapshotChunkRef = z.infer<typeof SyncSnapshotChunkRefSchema>;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/core - Snapshot chunk encoding helpers
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export const SYNC_SNAPSHOT_CHUNK_ENCODING = 'json-row-frame-v1';
|
|
6
|
+
export type SyncSnapshotChunkEncoding = typeof SYNC_SNAPSHOT_CHUNK_ENCODING;
|
|
7
|
+
|
|
8
|
+
export const SYNC_SNAPSHOT_CHUNK_COMPRESSION = 'gzip';
|
|
9
|
+
export type SyncSnapshotChunkCompression =
|
|
10
|
+
typeof SYNC_SNAPSHOT_CHUNK_COMPRESSION;
|
|
11
|
+
|
|
12
|
+
const SNAPSHOT_ROW_FRAME_MAGIC = new Uint8Array([0x53, 0x52, 0x46, 0x31]); // "SRF1"
|
|
13
|
+
const FRAME_LENGTH_BYTES = 4;
|
|
14
|
+
const MAX_FRAME_BYTE_LENGTH = 0xffff_ffff;
|
|
15
|
+
|
|
16
|
+
function normalizeRowJson(row: unknown): string {
|
|
17
|
+
const serialized = JSON.stringify(row);
|
|
18
|
+
return serialized === undefined ? 'null' : serialized;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Encode rows as framed JSON bytes without the format header.
|
|
23
|
+
*/
|
|
24
|
+
export function encodeSnapshotRowFrames(rows: readonly unknown[]): Uint8Array {
|
|
25
|
+
const encoder = new TextEncoder();
|
|
26
|
+
const payloads: Uint8Array[] = [];
|
|
27
|
+
let totalByteLength = 0;
|
|
28
|
+
|
|
29
|
+
for (const row of rows) {
|
|
30
|
+
const payload = encoder.encode(normalizeRowJson(row));
|
|
31
|
+
if (payload.length > MAX_FRAME_BYTE_LENGTH) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Snapshot row payload exceeds ${MAX_FRAME_BYTE_LENGTH} bytes`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
payloads.push(payload);
|
|
37
|
+
totalByteLength += FRAME_LENGTH_BYTES + payload.length;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const encoded = new Uint8Array(totalByteLength);
|
|
41
|
+
const view = new DataView(encoded.buffer, encoded.byteOffset, encoded.length);
|
|
42
|
+
let offset = 0;
|
|
43
|
+
for (const payload of payloads) {
|
|
44
|
+
view.setUint32(offset, payload.length, false);
|
|
45
|
+
offset += FRAME_LENGTH_BYTES;
|
|
46
|
+
encoded.set(payload, offset);
|
|
47
|
+
offset += payload.length;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return encoded;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Encode rows as framed JSON bytes with a format header.
|
|
55
|
+
*
|
|
56
|
+
* Format:
|
|
57
|
+
* - 4-byte magic header ("SRF1")
|
|
58
|
+
* - repeated frames of:
|
|
59
|
+
* - 4-byte big-endian payload byte length
|
|
60
|
+
* - UTF-8 JSON payload
|
|
61
|
+
*/
|
|
62
|
+
export function encodeSnapshotRows(rows: readonly unknown[]): Uint8Array {
|
|
63
|
+
const framedRows = encodeSnapshotRowFrames(rows);
|
|
64
|
+
const totalByteLength = SNAPSHOT_ROW_FRAME_MAGIC.length + framedRows.length;
|
|
65
|
+
|
|
66
|
+
const encoded = new Uint8Array(totalByteLength);
|
|
67
|
+
encoded.set(SNAPSHOT_ROW_FRAME_MAGIC, 0);
|
|
68
|
+
encoded.set(framedRows, SNAPSHOT_ROW_FRAME_MAGIC.length);
|
|
69
|
+
|
|
70
|
+
return encoded;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Decode framed JSON bytes into rows.
|
|
75
|
+
*/
|
|
76
|
+
export function decodeSnapshotRows(bytes: Uint8Array): unknown[] {
|
|
77
|
+
if (bytes.length < SNAPSHOT_ROW_FRAME_MAGIC.length) {
|
|
78
|
+
throw new Error('Snapshot chunk payload is too small');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (let index = 0; index < SNAPSHOT_ROW_FRAME_MAGIC.length; index += 1) {
|
|
82
|
+
const expected = SNAPSHOT_ROW_FRAME_MAGIC[index];
|
|
83
|
+
const actual = bytes[index];
|
|
84
|
+
if (actual !== expected) {
|
|
85
|
+
throw new Error('Unexpected snapshot chunk format');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const rows: unknown[] = [];
|
|
90
|
+
const decoder = new TextDecoder();
|
|
91
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
92
|
+
let offset = SNAPSHOT_ROW_FRAME_MAGIC.length;
|
|
93
|
+
|
|
94
|
+
while (offset < bytes.length) {
|
|
95
|
+
if (offset + FRAME_LENGTH_BYTES > bytes.length) {
|
|
96
|
+
throw new Error('Snapshot chunk payload ended mid-frame header');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const payloadLength = view.getUint32(offset, false);
|
|
100
|
+
offset += FRAME_LENGTH_BYTES;
|
|
101
|
+
|
|
102
|
+
if (offset + payloadLength > bytes.length) {
|
|
103
|
+
throw new Error('Snapshot chunk payload ended mid-frame body');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const payload = bytes.subarray(offset, offset + payloadLength);
|
|
107
|
+
offset += payloadLength;
|
|
108
|
+
rows.push(JSON.parse(decoder.decode(payload)));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return rows;
|
|
112
|
+
}
|