@peerbit/native-backbone 0.1.4 → 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 +131 -115
- 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 +119 -115
- package/package.json +4 -3
- 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/index.ts +1392 -735
- package/src/lib.rs +1 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import { NATIVE_DURABILITY_MAX_U64, NATIVE_DURABILITY_MAX_WRITER_ID_BYTES, NativeDurabilityFenceExhaustedError, NativeDurabilityLeaseClosedError, NativeDurabilityLeaseDirectorySyncError, NativeDurabilityLeaseStateError, NativeDurabilityLeaseUnavailableError, } from "./lease.js";
|
|
10
|
+
export const NATIVE_DURABILITY_NODE_LEASE_DIRECTORY_NAME = ".peerbit-native-durability-lease";
|
|
11
|
+
const LEASE_STATE_KEY = "fence";
|
|
12
|
+
const LEASE_STATE_VERSION = 1;
|
|
13
|
+
const dynamicImport = (specifier) => import(__rewriteRelativeImportExtension(/* @vite-ignore */ specifier));
|
|
14
|
+
const importClassicLevel = async () => {
|
|
15
|
+
const module = await dynamicImport("classic-level");
|
|
16
|
+
return module.ClassicLevel;
|
|
17
|
+
};
|
|
18
|
+
const hasErrorCode = (error, expected) => {
|
|
19
|
+
const visited = new Set();
|
|
20
|
+
let current = error;
|
|
21
|
+
while (current != null &&
|
|
22
|
+
typeof current === "object" &&
|
|
23
|
+
!visited.has(current)) {
|
|
24
|
+
visited.add(current);
|
|
25
|
+
if (current.code === expected) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
current = current.cause;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
};
|
|
32
|
+
const isMissingKeyError = (error) => hasErrorCode(error, "LEVEL_NOT_FOUND");
|
|
33
|
+
const decodeLeaseState = (encoded, directory) => {
|
|
34
|
+
let decoded;
|
|
35
|
+
try {
|
|
36
|
+
decoded = JSON.parse(encoded);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new NativeDurabilityLeaseStateError(directory, `Invalid native durability lease state in ${directory}`, { cause: error });
|
|
40
|
+
}
|
|
41
|
+
const value = decoded;
|
|
42
|
+
if (value?.version !== LEASE_STATE_VERSION ||
|
|
43
|
+
typeof value.epoch !== "string" ||
|
|
44
|
+
!/^(0|[1-9][0-9]*)$/.test(value.epoch) ||
|
|
45
|
+
BigInt(value.epoch) > NATIVE_DURABILITY_MAX_U64 ||
|
|
46
|
+
typeof value.ownerId !== "string" ||
|
|
47
|
+
value.ownerId.length === 0 ||
|
|
48
|
+
new TextEncoder().encode(value.ownerId).byteLength >
|
|
49
|
+
NATIVE_DURABILITY_MAX_WRITER_ID_BYTES ||
|
|
50
|
+
typeof value.domainId !== "string" ||
|
|
51
|
+
value.domainId.length === 0 ||
|
|
52
|
+
new TextEncoder().encode(value.domainId).byteLength >
|
|
53
|
+
NATIVE_DURABILITY_MAX_WRITER_ID_BYTES) {
|
|
54
|
+
throw new NativeDurabilityLeaseStateError(directory, `Invalid native durability lease state in ${directory}`);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
};
|
|
58
|
+
const readLeaseState = async (database, directory) => {
|
|
59
|
+
try {
|
|
60
|
+
const encoded = await database.get(LEASE_STATE_KEY);
|
|
61
|
+
return encoded == null ? undefined : decodeLeaseState(encoded, directory);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (isMissingKeyError(error)) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const syncDirectory = async (fs, directory) => {
|
|
71
|
+
let handle;
|
|
72
|
+
try {
|
|
73
|
+
handle = await fs.open(directory, "r");
|
|
74
|
+
await handle.sync();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new NativeDurabilityLeaseDirectorySyncError(directory, {
|
|
78
|
+
cause: error,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
await handle?.close();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
class NodeNativeDurabilityLease {
|
|
86
|
+
fence;
|
|
87
|
+
database;
|
|
88
|
+
state = "held";
|
|
89
|
+
closePromise;
|
|
90
|
+
activeOperations = 0;
|
|
91
|
+
drainPromise;
|
|
92
|
+
resolveDrain;
|
|
93
|
+
constructor(fence, database) {
|
|
94
|
+
this.fence = fence;
|
|
95
|
+
this.database = database;
|
|
96
|
+
}
|
|
97
|
+
async assertHeld() {
|
|
98
|
+
if (this.state !== "held" || this.database.status !== "open") {
|
|
99
|
+
throw new NativeDurabilityLeaseClosedError(this.fence);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async runWhileHeld(operation) {
|
|
103
|
+
if (this.state !== "held" || this.database.status !== "open") {
|
|
104
|
+
throw new NativeDurabilityLeaseClosedError(this.fence);
|
|
105
|
+
}
|
|
106
|
+
// The state check and increment are synchronous, so close() cannot release
|
|
107
|
+
// the database lock between them.
|
|
108
|
+
this.activeOperations++;
|
|
109
|
+
try {
|
|
110
|
+
return await operation();
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
this.activeOperations--;
|
|
114
|
+
if (this.activeOperations === 0) {
|
|
115
|
+
this.resolveDrain?.();
|
|
116
|
+
this.resolveDrain = undefined;
|
|
117
|
+
this.drainPromise = undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
close() {
|
|
122
|
+
if (this.closePromise) {
|
|
123
|
+
return this.closePromise;
|
|
124
|
+
}
|
|
125
|
+
this.state = "closing";
|
|
126
|
+
if (this.activeOperations > 0 && !this.drainPromise) {
|
|
127
|
+
this.drainPromise = new Promise((resolve) => {
|
|
128
|
+
this.resolveDrain = resolve;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
this.closePromise = (this.drainPromise ?? Promise.resolve())
|
|
132
|
+
.then(() => this.database.close())
|
|
133
|
+
.finally(() => {
|
|
134
|
+
this.state = "closed";
|
|
135
|
+
});
|
|
136
|
+
return this.closePromise;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Acquire the crash-released Node ownership lease for an existing program
|
|
141
|
+
* directory.
|
|
142
|
+
*
|
|
143
|
+
* The dedicated ClassicLevel database lives beside, rather than inside, the
|
|
144
|
+
* transaction namespace. Its native LevelDB `LOCK` is held for this object's
|
|
145
|
+
* lifetime and is released by the operating system when the process dies. The
|
|
146
|
+
* lock database itself is intentionally retained so fence epochs cannot be
|
|
147
|
+
* reused after a normal reopen.
|
|
148
|
+
*/
|
|
149
|
+
export const acquireNativeDurabilityNodeLease = async (programDirectory) => {
|
|
150
|
+
const [fs, path, crypto, ClassicLevel] = await Promise.all([
|
|
151
|
+
dynamicImport("node:fs/promises"),
|
|
152
|
+
dynamicImport("node:path"),
|
|
153
|
+
dynamicImport("node:crypto"),
|
|
154
|
+
importClassicLevel(),
|
|
155
|
+
]);
|
|
156
|
+
let canonicalDirectory;
|
|
157
|
+
try {
|
|
158
|
+
canonicalDirectory = await fs.realpath(programDirectory);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
throw new NativeDurabilityLeaseStateError(programDirectory, `Native durability program directory must already exist: ${programDirectory}`, { cause: error });
|
|
162
|
+
}
|
|
163
|
+
const leaseDirectory = path.join(canonicalDirectory, NATIVE_DURABILITY_NODE_LEASE_DIRECTORY_NAME);
|
|
164
|
+
const database = new ClassicLevel(leaseDirectory, {
|
|
165
|
+
keyEncoding: "utf8",
|
|
166
|
+
valueEncoding: "utf8",
|
|
167
|
+
});
|
|
168
|
+
try {
|
|
169
|
+
await database.open();
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
if (hasErrorCode(error, "LEVEL_LOCKED")) {
|
|
173
|
+
throw new NativeDurabilityLeaseUnavailableError(canonicalDirectory, {
|
|
174
|
+
cause: error,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
throw error;
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const previous = await readLeaseState(database, canonicalDirectory);
|
|
181
|
+
if (BigInt(previous?.epoch ?? "0") === NATIVE_DURABILITY_MAX_U64) {
|
|
182
|
+
throw new NativeDurabilityFenceExhaustedError(canonicalDirectory);
|
|
183
|
+
}
|
|
184
|
+
const fence = Object.freeze({
|
|
185
|
+
epoch: BigInt(previous?.epoch ?? "0") + 1n,
|
|
186
|
+
ownerId: crypto.randomUUID(),
|
|
187
|
+
domainId: previous?.domainId ?? crypto.randomUUID(),
|
|
188
|
+
});
|
|
189
|
+
const next = {
|
|
190
|
+
version: LEASE_STATE_VERSION,
|
|
191
|
+
epoch: fence.epoch.toString(),
|
|
192
|
+
ownerId: fence.ownerId,
|
|
193
|
+
domainId: fence.domainId,
|
|
194
|
+
};
|
|
195
|
+
await database.put(LEASE_STATE_KEY, JSON.stringify(next), { sync: true });
|
|
196
|
+
// LevelDB's sync option covers its value/WAL. Explicit directory syncs
|
|
197
|
+
// additionally make creation of the lease database and its files durable
|
|
198
|
+
// before the fence is handed to a transaction writer.
|
|
199
|
+
await syncDirectory(fs, leaseDirectory);
|
|
200
|
+
await syncDirectory(fs, canonicalDirectory);
|
|
201
|
+
return new NodeNativeDurabilityLease(fence, database);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
try {
|
|
205
|
+
await database.close();
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// The acquisition error is authoritative. A failed close must not make
|
|
209
|
+
// the partially initialized lease usable by this process.
|
|
210
|
+
}
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=node-lease.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-lease.js","sourceRoot":"","sources":["../../../src/durability/node-lease.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type NativeDurabilityLease } from "./lease.js";
|
|
2
|
+
import { type NativeDurabilityCheckpoint, type NativeDurabilityCheckpointReceipt, type NativeDurabilityCheckpointRequest, type NativeDurabilityDeleteReceipt, type NativeDurabilityDeleteRequest, type NativeDurabilityIncompleteTailReconciliationRequest, type NativeDurabilityJournalAppendRequest, type NativeDurabilityJournalReceipt, type NativeDurabilityJournalReconciliationReceipt, type NativeDurabilityStageReceipt, type NativeDurabilityStageRequest, type NativeDurabilityStagingManifest, type NativeDurabilityStorage, type NativeDurabilityStorageStats } from "./storage.js";
|
|
3
|
+
export type NativeDurabilityNodeWritable = {
|
|
4
|
+
write: (buffer: Uint8Array, offset: number, length: number, position: number) => Promise<{
|
|
5
|
+
bytesWritten: number;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
export type NativeDurabilityNodeReadable = {
|
|
9
|
+
read: (buffer: Uint8Array, offset: number, length: number, position: number) => Promise<{
|
|
10
|
+
bytesRead: number;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
/** `FileHandle.write()` is allowed to complete with a short write. */
|
|
14
|
+
export declare const writeNativeDurabilityBytesFully: (handle: NativeDurabilityNodeWritable, bytes: Uint8Array, position: number) => Promise<void>;
|
|
15
|
+
export declare const readNativeDurabilityBytesFully: (handle: NativeDurabilityNodeReadable, byteLength: number) => Promise<Uint8Array>;
|
|
16
|
+
export type NativeDurabilityNodeStorageOptions = {
|
|
17
|
+
directory: string;
|
|
18
|
+
programId: Uint8Array;
|
|
19
|
+
};
|
|
20
|
+
export declare class NodeNativeDurabilityStorage implements NativeDurabilityStorage {
|
|
21
|
+
private readonly lease;
|
|
22
|
+
private readonly journalCodec;
|
|
23
|
+
private readonly programId;
|
|
24
|
+
readonly version: 1;
|
|
25
|
+
readonly kind: "node-fsync";
|
|
26
|
+
readonly crashSafe = true;
|
|
27
|
+
readonly domainId: string;
|
|
28
|
+
readonly fence: NativeDurabilityLease["fence"];
|
|
29
|
+
private readonly rootDirectory;
|
|
30
|
+
private readonly namespaceDirectory;
|
|
31
|
+
private readonly stagingDirectory;
|
|
32
|
+
private readonly checkpointDirectory;
|
|
33
|
+
private readonly journalPath;
|
|
34
|
+
private operationTail;
|
|
35
|
+
private closePromise?;
|
|
36
|
+
private closing;
|
|
37
|
+
private closed;
|
|
38
|
+
private barrierOrdinal;
|
|
39
|
+
private strictDeleteCount;
|
|
40
|
+
private constructor();
|
|
41
|
+
static create(options: NativeDurabilityNodeStorageOptions): Promise<NodeNativeDurabilityStorage>;
|
|
42
|
+
private enqueue;
|
|
43
|
+
private initialize;
|
|
44
|
+
private checkpointManifestPath;
|
|
45
|
+
private checkpointHighwaterPath;
|
|
46
|
+
private readGenerationState;
|
|
47
|
+
private writeGenerationState;
|
|
48
|
+
private readCheckpointSlot;
|
|
49
|
+
private readCheckpointManifest;
|
|
50
|
+
private readJournalBaseCheckpoint;
|
|
51
|
+
private readValidCheckpointsInternal;
|
|
52
|
+
private ensureGenesisCheckpoint;
|
|
53
|
+
private reconcileCheckpointGenerationState;
|
|
54
|
+
private reconcileStagingOrphans;
|
|
55
|
+
private checkpointAuthorizesStagingDeletion;
|
|
56
|
+
private checkpointValidationContext;
|
|
57
|
+
private transactionDirectory;
|
|
58
|
+
private readStagingManifestInternal;
|
|
59
|
+
stageAndSync(unsafeRequest: NativeDurabilityStageRequest): Promise<NativeDurabilityStageReceipt>;
|
|
60
|
+
readStagingManifest(transactionId: string): Promise<NativeDurabilityStagingManifest | undefined>;
|
|
61
|
+
readStagedBlock(transactionId: string, ordinal: number): Promise<Uint8Array | undefined>;
|
|
62
|
+
private listStagingTransactionIdsInternal;
|
|
63
|
+
listStagingTransactionIds(): Promise<string[]>;
|
|
64
|
+
appendJournalAndSync(unsafeRequest: NativeDurabilityJournalAppendRequest): Promise<NativeDurabilityJournalReceipt>;
|
|
65
|
+
readJournal(): Promise<Uint8Array>;
|
|
66
|
+
reconcileIncompleteJournalTailAndSync(unsafeRequest: NativeDurabilityIncompleteTailReconciliationRequest): Promise<NativeDurabilityJournalReconciliationReceipt>;
|
|
67
|
+
private checkpointReceipt;
|
|
68
|
+
writeCheckpointAndSync(unsafeRequest: NativeDurabilityCheckpointRequest): Promise<NativeDurabilityCheckpointReceipt>;
|
|
69
|
+
readLatestCheckpoint(): Promise<NativeDurabilityCheckpoint | undefined>;
|
|
70
|
+
deleteAndSync(unsafeRequest: NativeDurabilityDeleteRequest): Promise<NativeDurabilityDeleteReceipt>;
|
|
71
|
+
stats(): Promise<NativeDurabilityStorageStats>;
|
|
72
|
+
/** Drains admitted operations before releasing the owned OS lease. */
|
|
73
|
+
close(): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
export declare const createNodeNativeDurabilityStorage: (options: NativeDurabilityNodeStorageOptions) => Promise<NodeNativeDurabilityStorage>;
|
|
76
|
+
//# sourceMappingURL=node-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-storage.d.ts","sourceRoot":"","sources":["../../../src/durability/node-storage.ts"],"names":[],"mappings":"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"}
|