@microdelta/history 0.0.0 → 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 +30 -4
- package/dist/api/history.alpha.d.ts +3 -0
- package/dist/api/history.beta.d.ts +3 -0
- package/dist/api/history.conformance.store.alpha.d.ts +3 -0
- package/dist/api/history.conformance.store.beta.d.ts +3 -0
- package/dist/api/history.conformance.store.public.d.ts +3 -0
- package/dist/api/history.conformance.store.raw.alpha.d.ts +215 -0
- package/dist/api/history.conformance.store.raw.beta.d.ts +215 -0
- package/dist/api/history.conformance.store.raw.public.d.ts +215 -0
- package/dist/api/history.conformance.store.raw.untrimmed.d.ts +215 -0
- package/dist/api/history.conformance.store.untrimmed.d.ts +3 -0
- package/dist/api/history.public.d.ts +3 -0
- package/dist/api/history.root.raw.alpha.d.ts +1371 -0
- package/dist/api/history.root.raw.beta.d.ts +425 -0
- package/dist/api/history.root.raw.public.d.ts +425 -0
- package/dist/api/history.root.raw.untrimmed.d.ts +1372 -0
- package/dist/api/history.shared.alpha.d.ts +1402 -0
- package/dist/api/history.shared.beta.d.ts +456 -0
- package/dist/api/history.shared.public.d.ts +456 -0
- package/dist/api/history.shared.untrimmed.d.ts +1403 -0
- package/dist/api/history.untrimmed.d.ts +3 -0
- package/dist/api/tsdoc-metadata.json +11 -0
- package/dist/src/completed-results.d.ts +99 -0
- package/dist/src/completed-results.d.ts.map +1 -0
- package/dist/src/completed-results.js +2 -0
- package/dist/src/completed-results.js.map +1 -0
- package/dist/src/durable/contracts.d.ts +612 -0
- package/dist/src/durable/contracts.d.ts.map +1 -0
- package/dist/src/durable/contracts.js +2 -0
- package/dist/src/durable/contracts.js.map +1 -0
- package/dist/src/durable/errors.d.ts +94 -0
- package/dist/src/durable/errors.d.ts.map +1 -0
- package/dist/src/durable/errors.js +118 -0
- package/dist/src/durable/errors.js.map +1 -0
- package/dist/src/durable/index.d.ts +9 -0
- package/dist/src/durable/index.d.ts.map +1 -0
- package/dist/src/durable/index.js +770 -0
- package/dist/src/durable/index.js.map +1 -0
- package/dist/src/durable/journal.d.ts +53 -0
- package/dist/src/durable/journal.d.ts.map +1 -0
- package/dist/src/durable/journal.js +174 -0
- package/dist/src/durable/journal.js.map +1 -0
- package/dist/src/durable/locator.d.ts +31 -0
- package/dist/src/durable/locator.d.ts.map +1 -0
- package/dist/src/durable/locator.js +50 -0
- package/dist/src/durable/locator.js.map +1 -0
- package/dist/src/durable/records.d.ts +40 -0
- package/dist/src/durable/records.d.ts.map +1 -0
- package/dist/src/durable/records.js +74 -0
- package/dist/src/durable/records.js.map +1 -0
- package/dist/src/durable/schema.d.ts +37 -0
- package/dist/src/durable/schema.d.ts.map +1 -0
- package/dist/src/durable/schema.js +335 -0
- package/dist/src/durable/schema.js.map +1 -0
- package/dist/src/durable/selected-index.d.ts +94 -0
- package/dist/src/durable/selected-index.d.ts.map +1 -0
- package/dist/src/durable/selected-index.js +594 -0
- package/dist/src/durable/selected-index.js.map +1 -0
- package/dist/src/index.d.ts +28 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +15 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/store/index.d.ts +128 -0
- package/dist/src/store/index.d.ts.map +1 -0
- package/dist/src/store/index.js +33 -0
- package/dist/src/store/index.js.map +1 -0
- package/dist/src/store/memory/index.d.ts +24 -0
- package/dist/src/store/memory/index.d.ts.map +1 -0
- package/dist/src/store/memory/index.js +162 -0
- package/dist/src/store/memory/index.js.map +1 -0
- package/dist/src/types.d.ts +100 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/conformance/store/index.d.ts +34 -0
- package/dist/test/conformance/store/index.d.ts.map +1 -0
- package/dist/test/conformance/store/index.js +368 -0
- package/dist/test/conformance/store/index.js.map +1 -0
- package/package.json +48 -8
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
import { decodeSnapshot, decodeValue, encodeSelectedFact, encodeSnapshot, encodeValue, fingerprint, navigate, observe, recordFromEntries, } from '@microdelta/value';
|
|
2
|
+
import { HistoryIntegrityError } from './errors.js';
|
|
3
|
+
/** Identity tag for embedded SQL; the text is passed through unchanged. */
|
|
4
|
+
const sql = String.raw;
|
|
5
|
+
/** The index layout version recorded with every result. */
|
|
6
|
+
export const indexVersion = 1;
|
|
7
|
+
/** Canonical, unambiguous text for a structured address: Property "0" and Index 0 differ (VAL-1). */
|
|
8
|
+
function encodeAddress(address) {
|
|
9
|
+
return JSON.stringify(address.map((segment) => segment.kind === 'property' ? ['p', segment.key] : ['i', segment.index]));
|
|
10
|
+
}
|
|
11
|
+
/** Read one own data member of a decoded, validated snapshot node. */
|
|
12
|
+
function ownValue(record, key) {
|
|
13
|
+
const descriptor = Object.getOwnPropertyDescriptor(record, key);
|
|
14
|
+
return descriptor === undefined ? undefined : descriptor.value;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate the index for one decoded canonical snapshot with a record or
|
|
18
|
+
* array root. Every container has exactly one structural parent because Value
|
|
19
|
+
* rejects shared references. Reachable addresses follow Value's lookup order:
|
|
20
|
+
* own members first, then members inherited through each custom prototype
|
|
21
|
+
* that an earlier level does not shadow.
|
|
22
|
+
*/
|
|
23
|
+
export function buildIndex(root, host) {
|
|
24
|
+
const nodes = [];
|
|
25
|
+
const edges = [];
|
|
26
|
+
const addresses = [];
|
|
27
|
+
const slots = new Map();
|
|
28
|
+
const childrenOf = new Map();
|
|
29
|
+
const slotKey = (parent, kind, key) => JSON.stringify([parent, kind, key]);
|
|
30
|
+
const addEdge = (edge) => {
|
|
31
|
+
edges.push(edge);
|
|
32
|
+
const siblings = childrenOf.get(edge.parentNode);
|
|
33
|
+
if (siblings === undefined) {
|
|
34
|
+
childrenOf.set(edge.parentNode, [edge]);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
siblings.push(edge);
|
|
38
|
+
}
|
|
39
|
+
slots.set(slotKey(edge.parentNode, edge.edgeKind, edge.edgeKey), edge.childNode);
|
|
40
|
+
};
|
|
41
|
+
function addNode(value) {
|
|
42
|
+
const nodeId = nodes.length;
|
|
43
|
+
const snapshotFingerprint = fingerprint(encodeSnapshot(value), host);
|
|
44
|
+
if (value === null || typeof value !== 'object') {
|
|
45
|
+
nodes.push({ nodeId, kind: 'scalar', scalar: encodeValue(value), arrayLength: null, ownKeys: null, prototype: null, prototypeNode: null, terminal: null, snapshotFingerprint });
|
|
46
|
+
return nodeId;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(value)) {
|
|
49
|
+
nodes.push({ nodeId, kind: 'array', scalar: null, arrayLength: value.length, ownKeys: null, prototype: null, prototypeNode: null, terminal: null, snapshotFingerprint });
|
|
50
|
+
for (let position = 0; position < value.length; position += 1) {
|
|
51
|
+
if (Object.prototype.hasOwnProperty.call(value, position)) {
|
|
52
|
+
const childNode = addNode(ownValue(value, String(position)));
|
|
53
|
+
addEdge({ parentNode: nodeId, edgeKind: 'index', edgeKey: String(position), position, childNode });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return nodeId;
|
|
57
|
+
}
|
|
58
|
+
const keys = Object.keys(value);
|
|
59
|
+
const prototype = Object.getPrototypeOf(value);
|
|
60
|
+
let terminal = value;
|
|
61
|
+
while (terminal !== null && terminal !== Object.prototype) {
|
|
62
|
+
terminal = Object.getPrototypeOf(terminal);
|
|
63
|
+
}
|
|
64
|
+
nodes.push({
|
|
65
|
+
nodeId, kind: 'record', scalar: null, arrayLength: null, ownKeys: JSON.stringify(keys),
|
|
66
|
+
prototype: prototype === null ? 'null' : prototype === Object.prototype ? 'object' : 'custom',
|
|
67
|
+
prototypeNode: null, terminal: terminal === null ? 'null' : 'object', snapshotFingerprint,
|
|
68
|
+
});
|
|
69
|
+
keys.forEach((key, keyPosition) => {
|
|
70
|
+
const childNode = addNode(ownValue(value, key));
|
|
71
|
+
addEdge({ parentNode: nodeId, edgeKind: 'property', edgeKey: key, position: keyPosition, childNode });
|
|
72
|
+
});
|
|
73
|
+
if (prototype !== null && prototype !== Object.prototype && typeof prototype === 'object') {
|
|
74
|
+
const prototypeNode = addNode(prototype);
|
|
75
|
+
const row = nodes[nodeId];
|
|
76
|
+
if (row !== undefined) {
|
|
77
|
+
nodes[nodeId] = { ...row, prototypeNode };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return nodeId;
|
|
81
|
+
}
|
|
82
|
+
function addAddress(nodeId, address, own) {
|
|
83
|
+
addresses.push({
|
|
84
|
+
address: encodeAddress(address),
|
|
85
|
+
nodeId,
|
|
86
|
+
own: own ? 1 : 0,
|
|
87
|
+
valueFingerprint: address.length === 0 ? null : fingerprint(encodeSelectedFact(observe(root, address, 'value')), host),
|
|
88
|
+
});
|
|
89
|
+
const node = nodes[nodeId];
|
|
90
|
+
if (node?.kind === 'array') {
|
|
91
|
+
for (const edge of childrenOf.get(nodeId) ?? []) {
|
|
92
|
+
addAddress(edge.childNode, [...address, { kind: 'index', index: edge.position }], true);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (node?.kind === 'record') {
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
let level = node;
|
|
98
|
+
let isOwnLevel = true;
|
|
99
|
+
while (level !== undefined) {
|
|
100
|
+
const levelKeys = JSON.parse(level.ownKeys ?? '[]');
|
|
101
|
+
for (const key of levelKeys) {
|
|
102
|
+
if (!seen.has(key)) {
|
|
103
|
+
seen.add(key);
|
|
104
|
+
const child = slots.get(slotKey(level.nodeId, 'property', key));
|
|
105
|
+
if (child !== undefined) {
|
|
106
|
+
addAddress(child, [...address, { kind: 'property', key }], isOwnLevel);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
level = level.prototypeNode === null ? undefined : nodes[level.prototypeNode];
|
|
111
|
+
isOwnLevel = false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
addAddress(addNode(root), [], true);
|
|
116
|
+
return { nodes, edges, addresses };
|
|
117
|
+
}
|
|
118
|
+
/** Narrow a stored cell to text, or fail as corrupted storage. */
|
|
119
|
+
function text(row, column) {
|
|
120
|
+
const value = row[column];
|
|
121
|
+
if (typeof value !== 'string') {
|
|
122
|
+
throw new HistoryIntegrityError(`Stored History column ${column} is not text`);
|
|
123
|
+
}
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
/** Narrow a stored cell to nullable text. */
|
|
127
|
+
function nullableText(row, column) {
|
|
128
|
+
const value = row[column];
|
|
129
|
+
if (value !== null && typeof value !== 'string') {
|
|
130
|
+
throw new HistoryIntegrityError(`Stored History column ${column} is not nullable text`);
|
|
131
|
+
}
|
|
132
|
+
return value ?? null;
|
|
133
|
+
}
|
|
134
|
+
/** Narrow a stored cell to a safe integer. */
|
|
135
|
+
function integer(row, column) {
|
|
136
|
+
const value = row[column];
|
|
137
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value)) {
|
|
138
|
+
throw new HistoryIntegrityError(`Stored History column ${column} is not an integer`);
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
/** Narrow a stored cell to a nullable safe integer. */
|
|
143
|
+
function nullableInteger(row, column) {
|
|
144
|
+
return row[column] === null ? null : integer(row, column);
|
|
145
|
+
}
|
|
146
|
+
/** Narrow a stored node kind. */
|
|
147
|
+
function nodeKind(row) {
|
|
148
|
+
const kind = text(row, 'kind');
|
|
149
|
+
if (kind !== 'scalar' && kind !== 'record' && kind !== 'array') {
|
|
150
|
+
throw new HistoryIntegrityError(`Unsupported stored node kind ${kind}`);
|
|
151
|
+
}
|
|
152
|
+
return kind;
|
|
153
|
+
}
|
|
154
|
+
/** Narrow a stored prototype-chain terminal. */
|
|
155
|
+
function terminalKind(row) {
|
|
156
|
+
const terminal = nullableText(row, 'terminal');
|
|
157
|
+
if (terminal !== null && terminal !== 'null' && terminal !== 'object') {
|
|
158
|
+
throw new HistoryIntegrityError(`Unsupported stored prototype terminal ${terminal}`);
|
|
159
|
+
}
|
|
160
|
+
return terminal;
|
|
161
|
+
}
|
|
162
|
+
/** Decode stored canonical text, converting Value's rejection into an integrity failure. */
|
|
163
|
+
function decodeStored(decode, what) {
|
|
164
|
+
try {
|
|
165
|
+
return decode();
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throw new HistoryIntegrityError(`Stored ${what} is not valid canonical data: ${error instanceof Error ? error.message : String(error)}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A payload-free stand-in for an indexed container. Every present own or
|
|
173
|
+
* inherited member has an indexed address, so a remainder absent from the
|
|
174
|
+
* index is absent along the whole lookup chain; Value evaluating it against an
|
|
175
|
+
* empty container of the same kind and chain terminal yields Value's own
|
|
176
|
+
* answer, including its rejection of intrinsic members and kind mismatches.
|
|
177
|
+
*/
|
|
178
|
+
function standIn(metadata) {
|
|
179
|
+
switch (metadata.kind) {
|
|
180
|
+
case 'record':
|
|
181
|
+
return Object.freeze(Object.create(metadata.terminal === 'object' ? Object.prototype : null));
|
|
182
|
+
case 'array':
|
|
183
|
+
return Object.freeze(new Array(metadata.arrayLength ?? 0));
|
|
184
|
+
case 'scalar':
|
|
185
|
+
// Every scalar rejects member navigation identically, so no payload is needed.
|
|
186
|
+
return null;
|
|
187
|
+
default: {
|
|
188
|
+
const exhaustive = metadata.kind;
|
|
189
|
+
return exhaustive;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/** Rebase a fact computed for an address remainder onto its absolute address. */
|
|
194
|
+
function absoluteFact(operation, address, fact) {
|
|
195
|
+
return Object.freeze({ operation, address, fact });
|
|
196
|
+
}
|
|
197
|
+
/** Copy a caller address into frozen canonical segments before encoding or binding it. */
|
|
198
|
+
function copyAddress(address) {
|
|
199
|
+
return Object.freeze(address.map((segment) => Object.freeze(segment.kind === 'property'
|
|
200
|
+
? { kind: 'property', key: segment.key }
|
|
201
|
+
: { kind: 'index', index: segment.index })));
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Create the index operations over an owned connection. Exact references
|
|
205
|
+
* are resolved by the authority's `resolve`, which validates locator, store,
|
|
206
|
+
* scope, completion and stored encoding before any index row is read.
|
|
207
|
+
*/
|
|
208
|
+
export function createSelectedIndex(connection, host, resolve) {
|
|
209
|
+
const statements = {
|
|
210
|
+
insertNode: connection.prepare(sql `/* publish */ INSERT INTO history_nodes
|
|
211
|
+
(result_id, node_id, kind, scalar, array_length, own_keys, prototype, prototype_node, terminal, snapshot_fingerprint)
|
|
212
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),
|
|
213
|
+
insertEdge: connection.prepare(sql `/* publish */ INSERT INTO history_edges
|
|
214
|
+
(result_id, parent_node, edge_kind, edge_key, position, child_node) VALUES (?, ?, ?, ?, ?, ?)`),
|
|
215
|
+
insertAddress: connection.prepare(sql `/* publish */ INSERT INTO history_addresses
|
|
216
|
+
(result_id, address, node_id, own, value_fingerprint) VALUES (?, ?, ?, ?, ?)`),
|
|
217
|
+
addressMetadata: connection.prepare(sql `/* node-metadata */ SELECT a.node_id, a.own, a.value_fingerprint, n.kind, n.array_length, n.own_keys, n.terminal
|
|
218
|
+
FROM history_addresses a JOIN history_nodes n ON n.result_id = a.result_id AND n.node_id = a.node_id
|
|
219
|
+
WHERE a.result_id = ? AND a.address = ?`),
|
|
220
|
+
prefixMetadata: connection.prepare(sql `/* node-metadata */ SELECT a.address, a.node_id, a.own, a.value_fingerprint, n.kind, n.array_length, n.own_keys, n.terminal
|
|
221
|
+
FROM history_addresses a JOIN history_nodes n ON n.result_id = a.result_id AND n.node_id = a.node_id
|
|
222
|
+
WHERE a.result_id = ? AND a.address IN (SELECT value FROM json_each(?))`),
|
|
223
|
+
chainKeys: connection.prepare(sql `/* node-metadata */ WITH RECURSIVE chain(node_id) AS (
|
|
224
|
+
SELECT ?
|
|
225
|
+
UNION SELECT n.prototype_node FROM history_nodes n JOIN chain c ON n.node_id = c.node_id
|
|
226
|
+
WHERE n.result_id = ? AND n.prototype_node IS NOT NULL
|
|
227
|
+
)
|
|
228
|
+
SELECT n.own_keys FROM history_nodes n JOIN chain c ON n.node_id = c.node_id WHERE n.result_id = ?`),
|
|
229
|
+
elementEdge: connection.prepare(sql `/* node-metadata */ SELECT child_node FROM history_edges
|
|
230
|
+
WHERE result_id = ? AND parent_node = ? AND edge_kind = 'index' AND edge_key = ?`),
|
|
231
|
+
scalarPayload: connection.prepare(sql `/* leaf-payload */ SELECT scalar FROM history_nodes WHERE result_id = ? AND node_id = ? AND kind = 'scalar'`),
|
|
232
|
+
fingerprints: connection.prepare(sql `/* fingerprint */ SELECT a.value_fingerprint, n.snapshot_fingerprint
|
|
233
|
+
FROM history_addresses a JOIN history_nodes n ON n.result_id = a.result_id AND n.node_id = a.node_id
|
|
234
|
+
WHERE a.result_id = ? AND a.address = ?`),
|
|
235
|
+
subtreeNodes: connection.prepare(sql `/* subtree-payload */ WITH RECURSIVE subtree(node_id) AS (
|
|
236
|
+
SELECT ?
|
|
237
|
+
UNION SELECT e.child_node FROM history_edges e JOIN subtree s ON e.parent_node = s.node_id WHERE e.result_id = ?
|
|
238
|
+
UNION SELECT n.prototype_node FROM history_nodes n JOIN subtree s ON n.node_id = s.node_id
|
|
239
|
+
WHERE n.result_id = ? AND n.prototype_node IS NOT NULL
|
|
240
|
+
)
|
|
241
|
+
SELECT n.node_id, n.kind, n.scalar, n.array_length, n.prototype, n.prototype_node, n.snapshot_fingerprint
|
|
242
|
+
FROM history_nodes n JOIN subtree s ON n.node_id = s.node_id WHERE n.result_id = ?`),
|
|
243
|
+
subtreeEdges: connection.prepare(sql `/* subtree-structure */ SELECT parent_node, edge_kind, edge_key, position, child_node
|
|
244
|
+
FROM history_edges WHERE result_id = ? AND parent_node IN (SELECT value FROM json_each(?)) ORDER BY parent_node, position`),
|
|
245
|
+
payload: connection.prepare(sql `/* verify */ SELECT payload FROM history_results WHERE result_id = ?`),
|
|
246
|
+
allNodes: connection.prepare(sql `/* verify */ SELECT node_id, kind, scalar, array_length, own_keys, prototype, prototype_node, terminal, snapshot_fingerprint
|
|
247
|
+
FROM history_nodes WHERE result_id = ?`),
|
|
248
|
+
allEdges: connection.prepare(sql `/* verify */ SELECT parent_node, edge_kind, edge_key, position, child_node FROM history_edges WHERE result_id = ?`),
|
|
249
|
+
allAddresses: connection.prepare(sql `/* verify */ SELECT address, node_id, own, value_fingerprint FROM history_addresses WHERE result_id = ?`),
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* Map one metadata row, rejecting cells whose presence contradicts the
|
|
253
|
+
* node kind or address so corrupted metadata never becomes a Value answer.
|
|
254
|
+
*/
|
|
255
|
+
function metadataOf(row, address) {
|
|
256
|
+
const metadata = {
|
|
257
|
+
nodeId: integer(row, 'node_id'),
|
|
258
|
+
own: integer(row, 'own') === 1,
|
|
259
|
+
kind: nodeKind(row),
|
|
260
|
+
arrayLength: nullableInteger(row, 'array_length'),
|
|
261
|
+
ownKeys: nullableText(row, 'own_keys'),
|
|
262
|
+
terminal: terminalKind(row),
|
|
263
|
+
valueFingerprint: nullableText(row, 'value_fingerprint'),
|
|
264
|
+
};
|
|
265
|
+
const shapeValid = metadata.kind === 'array'
|
|
266
|
+
? metadata.arrayLength !== null && metadata.arrayLength >= 0 && metadata.ownKeys === null && metadata.terminal === null
|
|
267
|
+
: metadata.kind === 'record'
|
|
268
|
+
? metadata.arrayLength === null && metadata.ownKeys !== null && metadata.terminal !== null
|
|
269
|
+
: metadata.arrayLength === null && metadata.ownKeys === null && metadata.terminal === null;
|
|
270
|
+
if (!shapeValid || (address.length === 0) !== (metadata.valueFingerprint === null)) {
|
|
271
|
+
throw new HistoryIntegrityError('Stored index metadata contradicts its node kind or address');
|
|
272
|
+
}
|
|
273
|
+
return metadata;
|
|
274
|
+
}
|
|
275
|
+
/** Metadata for an exactly indexed address, or undefined when it is not indexed. */
|
|
276
|
+
function metadataAt(resultId, address) {
|
|
277
|
+
const row = statements.addressMetadata.get(resultId, encodeAddress(address));
|
|
278
|
+
return row === undefined ? undefined : metadataOf(row, address);
|
|
279
|
+
}
|
|
280
|
+
/** For an unindexed address, the stand-in of its longest indexed prefix and the relative remainder. */
|
|
281
|
+
function absentRemainder(resultId, address) {
|
|
282
|
+
const prefixes = address.map((_segment, length) => encodeAddress(address.slice(0, length)));
|
|
283
|
+
const rows = statements.prefixMetadata.all(resultId, JSON.stringify(prefixes));
|
|
284
|
+
let best;
|
|
285
|
+
for (const row of rows) {
|
|
286
|
+
const length = prefixes.indexOf(text(row, 'address'));
|
|
287
|
+
if (length >= 0 && (best === undefined || length > best.length)) {
|
|
288
|
+
best = { length, metadata: metadataOf(row, address.slice(0, length)) };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (best === undefined) {
|
|
292
|
+
throw new HistoryIntegrityError('Completed result has no indexed root');
|
|
293
|
+
}
|
|
294
|
+
const remainder = address.slice(best.length);
|
|
295
|
+
assertIndexedAbsence(resultId, best.metadata, remainder[0]);
|
|
296
|
+
return { standIn: standIn(best.metadata), remainder };
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* An unindexed address is answered as absent only when its indexed parent
|
|
300
|
+
* proves the first missing segment absent: a record key that appears in no
|
|
301
|
+
* own-key order along the parent's lookup chain, or an array index with no
|
|
302
|
+
* present-element edge (a hole or past the end). Evidence that a member is
|
|
303
|
+
* present while its address or node is missing means the index is
|
|
304
|
+
* incomplete, which is an integrity failure rather than absent author data.
|
|
305
|
+
* Only shape metadata is read; mismatched segment kinds are left to Value.
|
|
306
|
+
*/
|
|
307
|
+
function assertIndexedAbsence(resultId, parent, segment) {
|
|
308
|
+
if (segment === undefined) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (parent.kind === 'record' && segment.kind === 'property') {
|
|
312
|
+
const present = statements.chainKeys.all(parent.nodeId, resultId, resultId).some((row) => {
|
|
313
|
+
const keys = decodeStored(() => JSON.parse(text(row, 'own_keys')), 'key order');
|
|
314
|
+
return Array.isArray(keys) && keys.includes(segment.key);
|
|
315
|
+
});
|
|
316
|
+
if (present) {
|
|
317
|
+
throw new HistoryIntegrityError(`Index is missing the address of present member ${JSON.stringify(segment.key)}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else if (parent.kind === 'array' && segment.kind === 'index' && statements.elementEdge.get(resultId, parent.nodeId, String(segment.index)) !== undefined) {
|
|
321
|
+
throw new HistoryIntegrityError(`Index is missing the address of present element ${String(segment.index)}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Decode one scalar leaf and verify it against its address's recorded
|
|
326
|
+
* `value` digest; this is the only per-node payload read.
|
|
327
|
+
*/
|
|
328
|
+
function verifiedScalar(resultId, address, metadata) {
|
|
329
|
+
const row = statements.scalarPayload.get(resultId, metadata.nodeId);
|
|
330
|
+
if (row === undefined) {
|
|
331
|
+
throw new HistoryIntegrityError('Indexed scalar node is missing its leaf payload');
|
|
332
|
+
}
|
|
333
|
+
const value = decodeStored(() => decodeValue(text(row, 'scalar')), 'scalar leaf');
|
|
334
|
+
const actual = fingerprint(encodeSelectedFact(absoluteFact('value', address, value)), host);
|
|
335
|
+
if (metadata.valueFingerprint === null || actual !== metadata.valueFingerprint) {
|
|
336
|
+
throw new HistoryIntegrityError('Stored scalar leaf does not match its indexed value fingerprint');
|
|
337
|
+
}
|
|
338
|
+
return value;
|
|
339
|
+
}
|
|
340
|
+
/** Answer a container kind, presence, length or key-order fact from metadata alone. */
|
|
341
|
+
function metadataFact(resultId, operation, address) {
|
|
342
|
+
const metadata = metadataAt(resultId, address);
|
|
343
|
+
if (metadata === undefined) {
|
|
344
|
+
const { standIn: stand, remainder } = absentRemainder(resultId, address);
|
|
345
|
+
return absoluteFact(operation, address, observe(stand, remainder, operation).fact);
|
|
346
|
+
}
|
|
347
|
+
switch (operation) {
|
|
348
|
+
case 'container-kind':
|
|
349
|
+
return absoluteFact(operation, address, metadata.kind);
|
|
350
|
+
case 'own':
|
|
351
|
+
case 'membership':
|
|
352
|
+
if (address.length === 0) {
|
|
353
|
+
// Value rejects member operations without a member address.
|
|
354
|
+
return absoluteFact(operation, address, observe(standIn(metadata), [], operation).fact);
|
|
355
|
+
}
|
|
356
|
+
return absoluteFact(operation, address, operation === 'own' ? metadata.own : true);
|
|
357
|
+
case 'length':
|
|
358
|
+
if (metadata.kind !== 'array') {
|
|
359
|
+
return absoluteFact(operation, address, observe(standIn(metadata), [], operation).fact);
|
|
360
|
+
}
|
|
361
|
+
return absoluteFact(operation, address, metadata.arrayLength);
|
|
362
|
+
case 'keys': {
|
|
363
|
+
if (metadata.kind !== 'record') {
|
|
364
|
+
return absoluteFact(operation, address, observe(standIn(metadata), [], operation).fact);
|
|
365
|
+
}
|
|
366
|
+
const keys = decodeStored(() => JSON.parse(metadata.ownKeys ?? ''), 'key order');
|
|
367
|
+
if (!Array.isArray(keys) || !keys.every((key) => typeof key === 'string') || new Set(keys).size !== keys.length) {
|
|
368
|
+
throw new HistoryIntegrityError('Stored key order is malformed');
|
|
369
|
+
}
|
|
370
|
+
return absoluteFact(operation, address, Object.freeze([...keys]));
|
|
371
|
+
}
|
|
372
|
+
default: {
|
|
373
|
+
const exhaustive = operation;
|
|
374
|
+
return exhaustive;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Load one container subtree from its node and edge rows and check the
|
|
380
|
+
* rebuilt MDS1 snapshot against the node's indexed digest, so tampered or
|
|
381
|
+
* incomplete rows fail rather than return different data.
|
|
382
|
+
*/
|
|
383
|
+
function subtreeAt(resultId, nodeId) {
|
|
384
|
+
const nodeRows = statements.subtreeNodes.all(nodeId, resultId, resultId, resultId);
|
|
385
|
+
const byId = new Map(nodeRows.map((row) => [integer(row, 'node_id'), row]));
|
|
386
|
+
const edgeRows = statements.subtreeEdges.all(resultId, JSON.stringify([...byId.keys()]));
|
|
387
|
+
const children = new Map();
|
|
388
|
+
for (const edge of edgeRows) {
|
|
389
|
+
const parent = integer(edge, 'parent_node');
|
|
390
|
+
const siblings = children.get(parent);
|
|
391
|
+
if (siblings === undefined) {
|
|
392
|
+
children.set(parent, [edge]);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
siblings.push(edge);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const rebuild = (id) => {
|
|
399
|
+
const row = byId.get(id);
|
|
400
|
+
if (row === undefined) {
|
|
401
|
+
throw new HistoryIntegrityError('Indexed subtree is missing a node');
|
|
402
|
+
}
|
|
403
|
+
const kind = nodeKind(row);
|
|
404
|
+
if (kind === 'scalar') {
|
|
405
|
+
return decodeStored(() => decodeValue(text(row, 'scalar')), 'scalar leaf');
|
|
406
|
+
}
|
|
407
|
+
const members = children.get(id) ?? [];
|
|
408
|
+
if (kind === 'array') {
|
|
409
|
+
const array = new Array(integer(row, 'array_length'));
|
|
410
|
+
for (const edge of members) {
|
|
411
|
+
array[integer(edge, 'position')] = rebuild(integer(edge, 'child_node'));
|
|
412
|
+
}
|
|
413
|
+
return array;
|
|
414
|
+
}
|
|
415
|
+
const prototypeKind = text(row, 'prototype');
|
|
416
|
+
const prototypeNode = nullableInteger(row, 'prototype_node');
|
|
417
|
+
let prototype = prototypeKind === 'null' ? null : Object.prototype;
|
|
418
|
+
if (prototypeKind === 'custom' && prototypeNode !== null) {
|
|
419
|
+
const rebuilt = rebuild(prototypeNode);
|
|
420
|
+
if (rebuilt === null || typeof rebuilt !== 'object') {
|
|
421
|
+
throw new HistoryIntegrityError('Indexed prototype is not a record');
|
|
422
|
+
}
|
|
423
|
+
prototype = rebuilt;
|
|
424
|
+
}
|
|
425
|
+
return recordFromEntries(members.map((edge) => [text(edge, 'edge_key'), rebuild(integer(edge, 'child_node'))]), prototype);
|
|
426
|
+
};
|
|
427
|
+
const encoded = decodeStored(() => encodeSnapshot(rebuild(nodeId)), 'subtree');
|
|
428
|
+
const expected = byId.get(nodeId);
|
|
429
|
+
if (expected === undefined || fingerprint(encoded, host) !== text(expected, 'snapshot_fingerprint')) {
|
|
430
|
+
throw new HistoryIntegrityError('Indexed subtree does not match its recorded snapshot fingerprint');
|
|
431
|
+
}
|
|
432
|
+
return decodeSnapshot(encoded);
|
|
433
|
+
}
|
|
434
|
+
/** Evaluate a Value selection, mapping only Value's shape rejection to `incompatible`. */
|
|
435
|
+
function compatible(evaluate) {
|
|
436
|
+
let digest;
|
|
437
|
+
try {
|
|
438
|
+
digest = evaluate();
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
if (error instanceof TypeError) {
|
|
442
|
+
return { kind: 'incompatible' };
|
|
443
|
+
}
|
|
444
|
+
throw error;
|
|
445
|
+
}
|
|
446
|
+
return digest === undefined ? { kind: 'incompatible' } : { kind: 'compatible', fingerprint: digest };
|
|
447
|
+
}
|
|
448
|
+
const reader = Object.freeze({
|
|
449
|
+
readNode(reference, requested) {
|
|
450
|
+
const resultId = resolve(reference);
|
|
451
|
+
const address = copyAddress(requested);
|
|
452
|
+
const metadata = metadataAt(resultId, address);
|
|
453
|
+
if (metadata === undefined) {
|
|
454
|
+
const { standIn: stand, remainder } = absentRemainder(resultId, address);
|
|
455
|
+
const relative = navigate(stand, remainder);
|
|
456
|
+
if (relative.kind !== 'scalar') {
|
|
457
|
+
throw new HistoryIntegrityError('An unindexed address cannot select a container');
|
|
458
|
+
}
|
|
459
|
+
return Object.freeze({ kind: 'scalar', selected: absoluteFact('value', address, relative.selected.fact) });
|
|
460
|
+
}
|
|
461
|
+
switch (metadata.kind) {
|
|
462
|
+
case 'record':
|
|
463
|
+
return Object.freeze({ kind: 'record', address });
|
|
464
|
+
case 'array':
|
|
465
|
+
return Object.freeze({ kind: 'array', address, length: metadata.arrayLength ?? 0 });
|
|
466
|
+
case 'scalar':
|
|
467
|
+
return Object.freeze({ kind: 'scalar', selected: absoluteFact('value', address, verifiedScalar(resultId, address, metadata)) });
|
|
468
|
+
default: {
|
|
469
|
+
const exhaustive = metadata.kind;
|
|
470
|
+
return exhaustive;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
},
|
|
474
|
+
readSubtree(reference, requested) {
|
|
475
|
+
const resultId = resolve(reference);
|
|
476
|
+
const metadata = metadataAt(resultId, copyAddress(requested));
|
|
477
|
+
if (metadata === undefined || metadata.kind === 'scalar') {
|
|
478
|
+
throw new TypeError('Subtree reads need an indexed record or array');
|
|
479
|
+
}
|
|
480
|
+
return subtreeAt(resultId, metadata.nodeId);
|
|
481
|
+
},
|
|
482
|
+
readSelected(reference, request) {
|
|
483
|
+
const resultId = resolve(reference);
|
|
484
|
+
const address = copyAddress(request.address);
|
|
485
|
+
if (request.operation !== 'value') {
|
|
486
|
+
return metadataFact(resultId, request.operation, address);
|
|
487
|
+
}
|
|
488
|
+
if (address.length === 0) {
|
|
489
|
+
// Value has no member address at which a root value could be observed.
|
|
490
|
+
return absoluteFact('value', address, observe(null, [], 'value').fact);
|
|
491
|
+
}
|
|
492
|
+
const metadata = metadataAt(resultId, address);
|
|
493
|
+
if (metadata === undefined) {
|
|
494
|
+
const { standIn: stand, remainder } = absentRemainder(resultId, address);
|
|
495
|
+
return absoluteFact('value', address, observe(stand, remainder, 'value').fact);
|
|
496
|
+
}
|
|
497
|
+
return absoluteFact('value', address, metadata.kind === 'scalar' ? verifiedScalar(resultId, address, metadata) : subtreeAt(resultId, metadata.nodeId));
|
|
498
|
+
},
|
|
499
|
+
resolveFingerprint(reference, request) {
|
|
500
|
+
const resultId = resolve(reference);
|
|
501
|
+
if (request.kind === 'projection') {
|
|
502
|
+
// Keyed projections are outside this index; absence never implies equality.
|
|
503
|
+
return { kind: 'unavailable' };
|
|
504
|
+
}
|
|
505
|
+
const address = copyAddress(request.address);
|
|
506
|
+
if (request.kind === 'selected') {
|
|
507
|
+
if (request.encoding !== 'MDO1') {
|
|
508
|
+
return { kind: 'incompatible' };
|
|
509
|
+
}
|
|
510
|
+
if (request.operation === 'value') {
|
|
511
|
+
if (address.length === 0) {
|
|
512
|
+
return { kind: 'incompatible' };
|
|
513
|
+
}
|
|
514
|
+
const row = statements.fingerprints.get(resultId, encodeAddress(address));
|
|
515
|
+
if (row !== undefined) {
|
|
516
|
+
const stored = nullableText(row, 'value_fingerprint');
|
|
517
|
+
if (stored === null) {
|
|
518
|
+
throw new HistoryIntegrityError('Indexed member address has no value fingerprint');
|
|
519
|
+
}
|
|
520
|
+
return { kind: 'compatible', fingerprint: stored };
|
|
521
|
+
}
|
|
522
|
+
const { standIn: stand, remainder } = absentRemainder(resultId, address);
|
|
523
|
+
return compatible(() => fingerprint(encodeSelectedFact(absoluteFact('value', address, observe(stand, remainder, 'value').fact)), host));
|
|
524
|
+
}
|
|
525
|
+
const operation = request.operation;
|
|
526
|
+
// Storage failures inside metadataFact are integrity errors, not TypeErrors, so they propagate.
|
|
527
|
+
return compatible(() => fingerprint(encodeSelectedFact(metadataFact(resultId, operation, address)), host));
|
|
528
|
+
}
|
|
529
|
+
if (request.encoding !== 'MDS1') {
|
|
530
|
+
return { kind: 'incompatible' };
|
|
531
|
+
}
|
|
532
|
+
const row = statements.fingerprints.get(resultId, encodeAddress(address));
|
|
533
|
+
if (row !== undefined) {
|
|
534
|
+
return { kind: 'compatible', fingerprint: text(row, 'snapshot_fingerprint') };
|
|
535
|
+
}
|
|
536
|
+
const { standIn: stand, remainder } = absentRemainder(resultId, address);
|
|
537
|
+
return compatible(() => {
|
|
538
|
+
const relative = navigate(stand, remainder);
|
|
539
|
+
return relative.kind === 'scalar' ? fingerprint(encodeSnapshot(relative.selected.fact), host) : undefined;
|
|
540
|
+
});
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
return Object.freeze({
|
|
544
|
+
insert(resultId, rows) {
|
|
545
|
+
for (const node of rows.nodes) {
|
|
546
|
+
statements.insertNode.run(resultId, node.nodeId, node.kind, node.scalar, node.arrayLength, node.ownKeys, node.prototype, node.prototypeNode, node.terminal, node.snapshotFingerprint);
|
|
547
|
+
}
|
|
548
|
+
for (const edge of rows.edges) {
|
|
549
|
+
statements.insertEdge.run(resultId, edge.parentNode, edge.edgeKind, edge.edgeKey, edge.position, edge.childNode);
|
|
550
|
+
}
|
|
551
|
+
for (const address of rows.addresses) {
|
|
552
|
+
statements.insertAddress.run(resultId, address.address, address.nodeId, address.own, address.valueFingerprint);
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
reader,
|
|
556
|
+
verify(resultId) {
|
|
557
|
+
const payloadRow = statements.payload.get(resultId);
|
|
558
|
+
if (payloadRow === undefined) {
|
|
559
|
+
return { kind: 'inconsistent', detail: 'missing payload' };
|
|
560
|
+
}
|
|
561
|
+
let canonical;
|
|
562
|
+
try {
|
|
563
|
+
canonical = decodeSnapshot(text(payloadRow, 'payload'));
|
|
564
|
+
}
|
|
565
|
+
catch {
|
|
566
|
+
return { kind: 'inconsistent', detail: 'stored payload is not canonical MDS1' };
|
|
567
|
+
}
|
|
568
|
+
if (canonical === null || typeof canonical !== 'object') {
|
|
569
|
+
return { kind: 'inconsistent', detail: 'payload root is not a container' };
|
|
570
|
+
}
|
|
571
|
+
const expected = buildIndex(canonical, host);
|
|
572
|
+
const nodeCells = (row) => [
|
|
573
|
+
row.node_id ?? null, row.kind ?? null, row.scalar ?? null, row.array_length ?? null, row.own_keys ?? null,
|
|
574
|
+
row.prototype ?? null, row.prototype_node ?? null, row.terminal ?? null, row.snapshot_fingerprint ?? null,
|
|
575
|
+
];
|
|
576
|
+
const edgeCells = (row) => [row.parent_node ?? null, row.edge_kind ?? null, row.edge_key ?? null, row.position ?? null, row.child_node ?? null];
|
|
577
|
+
const addressCells = (row) => [row.address ?? null, row.node_id ?? null, row.own ?? null, row.value_fingerprint ?? null];
|
|
578
|
+
const comparisons = [
|
|
579
|
+
['nodes', expected.nodes.map((node) => [node.nodeId, node.kind, node.scalar, node.arrayLength, node.ownKeys, node.prototype, node.prototypeNode, node.terminal, node.snapshotFingerprint]), statements.allNodes.all(resultId).map(nodeCells)],
|
|
580
|
+
['edges', expected.edges.map((edge) => [edge.parentNode, edge.edgeKind, edge.edgeKey, edge.position, edge.childNode]), statements.allEdges.all(resultId).map(edgeCells)],
|
|
581
|
+
['addresses', expected.addresses.map((row) => [row.address, row.nodeId, row.own, row.valueFingerprint]), statements.allAddresses.all(resultId).map(addressCells)],
|
|
582
|
+
];
|
|
583
|
+
for (const [label, left, right] of comparisons) {
|
|
584
|
+
// Compare as row sets; SQLite and JavaScript collations need not agree.
|
|
585
|
+
const canonicalRows = (rows) => JSON.stringify(rows.map((row) => JSON.stringify(row)).sort());
|
|
586
|
+
if (canonicalRows(left) !== canonicalRows(right)) {
|
|
587
|
+
return { kind: 'inconsistent', detail: `${label} differ from the index generated from the canonical payload` };
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return { kind: 'consistent' };
|
|
591
|
+
},
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
//# sourceMappingURL=selected-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selected-index.js","sourceRoot":"","sources":["../../../src/durable/selected-index.ts"],"names":[],"mappings":"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"}
|