wiki-graph-sdk 0.9.3 → 0.9.5

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 (52) hide show
  1. package/dist/archives.cjs +241 -29
  2. package/dist/archives.cjs.map +1 -1
  3. package/dist/archives.d.ts +1 -1
  4. package/dist/archives.js +245 -29
  5. package/dist/archives.js.map +1 -1
  6. package/dist/conversions.cjs +64 -28
  7. package/dist/conversions.cjs.map +1 -1
  8. package/dist/conversions.js +64 -28
  9. package/dist/conversions.js.map +1 -1
  10. package/dist/default-worker.cjs +64 -28
  11. package/dist/default-worker.cjs.map +1 -1
  12. package/dist/default-worker.js +64 -28
  13. package/dist/default-worker.js.map +1 -1
  14. package/dist/embedding.cjs +64 -28
  15. package/dist/embedding.cjs.map +1 -1
  16. package/dist/embedding.js +64 -28
  17. package/dist/embedding.js.map +1 -1
  18. package/dist/gc.cjs +64 -28
  19. package/dist/gc.cjs.map +1 -1
  20. package/dist/gc.js +64 -28
  21. package/dist/gc.js.map +1 -1
  22. package/dist/{index-DQzLAnjf.d.ts → index-4YX4dv6Y.d.ts} +38 -2
  23. package/dist/index.cjs +244 -32
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +3 -3
  26. package/dist/index.js +248 -32
  27. package/dist/index.js.map +1 -1
  28. package/dist/local-config.cjs +64 -28
  29. package/dist/local-config.cjs.map +1 -1
  30. package/dist/local-config.js +64 -28
  31. package/dist/local-config.js.map +1 -1
  32. package/dist/maintenance.cjs +64 -28
  33. package/dist/maintenance.cjs.map +1 -1
  34. package/dist/maintenance.js +64 -28
  35. package/dist/maintenance.js.map +1 -1
  36. package/dist/node-platform.cjs +64 -28
  37. package/dist/node-platform.cjs.map +1 -1
  38. package/dist/node-platform.js +64 -28
  39. package/dist/node-platform.js.map +1 -1
  40. package/dist/runtime-config.cjs +64 -28
  41. package/dist/runtime-config.cjs.map +1 -1
  42. package/dist/runtime-config.js +64 -28
  43. package/dist/runtime-config.js.map +1 -1
  44. package/dist/stage.cjs +64 -28
  45. package/dist/stage.cjs.map +1 -1
  46. package/dist/stage.js +64 -28
  47. package/dist/stage.js.map +1 -1
  48. package/dist/worker.cjs +64 -28
  49. package/dist/worker.cjs.map +1 -1
  50. package/dist/worker.js +64 -28
  51. package/dist/worker.js.map +1 -1
  52. package/package.json +2 -2
@@ -35,7 +35,7 @@ var NodeFile = class {
35
35
  }
36
36
  path;
