@claudexor/journal 3.11.0 → 3.12.1
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/append-batch.d.ts +2 -0
- package/dist/append-batch.d.ts.map +1 -1
- package/dist/append-batch.js +4 -0
- package/dist/append-batch.js.map +1 -1
- package/dist/frame-codec.d.ts +54 -0
- package/dist/frame-codec.d.ts.map +1 -1
- package/dist/frame-codec.js +167 -87
- package/dist/frame-codec.js.map +1 -1
- package/dist/frame-reader.d.ts +30 -0
- package/dist/frame-reader.d.ts.map +1 -0
- package/dist/frame-reader.js +97 -0
- package/dist/frame-reader.js.map +1 -0
- package/dist/index.d.ts +34 -44
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +81 -156
- package/dist/index.js.map +1 -1
- package/dist/journal-background-compaction.d.ts +7 -2
- package/dist/journal-background-compaction.d.ts.map +1 -1
- package/dist/journal-background-compaction.js +79 -78
- package/dist/journal-background-compaction.js.map +1 -1
- package/dist/journal-compaction-chunks.d.ts +29 -0
- package/dist/journal-compaction-chunks.d.ts.map +1 -0
- package/dist/journal-compaction-chunks.js +112 -0
- package/dist/journal-compaction-chunks.js.map +1 -0
- package/dist/journal-compaction.d.ts +27 -5
- package/dist/journal-compaction.d.ts.map +1 -1
- package/dist/journal-compaction.js +22 -4
- package/dist/journal-compaction.js.map +1 -1
- package/dist/journal-core.d.ts +96 -0
- package/dist/journal-core.d.ts.map +1 -0
- package/dist/journal-core.js +173 -0
- package/dist/journal-core.js.map +1 -0
- package/dist/journal-files.d.ts +0 -1
- package/dist/journal-files.d.ts.map +1 -1
- package/dist/journal-files.js +0 -9
- package/dist/journal-files.js.map +1 -1
- package/dist/journal-fold.d.ts +47 -0
- package/dist/journal-fold.d.ts.map +1 -0
- package/dist/journal-fold.js +81 -0
- package/dist/journal-fold.js.map +1 -0
- package/dist/journal-recovery.d.ts +18 -6
- package/dist/journal-recovery.d.ts.map +1 -1
- package/dist/journal-recovery.js +46 -30
- package/dist/journal-recovery.js.map +1 -1
- package/dist/read-only-preparation.d.ts +7 -0
- package/dist/read-only-preparation.d.ts.map +1 -1
- package/dist/read-only-preparation.js +98 -41
- package/dist/read-only-preparation.js.map +1 -1
- package/package.json +2 -2
package/dist/append-batch.d.ts
CHANGED
|
@@ -18,5 +18,7 @@ export declare function prepareAppendBatch(input: AppendBatchPlanInput): {
|
|
|
18
18
|
previousFrameHash: string;
|
|
19
19
|
};
|
|
20
20
|
export declare function encodeJournalPayload(value: unknown): Buffer;
|
|
21
|
+
/** Detach a JSON value from every caller-held reference. */
|
|
22
|
+
export declare function cloneJson<T>(value: T): T;
|
|
21
23
|
export {};
|
|
22
24
|
//# sourceMappingURL=append-batch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append-batch.d.ts","sourceRoot":"","sources":["../src/append-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAE1B,UAAU,oBAAoB;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CACxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CA+BA;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI3D"}
|
|
1
|
+
{"version":3,"file":"append-batch.d.ts","sourceRoot":"","sources":["../src/append-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAE1B,UAAU,oBAAoB;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,IAAI,CAAC;IAChB,OAAO,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CACxD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CA+BA;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI3D;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAExC"}
|
package/dist/append-batch.js
CHANGED
|
@@ -38,4 +38,8 @@ export function encodeJournalPayload(value) {
|
|
|
38
38
|
throw new Error("journal value is not JSON serializable");
|
|
39
39
|
return Buffer.from(encoded);
|
|
40
40
|
}
|
|
41
|
+
/** Detach a JSON value from every caller-held reference. */
|
|
42
|
+
export function cloneJson(value) {
|
|
43
|
+
return JSON.parse(JSON.stringify(value));
|
|
44
|
+
}
|
|
41
45
|
//# sourceMappingURL=append-batch.js.map
|
package/dist/append-batch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"append-batch.js","sourceRoot":"","sources":["../src/append-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAY1B,MAAM,UAAU,kBAAkB,CAAC,KAA2B;IAM5D,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5B,IAAI,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAChD,IAAI,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAgB;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,OAAO;YACZ,iBAAiB;YACjB,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QACF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,MAAM;YACT,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY;YAC7D,UAAU;SACX,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,CAAC;QACb,iBAAiB,GAAG,SAAS,CAAC;QAC9B,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC"}
|
|
1
|
+
{"version":3,"file":"append-batch.js","sourceRoot":"","sources":["../src/append-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAY1B,MAAM,UAAU,kBAAkB,CAAC,KAA2B;IAM5D,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5B,IAAI,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;IAChD,IAAI,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAClC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAgB;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,OAAO;YACZ,iBAAiB;YACjB,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QACF,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,MAAM;YACT,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY;YAC7D,UAAU;SACX,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,CAAC;QACb,iBAAiB,GAAG,SAAS,CAAC;QAC9B,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACrF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAI,KAAQ;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAM,CAAC;AAChD,CAAC"}
|
package/dist/frame-codec.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
export declare const PREFIX_BYTES: number;
|
|
1
2
|
export declare const HASH_BYTES = 32;
|
|
2
3
|
export declare const MAX_PAYLOAD_BYTES: number;
|
|
3
4
|
export declare const MAX_COMPACTED_LOGICAL_BYTES: number;
|
|
5
|
+
export declare const SNAPSHOT_CHUNK_LOGICAL_BYTES: number;
|
|
4
6
|
export declare const ZERO_HASH: string;
|
|
5
7
|
export declare const COMPACTED_SNAPSHOT = "journal.compacted_snapshot";
|
|
6
8
|
export interface JournalRecord<T = unknown> {
|
|
@@ -29,7 +31,11 @@ export interface CompactedSnapshotPayload {
|
|
|
29
31
|
encoding: "gzip-base64";
|
|
30
32
|
data: string;
|
|
31
33
|
}
|
|
34
|
+
/** A logical record inside a compacted snapshot. `seq` is present in
|
|
35
|
+
* seq-preserving snapshots (a chunk may then cover more sequence numbers than
|
|
36
|
+
* it holds records); its absence means the legacy dense layout. */
|
|
32
37
|
export interface CompactedRecord {
|
|
38
|
+
seq?: number;
|
|
33
39
|
time: string;
|
|
34
40
|
type: string;
|
|
35
41
|
payload: unknown;
|
|
@@ -42,6 +48,54 @@ export interface ReplayResult {
|
|
|
42
48
|
reason: string;
|
|
43
49
|
} | null;
|
|
44
50
|
}
|
|
51
|
+
export type FramePrefix = {
|
|
52
|
+
status: "incomplete";
|
|
53
|
+
} | {
|
|
54
|
+
status: "corrupt";
|
|
55
|
+
reason: string;
|
|
56
|
+
} | {
|
|
57
|
+
status: "frame";
|
|
58
|
+
headerLength: number;
|
|
59
|
+
payloadLength: number;
|
|
60
|
+
frameLength: number;
|
|
61
|
+
};
|
|
62
|
+
export type FrameBody = {
|
|
63
|
+
status: "corrupt";
|
|
64
|
+
reason: string;
|
|
65
|
+
} | {
|
|
66
|
+
status: "frame";
|
|
67
|
+
header: FrameHeader;
|
|
68
|
+
payload: unknown;
|
|
69
|
+
frameHash: string;
|
|
70
|
+
};
|
|
71
|
+
/** Sequential validation state shared by every reader of one partition. */
|
|
72
|
+
export interface FrameChain {
|
|
73
|
+
partition: string;
|
|
74
|
+
epoch: string | null;
|
|
75
|
+
expectedSeq: number;
|
|
76
|
+
previous: string;
|
|
77
|
+
}
|
|
78
|
+
export type ChainedFrame = {
|
|
79
|
+
status: "corrupt";
|
|
80
|
+
reason: string;
|
|
81
|
+
} | {
|
|
82
|
+
status: "frame";
|
|
83
|
+
records: JournalRecord[];
|
|
84
|
+
byteLengths: number[];
|
|
85
|
+
};
|
|
86
|
+
/** Legacy whole-buffer replay; the positional reader runs the same three steps. */
|
|
45
87
|
export declare function replayFrames(bytes: Buffer, partition: string): ReplayResult;
|
|
88
|
+
export declare function newFrameChain(partition: string): FrameChain;
|
|
89
|
+
/** Step 1: the fixed prefix. `remaining` is the readable byte count from the
|
|
90
|
+
* frame start; `view` must expose at least `min(remaining, PREFIX_BYTES)`. */
|
|
91
|
+
export declare function readFramePrefix(view: Buffer, remaining: number): FramePrefix;
|
|
92
|
+
/** Step 2: hash and JSON of one complete frame (`frame` is exactly its bytes).
|
|
93
|
+
* The payload handed out is the parsed object covered by the verified hash. */
|
|
94
|
+
export declare function decodeFrameBody(frame: Buffer, headerLength: number, payloadLength: number): FrameBody;
|
|
95
|
+
/** Step 3: partition/epoch/seq/hash-chain semantics, then logical records.
|
|
96
|
+
* A compacted snapshot advances the expected sequence by its logical span. */
|
|
97
|
+
export declare function chainFrame(chain: FrameChain, body: Extract<FrameBody, {
|
|
98
|
+
status: "frame";
|
|
99
|
+
}>, byteOffset: number, payloadLength: number): ChainedFrame;
|
|
46
100
|
export declare function encodeFrame(header: FrameHeader, payload: Buffer): Buffer;
|
|
47
101
|
//# sourceMappingURL=frame-codec.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-codec.d.ts","sourceRoot":"","sources":["../src/frame-codec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frame-codec.d.ts","sourceRoot":"","sources":["../src/frame-codec.ts"],"names":[],"mappings":"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"}
|
package/dist/frame-codec.js
CHANGED
|
@@ -4,111 +4,152 @@ const MAGIC = Buffer.from([0x43, 0x4c, 0x58, 0x4a, 0x4e, 0x4c, 0x32, 0x00]);
|
|
|
4
4
|
const VERSION = 1;
|
|
5
5
|
const PREFIX_CORE_BYTES = MAGIC.length + 2 + 4 + 4;
|
|
6
6
|
const PREFIX_CHECKSUM_BYTES = 8;
|
|
7
|
-
const PREFIX_BYTES = PREFIX_CORE_BYTES + PREFIX_CHECKSUM_BYTES;
|
|
7
|
+
export const PREFIX_BYTES = PREFIX_CORE_BYTES + PREFIX_CHECKSUM_BYTES;
|
|
8
8
|
export const HASH_BYTES = 32;
|
|
9
9
|
const MAX_HEADER_BYTES = 64 * 1024;
|
|
10
10
|
export const MAX_PAYLOAD_BYTES = 16 * 1024 * 1024;
|
|
11
11
|
// A compacted frame's physical payload is bounded, but gzip expansion is not.
|
|
12
12
|
// Keep replay fail-closed before an unbounded allocation while retaining
|
|
13
|
-
// headroom for the large snapshots
|
|
13
|
+
// headroom for the large single-frame snapshots earlier writers produced.
|
|
14
14
|
export const MAX_COMPACTED_LOGICAL_BYTES = 512 * 1024 * 1024;
|
|
15
|
+
// Logical bytes per compacted snapshot chunk. Worst-case deflate expansion,
|
|
16
|
+
// the base64 4/3 blow-up and the JSON envelope of 11.75 MiB still fit the
|
|
17
|
+
// 16 MiB frame payload cap, so a chunk is cut by logical size alone.
|
|
18
|
+
export const SNAPSHOT_CHUNK_LOGICAL_BYTES = 11.75 * 1024 * 1024;
|
|
15
19
|
export const ZERO_HASH = "0".repeat(64);
|
|
16
20
|
export const COMPACTED_SNAPSHOT = "journal.compacted_snapshot";
|
|
21
|
+
/** Legacy whole-buffer replay; the positional reader runs the same three steps. */
|
|
17
22
|
export function replayFrames(bytes, partition) {
|
|
18
23
|
const records = [];
|
|
24
|
+
const chain = newFrameChain(partition);
|
|
19
25
|
let offset = 0;
|
|
20
|
-
let epoch = null;
|
|
21
|
-
let expectedSeq = 1;
|
|
22
|
-
let previous = ZERO_HASH;
|
|
23
26
|
while (offset < bytes.length) {
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
27
|
+
const prefix = readFramePrefix(bytes.subarray(offset), bytes.length - offset);
|
|
28
|
+
if (prefix.status === "incomplete")
|
|
26
29
|
return { records, incompleteOffset: offset, error: null };
|
|
27
|
-
if (
|
|
28
|
-
return corrupt(records, offset,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
|
|
30
|
+
if (prefix.status === "corrupt")
|
|
31
|
+
return corrupt(records, offset, prefix.reason);
|
|
32
|
+
const body = decodeFrameBody(bytes.subarray(offset, offset + prefix.frameLength), prefix.headerLength, prefix.payloadLength);
|
|
33
|
+
if (body.status === "corrupt")
|
|
34
|
+
return corrupt(records, offset, body.reason);
|
|
35
|
+
const chained = chainFrame(chain, body, offset, prefix.payloadLength);
|
|
36
|
+
if (chained.status === "corrupt")
|
|
37
|
+
return corrupt(records, offset, chained.reason);
|
|
38
|
+
for (const record of chained.records)
|
|
39
|
+
records.push(record);
|
|
40
|
+
offset += prefix.frameLength;
|
|
41
|
+
}
|
|
42
|
+
return { records, incompleteOffset: null, error: null };
|
|
43
|
+
}
|
|
44
|
+
export function newFrameChain(partition) {
|
|
45
|
+
return { partition, epoch: null, expectedSeq: 1, previous: ZERO_HASH };
|
|
46
|
+
}
|
|
47
|
+
/** Step 1: the fixed prefix. `remaining` is the readable byte count from the
|
|
48
|
+
* frame start; `view` must expose at least `min(remaining, PREFIX_BYTES)`. */
|
|
49
|
+
export function readFramePrefix(view, remaining) {
|
|
50
|
+
if (remaining < PREFIX_BYTES)
|
|
51
|
+
return { status: "incomplete" };
|
|
52
|
+
if (!view.subarray(0, MAGIC.length).equals(MAGIC)) {
|
|
53
|
+
return { status: "corrupt", reason: "frame magic mismatch" };
|
|
54
|
+
}
|
|
55
|
+
const prefix = view.subarray(0, PREFIX_BYTES);
|
|
56
|
+
const expectedPrefix = createHash("sha256")
|
|
57
|
+
.update(prefix.subarray(0, PREFIX_CORE_BYTES))
|
|
58
|
+
.digest()
|
|
59
|
+
.subarray(0, PREFIX_CHECKSUM_BYTES);
|
|
60
|
+
if (!prefix.subarray(PREFIX_CORE_BYTES).equals(expectedPrefix)) {
|
|
61
|
+
return { status: "corrupt", reason: "frame prefix checksum mismatch" };
|
|
62
|
+
}
|
|
63
|
+
const version = view.readUInt16BE(MAGIC.length);
|
|
64
|
+
const headerLength = view.readUInt32BE(MAGIC.length + 2);
|
|
65
|
+
const payloadLength = view.readUInt32BE(MAGIC.length + 6);
|
|
66
|
+
if (version !== VERSION) {
|
|
67
|
+
return { status: "corrupt", reason: `unsupported frame version ${version}` };
|
|
68
|
+
}
|
|
69
|
+
if (headerLength === 0 || headerLength > MAX_HEADER_BYTES || payloadLength > MAX_PAYLOAD_BYTES) {
|
|
70
|
+
return { status: "corrupt", reason: "invalid frame lengths" };
|
|
71
|
+
}
|
|
72
|
+
const frameLength = PREFIX_BYTES + headerLength + payloadLength + HASH_BYTES;
|
|
73
|
+
if (frameLength > remaining)
|
|
74
|
+
return { status: "incomplete" };
|
|
75
|
+
return { status: "frame", headerLength, payloadLength, frameLength };
|
|
76
|
+
}
|
|
77
|
+
/** Step 2: hash and JSON of one complete frame (`frame` is exactly its bytes).
|
|
78
|
+
* The payload handed out is the parsed object covered by the verified hash. */
|
|
79
|
+
export function decodeFrameBody(frame, headerLength, payloadLength) {
|
|
80
|
+
const headerStart = PREFIX_BYTES;
|
|
81
|
+
const payloadStart = headerStart + headerLength;
|
|
82
|
+
const bodyEnd = payloadStart + payloadLength;
|
|
83
|
+
const frameHashBytes = createHash("sha256").update(frame.subarray(0, bodyEnd)).digest();
|
|
84
|
+
if (!frame.subarray(bodyEnd, bodyEnd + HASH_BYTES).equals(frameHashBytes)) {
|
|
85
|
+
return { status: "corrupt", reason: "frame checksum mismatch" };
|
|
86
|
+
}
|
|
87
|
+
let header;
|
|
88
|
+
let payload;
|
|
89
|
+
try {
|
|
90
|
+
header = JSON.parse(frame.subarray(headerStart, payloadStart).toString("utf8"));
|
|
91
|
+
payload = JSON.parse(frame.subarray(payloadStart, bodyEnd).toString("utf8"));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return { status: "corrupt", reason: "frame JSON is malformed" };
|
|
95
|
+
}
|
|
96
|
+
return { status: "frame", header, payload, frameHash: frameHashBytes.toString("hex") };
|
|
97
|
+
}
|
|
98
|
+
/** Step 3: partition/epoch/seq/hash-chain semantics, then logical records.
|
|
99
|
+
* A compacted snapshot advances the expected sequence by its logical span. */
|
|
100
|
+
export function chainFrame(chain, body, byteOffset, payloadLength) {
|
|
101
|
+
const { header, payload, frameHash } = body;
|
|
102
|
+
const semantic = validateHeader(header, chain.partition, chain.epoch, chain.expectedSeq, chain.previous);
|
|
103
|
+
if (semantic)
|
|
104
|
+
return { status: "corrupt", reason: semantic };
|
|
105
|
+
const records = [];
|
|
106
|
+
const byteLengths = [];
|
|
107
|
+
if (header.type === COMPACTED_SNAPSHOT) {
|
|
108
|
+
let compacted;
|
|
61
109
|
try {
|
|
62
|
-
|
|
63
|
-
payload = JSON.parse(bytes.subarray(payloadStart, bodyEnd).toString("utf8"));
|
|
110
|
+
compacted = decodeCompactedSnapshot(payload, header.logicalSpan, header.seq);
|
|
64
111
|
}
|
|
65
|
-
catch {
|
|
66
|
-
return corrupt
|
|
112
|
+
catch (error) {
|
|
113
|
+
return { status: "corrupt", reason: `compacted snapshot is invalid: ${String(error)}` };
|
|
67
114
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const frameHash = frameHashBytes.toString("hex");
|
|
72
|
-
if (header.type === COMPACTED_SNAPSHOT) {
|
|
73
|
-
let compacted;
|
|
74
|
-
try {
|
|
75
|
-
compacted = decodeCompactedSnapshot(payload, header.logicalSpan);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
return corrupt(records, offset, `compacted snapshot is invalid: ${String(error)}`);
|
|
79
|
-
}
|
|
80
|
-
compacted.forEach((record, index) => records.push({
|
|
81
|
-
partition,
|
|
115
|
+
compacted.forEach((record, index) => {
|
|
116
|
+
records.push({
|
|
117
|
+
partition: chain.partition,
|
|
82
118
|
epoch: header.epoch,
|
|
83
|
-
seq:
|
|
119
|
+
seq: record.seq,
|
|
84
120
|
previousFrameHash: index === 0 ? header.previousFrameHash : frameHash,
|
|
85
121
|
frameHash,
|
|
86
122
|
time: record.time,
|
|
87
123
|
type: record.type,
|
|
88
124
|
payload: record.payload,
|
|
89
|
-
byteOffset
|
|
90
|
-
}));
|
|
91
|
-
expectedSeq += compacted.length;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
records.push({
|
|
95
|
-
partition,
|
|
96
|
-
epoch: header.epoch,
|
|
97
|
-
seq: header.seq,
|
|
98
|
-
previousFrameHash: header.previousFrameHash,
|
|
99
|
-
frameHash,
|
|
100
|
-
time: header.time,
|
|
101
|
-
type: header.type,
|
|
102
|
-
payload,
|
|
103
|
-
byteOffset: offset,
|
|
125
|
+
byteOffset,
|
|
104
126
|
});
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
previous = frameHash;
|
|
109
|
-
offset += frameLength;
|
|
127
|
+
byteLengths.push(record.byteLength);
|
|
128
|
+
});
|
|
129
|
+
chain.expectedSeq += header.logicalSpan;
|
|
110
130
|
}
|
|
111
|
-
|
|
131
|
+
else {
|
|
132
|
+
records.push({
|
|
133
|
+
partition: chain.partition,
|
|
134
|
+
epoch: header.epoch,
|
|
135
|
+
seq: header.seq,
|
|
136
|
+
previousFrameHash: header.previousFrameHash,
|
|
137
|
+
frameHash,
|
|
138
|
+
time: header.time,
|
|
139
|
+
type: header.type,
|
|
140
|
+
payload,
|
|
141
|
+
byteOffset,
|
|
142
|
+
});
|
|
143
|
+
// The `{time,type,payload}` logical form this frame would take in a snapshot.
|
|
144
|
+
byteLengths.push(28 +
|
|
145
|
+
Buffer.byteLength(JSON.stringify(header.time)) +
|
|
146
|
+
Buffer.byteLength(JSON.stringify(header.type)) +
|
|
147
|
+
payloadLength);
|
|
148
|
+
chain.expectedSeq += 1;
|
|
149
|
+
}
|
|
150
|
+
chain.epoch ??= header.epoch;
|
|
151
|
+
chain.previous = frameHash;
|
|
152
|
+
return { status: "frame", records, byteLengths };
|
|
112
153
|
}
|
|
113
154
|
export function encodeFrame(header, payload) {
|
|
114
155
|
const headerBytes = encodeJson(header);
|
|
@@ -156,11 +197,17 @@ function validateHeader(header, partition, epoch, seq, previous) {
|
|
|
156
197
|
return "ordinary frame declares a logical span";
|
|
157
198
|
return null;
|
|
158
199
|
}
|
|
159
|
-
|
|
200
|
+
/** Legacy snapshots carry no `seq`: exactly `logicalSpan` records numbered from
|
|
201
|
+
* the header. Seq-preserving snapshots carry one per record, strictly
|
|
202
|
+
* increasing inside the covered span, so `count <= logicalSpan`. Mixing the two
|
|
203
|
+
* inside one frame is corruption. */
|
|
204
|
+
function decodeCompactedSnapshot(payload, logicalSpan, firstSeq) {
|
|
160
205
|
if (!isRecord(payload) || payload.version !== 1 || payload.encoding !== "gzip-base64") {
|
|
161
206
|
throw new Error("unsupported payload");
|
|
162
207
|
}
|
|
163
|
-
|
|
208
|
+
const span = logicalSpan;
|
|
209
|
+
const count = payload.count;
|
|
210
|
+
if (!Number.isSafeInteger(count) || Number(count) < 0 || Number(count) > span) {
|
|
164
211
|
throw new Error("record count mismatch");
|
|
165
212
|
}
|
|
166
213
|
if (typeof payload.data !== "string")
|
|
@@ -168,7 +215,26 @@ function decodeCompactedSnapshot(payload, logicalSpan) {
|
|
|
168
215
|
const decoded = gunzipSync(Buffer.from(payload.data, "base64"), {
|
|
169
216
|
maxOutputLength: MAX_COMPACTED_LOGICAL_BYTES,
|
|
170
217
|
});
|
|
171
|
-
|
|
218
|
+
const records = parseCompactedRecords(decoded, count);
|
|
219
|
+
// An empty covering chunk can only come from the seq-preserving writer.
|
|
220
|
+
const numbered = records.length === 0 || records[0].seq !== undefined;
|
|
221
|
+
let previous = firstSeq - 1;
|
|
222
|
+
for (const record of records) {
|
|
223
|
+
if ((record.seq !== undefined) !== numbered)
|
|
224
|
+
throw new Error("mixed record sequence");
|
|
225
|
+
if (!numbered) {
|
|
226
|
+
previous += 1;
|
|
227
|
+
record.seq = previous;
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const seq = record.seq;
|
|
231
|
+
if (seq <= previous || seq > firstSeq + span - 1)
|
|
232
|
+
throw new Error("record sequence is invalid");
|
|
233
|
+
previous = seq;
|
|
234
|
+
}
|
|
235
|
+
if (!numbered && records.length !== span)
|
|
236
|
+
throw new Error("record count mismatch");
|
|
237
|
+
return records;
|
|
172
238
|
}
|
|
173
239
|
function parseCompactedRecords(bytes, count) {
|
|
174
240
|
let cursor = skipJsonWhitespace(bytes, 0);
|
|
@@ -188,7 +254,7 @@ function parseCompactedRecords(bytes, count) {
|
|
|
188
254
|
catch {
|
|
189
255
|
throw new Error("invalid records");
|
|
190
256
|
}
|
|
191
|
-
records.push(validateCompactedRecord(value));
|
|
257
|
+
records.push({ ...validateCompactedRecord(value), byteLength: end - cursor });
|
|
192
258
|
cursor = skipJsonWhitespace(bytes, end);
|
|
193
259
|
const separator = bytes[cursor];
|
|
194
260
|
if (index + 1 < count) {
|
|
@@ -202,6 +268,12 @@ function parseCompactedRecords(bytes, count) {
|
|
|
202
268
|
cursor += 1;
|
|
203
269
|
}
|
|
204
270
|
}
|
|
271
|
+
if (count === 0) {
|
|
272
|
+
cursor = skipJsonWhitespace(bytes, cursor);
|
|
273
|
+
if (bytes[cursor] !== 0x5d)
|
|
274
|
+
throw new Error("invalid records");
|
|
275
|
+
cursor += 1;
|
|
276
|
+
}
|
|
205
277
|
cursor = skipJsonWhitespace(bytes, cursor);
|
|
206
278
|
if (cursor !== bytes.length)
|
|
207
279
|
throw new Error("invalid records");
|
|
@@ -212,10 +284,18 @@ function validateCompactedRecord(record) {
|
|
|
212
284
|
typeof record.time !== "string" ||
|
|
213
285
|
typeof record.type !== "string" ||
|
|
214
286
|
!record.type ||
|
|
215
|
-
record.type === COMPACTED_SNAPSHOT
|
|
287
|
+
record.type === COMPACTED_SNAPSHOT ||
|
|
288
|
+
(record.seq !== undefined && (!Number.isSafeInteger(record.seq) || Number(record.seq) < 1))) {
|
|
216
289
|
throw new Error("invalid logical record");
|
|
217
290
|
}
|
|
218
|
-
|
|
291
|
+
const logical = {
|
|
292
|
+
time: record.time,
|
|
293
|
+
type: record.type,
|
|
294
|
+
payload: record.payload,
|
|
295
|
+
};
|
|
296
|
+
if (record.seq !== undefined)
|
|
297
|
+
logical.seq = record.seq;
|
|
298
|
+
return logical;
|
|
219
299
|
}
|
|
220
300
|
function scanCompactedRecord(bytes, start) {
|
|
221
301
|
if (bytes[start] !== 0x7b)
|
package/dist/frame-codec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-codec.js","sourceRoot":"","sources":["../src/frame-codec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frame-codec.js","sourceRoot":"","sources":["../src/frame-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type JournalRecord } from "./frame-codec.js";
|
|
2
|
+
import { type JournalFold } from "./journal-fold.js";
|
|
3
|
+
export interface FrameReadOptions {
|
|
4
|
+
/** Treat the file as ending at this byte (an append intent's prefix). */
|
|
5
|
+
limit?: number;
|
|
6
|
+
fold?: JournalFold;
|
|
7
|
+
}
|
|
8
|
+
/** Disk chain state comes from the LAST FRAME ON DISK, never from the last
|
|
9
|
+
* retained record: a fold may drop that frame, and the next append must still
|
|
10
|
+
* chain to it. */
|
|
11
|
+
export interface FrameReadResult {
|
|
12
|
+
retained: JournalRecord[];
|
|
13
|
+
epoch: string | null;
|
|
14
|
+
nextSeq: number;
|
|
15
|
+
previousFrameHash: string;
|
|
16
|
+
knownFileBytes: number;
|
|
17
|
+
incompleteOffset: number | null;
|
|
18
|
+
error: {
|
|
19
|
+
offset: number;
|
|
20
|
+
reason: string;
|
|
21
|
+
} | null;
|
|
22
|
+
retiredCount: number;
|
|
23
|
+
retiredBytes: number;
|
|
24
|
+
}
|
|
25
|
+
/** Positional frame-at-a-time reader over a descriptor: bounded buffers, the
|
|
26
|
+
* same prefix/hash/chain/epoch/seq validation as `replayFrames`, optional fold
|
|
27
|
+
* applied while streaming. Throws when the file shrinks underneath the read. */
|
|
28
|
+
export declare function readFrames(fd: number, partition: string, options?: FrameReadOptions): FrameReadResult;
|
|
29
|
+
export declare function descriptorSize(fd: number): number;
|
|
30
|
+
//# sourceMappingURL=frame-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-reader.d.ts","sourceRoot":"","sources":["../src/frame-reader.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKjE,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED;;kBAEkB;AAClB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;gFAEgF;AAChF,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CA4DjB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAIjD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { fstatSync, readSync } from "node:fs";
|
|
2
|
+
import { PREFIX_BYTES, chainFrame, decodeFrameBody, newFrameChain, readFramePrefix, } from "./frame-codec.js";
|
|
3
|
+
import { foldStream } from "./journal-fold.js";
|
|
4
|
+
// Read-ahead window; a frame larger than the window gets its own exact buffer.
|
|
5
|
+
const WINDOW_BYTES = 4 * 1024 * 1024;
|
|
6
|
+
/** Positional frame-at-a-time reader over a descriptor: bounded buffers, the
|
|
7
|
+
* same prefix/hash/chain/epoch/seq validation as `replayFrames`, optional fold
|
|
8
|
+
* applied while streaming. Throws when the file shrinks underneath the read. */
|
|
9
|
+
export function readFrames(fd, partition, options = {}) {
|
|
10
|
+
const size = descriptorSize(fd);
|
|
11
|
+
const end = options.limit === undefined ? size : Math.min(size, options.limit);
|
|
12
|
+
const window = new PositionalWindow(fd, end);
|
|
13
|
+
const chain = newFrameChain(partition);
|
|
14
|
+
const sink = foldStream(options.fold);
|
|
15
|
+
let offset = 0;
|
|
16
|
+
let incompleteOffset = null;
|
|
17
|
+
let error = null;
|
|
18
|
+
while (offset < end) {
|
|
19
|
+
const remaining = end - offset;
|
|
20
|
+
const prefix = readFramePrefix(window.view(offset, Math.min(PREFIX_BYTES, remaining)), remaining);
|
|
21
|
+
if (prefix.status === "incomplete") {
|
|
22
|
+
incompleteOffset = offset;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
if (prefix.status === "corrupt") {
|
|
26
|
+
error = { offset, reason: prefix.reason };
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
const body = decodeFrameBody(window.view(offset, prefix.frameLength), prefix.headerLength, prefix.payloadLength);
|
|
30
|
+
if (body.status === "corrupt") {
|
|
31
|
+
error = { offset, reason: body.reason };
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
const chained = chainFrame(chain, body, offset, prefix.payloadLength);
|
|
35
|
+
if (chained.status === "corrupt") {
|
|
36
|
+
error = { offset, reason: chained.reason };
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
chained.records.forEach((record, index) => sink.push(record, {
|
|
40
|
+
seq: record.seq,
|
|
41
|
+
type: record.type,
|
|
42
|
+
time: record.time,
|
|
43
|
+
payload: record.payload,
|
|
44
|
+
byteLength: chained.byteLengths[index],
|
|
45
|
+
}));
|
|
46
|
+
offset += prefix.frameLength;
|
|
47
|
+
}
|
|
48
|
+
const folded = sink.finish();
|
|
49
|
+
return {
|
|
50
|
+
retained: folded.retained,
|
|
51
|
+
epoch: chain.epoch,
|
|
52
|
+
nextSeq: chain.expectedSeq,
|
|
53
|
+
previousFrameHash: chain.previous,
|
|
54
|
+
knownFileBytes: offset,
|
|
55
|
+
incompleteOffset,
|
|
56
|
+
error,
|
|
57
|
+
retiredCount: folded.retiredCount,
|
|
58
|
+
retiredBytes: folded.retiredBytes,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function descriptorSize(fd) {
|
|
62
|
+
const size = Number(fstatSync(fd, { bigint: true }).size);
|
|
63
|
+
if (!Number.isSafeInteger(size) || size < 0)
|
|
64
|
+
throw new Error("journal file size is invalid");
|
|
65
|
+
return size;
|
|
66
|
+
}
|
|
67
|
+
class PositionalWindow {
|
|
68
|
+
fd;
|
|
69
|
+
end;
|
|
70
|
+
buffer = Buffer.alloc(0);
|
|
71
|
+
start = 0;
|
|
72
|
+
length = 0;
|
|
73
|
+
constructor(fd, end) {
|
|
74
|
+
this.fd = fd;
|
|
75
|
+
this.end = end;
|
|
76
|
+
}
|
|
77
|
+
/** A view of `[offset, offset + length)`; valid until the next call. */
|
|
78
|
+
view(offset, length) {
|
|
79
|
+
if (offset >= this.start && offset + length <= this.start + this.length) {
|
|
80
|
+
return this.buffer.subarray(offset - this.start, offset - this.start + length);
|
|
81
|
+
}
|
|
82
|
+
const wanted = Math.min(Math.max(WINDOW_BYTES, length), this.end - offset);
|
|
83
|
+
if (this.buffer.length < wanted)
|
|
84
|
+
this.buffer = Buffer.allocUnsafe(wanted);
|
|
85
|
+
let filled = 0;
|
|
86
|
+
while (filled < wanted) {
|
|
87
|
+
const read = readSync(this.fd, this.buffer, filled, wanted - filled, offset + filled);
|
|
88
|
+
if (read === 0)
|
|
89
|
+
throw new Error("journal changed while being read");
|
|
90
|
+
filled += read;
|
|
91
|
+
}
|
|
92
|
+
this.start = offset;
|
|
93
|
+
this.length = wanted;
|
|
94
|
+
return this.buffer.subarray(0, length);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=frame-reader.js.map
|