graphvault-studio 0.1.2 → 0.1.4

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-compatibility.js","sourceRoot":"","sources":["../src/admin-compatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,8BAA8B,GAAG,OAAO,CAAC;AAE/C,MAAM,UAAU,8BAA8B;IAC5C,MAAM,gBAAgB,GAAG,8BAA8B,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,QAAQ,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,aAAa,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC,sBAAsB,gBAAgB,kCAAkC,8BAA8B,GAAG,CAAC,CAAC;IAC3H,CAAC;IACD,OAAO;QACL,WAAW,EAAE,2BAA2B;QACxC,kBAAkB,EAAE,8BAA8B;QAClD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QAC1C,QAAQ;QACR,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACtE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAA0B,CAAC;QAC/F,OAAO,OAAO,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK;SACT,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,KAAK,CAAC,MAAM,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { SerializedEnvelope, StorageTarget, TransactionRecord } from "@sprengmeister/graphvault/internal/core/types";
2
+ import type { StorageLayout } from "@sprengmeister/graphvault/internal/storage/storage-layout";
3
+ import type { VersionedStorageManifest } from "./admin-storage-io.js";
4
+ import type { AdminTransactionMetadata } from "./admin-types.js";
5
+ export type IntegrityTransactionRecord = TransactionRecord & {
6
+ envelopeHash?: string;
7
+ previousHash?: string;
8
+ transactionHash?: string;
9
+ metadata?: AdminTransactionMetadata;
10
+ };
11
+ export type IntegrityStorageManifest = VersionedStorageManifest & {
12
+ latestTransactionHash?: string;
13
+ };
14
+ export declare function envelopeHash(envelope: SerializedEnvelope): string;
15
+ export declare function transactionRecordHash(record: Omit<IntegrityTransactionRecord, "transactionHash">): string;
16
+ export declare function transactionHashPayload(record: IntegrityTransactionRecord): Omit<IntegrityTransactionRecord, "transactionHash">;
17
+ export declare function verifyAdminIntegrity(options: {
18
+ target: StorageTarget;
19
+ layout: StorageLayout;
20
+ manifest: IntegrityStorageManifest;
21
+ transactions: IntegrityTransactionRecord[];
22
+ }): Promise<{
23
+ checkedIntegrityHashes: number;
24
+ warnings: string[];
25
+ errors: string[];
26
+ }>;
@@ -0,0 +1,76 @@
1
+ import { createHash } from "node:crypto";
2
+ import { join } from "node:path";
3
+ export function envelopeHash(envelope) {
4
+ return sha256Hex(canonicalJson(envelope));
5
+ }
6
+ export function transactionRecordHash(record) {
7
+ return sha256Hex(canonicalJson(record));
8
+ }
9
+ export function transactionHashPayload(record) {
10
+ const { transactionHash: _transactionHash, ...payload } = record;
11
+ return payload;
12
+ }
13
+ export async function verifyAdminIntegrity(options) {
14
+ const warnings = [];
15
+ const errors = [];
16
+ let checkedIntegrityHashes = 0;
17
+ let previousHash;
18
+ const records = [...options.transactions].sort((a, b) => a.transactionId - b.transactionId);
19
+ for (const record of records) {
20
+ if (record.previousHash || record.transactionHash) {
21
+ if (record.previousHash !== previousHash) {
22
+ errors.push(`Transaction ${record.transactionId} has an invalid previousHash.`);
23
+ }
24
+ if (!record.transactionHash) {
25
+ errors.push(`Transaction ${record.transactionId} is missing transactionHash.`);
26
+ }
27
+ else {
28
+ checkedIntegrityHashes++;
29
+ if (record.transactionHash !== transactionRecordHash(transactionHashPayload(record))) {
30
+ errors.push(`Transaction ${record.transactionId} has an invalid transactionHash.`);
31
+ }
32
+ }
33
+ }
34
+ if (record.envelopeHash) {
35
+ try {
36
+ const snapshot = JSON.parse(await options.target.readText(join(options.layout.snapshotsDirectory, record.snapshotFile)));
37
+ checkedIntegrityHashes++;
38
+ if (record.envelopeHash !== envelopeHash(snapshot)) {
39
+ errors.push(`Transaction ${record.transactionId} envelopeHash does not match ${record.snapshotFile}.`);
40
+ }
41
+ }
42
+ catch {
43
+ // Snapshot-free write profiles are valid.
44
+ }
45
+ }
46
+ previousHash = record.transactionHash ?? previousHash;
47
+ }
48
+ const published = records.find((record) => record.transactionId === options.manifest.transactionId);
49
+ if (options.manifest.latestTransactionHash) {
50
+ checkedIntegrityHashes++;
51
+ if (published?.transactionHash && options.manifest.latestTransactionHash !== published.transactionHash) {
52
+ errors.push(`Manifest latestTransactionHash does not match transaction ${published.transactionId}.`);
53
+ }
54
+ }
55
+ if (records.length > 0 && !records.at(-1)?.transactionHash) {
56
+ warnings.push("Latest transaction record has no transactionHash; integrity-chain verification is limited for legacy data.");
57
+ }
58
+ return { checkedIntegrityHashes, warnings, errors };
59
+ }
60
+ function canonicalJson(value) {
61
+ return JSON.stringify(canonicalValue(value));
62
+ }
63
+ function sha256Hex(value) {
64
+ return createHash("sha256").update(value).digest("hex");
65
+ }
66
+ function canonicalValue(value) {
67
+ if (Array.isArray(value)) {
68
+ return value.map((item) => canonicalValue(item));
69
+ }
70
+ if (!value || typeof value !== "object") {
71
+ return value;
72
+ }
73
+ const record = value;
74
+ return Object.fromEntries(Object.keys(record).sort().map((key) => [key, canonicalValue(record[key])]));
75
+ }
76
+ //# sourceMappingURL=admin-integrity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-integrity.js","sourceRoot":"","sources":["../src/admin-integrity.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,14 @@ export interface AdminServerOptions extends StorageAdminClientOptions {
4
4
  host?: string;
