@peerbit/native-backbone 0.1.3 → 0.2.0
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/README.md +31 -0
- package/dist/src/durability/codec.d.ts +86 -0
- package/dist/src/durability/codec.d.ts.map +1 -0
- package/dist/src/durability/codec.js +365 -0
- package/dist/src/durability/codec.js.map +1 -0
- package/dist/src/durability/lease.d.ts +59 -0
- package/dist/src/durability/lease.d.ts.map +1 -0
- package/dist/src/durability/lease.js +48 -0
- package/dist/src/durability/lease.js.map +1 -0
- package/dist/src/durability/memory-storage.d.ts +37 -0
- package/dist/src/durability/memory-storage.d.ts.map +1 -0
- package/dist/src/durability/memory-storage.js +436 -0
- package/dist/src/durability/memory-storage.js.map +1 -0
- package/dist/src/durability/node-lease.d.ts +14 -0
- package/dist/src/durability/node-lease.d.ts.map +1 -0
- package/dist/src/durability/node-lease.js +214 -0
- package/dist/src/durability/node-lease.js.map +1 -0
- package/dist/src/durability/node-storage.d.ts +76 -0
- package/dist/src/durability/node-storage.d.ts.map +1 -0
- package/dist/src/durability/node-storage.js +1813 -0
- package/dist/src/durability/node-storage.js.map +1 -0
- package/dist/src/durability/storage.d.ts +224 -0
- package/dist/src/durability/storage.d.ts.map +1 -0
- package/dist/src/durability/storage.js +343 -0
- package/dist/src/durability/storage.js.map +1 -0
- package/dist/src/index.d.ts +93 -15
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +717 -199
- package/dist/src/index.js.map +1 -1
- package/dist/wasm/README.md +31 -0
- package/dist/wasm/native_backbone.d.ts +93 -77
- package/dist/wasm/native_backbone.js +96 -0
- package/dist/wasm/native_backbone_bg.wasm +0 -0
- package/dist/wasm/native_backbone_bg.wasm.d.ts +81 -77
- package/package.json +4 -3
- package/src/append_tx/committed_latest.rs +24 -43
- package/src/documents.rs +7 -9
- package/src/durability/codec.ts +683 -0
- package/src/durability/lease.ts +87 -0
- package/src/durability/memory-storage.ts +593 -0
- package/src/durability/node-lease.ts +293 -0
- package/src/durability/node-storage.ts +2798 -0
- package/src/durability/storage.ts +682 -0
- package/src/durability.rs +1872 -0
- package/src/error.rs +8 -0
- package/src/index.ts +1392 -735
- package/src/lib.rs +1 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type NativeDurabilityLease } from "./lease.js";
|
|
2
|
+
import { type NativeDurabilityCheckpoint, type NativeDurabilityCheckpointReceipt, type NativeDurabilityCheckpointRequest, type NativeDurabilityDeleteReceipt, type NativeDurabilityDeleteRequest, type NativeDurabilityIncompleteTailReconciliationRequest, type NativeDurabilityJournalAppendRequest, type NativeDurabilityJournalClassifier, type NativeDurabilityJournalReceipt, type NativeDurabilityJournalReconciliationReceipt, type NativeDurabilityStageReceipt, type NativeDurabilityStageRequest, type NativeDurabilityStagingManifest, type NativeDurabilityStorage, type NativeDurabilityStorageStats } from "./storage.js";
|
|
3
|
+
export declare class MemoryNativeDurabilityStorage implements NativeDurabilityStorage {
|
|
4
|
+
private readonly lease;
|
|
5
|
+
private readonly journalClassifier;
|
|
6
|
+
readonly version: 1;
|
|
7
|
+
readonly kind: "memory";
|
|
8
|
+
readonly crashSafe = false;
|
|
9
|
+
readonly domainId: string;
|
|
10
|
+
readonly fence: NativeDurabilityLease["fence"];
|
|
11
|
+
private barrierOrdinal;
|
|
12
|
+
private strictDeleteCount;
|
|
13
|
+
private journal;
|
|
14
|
+
private readonly staging;
|
|
15
|
+
private readonly checkpoints;
|
|
16
|
+
private generationHighwater;
|
|
17
|
+
private operationTail;
|
|
18
|
+
private closing;
|
|
19
|
+
private closed;
|
|
20
|
+
constructor(lease: NativeDurabilityLease, journalClassifier: NativeDurabilityJournalClassifier);
|
|
21
|
+
private barrier;
|
|
22
|
+
private enqueue;
|
|
23
|
+
stageAndSync(unsafeRequest: NativeDurabilityStageRequest): Promise<NativeDurabilityStageReceipt>;
|
|
24
|
+
readStagingManifest(transactionId: string): Promise<NativeDurabilityStagingManifest | undefined>;
|
|
25
|
+
readStagedBlock(transactionId: string, ordinal: number): Promise<Uint8Array | undefined>;
|
|
26
|
+
listStagingTransactionIds(): Promise<string[]>;
|
|
27
|
+
appendJournalAndSync(unsafeRequest: NativeDurabilityJournalAppendRequest): Promise<NativeDurabilityJournalReceipt>;
|
|
28
|
+
readJournal(): Promise<Uint8Array>;
|
|
29
|
+
reconcileIncompleteJournalTailAndSync(unsafeRequest: NativeDurabilityIncompleteTailReconciliationRequest): Promise<NativeDurabilityJournalReconciliationReceipt>;
|
|
30
|
+
writeCheckpointAndSync(unsafeRequest: NativeDurabilityCheckpointRequest): Promise<NativeDurabilityCheckpointReceipt>;
|
|
31
|
+
readLatestCheckpoint(): Promise<NativeDurabilityCheckpoint | undefined>;
|
|
32
|
+
deleteAndSync(unsafeRequest: NativeDurabilityDeleteRequest): Promise<NativeDurabilityDeleteReceipt>;
|
|
33
|
+
stats(): Promise<NativeDurabilityStorageStats>;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export declare const createMemoryNativeDurabilityStorage: (lease: NativeDurabilityLease, journalClassifier: NativeDurabilityJournalClassifier) => MemoryNativeDurabilityStorage;
|
|
37
|
+
//# sourceMappingURL=memory-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage.d.ts","sourceRoot":"","sources":["../../../src/durability/memory-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,qBAAqB,EAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAEN,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EAGlC,KAAK,mDAAmD,EACxD,KAAK,oCAAoC,EACzC,KAAK,iCAAiC,EAEtC,KAAK,8BAA8B,EACnC,KAAK,4CAA4C,EACjD,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EAEjC,KAAK,+BAA+B,EACpC,KAAK,uBAAuB,EAE5B,KAAK,4BAA4B,EAWjC,MAAM,cAAc,CAAC;AA4EtB,qBAAa,6BAA8B,YAAW,uBAAuB;IAwB3E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAxBnC,QAAQ,CAAC,OAAO,IAAqC;IACrD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,SAAS,SAAS;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/C,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAMpB;IACJ,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAC7E,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAGL,KAAK,EAAE,qBAAqB,EAC5B,iBAAiB,EAAE,iCAAiC;IAOtE,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,OAAO;IAoBT,YAAY,CACjB,aAAa,EAAE,4BAA4B,GACzC,OAAO,CAAC,4BAA4B,CAAC;IA+ElC,mBAAmB,CACxB,aAAa,EAAE,MAAM,GACnB,OAAO,CAAC,+BAA+B,GAAG,SAAS,CAAC;IAiBjD,eAAe,CACpB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAO5B,yBAAyB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI9C,oBAAoB,CACzB,aAAa,EAAE,oCAAoC,GACjD,OAAO,CAAC,8BAA8B,CAAC;IAqCpC,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IAIlC,qCAAqC,CAC1C,aAAa,EAAE,mDAAmD,GAChE,OAAO,CAAC,4CAA4C,CAAC;IA6DlD,sBAAsB,CAC3B,aAAa,EAAE,iCAAiC,GAC9C,OAAO,CAAC,iCAAiC,CAAC;IAkEvC,oBAAoB,IAAI,OAAO,CACpC,0BAA0B,GAAG,SAAS,CACtC;IA2BK,aAAa,CAClB,aAAa,EAAE,6BAA6B,GAC1C,OAAO,CAAC,6BAA6B,CAAC;IA+DnC,KAAK,IAAI,OAAO,CAAC,4BAA4B,CAAC;IA6B9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM5B;AAED,eAAO,MAAM,mCAAmC,GAC/C,OAAO,qBAAqB,EAC5B,mBAAmB,iCAAiC,KAClD,6BACyD,CAAC"}
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { NATIVE_DURABILITY_MAX_U64, } from "./lease.js";
|
|
2
|
+
import { NATIVE_DURABILITY_STORAGE_VERSION, NativeDurabilityDigestMismatchError, NativeDurabilityIncompleteTailMismatchError, NativeDurabilityJournalOffsetConflictError, NativeDurabilityStorageClosedError, assertNativeDurabilityCheckpointRequest, assertNativeDurabilityDeleteRequest, assertNativeDurabilityFence, assertNativeDurabilityJournalAppendRequest, assertNativeDurabilityOperationScope, assertNativeDurabilityStageRequest, copyNativeDurabilityBytes, nativeDurabilityBytesEqual, nativeDurabilityScopeDigest, sha256NativeDurability, } from "./storage.js";
|
|
3
|
+
const cloneFence = (fence) => ({ ...fence });
|
|
4
|
+
const cloneScope = (scope) => ({ ...scope });
|
|
5
|
+
const cloneRetainedTransactions = (transactions) => transactions.map((transaction) => ({
|
|
6
|
+
...transaction,
|
|
7
|
+
planDigest: copyNativeDurabilityBytes(transaction.planDigest),
|
|
8
|
+
}));
|
|
9
|
+
const snapshotStageRequest = (request) => {
|
|
10
|
+
assertNativeDurabilityStageRequest(request);
|
|
11
|
+
return {
|
|
12
|
+
scope: { ...request.scope },
|
|
13
|
+
blocks: [...request.blocks]
|
|
14
|
+
.sort((left, right) => left.ordinal - right.ordinal)
|
|
15
|
+
.map((block) => ({
|
|
16
|
+
...block,
|
|
17
|
+
bytes: copyNativeDurabilityBytes(block.bytes),
|
|
18
|
+
digest: copyNativeDurabilityBytes(block.digest),
|
|
19
|
+
})),
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const snapshotJournalRequest = (request) => {
|
|
23
|
+
assertNativeDurabilityJournalAppendRequest(request);
|
|
24
|
+
return {
|
|
25
|
+
...request,
|
|
26
|
+
frames: copyNativeDurabilityBytes(request.frames),
|
|
27
|
+
framesDigest: copyNativeDurabilityBytes(request.framesDigest),
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const snapshotCheckpointRequest = (request) => {
|
|
31
|
+
assertNativeDurabilityCheckpointRequest(request);
|
|
32
|
+
return {
|
|
33
|
+
...request,
|
|
34
|
+
scope: { ...request.scope },
|
|
35
|
+
bytes: copyNativeDurabilityBytes(request.bytes),
|
|
36
|
+
digest: copyNativeDurabilityBytes(request.digest),
|
|
37
|
+
stagingCoverage: request.stagingCoverage.map((coverage) => ({
|
|
38
|
+
...coverage,
|
|
39
|
+
stagingManifestDigest: copyNativeDurabilityBytes(coverage.stagingManifestDigest),
|
|
40
|
+
})),
|
|
41
|
+
retainedTransactions: cloneRetainedTransactions(request.retainedTransactions),
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
const snapshotDeleteRequest = (request) => {
|
|
45
|
+
assertNativeDurabilityDeleteRequest(request);
|
|
46
|
+
return {
|
|
47
|
+
scope: { ...request.scope },
|
|
48
|
+
targets: request.targets.map((target) => ({ ...target })),
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
export class MemoryNativeDurabilityStorage {
|
|
52
|
+
lease;
|
|
53
|
+
journalClassifier;
|
|
54
|
+
version = NATIVE_DURABILITY_STORAGE_VERSION;
|
|
55
|
+
kind = "memory";
|
|
56
|
+
crashSafe = false;
|
|
57
|
+
domainId;
|
|
58
|
+
fence;
|
|
59
|
+
barrierOrdinal = 0n;
|
|
60
|
+
strictDeleteCount = 0n;
|
|
61
|
+
journal = new Uint8Array();
|
|
62
|
+
staging = new Map();
|
|
63
|
+
checkpoints = new Map();
|
|
64
|
+
generationHighwater = 0n;
|
|
65
|
+
operationTail = Promise.resolve();
|
|
66
|
+
closing = false;
|
|
67
|
+
closed = false;
|
|
68
|
+
constructor(lease, journalClassifier) {
|
|
69
|
+
this.lease = lease;
|
|
70
|
+
this.journalClassifier = journalClassifier;
|
|
71
|
+
assertNativeDurabilityFence(lease.fence);
|
|
72
|
+
this.domainId = lease.fence.domainId;
|
|
73
|
+
this.fence = Object.freeze({ ...lease.fence });
|
|
74
|
+
}
|
|
75
|
+
barrier() {
|
|
76
|
+
this.barrierOrdinal++;
|
|
77
|
+
return this.barrierOrdinal;
|
|
78
|
+
}
|
|
79
|
+
enqueue(operation) {
|
|
80
|
+
if (this.closing || this.closed) {
|
|
81
|
+
return Promise.reject(new NativeDurabilityStorageClosedError());
|
|
82
|
+
}
|
|
83
|
+
let resolveResult;
|
|
84
|
+
let rejectResult;
|
|
85
|
+
const result = new Promise((resolve, reject) => {
|
|
86
|
+
resolveResult = resolve;
|
|
87
|
+
rejectResult = reject;
|
|
88
|
+
});
|
|
89
|
+
this.operationTail = this.operationTail.then(async () => {
|
|
90
|
+
try {
|
|
91
|
+
resolveResult(await this.lease.runWhileHeld(operation));
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
rejectResult(error);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
async stageAndSync(unsafeRequest) {
|
|
100
|
+
const request = snapshotStageRequest(unsafeRequest);
|
|
101
|
+
return this.enqueue(async () => {
|
|
102
|
+
const references = [];
|
|
103
|
+
const blocks = new Map();
|
|
104
|
+
const seenOrdinals = new Set();
|
|
105
|
+
for (const block of request.blocks) {
|
|
106
|
+
if (!Number.isSafeInteger(block.ordinal) || block.ordinal < 0) {
|
|
107
|
+
throw new RangeError("Staging ordinal must be a non-negative safe integer");
|
|
108
|
+
}
|
|
109
|
+
if (seenOrdinals.has(block.ordinal)) {
|
|
110
|
+
throw new Error(`Duplicate staging ordinal ${block.ordinal}`);
|
|
111
|
+
}
|
|
112
|
+
seenOrdinals.add(block.ordinal);
|
|
113
|
+
const actual = await sha256NativeDurability(block.bytes);
|
|
114
|
+
if (!nativeDurabilityBytesEqual(actual, block.digest)) {
|
|
115
|
+
throw new NativeDurabilityDigestMismatchError(`staged block ${block.ordinal}`);
|
|
116
|
+
}
|
|
117
|
+
blocks.set(block.ordinal, copyNativeDurabilityBytes(block.bytes));
|
|
118
|
+
references.push({
|
|
119
|
+
ordinal: block.ordinal,
|
|
120
|
+
cid: block.cid,
|
|
121
|
+
byteLength: block.bytes.byteLength,
|
|
122
|
+
digest: copyNativeDurabilityBytes(block.digest),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
references.sort((left, right) => left.ordinal - right.ordinal);
|
|
126
|
+
const manifestPayload = {
|
|
127
|
+
version: this.version,
|
|
128
|
+
scope: request.scope,
|
|
129
|
+
fence: this.lease.fence,
|
|
130
|
+
blocks: references,
|
|
131
|
+
};
|
|
132
|
+
const manifestDigest = await nativeDurabilityScopeDigest(manifestPayload);
|
|
133
|
+
const manifest = {
|
|
134
|
+
...manifestPayload,
|
|
135
|
+
scope: cloneScope(request.scope),
|
|
136
|
+
fence: cloneFence(this.lease.fence),
|
|
137
|
+
blocks: references,
|
|
138
|
+
manifestDigest,
|
|
139
|
+
};
|
|
140
|
+
const existing = this.staging.get(request.scope.transactionId);
|
|
141
|
+
if (existing &&
|
|
142
|
+
!nativeDurabilityBytesEqual(existing.manifest.manifestDigest, manifest.manifestDigest)) {
|
|
143
|
+
throw new Error(`Staging transaction ${request.scope.transactionId} already has a different manifest`);
|
|
144
|
+
}
|
|
145
|
+
this.staging.set(request.scope.transactionId, { manifest, blocks });
|
|
146
|
+
const receipt = {
|
|
147
|
+
version: this.version,
|
|
148
|
+
kind: "stage",
|
|
149
|
+
domainId: this.domainId,
|
|
150
|
+
fence: cloneFence(this.lease.fence),
|
|
151
|
+
transactionId: request.scope.transactionId,
|
|
152
|
+
txSequence: request.scope.txSequence,
|
|
153
|
+
firstRecordLsn: request.scope.recordLsn,
|
|
154
|
+
lastRecordLsn: request.scope.recordLsn,
|
|
155
|
+
scopeDigest: await nativeDurabilityScopeDigest(request),
|
|
156
|
+
barrierOrdinal: this.barrier(),
|
|
157
|
+
blocks: references.map((block) => ({
|
|
158
|
+
...block,
|
|
159
|
+
digest: copyNativeDurabilityBytes(block.digest),
|
|
160
|
+
})),
|
|
161
|
+
manifestDigest: copyNativeDurabilityBytes(manifestDigest),
|
|
162
|
+
};
|
|
163
|
+
return receipt;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async readStagingManifest(transactionId) {
|
|
167
|
+
return this.enqueue(async () => {
|
|
168
|
+
const manifest = this.staging.get(transactionId)?.manifest;
|
|
169
|
+
if (!manifest)
|
|
170
|
+
return undefined;
|
|
171
|
+
return {
|
|
172
|
+
...manifest,
|
|
173
|
+
scope: cloneScope(manifest.scope),
|
|
174
|
+
fence: cloneFence(manifest.fence),
|
|
175
|
+
blocks: manifest.blocks.map((block) => ({
|
|
176
|
+
...block,
|
|
177
|
+
digest: copyNativeDurabilityBytes(block.digest),
|
|
178
|
+
})),
|
|
179
|
+
manifestDigest: copyNativeDurabilityBytes(manifest.manifestDigest),
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
async readStagedBlock(transactionId, ordinal) {
|
|
184
|
+
return this.enqueue(async () => {
|
|
185
|
+
const bytes = this.staging.get(transactionId)?.blocks.get(ordinal);
|
|
186
|
+
return bytes && copyNativeDurabilityBytes(bytes);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async listStagingTransactionIds() {
|
|
190
|
+
return this.enqueue(async () => [...this.staging.keys()].sort());
|
|
191
|
+
}
|
|
192
|
+
async appendJournalAndSync(unsafeRequest) {
|
|
193
|
+
const request = snapshotJournalRequest(unsafeRequest);
|
|
194
|
+
return this.enqueue(async () => {
|
|
195
|
+
if (request.expectedOffset !== this.journal.byteLength) {
|
|
196
|
+
throw new NativeDurabilityJournalOffsetConflictError(request.expectedOffset, this.journal.byteLength);
|
|
197
|
+
}
|
|
198
|
+
const actual = await sha256NativeDurability(request.frames);
|
|
199
|
+
if (!nativeDurabilityBytesEqual(actual, request.framesDigest)) {
|
|
200
|
+
throw new NativeDurabilityDigestMismatchError("journal frames");
|
|
201
|
+
}
|
|
202
|
+
const next = new Uint8Array(this.journal.byteLength + request.frames.byteLength);
|
|
203
|
+
next.set(this.journal);
|
|
204
|
+
next.set(request.frames, this.journal.byteLength);
|
|
205
|
+
this.journal = next;
|
|
206
|
+
return {
|
|
207
|
+
version: this.version,
|
|
208
|
+
kind: "journal-append",
|
|
209
|
+
domainId: this.domainId,
|
|
210
|
+
fence: cloneFence(this.lease.fence),
|
|
211
|
+
transactionId: request.transactionId,
|
|
212
|
+
txSequence: request.txSequence,
|
|
213
|
+
firstRecordLsn: request.firstRecordLsn,
|
|
214
|
+
lastRecordLsn: request.lastRecordLsn,
|
|
215
|
+
scopeDigest: await nativeDurabilityScopeDigest(request),
|
|
216
|
+
barrierOrdinal: this.barrier(),
|
|
217
|
+
offset: request.expectedOffset,
|
|
218
|
+
endOffset: this.journal.byteLength,
|
|
219
|
+
framesDigest: copyNativeDurabilityBytes(request.framesDigest),
|
|
220
|
+
};
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
async readJournal() {
|
|
224
|
+
return this.enqueue(async () => copyNativeDurabilityBytes(this.journal));
|
|
225
|
+
}
|
|
226
|
+
async reconcileIncompleteJournalTailAndSync(unsafeRequest) {
|
|
227
|
+
const request = { ...unsafeRequest };
|
|
228
|
+
try {
|
|
229
|
+
assertNativeDurabilityOperationScope({
|
|
230
|
+
...request,
|
|
231
|
+
recordLsn: 0n,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
return Promise.reject(error);
|
|
236
|
+
}
|
|
237
|
+
if (request.txSequence === 0n) {
|
|
238
|
+
return Promise.reject(new TypeError("Invalid incomplete-tail reconciliation request"));
|
|
239
|
+
}
|
|
240
|
+
return this.enqueue(async () => {
|
|
241
|
+
const observed = copyNativeDurabilityBytes(this.journal);
|
|
242
|
+
const observedDigest = await sha256NativeDurability(observed);
|
|
243
|
+
const classified = await this.journalClassifier.classify(copyNativeDurabilityBytes(observed));
|
|
244
|
+
const classification = { ...classified };
|
|
245
|
+
if (classification.kind !== "incomplete-tail" ||
|
|
246
|
+
!Number.isSafeInteger(classification.validLength) ||
|
|
247
|
+
classification.validLength < 0 ||
|
|
248
|
+
classification.validLength >= observed.byteLength ||
|
|
249
|
+
typeof classification.lastRecordLsn !== "bigint" ||
|
|
250
|
+
classification.lastRecordLsn < 0n ||
|
|
251
|
+
classification.lastRecordLsn > NATIVE_DURABILITY_MAX_U64 ||
|
|
252
|
+
(classification.reason !== "short-header" &&
|
|
253
|
+
classification.reason !== "short-body" &&
|
|
254
|
+
classification.reason !== "short-trailer")) {
|
|
255
|
+
throw new NativeDurabilityIncompleteTailMismatchError("The exact current journal does not end in a structurally incomplete frame");
|
|
256
|
+
}
|
|
257
|
+
this.journal = observed.slice(0, classification.validLength);
|
|
258
|
+
return {
|
|
259
|
+
version: this.version,
|
|
260
|
+
kind: "journal-tail-reconciliation",
|
|
261
|
+
domainId: this.domainId,
|
|
262
|
+
fence: cloneFence(this.lease.fence),
|
|
263
|
+
transactionId: request.transactionId,
|
|
264
|
+
txSequence: request.txSequence,
|
|
265
|
+
firstRecordLsn: classification.lastRecordLsn,
|
|
266
|
+
lastRecordLsn: classification.lastRecordLsn,
|
|
267
|
+
scopeDigest: await nativeDurabilityScopeDigest({
|
|
268
|
+
...request,
|
|
269
|
+
classification,
|
|
270
|
+
observedDigest,
|
|
271
|
+
}),
|
|
272
|
+
barrierOrdinal: this.barrier(),
|
|
273
|
+
previousLength: observed.byteLength,
|
|
274
|
+
validLength: classification.validLength,
|
|
275
|
+
observedDigest,
|
|
276
|
+
};
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
async writeCheckpointAndSync(unsafeRequest) {
|
|
280
|
+
const request = snapshotCheckpointRequest(unsafeRequest);
|
|
281
|
+
return this.enqueue(async () => {
|
|
282
|
+
const actual = await sha256NativeDurability(request.bytes);
|
|
283
|
+
if (!nativeDurabilityBytesEqual(actual, request.digest)) {
|
|
284
|
+
throw new NativeDurabilityDigestMismatchError("checkpoint");
|
|
285
|
+
}
|
|
286
|
+
for (const coverage of request.stagingCoverage) {
|
|
287
|
+
const staged = this.staging.get(coverage.transactionId)?.manifest;
|
|
288
|
+
if (!staged ||
|
|
289
|
+
staged.scope.txSequence !== coverage.txSequence ||
|
|
290
|
+
coverage.coveredThroughLsn < staged.scope.recordLsn ||
|
|
291
|
+
!nativeDurabilityBytesEqual(staged.manifestDigest, coverage.stagingManifestDigest)) {
|
|
292
|
+
throw new Error(`Checkpoint coverage does not match staging transaction ${coverage.transactionId}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
const generation = ++this.generationHighwater;
|
|
296
|
+
const manifestSlot = generation % 2n === 1n ? "a" : "b";
|
|
297
|
+
this.checkpoints.set(generation, {
|
|
298
|
+
version: this.version,
|
|
299
|
+
generation,
|
|
300
|
+
checkpointLsn: request.checkpointLsn,
|
|
301
|
+
txSequenceHighwater: request.txSequenceHighwater,
|
|
302
|
+
bytes: copyNativeDurabilityBytes(request.bytes),
|
|
303
|
+
digest: copyNativeDurabilityBytes(request.digest),
|
|
304
|
+
originFence: cloneFence(this.lease.fence),
|
|
305
|
+
manifestSlot,
|
|
306
|
+
stagingCoverage: request.stagingCoverage.map((coverage) => ({
|
|
307
|
+
...coverage,
|
|
308
|
+
stagingManifestDigest: copyNativeDurabilityBytes(coverage.stagingManifestDigest),
|
|
309
|
+
})),
|
|
310
|
+
retainedTransactions: cloneRetainedTransactions(request.retainedTransactions),
|
|
311
|
+
});
|
|
312
|
+
return {
|
|
313
|
+
version: this.version,
|
|
314
|
+
kind: "checkpoint",
|
|
315
|
+
domainId: this.domainId,
|
|
316
|
+
fence: cloneFence(this.lease.fence),
|
|
317
|
+
transactionId: request.scope.transactionId,
|
|
318
|
+
txSequence: request.scope.txSequence,
|
|
319
|
+
firstRecordLsn: request.scope.recordLsn,
|
|
320
|
+
lastRecordLsn: request.scope.recordLsn,
|
|
321
|
+
scopeDigest: await nativeDurabilityScopeDigest(request),
|
|
322
|
+
barrierOrdinal: this.barrier(),
|
|
323
|
+
generation,
|
|
324
|
+
checkpointLsn: request.checkpointLsn,
|
|
325
|
+
checkpointDigest: copyNativeDurabilityBytes(request.digest),
|
|
326
|
+
manifestSlot,
|
|
327
|
+
stagingCoverageDigest: await nativeDurabilityScopeDigest(request.stagingCoverage),
|
|
328
|
+
};
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
async readLatestCheckpoint() {
|
|
332
|
+
return this.enqueue(async () => {
|
|
333
|
+
const latest = [...this.checkpoints.keys()].sort((left, right) => left < right ? 1 : left > right ? -1 : 0)[0];
|
|
334
|
+
const checkpoint = latest == null ? undefined : this.checkpoints.get(latest);
|
|
335
|
+
return (checkpoint && {
|
|
336
|
+
...checkpoint,
|
|
337
|
+
bytes: copyNativeDurabilityBytes(checkpoint.bytes),
|
|
338
|
+
digest: copyNativeDurabilityBytes(checkpoint.digest),
|
|
339
|
+
originFence: cloneFence(checkpoint.originFence),
|
|
340
|
+
stagingCoverage: checkpoint.stagingCoverage.map((coverage) => ({
|
|
341
|
+
...coverage,
|
|
342
|
+
stagingManifestDigest: copyNativeDurabilityBytes(coverage.stagingManifestDigest),
|
|
343
|
+
})),
|
|
344
|
+
retainedTransactions: cloneRetainedTransactions(checkpoint.retainedTransactions),
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
async deleteAndSync(unsafeRequest) {
|
|
349
|
+
const request = snapshotDeleteRequest(unsafeRequest);
|
|
350
|
+
return this.enqueue(async () => {
|
|
351
|
+
const checkpointGenerations = [...this.checkpoints.keys()].sort((left, right) => (left < right ? 1 : left > right ? -1 : 0));
|
|
352
|
+
const active = checkpointGenerations[0];
|
|
353
|
+
const previous = checkpointGenerations[1];
|
|
354
|
+
const activeCheckpoint = active == null ? undefined : this.checkpoints.get(active);
|
|
355
|
+
// Validate every target before applying any of them.
|
|
356
|
+
for (const target of request.targets) {
|
|
357
|
+
if (target.kind === "staging") {
|
|
358
|
+
const staged = this.staging.get(target.transactionId)?.manifest;
|
|
359
|
+
if (staged) {
|
|
360
|
+
const covered = activeCheckpoint?.stagingCoverage.some((coverage) => coverage.transactionId === staged.scope.transactionId &&
|
|
361
|
+
coverage.txSequence === staged.scope.txSequence &&
|
|
362
|
+
coverage.coveredThroughLsn >= staged.scope.recordLsn &&
|
|
363
|
+
nativeDurabilityBytesEqual(coverage.stagingManifestDigest, staged.manifestDigest));
|
|
364
|
+
if (!covered) {
|
|
365
|
+
throw new Error(`Active checkpoint does not cover staging transaction ${target.transactionId}`);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
if (target.generation === active || target.generation === previous) {
|
|
371
|
+
throw new Error(`Cannot delete active or previous checkpoint generation ${target.generation}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
for (const target of request.targets) {
|
|
376
|
+
if (target.kind === "staging") {
|
|
377
|
+
this.staging.delete(target.transactionId);
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
this.checkpoints.delete(target.generation);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
this.strictDeleteCount++;
|
|
384
|
+
return {
|
|
385
|
+
version: this.version,
|
|
386
|
+
kind: "delete",
|
|
387
|
+
domainId: this.domainId,
|
|
388
|
+
fence: cloneFence(this.lease.fence),
|
|
389
|
+
transactionId: request.scope.transactionId,
|
|
390
|
+
txSequence: request.scope.txSequence,
|
|
391
|
+
firstRecordLsn: request.scope.recordLsn,
|
|
392
|
+
lastRecordLsn: request.scope.recordLsn,
|
|
393
|
+
scopeDigest: await nativeDurabilityScopeDigest(request),
|
|
394
|
+
barrierOrdinal: this.barrier(),
|
|
395
|
+
targets: request.targets.map((target) => ({ ...target })),
|
|
396
|
+
};
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
async stats() {
|
|
400
|
+
return this.enqueue(async () => {
|
|
401
|
+
let stagedBlocks = 0;
|
|
402
|
+
let stagedBytes = 0;
|
|
403
|
+
for (const transaction of this.staging.values()) {
|
|
404
|
+
stagedBlocks += transaction.blocks.size;
|
|
405
|
+
for (const block of transaction.blocks.values()) {
|
|
406
|
+
stagedBytes += block.byteLength;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
let checkpointBytes = 0;
|
|
410
|
+
for (const checkpoint of this.checkpoints.values()) {
|
|
411
|
+
checkpointBytes += checkpoint.bytes.byteLength;
|
|
412
|
+
}
|
|
413
|
+
return {
|
|
414
|
+
kind: this.kind,
|
|
415
|
+
domainId: this.domainId,
|
|
416
|
+
strictBarrierCount: this.barrierOrdinal,
|
|
417
|
+
strictDeleteCount: this.strictDeleteCount,
|
|
418
|
+
journalBytes: this.journal.byteLength,
|
|
419
|
+
stagingTransactions: this.staging.size,
|
|
420
|
+
stagedBlocks,
|
|
421
|
+
stagedBytes,
|
|
422
|
+
checkpointGenerations: this.checkpoints.size,
|
|
423
|
+
checkpointBytes,
|
|
424
|
+
};
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
async close() {
|
|
428
|
+
if (this.closed)
|
|
429
|
+
return;
|
|
430
|
+
this.closing = true;
|
|
431
|
+
await this.operationTail;
|
|
432
|
+
this.closed = true;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
export const createMemoryNativeDurabilityStorage = (lease, journalClassifier) => new MemoryNativeDurabilityStorage(lease, journalClassifier);
|
|
436
|
+
//# sourceMappingURL=memory-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../../src/durability/memory-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type NativeDurabilityLease } from "./lease.js";
|
|
2
|
+
export declare const NATIVE_DURABILITY_NODE_LEASE_DIRECTORY_NAME = ".peerbit-native-durability-lease";
|
|
3
|
+
/**
|
|
4
|
+
* Acquire the crash-released Node ownership lease for an existing program
|
|
5
|
+
* directory.
|
|
6
|
+
*
|
|
7
|
+
* The dedicated ClassicLevel database lives beside, rather than inside, the
|
|
8
|
+
* transaction namespace. Its native LevelDB `LOCK` is held for this object's
|
|
9
|
+
* lifetime and is released by the operating system when the process dies. The
|
|
10
|
+
* lock database itself is intentionally retained so fence epochs cannot be
|
|
11
|
+
* reused after a normal reopen.
|
|
12
|
+
*/
|
|
13
|
+
export declare const acquireNativeDurabilityNodeLease: (programDirectory: string) => Promise<NativeDurabilityLease>;
|
|
14
|
+
//# sourceMappingURL=node-lease.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-lease.d.ts","sourceRoot":"","sources":["../../../src/durability/node-lease.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,KAAK,qBAAqB,EAK1B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,2CAA2C,qCACrB,CAAC;AAsMpC;;;;;;;;;GASG;AACH,eAAO,MAAM,gCAAgC,GAC5C,kBAAkB,MAAM,KACtB,OAAO,CAAC,qBAAqB,CAqE/B,CAAC"}
|