wiki-graph-sdk 0.8.4 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/archives.cjs +345 -152
  2. package/dist/archives.cjs.map +1 -1
  3. package/dist/archives.js +356 -157
  4. package/dist/archives.js.map +1 -1
  5. package/dist/conversions.cjs +269 -99
  6. package/dist/conversions.cjs.map +1 -1
  7. package/dist/conversions.js +275 -103
  8. package/dist/conversions.js.map +1 -1
  9. package/dist/default-worker.cjs +278 -108
  10. package/dist/default-worker.cjs.map +1 -1
  11. package/dist/default-worker.js +285 -112
  12. package/dist/default-worker.js.map +1 -1
  13. package/dist/embedding.cjs +214 -54
  14. package/dist/embedding.cjs.map +1 -1
  15. package/dist/embedding.js +214 -54
  16. package/dist/embedding.js.map +1 -1
  17. package/dist/gc.cjs +214 -54
  18. package/dist/gc.cjs.map +1 -1
  19. package/dist/gc.js +214 -54
  20. package/dist/gc.js.map +1 -1
  21. package/dist/index.cjs +442 -226
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +461 -236
  25. package/dist/index.js.map +1 -1
  26. package/dist/local-config.cjs +214 -54
  27. package/dist/local-config.cjs.map +1 -1
  28. package/dist/local-config.js +214 -54
  29. package/dist/local-config.js.map +1 -1
  30. package/dist/maintenance.cjs +265 -97
  31. package/dist/maintenance.cjs.map +1 -1
  32. package/dist/maintenance.js +271 -101
  33. package/dist/maintenance.js.map +1 -1
  34. package/dist/node-platform.cjs +214 -54
  35. package/dist/node-platform.cjs.map +1 -1
  36. package/dist/node-platform.d.ts +2 -0
  37. package/dist/node-platform.js +214 -54
  38. package/dist/node-platform.js.map +1 -1
  39. package/dist/runtime-config.cjs +214 -54
  40. package/dist/runtime-config.cjs.map +1 -1
  41. package/dist/runtime-config.js +214 -54
  42. package/dist/runtime-config.js.map +1 -1
  43. package/dist/stage.cjs +214 -54
  44. package/dist/stage.cjs.map +1 -1
  45. package/dist/stage.js +214 -54
  46. package/dist/stage.js.map +1 -1
  47. package/dist/worker.cjs +277 -103
  48. package/dist/worker.cjs.map +1 -1
  49. package/dist/worker.js +284 -107
  50. package/dist/worker.js.map +1 -1
  51. package/package.json +2 -2
@@ -68,6 +68,15 @@ var NodeFile = class {
68
68
  this.name = name;
69
69
  }
70
70
  path;
71
+ async getPhysicalIdentity() {
72
+ const value = await fsPromises.stat(this.path).catch((error) => {
73
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
74
+ return void 0;
75
+ throw error;
76
+ });
77
+ if (value === void 0) return void 0;
78
+ return `${value.dev}:${value.ino}`;
79
+ }
71
80
  kind = "file";
72
81
  [NODE_RESOURCE_KIND] = "file";
73
82
  identity;
@@ -192,6 +201,15 @@ var NodeDirectory = class _NodeDirectory {
192
201
  this.name = pathModule.basename(path);
193
202
  }
194
203
  path;
204
+ async getPhysicalIdentity() {
205
+ const value = await fsPromises.stat(this.path).catch((error) => {
206
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
207
+ return void 0;
208
+ throw error;
209
+ });
210
+ if (value === void 0) return void 0;
211
+ return `${value.dev}:${value.ino}`;
212
+ }
195
213
  kind = "directory";
196
214
  [NODE_RESOURCE_KIND] = "directory";
197
215
  identity;
@@ -201,8 +219,10 @@ var NodeDirectory = class _NodeDirectory {
201
219
  const file = new NodeFile(pathModule.join(this.path, name));
202
220
  try {
203
221
  return (await fsPromises.stat(file.path)).isFile() ? file : void 0;
204
- } catch {
205
- return void 0;
222
+ } catch (error) {
223
+ if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR"))
224
+ return void 0;
225
+ throw error;
206
226
  }
207
227
  }
208
228
  async getLastModified() {
@@ -220,8 +240,10 @@ var NodeDirectory = class _NodeDirectory {
220
240
  const directory = new _NodeDirectory(pathModule.join(this.path, name));
221
241
  try {
222
242
  return (await fsPromises.stat(directory.path)).isDirectory() ? directory : void 0;
223
- } catch {
224
- return void 0;
243
+ } catch (error) {
244
+ if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR"))
245
+ return void 0;
246
+ throw error;
225
247
  }
226
248
  }
227
249
  async list() {
@@ -345,14 +367,23 @@ async function openNativeNodeDatabase(file, flags) {
345
367
  });
346
368
  });
347
369
  }