37
37
  async getPhysicalIdentity() {
38
- const value = await fsPromises.stat(this.path).catch((error) => {
38
+ const value = await fsPromises.stat(toNodeFilesystemPath(this.path)).catch((error) => {
39
39
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
40
40
  return void 0;
41
41
  throw error;
@@ -48,7 +48,7 @@ var NodeFile = class {
48
48
  identity;
49
49
  name;
50
50
  async openReader() {
51
- const handle = await fsPromises.open(this.path, "r");
51
+ const handle = await fsPromises.open(toNodeFilesystemPath(this.path), "r");
52
52
  let closed = false;
53
53
  try {
54
54
  const stats = await handle.stat();
@@ -88,7 +88,7 @@ var NodeFile = class {
88
88
  }
89
89
  async getLastModified() {
90
90
  try {
91
- return (await fsPromises.stat(this.path)).mtimeMs;
91
+ return (await fsPromises.stat(toNodeFilesystemPath(this.path))).mtimeMs;
92
92
  } catch (error) {
93
93
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
94
94
  return void 0;
@@ -97,9 +97,14 @@ var NodeFile = class {
97
97
  }
98
98
  }
99
99
  async openWriter() {
100
- await fsPromises.mkdir(pathModule.dirname(this.path), { recursive: true });
100
+ await fsPromises.mkdir(
101
+ toNodeFilesystemPath(pathModule.dirname(this.path)),
102
+ {
103
+ recursive: true
104
+ }
105
+ );
101
106
  const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;
102
- const handle = await fsPromises.open(temporary, "wx");
107
+ const handle = await fsPromises.open(toNodeFilesystemPath(temporary), "wx");
103
108
  let closed = false;
104
109
  return {
105
110
  write: async (data) => {
@@ -114,14 +119,17 @@ var NodeFile = class {
114
119
  commit: async () => {
115
120
  if (!closed) {
116
121
  await handle.close();
117
- await fsPromises.rename(temporary, this.path);
122
+ await fsPromises.rename(
123
+ toNodeFilesystemPath(temporary),
124
+ toNodeFilesystemPath(this.path)
125
+ );
118
126
  }
119
127
  closed = true;
120
128
  },
121
129
  abort: async () => {
122
130
  if (!closed) {
123
131
  await handle.close();
124
- await fsPromises.rm(temporary, { force: true });
132
+ await fsPromises.rm(toNodeFilesystemPath(temporary), { force: true });
125
133
  }
126
134
  closed = true;
127
135
  }
@@ -168,7 +176,7 @@ var NodeDirectory = class _NodeDirectory {
168
176
  }
169
177
  path;
170
178
  async getPhysicalIdentity() {
171
- const value = await fsPromises.stat(this.path).catch((error) => {
179
+ const value = await fsPromises.stat(toNodeFilesystemPath(this.path)).catch((error) => {
172
180
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
173
181
  return void 0;
174
182
  throw error;
@@ -184,7 +192,7 @@ var NodeDirectory = class _NodeDirectory {
184
192
  assertChildName(name);
185
193
  const file = new NodeFile(pathModule.join(this.path, name));
186
194
  try {
187
- return (await fsPromises.stat(file.path)).isFile() ? file : void 0;
195
+ return (await fsPromises.stat(toNodeFilesystemPath(file.path))).isFile() ? file : void 0;
188
196
  } catch (error) {
189
197
  if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR"))
190
198
  return void 0;
@@ -193,7 +201,7 @@ var NodeDirectory = class _NodeDirectory {
193
201
  }
194
202
  async getLastModified() {
195
203
  try {
196
- return (await fsPromises.stat(this.path)).mtimeMs;
204
+ return (await fsPromises.stat(toNodeFilesystemPath(this.path))).mtimeMs;
197
205
  } catch (error) {
198
206
  if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT") {
199
207
  return void 0;
@@ -205,7 +213,7 @@ var NodeDirectory = class _NodeDirectory {
205
213
  assertChildName(name);
206
214
  const directory = new _NodeDirectory(pathModule.join(this.path, name));
207
215
  try {
208
- return (await fsPromises.stat(directory.path)).isDirectory() ? directory : void 0;
216
+ return (await fsPromises.stat(toNodeFilesystemPath(directory.path))).isDirectory() ? directory : void 0;
209
217
  } catch (error) {
210
218
  if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR"))
211
219
  return void 0;
@@ -213,7 +221,7 @@ var NodeDirectory = class _NodeDirectory {
213
221
  }
214
222
  }
215
223
  async list() {
216
- const entries = await fsPromises.readdir(this.path, {
224
+ const entries = await fsPromises.readdir(toNodeFilesystemPath(this.path), {
217
225
  withFileTypes: true
218
226
  });
219
227
  return entries.map(
@@ -222,26 +230,45 @@ var NodeDirectory = class _NodeDirectory {
222
230
  }
223
231
  async createFile(name) {
224
232
  assertChildName(name);
225
- await fsPromises.mkdir(this.path, { recursive: true });
233
+ await fsPromises.mkdir(toNodeFilesystemPath(this.path), {
234
+ recursive: true
235
+ });
226
236
  const file = new NodeFile(pathModule.join(this.path, name));
227
- await fsPromises.writeFile(file.path, "", { flag: "wx" });
237
+ await fsPromises.writeFile(toNodeFilesystemPath(file.path), "", {
238
+ flag: "wx"
239
+ });
228
240
  return file;
229
241
  }
230
242
  async createDirectory(name) {
231
243
  assertChildName(name);
232
- await fsPromises.mkdir(this.path, { recursive: true });
244
+ await fsPromises.mkdir(toNodeFilesystemPath(this.path), {
245
+ recursive: true
246
+ });
233
247
  const directory = new _NodeDirectory(pathModule.join(this.path, name));
234
- await fsPromises.mkdir(directory.path);
248
+ await fsPromises.mkdir(toNodeFilesystemPath(directory.path));
235
249
  return directory;
236
250
  }
237
251
  async remove(name, options) {
238
252
  assertChildName(name);
239
- await fsPromises.rm(pathModule.join(this.path, name), {
240
- force: true,
241
- recursive: options?.recursive === true
242
- });
253
+ await fsPromises.rm(
254
+ toNodeFilesystemPath(pathModule.join(this.path, name)),
255
+ {
256
+ force: true,
257
+ recursive: options?.recursive === true
258
+ }
259
+ );
243
260
  }
244
261
  };
262
+ function toNodeFilesystemPath(path) {
263
+ if (nodeProcess.platform !== "win32" || path.startsWith("\\\\?\\")) {
264
+ return path;
265
+ }
266
+ const absolute = pathModule.resolve(path);
267
+ if (absolute.startsWith("\\\\")) {
268
+ return `\\\\?\\UNC\\${absolute.slice(2)}`;
269
+ }
270
+ return `\\\\?\\${absolute}`;
271
+ }
245
272
  function encodeNodeResourceIdentity(kind, path) {
246
273
  return `node-${kind}:${Buffer.from(pathModule.resolve(path), "utf8").toString("base64url")}`;
247
274
  }
@@ -327,10 +354,14 @@ async function openNativeNodeDatabase(file, flags) {
327
354
  throw new TypeError("The Node database adapter requires a NodeFile");
328
355
  }
329
356
  return await new Promise((resolve2, reject) => {
330
- const database = new nodeSqlite3.Database(path, flags, (error) => {
331
- if (error) reject(error);
332
- else resolve2(database);
333
- });
357
+ const database = new nodeSqlite3.Database(
358
+ toNodeFilesystemPath(path),
359
+ flags,
360
+ (error) => {
361
+ if (error) reject(error);
362
+ else resolve2(database);
363
+ }
364
+ );
334
365
  });
335
366
  }
336
367
  async function openNodeZip(file, options = {}) {
@@ -338,7 +369,7 @@ async function openNodeZip(file, options = {}) {
338
369
  if (path === void 0) {
339
370
  throw new TypeError("The Node ZIP adapter requires a NodeFile");
340
371
  }
341
- const handle = await fsPromises.open(path, "r");
372
+ const handle = await fsPromises.open(toNodeFilesystemPath(path), "r");
342
373
  let size;
343
374
  try {
344
375
  size = (await handle.stat()).size;
@@ -653,6 +684,11 @@ async function writeNodeZip(file, entries) {
653
684
  }
654
685
  }
655
686
  async function addNodeZipEntries(zipFile, iterator, state) {
687
+ const stableZipOptions = {
688
+ compress: false,
689
+ forceDosTimestamp: true,
690
+ mtime: new Date(1980, 0, 2)
691
+ };
656
692
  while (!state.cancelled) {
657
693
  const result = await iterator.next();
658
694
  if (state.cancelled) return;
@@ -664,17 +700,17 @@ async function addNodeZipEntries(zipFile, iterator, state) {
664
700
  zipFile.addReadStream(
665
701
  createNodeFileReadStream(result.value.file),
666
702
  result.value.name,
667
- { compress: false }
703
+ stableZipOptions
668
704
  );
669
705
  } else if ("data" in result.value) {
670
706
  zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {
671
- compress: false
707
+ ...stableZipOptions
672
708
  });
673
709
  } else {
674
710
  zipFile.addReadStream(
675
711
  createNodeRangeReadStream(result.value),
676
712
  result.value.name,
677
- { compress: false, size: result.value.size }
713
+ { ...stableZipOptions, size: result.value.size }
678
714
  );
679
715
  }
680
716
  }
@@ -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 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"]}
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\n .stat(toNodeFilesystemPath(this.path))\n .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(toNodeFilesystemPath(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(toNodeFilesystemPath(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(\n toNodeFilesystemPath(pathModule.dirname(this.path)),\n {\n recursive: true,\n },\n );\n const temporary = `${this.path}.tmp-${crypto.randomUUID()}`;\n const handle = await fsPromises.open(toNodeFilesystemPath(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(\n toNodeFilesystemPath(temporary),\n toNodeFilesystemPath(this.path),\n );\n }\n closed = true;\n },\n abort: async () => {\n if (!closed) {\n await handle.close();\n await fsPromises.rm(toNodeFilesystemPath(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\n .stat(toNodeFilesystemPath(this.path))\n .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(toNodeFilesystemPath(file.path))).isFile()\n ? file\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 getLastModified(): Promise<number | undefined> {\n try {\n return (await fsPromises.stat(toNodeFilesystemPath(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 (\n await fsPromises.stat(toNodeFilesystemPath(directory.path))\n ).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(toNodeFilesystemPath(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(toNodeFilesystemPath(this.path), {\n recursive: true,\n });\n const file = new NodeFile(pathModule.join(this.path, name));\n await fsPromises.writeFile(toNodeFilesystemPath(file.path), \"\", {\n flag: \"wx\",\n });\n return file;\n }\n\n public async createDirectory(name: string): Promise<Directory> {\n assertChildName(name);\n await fsPromises.mkdir(toNodeFilesystemPath(this.path), {\n recursive: true,\n });\n const directory = new NodeDirectory(pathModule.join(this.path, name));\n await fsPromises.mkdir(toNodeFilesystemPath(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(\n toNodeFilesystemPath(pathModule.join(this.path, name)),\n {\n force: true,\n recursive: options?.recursive === true,\n },\n );\n }\n}\n\nfunction toNodeFilesystemPath(path: string): string {\n if (nodeProcess.platform !== \"win32\" || path.startsWith(\"\\\\\\\\?\\\\\")) {\n return path;\n }\n const absolute = pathModule.resolve(path);\n if (absolute.startsWith(\"\\\\\\\\\")) {\n return `\\\\\\\\?\\\\UNC\\\\${absolute.slice(2)}`;\n }\n return `\\\\\\\\?\\\\${absolute}`;\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(\n toNodeFilesystemPath(path),\n flags,\n (error) => {\n if (error) reject(error);\n else resolve(database);\n },\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(toNodeFilesystemPath(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 const stableZipOptions = {\n compress: false,\n forceDosTimestamp: true,\n mtime: new Date(1980, 0, 2),\n } as const;\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 stableZipOptions,\n );\n } else if (\"data\" in result.value) {\n zipFile.addBuffer(Buffer.from(result.value.data), result.value.name, {\n ...stableZipOptions,\n });\n } else {\n zipFile.addReadStream(\n createNodeRangeReadStream(result.value),\n result.value.name,\n { ...stableZipOptions, 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"]}