5
5
  port?: number;
6
6
  authToken?: string;
7
+ accessTokens?: AdminAccessToken[];
7
8
  mutationConfirmToken?: string;
8
9
  }
10
+ export type AdminRole = "viewer" | "operator" | "admin";
11
+ export interface AdminAccessToken {
12
+ token: string;
13
+ role: AdminRole;
14
+ }
9
15
  export interface RunningAdminServer {
10
16
  server: Server;
11
17
  url: string;
@@ -28,7 +28,7 @@ async function route(client, options, request, response) {
28
28
  const url = new URL(request.url ?? "/", "http://127.0.0.1");
29
29
  if (request.method === "GET" && url.pathname === "/") {
30
30
  response.writeHead(200, { "content-type": "text/html; charset=utf-8" });
31
- response.end(ADMIN_HTML.replace("__CONFIRM_REQUIRED__", options.mutationConfirmToken ? "true" : "false").replace("__AUTH_REQUIRED__", options.authToken ? "true" : "false"));
31
+ response.end(ADMIN_HTML.replace("__CONFIRM_REQUIRED__", options.mutationConfirmToken ? "true" : "false").replace("__AUTH_REQUIRED__", isAuthRequired(options) ? "true" : "false"));
32
32
  return;
33
33
  }
34
34
  if (request.method === "GET" && (url.pathname === "/assets/graphvault-logo.png" || url.pathname === "/favicon.ico")) {
@@ -37,12 +37,16 @@ async function route(client, options, request, response) {
37
37
  response.end(logo);
38
38
  return;
39
39
  }
40
- if (options.authToken && !isAuthorized(request, options.authToken)) {
40
+ const access = authorize(request, options);
41
+ if (!access.authorized) {
41
42
  return sendJson(response, 401, { error: "Unauthorized" });
42
43
  }
43
44
  if (request.method === "GET" && url.pathname === "/api/summary") {
44
45
  return sendJson(response, 200, await client.summary({ verify: url.searchParams.get("verify") !== "false" }));
45
46
  }
47
+ if (request.method === "GET" && url.pathname === "/api/operations") {
48
+ return sendJson(response, 200, (await client.summary({ verify: false })).operations);
49
+ }
46
50
  if (request.method === "GET" && url.pathname === "/api/root") {
47
51
  return sendJson(response, 200, await client.rootReference());
48
52
  }
@@ -52,10 +56,18 @@ async function route(client, options, request, response) {
52
56
  if (request.method === "GET" && url.pathname === "/api/objects") {
53
57
  return sendJson(response, 200, await client.listObjects());
54
58
  }
59
+ if (request.method === "GET" && url.pathname === "/api/subtree") {
60
+ const rootObjectId = stringParam(url, "rootObjectId");
61
+ return sendJson(response, 200, await client.subtree({ ...(rootObjectId ? { rootObjectId } : {}), depth: numberParam(url, "depth", 2) }));
62
+ }
55
63
  if (request.method === "GET" && url.pathname?.startsWith("/api/objects/") && url.pathname.endsWith("/children")) {
56
64
  const objectId = decodeURIComponent(url.pathname.slice("/api/objects/".length, -"/children".length));
57
65
  return sendJson(response, 200, await client.listObjectChildren(objectId));
58
66
  }
67
+ if (request.method === "GET" && url.pathname?.startsWith("/api/objects/") && url.pathname.endsWith("/subtree")) {
68
+ const objectId = decodeURIComponent(url.pathname.slice("/api/objects/".length, -"/subtree".length));
69
+ return sendJson(response, 200, await client.subtree({ rootObjectId: objectId, depth: numberParam(url, "depth", 2) }));
70
+ }
59
71
  if (request.method === "GET" && url.pathname?.startsWith("/api/objects/") && url.pathname.endsWith("/path")) {
60
72
  const objectId = decodeURIComponent(url.pathname.slice("/api/objects/".length, -"/path".length));
61
73
  return sendJson(response, 200, await client.hierarchyPath(objectId));
@@ -82,9 +94,15 @@ async function route(client, options, request, response) {
82
94
  return sendJson(response, 200, await client.verify());
83
95
  }
84
96
  if (request.method === "POST" && url.pathname === "/api/maintenance") {
97
+ if (!hasRole(access.role, "operator")) {
98
+ return sendJson(response, 403, { error: "Operator role is required for maintenance." });
99
+ }
85
100
  return sendJson(response, 200, await client.maintain(await readJson(request)));
86
101
  }
87
102
  if (request.method === "POST" && url.pathname === "/api/backup") {
103
+ if (!hasRole(access.role, "operator")) {
104
+ return sendJson(response, 403, { error: "Operator role is required for backup." });
105
+ }
88
106
  return sendJson(response, 200, await client.backup(await readJson(request)));
89
107
  }
90
108
  if (request.method === "POST" && url.pathname === "/api/preview-mutation") {
@@ -92,17 +110,27 @@ async function route(client, options, request, response) {
92
110
  }
93
111
  if (request.method === "POST" && url.pathname === "/api/gvql") {
94
112
  const body = await readJson(request);
113
+ if (body?.dryRun !== true && !hasRole(access.role, "admin")) {
114
+ return sendJson(response, 403, { error: "Admin role is required to commit GVQL mutations." });
115
+ }
95
116
  if (body?.dryRun !== true && options.mutationConfirmToken && body?.confirmToken !== options.mutationConfirmToken) {
96
117
  return sendJson(response, 403, { error: "GVQL mutation confirmation token is missing or invalid." });
97
118
  }
98
- return sendJson(response, 200, await client.gvql(String(body?.query ?? ""), { parameters: body?.parameters ?? {}, dryRun: body?.dryRun === true }));
119
+ return sendJson(response, 200, await client.gvql(String(body?.query ?? ""), {
120
+ parameters: body?.parameters ?? {},
121
+ dryRun: body?.dryRun === true,
122
+ ...(body?.dryRun === true ? {} : { metadata: commitMetadataFromBody(body, request, "gvql") }),
123
+ }));
99
124
  }
100
125
  if (request.method === "POST" && url.pathname === "/api/mutate") {
101
126
  const body = await readJson(request);
127
+ if (!hasRole(access.role, "admin")) {
128
+ return sendJson(response, 403, { error: "Admin role is required to commit mutations." });
129
+ }
102
130
  if (options.mutationConfirmToken && body?.confirmToken !== options.mutationConfirmToken) {
103
131
  return sendJson(response, 403, { error: "Mutation confirmation token is missing or invalid." });
104
132
  }
105
- return sendJson(response, 200, await client.mutate(body));
133
+ return sendJson(response, 200, await client.mutate({ ...body, metadata: commitMetadataFromBody(body, request, "direct-edit") }));
106
134
  }
107
135
  sendJson(response, 404, { error: "Not found" });
108
136
  }
@@ -110,8 +138,76 @@ function numberParam(url, name, fallback) {
110
138
  const value = Number(url.searchParams.get(name));
111
139
  return Number.isFinite(value) ? value : fallback;
112
140
  }
113
- function isAuthorized(request, authToken) {
114
- return request.headers.authorization === `Bearer ${authToken}`;
141
+ function stringParam(url, name) {
142
+ const value = url.searchParams.get(name)?.trim();
143
+ return value || undefined;
144
+ }
145
+ function isAuthRequired(options) {
146
+ return Boolean(options.authToken || options.accessTokens?.length);
147
+ }
148
+ function authorize(request, options) {
149
+ if (!isAuthRequired(options)) {
150
+ return { authorized: true, role: "admin" };
151
+ }
152
+ const token = bearerToken(request);
153
+ if (token && options.authToken && token === options.authToken) {
154
+ return { authorized: true, role: "admin" };
155
+ }
156
+ const match = options.accessTokens?.find((entry) => entry.token === token);
157
+ if (match) {
158
+ return { authorized: true, role: match.role };
159
+ }
160
+ return { authorized: false, role: "viewer" };
161
+ }
162
+ function bearerToken(request) {
163
+ const header = request.headers.authorization;
164
+ return typeof header === "string" && header.startsWith("Bearer ") ? header.slice("Bearer ".length) : undefined;
165
+ }
166
+ function hasRole(actual, required) {
167
+ return roleRank(actual) >= roleRank(required);
168
+ }
169
+ function roleRank(role) {
170
+ return role === "admin" ? 3 : role === "operator" ? 2 : 1;
171
+ }
172
+ function commitMetadataFromBody(body, request, source) {
173
+ const input = typeof body?.metadata === "object" && body.metadata ? body.metadata : {};
174
+ const metadata = { source: stringOrUndefined(input.source) ?? `graphvault-studio:${source}` };
175
+ const actor = stringOrUndefined(input.actor) ?? stringOrUndefined(request.headers["x-graphvault-actor"]);
176
+ const reason = stringOrUndefined(input.reason);
177
+ const traceId = stringOrUndefined(input.traceId) ?? stringOrUndefined(request.headers["x-request-id"]);
178
+ const tags = Array.isArray(input.tags) ? input.tags.filter((tag) => typeof tag === "string") : undefined;
179
+ const attributes = plainAttributes(input.attributes);
180
+ if (actor) {
181
+ metadata.actor = actor;
182
+ }
183
+ if (reason) {
184
+ metadata.reason = reason;
185
+ }
186
+ if (traceId) {
187
+ metadata.traceId = traceId;
188
+ }
189
+ if (tags?.length) {
190
+ metadata.tags = tags;
191
+ }
192
+ if (attributes) {
193
+ metadata.attributes = attributes;
194
+ }
195
+ return metadata;
196
+ }
197
+ function stringOrUndefined(value) {
198
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
199
+ }
200
+ function plainAttributes(value) {
201
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
202
+ return undefined;
203
+ }
204
+ const attributes = {};
205
+ for (const [key, entry] of Object.entries(value)) {
206
+ if (typeof entry === "string" || typeof entry === "number" || typeof entry === "boolean" || entry === null) {
207
+ attributes[key] = entry;
208
+ }
209
+ }
210
+ return Object.keys(attributes).length ? attributes : undefined;
115
211
  }
116
212
  function sendJson(response, status, value) {
117
213
  response.writeHead(status, { "content-type": "application/json; charset=utf-8" });
@@ -1 +1 @@
1
- {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ObjectRecord, SerializedEnvelope, StorageManifest, StorageTarget } from "@sprengmeister/graphvault/internal/core/types";
2
+ import type { StorageLayout } from "@sprengmeister/graphvault/internal/storage/storage-layout";
3
+ export type VersionedStorageManifest = StorageManifest & {
4
+ objectVersions?: Record<string, number>;
5
+ latestTransactionHash?: string;
6
+ };
7
+ export declare function readAdminObjectRecord(target: StorageTarget, layout: StorageLayout, manifest: VersionedStorageManifest, objectId: string): Promise<ObjectRecord>;
8
+ export declare function envelopeFromAdminManifest(target: StorageTarget, layout: StorageLayout, manifest: VersionedStorageManifest): Promise<SerializedEnvelope>;
9
+ export declare function writeAdminObjectRecords(target: StorageTarget, layout: StorageLayout, envelope: SerializedEnvelope, transactionId: number, objectIds: readonly string[]): Promise<void>;
10
+ export declare function writeAdminManifest(target: StorageTarget, layout: StorageLayout, envelope: SerializedEnvelope, transactionId: number, latestTransactionHash?: string): Promise<void>;
@@ -0,0 +1,80 @@
1
+ import { dirname, join } from "node:path";
2
+ import { decodeBinaryRecord, encodeBinaryRecord } from "@sprengmeister/graphvault/internal/core/binary-codec";
3
+ export async function readAdminObjectRecord(target, layout, manifest, objectId) {
4
+ const version = manifest.objectVersions?.[objectId] ?? manifest.transactionId;
5
+ return readVersionedObjectRecord(target, layout, objectId, version).catch(() => readUnversionedObjectRecord(target, layout, objectId));
6
+ }
7
+ export async function envelopeFromAdminManifest(target, layout, manifest) {
8
+ const nodes = {};
9
+ for (const objectId of manifest.objectIds) {
10
+ nodes[objectId] = (await readAdminObjectRecord(target, layout, manifest, objectId)).node;
11
+ }
12
+ return {
13
+ format: "graphvault",
14
+ version: 1,
15
+ createdAt: manifest.createdAt,
16
+ root: manifest.root,
17
+ nodes,
18
+ };
19
+ }
20
+ export async function writeAdminObjectRecords(target, layout, envelope, transactionId, objectIds) {
21
+ const storedAt = new Date().toISOString();
22
+ await Promise.all(objectIds.map(async (objectId) => {
23
+ const node = envelope.nodes[objectId];
24
+ if (!node) {
25
+ return;
26
+ }
27
+ const record = {
28
+ format: "graphvault-object",
29
+ version: 1,
30
+ objectId,
31
+ transactionId,
32
+ storedAt,
33
+ node,
34
+ };
35
+ await Promise.all([
36
+ target.writeBufferAtomic(versionedBinaryObjectPath(layout, objectId, transactionId), encodeBinaryRecord(record)),
37
+ writeJson(target, versionedJsonObjectPath(layout, objectId, transactionId), record),
38
+ ]);
39
+ }));
40
+ }
41
+ export async function writeAdminManifest(target, layout, envelope, transactionId, latestTransactionHash) {
42
+ const objectIds = Object.keys(envelope.nodes).sort((a, b) => Number(a) - Number(b));
43
+ const objectVersions = Object.fromEntries(objectIds.map((objectId) => [objectId, transactionId]));
44
+ await writeJson(target, layout.manifestFile, {
45
+ format: "graphvault-manifest",
46
+ version: 1,
47
+ transactionId,
48
+ createdAt: new Date().toISOString(),
49
+ root: envelope.root,
50
+ objectIds,
51
+ objectVersions,
52
+ ...(latestTransactionHash ? { latestTransactionHash } : {}),
53
+ });
54
+ }
55
+ async function readVersionedObjectRecord(target, layout, objectId, transactionId) {
56
+ try {
57
+ return decodeBinaryRecord(await target.readBuffer(versionedBinaryObjectPath(layout, objectId, transactionId)));
58
+ }
59
+ catch {
60
+ return JSON.parse(await target.readText(versionedJsonObjectPath(layout, objectId, transactionId)));
61
+ }
62
+ }
63
+ async function readUnversionedObjectRecord(target, layout, objectId) {
64
+ try {
65
+ return decodeBinaryRecord(await target.readBuffer(layout.binaryObjectPath(objectId)));
66
+ }
67
+ catch {
68
+ return JSON.parse(await target.readText(layout.objectRecordPath(objectId)));
69
+ }
70
+ }
71
+ function versionedJsonObjectPath(layout, objectId, transactionId) {
72
+ return join(dirname(layout.objectRecordPath(objectId)), `${objectId}.${transactionId}.json`);
73
+ }
74
+ function versionedBinaryObjectPath(layout, objectId, transactionId) {
75
+ return join(dirname(layout.binaryObjectPath(objectId)), `${objectId}.${transactionId}.bin`);
76
+ }
77
+ async function writeJson(target, path, value) {
78
+ await target.writeTextAtomic(path, `${JSON.stringify(value, null, 2)}\n`);
79
+ }
80
+ //# sourceMappingURL=admin-storage-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-storage-io.js","sourceRoot":"","sources":["../src/admin-storage-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { VersionedStorageManifest } from "./admin-storage-io.js";
2
+ import type { AdminSubtree } from "./admin-types.js";
3
+ import type { ObjectRecord } from "@sprengmeister/graphvault/internal/core/types";
4
+ export interface AdminSubtreeOptions {
5
+ rootObjectId?: string;
6
+ depth?: number;
7
+ }
8
+ export declare function loadAdminSubtree(manifest: VersionedStorageManifest, readObjectRecord: (objectId: string) => Promise<ObjectRecord>, options?: AdminSubtreeOptions): Promise<AdminSubtree>;
@@ -0,0 +1,92 @@
1
+ import { referencedChildren } from "./admin-inspection.js";
2
+ export async function loadAdminSubtree(manifest, readObjectRecord, options = {}) {
3
+ const depth = normalizeDepth(options.depth ?? 2);
4
+ const rootObjectId = options.rootObjectId ?? objectIdFromRef(manifest.root);
5
+ const root = rootObjectId ? { $ref: rootObjectId } : manifest.root;
6
+ if (!rootObjectId) {
7
+ return {
8
+ root,
9
+ transactionId: manifest.transactionId,
10
+ depth,
11
+ complete: true,
12
+ objectIds: [],
13
+ nodes: [],
14
+ edges: [],
15
+ truncatedReferences: [],
16
+ envelope: emptyEnvelope(manifest.createdAt, root),
17
+ };
18
+ }
19
+ const knownObjectIds = new Set(manifest.objectIds);
20
+ if (!knownObjectIds.has(rootObjectId)) {
21
+ throw new Error(`Cannot load subtree: object "${rootObjectId}" is not present in the current manifest.`);
22
+ }
23
+ const encodedNodes = {};
24
+ const graphNodes = [];
25
+ const graphEdges = [];
26
+ const truncatedReferences = [];
27
+ const queue = [{ objectId: rootObjectId, depth: 0 }];
28
+ const queued = new Set([rootObjectId]);
29
+ for (let index = 0; index < queue.length; index++) {
30
+ const current = queue[index];
31
+ if (!current) {
32
+ continue;
33
+ }
34
+ const record = await readObjectRecord(current.objectId);
35
+ encodedNodes[record.objectId] = record.node;
36
+ graphNodes.push({
37
+ objectId: record.objectId,
38
+ kind: record.node.kind,
39
+ ...(record.node.kind === "object" && record.node.type ? { type: record.node.type } : {}),
40
+ });
41
+ for (const [path, toObjectId] of referencedChildren(record.node)) {
42
+ const reference = { fromObjectId: record.objectId, toObjectId, path, depth: current.depth + 1 };
43
+ if (!knownObjectIds.has(toObjectId) || current.depth >= depth) {
44
+ truncatedReferences.push(reference);
45
+ continue;
46
+ }
47
+ graphEdges.push({ from: record.objectId, to: toObjectId, path });
48
+ if (!queued.has(toObjectId)) {
49
+ queued.add(toObjectId);
50
+ queue.push({ objectId: toObjectId, depth: current.depth + 1 });
51
+ }
52
+ }
53
+ }
54
+ const objectIds = Object.keys(encodedNodes);
55
+ return {
56
+ root,
57
+ rootObjectId,
58
+ transactionId: manifest.transactionId,
59
+ depth,
60
+ complete: truncatedReferences.length === 0,
61
+ objectIds,
62
+ nodes: graphNodes,
63
+ edges: graphEdges,
64
+ truncatedReferences,
65
+ envelope: {
66
+ format: "graphvault",
67
+ version: 1,
68
+ createdAt: manifest.createdAt,
69
+ root,
70
+ nodes: encodedNodes,
71
+ },
72
+ };
73
+ }
74
+ function emptyEnvelope(createdAt, root) {
75
+ return {
76
+ format: "graphvault",
77
+ version: 1,
78
+ createdAt,
79
+ root,
80
+ nodes: {},
81
+ };
82
+ }
83
+ function objectIdFromRef(value) {
84
+ return value && typeof value === "object" && "$ref" in value ? value.$ref : undefined;
85
+ }
86
+ function normalizeDepth(depth) {
87
+ if (!Number.isInteger(depth) || depth < 0) {
88
+ throw new TypeError("Subtree depth must be a non-negative integer.");
89
+ }
90
+ return Math.min(depth, 12);
91
+ }
92
+ //# sourceMappingURL=admin-subtree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-subtree.js","sourceRoot":"","sources":["../src/admin-subtree.ts"],"names":[],"mappings":"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"}