348
- async function openNodeZip(file) {
370
+ async function openNodeZip(file, options = {}) {
349
371
  const path = getBrandedNodeResourcePath(file, "file");
350
372
  if (path === void 0) {
351
373
  throw new TypeError("The Node ZIP adapter requires a NodeFile");
352
374
  }
353
- const zipFile = await new Promise((resolve2, reject) => {
354
- yauzl.open(
355
- path,
375
+ const handle = await fsPromises.open(path, "r");
376
+ let size;
377
+ try {
378
+ size = (await handle.stat()).size;
379
+ } catch (error) {
380
+ await handle.close();
381
+ throw error;
382
+ }
383
+ const open2 = () => new Promise((resolve2, reject) => {
384
+ yauzl.fromRandomAccessReader(
385
+ new NodeZipSource(handle),
386
+ size,
356
387
  { autoClose: false, lazyEntries: true },
357
388
  (error, opened) => {
358
389
  if (error || opened === void 0)
@@ -361,63 +392,192 @@ async function openNodeZip(file) {
361
392
  }
362
393
  );
363
394
  });
364
- const entries = await new Promise(
365
- (resolve2, reject) => {
366
- const discovered = /* @__PURE__ */ new Map();
367
- const rejectAndClose = (error) => {
368
- zipFile.close();
369
- reject(
370
- error instanceof Error ? error : new Error("Cannot scan ZIP central directory")
371
- );
372
- };
373
- const resolveEntries = () => {
374
- zipFile.off("error", rejectAndClose);
375
- resolve2(discovered);
376
- };
377
- zipFile.on("entry", (entry) => {
378
- if (!entry.fileName.endsWith("/")) {
379
- discovered.set(entry.fileName, entry);
380
- }
381
- zipFile.readEntry();
382
- });
383
- zipFile.once("error", rejectAndClose);
384
- zipFile.once("end", resolveEntries);
385
- zipFile.readEntry();
386
- }
387
- );
395
+ try {
396
+ (await open2()).close();
397
+ } catch (error) {
398
+ await handle.close();
399
+ throw error;
400
+ }
388
401
  let closed = false;
402
+ let pending = Promise.resolve();
403
+ let closing;
404
+ const run = (operation) => {
405
+ if (closed)
406
+ return Promise.reject(new Error("Cannot read a closed ZIP archive"));
407
+ const result = pending.then(async () => {
408
+ const zip = await open2();
409
+ try {
410
+ return await operation(zip);
411
+ } finally {
412
+ zip.close();
413
+ }
414
+ });
415
+ pending = result.then(
416
+ () => void 0,
417
+ () => void 0
418
+ );
419
+ return result;
420
+ };
421
+ const withEntry = (name, operation) => run(async (zip) => {
422
+ let exact;
423
+ let alias;
424
+ let aliasCollision = false;
425
+ await scanNodeZip(zip, (entry) => {
426
+ if (entry.fileName === name) exact = entry;
427
+ if (normalizeNodeZipName(entry.fileName) === name) {
428
+ if (alias !== void 0 && alias.fileName !== entry.fileName)
429
+ aliasCollision = true;
430
+ alias = entry;
431
+ }
432
+ });
433
+ if ((exact === void 0 || options.entryNameMode === "normalized") && aliasCollision) {
434
+ let bestPosition = -1;
435
+ const candidates = await open2();
436
+ try {
437
+ await scanNodeZip(candidates, async (entry) => {
438
+ if (normalizeNodeZipName(entry.fileName) !== name) return;
439
+ const probe = await open2();
440
+ let position = 0;
441
+ try {
442
+ await scanNodeZip(probe, (candidate) => {
443
+ if (candidate.fileName === entry.fileName) return false;
444
+ position++;
445
+ });
446
+ } finally {
447
+ probe.close();
448
+ }
449
+ if (position >= bestPosition) {
450
+ bestPosition = position;
451
+ alias = entry;
452
+ }
453
+ });
454
+ return await operation(candidates, alias);
455
+ } finally {
456
+ candidates.close();
457
+ }
458
+ }
459
+ return await operation(
460
+ zip,
461
+ options.entryNameMode === "normalized" ? alias : exact ?? alias
462
+ );
463
+ });
389
464
  return {
390
465
  close: () => {
391
- if (!closed) zipFile.close();
392
466
  closed = true;
393
- return Promise.resolve();
467
+ closing ??= pending.then(() => handle.close());
468
+ return closing;
394
469
  },
395
- copyEntry: async (name, target) => {
396
- if (closed) throw new Error("Cannot read a closed ZIP archive");
397
- const entry = entries.get(name);
470
+ copyEntry: (name, target) => withEntry(name, async (zip, entry) => {
398
471
  if (entry === void 0) return false;
399
- await copyNodeZipEntry(zipFile, entry, target);
472
+ await copyNodeZipEntry(zip, entry, target);
400
473
  return true;
401
- },
402
- getEntrySize: (name) => {
403
- if (closed) throw new Error("Cannot read a closed ZIP archive");
404
- return Promise.resolve(entries.get(name)?.uncompressedSize);
405
- },
406
- listEntries: () => Promise.resolve([...entries.keys()]),
407
- readEntryRange: async (name, offset, length) => {
408
- if (closed) throw new Error("Cannot read a closed ZIP archive");
409
- const entry = entries.get(name);
474
+ }),
475
+ getEntrySize: (name) => withEntry(
476
+ name,
477
+ (_zip, entry) => Promise.resolve(entry?.uncompressedSize)
478
+ ),
479
+ listEntries: () => run(async (zip) => {
480
+ const names = /* @__PURE__ */ new Set();
481
+ await scanNodeZip(zip, (entry) => {
482
+ names.add(entry.fileName);
483
+ });
484
+ return [...names];
485
+ }),
486
+ readEntryRange: (name, offset, length) => withEntry(name, async (zip, entry) => {
410
487
  if (entry === void 0) return void 0;
411
- return await readNodeZipEntryRange(zipFile, entry, offset, length);
412
- },
413
- readEntry: async (name) => {
414
- if (closed) throw new Error("Cannot read a closed ZIP archive");
415
- const entry = entries.get(name);
488
+ return await readNodeZipEntryRange(zip, entry, offset, length);
489
+ }),
490
+ readEntry: (name) => withEntry(name, async (zip, entry) => {
416
491
  if (entry === void 0) return void 0;
417
- return await readNodeZipEntry(zipFile, entry);
418
- }
492
+ return await readNodeZipEntry(zip, entry);
493
+ })
419
494
  };
420
495
  }
496
+ var NodeZipSource = class extends yauzl.RandomAccessReader {
497
+ constructor(handle) {
498
+ super();
499
+ this.handle = handle;
500
+ }
501
+ handle;
502
+ read(buffer, offset, length, position, callback) {
503
+ const read2 = (written) => {
504
+ if (written === length) {
505
+ callback(null);
506
+ return;
507
+ }
508
+ fs.read(
509
+ this.handle.fd,
510
+ buffer,
511
+ offset + written,
512
+ length - written,
513
+ position + written,
514
+ (error, bytesRead) => {
515
+ if (error) callback(error);
516
+ else if (bytesRead === 0)
517
+ callback(new Error("Unexpected end of ZIP file"));
518
+ else read2(written + bytesRead);
519
+ }
520
+ );
521
+ };
522
+ read2(0);
523
+ }
524
+ _readStreamForRange(start, end) {
525
+ const handle = this.handle;
526
+ return import_node_stream.Readable.from(
527
+ (async function* () {
528
+ for (let position = start; position < end; ) {
529
+ const buffer = Buffer.allocUnsafe(
530
+ Math.min(64 * 1024, end - position)
531
+ );
532
+ const { bytesRead } = await handle.read(
533
+ buffer,
534
+ 0,
535
+ buffer.length,
536
+ position
537
+ );
538
+ if (bytesRead === 0) return;
539
+ position += bytesRead;
540
+ yield buffer.subarray(0, bytesRead);
541
+ }
542
+ })()
543
+ );
544
+ }
545
+ };
546
+ function normalizeNodeZipName(name) {
547
+ const normalized = name.replaceAll("\\", "/").trim().split("/").filter((part) => part !== "" && part !== ".").join("/");
548
+ return normalized.split("/").includes("..") ? void 0 : normalized;
549
+ }
550
+ async function scanNodeZip(zip, visit) {
551
+ await new Promise((resolve2, reject) => {
552
+ const cleanup = () => {
553
+ zip.off("entry", onEntry);
554
+ zip.off("end", onEnd);
555
+ zip.off("error", onError);
556
+ };
557
+ const onError = (error) => {
558
+ cleanup();
559
+ reject(error);
560
+ };
561
+ const onEnd = () => {
562
+ cleanup();
563
+ resolve2();
564
+ };
565
+ const onEntry = (entry) => {
566
+ void Promise.resolve().then(() => entry.fileName.endsWith("/") ? void 0 : visit(entry)).then((keepReading) => {
567
+ if (keepReading === false) onEnd();
568
+ else zip.readEntry();
569
+ }).catch(
570
+ (error) => onError(
571
+ error instanceof Error ? error : new Error("Cannot scan ZIP", { cause: error })
572
+ )
573
+ );
574
+ };
575
+ zip.on("entry", onEntry);
576
+ zip.once("end", onEnd);
577
+ zip.once("error", onError);
578
+ zip.readEntry();
579
+ });
580
+ }
421
581
  async function copyNodeZipEntry(zipFile, entry, target) {
422
582
  const writer = await target.openWriter();
423
583
  try {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/node-platform.ts"],"sourcesContent":["/* eslint-disable no-restricted-syntax, @typescript-eslint/parameter-properties */\nimport * as asyncHooks from \"node:async_hooks\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as pathModule from \"node:path\";\nimport * as process from \"node:process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as sqlite3 from \"sqlite3\";\nimport * as yauzl from \"yauzl\";\nimport * as yazl from \"yazl\";\nimport { Environment, Loader, type LoaderSource } from \"nunjucks\";\n\nconst nodeProcess =\n (process as unknown as { default?: typeof process }).default ?? process;\nconst nodeSqlite3 =\n (sqlite3 as unknown as { default?: typeof sqlite3 }).default ?? sqlite3;\n\nimport {\n getWikiGraphPlatform,\n getWikiGraphStorage,\n installWikiGraphPlatform,\n installWikiGraphStorage,\n withWikiGraphStorage,\n type Directory,\n type File,\n type FileReader,\n type ReadonlyFile,\n type FileWriter,\n type HostDatabaseConnection,\n type HostDatabaseOpenOptions,\n type HostDatabaseRow,\n type HostDatabaseValue,\n type HostLifecycleProvider,\n type HostZipWriteEntry,\n type HostZipReader,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n normalizeTemplateName,\n} from \"wiki-graph-core/platform\";\n\n/** Stable across independently bundled SDK entry points. */\nconst NODE_RESOURCE_KIND = Symbol.for(\"wiki-graph-sdk.node-resource.v1\");\n\n/** Install the Node implementation used by the CLI and its workers. */\nexport class NodeFile implements File {\n public readonly kind = \"file\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"file\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(\n public readonly path: string,\n name = pathModule.basename(path),\n ) {\n this.identity = encodeNodeResourceIdentity(\"file\", path);\n this.name = name;\n }\n\n public async openReader(): Promise<FileReader> {\n const handle = await fsPromises.open(this.path, \"r\");\n let closed = false;\n try {\n const stats = await handle.stat();\n if (!stats.isFile())\n throw new Error(\"File reader requires a regular file\");\n const { size } = stats;\n return {\n size,\n close: async () => {\n if (!closed) await handle.close();\n closed = true;\n },\n read: async (offset, length) => {\n if (closed) throw new Error(\"Cannot read from a closed FileReader\");\n assertFileRange(offset, length, size);\n const buffer = Buffer.allocUnsafe(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await handle.read(\n buffer,\n bytesRead,\n length - bytesRead,\n offset + bytesRead,\n );\n if (result.bytesRead === 0) {\n throw new Error(\"File changed while reading its byte range\");\n }\n bytesRead += result.bytesRead;\n }\n return new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\n },\n };\n } catch (error) {\n await handle.close();\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async openWriter(): Promise<FileWriter> {\n await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(temporary, \"wx\");\n let closed = false;\n return {\n write: async (data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n await writeNodeFileHandle(handle, data);\n },\n writeAt: async (offset, data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n assertFileOffset(offset);\n await writeNodeFileHandle(handle, data, offset);\n },\n commit: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rename(temporary, this.path);\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(temporary, { force: true });\n }\n closed = true;\n },\n };\n }\n}\n\n/** @internal Completes writes even when the Node file handle reports a short write. */\nexport async function writeNodeFileHandle(\n handle: Pick<fsPromises.FileHandle, \"write\">,\n data: Uint8Array | string,\n position?: number,\n): Promise<void> {\n const buffer = Buffer.from(data);\n let written = 0;\n while (written < buffer.byteLength) {\n const result = await handle.write(\n buffer,\n written,\n buffer.byteLength - written,\n position === undefined ? null : position + written,\n );\n if (result.bytesWritten === 0) {\n throw new Error(\"File writer made no progress\");\n }\n written += result.bytesWritten;\n }\n}\n\nfunction assertFileRange(offset: number, length: number, size: number): void {\n assertFileOffset(offset);\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(\n \"File read length must be a non-negative safe integer\",\n );\n }\n if (offset > size || length > size - offset) {\n throw new RangeError(\"File read range exceeds the file size\");\n }\n}\n\nfunction assertFileOffset(offset: number): void {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new RangeError(\"File offset must be a non-negative safe integer\");\n }\n}\n\nexport class NodeDirectory implements Directory {\n public readonly kind = \"directory\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"directory\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(public readonly path: string) {\n this.identity = encodeNodeResourceIdentity(\"directory\", path);\n this.name = pathModule.basename(path);\n }\n\n public async getFile(name: string): Promise<File | undefined> {\n assertChildName(name);\n const file = new NodeFile(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(file.path)).isFile() ? file : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async getDirectory(name: string): Promise<Directory | undefined> {\n assertChildName(name);\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(directory.path)).isDirectory()\n ? directory\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(this.path, {\n withFileTypes: true,\n });\n return entries.map((entry) =>\n entry.isDirectory()\n ? new NodeDirectory(pathModule.join(this.path, entry.name))\n : new NodeFile(pathModule.join(this.path, entry.name), entry.name),\n );\n }\n\n public async createFile(name: string): Promise<File> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(file.path, \"\", { flag: \"wx\" });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(directory.path);\n return directory;\n }\n\n public async remove(\n name: string,\n options?: { readonly recursive?: boolean },\n ): Promise<void> {\n assertChildName(name);\n await fsPromises.rm(pathModule.join(this.path, name), {\n force: true,\n recursive: options?.recursive === true,\n });\n }\n}\n\nfunction encodeNodeResourceIdentity(\n kind: \"directory\" | \"file\",\n path: string,\n): string {\n return `node-${kind}:${Buffer.from(pathModule.resolve(path), \"utf8\").toString(\"base64url\")}`;\n}\n\nfunction decodeNodeResourceIdentity(\n identity: string,\n kind: \"directory\" | \"file\",\n): string | undefined {\n const prefix = `node-${kind}:`;\n if (!identity.startsWith(prefix)) {\n // State created before opaque resource identities stored native paths.\n return pathModule.isAbsolute(identity) ? identity : undefined;\n }\n try {\n return Buffer.from(identity.slice(prefix.length), \"base64url\").toString(\n \"utf8\",\n );\n } catch {\n return undefined;\n }\n}\n\nexport function getNodeResourcePath(resource: File | Directory): string {\n const brandedPath = getBrandedNodeResourcePath(resource, resource.kind);\n if (brandedPath !== undefined) return brandedPath;\n if (\n typeof resource === \"object\" &&\n resource !== null &&\n \"path\" in resource &&\n typeof resource.path === \"string\"\n ) {\n return resource.path;\n }\n throw new TypeError(\"Expected a Node File or Directory resource\");\n}\n\nfunction assertChildName(name: string): void {\n if (\n name.length === 0 ||\n name === \".\" ||\n name === \"..\" ||\n pathModule.isAbsolute(name) ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\")\n ) {\n throw new TypeError(`Directory child must be a relative name: ${name}`);\n }\n}\n\nclass NodeDatabaseConnection implements HostDatabaseConnection {\n public constructor(private readonly database: sqlite3.Database) {}\n\n public async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async execute(sql: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.exec(sql, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async queryAll(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<readonly HostDatabaseRow[]> {\n return await new Promise((resolve, reject) => {\n this.database.all(sql, [...params], (error, rows: HostDatabaseRow[]) => {\n if (error) reject(error);\n else resolve(rows);\n });\n });\n }\n\n public async queryOne(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<HostDatabaseRow | undefined> {\n return await new Promise((resolve, reject) => {\n this.database.get(sql, [...params], (error, row: HostDatabaseRow) => {\n if (error) reject(error);\n else resolve(row);\n });\n });\n }\n\n public async run(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.run(sql, [...params], (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n}\n\nasync function openNodeDatabase(\n file: ReadonlyFile,\n options: HostDatabaseOpenOptions,\n): Promise<NodeDatabaseConnection> {\n const flags =\n (options.mode === \"readonly\"\n ? nodeSqlite3.OPEN_READONLY\n : nodeSqlite3.OPEN_READWRITE |\n (options.create ? nodeSqlite3.OPEN_CREATE : 0)) |\n nodeSqlite3.OPEN_FULLMUTEX;\n return new NodeDatabaseConnection(await openNativeNodeDatabase(file, flags));\n}\n\nasync function openNativeNodeDatabase(\n file: ReadonlyFile,\n flags: number,\n): Promise<sqlite3.Database> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node database adapter requires a NodeFile\");\n }\n return await new Promise((resolve, reject) => {\n const database = new nodeSqlite3.Database(path, flags, (error) => {\n if (error) reject(error);\n else resolve(database);\n });\n });\n}\n\nasync function openNodeZip(file: ReadonlyFile): Promise<HostZipReader> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node ZIP adapter requires a NodeFile\");\n }\n const zipFile = await new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.open(\n path,\n { autoClose: false, lazyEntries: true },\n (error, opened) => {\n if (error || opened === undefined)\n reject(error ?? new Error(\"Cannot open ZIP\"));\n else resolve(opened);\n },\n );\n });\n\n const entries = await new Promise<Map<string, yauzl.Entry>>(\n (resolve, reject) => {\n const discovered = new Map<string, yauzl.Entry>();\n const rejectAndClose = (error: unknown) => {\n zipFile.close();\n reject(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP central directory\"),\n );\n };\n const resolveEntries = () => {\n zipFile.off(\"error\", rejectAndClose);\n resolve(discovered);\n };\n zipFile.on(\"entry\", (entry: yauzl.Entry) => {\n if (!entry.fileName.endsWith(\"/\")) {\n discovered.set(entry.fileName, entry);\n }\n zipFile.readEntry();\n });\n zipFile.once(\"error\", rejectAndClose);\n zipFile.once(\"end\", resolveEntries);\n zipFile.readEntry();\n },\n );\n\n let closed = false;\n return {\n close: () => {\n if (!closed) zipFile.close();\n closed = true;\n return Promise.resolve();\n },\n copyEntry: async (name, target) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return false;\n await copyNodeZipEntry(zipFile, entry, target);\n return true;\n },\n getEntrySize: (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n return Promise.resolve(entries.get(name)?.uncompressedSize);\n },\n listEntries: () => Promise.resolve([...entries.keys()]),\n readEntryRange: async (name, offset, length) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zipFile, entry, offset, length);\n },\n readEntry: async (name) => {\n if (closed) throw new Error(\"Cannot read a closed ZIP archive\");\n const entry = entries.get(name);\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zipFile, entry);\n },\n };\n}\n\nasync function copyNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n target: File,\n): Promise<void> {\n const writer = await target.openWriter();\n try {\n const stream = await openNodeZipEntryStream(zipFile, entry);\n await writeNodeStream(stream, writer);\n await writer.commit();\n } catch (error) {\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function readNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n): Promise<Uint8Array> {\n return await collectNodeStream(await openNodeZipEntryStream(zipFile, entry));\n}\n\nasync function readNodeZipEntryRange(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n offset: number,\n length: number,\n): Promise<Uint8Array> {\n assertFileRange(offset, length, entry.uncompressedSize);\n if (length === 0) return new Uint8Array();\n if (entry.compressionMethod !== 0) {\n const content = await collectDecodedNodeStreamRange(\n await openNodeZipEntryStream(zipFile, entry),\n offset,\n length,\n );\n return new Uint8Array(\n content.buffer,\n content.byteOffset,\n content.byteLength,\n );\n }\n const content = await collectNodeStream(\n await openNodeZipEntryStream(zipFile, entry, {\n decompress: null,\n decrypt: null,\n end: offset + length,\n start: offset,\n }),\n );\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength);\n}\n\nasync function collectDecodedNodeStreamRange(\n input: NodeJS.ReadableStream,\n offset: number,\n length: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n const end = offset + length;\n let position = 0;\n let collected = 0;\n for await (const value of input) {\n const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);\n const chunkEnd = position + chunk.byteLength;\n if (chunkEnd > offset && position < end) {\n const selected = chunk.subarray(\n Math.max(0, offset - position),\n Math.min(chunk.byteLength, end - position),\n );\n chunks.push(selected);\n collected += selected.byteLength;\n }\n position = chunkEnd;\n if (position >= end) break;\n }\n if (collected !== length) {\n throw new Error(\"ZIP entry changed while reading its byte range\");\n }\n return Buffer.concat(chunks, collected);\n}\n\nasync function openNodeZipEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n options?: yauzl.ZipFileOptions,\n): Promise<NodeJS.ReadableStream> {\n return await new Promise<NodeJS.ReadableStream>((resolve, reject) => {\n const callback = (error: Error | null, opened: Readable) => {\n if (error || opened === undefined) {\n reject(error ?? new Error(`Cannot read ZIP entry: ${entry.fileName}`));\n } else {\n resolve(opened);\n }\n };\n if (options === undefined) zipFile.openReadStream(entry, callback);\n else zipFile.openReadStream(entry, options, callback);\n });\n}\n\nasync function writeNodeZip(\n file: File,\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Promise<void> {\n const zipFile = new yazl.ZipFile();\n const writer = await file.openWriter();\n const outputStream = zipFile.outputStream as Readable;\n const outputDone = writeNodeStream(outputStream, writer);\n const entryState = { cancelled: false, complete: false };\n let iterator:\n | Iterator<HostZipWriteEntry>\n | AsyncIterator<HostZipWriteEntry>\n | undefined;\n\n try {\n iterator = getNodeZipEntryIterator(entries);\n const entriesDone = addNodeZipEntries(zipFile, iterator, entryState);\n await Promise.race([entriesDone, outputDone]);\n if (!entryState.complete) {\n throw new Error(\"ZIP output ended before entry production completed\");\n }\n zipFile.end();\n await outputDone;\n await writer.commit();\n } catch (error) {\n entryState.cancelled = true;\n if (!entryState.complete && iterator !== undefined) {\n closeNodeZipEntryIterator(iterator);\n }\n if (!outputStream.destroyed) {\n outputStream.destroy(\n error instanceof Error ? error : new Error(\"Cannot write ZIP archive\"),\n );\n }\n await outputDone.catch(() => undefined);\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function addNodeZipEntries(\n zipFile: yazl.ZipFile,\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n state: { cancelled: boolean; complete: boolean },\n): Promise<void> {\n while (!state.cancelled) {\n const result = await iterator.next();\n if (state.cancelled) return;\n if (result.done) {\n state.complete = true;\n return;\n }\n if (\"file\" in result.value) {\n zipFile.addReadStream(\n createNodeFileReadStream(result.value.file),\n result.value.name,\n { compress: false },\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n compress: false,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { compress: false, size: result.value.size },\n );\n }\n }\n}\n\nfunction createNodeFileReadStream(file: ReadonlyFile): Readable {\n return Readable.from(\n (async function* () {\n const reader = await file.openReader();\n try {\n for (let offset = 0; offset < reader.size; ) {\n const chunk = await reader.read(\n offset,\n Math.min(64 * 1024, reader.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n } finally {\n await reader.close();\n }\n })(),\n );\n}\n\nfunction getBrandedNodeResourcePath(\n resource: unknown,\n kind: \"directory\" | \"file\",\n): string | undefined {\n if (typeof resource !== \"object\" || resource === null) return undefined;\n const candidate = resource as {\n readonly [NODE_RESOURCE_KIND]?: unknown;\n readonly path?: unknown;\n };\n return candidate[NODE_RESOURCE_KIND] === kind &&\n typeof candidate.path === \"string\"\n ? candidate.path\n : undefined;\n}\n\nfunction createNodeRangeReadStream(\n entry: Extract<HostZipWriteEntry, { readonly size: number }>,\n): Readable {\n return Readable.from(\n (async function* () {\n for (let offset = 0; offset < entry.size; ) {\n const chunk = await entry.read(\n offset,\n Math.min(64 * 1024, entry.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n })(),\n );\n}\n\nfunction getNodeZipEntryIterator(\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry> {\n const asyncIterator = (entries as AsyncIterable<HostZipWriteEntry>)[\n Symbol.asyncIterator\n ];\n return asyncIterator === undefined\n ? (entries as Iterable<HostZipWriteEntry>)[Symbol.iterator]()\n : asyncIterator.call(entries);\n}\n\nfunction closeNodeZipEntryIterator(\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n): void {\n if (iterator.return === undefined) return;\n try {\n void Promise.resolve(iterator.return()).catch(() => undefined);\n } catch {\n // Preserve the failure that caused iteration to stop.\n }\n}\n\nasync function writeNodeStream(\n input: NodeJS.ReadableStream,\n writer: FileWriter,\n): Promise<void> {\n await pipeline(\n input,\n new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n void writer.write(chunk).then(\n () => callback(),\n (error: unknown) =>\n callback(\n error instanceof Error\n ? error\n : new Error(\"Cannot stream ZIP archive\"),\n ),\n );\n },\n }),\n );\n}\n\nasync function collectNodeStream(\n input: NodeJS.ReadableStream,\n): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n input.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n input.once(\"error\", reject);\n input.once(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\nexport const nodeWikiGraphPlatform: WikiGraphPlatform = {\n asyncContext: {\n create: <T>() => new asyncHooks.AsyncLocalStorage<T>(),\n },\n database: { open: openNodeDatabase },\n lifecycle: {\n instanceId: `node-process:${nodeProcess.pid}`,\n isInstanceAlive: (instanceId) => {\n const match = /^node-process:(\\d+)$/u.exec(instanceId);\n if (match === null) return Promise.resolve(undefined);\n try {\n nodeProcess.kill(Number(match[1]), 0);\n return Promise.resolve(true);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ESRCH\"\n ) {\n return Promise.resolve(false);\n }\n return Promise.resolve(true);\n }\n },\n },\n resources: {\n getDirectory: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n getFile: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"file\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeFile(path),\n );\n },\n resolveLegacyDirectory: (reference) => {\n const path = decodeNodeResourceIdentity(reference, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n },\n templates: {\n createEnvironment: (options) =>\n new Environment(new NodeTemplateLoader(), options),\n },\n zip: {\n open: openNodeZip,\n write: writeNodeZip,\n },\n};\n\nexport interface NodeWikiGraphPlatformOptions {\n readonly lifecycle?: HostLifecycleProvider;\n}\n\n/** Create the Node platform with an optional host-owned lifecycle identity. */\nexport function createNodeWikiGraphPlatform(\n options: NodeWikiGraphPlatformOptions = {},\n): WikiGraphPlatform {\n return options.lifecycle === undefined\n ? nodeWikiGraphPlatform\n : { ...nodeWikiGraphPlatform, lifecycle: options.lifecycle };\n}\n\nclass NodeTemplateLoader extends Loader {\n readonly #dataDirectory: string | undefined;\n\n public constructor(dataDirectory?: string) {\n super();\n this.#dataDirectory = dataDirectory;\n }\n\n public getSource(templateName: string): LoaderSource {\n const name = normalizeTemplateName(templateName);\n const filePath = pathModule.join(\n this.#dataDirectory ?? resolveNodeDataDirectory(),\n name,\n );\n return {\n noCache: false,\n path: name,\n src: fs.readFileSync(filePath, \"utf8\"),\n };\n }\n}\n\nexport function createNodeTemplateEnvironment(\n dataDirectory: string,\n options: {\n readonly autoescape?: boolean;\n readonly trimBlocks?: boolean;\n } = {},\n): Environment {\n return new Environment(new NodeTemplateLoader(dataDirectory), {\n autoescape: options.autoescape ?? true,\n trimBlocks: options.trimBlocks ?? true,\n });\n}\n\nfunction resolveNodeDataDirectory(): string {\n const injected = (globalThis as { __WIKIGRAPH_DATA_DIR__?: unknown })\n .__WIKIGRAPH_DATA_DIR__;\n if (typeof injected === \"string\" && injected !== \"\") return injected;\n let directory = nodeProcess.cwd();\n while (true) {\n for (const candidate of [\n pathModule.join(directory, \"data\"),\n pathModule.join(directory, \"packages\", \"core\", \"data\"),\n ]) {\n try {\n if (fs.statSync(candidate).isDirectory()) return candidate;\n } catch {\n // Keep looking toward the filesystem root.\n }\n }\n const parent = pathModule.dirname(directory);\n if (parent === directory)\n throw new Error(\"Could not locate data directory\");\n directory = parent;\n }\n}\n\nexport interface NodeWikiGraphStorageOptions {\n readonly documentStoreRoot: string;\n readonly libraryRoot: string;\n}\n\nexport function createNodeWikiGraphStorage(\n stateRootOrOptions: string | NodeWikiGraphStorageOptions = pathModule.join(\n os.homedir(),\n \".wikigraph\",\n ),\n): WikiGraphStorage {\n const libraryRoot =\n typeof stateRootOrOptions === \"string\"\n ? stateRootOrOptions\n : stateRootOrOptions.libraryRoot;\n const documentStoreRoot =\n typeof stateRootOrOptions === \"string\"\n ? pathModule.join(stateRootOrOptions, \"documents\")\n : stateRootOrOptions.documentStoreRoot;\n return {\n library: new NodeDirectory(libraryRoot),\n documentStore: new NodeDirectory(documentStoreRoot),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n try {\n getWikiGraphPlatform();\n } catch {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n }\n try {\n getWikiGraphStorage();\n } catch {\n installWikiGraphStorage(createNodeWikiGraphStorage());\n }\n}\n\nexport async function withNodeWikiGraphStorage<T>(\n stateRoot: string | undefined,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await withWikiGraphStorage(\n stateRoot === undefined ? undefined : createNodeWikiGraphStorage(stateRoot),\n operation,\n );\n}\n"],"mappings":"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","names":["resolve","content"]}
1
+ {"version":3,"sources":["../src/node-platform.ts"],"sourcesContent":["/* eslint-disable no-restricted-syntax, @typescript-eslint/parameter-properties */\nimport * as asyncHooks from \"node:async_hooks\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as fsPromises from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as pathModule from \"node:path\";\nimport * as process from \"node:process\";\nimport { Readable, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport * as sqlite3 from \"sqlite3\";\nimport * as yauzl from \"yauzl\";\nimport * as yazl from \"yazl\";\nimport { Environment, Loader, type LoaderSource } from \"nunjucks\";\n\nconst nodeProcess =\n (process as unknown as { default?: typeof process }).default ?? process;\nconst nodeSqlite3 =\n (sqlite3 as unknown as { default?: typeof sqlite3 }).default ?? sqlite3;\n\nimport {\n getWikiGraphPlatform,\n getWikiGraphStorage,\n installWikiGraphPlatform,\n installWikiGraphStorage,\n withWikiGraphStorage,\n type Directory,\n type File,\n type FileReader,\n type ReadonlyFile,\n type FileWriter,\n type HostDatabaseConnection,\n type HostDatabaseOpenOptions,\n type HostDatabaseRow,\n type HostDatabaseValue,\n type HostLifecycleProvider,\n type HostZipWriteEntry,\n type HostZipReader,\n type WikiGraphPlatform,\n type WikiGraphStorage,\n normalizeTemplateName,\n} from \"wiki-graph-core/platform\";\n\n/** Stable across independently bundled SDK entry points. */\nconst NODE_RESOURCE_KIND = Symbol.for(\"wiki-graph-sdk.node-resource.v1\");\n\n/** Install the Node implementation used by the CLI and its workers. */\nexport class NodeFile implements File {\n public async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises.stat(this.path).catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\n public readonly kind = \"file\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"file\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(\n public readonly path: string,\n name = pathModule.basename(path),\n ) {\n this.identity = encodeNodeResourceIdentity(\"file\", path);\n this.name = name;\n }\n\n public async openReader(): Promise<FileReader> {\n const handle = await fsPromises.open(this.path, \"r\");\n let closed = false;\n try {\n const stats = await handle.stat();\n if (!stats.isFile())\n throw new Error(\"File reader requires a regular file\");\n const { size } = stats;\n return {\n size,\n close: async () => {\n if (!closed) await handle.close();\n closed = true;\n },\n read: async (offset, length) => {\n if (closed) throw new Error(\"Cannot read from a closed FileReader\");\n assertFileRange(offset, length, size);\n const buffer = Buffer.allocUnsafe(length);\n let bytesRead = 0;\n while (bytesRead < length) {\n const result = await handle.read(\n buffer,\n bytesRead,\n length - bytesRead,\n offset + bytesRead,\n );\n if (result.bytesRead === 0) {\n throw new Error(\"File changed while reading its byte range\");\n }\n bytesRead += result.bytesRead;\n }\n return new Uint8Array(buffer.buffer, buffer.byteOffset, bytesRead);\n },\n };\n } catch (error) {\n await handle.close();\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async openWriter(): Promise<FileWriter> {\n await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(temporary, \"wx\");\n let closed = false;\n return {\n write: async (data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n await writeNodeFileHandle(handle, data);\n },\n writeAt: async (offset, data) => {\n if (closed) throw new Error(\"Cannot write to a closed FileWriter\");\n assertFileOffset(offset);\n await writeNodeFileHandle(handle, data, offset);\n },\n commit: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rename(temporary, this.path);\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(temporary, { force: true });\n }\n closed = true;\n },\n };\n }\n}\n\n/** @internal Completes writes even when the Node file handle reports a short write. */\nexport async function writeNodeFileHandle(\n handle: Pick<fsPromises.FileHandle, \"write\">,\n data: Uint8Array | string,\n position?: number,\n): Promise<void> {\n const buffer = Buffer.from(data);\n let written = 0;\n while (written < buffer.byteLength) {\n const result = await handle.write(\n buffer,\n written,\n buffer.byteLength - written,\n position === undefined ? null : position + written,\n );\n if (result.bytesWritten === 0) {\n throw new Error(\"File writer made no progress\");\n }\n written += result.bytesWritten;\n }\n}\n\nfunction assertFileRange(offset: number, length: number, size: number): void {\n assertFileOffset(offset);\n if (!Number.isSafeInteger(length) || length < 0) {\n throw new RangeError(\n \"File read length must be a non-negative safe integer\",\n );\n }\n if (offset > size || length > size - offset) {\n throw new RangeError(\"File read range exceeds the file size\");\n }\n}\n\nfunction assertFileOffset(offset: number): void {\n if (!Number.isSafeInteger(offset) || offset < 0) {\n throw new RangeError(\"File offset must be a non-negative safe integer\");\n }\n}\n\nexport class NodeDirectory implements Directory {\n public async getPhysicalIdentity(): Promise<string | undefined> {\n const value = await fsPromises.stat(this.path).catch((error: unknown) => {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n )\n return undefined;\n throw error;\n });\n if (value === undefined) return undefined;\n return `${value.dev}:${value.ino}`;\n }\n public readonly kind = \"directory\" as const;\n public readonly [NODE_RESOURCE_KIND] = \"directory\" as const;\n public readonly identity: string;\n public readonly name: string;\n\n public constructor(public readonly path: string) {\n this.identity = encodeNodeResourceIdentity(\"directory\", path);\n this.name = pathModule.basename(path);\n }\n\n public async getFile(name: string): Promise<File | undefined> {\n assertChildName(name);\n const file = new NodeFile(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(file.path)).isFile() ? file : undefined;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n }\n\n public async getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(this.path)).mtimeMs;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return undefined;\n }\n throw error;\n }\n }\n\n public async getDirectory(name: string): Promise<Directory | undefined> {\n assertChildName(name);\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n try {\n return (await fsPromises.stat(directory.path)).isDirectory()\n ? directory\n : undefined;\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")\n )\n return undefined;\n throw error;\n }\n }\n\n public async list(): Promise<ReadonlyArray<File | Directory>> {\n const entries = await fsPromises.readdir(this.path, {\n withFileTypes: true,\n });\n return entries.map((entry) =>\n entry.isDirectory()\n ? new NodeDirectory(pathModule.join(this.path, entry.name))\n : new NodeFile(pathModule.join(this.path, entry.name), entry.name),\n );\n }\n\n public async createFile(name: string): Promise<File> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(file.path, \"\", { flag: \"wx\" });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(this.path, { recursive: true });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(directory.path);\n return directory;\n }\n\n public async remove(\n name: string,\n options?: { readonly recursive?: boolean },\n ): Promise<void> {\n assertChildName(name);\n await fsPromises.rm(pathModule.join(this.path, name), {\n force: true,\n recursive: options?.recursive === true,\n });\n }\n}\n\nfunction encodeNodeResourceIdentity(\n kind: \"directory\" | \"file\",\n path: string,\n): string {\n return `node-${kind}:${Buffer.from(pathModule.resolve(path), \"utf8\").toString(\"base64url\")}`;\n}\n\nfunction decodeNodeResourceIdentity(\n identity: string,\n kind: \"directory\" | \"file\",\n): string | undefined {\n const prefix = `node-${kind}:`;\n if (!identity.startsWith(prefix)) {\n // State created before opaque resource identities stored native paths.\n return pathModule.isAbsolute(identity) ? identity : undefined;\n }\n try {\n return Buffer.from(identity.slice(prefix.length), \"base64url\").toString(\n \"utf8\",\n );\n } catch {\n return undefined;\n }\n}\n\nexport function getNodeResourcePath(resource: File | Directory): string {\n const brandedPath = getBrandedNodeResourcePath(resource, resource.kind);\n if (brandedPath !== undefined) return brandedPath;\n if (\n typeof resource === \"object\" &&\n resource !== null &&\n \"path\" in resource &&\n typeof resource.path === \"string\"\n ) {\n return resource.path;\n }\n throw new TypeError(\"Expected a Node File or Directory resource\");\n}\n\nfunction assertChildName(name: string): void {\n if (\n name.length === 0 ||\n name === \".\" ||\n name === \"..\" ||\n pathModule.isAbsolute(name) ||\n name.includes(\"/\") ||\n name.includes(\"\\\\\")\n ) {\n throw new TypeError(`Directory child must be a relative name: ${name}`);\n }\n}\n\nclass NodeDatabaseConnection implements HostDatabaseConnection {\n public constructor(private readonly database: sqlite3.Database) {}\n\n public async close(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async execute(sql: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.exec(sql, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n public async queryAll(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<readonly HostDatabaseRow[]> {\n return await new Promise((resolve, reject) => {\n this.database.all(sql, [...params], (error, rows: HostDatabaseRow[]) => {\n if (error) reject(error);\n else resolve(rows);\n });\n });\n }\n\n public async queryOne(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<HostDatabaseRow | undefined> {\n return await new Promise((resolve, reject) => {\n this.database.get(sql, [...params], (error, row: HostDatabaseRow) => {\n if (error) reject(error);\n else resolve(row);\n });\n });\n }\n\n public async run(\n sql: string,\n params: readonly HostDatabaseValue[] = [],\n ): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n this.database.run(sql, [...params], (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n}\n\nasync function openNodeDatabase(\n file: ReadonlyFile,\n options: HostDatabaseOpenOptions,\n): Promise<NodeDatabaseConnection> {\n const flags =\n (options.mode === \"readonly\"\n ? nodeSqlite3.OPEN_READONLY\n : nodeSqlite3.OPEN_READWRITE |\n (options.create ? nodeSqlite3.OPEN_CREATE : 0)) |\n nodeSqlite3.OPEN_FULLMUTEX;\n return new NodeDatabaseConnection(await openNativeNodeDatabase(file, flags));\n}\n\nasync function openNativeNodeDatabase(\n file: ReadonlyFile,\n flags: number,\n): Promise<sqlite3.Database> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node database adapter requires a NodeFile\");\n }\n return await new Promise((resolve, reject) => {\n const database = new nodeSqlite3.Database(path, flags, (error) => {\n if (error) reject(error);\n else resolve(database);\n });\n });\n}\n\nasync function openNodeZip(\n file: ReadonlyFile,\n options: { readonly entryNameMode?: \"raw\" | \"normalized\" } = {},\n): Promise<HostZipReader> {\n const path = getBrandedNodeResourcePath(file, \"file\");\n if (path === undefined) {\n throw new TypeError(\"The Node ZIP adapter requires a NodeFile\");\n }\n const handle = await fsPromises.open(path, \"r\");\n let size: number;\n try {\n size = (await handle.stat()).size;\n } catch (error) {\n await handle.close();\n throw error;\n }\n const open = () =>\n new Promise<yauzl.ZipFile>((resolve, reject) => {\n yauzl.fromRandomAccessReader(\n new NodeZipSource(handle),\n size,\n { autoClose: false, lazyEntries: true },\n (error, opened) => {\n if (error || opened === undefined)\n reject(error ?? new Error(\"Cannot open ZIP\"));\n else resolve(opened);\n },\n );\n });\n // Validate the ZIP envelope without enumerating its entries. Keep the same\n // file descriptor across lookups, even if the path is replaced meanwhile.\n try {\n (await open()).close();\n } catch (error) {\n await handle.close();\n throw error;\n }\n let closed = false;\n let pending: Promise<unknown> = Promise.resolve();\n let closing: Promise<void> | undefined;\n const run = <T>(\n operation: (zip: yauzl.ZipFile) => Promise<T>,\n ): Promise<T> => {\n if (closed)\n return Promise.reject(new Error(\"Cannot read a closed ZIP archive\"));\n const result = pending.then(async () => {\n const zip = await open();\n try {\n return await operation(zip);\n } finally {\n zip.close();\n }\n });\n pending = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n const withEntry = <T>(\n name: string,\n operation: (\n zip: yauzl.ZipFile,\n entry: yauzl.Entry | undefined,\n ) => Promise<T>,\n ) =>\n run(async (zip) => {\n let exact: yauzl.Entry | undefined;\n let alias: yauzl.Entry | undefined;\n let aliasCollision = false;\n // Retain only matches, not a directory index. Scan through the end so\n // duplicate raw names keep their existing last-entry-wins behavior.\n await scanNodeZip(zip, (entry) => {\n if (entry.fileName === name) exact = entry;\n if (normalizeNodeZipName(entry.fileName) === name) {\n if (alias !== undefined && alias.fileName !== entry.fileName)\n aliasCollision = true;\n alias = entry;\n }\n });\n if (\n (exact === undefined || options.entryNameMode === \"normalized\") &&\n aliasCollision\n ) {\n // The former Map ordered aliases by the first occurrence of each raw\n // name, but used its last duplicate's contents. Resolve this uncommon\n // ambiguity with rescans instead of retaining a set of all raw names.\n let bestPosition = -1;\n const candidates = await open();\n try {\n await scanNodeZip(candidates, async (entry) => {\n if (normalizeNodeZipName(entry.fileName) !== name) return;\n const probe = await open();\n let position = 0;\n try {\n await scanNodeZip(probe, (candidate) => {\n if (candidate.fileName === entry.fileName) return false;\n position++;\n });\n } finally {\n probe.close();\n }\n if (position >= bestPosition) {\n bestPosition = position;\n alias = entry;\n }\n });\n return await operation(candidates, alias);\n } finally {\n candidates.close();\n }\n }\n return await operation(\n zip,\n options.entryNameMode === \"normalized\" ? alias : (exact ?? alias),\n );\n });\n return {\n close: () => {\n closed = true;\n closing ??= pending.then(() => handle.close());\n return closing;\n },\n copyEntry: (name, target) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return false;\n await copyNodeZipEntry(zip, entry, target);\n return true;\n }),\n getEntrySize: (name) =>\n withEntry(name, (_zip, entry) =>\n Promise.resolve(entry?.uncompressedSize),\n ),\n listEntries: () =>\n run(async (zip) => {\n const names = new Set<string>();\n await scanNodeZip(zip, (entry) => {\n names.add(entry.fileName);\n });\n return [...names];\n }),\n readEntryRange: (name, offset, length) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntryRange(zip, entry, offset, length);\n }),\n readEntry: (name) =>\n withEntry(name, async (zip, entry) => {\n if (entry === undefined) return undefined;\n return await readNodeZipEntry(zip, entry);\n }),\n };\n}\n\n/** yauzl owns ZIP parsing; this source only provides positioned file reads. */\nclass NodeZipSource extends yauzl.RandomAccessReader {\n public constructor(private readonly handle: fsPromises.FileHandle) {\n super();\n }\n public override read(\n buffer: Buffer,\n offset: number,\n length: number,\n position: number,\n callback: (error: Error | null) => void,\n ): void {\n // Central-directory reads are small. Avoid creating a stream pipeline for\n // each header; yauzl still owns parsing and requests the exact byte range.\n const read = (written: number): void => {\n if (written === length) {\n callback(null);\n return;\n }\n fs.read(\n this.handle.fd,\n buffer,\n offset + written,\n length - written,\n position + written,\n (error, bytesRead) => {\n if (error) callback(error);\n else if (bytesRead === 0)\n callback(new Error(\"Unexpected end of ZIP file\"));\n else read(written + bytesRead);\n },\n );\n };\n read(0);\n }\n public override _readStreamForRange(start: number, end: number): Readable {\n const handle = this.handle;\n return Readable.from(\n (async function* () {\n for (let position = start; position < end; ) {\n const buffer = Buffer.allocUnsafe(\n Math.min(64 * 1024, end - position),\n );\n const { bytesRead } = await handle.read(\n buffer,\n 0,\n buffer.length,\n position,\n );\n if (bytesRead === 0) return;\n position += bytesRead;\n yield buffer.subarray(0, bytesRead);\n }\n })(),\n );\n }\n}\n\nfunction normalizeNodeZipName(name: string): string | undefined {\n const normalized = name\n .replaceAll(\"\\\\\", \"/\")\n .trim()\n .split(\"/\")\n .filter((part) => part !== \"\" && part !== \".\")\n .join(\"/\");\n return normalized.split(\"/\").includes(\"..\") ? undefined : normalized;\n}\n\nasync function scanNodeZip(\n zip: yauzl.ZipFile,\n visit: (entry: yauzl.Entry) => void | boolean | Promise<void | boolean>,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n zip.off(\"entry\", onEntry);\n zip.off(\"end\", onEnd);\n zip.off(\"error\", onError);\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onEnd = () => {\n cleanup();\n resolve();\n };\n const onEntry = (entry: yauzl.Entry) => {\n void Promise.resolve()\n .then(() => (entry.fileName.endsWith(\"/\") ? undefined : visit(entry)))\n .then((keepReading) => {\n if (keepReading === false) onEnd();\n else zip.readEntry();\n })\n .catch((error: unknown) =>\n onError(\n error instanceof Error\n ? error\n : new Error(\"Cannot scan ZIP\", { cause: error }),\n ),\n );\n };\n zip.on(\"entry\", onEntry);\n zip.once(\"end\", onEnd);\n zip.once(\"error\", onError);\n zip.readEntry();\n });\n}\n\nasync function copyNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n target: File,\n): Promise<void> {\n const writer = await target.openWriter();\n try {\n const stream = await openNodeZipEntryStream(zipFile, entry);\n await writeNodeStream(stream, writer);\n await writer.commit();\n } catch (error) {\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function readNodeZipEntry(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n): Promise<Uint8Array> {\n return await collectNodeStream(await openNodeZipEntryStream(zipFile, entry));\n}\n\nasync function readNodeZipEntryRange(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n offset: number,\n length: number,\n): Promise<Uint8Array> {\n assertFileRange(offset, length, entry.uncompressedSize);\n if (length === 0) return new Uint8Array();\n if (entry.compressionMethod !== 0) {\n const content = await collectDecodedNodeStreamRange(\n await openNodeZipEntryStream(zipFile, entry),\n offset,\n length,\n );\n return new Uint8Array(\n content.buffer,\n content.byteOffset,\n content.byteLength,\n );\n }\n const content = await collectNodeStream(\n await openNodeZipEntryStream(zipFile, entry, {\n decompress: null,\n decrypt: null,\n end: offset + length,\n start: offset,\n }),\n );\n return new Uint8Array(content.buffer, content.byteOffset, content.byteLength);\n}\n\nasync function collectDecodedNodeStreamRange(\n input: NodeJS.ReadableStream,\n offset: number,\n length: number,\n): Promise<Buffer> {\n const chunks: Buffer[] = [];\n const end = offset + length;\n let position = 0;\n let collected = 0;\n for await (const value of input) {\n const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);\n const chunkEnd = position + chunk.byteLength;\n if (chunkEnd > offset && position < end) {\n const selected = chunk.subarray(\n Math.max(0, offset - position),\n Math.min(chunk.byteLength, end - position),\n );\n chunks.push(selected);\n collected += selected.byteLength;\n }\n position = chunkEnd;\n if (position >= end) break;\n }\n if (collected !== length) {\n throw new Error(\"ZIP entry changed while reading its byte range\");\n }\n return Buffer.concat(chunks, collected);\n}\n\nasync function openNodeZipEntryStream(\n zipFile: yauzl.ZipFile,\n entry: yauzl.Entry,\n options?: yauzl.ZipFileOptions,\n): Promise<NodeJS.ReadableStream> {\n return await new Promise<NodeJS.ReadableStream>((resolve, reject) => {\n const callback = (error: Error | null, opened: Readable) => {\n if (error || opened === undefined) {\n reject(error ?? new Error(`Cannot read ZIP entry: ${entry.fileName}`));\n } else {\n resolve(opened);\n }\n };\n if (options === undefined) zipFile.openReadStream(entry, callback);\n else zipFile.openReadStream(entry, options, callback);\n });\n}\n\nasync function writeNodeZip(\n file: File,\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Promise<void> {\n const zipFile = new yazl.ZipFile();\n const writer = await file.openWriter();\n const outputStream = zipFile.outputStream as Readable;\n const outputDone = writeNodeStream(outputStream, writer);\n const entryState = { cancelled: false, complete: false };\n let iterator:\n | Iterator<HostZipWriteEntry>\n | AsyncIterator<HostZipWriteEntry>\n | undefined;\n\n try {\n iterator = getNodeZipEntryIterator(entries);\n const entriesDone = addNodeZipEntries(zipFile, iterator, entryState);\n await Promise.race([entriesDone, outputDone]);\n if (!entryState.complete) {\n throw new Error(\"ZIP output ended before entry production completed\");\n }\n zipFile.end();\n await outputDone;\n await writer.commit();\n } catch (error) {\n entryState.cancelled = true;\n if (!entryState.complete && iterator !== undefined) {\n closeNodeZipEntryIterator(iterator);\n }\n if (!outputStream.destroyed) {\n outputStream.destroy(\n error instanceof Error ? error : new Error(\"Cannot write ZIP archive\"),\n );\n }\n await outputDone.catch(() => undefined);\n await writer.abort().catch(() => undefined);\n throw error;\n }\n}\n\nasync function addNodeZipEntries(\n zipFile: yazl.ZipFile,\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n state: { cancelled: boolean; complete: boolean },\n): Promise<void> {\n while (!state.cancelled) {\n const result = await iterator.next();\n if (state.cancelled) return;\n if (result.done) {\n state.complete = true;\n return;\n }\n if (\"file\" in result.value) {\n zipFile.addReadStream(\n createNodeFileReadStream(result.value.file),\n result.value.name,\n { compress: false },\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n compress: false,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { compress: false, size: result.value.size },\n );\n }\n }\n}\n\nfunction createNodeFileReadStream(file: ReadonlyFile): Readable {\n return Readable.from(\n (async function* () {\n const reader = await file.openReader();\n try {\n for (let offset = 0; offset < reader.size; ) {\n const chunk = await reader.read(\n offset,\n Math.min(64 * 1024, reader.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n } finally {\n await reader.close();\n }\n })(),\n );\n}\n\nfunction getBrandedNodeResourcePath(\n resource: unknown,\n kind: \"directory\" | \"file\",\n): string | undefined {\n if (typeof resource !== \"object\" || resource === null) return undefined;\n const candidate = resource as {\n readonly [NODE_RESOURCE_KIND]?: unknown;\n readonly path?: unknown;\n };\n return candidate[NODE_RESOURCE_KIND] === kind &&\n typeof candidate.path === \"string\"\n ? candidate.path\n : undefined;\n}\n\nfunction createNodeRangeReadStream(\n entry: Extract<HostZipWriteEntry, { readonly size: number }>,\n): Readable {\n return Readable.from(\n (async function* () {\n for (let offset = 0; offset < entry.size; ) {\n const chunk = await entry.read(\n offset,\n Math.min(64 * 1024, entry.size - offset),\n );\n offset += chunk.byteLength;\n yield chunk;\n }\n })(),\n );\n}\n\nfunction getNodeZipEntryIterator(\n entries: Iterable<HostZipWriteEntry> | AsyncIterable<HostZipWriteEntry>,\n): Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry> {\n const asyncIterator = (entries as AsyncIterable<HostZipWriteEntry>)[\n Symbol.asyncIterator\n ];\n return asyncIterator === undefined\n ? (entries as Iterable<HostZipWriteEntry>)[Symbol.iterator]()\n : asyncIterator.call(entries);\n}\n\nfunction closeNodeZipEntryIterator(\n iterator: Iterator<HostZipWriteEntry> | AsyncIterator<HostZipWriteEntry>,\n): void {\n if (iterator.return === undefined) return;\n try {\n void Promise.resolve(iterator.return()).catch(() => undefined);\n } catch {\n // Preserve the failure that caused iteration to stop.\n }\n}\n\nasync function writeNodeStream(\n input: NodeJS.ReadableStream,\n writer: FileWriter,\n): Promise<void> {\n await pipeline(\n input,\n new Writable({\n write: (chunk: Buffer, _encoding, callback) => {\n void writer.write(chunk).then(\n () => callback(),\n (error: unknown) =>\n callback(\n error instanceof Error\n ? error\n : new Error(\"Cannot stream ZIP archive\"),\n ),\n );\n },\n }),\n );\n}\n\nasync function collectNodeStream(\n input: NodeJS.ReadableStream,\n): Promise<Buffer> {\n return await new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n input.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n input.once(\"error\", reject);\n input.once(\"end\", () => resolve(Buffer.concat(chunks)));\n });\n}\n\nexport const nodeWikiGraphPlatform: WikiGraphPlatform = {\n asyncContext: {\n create: <T>() => new asyncHooks.AsyncLocalStorage<T>(),\n },\n database: { open: openNodeDatabase },\n lifecycle: {\n instanceId: `node-process:${nodeProcess.pid}`,\n isInstanceAlive: (instanceId) => {\n const match = /^node-process:(\\d+)$/u.exec(instanceId);\n if (match === null) return Promise.resolve(undefined);\n try {\n nodeProcess.kill(Number(match[1]), 0);\n return Promise.resolve(true);\n } catch (error) {\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ESRCH\"\n ) {\n return Promise.resolve(false);\n }\n return Promise.resolve(true);\n }\n },\n },\n resources: {\n getDirectory: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n getFile: (identity) => {\n const path = decodeNodeResourceIdentity(identity, \"file\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeFile(path),\n );\n },\n resolveLegacyDirectory: (reference) => {\n const path = decodeNodeResourceIdentity(reference, \"directory\");\n return Promise.resolve(\n path === undefined ? undefined : new NodeDirectory(path),\n );\n },\n },\n templates: {\n createEnvironment: (options) =>\n new Environment(new NodeTemplateLoader(), options),\n },\n zip: {\n open: openNodeZip,\n write: writeNodeZip,\n },\n};\n\nexport interface NodeWikiGraphPlatformOptions {\n readonly lifecycle?: HostLifecycleProvider;\n}\n\n/** Create the Node platform with an optional host-owned lifecycle identity. */\nexport function createNodeWikiGraphPlatform(\n options: NodeWikiGraphPlatformOptions = {},\n): WikiGraphPlatform {\n return options.lifecycle === undefined\n ? nodeWikiGraphPlatform\n : { ...nodeWikiGraphPlatform, lifecycle: options.lifecycle };\n}\n\nclass NodeTemplateLoader extends Loader {\n readonly #dataDirectory: string | undefined;\n\n public constructor(dataDirectory?: string) {\n super();\n this.#dataDirectory = dataDirectory;\n }\n\n public getSource(templateName: string): LoaderSource {\n const name = normalizeTemplateName(templateName);\n const filePath = pathModule.join(\n this.#dataDirectory ?? resolveNodeDataDirectory(),\n name,\n );\n return {\n noCache: false,\n path: name,\n src: fs.readFileSync(filePath, \"utf8\"),\n };\n }\n}\n\nexport function createNodeTemplateEnvironment(\n dataDirectory: string,\n options: {\n readonly autoescape?: boolean;\n readonly trimBlocks?: boolean;\n } = {},\n): Environment {\n return new Environment(new NodeTemplateLoader(dataDirectory), {\n autoescape: options.autoescape ?? true,\n trimBlocks: options.trimBlocks ?? true,\n });\n}\n\nfunction resolveNodeDataDirectory(): string {\n const injected = (globalThis as { __WIKIGRAPH_DATA_DIR__?: unknown })\n .__WIKIGRAPH_DATA_DIR__;\n if (typeof injected === \"string\" && injected !== \"\") return injected;\n let directory = nodeProcess.cwd();\n while (true) {\n for (const candidate of [\n pathModule.join(directory, \"data\"),\n pathModule.join(directory, \"packages\", \"core\", \"data\"),\n ]) {\n try {\n if (fs.statSync(candidate).isDirectory()) return candidate;\n } catch {\n // Keep looking toward the filesystem root.\n }\n }\n const parent = pathModule.dirname(directory);\n if (parent === directory)\n throw new Error(\"Could not locate data directory\");\n directory = parent;\n }\n}\n\nexport interface NodeWikiGraphStorageOptions {\n readonly documentStoreRoot: string;\n readonly libraryRoot: string;\n}\n\nexport function createNodeWikiGraphStorage(\n stateRootOrOptions: string | NodeWikiGraphStorageOptions = pathModule.join(\n os.homedir(),\n \".wikigraph\",\n ),\n): WikiGraphStorage {\n const libraryRoot =\n typeof stateRootOrOptions === \"string\"\n ? stateRootOrOptions\n : stateRootOrOptions.libraryRoot;\n const documentStoreRoot =\n typeof stateRootOrOptions === \"string\"\n ? pathModule.join(stateRootOrOptions, \"documents\")\n : stateRootOrOptions.documentStoreRoot;\n return {\n library: new NodeDirectory(libraryRoot),\n documentStore: new NodeDirectory(documentStoreRoot),\n };\n}\n\nexport function installNodeWikiGraphPlatform(stateRoot?: string): void {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n installWikiGraphStorage(createNodeWikiGraphStorage(stateRoot));\n}\n\nexport function ensureNodeWikiGraphPlatform(): void {\n try {\n getWikiGraphPlatform();\n } catch {\n installWikiGraphPlatform(nodeWikiGraphPlatform);\n }\n try {\n getWikiGraphStorage();\n } catch {\n installWikiGraphStorage(createNodeWikiGraphStorage());\n }\n}\n\nexport async function withNodeWikiGraphStorage<T>(\n stateRoot: string | undefined,\n operation: () => Promise<T> | T,\n): Promise<T> {\n return await withWikiGraphStorage(\n stateRoot === undefined ? undefined : createNodeWikiGraphStorage(stateRoot),\n operation,\n );\n}\n"],"mappings":"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","names":["resolve","open","read","content"]}
@@ -7,6 +7,7 @@ declare const NODE_RESOURCE_KIND: unique symbol;
7
7
  /** Install the Node implementation used by the CLI and its workers. */
8
8
  declare class NodeFile implements File {
9
9
  readonly path: string;
10
+ getPhysicalIdentity(): Promise<string | undefined>;
10
11
  readonly kind: "file";
11
12
  readonly [NODE_RESOURCE_KIND]: "file";
12
13
  readonly identity: string;
@@ -20,6 +21,7 @@ declare class NodeFile implements File {
20
21
  declare function writeNodeFileHandle(handle: Pick<fsPromises.FileHandle, "write">, data: Uint8Array | string, position?: number): Promise<void>;
21
22
  declare class NodeDirectory implements Directory {
22
23
  readonly path: string;
24
+ getPhysicalIdentity(): Promise<string | undefined>;
23
25
  readonly kind: "directory";
24
26
  readonly [NODE_RESOURCE_KIND]: "directory";
25
27
  readonly identity: string;