@kreuzberg/wasm 4.5.2 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -22,7 +22,7 @@
22
22
  <img src="https://img.shields.io/maven-central/v/dev.kreuzberg/kreuzberg?label=Java&color=007ec6" alt="Java">
23
23
  </a>
24
24
  <a href="https://github.com/kreuzberg-dev/kreuzberg/releases">
25
- <img src="https://img.shields.io/github/v/tag/kreuzberg-dev/kreuzberg?label=Go&color=007ec6&filter=v4.5.2" alt="Go">
25
+ <img src="https://img.shields.io/github/v/tag/kreuzberg-dev/kreuzberg?label=Go&color=007ec6&filter=v4.6.0" alt="Go">
26
26
  </a>
27
27
  <a href="https://www.nuget.org/packages/Kreuzberg/">
28
28
  <img src="https://img.shields.io/nuget/v/Kreuzberg?label=C%23&color=007ec6" alt="C#">
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
 
63
63
 
64
- Extract text, tables, images, and metadata from 88+ file formats including PDF, Office documents, and images. WebAssembly bindings for browsers, Deno, and Cloudflare Workers with portable deployment and multi-threading support.
64
+ Extract text, tables, images, and metadata from 91+ file formats including PDF, Office documents, and images. WebAssembly bindings for browsers, Deno, and Cloudflare Workers with portable deployment and multi-threading support.
65
65
 
66
66
 
67
67
  ## Installation
@@ -271,9 +271,9 @@ extractDocuments(fileBytes, mimes)
271
271
 
272
272
  ## Features
273
273
 
274
- ### Supported File Formats (88+)
274
+ ### Supported File Formats (91+)
275
275
 
276
- 88+ file formats across 8 major categories with intelligent format detection and comprehensive metadata extraction.
276
+ 91+ file formats across 8 major categories with intelligent format detection and comprehensive metadata extraction.
277
277
 
278
278
  #### Office Documents
279
279
 
@@ -510,7 +510,7 @@ WASM runs in single-threaded environments without access to ONNX Runtime, which
510
510
  - **Language Detection** – Identify document language
511
511
  - **Image Extraction** – Embedded images from documents
512
512
 
513
- All 88+ file formats supported by Kreuzberg are available in WASM, with the exception that features requiring ONNX Runtime (layout detection) will fail gracefully with an unsupported error.
513
+ All 91+ file formats supported by Kreuzberg are available in WASM, with the exception that features requiring ONNX Runtime (layout detection) will fail gracefully with an unsupported error.
514
514
 
515
515
  ## Documentation
516
516
 
package/dist/index.js CHANGED
@@ -550,29 +550,42 @@ function setInitializationPromise(promise) {
550
550
 
551
551
  // typescript/initialization/wasm-loader.ts
552
552
  async function loadWasmBinaryForNode() {
553
- if (!isNode()) {
554
- return void 0;
553
+ if (isNode()) {
554
+ try {
555
+ const fs = await import(
556
+ /* @vite-ignore */
557
+ "fs/promises"
558
+ );
559
+ const path = await import(
560
+ /* @vite-ignore */
561
+ "path"
562
+ );
563
+ const url = await import(
564
+ /* @vite-ignore */
565
+ "url"
566
+ );
567
+ const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
568
+ const wasmPath = path.join(__dirname, "..", "pkg", "kreuzberg_wasm_bg.wasm");
569
+ const wasmBuffer = await fs.readFile(wasmPath);
570
+ return new Uint8Array(wasmBuffer);
571
+ } catch {
572
+ return void 0;
573
+ }
555
574
  }
556
- try {
557
- const fs = await import(
558
- /* @vite-ignore */
559
- "fs/promises"
560
- );
561
- const path = await import(
562
- /* @vite-ignore */
563
- "path"
564
- );
565
- const url = await import(
566
- /* @vite-ignore */
567
- "url"
568
- );
569
- const __dirname = path.dirname(url.fileURLToPath(import.meta.url));
570
- const wasmPath = path.join(__dirname, "..", "pkg", "kreuzberg_wasm_bg.wasm");
571
- const wasmBuffer = await fs.readFile(wasmPath);
572
- return new Uint8Array(wasmBuffer);
573
- } catch {
574
- return void 0;
575
+ if (isDeno()) {
576
+ try {
577
+ const denoGlobal = globalThis;
578
+ const DenoNs = denoGlobal.Deno;
579
+ const readFile = DenoNs.readFile;
580
+ const moduleUrl = new URL(import.meta.url);
581
+ const wasmUrl = new URL("../pkg/kreuzberg_wasm_bg.wasm", moduleUrl);
582
+ const wasmBuffer = await readFile(wasmUrl);
583
+ return wasmBuffer;
584
+ } catch {
585
+ return void 0;
586
+ }
575
587
  }
588
+ return void 0;
576
589
  }
577
590
  function getVersion() {
578
591
  if (!isInitialized()) {
@@ -629,9 +642,9 @@ async function initWasm(options) {
629
642
  const wasmBinary = await loadWasmBinaryForNode();
630
643
  if (wasmBinary) {
631
644
  await loadedModule.default(wasmBinary);
632
- } else if (isEdgeEnvironment()) {
645
+ } else if (isEdgeEnvironment() || isDeno()) {
633
646
  throw new Error(
634
- "Edge environment detected (Cloudflare Workers / Vercel Edge). Cannot automatically load .wasm file because fetch() does not support file:// URLs. Pass the WASM module explicitly:\n\n import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n await initWasm({ wasmModule });\n"
647
+ "Edge/restricted environment detected (Cloudflare Workers / Vercel Edge / Supabase). Cannot automatically load .wasm file because fetch() does not support file:// URLs. Pass the WASM module explicitly:\n\n import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n await initWasm({ wasmModule });\n"
635
648
  );
636
649
  } else {
637
650
  await loadedModule.default();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../typescript/runtime.ts","../typescript/initialization/pdfium-loader.ts","../typescript/adapters/wasm-adapter.ts","../typescript/initialization/state.ts","../typescript/initialization/wasm-loader.ts","../typescript/extraction/internal.ts","../typescript/extraction/bytes.ts","../typescript/extraction/files.ts","../typescript/extraction/batch.ts","../typescript/ocr/registry.ts","../typescript/ocr/tesseract-wasm-backend.ts","../typescript/ocr/worker-bridge.ts","../typescript/ocr/enabler.ts","../typescript/plugin-registry.ts","../typescript/mime/utilities.ts"],"sourcesContent":["/**\n * Runtime detection and environment-specific utilities\n *\n * This module provides utilities for detecting the JavaScript runtime environment,\n * checking for feature availability, and enabling environment-specific WASM loading strategies.\n *\n * @example Basic Runtime Detection\n * ```typescript\n * import { detectRuntime, isBrowser, isNode } from '@kreuzberg/wasm/runtime';\n *\n * if (isBrowser()) {\n * console.log('Running in browser');\n * } else if (isNode()) {\n * console.log('Running in Node.js');\n * }\n * ```\n *\n * @example Feature Detection\n * ```typescript\n * import { hasFileApi, hasWorkers } from '@kreuzberg/wasm/runtime';\n *\n * if (hasFileApi()) {\n * // Can use File API for browser file uploads\n * }\n *\n * if (hasWorkers()) {\n * // Can use Web Workers for parallel processing\n * }\n * ```\n */\n\nexport type RuntimeType = \"browser\" | \"node\" | \"deno\" | \"bun\" | \"cloudflare-workers\" | \"edge-runtime\" | \"unknown\";\n\n/**\n * WebAssembly capabilities available in the runtime\n */\nexport interface WasmCapabilities {\n\t/** Runtime environment type */\n\truntime: RuntimeType;\n\t/** WebAssembly support available */\n\thasWasm: boolean;\n\t/** Streaming WebAssembly instantiation available */\n\thasWasmStreaming: boolean;\n\t/** File API available (browser) */\n\thasFileApi: boolean;\n\t/** Blob API available */\n\thasBlob: boolean;\n\t/** Worker support available */\n\thasWorkers: boolean;\n\t/** SharedArrayBuffer available (may be restricted) */\n\thasSharedArrayBuffer: boolean;\n\t/** Module Workers available */\n\thasModuleWorkers: boolean;\n\t/** BigInt support */\n\thasBigInt: boolean;\n\t/** Specific runtime version if available */\n\truntimeVersion?: string;\n}\n\n/**\n * Detect the current JavaScript runtime\n *\n * Checks for various global objects and properties to determine\n * which JavaScript runtime environment is currently executing.\n *\n * @returns The detected runtime type\n *\n * @example\n * ```typescript\n * import { detectRuntime } from '@kreuzberg/wasm/runtime';\n *\n * const runtime = detectRuntime();\n * switch (runtime) {\n * case 'browser':\n * console.log('Running in browser');\n * break;\n * case 'node':\n * console.log('Running in Node.js');\n * break;\n * case 'deno':\n * console.log('Running in Deno');\n * break;\n * case 'bun':\n * console.log('Running in Bun');\n * break;\n * }\n * ```\n */\nexport function detectRuntime(): RuntimeType {\n\t// Check for Cloudflare Workers - has caches global with a default property but no window/document\n\tconst globalCaches = (globalThis as unknown as Record<string, unknown>).caches;\n\tif (\n\t\ttypeof caches !== \"undefined\" &&\n\t\tglobalCaches !== null &&\n\t\ttypeof globalCaches === \"object\" &&\n\t\t\"default\" in (globalCaches as object) &&\n\t\ttypeof window === \"undefined\" &&\n\t\ttypeof document === \"undefined\"\n\t) {\n\t\treturn \"cloudflare-workers\";\n\t}\n\n\t// Check for Vercel Edge Runtime / other edge runtimes\n\tif (typeof (globalThis as unknown as Record<string, unknown>).EdgeRuntime !== \"undefined\") {\n\t\treturn \"edge-runtime\";\n\t}\n\n\tif (typeof (globalThis as unknown as Record<string, unknown>).Deno !== \"undefined\") {\n\t\treturn \"deno\";\n\t}\n\n\tif (typeof (globalThis as unknown as Record<string, unknown>).Bun !== \"undefined\") {\n\t\treturn \"bun\";\n\t}\n\n\tif (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n\t\treturn \"node\";\n\t}\n\n\tif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n\t\treturn \"browser\";\n\t}\n\n\treturn \"unknown\";\n}\n\n/**\n * Check if running in a browser environment\n *\n * @returns True if running in a browser, false otherwise\n */\nexport function isBrowser(): boolean {\n\treturn detectRuntime() === \"browser\";\n}\n\n/**\n * Check if running in Node.js\n *\n * @returns True if running in Node.js, false otherwise\n */\nexport function isNode(): boolean {\n\treturn detectRuntime() === \"node\";\n}\n\n/**\n * Check if running in Deno\n *\n * @returns True if running in Deno, false otherwise\n */\nexport function isDeno(): boolean {\n\treturn detectRuntime() === \"deno\";\n}\n\n/**\n * Check if running in Bun\n *\n * @returns True if running in Bun, false otherwise\n */\nexport function isBun(): boolean {\n\treturn detectRuntime() === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n *\n * @returns True if running in Cloudflare Workers, false otherwise\n */\nexport function isCloudflareWorkers(): boolean {\n\treturn detectRuntime() === \"cloudflare-workers\";\n}\n\n/**\n * Check if running in an edge runtime (Vercel Edge, etc.)\n *\n * @returns True if running in an edge runtime, false otherwise\n */\nexport function isEdgeRuntime(): boolean {\n\treturn detectRuntime() === \"edge-runtime\";\n}\n\n/**\n * Check if running in any edge/serverless environment\n *\n * This includes Cloudflare Workers, Vercel Edge, and similar environments.\n *\n * @returns True if running in an edge environment, false otherwise\n */\nexport function isEdgeEnvironment(): boolean {\n\tconst runtime = detectRuntime();\n\treturn runtime === \"cloudflare-workers\" || runtime === \"edge-runtime\";\n}\n\n/**\n * Check if running in a web environment (browser or similar)\n *\n * @returns True if running in a web browser, false otherwise\n */\nexport function isWebEnvironment(): boolean {\n\tconst runtime = detectRuntime();\n\treturn runtime === \"browser\";\n}\n\n/**\n * Check if running in a server-like environment (Node.js, Deno, Bun, Cloudflare Workers, Edge)\n *\n * @returns True if running on a server runtime, false otherwise\n */\nexport function isServerEnvironment(): boolean {\n\tconst runtime = detectRuntime();\n\treturn (\n\t\truntime === \"node\" ||\n\t\truntime === \"deno\" ||\n\t\truntime === \"bun\" ||\n\t\truntime === \"cloudflare-workers\" ||\n\t\truntime === \"edge-runtime\"\n\t);\n}\n\n/**\n * Check if File API is available\n *\n * The File API is required for handling browser file uploads.\n *\n * @returns True if File API is available, false otherwise\n *\n * @example\n * ```typescript\n * if (hasFileApi()) {\n * const fileInput = document.getElementById('file');\n * fileInput.addEventListener('change', (e) => {\n * const file = e.target.files?.[0];\n * // Handle file\n * });\n * }\n * ```\n */\nexport function hasFileApi(): boolean {\n\treturn typeof window !== \"undefined\" && typeof File !== \"undefined\" && typeof Blob !== \"undefined\";\n}\n\n/**\n * Check if Blob API is available\n *\n * @returns True if Blob API is available, false otherwise\n */\nexport function hasBlob(): boolean {\n\treturn typeof Blob !== \"undefined\";\n}\n\n/**\n * Check if Web Workers are available\n *\n * @returns True if Web Workers can be created, false otherwise\n */\nexport function hasWorkers(): boolean {\n\treturn typeof Worker !== \"undefined\";\n}\n\n/**\n * Check if SharedArrayBuffer is available\n *\n * Note: SharedArrayBuffer is restricted in some browser contexts\n * due to security considerations (Spectre/Meltdown mitigations).\n *\n * @returns True if SharedArrayBuffer is available, false otherwise\n */\nexport function hasSharedArrayBuffer(): boolean {\n\treturn typeof SharedArrayBuffer !== \"undefined\";\n}\n\n/**\n * Check if module workers are available\n *\n * Module workers allow importing ES modules in worker threads.\n *\n * @returns True if module workers are supported, false otherwise\n */\nexport function hasModuleWorkers(): boolean {\n\tif (!hasWorkers()) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst blob = new Blob(['console.log(\"test\")'], {\n\t\t\ttype: \"application/javascript\",\n\t\t});\n\t\tconst workerUrl = URL.createObjectURL(blob);\n\t\ttry {\n\t\t\treturn true;\n\t\t} finally {\n\t\t\tURL.revokeObjectURL(workerUrl);\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Check if WebAssembly is available\n *\n * @returns True if WebAssembly is supported, false otherwise\n */\nexport function hasWasm(): boolean {\n\treturn typeof WebAssembly !== \"undefined\" && WebAssembly.instantiate !== undefined;\n}\n\n/**\n * Check if WebAssembly.instantiateStreaming is available\n *\n * Streaming instantiation is more efficient than buffering the entire WASM module.\n *\n * @returns True if streaming WebAssembly is supported, false otherwise\n */\nexport function hasWasmStreaming(): boolean {\n\treturn typeof WebAssembly !== \"undefined\" && WebAssembly.instantiateStreaming !== undefined;\n}\n\n/**\n * Check if BigInt is available\n *\n * @returns True if BigInt type is supported, false otherwise\n */\nexport function hasBigInt(): boolean {\n\ttry {\n\t\tconst test = BigInt(\"1\");\n\t\treturn typeof test === \"bigint\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get runtime version information\n *\n * @returns Version string if available, undefined otherwise\n *\n * @example\n * ```typescript\n * const version = getRuntimeVersion();\n * console.log(`Running on Node ${version}`); // \"Running on Node 18.12.0\"\n * ```\n */\nexport function getRuntimeVersion(): string | undefined {\n\tconst runtime = detectRuntime();\n\n\tswitch (runtime) {\n\t\tcase \"node\":\n\t\t\treturn process.version?.substring(1);\n\t\tcase \"deno\": {\n\t\t\tconst deno = (globalThis as unknown as Record<string, unknown>).Deno as Record<string, unknown> | undefined;\n\t\t\tconst version = deno?.version as Record<string, unknown> | undefined;\n\t\t\treturn version?.deno as string | undefined;\n\t\t}\n\t\tcase \"bun\": {\n\t\t\tconst bun = (globalThis as unknown as Record<string, unknown>).Bun as Record<string, unknown> | undefined;\n\t\t\treturn bun?.version as string | undefined;\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Get comprehensive WebAssembly capabilities for current runtime\n *\n * Returns detailed information about WASM and related APIs available\n * in the current runtime environment.\n *\n * @returns Object describing available WASM capabilities\n *\n * @example\n * ```typescript\n * import { getWasmCapabilities } from '@kreuzberg/wasm/runtime';\n *\n * const caps = getWasmCapabilities();\n * console.log(`WASM available: ${caps.hasWasm}`);\n * console.log(`Streaming WASM: ${caps.hasWasmStreaming}`);\n * console.log(`Workers available: ${caps.hasWorkers}`);\n *\n * if (caps.hasWasm && caps.hasWorkers) {\n * // Can offload WASM processing to workers\n * }\n * ```\n */\nexport function getWasmCapabilities(): WasmCapabilities {\n\tconst runtime = detectRuntime();\n\tconst version = getRuntimeVersion();\n\tconst capabilities: WasmCapabilities = {\n\t\truntime,\n\t\thasWasm: hasWasm(),\n\t\thasWasmStreaming: hasWasmStreaming(),\n\t\thasFileApi: hasFileApi(),\n\t\thasBlob: hasBlob(),\n\t\thasWorkers: hasWorkers(),\n\t\thasSharedArrayBuffer: hasSharedArrayBuffer(),\n\t\thasModuleWorkers: hasModuleWorkers(),\n\t\thasBigInt: hasBigInt(),\n\t\t...(version !== undefined ? { runtimeVersion: version } : {}),\n\t};\n\treturn capabilities;\n}\n\n/**\n * Get comprehensive runtime information\n *\n * Returns detailed information about the current runtime environment,\n * capabilities, and identifying information.\n *\n * @returns Object with runtime details and capabilities\n *\n * @example\n * ```typescript\n * const info = getRuntimeInfo();\n * console.log(info.runtime); // 'browser' | 'node' | 'deno' | 'bun'\n * console.log(info.isBrowser); // true/false\n * console.log(info.userAgent); // Browser user agent string\n * console.log(info.capabilities); // Detailed capability information\n * ```\n */\nexport function getRuntimeInfo() {\n\tconst runtime = detectRuntime();\n\tconst capabilities = getWasmCapabilities();\n\n\treturn {\n\t\truntime,\n\t\tisBrowser: isBrowser(),\n\t\tisNode: isNode(),\n\t\tisDeno: isDeno(),\n\t\tisBun: isBun(),\n\t\tisWeb: isWebEnvironment(),\n\t\tisServer: isServerEnvironment(),\n\t\truntimeVersion: getRuntimeVersion(),\n\t\tuserAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : \"N/A\",\n\t\tcapabilities,\n\t};\n}\n","/**\n * PDFium WASM Loader\n *\n * Handles PDFium-specific WASM module loading and initialization.\n * Provides asynchronous loading of the PDFium WASM module with\n * proper error handling across all WASM runtimes (browser, Node.js, Bun, Deno).\n *\n * PDFium can be provided in several ways:\n * 1. Place `pdfium.js` (Emscripten output) alongside the package distribution\n * 2. Set `KREUZBERG_PDFIUM_PATH` environment variable to the directory containing `pdfium.js`\n * 3. Call `initialize_pdfium_render()` manually with a loaded PDFium module\n */\n\nimport { isNode } from \"../runtime.js\";\nimport type { WasmModule } from \"./state.js\";\n\n/**\n * Attempt to load the PDFium module from the filesystem in Node.js.\n * Checks multiple candidate paths relative to the package directory.\n *\n * @returns The loaded PDFium module or null if not found\n * @internal\n */\nasync function loadPdfiumForNode(): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst fs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\tconst path = await import(/* @vite-ignore */ \"node:path\");\n\t\tconst url = await import(/* @vite-ignore */ \"node:url\");\n\n\t\tconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\n\t\t// Check environment variable first\n\t\tconst envPath = process.env.KREUZBERG_PDFIUM_PATH;\n\t\tconst candidates: string[] = [];\n\n\t\tif (envPath) {\n\t\t\tcandidates.push(path.join(envPath, \"pdfium.js\"));\n\t\t\tcandidates.push(envPath); // allow direct path to pdfium.js\n\t\t}\n\n\t\t// Standard locations relative to package dist\n\t\tcandidates.push(\n\t\t\tpath.join(__dirname, \"..\", \"pdfium.js\"), // dist/pdfium.js\n\t\t\tpath.join(__dirname, \"pdfium.js\"), // dist/initialization/pdfium.js\n\t\t\tpath.join(__dirname, \"..\", \"..\", \"pdfium.js\"), // package root pdfium.js\n\t\t);\n\n\t\tfor (const candidate of candidates) {\n\t\t\ttry {\n\t\t\t\tawait fs.access(candidate);\n\t\t\t\tconst moduleUrl = url.pathToFileURL(candidate).href;\n\t\t\t\treturn (await import(/* @vite-ignore */ moduleUrl)) as Record<string, unknown>;\n\t\t\t} catch {\n\t\t\t\t// Try next candidate path\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Load the PDFium module for the current runtime environment.\n *\n * @returns The loaded PDFium module or null if not available\n * @internal\n */\nasync function loadPdfiumModule(): Promise<Record<string, unknown> | null> {\n\tif (isNode()) {\n\t\treturn loadPdfiumForNode();\n\t}\n\n\t// Browser/Deno/Bun: try dynamic import\n\ttry {\n\t\t// @ts-expect-error - Dynamic module loading\n\t\treturn await import(\"../pdfium.js\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Initialize PDFium WASM module asynchronously\n *\n * Loads and binds the PDFium WASM module for PDF extraction.\n * This function is called automatically during WASM initialization\n * in all supported environments (browser, Node.js, Bun, Deno).\n *\n * PDFium provides high-performance PDF parsing and extraction capabilities,\n * enabling reliable text and metadata extraction from PDF documents.\n *\n * If the PDFium module cannot be found or loaded, initialization fails\n * gracefully and PDF extraction will not be available. Users can provide\n * the PDFium module manually via `initialize_pdfium_render()`.\n *\n * @param wasmModule - The loaded Kreuzberg WASM module\n *\n * @internal\n *\n * @example\n * ```typescript\n * // Called automatically during initWasm() in all environments\n * // See wasm-loader.ts for integration\n *\n * // To provide PDFium manually in Node.js:\n * // Set KREUZBERG_PDFIUM_PATH=/path/to/pdfium-wasm-dir\n *\n * // Or initialize manually:\n * import { initWasm, getWasmModule } from '@kreuzberg/wasm';\n * await initWasm();\n * const wasm = getWasmModule();\n * const pdfium = await import('./pdfium.js').then(m => m.default());\n * wasm.initialize_pdfium_render(pdfium, wasm, false);\n * ```\n */\nexport async function initializePdfiumAsync(wasmModule: WasmModule): Promise<void> {\n\tif (!wasmModule || typeof wasmModule.initialize_pdfium_render !== \"function\") {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst pdfiumModule = await loadPdfiumModule();\n\t\tif (!pdfiumModule) {\n\t\t\tconsole.debug(\"PDFium module not found, PDF extraction will not be available\");\n\t\t\tconsole.debug(\"To enable PDF support, provide pdfium.js via KREUZBERG_PDFIUM_PATH or manual initialization\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst pdfium =\n\t\t\ttypeof pdfiumModule.default === \"function\"\n\t\t\t\t? await (pdfiumModule.default as () => Promise<unknown>)()\n\t\t\t\t: pdfiumModule;\n\n\t\tconst success = wasmModule.initialize_pdfium_render(pdfium, wasmModule, false);\n\t\tif (!success) {\n\t\t\tconsole.warn(\"PDFium initialization returned false\");\n\t\t}\n\t} catch (error) {\n\t\tconsole.debug(\"PDFium initialization error:\", error);\n\t}\n}\n","/**\n * WASM Type Adapter\n *\n * This module provides type adapters for converting between JavaScript/TypeScript\n * types and WASM-compatible types, handling File/Blob conversions, config normalization,\n * and result parsing.\n *\n * @example File Conversion\n * ```typescript\n * import { fileToUint8Array } from '@kreuzberg/wasm/adapters/wasm-adapter';\n *\n * const file = event.target.files[0];\n * const bytes = await fileToUint8Array(file);\n * const result = await extractBytes(bytes, file.type);\n * ```\n *\n * @example Config Normalization\n * ```typescript\n * import { configToJS } from '@kreuzberg/wasm/adapters/wasm-adapter';\n *\n * const config = {\n * ocr: { backend: 'tesseract', language: 'eng' },\n * chunking: { maxChars: 1000 }\n * };\n * const normalized = configToJS(config);\n * ```\n */\n\nimport type {\n\tChunk,\n\tDocumentStructure,\n\tElement,\n\tExtractedImage,\n\tExtractedKeyword,\n\tExtractionConfig,\n\tExtractionResult,\n\tMetadata,\n\tOcrElement,\n\tPageContent,\n\tPdfAnnotation,\n\tProcessingWarning,\n\tTable,\n} from \"../types.js\";\n\n/**\n * Maximum file size for processing (512 MB)\n *\n * @internal\n */\nconst MAX_FILE_SIZE = 512 * 1024 * 1024;\n\n/**\n * Type predicate to validate numeric value or null\n *\n * @internal\n */\nfunction isNumberOrNull(value: unknown): value is number | null {\n\treturn typeof value === \"number\" || value === null || value === undefined;\n}\n\n/**\n * Type predicate to validate string value or null\n *\n * @internal\n */\nfunction isStringOrNull(value: unknown): value is string | null {\n\treturn typeof value === \"string\" || value === null || value === undefined;\n}\n\n/**\n * Type predicate to validate boolean value\n *\n * @internal\n */\nfunction isBoolean(value: unknown): value is boolean {\n\treturn typeof value === \"boolean\" || value === undefined;\n}\n\n/**\n * Convert a File or Blob to Uint8Array\n *\n * Handles both browser File API and server-side Blob-like objects,\n * providing a unified interface for reading binary data.\n *\n * @param file - The File or Blob to convert\n * @returns Promise resolving to the byte array\n * @throws {Error} If the file cannot be read or exceeds size limit\n *\n * @example\n * ```typescript\n * const file = document.getElementById('input').files[0];\n * const bytes = await fileToUint8Array(file);\n * const result = await extractBytes(bytes, 'application/pdf');\n * ```\n */\nexport async function fileToUint8Array(file: File | Blob): Promise<Uint8Array> {\n\ttry {\n\t\tif (file.size > MAX_FILE_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`File size (${file.size} bytes) exceeds maximum (${MAX_FILE_SIZE} bytes). Maximum file size is 512 MB.`,\n\t\t\t);\n\t\t}\n\n\t\tconst arrayBuffer = await file.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} catch (error) {\n\t\tthrow new Error(`Failed to read file: ${error instanceof Error ? error.message : String(error)}`);\n\t}\n}\n\n/**\n * Normalize ExtractionConfig for WASM processing\n *\n * Converts TypeScript configuration objects to a WASM-compatible format,\n * handling null values, undefined properties, and nested structures.\n *\n * @param config - The extraction configuration or null\n * @returns Normalized configuration object suitable for WASM\n *\n * @example\n * ```typescript\n * const config: ExtractionConfig = {\n * ocr: { backend: 'tesseract' },\n * chunking: { maxChars: 1000 }\n * };\n * const wasmConfig = configToJS(config);\n * ```\n */\nexport function configToJS(config: ExtractionConfig | null): Record<string, unknown> {\n\tif (!config) {\n\t\treturn {};\n\t}\n\n\t// Convert camelCase key to snake_case to match Rust serde field names.\n\tconst toSnakeCase = (str: string): string => str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n\n\tconst normalizeValue = (value: unknown): unknown => {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\tif (typeof value === \"object\") {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.map(normalizeValue);\n\t\t\t}\n\t\t\tconst obj = value as Record<string, unknown>;\n\t\t\tconst normalized: Record<string, unknown> = {};\n\t\t\tfor (const [key, val] of Object.entries(obj)) {\n\t\t\t\tconst normalizedVal = normalizeValue(val);\n\t\t\t\tif (normalizedVal !== null && normalizedVal !== undefined) {\n\t\t\t\t\tnormalized[toSnakeCase(key)] = normalizedVal;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Object.keys(normalized).length > 0 ? normalized : null;\n\t\t}\n\t\treturn value;\n\t};\n\n\tconst normalized: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tconst normalizedValue = normalizeValue(value);\n\t\tif (normalizedValue !== null && normalizedValue !== undefined) {\n\t\t\tnormalized[toSnakeCase(key)] = normalizedValue;\n\t\t}\n\t}\n\n\treturn normalized;\n}\n\n/**\n * Parse WASM extraction result and convert to TypeScript type\n *\n * Handles conversion of WASM-returned objects to proper ExtractionResult types,\n * including proper array conversions and type assertions for tables, chunks, and images.\n *\n * @param jsValue - The raw WASM result value\n * @returns Properly typed ExtractionResult\n * @throws {Error} If the result structure is invalid\n *\n * @example\n * ```typescript\n * const wasmResult = await wasmExtract(bytes, mimeType, config);\n * const result = jsToExtractionResult(wasmResult);\n * console.log(result.content);\n * ```\n */\nexport function jsToExtractionResult(jsValue: unknown): ExtractionResult {\n\tif (!jsValue || typeof jsValue !== \"object\") {\n\t\tthrow new Error(\"Invalid extraction result: value is not an object\");\n\t}\n\n\tconst result = jsValue as Record<string, unknown>;\n\tconst mimeType =\n\t\ttypeof result.mimeType === \"string\"\n\t\t\t? result.mimeType\n\t\t\t: typeof result.mime_type === \"string\"\n\t\t\t\t? result.mime_type\n\t\t\t\t: null;\n\n\tif (typeof result.content !== \"string\") {\n\t\tthrow new Error(\"Invalid extraction result: missing or invalid content\");\n\t}\n\tif (typeof mimeType !== \"string\") {\n\t\tthrow new Error(\"Invalid extraction result: missing or invalid mimeType\");\n\t}\n\tif (!result.metadata || typeof result.metadata !== \"object\") {\n\t\tthrow new Error(\"Invalid extraction result: missing or invalid metadata\");\n\t}\n\n\tconst tables: Table[] = [];\n\tif (Array.isArray(result.tables)) {\n\t\tfor (const table of result.tables) {\n\t\t\tif (table && typeof table === \"object\") {\n\t\t\t\tconst t = table as Record<string, unknown>;\n\t\t\t\tconst pageNumber =\n\t\t\t\t\ttypeof t.pageNumber === \"number\" ? t.pageNumber : typeof t.page_number === \"number\" ? t.page_number : null;\n\t\t\t\tif (\n\t\t\t\t\tArray.isArray(t.cells) &&\n\t\t\t\t\tt.cells.every((row) => Array.isArray(row) && row.every((cell) => typeof cell === \"string\")) &&\n\t\t\t\t\ttypeof t.markdown === \"string\" &&\n\t\t\t\t\tpageNumber !== null\n\t\t\t\t) {\n\t\t\t\t\ttables.push({\n\t\t\t\t\t\tcells: t.cells as string[][],\n\t\t\t\t\t\tmarkdown: t.markdown,\n\t\t\t\t\t\tpageNumber,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst chunks: Chunk[] | null = Array.isArray(result.chunks)\n\t\t? result.chunks.map((chunk) => {\n\t\t\t\tif (!chunk || typeof chunk !== \"object\") {\n\t\t\t\t\tthrow new Error(\"Invalid chunk structure\");\n\t\t\t\t}\n\t\t\t\tconst c = chunk as Record<string, unknown>;\n\t\t\t\tif (typeof c.content !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid chunk: missing content\");\n\t\t\t\t}\n\t\t\t\tif (!c.metadata || typeof c.metadata !== \"object\") {\n\t\t\t\t\tthrow new Error(\"Invalid chunk: missing metadata\");\n\t\t\t\t}\n\t\t\t\tconst metadata = c.metadata as Record<string, unknown>;\n\n\t\t\t\tlet embedding: number[] | null = null;\n\t\t\t\tif (Array.isArray(c.embedding)) {\n\t\t\t\t\tif (!c.embedding.every((item) => typeof item === \"number\")) {\n\t\t\t\t\t\tthrow new Error(\"Invalid chunk: embedding must contain only numbers\");\n\t\t\t\t\t}\n\t\t\t\t\tembedding = c.embedding;\n\t\t\t\t}\n\n\t\t\t\t// Coerce numeric values - handle BigInt, strings, and numbers\n\t\t\t\tconst coerceToNumber = (value: unknown, fieldName: string): number => {\n\t\t\t\t\tif (typeof value === \"number\") {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof value === \"bigint\") {\n\t\t\t\t\t\treturn Number(value);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t\tconst parsed = parseInt(value, 10);\n\t\t\t\t\t\tif (Number.isNaN(parsed)) {\n\t\t\t\t\t\t\tthrow new Error(`Invalid chunk metadata: ${fieldName} must be a valid number, got \"${value}\"`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(`Invalid chunk metadata: ${fieldName} must be a number, got ${typeof value}`);\n\t\t\t\t};\n\n\t\t\t\t// The Rust code uses snake_case field names (byte_start, byte_end, etc)\n\t\t\t\t// but TypeScript expects camelCase (charStart, charEnd, etc)\n\t\t\t\t// For now, treat byte offsets as character offsets since the content is UTF-8\n\t\t\t\tconst charStart = coerceToNumber(\n\t\t\t\t\tmetadata.charStart ?? metadata.char_start ?? metadata.byteStart ?? metadata.byte_start,\n\t\t\t\t\t\"charStart\",\n\t\t\t\t);\n\t\t\t\tconst charEnd = coerceToNumber(\n\t\t\t\t\tmetadata.charEnd ?? metadata.char_end ?? metadata.byteEnd ?? metadata.byte_end,\n\t\t\t\t\t\"charEnd\",\n\t\t\t\t);\n\t\t\t\tconst chunkIndex = coerceToNumber(metadata.chunkIndex ?? metadata.chunk_index, \"chunkIndex\");\n\t\t\t\tconst totalChunks = coerceToNumber(metadata.totalChunks ?? metadata.total_chunks, \"totalChunks\");\n\n\t\t\t\tlet tokenCount: number | null = null;\n\t\t\t\tconst tokenCountValue = metadata.tokenCount ?? metadata.token_count;\n\t\t\t\tif (tokenCountValue !== null && tokenCountValue !== undefined) {\n\t\t\t\t\ttokenCount = coerceToNumber(tokenCountValue, \"tokenCount\");\n\t\t\t\t}\n\n\t\t\t\tlet firstPage: number | null = null;\n\t\t\t\tconst firstPageValue = metadata.firstPage ?? metadata.first_page;\n\t\t\t\tif (firstPageValue !== null && firstPageValue !== undefined) {\n\t\t\t\t\tfirstPage = coerceToNumber(firstPageValue, \"firstPage\");\n\t\t\t\t}\n\n\t\t\t\tlet lastPage: number | null = null;\n\t\t\t\tconst lastPageValue = metadata.lastPage ?? metadata.last_page;\n\t\t\t\tif (lastPageValue !== null && lastPageValue !== undefined) {\n\t\t\t\t\tlastPage = coerceToNumber(lastPageValue, \"lastPage\");\n\t\t\t\t}\n\n\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\tconst rawHc = (metadata[\"heading_context\"] ?? metadata[\"headingContext\"]) as\n\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t| null\n\t\t\t\t\t| undefined;\n\t\t\t\tlet headingContext: import(\"../types.js\").HeadingContext | null = null;\n\t\t\t\tif (rawHc && typeof rawHc === \"object\") {\n\t\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\t\tconst rawHeadings = rawHc[\"headings\"];\n\t\t\t\t\tif (Array.isArray(rawHeadings)) {\n\t\t\t\t\t\theadingContext = {\n\t\t\t\t\t\t\theadings: rawHeadings.map((h: unknown) => {\n\t\t\t\t\t\t\t\tconst heading = h as Record<string, unknown>;\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\t\t\t\t\t\tlevel: (heading[\"level\"] as number) ?? 0,\n\t\t\t\t\t\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\t\t\t\t\t\ttext: (heading[\"text\"] as string) ?? \"\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: c.content,\n\t\t\t\t\tembedding,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tbyteStart: charStart,\n\t\t\t\t\t\tbyteEnd: charEnd,\n\t\t\t\t\t\tcharStart,\n\t\t\t\t\t\tcharEnd,\n\t\t\t\t\t\ttokenCount,\n\t\t\t\t\t\tchunkIndex,\n\t\t\t\t\t\ttotalChunks,\n\t\t\t\t\t\tfirstPage,\n\t\t\t\t\t\tlastPage,\n\t\t\t\t\t\theadingContext,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t})\n\t\t: null;\n\n\tconst images: ExtractedImage[] | null = Array.isArray(result.images)\n\t\t? result.images.map((image) => {\n\t\t\t\tif (!image || typeof image !== \"object\") {\n\t\t\t\t\tthrow new Error(\"Invalid image structure\");\n\t\t\t\t}\n\t\t\t\tconst img = image as Record<string, unknown>;\n\t\t\t\tlet imageData: Uint8Array;\n\t\t\t\tif (img.data instanceof Uint8Array) {\n\t\t\t\t\timageData = img.data;\n\t\t\t\t} else if (Array.isArray(img.data)) {\n\t\t\t\t\timageData = new Uint8Array(img.data as number[]);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Invalid image: data must be Uint8Array or array\");\n\t\t\t\t}\n\t\t\t\tif (typeof img.format !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid image: missing format\");\n\t\t\t\t}\n\n\t\t\t\t// Support both camelCase and snake_case field names (Rust serde uses snake_case)\n\t\t\t\tconst imageIndex = img.imageIndex ?? img.image_index;\n\t\t\t\tconst pageNumber = img.pageNumber ?? img.page_number;\n\t\t\t\tconst bitsPerComponent = img.bitsPerComponent ?? img.bits_per_component;\n\t\t\t\tconst isMask = img.isMask ?? img.is_mask;\n\t\t\t\tconst ocrResult = img.ocrResult ?? img.ocr_result;\n\n\t\t\t\tif (typeof imageIndex !== \"number\") {\n\t\t\t\t\tthrow new Error(\"Invalid image: imageIndex must be a number\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(pageNumber)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: pageNumber must be a number or null\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(img.width)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: width must be a number or null\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(img.height)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: height must be a number or null\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(bitsPerComponent)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: bitsPerComponent must be a number or null\");\n\t\t\t\t}\n\n\t\t\t\tif (!isBoolean(isMask)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: isMask must be a boolean\");\n\t\t\t\t}\n\n\t\t\t\tif (!isStringOrNull(img.colorspace)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: colorspace must be a string or null\");\n\t\t\t\t}\n\t\t\t\tif (!isStringOrNull(img.description)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: description must be a string or null\");\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tdata: imageData,\n\t\t\t\t\tformat: img.format,\n\t\t\t\t\timageIndex: imageIndex,\n\t\t\t\t\tpageNumber: pageNumber ?? null,\n\t\t\t\t\twidth: (img.width as number) ?? null,\n\t\t\t\t\theight: (img.height as number) ?? null,\n\t\t\t\t\tcolorspace: (img.colorspace as string) ?? null,\n\t\t\t\t\tbitsPerComponent: bitsPerComponent ?? null,\n\t\t\t\t\tisMask: isMask ?? false,\n\t\t\t\t\tdescription: (img.description as string) ?? null,\n\t\t\t\t\tocrResult: ocrResult ? jsToExtractionResult(ocrResult) : null,\n\t\t\t\t};\n\t\t\t})\n\t\t: null;\n\n\tlet detectedLanguages: string[] | null = null;\n\tconst detectedLanguagesRaw = Array.isArray(result.detectedLanguages)\n\t\t? result.detectedLanguages\n\t\t: result.detected_languages;\n\tif (Array.isArray(detectedLanguagesRaw)) {\n\t\tif (!detectedLanguagesRaw.every((lang) => typeof lang === \"string\")) {\n\t\t\tthrow new Error(\"Invalid result: detectedLanguages must contain only strings\");\n\t\t}\n\t\tdetectedLanguages = detectedLanguagesRaw;\n\t}\n\n\tconst extractedKeywords = (result.extractedKeywords ?? result.extracted_keywords ?? null) as\n\t\t| ExtractedKeyword[]\n\t\t| null;\n\tconst qualityScore =\n\t\ttypeof (result.qualityScore ?? result.quality_score) === \"number\"\n\t\t\t? ((result.qualityScore ?? result.quality_score) as number)\n\t\t\t: null;\n\tconst processingWarnings = (result.processingWarnings ?? result.processing_warnings ?? null) as\n\t\t| ProcessingWarning[]\n\t\t| null;\n\tconst elements = (result.elements ?? null) as Element[] | null;\n\tconst ocrElements = (result.ocrElements ?? result.ocr_elements ?? null) as OcrElement[] | null;\n\tconst document = (result.document ?? null) as DocumentStructure | null;\n\tconst pages = (result.pages ?? null) as PageContent[] | null;\n\tconst annotations = (result.annotations ?? null) as PdfAnnotation[] | null;\n\n\treturn {\n\t\tcontent: result.content,\n\t\tmimeType,\n\t\tmetadata: (result.metadata ?? {}) as Metadata,\n\t\ttables,\n\t\tdetectedLanguages,\n\t\tchunks,\n\t\timages,\n\t\tpages,\n\t\textractedKeywords,\n\t\tqualityScore,\n\t\tprocessingWarnings,\n\t\telements,\n\t\tocrElements,\n\t\tdocument,\n\t\tannotations,\n\t};\n}\n\n/**\n * Wrap and format WASM errors with context\n *\n * Converts WASM error messages to JavaScript Error objects with proper context\n * and stack trace information when available.\n *\n * @param error - The error from WASM\n * @param context - Additional context about what operation failed\n * @returns A formatted Error object\n *\n * @internal\n *\n * @example\n * ```typescript\n * try {\n * await wasmExtract(bytes, mimeType);\n * } catch (error) {\n * throw wrapWasmError(error, 'extracting document');\n * }\n * ```\n */\nexport function wrapWasmError(error: unknown, context: string): Error {\n\tif (error instanceof Error) {\n\t\treturn new Error(`Error ${context}: ${error.message}`, {\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\tconst message = String(error);\n\treturn new Error(`Error ${context}: ${message}`);\n}\n\n/**\n * Validate that a WASM-returned value conforms to ExtractionResult structure\n *\n * Performs structural validation without full type checking,\n * useful for runtime validation of WASM output.\n *\n * @param value - The value to validate\n * @returns True if value appears to be a valid ExtractionResult\n *\n * @internal\n */\nexport function isValidExtractionResult(value: unknown): value is ExtractionResult {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst obj = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof obj.content === \"string\" &&\n\t\t(typeof obj.mimeType === \"string\" || typeof obj.mime_type === \"string\") &&\n\t\tobj.metadata !== null &&\n\t\ttypeof obj.metadata === \"object\" &&\n\t\tArray.isArray(obj.tables)\n\t);\n}\n","/**\n * WASM Initialization State\n *\n * Centralized state management for WASM module initialization.\n * Provides access to the loaded WASM module and initialization status.\n * This module has no dependencies to avoid circular imports.\n */\n\nexport type WasmModule = {\n\textractBytes: (data: Uint8Array, mimeType: string, config: Record<string, unknown> | null) => Promise<unknown>;\n\textractBytesSync: (data: Uint8Array, mimeType: string, config: Record<string, unknown> | null) => unknown;\n\tbatchExtractBytes: (\n\t\tdataList: Uint8Array[],\n\t\tmimeTypes: string[],\n\t\tconfig: Record<string, unknown> | null,\n\t) => Promise<unknown>;\n\tbatchExtractBytesSync: (\n\t\tdataList: Uint8Array[],\n\t\tmimeTypes: string[],\n\t\tconfig: Record<string, unknown> | null,\n\t) => unknown;\n\textractFile: (file: File, mimeType: string | null, config: Record<string, unknown> | null) => Promise<unknown>;\n\tbatchExtractFiles: (files: File[], config: Record<string, unknown> | null) => Promise<unknown>;\n\n\tdetectMimeFromBytes: (data: Uint8Array) => string;\n\tnormalizeMimeType: (mimeType: string) => string;\n\tgetMimeFromExtension: (extension: string) => string | null;\n\tgetExtensionsForMime: (mimeType: string) => string[];\n\n\tloadConfigFromString: (content: string, format: string) => Record<string, unknown>;\n\tdiscoverConfig: () => Record<string, unknown>;\n\n\tversion: () => string;\n\tget_module_info: () => ModuleInfo;\n\n\tregister_ocr_backend: (backend: unknown) => void;\n\tunregister_ocr_backend: (name: string) => void;\n\tlist_ocr_backends: () => string[];\n\tclear_ocr_backends: () => void;\n\n\tregister_post_processor: (processor: unknown) => void;\n\tunregister_post_processor: (name: string) => void;\n\tlist_post_processors: () => string[];\n\tclear_post_processors: () => void;\n\n\tregister_validator: (validator: unknown) => void;\n\tunregister_validator: (name: string) => void;\n\tlist_validators: () => string[];\n\tclear_validators: () => void;\n\n\tinitialize_pdfium_render: (pdfiumWasmModule: unknown, localWasmModule: unknown, debug: boolean) => boolean;\n\tread_block_from_callback_wasm: (param: number, position: number, pBuf: number, size: number) => number;\n\twrite_block_from_callback_wasm: (param: number, buf: number, size: number) => number;\n\n\tocrIsAvailable?: () => boolean;\n\tocrRecognize?: (imageBytes: Uint8Array, tessdata: Uint8Array, language: string) => string;\n\tocrRecognizeRaw?: (\n\t\timageData: Uint8Array,\n\t\twidth: number,\n\t\theight: number,\n\t\tbytesPerPixel: number,\n\t\tbytesPerLine: number,\n\t\ttessdata: Uint8Array,\n\t\tlanguage: string,\n\t) => string;\n\tocrTesseractVersion?: () => string;\n\n\tdefault?: (moduleOrPath?: BufferSource | WebAssembly.Module | string | URL | Response | Request) => Promise<void>;\n};\n\nexport type ModuleInfo = {\n\tname: () => string;\n\tversion: () => string;\n\tfree: () => void;\n};\n\n/** WASM module instance */\nlet wasm: WasmModule | null = null;\n\n/** Initialize flag */\nlet initialized = false;\n\n/** Initialization error (if any) */\nlet initializationError: Error | null = null;\n\n/** Initialization promise for handling concurrent init calls */\nlet initializationPromise: Promise<void> | null = null;\n\n/**\n * Get the loaded WASM module\n *\n * @returns The WASM module instance or null if not loaded\n * @internal\n */\nexport function getWasmModule(): WasmModule | null {\n\treturn wasm;\n}\n\n/**\n * Set the WASM module instance\n *\n * @param module The WASM module instance\n * @internal\n */\nexport function setWasmModule(module: WasmModule): void {\n\twasm = module;\n}\n\n/**\n * Check if WASM module is initialized\n *\n * @returns True if WASM module is initialized, false otherwise\n */\nexport function isInitialized(): boolean {\n\treturn initialized;\n}\n\n/**\n * Set the initialized flag\n *\n * @param value The initialized state\n * @internal\n */\nexport function setInitialized(value: boolean): void {\n\tinitialized = value;\n}\n\n/**\n * Get initialization error if module failed to load\n *\n * @returns The error that occurred during initialization, or null if no error\n * @internal\n */\nexport function getInitializationError(): Error | null {\n\treturn initializationError;\n}\n\n/**\n * Set the initialization error\n *\n * @param error The error that occurred during initialization\n * @internal\n */\nexport function setInitializationError(error: Error | null): void {\n\tinitializationError = error;\n}\n\n/**\n * Get the current initialization promise\n *\n * @returns The initialization promise or null if not initializing\n * @internal\n */\nexport function getInitializationPromise(): Promise<void> | null {\n\treturn initializationPromise;\n}\n\n/**\n * Set the initialization promise\n *\n * @param promise The initialization promise\n * @internal\n */\nexport function setInitializationPromise(promise: Promise<void> | null): void {\n\tinitializationPromise = promise;\n}\n","/**\n * WASM Module Loader\n *\n * Handles WASM module loading, initialization, and state management.\n * Provides a clean interface for loading the Kreuzberg WASM module\n * with support for concurrent initialization calls.\n */\n\nimport { wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport { hasWasm, isEdgeEnvironment, isNode } from \"../runtime.js\";\nimport { initializePdfiumAsync } from \"./pdfium-loader.js\";\n\n/**\n * Options for initializing the WASM module.\n */\nexport interface InitWasmOptions {\n\t/**\n\t * A pre-loaded WebAssembly.Module for the Kreuzberg WASM binary.\n\t *\n\t * Required in edge environments (Cloudflare Workers, Vercel Edge) where\n\t * the runtime cannot fetch `file://` URLs. Import the `.wasm` file as a\n\t * static import in your worker and pass it here.\n\t *\n\t * @example Cloudflare Workers\n\t * ```typescript\n\t * import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n\t * import { initWasm } from '@kreuzberg/wasm';\n\t *\n\t * export default {\n\t * async fetch(request: Request): Promise<Response> {\n\t * await initWasm({ wasmModule });\n\t * // ... use extraction functions\n\t * }\n\t * };\n\t * ```\n\t */\n\twasmModule?: WebAssembly.Module;\n}\n\n/**\n * Load WASM binary from file system in Node.js environment.\n * Returns undefined in browser environments (fetch will be used instead).\n */\nasync function loadWasmBinaryForNode(): Promise<Uint8Array | undefined> {\n\tif (!isNode()) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\t// Dynamic import to avoid bundling Node.js modules\n\t\tconst fs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\tconst path = await import(/* @vite-ignore */ \"node:path\");\n\t\tconst url = await import(/* @vite-ignore */ \"node:url\");\n\n\t\t// Resolve the WASM file path relative to this module\n\t\t// The module is in dist/initialization/wasm-loader.js\n\t\t// The WASM file is in dist/pkg/kreuzberg_wasm_bg.wasm\n\t\tconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\t\tconst wasmPath = path.join(__dirname, \"..\", \"pkg\", \"kreuzberg_wasm_bg.wasm\");\n\n\t\tconst wasmBuffer = await fs.readFile(wasmPath);\n\t\treturn new Uint8Array(wasmBuffer);\n\t} catch {\n\t\t// Fall back to fetch-based loading if file system access fails\n\t\treturn undefined;\n\t}\n}\n\nimport {\n\tgetInitializationError,\n\tgetInitializationPromise,\n\tgetWasmModule,\n\tisInitialized,\n\ttype ModuleInfo,\n\tsetInitializationError,\n\tsetInitializationPromise,\n\tsetInitialized,\n\tsetWasmModule,\n\ttype WasmModule,\n} from \"./state.js\";\n\nexport type { WasmModule, ModuleInfo };\n\n/**\n * Get the loaded WASM module\n *\n * @returns The WASM module instance or null if not loaded\n * @internal\n */\nexport { getWasmModule };\n\n/**\n * Check if WASM module is initialized\n *\n * @returns True if WASM module is initialized, false otherwise\n */\nexport { isInitialized };\n\n/**\n * Get initialization error if module failed to load\n *\n * @returns The error that occurred during initialization, or null if no error\n * @internal\n */\nexport { getInitializationError };\n\n/**\n * Get WASM module version\n *\n * @throws {Error} If WASM module is not initialized\n * @returns The version string of the WASM module\n */\nexport function getVersion(): string {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasmModule = getWasmModule();\n\tif (!wasmModule) {\n\t\tthrow new Error(\"WASM module not loaded. Call initWasm() first.\");\n\t}\n\n\treturn wasmModule.version();\n}\n\n/**\n * Initialize the WASM module\n *\n * This function must be called once before using any extraction functions.\n * It loads and initializes the WASM module in the current runtime environment,\n * automatically selecting the appropriate WASM variant for the detected runtime.\n *\n * Multiple calls to initWasm() are safe and will return immediately if already initialized.\n *\n * @param options - Optional configuration for WASM initialization\n * @throws {Error} If WASM module fails to load or is not supported in the current environment\n *\n * @example Basic Usage (Node.js / Browser)\n * ```typescript\n * import { initWasm } from '@kreuzberg/wasm';\n *\n * async function main() {\n * await initWasm();\n * // Now you can use extraction functions\n * }\n *\n * main().catch(console.error);\n * ```\n *\n * @example Cloudflare Workers\n * ```typescript\n * import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n * import { initWasm, extractBytes } from '@kreuzberg/wasm';\n *\n * export default {\n * async fetch(request: Request): Promise<Response> {\n * await initWasm({ wasmModule });\n * const bytes = new Uint8Array(await request.arrayBuffer());\n * const result = await extractBytes(bytes, 'application/pdf');\n * return new Response(JSON.stringify(result));\n * }\n * };\n * ```\n *\n * @example With Error Handling\n * ```typescript\n * import { initWasm, getWasmCapabilities } from '@kreuzberg/wasm';\n *\n * async function initializeKreuzberg() {\n * const caps = getWasmCapabilities();\n * if (!caps.hasWasm) {\n * throw new Error('WebAssembly is not supported in this environment');\n * }\n *\n * try {\n * await initWasm();\n * console.log('Kreuzberg initialized successfully');\n * } catch (error) {\n * console.error('Failed to initialize Kreuzberg:', error);\n * throw error;\n * }\n * }\n * ```\n */\nexport async function initWasm(options?: InitWasmOptions): Promise<void> {\n\tif (isInitialized()) {\n\t\treturn;\n\t}\n\n\tlet currentPromise = getInitializationPromise();\n\tif (currentPromise) {\n\t\treturn currentPromise;\n\t}\n\n\tcurrentPromise = (async () => {\n\t\ttry {\n\t\t\tif (!hasWasm()) {\n\t\t\t\tthrow new Error(\"WebAssembly is not supported in this environment\");\n\t\t\t}\n\n\t\t\t// Import the wasm-bindgen JS glue module. We try multiple paths to handle:\n\t\t\t// - URL-based: ../pkg/ (workspace-linked), ./kreuzberg_wasm.js (legacy)\n\t\t\t// - String-based: ./pkg/, ../pkg/ (edge runtimes that can't resolve file:// URLs)\n\t\t\t// String paths use variable construction to avoid Vite static analysis failures.\n\t\t\tconst baseUrl = new URL(import.meta.url);\n\t\t\tconst modulePaths = [\n\t\t\t\tnew URL(\"../pkg/kreuzberg_wasm.js\", baseUrl).href,\n\t\t\t\tnew URL(\"./kreuzberg_wasm.js\", baseUrl).href,\n\t\t\t\t[\".\", \"pkg\", \"kreuzberg_wasm.js\"].join(\"/\"),\n\t\t\t\t[\"..\", \"pkg\", \"kreuzberg_wasm.js\"].join(\"/\"),\n\t\t\t];\n\n\t\t\tlet wasmModule: unknown;\n\t\t\tlet lastError: unknown;\n\t\t\tfor (const modulePath of modulePaths) {\n\t\t\t\ttry {\n\t\t\t\t\twasmModule = await import(/* @vite-ignore */ modulePath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlastError = e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!wasmModule) {\n\t\t\t\tthrow lastError;\n\t\t\t}\n\t\t\tconst loadedModule = wasmModule as unknown as WasmModule;\n\t\t\tsetWasmModule(loadedModule);\n\n\t\t\tif (loadedModule && typeof loadedModule.default === \"function\") {\n\t\t\t\t// If a WebAssembly.Module was provided (e.g. for Cloudflare Workers), use it directly.\n\t\t\t\tif (options?.wasmModule) {\n\t\t\t\t\tawait loadedModule.default(options.wasmModule);\n\t\t\t\t} else {\n\t\t\t\t\t// In Node.js, load WASM binary from file system to avoid fetch issues\n\t\t\t\t\t// In browsers, the default() function uses fetch with import.meta.url\n\t\t\t\t\tconst wasmBinary = await loadWasmBinaryForNode();\n\t\t\t\t\tif (wasmBinary) {\n\t\t\t\t\t\tawait loadedModule.default(wasmBinary);\n\t\t\t\t\t} else if (isEdgeEnvironment()) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Edge environment detected (Cloudflare Workers / Vercel Edge). \" +\n\t\t\t\t\t\t\t\t\"Cannot automatically load .wasm file because fetch() does not support file:// URLs. \" +\n\t\t\t\t\t\t\t\t\"Pass the WASM module explicitly:\\n\\n\" +\n\t\t\t\t\t\t\t\t\" import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\\n\" +\n\t\t\t\t\t\t\t\t\" await initWasm({ wasmModule });\\n\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait loadedModule.default();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (loadedModule && typeof loadedModule.initialize_pdfium_render === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tawait initializePdfiumAsync(loadedModule);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\"PDFium auto-initialization failed (PDF extraction disabled):\", error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetInitialized(true);\n\t\t\tsetInitializationError(null);\n\t\t} catch (error) {\n\t\t\tsetInitializationError(error instanceof Error ? error : new Error(String(error)));\n\t\t\tthrow wrapWasmError(error, \"initializing Kreuzberg WASM module\");\n\t\t}\n\t})();\n\n\tsetInitializationPromise(currentPromise);\n\treturn currentPromise;\n}\n","/**\n * Internal extraction module helpers\n *\n * Provides internal utilities and access to the WASM module state.\n * Re-exports state management from the centralized state module.\n */\n\nimport {\n\tgetWasmModule as getWasmModuleFromState,\n\tisInitialized as isInitializedFromState,\n\ttype WasmModule,\n} from \"../initialization/state.js\";\n\n/**\n * Get the WASM module\n *\n * @returns The WASM module\n * @throws {Error} If WASM module is not loaded\n */\nexport function getWasmModule(): WasmModule {\n\tconst wasm = getWasmModuleFromState();\n\tif (!wasm) {\n\t\tthrow new Error(\"WASM module not loaded. Call initWasm() first.\");\n\t}\n\n\treturn wasm;\n}\n\n/**\n * Check if WASM module is initialized\n *\n * @returns True if WASM module is initialized\n */\nexport function isInitialized(): boolean {\n\treturn isInitializedFromState();\n}\n","/**\n * Byte-based extraction functions\n *\n * Provides synchronous and asynchronous extraction functions for document bytes.\n */\n\nimport { configToJS, jsToExtractionResult, wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport type { ExtractionConfig as ExtractionConfigType, ExtractionResult } from \"../types.js\";\nimport { getWasmModule, isInitialized } from \"./internal.js\";\n\n/**\n * Extract content from bytes (document data)\n *\n * Extracts text, metadata, tables, images, and other content from document bytes.\n * Automatically detects document type from MIME type and applies appropriate extraction logic.\n *\n * @param data - The document bytes to extract from\n * @param mimeType - MIME type of the document (e.g., 'application/pdf', 'image/jpeg')\n * @param config - Optional extraction configuration\n * @returns Promise resolving to the extraction result\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example Extract PDF\n * ```typescript\n * const bytes = new Uint8Array(buffer);\n * const result = await extractBytes(bytes, 'application/pdf');\n * console.log(result.content);\n * console.log(result.tables);\n * ```\n *\n * @example Extract with Configuration\n * ```typescript\n * const result = await extractBytes(bytes, 'application/pdf', {\n * ocr: {\n * backend: 'tesseract',\n * language: 'deu' // German\n * },\n * images: {\n * extractImages: true,\n * targetDpi: 200\n * }\n * });\n * ```\n *\n * @example Extract from File\n * ```typescript\n * const file = inputEvent.target.files[0];\n * const bytes = await fileToUint8Array(file);\n * const result = await extractBytes(bytes, file.type);\n * ```\n */\nexport async function extractBytes(\n\tdata: Uint8Array,\n\tmimeType: string,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!data || data.length === 0) {\n\t\t\tthrow new Error(\"Document data cannot be empty\");\n\t\t}\n\n\t\tif (!mimeType) {\n\t\t\tthrow new Error(\"MIME type is required\");\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst result = await wasm.extractBytes(data, mimeType, normalizedConfig);\n\n\t\tif (!result) {\n\t\t\tthrow new Error(\"Invalid extraction result: no result from WASM module\");\n\t\t}\n\n\t\treturn jsToExtractionResult(result);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"extracting from bytes\");\n\t}\n}\n\n/**\n * Extract content from bytes synchronously\n *\n * Synchronous version of {@link extractBytes}. Extracts text, metadata, tables,\n * and other content from document bytes without async/await.\n *\n * **Note:** This function blocks the current thread until extraction completes.\n * For large documents, prefer the async {@link extractBytes} function.\n *\n * @param data - The document bytes to extract from\n * @param mimeType - MIME type of the document (e.g., 'application/pdf', 'image/jpeg')\n * @param config - Optional extraction configuration\n * @returns The extraction result\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example\n * ```typescript\n * const bytes = new Uint8Array(buffer);\n * const result = extractBytesSync(bytes, 'text/plain');\n * console.log(result.content);\n * ```\n */\nexport function extractBytesSync(\n\tdata: Uint8Array,\n\tmimeType: string,\n\tconfig?: ExtractionConfigType | null,\n): ExtractionResult {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!data || data.length === 0) {\n\t\t\tthrow new Error(\"Document data cannot be empty\");\n\t\t}\n\n\t\tif (!mimeType) {\n\t\t\tthrow new Error(\"MIME type is required\");\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst result = wasm.extractBytesSync(data, mimeType, normalizedConfig);\n\n\t\tif (!result) {\n\t\t\tthrow new Error(\"Invalid extraction result: no result from WASM module\");\n\t\t}\n\n\t\treturn jsToExtractionResult(result);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"extracting from bytes (sync)\");\n\t}\n}\n","/**\n * File-based extraction functions\n *\n * Provides extraction functions for files in filesystem-based environments (Node.js, Deno, Bun)\n * and browser File/Blob objects.\n */\n\nimport { fileToUint8Array, wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport { detectRuntime } from \"../runtime.js\";\nimport type { ExtractionConfig as ExtractionConfigType, ExtractionResult } from \"../types.js\";\nimport { extractBytes } from \"./bytes.js\";\nimport { getWasmModule, isInitialized } from \"./internal.js\";\n\n/**\n * Extract content from a file on the file system\n *\n * Node.js and Deno specific function that reads a file from the file system\n * and extracts content from it. Automatically detects MIME type if not provided.\n *\n * @param path - Path to the file to extract from\n * @param mimeType - Optional MIME type of the file. If not provided, will attempt to detect\n * @param config - Optional extraction configuration\n * @returns Promise resolving to the extraction result\n * @throws {Error} If WASM module is not initialized, file doesn't exist, or extraction fails\n *\n * @example Extract with auto-detection\n * ```typescript\n * const result = await extractFile('./document.pdf');\n * console.log(result.content);\n * ```\n *\n * @example Extract with explicit MIME type\n * ```typescript\n * const result = await extractFile('./document.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');\n * ```\n *\n * @example Extract from Node.js with config\n * ```typescript\n * import { extractFile } from '@kreuzberg/wasm';\n * import { readFile } from 'fs/promises';\n *\n * const result = await extractFile('./report.xlsx', null, {\n * chunking: {\n * maxChars: 1000\n * }\n * });\n * ```\n */\nexport async function extractFile(\n\tpath: string,\n\tmimeType?: string | null,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!path) {\n\t\t\tthrow new Error(\"File path is required\");\n\t\t}\n\n\t\tconst runtime = detectRuntime();\n\t\tif (runtime === \"browser\") {\n\t\t\tthrow new Error(\"Use extractBytes with fileToUint8Array for browser environments\");\n\t\t}\n\n\t\tlet fileData: Uint8Array;\n\n\t\tif (runtime === \"node\") {\n\t\t\tconst { readFile } = await import(\"node:fs/promises\");\n\t\t\tconst buffer = await readFile(path);\n\t\t\tfileData = new Uint8Array(buffer);\n\t\t} else if (runtime === \"deno\") {\n\t\t\tconst deno = (globalThis as Record<string, unknown>).Deno as {\n\t\t\t\treadFile: (path: string) => Promise<Uint8Array>;\n\t\t\t};\n\t\t\tfileData = await deno.readFile(path);\n\t\t} else if (runtime === \"bun\") {\n\t\t\tconst { readFile } = await import(\"node:fs/promises\");\n\t\t\tconst buffer = await readFile(path);\n\t\t\tfileData = new Uint8Array(buffer);\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported runtime for file extraction: ${runtime}`);\n\t\t}\n\n\t\tlet detectedMimeType = mimeType;\n\t\tif (!detectedMimeType) {\n\t\t\tdetectedMimeType = wasm.detectMimeFromBytes(fileData);\n\t\t}\n\n\t\tif (!detectedMimeType) {\n\t\t\tthrow new Error(\"Could not detect MIME type for file. Please provide mimeType parameter.\");\n\t\t}\n\n\t\tdetectedMimeType = wasm.normalizeMimeType(detectedMimeType);\n\n\t\treturn await extractBytes(fileData, detectedMimeType, config);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, `extracting from file: ${path}`);\n\t}\n}\n\n/**\n * Extract content from a File or Blob (browser-friendly wrapper)\n *\n * Convenience function that wraps fileToUint8Array and extractBytes,\n * providing a streamlined API for browser applications handling file inputs.\n *\n * @param file - The File or Blob to extract from\n * @param mimeType - Optional MIME type. If not provided, uses file.type if available\n * @param config - Optional extraction configuration\n * @returns Promise resolving to the extraction result\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example Simple file extraction\n * ```typescript\n * const fileInput = document.getElementById('file');\n * fileInput.addEventListener('change', async (e) => {\n * const file = e.target.files?.[0];\n * if (file) {\n * const result = await extractFromFile(file);\n * console.log(result.content);\n * }\n * });\n * ```\n *\n * @example With configuration\n * ```typescript\n * const result = await extractFromFile(file, file.type, {\n * chunking: { maxChars: 1000 },\n * images: { extractImages: true }\n * });\n * ```\n */\nexport async function extractFromFile(\n\tfile: File | Blob,\n\tmimeType?: string | null,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tconst bytes = await fileToUint8Array(file);\n\t\tlet type = mimeType ?? (file instanceof File ? file.type : \"application/octet-stream\");\n\n\t\ttype = wasm.normalizeMimeType(type);\n\n\t\treturn await extractBytes(bytes, type, config);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, `extracting from ${file instanceof File ? \"file\" : \"blob\"}`);\n\t}\n}\n","/**\n * Batch extraction functions\n *\n * Provides batch processing capabilities for extracting from multiple documents\n * in a single operation for improved efficiency.\n */\n\nimport { configToJS, fileToUint8Array, jsToExtractionResult, wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport type { ExtractionConfig as ExtractionConfigType, ExtractionResult } from \"../types.js\";\nimport { getWasmModule, isInitialized } from \"./internal.js\";\n\n/**\n * Batch extract content from multiple byte arrays asynchronously\n *\n * Extracts content from multiple documents in a single batch operation,\n * allowing for more efficient processing of multiple files.\n *\n * @param files - Array of objects containing data (Uint8Array) and mimeType (string)\n * @param config - Optional extraction configuration applied to all files\n * @returns Promise resolving to array of extraction results\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example\n * ```typescript\n * const files = [\n * { data: pdfBytes, mimeType: 'application/pdf' },\n * { data: docxBytes, mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }\n * ];\n * const results = await batchExtractBytes(files);\n * results.forEach((result) => console.log(result.content));\n * ```\n */\nexport async function batchExtractBytes(\n\tfiles: Array<{ data: Uint8Array; mimeType: string }>,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult[]> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!Array.isArray(files)) {\n\t\t\tthrow new Error(\"Files parameter must be an array\");\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tthrow new Error(\"Files array cannot be empty\");\n\t\t}\n\n\t\tconst dataList: Uint8Array[] = [];\n\t\tconst mimeTypes: string[] = [];\n\n\t\tfor (let i = 0; i < files.length; i += 1) {\n\t\t\tconst file = files[i];\n\t\t\tif (!file || typeof file !== \"object\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: must be an object with data and mimeType`);\n\t\t\t}\n\n\t\t\tconst f = file as Record<string, unknown>;\n\n\t\t\tif (!(f.data instanceof Uint8Array)) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data must be Uint8Array`);\n\t\t\t}\n\n\t\t\tif (typeof f.mimeType !== \"string\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: mimeType must be a string`);\n\t\t\t}\n\n\t\t\tif (f.data.length === 0) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data cannot be empty`);\n\t\t\t}\n\n\t\t\tdataList.push(f.data);\n\t\t\tmimeTypes.push(f.mimeType);\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst results = await wasm.batchExtractBytes(dataList, mimeTypes, normalizedConfig);\n\n\t\tif (!Array.isArray(results)) {\n\t\t\tthrow new Error(\"Invalid batch extraction result: expected array\");\n\t\t}\n\n\t\treturn results.map((result, index) => {\n\t\t\tif (!result) {\n\t\t\t\tthrow new Error(`Invalid extraction result at index ${index}: no result from WASM module`);\n\t\t\t}\n\n\t\t\treturn jsToExtractionResult(result);\n\t\t});\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"batch extracting from bytes\");\n\t}\n}\n\n/**\n * Batch extract content from multiple byte arrays synchronously\n *\n * Synchronous version of {@link batchExtractBytes}. Extracts content from multiple\n * documents in a single batch operation without async/await.\n *\n * **Note:** This function blocks the current thread until all extractions complete.\n * For large batches, prefer the async {@link batchExtractBytes} function.\n *\n * @param files - Array of objects containing data (Uint8Array) and mimeType (string)\n * @param config - Optional extraction configuration applied to all files\n * @returns Array of extraction results\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example\n * ```typescript\n * const files = [\n * { data: txtBytes, mimeType: 'text/plain' },\n * { data: htmlBytes, mimeType: 'text/html' }\n * ];\n * const results = batchExtractBytesSync(files);\n * results.forEach((result) => console.log(result.content));\n * ```\n */\nexport function batchExtractBytesSync(\n\tfiles: Array<{ data: Uint8Array; mimeType: string }>,\n\tconfig?: ExtractionConfigType | null,\n): ExtractionResult[] {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!Array.isArray(files)) {\n\t\t\tthrow new Error(\"Files parameter must be an array\");\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tthrow new Error(\"Files array cannot be empty\");\n\t\t}\n\n\t\tconst dataList: Uint8Array[] = [];\n\t\tconst mimeTypes: string[] = [];\n\n\t\tfor (let i = 0; i < files.length; i += 1) {\n\t\t\tconst file = files[i];\n\t\t\tif (!file || typeof file !== \"object\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: must be an object with data and mimeType`);\n\t\t\t}\n\n\t\t\tconst f = file as Record<string, unknown>;\n\n\t\t\tif (!(f.data instanceof Uint8Array)) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data must be Uint8Array`);\n\t\t\t}\n\n\t\t\tif (typeof f.mimeType !== \"string\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: mimeType must be a string`);\n\t\t\t}\n\n\t\t\tif (f.data.length === 0) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data cannot be empty`);\n\t\t\t}\n\n\t\t\tdataList.push(f.data);\n\t\t\tmimeTypes.push(f.mimeType);\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst results = wasm.batchExtractBytesSync(dataList, mimeTypes, normalizedConfig);\n\n\t\tif (!Array.isArray(results)) {\n\t\t\tthrow new Error(\"Invalid batch extraction result: expected array\");\n\t\t}\n\n\t\treturn results.map((result, index) => {\n\t\t\tif (!result) {\n\t\t\t\tthrow new Error(`Invalid extraction result at index ${index}: no result from WASM module`);\n\t\t\t}\n\n\t\t\treturn jsToExtractionResult(result);\n\t\t});\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"batch extracting from bytes (sync)\");\n\t}\n}\n\n/**\n * Batch extract content from multiple File objects asynchronously\n *\n * Convenience function that converts File objects to Uint8Array and calls batchExtractBytes.\n * Automatically uses the file.type as MIME type if available.\n *\n * @param files - Array of File objects to extract from\n * @param config - Optional extraction configuration applied to all files\n * @returns Promise resolving to array of extraction results\n * @throws {Error} If WASM module is not initialized, files cannot be read, or extraction fails\n *\n * @example\n * ```typescript\n * const fileInput = document.getElementById('files');\n * const files = Array.from(fileInput.files ?? []);\n * const results = await batchExtractFiles(files);\n * results.forEach((result, index) => {\n * console.log(`File ${index}: ${result.content.substring(0, 50)}...`);\n * });\n * ```\n */\nexport async function batchExtractFiles(\n\tfiles: File[],\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult[]> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\ttry {\n\t\tif (!Array.isArray(files)) {\n\t\t\tthrow new Error(\"Files parameter must be an array\");\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tthrow new Error(\"Files array cannot be empty\");\n\t\t}\n\n\t\tconst byteFiles: Array<{ data: Uint8Array; mimeType: string }> = [];\n\n\t\tfor (let i = 0; i < files.length; i += 1) {\n\t\t\tconst file = files[i];\n\t\t\tif (!(file instanceof File)) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: must be a File object`);\n\t\t\t}\n\n\t\t\tconst bytes = await fileToUint8Array(file);\n\t\t\tbyteFiles.push({\n\t\t\t\tdata: bytes,\n\t\t\t\tmimeType: file.type || \"application/octet-stream\",\n\t\t\t});\n\t\t}\n\n\t\treturn await batchExtractBytes(byteFiles, config);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"batch extracting from files\");\n\t}\n}\n","/**\n * OCR Backend Registry\n *\n * Provides a registry for OCR backends in the WASM environment.\n * This enables auto-registration and management of OCR backends.\n *\n * Note: The WASM package provides a lightweight registry in the browser.\n * For more advanced features like Rust integration, use @kreuzberg/node or @kreuzberg/deno.\n *\n * @example\n * ```typescript\n * import { TesseractWasmBackend } from '@kreuzberg/wasm/ocr/tesseract-wasm-backend';\n * import { enableOcr } from '@kreuzberg/wasm';\n *\n * // Simple auto-registration\n * await enableOcr();\n * ```\n */\n\nimport type { OcrBackendProtocol } from \"../types.js\";\n\n/** Global registry of OCR backends */\nconst ocrBackendRegistry = new Map<string, OcrBackendProtocol>();\n\n/**\n * Register an OCR backend\n *\n * Registers an OCR backend with the WASM extraction pipeline.\n * If a backend with the same name is already registered, it will be replaced.\n *\n * @param backend - OCR backend implementing OcrBackendProtocol\n * @throws {Error} If backend validation fails\n *\n * @example\n * ```typescript\n * import { TesseractWasmBackend } from '@kreuzberg/wasm/ocr/tesseract-wasm-backend';\n * import { registerOcrBackend } from '@kreuzberg/wasm/ocr/registry';\n *\n * const backend = new TesseractWasmBackend();\n * await backend.initialize();\n * registerOcrBackend(backend);\n * ```\n */\nexport function registerOcrBackend(backend: OcrBackendProtocol): void {\n\tif (!backend) {\n\t\tthrow new Error(\"Backend cannot be null or undefined\");\n\t}\n\n\tif (typeof backend.name !== \"function\") {\n\t\tthrow new Error(\"Backend must implement name() method\");\n\t}\n\n\tif (typeof backend.supportedLanguages !== \"function\") {\n\t\tthrow new Error(\"Backend must implement supportedLanguages() method\");\n\t}\n\n\tif (typeof backend.processImage !== \"function\") {\n\t\tthrow new Error(\"Backend must implement processImage() method\");\n\t}\n\n\tconst backendName = backend.name();\n\n\tif (!backendName || typeof backendName !== \"string\") {\n\t\tthrow new Error(\"Backend name must be a non-empty string\");\n\t}\n\n\tif (ocrBackendRegistry.has(backendName)) {\n\t\tconsole.warn(`OCR backend \"${backendName}\" is already registered and will be replaced`);\n\t}\n\n\tocrBackendRegistry.set(backendName, backend);\n}\n\n/**\n * Get a registered OCR backend by name\n *\n * @param name - Backend name\n * @returns The OCR backend or undefined if not found\n *\n * @example\n * ```typescript\n * import { getOcrBackend } from '@kreuzberg/wasm/ocr/registry';\n *\n * const backend = getOcrBackend('tesseract-wasm');\n * if (backend) {\n * console.log('Available languages:', backend.supportedLanguages());\n * }\n * ```\n */\nexport function getOcrBackend(name: string): OcrBackendProtocol | undefined {\n\treturn ocrBackendRegistry.get(name);\n}\n\n/**\n * List all registered OCR backends\n *\n * @returns Array of registered backend names\n *\n * @example\n * ```typescript\n * import { listOcrBackends } from '@kreuzberg/wasm/ocr/registry';\n *\n * const backends = listOcrBackends();\n * console.log('Available OCR backends:', backends);\n * ```\n */\nexport function listOcrBackends(): string[] {\n\treturn Array.from(ocrBackendRegistry.keys());\n}\n\n/**\n * Unregister an OCR backend\n *\n * @param name - Backend name to unregister\n * @throws {Error} If backend is not found\n *\n * @example\n * ```typescript\n * import { unregisterOcrBackend } from '@kreuzberg/wasm/ocr/registry';\n *\n * unregisterOcrBackend('tesseract-wasm');\n * ```\n */\nexport async function unregisterOcrBackend(name: string): Promise<void> {\n\tconst backend = ocrBackendRegistry.get(name);\n\n\tif (!backend) {\n\t\treturn;\n\t}\n\n\tif (typeof backend.shutdown === \"function\") {\n\t\ttry {\n\t\t\tawait backend.shutdown();\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`Error shutting down OCR backend \"${name}\": ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tocrBackendRegistry.delete(name);\n}\n\n/**\n * Clear all registered OCR backends\n *\n * Unregisters all OCR backends and calls their shutdown methods.\n *\n * @example\n * ```typescript\n * import { clearOcrBackends } from '@kreuzberg/wasm/ocr/registry';\n *\n * // Clean up all backends when shutting down\n * await clearOcrBackends();\n * ```\n */\nexport async function clearOcrBackends(): Promise<void> {\n\tconst backends = Array.from(ocrBackendRegistry.entries());\n\n\tfor (const [name, backend] of backends) {\n\t\tif (typeof backend.shutdown === \"function\") {\n\t\t\ttry {\n\t\t\t\tawait backend.shutdown();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Error shutting down OCR backend \"${name}\": ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tocrBackendRegistry.clear();\n}\n","/**\n * Tesseract WASM OCR Backend\n *\n * Provides OCR capabilities using tesseract-wasm library for browser environments.\n * Loads training data on-demand from jsDelivr CDN and implements the OcrBackendProtocol.\n *\n * ## Browser-Only Requirement\n *\n * This backend requires browser APIs like createImageBitmap and Web Workers.\n * It will NOT work in Node.js environments without additional canvas polyfills.\n *\n * ## Supported Languages\n *\n * Common ISO 639-1 and ISO 639-2 codes:\n * - English: \"eng\"\n * - German: \"deu\"\n * - French: \"fra\"\n * - Spanish: \"spa\"\n * - Italian: \"ita\"\n * - Portuguese: \"por\"\n * - Dutch: \"nld\"\n * - Russian: \"rus\"\n * - Chinese (Simplified): \"chi_sim\"\n * - Chinese (Traditional): \"chi_tra\"\n * - Japanese: \"jpn\"\n * - Korean: \"kor\"\n * - Arabic: \"ara\"\n * - Hindi: \"hin\"\n *\n * For complete language list, see: https://github.com/naptha/tesseract.js\n *\n * @example Basic Usage\n * ```typescript\n * import { TesseractWasmBackend } from '@kreuzberg/wasm/ocr/tesseract-wasm-backend';\n * import { registerOcrBackend, extractBytes, initWasm } from '@kreuzberg/wasm';\n *\n * // Initialize\n * await initWasm();\n * const backend = new TesseractWasmBackend();\n * await backend.initialize();\n * registerOcrBackend(backend);\n *\n * // Use in extraction\n * const imageBytes = new Uint8Array(buffer);\n * const result = await extractBytes(imageBytes, 'image/png', {\n * ocr: { backend: 'tesseract-wasm', language: 'eng' }\n * });\n * console.log(result.content); // Extracted text\n * ```\n *\n * @example With Language Auto-Detection\n * ```typescript\n * const backend = new TesseractWasmBackend();\n * await backend.initialize();\n * registerOcrBackend(backend);\n *\n * // Extract without specifying language - backend will auto-detect\n * const result = await extractBytes(imageBytes, 'image/png', {\n * ocr: { backend: 'tesseract-wasm' } // language will auto-detect\n * });\n * ```\n */\n\nimport type { OcrBackendProtocol } from \"../types.js\";\n\n/**\n * Tesseract WASM Client interface\n * Type definition for tesseract-wasm's OCRClient class\n */\ninterface TesseractClient {\n\tloadModel(modelPath: string): Promise<void>;\n\tloadImage(image: ImageBitmap | Blob): Promise<void>;\n\tgetText(): Promise<string>;\n\tgetConfidence(): Promise<number>;\n\tgetPageMetadata(): Promise<Record<string, unknown>>;\n\tdestroy(): void;\n\tterminate(): void;\n}\n\n/**\n * TesseractWasmBackend - OCR backend using tesseract-wasm library\n *\n * Implements the OcrBackendProtocol for Kreuzberg document extraction pipeline.\n * Provides comprehensive OCR support with model caching, error handling, and progress reporting.\n */\nexport class TesseractWasmBackend implements OcrBackendProtocol {\n\t/** Tesseract WASM client instance */\n\tprivate client: TesseractClient | null = null;\n\n\t/** Track which models are currently loaded to avoid redundant loads */\n\tprivate loadedLanguages: Set<string> = new Set();\n\n\t/** Cache for language availability validation */\n\tprivate supportedLangsCache: string[] | null = null;\n\n\t/** Progress callback for UI updates */\n\tprivate progressCallback: ((progress: number) => void) | null = null;\n\n\t/** Base URL for training data CDN */\n\tprivate readonly CDN_BASE_URL = \"https://cdn.jsdelivr.net/npm/tesseract-wasm@0.11.0/dist\";\n\n\t/**\n\t * Return the unique name of this OCR backend\n\t *\n\t * @returns Backend identifier \"tesseract-wasm\"\n\t */\n\tname(): string {\n\t\treturn \"tesseract-wasm\";\n\t}\n\n\t/**\n\t * Return list of supported language codes\n\t *\n\t * Returns a curated list of commonly available Tesseract language models.\n\t * Tesseract supports many more languages through custom models.\n\t *\n\t * @returns Array of ISO 639-1/2/3 language codes\n\t */\n\tsupportedLanguages(): string[] {\n\t\tif (this.supportedLangsCache) {\n\t\t\treturn this.supportedLangsCache;\n\t\t}\n\n\t\tthis.supportedLangsCache = [\n\t\t\t\"eng\",\n\t\t\t\"deu\",\n\t\t\t\"fra\",\n\t\t\t\"spa\",\n\t\t\t\"ita\",\n\t\t\t\"por\",\n\t\t\t\"nld\",\n\t\t\t\"rus\",\n\t\t\t\"jpn\",\n\t\t\t\"kor\",\n\t\t\t\"chi_sim\",\n\t\t\t\"chi_tra\",\n\n\t\t\t\"pol\",\n\t\t\t\"tur\",\n\t\t\t\"swe\",\n\t\t\t\"dan\",\n\t\t\t\"fin\",\n\t\t\t\"nor\",\n\t\t\t\"ces\",\n\t\t\t\"slk\",\n\t\t\t\"ron\",\n\t\t\t\"hun\",\n\t\t\t\"hrv\",\n\t\t\t\"srp\",\n\t\t\t\"bul\",\n\t\t\t\"ukr\",\n\t\t\t\"ell\",\n\n\t\t\t\"ara\",\n\t\t\t\"heb\",\n\t\t\t\"hin\",\n\t\t\t\"tha\",\n\t\t\t\"vie\",\n\t\t\t\"mkd\",\n\t\t\t\"ben\",\n\t\t\t\"tam\",\n\t\t\t\"tel\",\n\t\t\t\"kan\",\n\t\t\t\"mal\",\n\t\t\t\"mya\",\n\t\t\t\"khm\",\n\t\t\t\"lao\",\n\t\t\t\"sin\",\n\t\t];\n\n\t\treturn this.supportedLangsCache;\n\t}\n\n\t/**\n\t * Initialize the OCR backend\n\t *\n\t * Creates the Tesseract WASM client instance. This is called once when\n\t * the backend is registered with the extraction pipeline.\n\t *\n\t * The actual model loading happens in processImage() on-demand to avoid\n\t * loading all models upfront.\n\t *\n\t * @throws {Error} If tesseract-wasm is not available or initialization fails\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * try {\n\t * await backend.initialize();\n\t * } catch (error) {\n\t * console.error('Failed to initialize OCR:', error);\n\t * }\n\t * ```\n\t */\n\tasync initialize(): Promise<void> {\n\t\tif (this.client) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst tesseractModule = await this.loadTesseractWasm();\n\n\t\t\t// @ts-expect-error - tesseract-wasm types are not fully typed\n\t\t\tif (!tesseractModule || typeof tesseractModule.OCRClient !== \"function\") {\n\t\t\t\tthrow new Error(\"tesseract-wasm OCRClient not found. Ensure tesseract-wasm is installed and available.\");\n\t\t\t}\n\n\t\t\t// @ts-expect-error - tesseract-wasm types are not fully typed\n\t\t\tthis.client = new tesseractModule.OCRClient();\n\n\t\t\tthis.loadedLanguages.clear();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Failed to initialize TesseractWasmBackend: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Process image bytes and extract text via OCR\n\t *\n\t * Handles image loading, model loading, OCR processing, and result formatting.\n\t * Automatically loads the language model on first use and caches it for subsequent calls.\n\t *\n\t * @param imageBytes - Raw image data (Uint8Array) or Base64-encoded string\n\t * @param language - ISO 639-2/3 language code (e.g., \"eng\", \"deu\")\n\t * @returns Promise resolving to OCR result with content and metadata\n\t * @throws {Error} If image processing fails, model loading fails, or language is unsupported\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * await backend.initialize();\n\t *\n\t * const imageBuffer = fs.readFileSync('scanned.png');\n\t * const result = await backend.processImage(\n\t * new Uint8Array(imageBuffer),\n\t * 'eng'\n\t * );\n\t *\n\t * console.log(result.content); // Extracted text\n\t * console.log(result.metadata.confidence); // OCR confidence score\n\t * ```\n\t */\n\tasync processImage(\n\t\timageBytes: Uint8Array | string,\n\t\tlanguage: string,\n\t): Promise<{\n\t\tcontent: string;\n\t\tmime_type: string;\n\t\tmetadata: Record<string, unknown>;\n\t\ttables: unknown[];\n\t}> {\n\t\tif (!this.client) {\n\t\t\tthrow new Error(\"TesseractWasmBackend not initialized. Call initialize() first.\");\n\t\t}\n\n\t\tconst supported = this.supportedLanguages();\n\t\tconst normalizedLang = language.toLowerCase();\n\t\tconst isSupported = supported.some((lang) => lang.toLowerCase() === normalizedLang);\n\n\t\tif (!isSupported) {\n\t\t\tthrow new Error(`Language \"${language}\" is not supported. Supported languages: ${supported.join(\", \")}`);\n\t\t}\n\n\t\ttry {\n\t\t\tif (!this.loadedLanguages.has(normalizedLang)) {\n\t\t\t\tthis.reportProgress(10);\n\t\t\t\tawait this.loadLanguageModel(normalizedLang);\n\t\t\t\tthis.loadedLanguages.add(normalizedLang);\n\t\t\t\tthis.reportProgress(30);\n\t\t\t}\n\n\t\t\tthis.reportProgress(40);\n\t\t\tconst imageBitmap = await this.convertToImageBitmap(imageBytes);\n\n\t\t\tthis.reportProgress(50);\n\t\t\tawait this.client.loadImage(imageBitmap);\n\n\t\t\tthis.reportProgress(70);\n\t\t\tconst text = await this.client.getText();\n\n\t\t\tconst confidence = await this.getConfidenceScore();\n\t\t\tconst pageMetadata = await this.getPageMetadata();\n\n\t\t\tthis.reportProgress(90);\n\n\t\t\treturn {\n\t\t\t\tcontent: text,\n\t\t\t\tmime_type: \"text/plain\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tlanguage: normalizedLang,\n\t\t\t\t\tconfidence,\n\t\t\t\t\t...pageMetadata,\n\t\t\t\t},\n\t\t\t\ttables: [],\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`OCR processing failed for language \"${language}\": ${message}`);\n\t\t} finally {\n\t\t\tthis.reportProgress(100);\n\t\t}\n\t}\n\n\t/**\n\t * Shutdown the OCR backend and release resources\n\t *\n\t * Properly cleans up the Tesseract WASM client, freeing memory and Web Workers.\n\t * Called when the backend is unregistered or the application shuts down.\n\t *\n\t * @throws {Error} If cleanup fails (errors are logged but not critical)\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * await backend.initialize();\n\t * // ... use backend ...\n\t * await backend.shutdown(); // Clean up resources\n\t * ```\n\t */\n\tasync shutdown(): Promise<void> {\n\t\ttry {\n\t\t\tif (this.client) {\n\t\t\t\tif (typeof this.client.destroy === \"function\") {\n\t\t\t\t\tthis.client.destroy();\n\t\t\t\t}\n\t\t\t\tif (typeof this.client.terminate === \"function\") {\n\t\t\t\t\tthis.client.terminate();\n\t\t\t\t}\n\t\t\t\tthis.client = null;\n\t\t\t}\n\n\t\t\tthis.loadedLanguages.clear();\n\t\t\tthis.supportedLangsCache = null;\n\t\t\tthis.progressCallback = null;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`Warning during TesseractWasmBackend shutdown: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Set a progress callback for UI updates\n\t *\n\t * Allows the UI to display progress during OCR processing.\n\t * The callback will be called with values from 0 to 100.\n\t *\n\t * @param callback - Function to call with progress percentage\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * backend.setProgressCallback((progress) => {\n\t * console.log(`OCR Progress: ${progress}%`);\n\t * document.getElementById('progress-bar').style.width = `${progress}%`;\n\t * });\n\t * ```\n\t */\n\tsetProgressCallback(callback: (progress: number) => void): void {\n\t\tthis.progressCallback = callback;\n\t}\n\n\t/**\n\t * Load language model from CDN\n\t *\n\t * Fetches the training data for a specific language from jsDelivr CDN.\n\t * This is an MVP approach - models are cached by the browser.\n\t *\n\t * @param language - ISO 639-2/3 language code\n\t * @throws {Error} If model download fails or language is not available\n\t *\n\t * @internal\n\t */\n\tprivate async loadLanguageModel(language: string): Promise<void> {\n\t\tif (!this.client) {\n\t\t\tthrow new Error(\"Client not initialized\");\n\t\t}\n\n\t\tconst modelFilename = `${language}.traineddata`;\n\t\tconst modelUrl = `${this.CDN_BASE_URL}/${modelFilename}`;\n\n\t\ttry {\n\t\t\tawait this.client.loadModel(modelUrl);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Failed to load model for language \"${language}\" from ${modelUrl}: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Convert image bytes or Base64 string to ImageBitmap\n\t *\n\t * Handles both Uint8Array and Base64-encoded image data, converting to\n\t * ImageBitmap format required by Tesseract WASM.\n\t *\n\t * @param imageBytes - Image data as Uint8Array or Base64 string\n\t * @returns Promise resolving to ImageBitmap\n\t * @throws {Error} If conversion fails (browser API not available or invalid image data)\n\t *\n\t * @internal\n\t */\n\tprivate async convertToImageBitmap(imageBytes: Uint8Array | string): Promise<ImageBitmap> {\n\t\tif (typeof createImageBitmap === \"undefined\") {\n\t\t\tthrow new Error(\"createImageBitmap is not available. TesseractWasmBackend requires a browser environment.\");\n\t\t}\n\n\t\ttry {\n\t\t\tlet bytes = imageBytes;\n\t\t\tif (typeof imageBytes === \"string\") {\n\t\t\t\tconst binaryString = atob(imageBytes);\n\t\t\t\tbytes = new Uint8Array(binaryString.length);\n\t\t\t\tfor (let i = 0; i < binaryString.length; i++) {\n\t\t\t\t\t(bytes as Uint8Array)[i] = binaryString.charCodeAt(i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst blob = new Blob([bytes as Uint8Array] as BlobPart[]);\n\n\t\t\tconst imageBitmap = await createImageBitmap(blob);\n\t\t\treturn imageBitmap;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Failed to convert image bytes to ImageBitmap: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Get confidence score from OCR result\n\t *\n\t * Attempts to retrieve confidence score from Tesseract.\n\t * Returns a safe default if unavailable.\n\t *\n\t * @returns Confidence score between 0 and 1\n\t *\n\t * @internal\n\t */\n\tprivate async getConfidenceScore(): Promise<number> {\n\t\ttry {\n\t\t\tif (this.client && typeof this.client.getConfidence === \"function\") {\n\t\t\t\tconst confidence = await this.client.getConfidence();\n\t\t\t\treturn confidence > 1 ? confidence / 100 : confidence;\n\t\t\t}\n\t\t} catch {}\n\t\treturn 0.9;\n\t}\n\n\t/**\n\t * Get page metadata from OCR result\n\t *\n\t * Retrieves additional metadata like image dimensions and processing info.\n\t *\n\t * @returns Metadata object (may be empty if unavailable)\n\t *\n\t * @internal\n\t */\n\tprivate async getPageMetadata(): Promise<Record<string, unknown>> {\n\t\ttry {\n\t\t\tif (this.client && typeof this.client.getPageMetadata === \"function\") {\n\t\t\t\treturn await this.client.getPageMetadata();\n\t\t\t}\n\t\t} catch {}\n\t\treturn {};\n\t}\n\n\t/**\n\t * Dynamically load tesseract-wasm module\n\t *\n\t * Uses dynamic import to load tesseract-wasm only when needed,\n\t * avoiding hard dependency in browser environments where it may not be bundled.\n\t *\n\t * @returns tesseract-wasm module object\n\t * @throws {Error} If module cannot be imported\n\t *\n\t * @internal\n\t */\n\tprivate async loadTesseractWasm(): Promise<unknown> {\n\t\ttry {\n\t\t\t// @ts-expect-error - tesseract-wasm has package.json exports issues with TypeScript\n\t\t\tconst module = await import(\"tesseract-wasm\");\n\t\t\treturn module;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to import tesseract-wasm. Ensure it is installed via: npm install tesseract-wasm. Error: ${message}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Report progress to progress callback\n\t *\n\t * Internal helper for notifying progress updates during OCR processing.\n\t *\n\t * @param progress - Progress percentage (0-100)\n\t *\n\t * @internal\n\t */\n\tprivate reportProgress(progress: number): void {\n\t\tif (this.progressCallback) {\n\t\t\ttry {\n\t\t\t\tthis.progressCallback(Math.min(100, Math.max(0, progress)));\n\t\t\t} catch {}\n\t\t}\n\t}\n}\n","/**\n * OCR Worker Bridge\n *\n * Manages the OCR worker lifecycle and provides an async interface for running\n * ocrRecognize() off the main thread. Falls back to direct (blocking) invocation\n * when workers are not available (e.g. edge runtimes).\n */\n\nimport { isNode } from \"../runtime.js\";\n\ninterface PendingRequest {\n\tresolve: (text: string) => void;\n\treject: (error: Error) => void;\n}\n\n/** Abstraction over Node.js Worker and browser Worker */\ninterface WorkerHandle {\n\tpostMessage(data: unknown): void;\n\tterminate(): void | Promise<unknown>;\n}\n\nlet workerHandle: WorkerHandle | null = null;\nconst pendingRequests: Map<number, PendingRequest> = new Map();\nlet nextRequestId = 0;\nlet workerReady = false;\nlet readyResolve: (() => void) | null = null;\nlet readyReject: ((error: Error) => void) | null = null;\n\n/** Whether the worker failed to initialize and we should use the direct fallback. */\nlet useFallback = false;\n\n/** Direct (blocking) fallback function, set by the enabler when creating the backend. */\nlet fallbackFn: ((imageData: Uint8Array, tessdata: Uint8Array, language: string) => string) | null = null;\n\nasync function cleanupWorker(): Promise<void> {\n\tif (workerHandle) {\n\t\tawait workerHandle.terminate();\n\t\tworkerHandle = null;\n\t}\n\tworkerReady = false;\n}\n\nfunction handleWorkerMessage(msg: Record<string, unknown>): void {\n\tswitch (msg[\"type\"]) {\n\t\tcase \"ready\":\n\t\t\tworkerReady = true;\n\t\t\treadyResolve?.();\n\t\t\treadyResolve = null;\n\t\t\treadyReject = null;\n\t\t\tbreak;\n\t\tcase \"init-error\":\n\t\t\treadyReject?.(new Error(msg[\"error\"] as string));\n\t\t\treadyResolve = null;\n\t\t\treadyReject = null;\n\t\t\tbreak;\n\t\tcase \"result\": {\n\t\t\tconst id = msg[\"id\"] as number;\n\t\t\tconst pending = pendingRequests.get(id);\n\t\t\tif (pending) {\n\t\t\t\tpendingRequests.delete(id);\n\t\t\t\tpending.resolve(msg[\"text\"] as string);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"error\": {\n\t\t\tconst id = msg[\"id\"] as number;\n\t\t\tconst pending = pendingRequests.get(id);\n\t\t\tif (pending) {\n\t\t\t\tpendingRequests.delete(id);\n\t\t\t\tpending.reject(new Error(msg[\"error\"] as string));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Create and initialize the OCR worker.\n *\n * @param wasmGluePath - Absolute path (Node.js) or URL (browser) to the WASM glue JS module\n * @param wasmBinary - Pre-loaded WASM binary (Node.js file-system loaded bytes)\n * @param directFallback - Direct blocking function used when workers are unavailable\n */\nexport async function createOcrWorker(\n\twasmGluePath: string,\n\twasmBinary: Uint8Array | undefined,\n\tdirectFallback: (imageData: Uint8Array, tessdata: Uint8Array, language: string) => string,\n): Promise<void> {\n\tfallbackFn = directFallback;\n\n\tif (workerHandle) return;\n\n\tconst readyPromise = new Promise<void>((resolve, reject) => {\n\t\treadyResolve = resolve;\n\t\treadyReject = reject;\n\t});\n\n\ttry {\n\t\tif (isNode()) {\n\t\t\tawait createNodeWorker(wasmGluePath, wasmBinary);\n\t\t} else if (typeof Worker !== \"undefined\") {\n\t\t\tawait createBrowserWorker(wasmGluePath, wasmBinary);\n\t\t} else {\n\t\t\t// No worker support — use direct fallback\n\t\t\tuseFallback = true;\n\t\t\treturn;\n\t\t}\n\n\t\t// Timeout prevents indefinite hang if the worker loads but never sends \"ready\"\n\t\t// (e.g. WASM module import fails silently inside the worker)\n\t\tconst timeoutMs = 30_000;\n\t\tconst timeout = new Promise<void>((_, reject) => {\n\t\t\tsetTimeout(() => reject(new Error(\"OCR worker initialization timed out\")), timeoutMs);\n\t\t});\n\t\tawait Promise.race([readyPromise, timeout]);\n\t} catch {\n\t\t// Worker creation or init failed — fall back to direct calls\n\t\tawait cleanupWorker();\n\t\tuseFallback = true;\n\t}\n}\n\nasync function createNodeWorker(wasmGluePath: string, wasmBinary: Uint8Array | undefined): Promise<void> {\n\tconst { Worker } = await import(/* @vite-ignore */ \"node:worker_threads\");\n\tconst nodePath = await import(/* @vite-ignore */ \"node:path\");\n\tconst nodeUrl = await import(/* @vite-ignore */ \"node:url\");\n\n\tconst __dirname = nodePath.dirname(nodeUrl.fileURLToPath(import.meta.url));\n\tconst workerPath = nodePath.join(__dirname, \"ocr-worker.js\");\n\n\tconst worker = new Worker(workerPath, {\n\t\tworkerData: { wasmGluePath, wasmBinary },\n\t});\n\n\tworker.on(\"message\", (msg: Record<string, unknown>) => handleWorkerMessage(msg));\n\tworker.on(\"error\", (err: Error) => {\n\t\t// Reject all pending requests\n\t\tfor (const pending of pendingRequests.values()) {\n\t\t\tpending.reject(err);\n\t\t}\n\t\tpendingRequests.clear();\n\t\treadyReject?.(err);\n\t});\n\n\tworkerHandle = {\n\t\tpostMessage: (data: unknown) => worker.postMessage(data),\n\t\tterminate: () => worker.terminate(),\n\t};\n}\n\nasync function createBrowserWorker(wasmGluePath: string, wasmBinary: Uint8Array | undefined): Promise<void> {\n\tconst workerUrl = new URL(\"./ocr-worker.js\", import.meta.url);\n\tconst worker = new Worker(workerUrl, { type: \"module\" });\n\n\tworker.onmessage = (e: MessageEvent) => handleWorkerMessage(e.data as Record<string, unknown>);\n\tworker.onerror = (e: ErrorEvent) => {\n\t\tconst err = new Error(e.message);\n\t\tfor (const pending of pendingRequests.values()) {\n\t\t\tpending.reject(err);\n\t\t}\n\t\tpendingRequests.clear();\n\t\treadyReject?.(err);\n\t};\n\n\tworkerHandle = {\n\t\tpostMessage: (data: unknown) => worker.postMessage(data),\n\t\tterminate: () => worker.terminate(),\n\t};\n\n\t// Browser worker needs an init message (no workerData equivalent)\n\tworker.postMessage({\n\t\ttype: \"init\",\n\t\twasmGluePath,\n\t\twasmBinary,\n\t});\n}\n\n/**\n * Run OCR in the worker thread. Returns a Promise that resolves with the recognized text.\n * Falls back to direct (blocking) call if workers are unavailable.\n */\nexport function runOcrInWorker(imageData: Uint8Array, tessdata: Uint8Array, language: string): Promise<string> {\n\tif (useFallback || !workerHandle || !workerReady) {\n\t\tif (fallbackFn) {\n\t\t\ttry {\n\t\t\t\tconst text = fallbackFn(imageData, tessdata, language);\n\t\t\t\treturn Promise.resolve(text);\n\t\t\t} catch (e: unknown) {\n\t\t\t\treturn Promise.reject(e instanceof Error ? e : new Error(String(e)));\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error(\"OCR worker not initialized and no fallback available\"));\n\t}\n\n\tconst id = nextRequestId++;\n\treturn new Promise<string>((resolve, reject) => {\n\t\tpendingRequests.set(id, { resolve, reject });\n\t\tworkerHandle!.postMessage({\n\t\t\ttype: \"ocr\",\n\t\t\tid,\n\t\t\timageData,\n\t\t\ttessdata,\n\t\t\tlanguage,\n\t\t});\n\t});\n}\n\n/**\n * Check whether OCR is using the worker thread or the direct fallback.\n */\nexport function isUsingWorker(): boolean {\n\treturn workerHandle !== null && workerReady && !useFallback;\n}\n\n/**\n * Terminate the OCR worker and clean up resources.\n */\nexport async function terminateOcrWorker(): Promise<void> {\n\tif (workerHandle) {\n\t\tawait workerHandle.terminate();\n\t\tworkerHandle = null;\n\t}\n\tworkerReady = false;\n\tuseFallback = false;\n\tfallbackFn = null;\n\n\t// Reject any still-pending requests\n\tfor (const pending of pendingRequests.values()) {\n\t\tpending.reject(new Error(\"OCR worker terminated\"));\n\t}\n\tpendingRequests.clear();\n}\n","/**\n * OCR enabler module\n *\n * Provides convenient functions for enabling and setting up OCR backends.\n * Automatically selects the appropriate backend based on build capabilities:\n * - Native WASM OCR (kreuzberg-tesseract compiled to WASM, works everywhere)\n * - Browser fallback: TesseractWasmBackend (using tesseract-wasm npm package + createImageBitmap)\n */\n\nimport { isInitialized } from \"../extraction/internal.js\";\nimport { getWasmModule } from \"../initialization/state.js\";\nimport { registerOcrBackend } from \"../ocr/registry.js\";\nimport { TesseractWasmBackend } from \"../ocr/tesseract-wasm-backend.js\";\nimport { createOcrWorker, runOcrInWorker, terminateOcrWorker } from \"../ocr/worker-bridge.js\";\nimport { isBrowser, isNode } from \"../runtime.js\";\nimport type { OcrBackendProtocol } from \"../types.js\";\n\n/** Default CDN URL for tessdata files (Tesseract fast models) */\nconst TESSDATA_CDN_BASE = \"https://raw.githubusercontent.com/tesseract-ocr/tessdata_fast/main\";\n\n/**\n * Native WASM OCR backend using kreuzberg-tesseract compiled into the WASM binary.\n *\n * This backend works in all environments (Browser, Node.js, Deno, etc.)\n * because Tesseract is statically linked into the WASM module.\n * Tessdata is downloaded from CDN and passed to Tesseract via memory (no filesystem needed).\n */\nclass NativeWasmOcrBackend implements OcrBackendProtocol {\n\tprivate tessdataCache: Map<string, Uint8Array> = new Map();\n\tprivate tessdataCdnBase: string = TESSDATA_CDN_BASE;\n\tprivate progressCallback: ((progress: number) => void) | null = null;\n\n\tname(): string {\n\t\treturn \"kreuzberg-tesseract\";\n\t}\n\n\tsupportedLanguages(): string[] {\n\t\treturn [\n\t\t\t\"eng\",\n\t\t\t\"deu\",\n\t\t\t\"fra\",\n\t\t\t\"spa\",\n\t\t\t\"ita\",\n\t\t\t\"por\",\n\t\t\t\"nld\",\n\t\t\t\"rus\",\n\t\t\t\"jpn\",\n\t\t\t\"kor\",\n\t\t\t\"chi_sim\",\n\t\t\t\"chi_tra\",\n\t\t\t\"pol\",\n\t\t\t\"tur\",\n\t\t\t\"swe\",\n\t\t\t\"dan\",\n\t\t\t\"fin\",\n\t\t\t\"nor\",\n\t\t\t\"ces\",\n\t\t\t\"slk\",\n\t\t\t\"ron\",\n\t\t\t\"hun\",\n\t\t\t\"hrv\",\n\t\t\t\"srp\",\n\t\t\t\"bul\",\n\t\t\t\"ukr\",\n\t\t\t\"ell\",\n\t\t\t\"ara\",\n\t\t\t\"heb\",\n\t\t\t\"hin\",\n\t\t\t\"tha\",\n\t\t\t\"vie\",\n\t\t\t\"mkd\",\n\t\t\t\"ben\",\n\t\t\t\"tam\",\n\t\t\t\"tel\",\n\t\t\t\"kan\",\n\t\t\t\"mal\",\n\t\t\t\"mya\",\n\t\t\t\"khm\",\n\t\t\t\"lao\",\n\t\t\t\"sin\",\n\t\t];\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tconst wasm = getWasmModule();\n\t\tif (!wasm?.ocrIsAvailable || !wasm.ocrIsAvailable()) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Native WASM OCR is not available. Build with the 'ocr-wasm' feature to enable kreuzberg-tesseract.\",\n\t\t\t);\n\t\t}\n\n\t\t// Resolve path to the WASM glue module for the worker thread\n\t\tlet wasmGluePath: string;\n\t\tlet wasmBinary: Uint8Array | undefined;\n\n\t\tif (isNode()) {\n\t\t\tconst nodePath = await import(/* @vite-ignore */ \"node:path\");\n\t\t\tconst nodeUrl = await import(/* @vite-ignore */ \"node:url\");\n\t\t\tconst nodeFs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\t\tconst __dirname = nodePath.dirname(nodeUrl.fileURLToPath(import.meta.url));\n\t\t\twasmGluePath = nodePath.join(__dirname, \"..\", \"pkg\", \"kreuzberg_wasm.js\");\n\t\t\ttry {\n\t\t\t\tconst wasmPath = nodePath.join(__dirname, \"..\", \"pkg\", \"kreuzberg_wasm_bg.wasm\");\n\t\t\t\tconst buf = await nodeFs.readFile(wasmPath);\n\t\t\t\twasmBinary = new Uint8Array(buf);\n\t\t\t} catch {\n\t\t\t\t// Binary will be loaded by glue code's default() fetch\n\t\t\t}\n\t\t} else {\n\t\t\twasmGluePath = new URL(\"../pkg/kreuzberg_wasm.js\", import.meta.url).href;\n\t\t}\n\n\t\t// Direct (blocking) fallback for when workers are unavailable\n\t\tconst directFallback = (imageData: Uint8Array, tessdata: Uint8Array, language: string): string => {\n\t\t\tif (!wasm.ocrRecognize) throw new Error(\"ocrRecognize not available\");\n\t\t\treturn wasm.ocrRecognize(imageData, tessdata, language);\n\t\t};\n\n\t\tawait createOcrWorker(wasmGluePath, wasmBinary, directFallback);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tthis.tessdataCache.clear();\n\t\tthis.progressCallback = null;\n\t\tawait terminateOcrWorker();\n\t}\n\n\tsetProgressCallback(callback: (progress: number) => void): void {\n\t\tthis.progressCallback = callback;\n\t}\n\n\tasync processImage(\n\t\timageBytes: Uint8Array | string,\n\t\tlanguage: string,\n\t): Promise<{\n\t\tcontent: string;\n\t\tmime_type: string;\n\t\tmetadata: Record<string, unknown>;\n\t\ttables: unknown[];\n\t}> {\n\t\tconst normalizedLang = language.toLowerCase();\n\n\t\tthis.reportProgress(10);\n\n\t\t// Download tessdata if not cached\n\t\tconst tessdata = await this.getTessdata(normalizedLang);\n\n\t\tthis.reportProgress(40);\n\n\t\t// Convert base64 string to Uint8Array if needed\n\t\tlet imageData: Uint8Array;\n\t\tif (typeof imageBytes === \"string\") {\n\t\t\tconst binaryString = atob(imageBytes);\n\t\t\timageData = new Uint8Array(binaryString.length);\n\t\t\tfor (let i = 0; i < binaryString.length; i++) {\n\t\t\t\timageData[i] = binaryString.charCodeAt(i);\n\t\t\t}\n\t\t} else {\n\t\t\timageData = imageBytes;\n\t\t}\n\n\t\tthis.reportProgress(50);\n\n\t\t// Run OCR in a worker thread to avoid blocking the main event loop.\n\t\t// Falls back to direct (blocking) call if workers are unavailable.\n\t\tconst text = await runOcrInWorker(imageData, tessdata, normalizedLang);\n\n\t\tthis.reportProgress(90);\n\n\t\treturn {\n\t\t\tcontent: text,\n\t\t\tmime_type: \"text/plain\",\n\t\t\tmetadata: { language: normalizedLang },\n\t\t\ttables: [],\n\t\t};\n\t}\n\n\tprivate async getTessdata(language: string): Promise<Uint8Array> {\n\t\tconst cached = this.tessdataCache.get(language);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst url = `${this.tessdataCdnBase}/${language}.traineddata`;\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to download tessdata for \"${language}\" from ${url}: ${response.status}`);\n\t\t}\n\n\t\tconst data = new Uint8Array(await response.arrayBuffer());\n\t\tthis.tessdataCache.set(language, data);\n\t\treturn data;\n\t}\n\n\tprivate reportProgress(progress: number): void {\n\t\tif (this.progressCallback) {\n\t\t\ttry {\n\t\t\t\tthis.progressCallback(Math.min(100, Math.max(0, progress)));\n\t\t\t} catch {\n\t\t\t\t// Ignore callback errors\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Enable OCR functionality with the appropriate backend for the current runtime\n *\n * Automatically selects the best available OCR backend:\n * 1. **Native WASM OCR** (preferred): If built with `ocr-wasm` feature, uses kreuzberg-tesseract\n * compiled directly into the WASM binary. Works in all environments (Browser, Node.js, Deno).\n * 2. **Browser fallback**: Uses `TesseractWasmBackend` with the `tesseract-wasm` npm package\n * (requires `createImageBitmap` browser API).\n *\n * ## Network Requirement\n *\n * Training data will be loaded from jsDelivr CDN on first use of each language.\n * Ensure network access to cdn.jsdelivr.net is available.\n *\n * @throws {Error} If WASM is not initialized or no OCR backend is available\n *\n * @example Basic Usage (works in all environments)\n * ```typescript\n * import { enableOcr, extractBytes, initWasm } from '@kreuzberg/wasm';\n *\n * await initWasm();\n * await enableOcr();\n *\n * const imageBytes = new Uint8Array(buffer);\n * const result = await extractBytes(imageBytes, 'image/png', {\n * ocr: { backend: 'kreuzberg-tesseract', language: 'eng' }\n * });\n *\n * console.log(result.content);\n * ```\n */\nexport async function enableOcr(): Promise<void> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\ttry {\n\t\t// Try native WASM OCR first (works in all environments)\n\t\tconst wasm = getWasmModule();\n\t\tif (wasm?.ocrIsAvailable?.()) {\n\t\t\tconst backend = new NativeWasmOcrBackend();\n\t\t\tawait backend.initialize();\n\t\t\tregisterOcrBackend(backend);\n\t\t\tregisterBackendInRustRegistry(wasm, backend);\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback: browser-only tesseract-wasm npm backend\n\t\tif (isBrowser()) {\n\t\t\tconst backend = new TesseractWasmBackend();\n\t\t\tawait backend.initialize();\n\t\t\tregisterOcrBackend(backend);\n\t\t\tregisterBackendInRustRegistry(wasm, backend);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t\"No OCR backend available. \" +\n\t\t\t\t\"Build with the 'ocr-wasm' feature to enable native Tesseract OCR in all environments, \" +\n\t\t\t\t\"or use a browser environment with the tesseract-wasm npm package.\",\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to enable OCR: ${message}`);\n\t}\n}\n\n/**\n * Register an OCR backend in the Rust-side plugin registry.\n *\n * The Rust extraction pipeline looks up OCR backends from its own registry\n * (not the JS-side Map). This creates a thin adapter that bridges the\n * OcrBackendProtocol interface to what the Rust wasm-bindgen bridge expects:\n * - name() returns \"tesseract\" (matching the default OcrConfig.backend value)\n * - processImage() returns a JSON string (not an object)\n */\nfunction registerBackendInRustRegistry(wasm: ReturnType<typeof getWasmModule>, backend: OcrBackendProtocol): void {\n\tconst registerFn = wasm?.register_ocr_backend;\n\tif (!registerFn) {\n\t\treturn;\n\t}\n\n\tconst rustAdapter = {\n\t\tname: () => \"tesseract\",\n\t\tsupportedLanguages: () => backend.supportedLanguages?.() ?? [\"eng\"],\n\t\tprocessImage: async (imageBase64: string, language: string): Promise<string> => {\n\t\t\tconst result = await backend.processImage(imageBase64, language);\n\t\t\treturn typeof result === \"string\" ? result : JSON.stringify(result);\n\t\t},\n\t};\n\n\ttry {\n\t\tregisterFn(rustAdapter);\n\t} catch {\n\t\t// Registration may fail if already registered; non-fatal\n\t}\n}\n","/**\n * Plugin Registry Module\n *\n * This module manages registrations and execution of post-processors and validators\n * for document extraction pipelines.\n *\n * # Thread Safety\n * All registrations are stored in Maps and are single-threaded safe for WASM environments.\n *\n * # Global Callback Functions\n * The WASM module can invoke processing via global callback functions:\n * - `__kreuzberg_execute_post_processor`: Execute a registered post-processor\n * - `__kreuzberg_execute_validator`: Execute a registered validator\n */\n\nimport type { ExtractionResult } from \"./types.js\";\n\n/**\n * Post-processor plugin interface\n *\n * A post-processor modifies extraction results after extraction completes.\n */\nexport interface PostProcessor {\n\t/**\n\t * Get the processor name (must be non-empty string)\n\t */\n\tname(): string;\n\n\t/**\n\t * Get the processing stage (optional, defaults to \"middle\")\n\t * - \"early\": Process early in the pipeline\n\t * - \"middle\": Process in the middle of the pipeline\n\t * - \"late\": Process late in the pipeline\n\t */\n\tstage?(): \"early\" | \"middle\" | \"late\";\n\n\t/**\n\t * Process an extraction result\n\t * Can be sync or async\n\t */\n\tprocess(result: ExtractionResult): ExtractionResult | Promise<ExtractionResult>;\n\n\t/**\n\t * Shutdown the processor (optional)\n\t */\n\tshutdown?(): void | Promise<void>;\n}\n\n/**\n * Validator plugin interface\n *\n * A validator checks extraction results for correctness\n */\nexport interface Validator {\n\t/**\n\t * Get the validator name (must be non-empty string)\n\t */\n\tname(): string;\n\n\t/**\n\t * Get the validation priority (optional, defaults to 50)\n\t * Higher numbers = higher priority (execute first)\n\t */\n\tpriority?(): number;\n\n\t/**\n\t * Validate an extraction result\n\t * Can be sync or async\n\t */\n\tvalidate(\n\t\tresult: ExtractionResult,\n\t): { valid: boolean; errors: string[] } | Promise<{ valid: boolean; errors: string[] }>;\n\n\t/**\n\t * Shutdown the validator (optional)\n\t */\n\tshutdown?(): void | Promise<void>;\n}\n\n/** Map of post-processor name -> processor instance */\nconst postProcessors = new Map<string, PostProcessor>();\n\n/** Map of validator name -> validator instance */\nconst validators = new Map<string, Validator>();\n\n// ============================================================================\n// Post-Processor Registry Functions\n// ============================================================================\n\n/**\n * Validate a post-processor object\n *\n * @throws {Error} If the processor doesn't implement required methods\n */\nfunction validatePostProcessor(processor: unknown): processor is PostProcessor {\n\tif (processor === null || processor === undefined) {\n\t\tthrow new Error(\"Post-processor cannot be null or undefined\");\n\t}\n\n\tconst obj = processor as Record<string, unknown>;\n\n\tif (typeof obj.name !== \"function\") {\n\t\tthrow new Error(\"Post-processor must implement name() method\");\n\t}\n\n\tif (typeof obj.process !== \"function\") {\n\t\tthrow new Error(\"Post-processor must implement process() method\");\n\t}\n\n\tconst name = obj.name();\n\tif (typeof name !== \"string\" || name.trim() === \"\") {\n\t\tthrow new Error(\"Post-processor name must be a non-empty string\");\n\t}\n\n\treturn true;\n}\n\n/**\n * Register a post-processor plugin\n *\n * @param processor - The post-processor to register\n * @throws {Error} If the processor is invalid or missing required methods\n *\n * @example\n * ```typescript\n * const processor = {\n * name: () => \"my-processor\",\n * stage: () => \"middle\",\n * process: async (result) => {\n * result.content = result.content.toUpperCase();\n * return result;\n * }\n * };\n * registerPostProcessor(processor);\n * ```\n */\nexport function registerPostProcessor(processor: PostProcessor): void {\n\tvalidatePostProcessor(processor);\n\n\tconst name = processor.name();\n\n\tif (postProcessors.has(name)) {\n\t\tconsole.warn(`Post-processor \"${name}\" already registered, overwriting with new implementation`);\n\t}\n\n\tpostProcessors.set(name, processor);\n}\n\n/**\n * Get a registered post-processor by name\n *\n * @param name - The processor name\n * @returns The processor, or undefined if not found\n *\n * @example\n * ```typescript\n * const processor = getPostProcessor(\"my-processor\");\n * if (processor) {\n * console.log(\"Found processor:\", processor.name());\n * }\n * ```\n */\nexport function getPostProcessor(name: string): PostProcessor | undefined {\n\treturn postProcessors.get(name);\n}\n\n/**\n * List all registered post-processor names\n *\n * @returns Array of processor names\n *\n * @example\n * ```typescript\n * const names = listPostProcessors();\n * console.log(\"Registered processors:\", names);\n * ```\n */\nexport function listPostProcessors(): string[] {\n\treturn Array.from(postProcessors.keys());\n}\n\n/**\n * Unregister a post-processor and call its shutdown method\n *\n * @param name - The processor name\n * @throws {Error} If the processor is not registered\n *\n * @example\n * ```typescript\n * await unregisterPostProcessor(\"my-processor\");\n * ```\n */\nexport async function unregisterPostProcessor(name: string): Promise<void> {\n\tconst processor = postProcessors.get(name);\n\n\tif (!processor) {\n\t\tconst available = Array.from(postProcessors.keys());\n\t\tconst availableStr = available.length > 0 ? ` Available: ${available.join(\", \")}` : \"\";\n\t\tthrow new Error(`Post-processor \"${name}\" is not registered.${availableStr}`);\n\t}\n\n\ttry {\n\t\tif (processor.shutdown) {\n\t\t\tawait processor.shutdown();\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(`Error during shutdown of post-processor \"${name}\":`, error);\n\t}\n\n\tpostProcessors.delete(name);\n}\n\n/**\n * Clear all registered post-processors\n *\n * Calls shutdown on all processors before clearing.\n *\n * @example\n * ```typescript\n * await clearPostProcessors();\n * ```\n */\nexport async function clearPostProcessors(): Promise<void> {\n\tconst entries = Array.from(postProcessors.entries());\n\n\tfor (const [_name, processor] of entries) {\n\t\ttry {\n\t\t\tif (processor.shutdown) {\n\t\t\t\tawait processor.shutdown();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Error during shutdown of post-processor \"${_name}\":`, error);\n\t\t}\n\t}\n\n\tpostProcessors.clear();\n}\n\n// ============================================================================\n// Validator Registry Functions\n// ============================================================================\n\n/**\n * Validate a validator object\n *\n * @throws {Error} If the validator doesn't implement required methods\n */\nfunction validateValidator(validator: unknown): validator is Validator {\n\tif (validator === null || validator === undefined) {\n\t\tthrow new Error(\"Validator cannot be null or undefined\");\n\t}\n\n\tconst obj = validator as Record<string, unknown>;\n\n\tif (typeof obj.name !== \"function\") {\n\t\tthrow new Error(\"Validator must implement name() method\");\n\t}\n\n\tif (typeof obj.validate !== \"function\") {\n\t\tthrow new Error(\"Validator must implement validate() method\");\n\t}\n\n\tconst name = obj.name();\n\tif (typeof name !== \"string\" || name.trim() === \"\") {\n\t\tthrow new Error(\"Validator name must be a non-empty string\");\n\t}\n\n\treturn true;\n}\n\n/**\n * Register a validator plugin\n *\n * @param validator - The validator to register\n * @throws {Error} If the validator is invalid or missing required methods\n *\n * @example\n * ```typescript\n * const validator = {\n * name: () => \"my-validator\",\n * priority: () => 50,\n * validate: async (result) => {\n * if (!result.content) {\n * return { valid: false, errors: [\"Content is empty\"] };\n * }\n * return { valid: true, errors: [] };\n * }\n * };\n * registerValidator(validator);\n * ```\n */\nexport function registerValidator(validator: Validator): void {\n\tvalidateValidator(validator);\n\n\tconst name = validator.name();\n\n\tif (validators.has(name)) {\n\t\tconsole.warn(`Validator \"${name}\" already registered, overwriting with new implementation`);\n\t}\n\n\tvalidators.set(name, validator);\n}\n\n/**\n * Get a registered validator by name\n *\n * @param name - The validator name\n * @returns The validator, or undefined if not found\n *\n * @example\n * ```typescript\n * const validator = getValidator(\"my-validator\");\n * if (validator) {\n * console.log(\"Found validator:\", validator.name());\n * }\n * ```\n */\nexport function getValidator(name: string): Validator | undefined {\n\treturn validators.get(name);\n}\n\n/**\n * List all registered validator names\n *\n * @returns Array of validator names\n *\n * @example\n * ```typescript\n * const names = listValidators();\n * console.log(\"Registered validators:\", names);\n * ```\n */\nexport function listValidators(): string[] {\n\treturn Array.from(validators.keys());\n}\n\n/**\n * Unregister a validator and call its shutdown method\n *\n * @param name - The validator name\n * @throws {Error} If the validator is not registered\n *\n * @example\n * ```typescript\n * await unregisterValidator(\"my-validator\");\n * ```\n */\nexport async function unregisterValidator(name: string): Promise<void> {\n\tconst validator = validators.get(name);\n\n\tif (!validator) {\n\t\tconst available = Array.from(validators.keys());\n\t\tconst availableStr = available.length > 0 ? ` Available: ${available.join(\", \")}` : \"\";\n\t\tthrow new Error(`Validator \"${name}\" is not registered.${availableStr}`);\n\t}\n\n\ttry {\n\t\tif (validator.shutdown) {\n\t\t\tawait validator.shutdown();\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(`Error during shutdown of validator \"${name}\":`, error);\n\t}\n\n\tvalidators.delete(name);\n}\n\n/**\n * Clear all registered validators\n *\n * Calls shutdown on all validators before clearing.\n *\n * @example\n * ```typescript\n * await clearValidators();\n * ```\n */\nexport async function clearValidators(): Promise<void> {\n\tconst entries = Array.from(validators.entries());\n\n\tfor (const [_name, validator] of entries) {\n\t\ttry {\n\t\t\tif (validator.shutdown) {\n\t\t\t\tawait validator.shutdown();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Error during shutdown of validator \"${_name}\":`, error);\n\t\t}\n\t}\n\n\tvalidators.clear();\n}\n\n// ============================================================================\n// Global Callback Functions (for WASM module callbacks)\n// ============================================================================\n\n/**\n * Global callback for executing a post-processor from WASM\n *\n * Called by the WASM module to execute a registered post-processor.\n * Makes the callback available to WASM via the global scope.\n *\n * @internal\n */\nexport function executePostProcessor(name: string, result: ExtractionResult): Promise<ExtractionResult> {\n\tconst processor = postProcessors.get(name);\n\n\tif (!processor) {\n\t\treturn Promise.reject(new Error(`Post-processor \"${name}\" is not registered`));\n\t}\n\n\ttry {\n\t\tconst output = processor.process(result);\n\n\t\tif (output instanceof Promise) {\n\t\t\treturn output;\n\t\t}\n\n\t\treturn Promise.resolve(output);\n\t} catch (error) {\n\t\treturn Promise.reject(new Error(`Error executing post-processor \"${name}\": ${String(error)}`));\n\t}\n}\n\n/**\n * Global callback for executing a validator from WASM\n *\n * Called by the WASM module to execute a registered validator.\n * Makes the callback available to WASM via the global scope.\n *\n * @internal\n */\nexport function executeValidator(\n\tname: string,\n\tresult: ExtractionResult,\n): Promise<{ valid: boolean; errors: string[] }> {\n\tconst validator = validators.get(name);\n\n\tif (!validator) {\n\t\treturn Promise.reject(new Error(`Validator \"${name}\" is not registered`));\n\t}\n\n\ttry {\n\t\tconst output = validator.validate(result);\n\n\t\tif (output instanceof Promise) {\n\t\t\treturn output;\n\t\t}\n\n\t\treturn Promise.resolve(output);\n\t} catch (error) {\n\t\treturn Promise.reject(new Error(`Error executing validator \"${name}\": ${String(error)}`));\n\t}\n}\n\n/**\n * Expose global callback functions for WASM module\n *\n * This makes the plugin execution functions available as global callbacks\n * that the WASM module can invoke via JavaScript.\n *\n * @internal\n */\nexport function setupGlobalCallbacks(): void {\n\t// Make callbacks available to WASM module\n\tif (typeof globalThis !== \"undefined\") {\n\t\tconst callbacksObj = globalThis as Record<string, unknown>;\n\t\tcallbacksObj.__kreuzberg_execute_post_processor = executePostProcessor;\n\t\tcallbacksObj.__kreuzberg_execute_validator = executeValidator;\n\t}\n}\n\n// Setup callbacks when module is imported\nsetupGlobalCallbacks();\n","/**\n * MIME type utilities\n *\n * Provides functions for MIME type detection and extension lookup\n * using the WASM module's native capabilities.\n */\n\nimport { wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport { getWasmModule, isInitialized } from \"../extraction/internal.js\";\n\n/**\n * Detect MIME type from raw bytes\n *\n * Uses magic-byte detection to determine the MIME type of a byte buffer.\n *\n * @param data - The raw bytes to detect MIME type from\n * @returns The detected MIME type string (e.g., 'application/pdf', 'image/png')\n * @throws {Error} If WASM module is not initialized or detection fails\n *\n * @example\n * ```typescript\n * const bytes = new Uint8Array(buffer);\n * const mimeType = detectMimeFromBytes(bytes);\n * console.log(mimeType); // 'application/pdf'\n * ```\n */\nexport function detectMimeFromBytes(data: Uint8Array): string {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\treturn wasm.detectMimeFromBytes(data);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"detecting MIME type from bytes\");\n\t}\n}\n\n/**\n * Get file extensions for a MIME type\n *\n * Returns known file extensions associated with the given MIME type.\n *\n * @param mimeType - The MIME type to look up extensions for\n * @returns Array of file extension strings (e.g., ['pdf'], ['jpg', 'jpeg'])\n * @throws {Error} If WASM module is not initialized or lookup fails\n *\n * @example\n * ```typescript\n * const extensions = getExtensionsForMime('application/pdf');\n * console.log(extensions); // ['pdf']\n * ```\n */\nexport function getExtensionsForMime(mimeType: string): string[] {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\treturn wasm.getExtensionsForMime(mimeType);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"getting extensions for MIME type\");\n\t}\n}\n"],"mappings":"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","names":["normalized","document","getWasmModule","wasm","isInitialized","isInitialized","wasm","getWasmModule","isInitialized","wasm","getWasmModule","isInitialized","wasm","getWasmModule","Worker","wasm","isInitialized","isInitialized","wasm","getWasmModule"]}
1
+ {"version":3,"sources":["../typescript/runtime.ts","../typescript/initialization/pdfium-loader.ts","../typescript/adapters/wasm-adapter.ts","../typescript/initialization/state.ts","../typescript/initialization/wasm-loader.ts","../typescript/extraction/internal.ts","../typescript/extraction/bytes.ts","../typescript/extraction/files.ts","../typescript/extraction/batch.ts","../typescript/ocr/registry.ts","../typescript/ocr/tesseract-wasm-backend.ts","../typescript/ocr/worker-bridge.ts","../typescript/ocr/enabler.ts","../typescript/plugin-registry.ts","../typescript/mime/utilities.ts"],"sourcesContent":["/**\n * Runtime detection and environment-specific utilities\n *\n * This module provides utilities for detecting the JavaScript runtime environment,\n * checking for feature availability, and enabling environment-specific WASM loading strategies.\n *\n * @example Basic Runtime Detection\n * ```typescript\n * import { detectRuntime, isBrowser, isNode } from '@kreuzberg/wasm/runtime';\n *\n * if (isBrowser()) {\n * console.log('Running in browser');\n * } else if (isNode()) {\n * console.log('Running in Node.js');\n * }\n * ```\n *\n * @example Feature Detection\n * ```typescript\n * import { hasFileApi, hasWorkers } from '@kreuzberg/wasm/runtime';\n *\n * if (hasFileApi()) {\n * // Can use File API for browser file uploads\n * }\n *\n * if (hasWorkers()) {\n * // Can use Web Workers for parallel processing\n * }\n * ```\n */\n\nexport type RuntimeType = \"browser\" | \"node\" | \"deno\" | \"bun\" | \"cloudflare-workers\" | \"edge-runtime\" | \"unknown\";\n\n/**\n * WebAssembly capabilities available in the runtime\n */\nexport interface WasmCapabilities {\n\t/** Runtime environment type */\n\truntime: RuntimeType;\n\t/** WebAssembly support available */\n\thasWasm: boolean;\n\t/** Streaming WebAssembly instantiation available */\n\thasWasmStreaming: boolean;\n\t/** File API available (browser) */\n\thasFileApi: boolean;\n\t/** Blob API available */\n\thasBlob: boolean;\n\t/** Worker support available */\n\thasWorkers: boolean;\n\t/** SharedArrayBuffer available (may be restricted) */\n\thasSharedArrayBuffer: boolean;\n\t/** Module Workers available */\n\thasModuleWorkers: boolean;\n\t/** BigInt support */\n\thasBigInt: boolean;\n\t/** Specific runtime version if available */\n\truntimeVersion?: string;\n}\n\n/**\n * Detect the current JavaScript runtime\n *\n * Checks for various global objects and properties to determine\n * which JavaScript runtime environment is currently executing.\n *\n * @returns The detected runtime type\n *\n * @example\n * ```typescript\n * import { detectRuntime } from '@kreuzberg/wasm/runtime';\n *\n * const runtime = detectRuntime();\n * switch (runtime) {\n * case 'browser':\n * console.log('Running in browser');\n * break;\n * case 'node':\n * console.log('Running in Node.js');\n * break;\n * case 'deno':\n * console.log('Running in Deno');\n * break;\n * case 'bun':\n * console.log('Running in Bun');\n * break;\n * }\n * ```\n */\nexport function detectRuntime(): RuntimeType {\n\t// Check for Cloudflare Workers - has caches global with a default property but no window/document\n\tconst globalCaches = (globalThis as unknown as Record<string, unknown>).caches;\n\tif (\n\t\ttypeof caches !== \"undefined\" &&\n\t\tglobalCaches !== null &&\n\t\ttypeof globalCaches === \"object\" &&\n\t\t\"default\" in (globalCaches as object) &&\n\t\ttypeof window === \"undefined\" &&\n\t\ttypeof document === \"undefined\"\n\t) {\n\t\treturn \"cloudflare-workers\";\n\t}\n\n\t// Check for Vercel Edge Runtime / other edge runtimes\n\tif (typeof (globalThis as unknown as Record<string, unknown>).EdgeRuntime !== \"undefined\") {\n\t\treturn \"edge-runtime\";\n\t}\n\n\tif (typeof (globalThis as unknown as Record<string, unknown>).Deno !== \"undefined\") {\n\t\treturn \"deno\";\n\t}\n\n\tif (typeof (globalThis as unknown as Record<string, unknown>).Bun !== \"undefined\") {\n\t\treturn \"bun\";\n\t}\n\n\tif (typeof process !== \"undefined\" && process.versions && process.versions.node) {\n\t\treturn \"node\";\n\t}\n\n\tif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n\t\treturn \"browser\";\n\t}\n\n\treturn \"unknown\";\n}\n\n/**\n * Check if running in a browser environment\n *\n * @returns True if running in a browser, false otherwise\n */\nexport function isBrowser(): boolean {\n\treturn detectRuntime() === \"browser\";\n}\n\n/**\n * Check if running in Node.js\n *\n * @returns True if running in Node.js, false otherwise\n */\nexport function isNode(): boolean {\n\treturn detectRuntime() === \"node\";\n}\n\n/**\n * Check if running in Deno\n *\n * @returns True if running in Deno, false otherwise\n */\nexport function isDeno(): boolean {\n\treturn detectRuntime() === \"deno\";\n}\n\n/**\n * Check if running in Bun\n *\n * @returns True if running in Bun, false otherwise\n */\nexport function isBun(): boolean {\n\treturn detectRuntime() === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n *\n * @returns True if running in Cloudflare Workers, false otherwise\n */\nexport function isCloudflareWorkers(): boolean {\n\treturn detectRuntime() === \"cloudflare-workers\";\n}\n\n/**\n * Check if running in an edge runtime (Vercel Edge, etc.)\n *\n * @returns True if running in an edge runtime, false otherwise\n */\nexport function isEdgeRuntime(): boolean {\n\treturn detectRuntime() === \"edge-runtime\";\n}\n\n/**\n * Check if running in any edge/serverless environment\n *\n * This includes Cloudflare Workers, Vercel Edge, and similar environments.\n *\n * @returns True if running in an edge environment, false otherwise\n */\nexport function isEdgeEnvironment(): boolean {\n\tconst runtime = detectRuntime();\n\treturn runtime === \"cloudflare-workers\" || runtime === \"edge-runtime\";\n}\n\n/**\n * Check if running in a web environment (browser or similar)\n *\n * @returns True if running in a web browser, false otherwise\n */\nexport function isWebEnvironment(): boolean {\n\tconst runtime = detectRuntime();\n\treturn runtime === \"browser\";\n}\n\n/**\n * Check if running in a server-like environment (Node.js, Deno, Bun, Cloudflare Workers, Edge)\n *\n * @returns True if running on a server runtime, false otherwise\n */\nexport function isServerEnvironment(): boolean {\n\tconst runtime = detectRuntime();\n\treturn (\n\t\truntime === \"node\" ||\n\t\truntime === \"deno\" ||\n\t\truntime === \"bun\" ||\n\t\truntime === \"cloudflare-workers\" ||\n\t\truntime === \"edge-runtime\"\n\t);\n}\n\n/**\n * Check if File API is available\n *\n * The File API is required for handling browser file uploads.\n *\n * @returns True if File API is available, false otherwise\n *\n * @example\n * ```typescript\n * if (hasFileApi()) {\n * const fileInput = document.getElementById('file');\n * fileInput.addEventListener('change', (e) => {\n * const file = e.target.files?.[0];\n * // Handle file\n * });\n * }\n * ```\n */\nexport function hasFileApi(): boolean {\n\treturn typeof window !== \"undefined\" && typeof File !== \"undefined\" && typeof Blob !== \"undefined\";\n}\n\n/**\n * Check if Blob API is available\n *\n * @returns True if Blob API is available, false otherwise\n */\nexport function hasBlob(): boolean {\n\treturn typeof Blob !== \"undefined\";\n}\n\n/**\n * Check if Web Workers are available\n *\n * @returns True if Web Workers can be created, false otherwise\n */\nexport function hasWorkers(): boolean {\n\treturn typeof Worker !== \"undefined\";\n}\n\n/**\n * Check if SharedArrayBuffer is available\n *\n * Note: SharedArrayBuffer is restricted in some browser contexts\n * due to security considerations (Spectre/Meltdown mitigations).\n *\n * @returns True if SharedArrayBuffer is available, false otherwise\n */\nexport function hasSharedArrayBuffer(): boolean {\n\treturn typeof SharedArrayBuffer !== \"undefined\";\n}\n\n/**\n * Check if module workers are available\n *\n * Module workers allow importing ES modules in worker threads.\n *\n * @returns True if module workers are supported, false otherwise\n */\nexport function hasModuleWorkers(): boolean {\n\tif (!hasWorkers()) {\n\t\treturn false;\n\t}\n\n\ttry {\n\t\tconst blob = new Blob(['console.log(\"test\")'], {\n\t\t\ttype: \"application/javascript\",\n\t\t});\n\t\tconst workerUrl = URL.createObjectURL(blob);\n\t\ttry {\n\t\t\treturn true;\n\t\t} finally {\n\t\t\tURL.revokeObjectURL(workerUrl);\n\t\t}\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Check if WebAssembly is available\n *\n * @returns True if WebAssembly is supported, false otherwise\n */\nexport function hasWasm(): boolean {\n\treturn typeof WebAssembly !== \"undefined\" && WebAssembly.instantiate !== undefined;\n}\n\n/**\n * Check if WebAssembly.instantiateStreaming is available\n *\n * Streaming instantiation is more efficient than buffering the entire WASM module.\n *\n * @returns True if streaming WebAssembly is supported, false otherwise\n */\nexport function hasWasmStreaming(): boolean {\n\treturn typeof WebAssembly !== \"undefined\" && WebAssembly.instantiateStreaming !== undefined;\n}\n\n/**\n * Check if BigInt is available\n *\n * @returns True if BigInt type is supported, false otherwise\n */\nexport function hasBigInt(): boolean {\n\ttry {\n\t\tconst test = BigInt(\"1\");\n\t\treturn typeof test === \"bigint\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get runtime version information\n *\n * @returns Version string if available, undefined otherwise\n *\n * @example\n * ```typescript\n * const version = getRuntimeVersion();\n * console.log(`Running on Node ${version}`); // \"Running on Node 18.12.0\"\n * ```\n */\nexport function getRuntimeVersion(): string | undefined {\n\tconst runtime = detectRuntime();\n\n\tswitch (runtime) {\n\t\tcase \"node\":\n\t\t\treturn process.version?.substring(1);\n\t\tcase \"deno\": {\n\t\t\tconst deno = (globalThis as unknown as Record<string, unknown>).Deno as Record<string, unknown> | undefined;\n\t\t\tconst version = deno?.version as Record<string, unknown> | undefined;\n\t\t\treturn version?.deno as string | undefined;\n\t\t}\n\t\tcase \"bun\": {\n\t\t\tconst bun = (globalThis as unknown as Record<string, unknown>).Bun as Record<string, unknown> | undefined;\n\t\t\treturn bun?.version as string | undefined;\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Get comprehensive WebAssembly capabilities for current runtime\n *\n * Returns detailed information about WASM and related APIs available\n * in the current runtime environment.\n *\n * @returns Object describing available WASM capabilities\n *\n * @example\n * ```typescript\n * import { getWasmCapabilities } from '@kreuzberg/wasm/runtime';\n *\n * const caps = getWasmCapabilities();\n * console.log(`WASM available: ${caps.hasWasm}`);\n * console.log(`Streaming WASM: ${caps.hasWasmStreaming}`);\n * console.log(`Workers available: ${caps.hasWorkers}`);\n *\n * if (caps.hasWasm && caps.hasWorkers) {\n * // Can offload WASM processing to workers\n * }\n * ```\n */\nexport function getWasmCapabilities(): WasmCapabilities {\n\tconst runtime = detectRuntime();\n\tconst version = getRuntimeVersion();\n\tconst capabilities: WasmCapabilities = {\n\t\truntime,\n\t\thasWasm: hasWasm(),\n\t\thasWasmStreaming: hasWasmStreaming(),\n\t\thasFileApi: hasFileApi(),\n\t\thasBlob: hasBlob(),\n\t\thasWorkers: hasWorkers(),\n\t\thasSharedArrayBuffer: hasSharedArrayBuffer(),\n\t\thasModuleWorkers: hasModuleWorkers(),\n\t\thasBigInt: hasBigInt(),\n\t\t...(version !== undefined ? { runtimeVersion: version } : {}),\n\t};\n\treturn capabilities;\n}\n\n/**\n * Get comprehensive runtime information\n *\n * Returns detailed information about the current runtime environment,\n * capabilities, and identifying information.\n *\n * @returns Object with runtime details and capabilities\n *\n * @example\n * ```typescript\n * const info = getRuntimeInfo();\n * console.log(info.runtime); // 'browser' | 'node' | 'deno' | 'bun'\n * console.log(info.isBrowser); // true/false\n * console.log(info.userAgent); // Browser user agent string\n * console.log(info.capabilities); // Detailed capability information\n * ```\n */\nexport function getRuntimeInfo() {\n\tconst runtime = detectRuntime();\n\tconst capabilities = getWasmCapabilities();\n\n\treturn {\n\t\truntime,\n\t\tisBrowser: isBrowser(),\n\t\tisNode: isNode(),\n\t\tisDeno: isDeno(),\n\t\tisBun: isBun(),\n\t\tisWeb: isWebEnvironment(),\n\t\tisServer: isServerEnvironment(),\n\t\truntimeVersion: getRuntimeVersion(),\n\t\tuserAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : \"N/A\",\n\t\tcapabilities,\n\t};\n}\n","/**\n * PDFium WASM Loader\n *\n * Handles PDFium-specific WASM module loading and initialization.\n * Provides asynchronous loading of the PDFium WASM module with\n * proper error handling across all WASM runtimes (browser, Node.js, Bun, Deno).\n *\n * PDFium can be provided in several ways:\n * 1. Place `pdfium.js` (Emscripten output) alongside the package distribution\n * 2. Set `KREUZBERG_PDFIUM_PATH` environment variable to the directory containing `pdfium.js`\n * 3. Call `initialize_pdfium_render()` manually with a loaded PDFium module\n */\n\nimport { isNode } from \"../runtime.js\";\nimport type { WasmModule } from \"./state.js\";\n\n/**\n * Attempt to load the PDFium module from the filesystem in Node.js.\n * Checks multiple candidate paths relative to the package directory.\n *\n * @returns The loaded PDFium module or null if not found\n * @internal\n */\nasync function loadPdfiumForNode(): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\tconst fs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\tconst path = await import(/* @vite-ignore */ \"node:path\");\n\t\tconst url = await import(/* @vite-ignore */ \"node:url\");\n\n\t\tconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\n\t\t// Check environment variable first\n\t\tconst envPath = process.env.KREUZBERG_PDFIUM_PATH;\n\t\tconst candidates: string[] = [];\n\n\t\tif (envPath) {\n\t\t\tcandidates.push(path.join(envPath, \"pdfium.js\"));\n\t\t\tcandidates.push(envPath); // allow direct path to pdfium.js\n\t\t}\n\n\t\t// Standard locations relative to package dist\n\t\tcandidates.push(\n\t\t\tpath.join(__dirname, \"..\", \"pdfium.js\"), // dist/pdfium.js\n\t\t\tpath.join(__dirname, \"pdfium.js\"), // dist/initialization/pdfium.js\n\t\t\tpath.join(__dirname, \"..\", \"..\", \"pdfium.js\"), // package root pdfium.js\n\t\t);\n\n\t\tfor (const candidate of candidates) {\n\t\t\ttry {\n\t\t\t\tawait fs.access(candidate);\n\t\t\t\tconst moduleUrl = url.pathToFileURL(candidate).href;\n\t\t\t\treturn (await import(/* @vite-ignore */ moduleUrl)) as Record<string, unknown>;\n\t\t\t} catch {\n\t\t\t\t// Try next candidate path\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Load the PDFium module for the current runtime environment.\n *\n * @returns The loaded PDFium module or null if not available\n * @internal\n */\nasync function loadPdfiumModule(): Promise<Record<string, unknown> | null> {\n\tif (isNode()) {\n\t\treturn loadPdfiumForNode();\n\t}\n\n\t// Browser/Deno/Bun: try dynamic import\n\ttry {\n\t\t// @ts-expect-error - Dynamic module loading\n\t\treturn await import(\"../pdfium.js\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Initialize PDFium WASM module asynchronously\n *\n * Loads and binds the PDFium WASM module for PDF extraction.\n * This function is called automatically during WASM initialization\n * in all supported environments (browser, Node.js, Bun, Deno).\n *\n * PDFium provides high-performance PDF parsing and extraction capabilities,\n * enabling reliable text and metadata extraction from PDF documents.\n *\n * If the PDFium module cannot be found or loaded, initialization fails\n * gracefully and PDF extraction will not be available. Users can provide\n * the PDFium module manually via `initialize_pdfium_render()`.\n *\n * @param wasmModule - The loaded Kreuzberg WASM module\n *\n * @internal\n *\n * @example\n * ```typescript\n * // Called automatically during initWasm() in all environments\n * // See wasm-loader.ts for integration\n *\n * // To provide PDFium manually in Node.js:\n * // Set KREUZBERG_PDFIUM_PATH=/path/to/pdfium-wasm-dir\n *\n * // Or initialize manually:\n * import { initWasm, getWasmModule } from '@kreuzberg/wasm';\n * await initWasm();\n * const wasm = getWasmModule();\n * const pdfium = await import('./pdfium.js').then(m => m.default());\n * wasm.initialize_pdfium_render(pdfium, wasm, false);\n * ```\n */\nexport async function initializePdfiumAsync(wasmModule: WasmModule): Promise<void> {\n\tif (!wasmModule || typeof wasmModule.initialize_pdfium_render !== \"function\") {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst pdfiumModule = await loadPdfiumModule();\n\t\tif (!pdfiumModule) {\n\t\t\tconsole.debug(\"PDFium module not found, PDF extraction will not be available\");\n\t\t\tconsole.debug(\"To enable PDF support, provide pdfium.js via KREUZBERG_PDFIUM_PATH or manual initialization\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst pdfium =\n\t\t\ttypeof pdfiumModule.default === \"function\"\n\t\t\t\t? await (pdfiumModule.default as () => Promise<unknown>)()\n\t\t\t\t: pdfiumModule;\n\n\t\tconst success = wasmModule.initialize_pdfium_render(pdfium, wasmModule, false);\n\t\tif (!success) {\n\t\t\tconsole.warn(\"PDFium initialization returned false\");\n\t\t}\n\t} catch (error) {\n\t\tconsole.debug(\"PDFium initialization error:\", error);\n\t}\n}\n","/**\n * WASM Type Adapter\n *\n * This module provides type adapters for converting between JavaScript/TypeScript\n * types and WASM-compatible types, handling File/Blob conversions, config normalization,\n * and result parsing.\n *\n * @example File Conversion\n * ```typescript\n * import { fileToUint8Array } from '@kreuzberg/wasm/adapters/wasm-adapter';\n *\n * const file = event.target.files[0];\n * const bytes = await fileToUint8Array(file);\n * const result = await extractBytes(bytes, file.type);\n * ```\n *\n * @example Config Normalization\n * ```typescript\n * import { configToJS } from '@kreuzberg/wasm/adapters/wasm-adapter';\n *\n * const config = {\n * ocr: { backend: 'tesseract', language: 'eng' },\n * chunking: { maxChars: 1000 }\n * };\n * const normalized = configToJS(config);\n * ```\n */\n\nimport type {\n\tChunk,\n\tDocumentStructure,\n\tElement,\n\tExtractedImage,\n\tExtractedKeyword,\n\tExtractionConfig,\n\tExtractionResult,\n\tMetadata,\n\tOcrElement,\n\tPageContent,\n\tPdfAnnotation,\n\tProcessingWarning,\n\tTable,\n} from \"../types.js\";\n\n/**\n * Maximum file size for processing (512 MB)\n *\n * @internal\n */\nconst MAX_FILE_SIZE = 512 * 1024 * 1024;\n\n/**\n * Type predicate to validate numeric value or null\n *\n * @internal\n */\nfunction isNumberOrNull(value: unknown): value is number | null {\n\treturn typeof value === \"number\" || value === null || value === undefined;\n}\n\n/**\n * Type predicate to validate string value or null\n *\n * @internal\n */\nfunction isStringOrNull(value: unknown): value is string | null {\n\treturn typeof value === \"string\" || value === null || value === undefined;\n}\n\n/**\n * Type predicate to validate boolean value\n *\n * @internal\n */\nfunction isBoolean(value: unknown): value is boolean {\n\treturn typeof value === \"boolean\" || value === undefined;\n}\n\n/**\n * Convert a File or Blob to Uint8Array\n *\n * Handles both browser File API and server-side Blob-like objects,\n * providing a unified interface for reading binary data.\n *\n * @param file - The File or Blob to convert\n * @returns Promise resolving to the byte array\n * @throws {Error} If the file cannot be read or exceeds size limit\n *\n * @example\n * ```typescript\n * const file = document.getElementById('input').files[0];\n * const bytes = await fileToUint8Array(file);\n * const result = await extractBytes(bytes, 'application/pdf');\n * ```\n */\nexport async function fileToUint8Array(file: File | Blob): Promise<Uint8Array> {\n\ttry {\n\t\tif (file.size > MAX_FILE_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`File size (${file.size} bytes) exceeds maximum (${MAX_FILE_SIZE} bytes). Maximum file size is 512 MB.`,\n\t\t\t);\n\t\t}\n\n\t\tconst arrayBuffer = await file.arrayBuffer();\n\t\treturn new Uint8Array(arrayBuffer);\n\t} catch (error) {\n\t\tthrow new Error(`Failed to read file: ${error instanceof Error ? error.message : String(error)}`);\n\t}\n}\n\n/**\n * Normalize ExtractionConfig for WASM processing\n *\n * Converts TypeScript configuration objects to a WASM-compatible format,\n * handling null values, undefined properties, and nested structures.\n *\n * @param config - The extraction configuration or null\n * @returns Normalized configuration object suitable for WASM\n *\n * @example\n * ```typescript\n * const config: ExtractionConfig = {\n * ocr: { backend: 'tesseract' },\n * chunking: { maxChars: 1000 }\n * };\n * const wasmConfig = configToJS(config);\n * ```\n */\nexport function configToJS(config: ExtractionConfig | null): Record<string, unknown> {\n\tif (!config) {\n\t\treturn {};\n\t}\n\n\t// Convert camelCase key to snake_case to match Rust serde field names.\n\tconst toSnakeCase = (str: string): string => str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n\n\tconst normalizeValue = (value: unknown): unknown => {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\tif (typeof value === \"object\") {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\treturn value.map(normalizeValue);\n\t\t\t}\n\t\t\tconst obj = value as Record<string, unknown>;\n\t\t\tconst normalized: Record<string, unknown> = {};\n\t\t\tfor (const [key, val] of Object.entries(obj)) {\n\t\t\t\tconst normalizedVal = normalizeValue(val);\n\t\t\t\tif (normalizedVal !== null && normalizedVal !== undefined) {\n\t\t\t\t\tnormalized[toSnakeCase(key)] = normalizedVal;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Object.keys(normalized).length > 0 ? normalized : null;\n\t\t}\n\t\treturn value;\n\t};\n\n\tconst normalized: Record<string, unknown> = {};\n\tfor (const [key, value] of Object.entries(config)) {\n\t\tconst normalizedValue = normalizeValue(value);\n\t\tif (normalizedValue !== null && normalizedValue !== undefined) {\n\t\t\tnormalized[toSnakeCase(key)] = normalizedValue;\n\t\t}\n\t}\n\n\treturn normalized;\n}\n\n/**\n * Parse WASM extraction result and convert to TypeScript type\n *\n * Handles conversion of WASM-returned objects to proper ExtractionResult types,\n * including proper array conversions and type assertions for tables, chunks, and images.\n *\n * @param jsValue - The raw WASM result value\n * @returns Properly typed ExtractionResult\n * @throws {Error} If the result structure is invalid\n *\n * @example\n * ```typescript\n * const wasmResult = await wasmExtract(bytes, mimeType, config);\n * const result = jsToExtractionResult(wasmResult);\n * console.log(result.content);\n * ```\n */\nexport function jsToExtractionResult(jsValue: unknown): ExtractionResult {\n\tif (!jsValue || typeof jsValue !== \"object\") {\n\t\tthrow new Error(\"Invalid extraction result: value is not an object\");\n\t}\n\n\tconst result = jsValue as Record<string, unknown>;\n\tconst mimeType =\n\t\ttypeof result.mimeType === \"string\"\n\t\t\t? result.mimeType\n\t\t\t: typeof result.mime_type === \"string\"\n\t\t\t\t? result.mime_type\n\t\t\t\t: null;\n\n\tif (typeof result.content !== \"string\") {\n\t\tthrow new Error(\"Invalid extraction result: missing or invalid content\");\n\t}\n\tif (typeof mimeType !== \"string\") {\n\t\tthrow new Error(\"Invalid extraction result: missing or invalid mimeType\");\n\t}\n\tif (!result.metadata || typeof result.metadata !== \"object\") {\n\t\tthrow new Error(\"Invalid extraction result: missing or invalid metadata\");\n\t}\n\n\tconst tables: Table[] = [];\n\tif (Array.isArray(result.tables)) {\n\t\tfor (const table of result.tables) {\n\t\t\tif (table && typeof table === \"object\") {\n\t\t\t\tconst t = table as Record<string, unknown>;\n\t\t\t\tconst pageNumber =\n\t\t\t\t\ttypeof t.pageNumber === \"number\" ? t.pageNumber : typeof t.page_number === \"number\" ? t.page_number : null;\n\t\t\t\tif (\n\t\t\t\t\tArray.isArray(t.cells) &&\n\t\t\t\t\tt.cells.every((row) => Array.isArray(row) && row.every((cell) => typeof cell === \"string\")) &&\n\t\t\t\t\ttypeof t.markdown === \"string\" &&\n\t\t\t\t\tpageNumber !== null\n\t\t\t\t) {\n\t\t\t\t\ttables.push({\n\t\t\t\t\t\tcells: t.cells as string[][],\n\t\t\t\t\t\tmarkdown: t.markdown,\n\t\t\t\t\t\tpageNumber,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconst chunks: Chunk[] | null = Array.isArray(result.chunks)\n\t\t? result.chunks.map((chunk) => {\n\t\t\t\tif (!chunk || typeof chunk !== \"object\") {\n\t\t\t\t\tthrow new Error(\"Invalid chunk structure\");\n\t\t\t\t}\n\t\t\t\tconst c = chunk as Record<string, unknown>;\n\t\t\t\tif (typeof c.content !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid chunk: missing content\");\n\t\t\t\t}\n\t\t\t\tif (!c.metadata || typeof c.metadata !== \"object\") {\n\t\t\t\t\tthrow new Error(\"Invalid chunk: missing metadata\");\n\t\t\t\t}\n\t\t\t\tconst metadata = c.metadata as Record<string, unknown>;\n\n\t\t\t\tlet embedding: number[] | null = null;\n\t\t\t\tif (Array.isArray(c.embedding)) {\n\t\t\t\t\tif (!c.embedding.every((item) => typeof item === \"number\")) {\n\t\t\t\t\t\tthrow new Error(\"Invalid chunk: embedding must contain only numbers\");\n\t\t\t\t\t}\n\t\t\t\t\tembedding = c.embedding;\n\t\t\t\t}\n\n\t\t\t\t// Coerce numeric values - handle BigInt, strings, and numbers\n\t\t\t\tconst coerceToNumber = (value: unknown, fieldName: string): number => {\n\t\t\t\t\tif (typeof value === \"number\") {\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof value === \"bigint\") {\n\t\t\t\t\t\treturn Number(value);\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof value === \"string\") {\n\t\t\t\t\t\tconst parsed = parseInt(value, 10);\n\t\t\t\t\t\tif (Number.isNaN(parsed)) {\n\t\t\t\t\t\t\tthrow new Error(`Invalid chunk metadata: ${fieldName} must be a valid number, got \"${value}\"`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(`Invalid chunk metadata: ${fieldName} must be a number, got ${typeof value}`);\n\t\t\t\t};\n\n\t\t\t\t// The Rust code uses snake_case field names (byte_start, byte_end, etc)\n\t\t\t\t// but TypeScript expects camelCase (charStart, charEnd, etc)\n\t\t\t\t// For now, treat byte offsets as character offsets since the content is UTF-8\n\t\t\t\tconst charStart = coerceToNumber(\n\t\t\t\t\tmetadata.charStart ?? metadata.char_start ?? metadata.byteStart ?? metadata.byte_start,\n\t\t\t\t\t\"charStart\",\n\t\t\t\t);\n\t\t\t\tconst charEnd = coerceToNumber(\n\t\t\t\t\tmetadata.charEnd ?? metadata.char_end ?? metadata.byteEnd ?? metadata.byte_end,\n\t\t\t\t\t\"charEnd\",\n\t\t\t\t);\n\t\t\t\tconst chunkIndex = coerceToNumber(metadata.chunkIndex ?? metadata.chunk_index, \"chunkIndex\");\n\t\t\t\tconst totalChunks = coerceToNumber(metadata.totalChunks ?? metadata.total_chunks, \"totalChunks\");\n\n\t\t\t\tlet tokenCount: number | null = null;\n\t\t\t\tconst tokenCountValue = metadata.tokenCount ?? metadata.token_count;\n\t\t\t\tif (tokenCountValue !== null && tokenCountValue !== undefined) {\n\t\t\t\t\ttokenCount = coerceToNumber(tokenCountValue, \"tokenCount\");\n\t\t\t\t}\n\n\t\t\t\tlet firstPage: number | null = null;\n\t\t\t\tconst firstPageValue = metadata.firstPage ?? metadata.first_page;\n\t\t\t\tif (firstPageValue !== null && firstPageValue !== undefined) {\n\t\t\t\t\tfirstPage = coerceToNumber(firstPageValue, \"firstPage\");\n\t\t\t\t}\n\n\t\t\t\tlet lastPage: number | null = null;\n\t\t\t\tconst lastPageValue = metadata.lastPage ?? metadata.last_page;\n\t\t\t\tif (lastPageValue !== null && lastPageValue !== undefined) {\n\t\t\t\t\tlastPage = coerceToNumber(lastPageValue, \"lastPage\");\n\t\t\t\t}\n\n\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\tconst rawHc = (metadata[\"heading_context\"] ?? metadata[\"headingContext\"]) as\n\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t| null\n\t\t\t\t\t| undefined;\n\t\t\t\tlet headingContext: import(\"../types.js\").HeadingContext | null = null;\n\t\t\t\tif (rawHc && typeof rawHc === \"object\") {\n\t\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\t\tconst rawHeadings = rawHc[\"headings\"];\n\t\t\t\t\tif (Array.isArray(rawHeadings)) {\n\t\t\t\t\t\theadingContext = {\n\t\t\t\t\t\t\theadings: rawHeadings.map((h: unknown) => {\n\t\t\t\t\t\t\t\tconst heading = h as Record<string, unknown>;\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\t\t\t\t\t\tlevel: (heading[\"level\"] as number) ?? 0,\n\t\t\t\t\t\t\t\t\t// biome-ignore lint/complexity/useLiteralKeys: dynamic property access from raw object\n\t\t\t\t\t\t\t\t\ttext: (heading[\"text\"] as string) ?? \"\",\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: c.content,\n\t\t\t\t\tembedding,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tbyteStart: charStart,\n\t\t\t\t\t\tbyteEnd: charEnd,\n\t\t\t\t\t\tcharStart,\n\t\t\t\t\t\tcharEnd,\n\t\t\t\t\t\ttokenCount,\n\t\t\t\t\t\tchunkIndex,\n\t\t\t\t\t\ttotalChunks,\n\t\t\t\t\t\tfirstPage,\n\t\t\t\t\t\tlastPage,\n\t\t\t\t\t\theadingContext,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t})\n\t\t: null;\n\n\tconst images: ExtractedImage[] | null = Array.isArray(result.images)\n\t\t? result.images.map((image) => {\n\t\t\t\tif (!image || typeof image !== \"object\") {\n\t\t\t\t\tthrow new Error(\"Invalid image structure\");\n\t\t\t\t}\n\t\t\t\tconst img = image as Record<string, unknown>;\n\t\t\t\tlet imageData: Uint8Array;\n\t\t\t\tif (img.data instanceof Uint8Array) {\n\t\t\t\t\timageData = img.data;\n\t\t\t\t} else if (Array.isArray(img.data)) {\n\t\t\t\t\timageData = new Uint8Array(img.data as number[]);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Invalid image: data must be Uint8Array or array\");\n\t\t\t\t}\n\t\t\t\tif (typeof img.format !== \"string\") {\n\t\t\t\t\tthrow new Error(\"Invalid image: missing format\");\n\t\t\t\t}\n\n\t\t\t\t// Support both camelCase and snake_case field names (Rust serde uses snake_case)\n\t\t\t\tconst imageIndex = img.imageIndex ?? img.image_index;\n\t\t\t\tconst pageNumber = img.pageNumber ?? img.page_number;\n\t\t\t\tconst bitsPerComponent = img.bitsPerComponent ?? img.bits_per_component;\n\t\t\t\tconst isMask = img.isMask ?? img.is_mask;\n\t\t\t\tconst ocrResult = img.ocrResult ?? img.ocr_result;\n\n\t\t\t\tif (typeof imageIndex !== \"number\") {\n\t\t\t\t\tthrow new Error(\"Invalid image: imageIndex must be a number\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(pageNumber)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: pageNumber must be a number or null\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(img.width)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: width must be a number or null\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(img.height)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: height must be a number or null\");\n\t\t\t\t}\n\t\t\t\tif (!isNumberOrNull(bitsPerComponent)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: bitsPerComponent must be a number or null\");\n\t\t\t\t}\n\n\t\t\t\tif (!isBoolean(isMask)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: isMask must be a boolean\");\n\t\t\t\t}\n\n\t\t\t\tif (!isStringOrNull(img.colorspace)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: colorspace must be a string or null\");\n\t\t\t\t}\n\t\t\t\tif (!isStringOrNull(img.description)) {\n\t\t\t\t\tthrow new Error(\"Invalid image: description must be a string or null\");\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tdata: imageData,\n\t\t\t\t\tformat: img.format,\n\t\t\t\t\timageIndex: imageIndex,\n\t\t\t\t\tpageNumber: pageNumber ?? null,\n\t\t\t\t\twidth: (img.width as number) ?? null,\n\t\t\t\t\theight: (img.height as number) ?? null,\n\t\t\t\t\tcolorspace: (img.colorspace as string) ?? null,\n\t\t\t\t\tbitsPerComponent: bitsPerComponent ?? null,\n\t\t\t\t\tisMask: isMask ?? false,\n\t\t\t\t\tdescription: (img.description as string) ?? null,\n\t\t\t\t\tocrResult: ocrResult ? jsToExtractionResult(ocrResult) : null,\n\t\t\t\t};\n\t\t\t})\n\t\t: null;\n\n\tlet detectedLanguages: string[] | null = null;\n\tconst detectedLanguagesRaw = Array.isArray(result.detectedLanguages)\n\t\t? result.detectedLanguages\n\t\t: result.detected_languages;\n\tif (Array.isArray(detectedLanguagesRaw)) {\n\t\tif (!detectedLanguagesRaw.every((lang) => typeof lang === \"string\")) {\n\t\t\tthrow new Error(\"Invalid result: detectedLanguages must contain only strings\");\n\t\t}\n\t\tdetectedLanguages = detectedLanguagesRaw;\n\t}\n\n\tconst extractedKeywords = (result.extractedKeywords ?? result.extracted_keywords ?? null) as\n\t\t| ExtractedKeyword[]\n\t\t| null;\n\tconst qualityScore =\n\t\ttypeof (result.qualityScore ?? result.quality_score) === \"number\"\n\t\t\t? ((result.qualityScore ?? result.quality_score) as number)\n\t\t\t: null;\n\tconst processingWarnings = (result.processingWarnings ?? result.processing_warnings ?? null) as\n\t\t| ProcessingWarning[]\n\t\t| null;\n\tconst elements = (result.elements ?? null) as Element[] | null;\n\tconst ocrElements = (result.ocrElements ?? result.ocr_elements ?? null) as OcrElement[] | null;\n\tconst document = (result.document ?? null) as DocumentStructure | null;\n\tconst pages = (result.pages ?? null) as PageContent[] | null;\n\tconst annotations = (result.annotations ?? null) as PdfAnnotation[] | null;\n\n\treturn {\n\t\tcontent: result.content,\n\t\tmimeType,\n\t\tmetadata: (result.metadata ?? {}) as Metadata,\n\t\ttables,\n\t\tdetectedLanguages,\n\t\tchunks,\n\t\timages,\n\t\tpages,\n\t\textractedKeywords,\n\t\tqualityScore,\n\t\tprocessingWarnings,\n\t\telements,\n\t\tocrElements,\n\t\tdocument,\n\t\tannotations,\n\t};\n}\n\n/**\n * Wrap and format WASM errors with context\n *\n * Converts WASM error messages to JavaScript Error objects with proper context\n * and stack trace information when available.\n *\n * @param error - The error from WASM\n * @param context - Additional context about what operation failed\n * @returns A formatted Error object\n *\n * @internal\n *\n * @example\n * ```typescript\n * try {\n * await wasmExtract(bytes, mimeType);\n * } catch (error) {\n * throw wrapWasmError(error, 'extracting document');\n * }\n * ```\n */\nexport function wrapWasmError(error: unknown, context: string): Error {\n\tif (error instanceof Error) {\n\t\treturn new Error(`Error ${context}: ${error.message}`, {\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\tconst message = String(error);\n\treturn new Error(`Error ${context}: ${message}`);\n}\n\n/**\n * Validate that a WASM-returned value conforms to ExtractionResult structure\n *\n * Performs structural validation without full type checking,\n * useful for runtime validation of WASM output.\n *\n * @param value - The value to validate\n * @returns True if value appears to be a valid ExtractionResult\n *\n * @internal\n */\nexport function isValidExtractionResult(value: unknown): value is ExtractionResult {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst obj = value as Record<string, unknown>;\n\treturn (\n\t\ttypeof obj.content === \"string\" &&\n\t\t(typeof obj.mimeType === \"string\" || typeof obj.mime_type === \"string\") &&\n\t\tobj.metadata !== null &&\n\t\ttypeof obj.metadata === \"object\" &&\n\t\tArray.isArray(obj.tables)\n\t);\n}\n","/**\n * WASM Initialization State\n *\n * Centralized state management for WASM module initialization.\n * Provides access to the loaded WASM module and initialization status.\n * This module has no dependencies to avoid circular imports.\n */\n\nexport type WasmModule = {\n\textractBytes: (data: Uint8Array, mimeType: string, config: Record<string, unknown> | null) => Promise<unknown>;\n\textractBytesSync: (data: Uint8Array, mimeType: string, config: Record<string, unknown> | null) => unknown;\n\tbatchExtractBytes: (\n\t\tdataList: Uint8Array[],\n\t\tmimeTypes: string[],\n\t\tconfig: Record<string, unknown> | null,\n\t) => Promise<unknown>;\n\tbatchExtractBytesSync: (\n\t\tdataList: Uint8Array[],\n\t\tmimeTypes: string[],\n\t\tconfig: Record<string, unknown> | null,\n\t) => unknown;\n\textractFile: (file: File, mimeType: string | null, config: Record<string, unknown> | null) => Promise<unknown>;\n\tbatchExtractFiles: (files: File[], config: Record<string, unknown> | null) => Promise<unknown>;\n\n\tdetectMimeFromBytes: (data: Uint8Array) => string;\n\tnormalizeMimeType: (mimeType: string) => string;\n\tgetMimeFromExtension: (extension: string) => string | null;\n\tgetExtensionsForMime: (mimeType: string) => string[];\n\n\tloadConfigFromString: (content: string, format: string) => Record<string, unknown>;\n\tdiscoverConfig: () => Record<string, unknown>;\n\n\tversion: () => string;\n\tget_module_info: () => ModuleInfo;\n\n\tregister_ocr_backend: (backend: unknown) => void;\n\tunregister_ocr_backend: (name: string) => void;\n\tlist_ocr_backends: () => string[];\n\tclear_ocr_backends: () => void;\n\n\tregister_post_processor: (processor: unknown) => void;\n\tunregister_post_processor: (name: string) => void;\n\tlist_post_processors: () => string[];\n\tclear_post_processors: () => void;\n\n\tregister_validator: (validator: unknown) => void;\n\tunregister_validator: (name: string) => void;\n\tlist_validators: () => string[];\n\tclear_validators: () => void;\n\n\tinitialize_pdfium_render: (pdfiumWasmModule: unknown, localWasmModule: unknown, debug: boolean) => boolean;\n\tread_block_from_callback_wasm: (param: number, position: number, pBuf: number, size: number) => number;\n\twrite_block_from_callback_wasm: (param: number, buf: number, size: number) => number;\n\n\tocrIsAvailable?: () => boolean;\n\tocrRecognize?: (imageBytes: Uint8Array, tessdata: Uint8Array, language: string) => string;\n\tocrRecognizeRaw?: (\n\t\timageData: Uint8Array,\n\t\twidth: number,\n\t\theight: number,\n\t\tbytesPerPixel: number,\n\t\tbytesPerLine: number,\n\t\ttessdata: Uint8Array,\n\t\tlanguage: string,\n\t) => string;\n\tocrTesseractVersion?: () => string;\n\n\tdefault?: (moduleOrPath?: BufferSource | WebAssembly.Module | string | URL | Response | Request) => Promise<void>;\n};\n\nexport type ModuleInfo = {\n\tname: () => string;\n\tversion: () => string;\n\tfree: () => void;\n};\n\n/** WASM module instance */\nlet wasm: WasmModule | null = null;\n\n/** Initialize flag */\nlet initialized = false;\n\n/** Initialization error (if any) */\nlet initializationError: Error | null = null;\n\n/** Initialization promise for handling concurrent init calls */\nlet initializationPromise: Promise<void> | null = null;\n\n/**\n * Get the loaded WASM module\n *\n * @returns The WASM module instance or null if not loaded\n * @internal\n */\nexport function getWasmModule(): WasmModule | null {\n\treturn wasm;\n}\n\n/**\n * Set the WASM module instance\n *\n * @param module The WASM module instance\n * @internal\n */\nexport function setWasmModule(module: WasmModule): void {\n\twasm = module;\n}\n\n/**\n * Check if WASM module is initialized\n *\n * @returns True if WASM module is initialized, false otherwise\n */\nexport function isInitialized(): boolean {\n\treturn initialized;\n}\n\n/**\n * Set the initialized flag\n *\n * @param value The initialized state\n * @internal\n */\nexport function setInitialized(value: boolean): void {\n\tinitialized = value;\n}\n\n/**\n * Get initialization error if module failed to load\n *\n * @returns The error that occurred during initialization, or null if no error\n * @internal\n */\nexport function getInitializationError(): Error | null {\n\treturn initializationError;\n}\n\n/**\n * Set the initialization error\n *\n * @param error The error that occurred during initialization\n * @internal\n */\nexport function setInitializationError(error: Error | null): void {\n\tinitializationError = error;\n}\n\n/**\n * Get the current initialization promise\n *\n * @returns The initialization promise or null if not initializing\n * @internal\n */\nexport function getInitializationPromise(): Promise<void> | null {\n\treturn initializationPromise;\n}\n\n/**\n * Set the initialization promise\n *\n * @param promise The initialization promise\n * @internal\n */\nexport function setInitializationPromise(promise: Promise<void> | null): void {\n\tinitializationPromise = promise;\n}\n","/**\n * WASM Module Loader\n *\n * Handles WASM module loading, initialization, and state management.\n * Provides a clean interface for loading the Kreuzberg WASM module\n * with support for concurrent initialization calls.\n */\n\nimport { wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport { hasWasm, isDeno, isEdgeEnvironment, isNode } from \"../runtime.js\";\nimport { initializePdfiumAsync } from \"./pdfium-loader.js\";\n\n/**\n * Options for initializing the WASM module.\n */\nexport interface InitWasmOptions {\n\t/**\n\t * A pre-loaded WebAssembly.Module for the Kreuzberg WASM binary.\n\t *\n\t * Required in restricted edge environments (Cloudflare Workers, Vercel Edge,\n\t * Supabase edge functions) where the runtime cannot fetch `file://` URLs.\n\t * Import the `.wasm` file as a static import and pass it here.\n\t *\n\t * @example Cloudflare Workers\n\t * ```typescript\n\t * import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n\t * import { initWasm } from '@kreuzberg/wasm';\n\t *\n\t * export default {\n\t * async fetch(request: Request): Promise<Response> {\n\t * await initWasm({ wasmModule });\n\t * // ... use extraction functions\n\t * }\n\t * };\n\t * ```\n\t *\n\t * @example Supabase Edge Functions (Deno)\n\t * ```typescript\n\t * import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n\t * import { initWasm, extractBytes } from '@kreuzberg/wasm';\n\t *\n\t * Deno.serve(async (req: Request) => {\n\t * await initWasm({ wasmModule });\n\t * // ... use extraction functions\n\t * });\n\t * ```\n\t */\n\twasmModule?: WebAssembly.Module;\n}\n\n/**\n * Load WASM binary from file system in Node.js or Deno environment.\n * Returns undefined in browser/edge environments (fetch or explicit module will be used instead).\n */\nasync function loadWasmBinaryForNode(): Promise<Uint8Array | undefined> {\n\tif (isNode()) {\n\t\ttry {\n\t\t\t// Dynamic import to avoid bundling Node.js modules\n\t\t\tconst fs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\t\tconst path = await import(/* @vite-ignore */ \"node:path\");\n\t\t\tconst url = await import(/* @vite-ignore */ \"node:url\");\n\n\t\t\t// Resolve the WASM file path relative to this module\n\t\t\t// The module is in dist/initialization/wasm-loader.js\n\t\t\t// The WASM file is in dist/pkg/kreuzberg_wasm_bg.wasm\n\t\t\tconst __dirname = path.dirname(url.fileURLToPath(import.meta.url));\n\t\t\tconst wasmPath = path.join(__dirname, \"..\", \"pkg\", \"kreuzberg_wasm_bg.wasm\");\n\n\t\t\tconst wasmBuffer = await fs.readFile(wasmPath);\n\t\t\treturn new Uint8Array(wasmBuffer);\n\t\t} catch {\n\t\t\t// Fall back to fetch-based loading if file system access fails\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tif (isDeno()) {\n\t\ttry {\n\t\t\t// In Deno, use Deno.readFile to load the WASM binary from disk.\n\t\t\t// import.meta.url is a file:// URL pointing to the current module.\n\t\t\t// Construct the path to dist/pkg/kreuzberg_wasm_bg.wasm relative to this module.\n\t\t\t// This works in regular Deno but will throw in restricted environments\n\t\t\t// (e.g. Supabase edge) where file:// access is blocked — the caller\n\t\t\t// then falls through to the edge-environment error with instructions.\n\t\t\tconst denoGlobal = globalThis as unknown as Record<string, unknown>;\n\t\t\tconst DenoNs = denoGlobal.Deno as Record<string, unknown>;\n\t\t\tconst readFile = DenoNs.readFile as (path: URL) => Promise<Uint8Array>;\n\n\t\t\tconst moduleUrl = new URL(import.meta.url);\n\t\t\tconst wasmUrl = new URL(\"../pkg/kreuzberg_wasm_bg.wasm\", moduleUrl);\n\n\t\t\tconst wasmBuffer = await readFile(wasmUrl);\n\t\t\treturn wasmBuffer;\n\t\t} catch {\n\t\t\t// Supabase edge and other restricted Deno environments block file:// reads.\n\t\t\t// Fall through to let the caller handle the edge environment case.\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\nimport {\n\tgetInitializationError,\n\tgetInitializationPromise,\n\tgetWasmModule,\n\tisInitialized,\n\ttype ModuleInfo,\n\tsetInitializationError,\n\tsetInitializationPromise,\n\tsetInitialized,\n\tsetWasmModule,\n\ttype WasmModule,\n} from \"./state.js\";\n\nexport type { WasmModule, ModuleInfo };\n\n/**\n * Get the loaded WASM module\n *\n * @returns The WASM module instance or null if not loaded\n * @internal\n */\nexport { getWasmModule };\n\n/**\n * Check if WASM module is initialized\n *\n * @returns True if WASM module is initialized, false otherwise\n */\nexport { isInitialized };\n\n/**\n * Get initialization error if module failed to load\n *\n * @returns The error that occurred during initialization, or null if no error\n * @internal\n */\nexport { getInitializationError };\n\n/**\n * Get WASM module version\n *\n * @throws {Error} If WASM module is not initialized\n * @returns The version string of the WASM module\n */\nexport function getVersion(): string {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasmModule = getWasmModule();\n\tif (!wasmModule) {\n\t\tthrow new Error(\"WASM module not loaded. Call initWasm() first.\");\n\t}\n\n\treturn wasmModule.version();\n}\n\n/**\n * Initialize the WASM module\n *\n * This function must be called once before using any extraction functions.\n * It loads and initializes the WASM module in the current runtime environment,\n * automatically selecting the appropriate WASM variant for the detected runtime.\n *\n * Multiple calls to initWasm() are safe and will return immediately if already initialized.\n *\n * @param options - Optional configuration for WASM initialization\n * @throws {Error} If WASM module fails to load or is not supported in the current environment\n *\n * @example Basic Usage (Node.js / Browser)\n * ```typescript\n * import { initWasm } from '@kreuzberg/wasm';\n *\n * async function main() {\n * await initWasm();\n * // Now you can use extraction functions\n * }\n *\n * main().catch(console.error);\n * ```\n *\n * @example Cloudflare Workers\n * ```typescript\n * import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\n * import { initWasm, extractBytes } from '@kreuzberg/wasm';\n *\n * export default {\n * async fetch(request: Request): Promise<Response> {\n * await initWasm({ wasmModule });\n * const bytes = new Uint8Array(await request.arrayBuffer());\n * const result = await extractBytes(bytes, 'application/pdf');\n * return new Response(JSON.stringify(result));\n * }\n * };\n * ```\n *\n * @example With Error Handling\n * ```typescript\n * import { initWasm, getWasmCapabilities } from '@kreuzberg/wasm';\n *\n * async function initializeKreuzberg() {\n * const caps = getWasmCapabilities();\n * if (!caps.hasWasm) {\n * throw new Error('WebAssembly is not supported in this environment');\n * }\n *\n * try {\n * await initWasm();\n * console.log('Kreuzberg initialized successfully');\n * } catch (error) {\n * console.error('Failed to initialize Kreuzberg:', error);\n * throw error;\n * }\n * }\n * ```\n */\nexport async function initWasm(options?: InitWasmOptions): Promise<void> {\n\tif (isInitialized()) {\n\t\treturn;\n\t}\n\n\tlet currentPromise = getInitializationPromise();\n\tif (currentPromise) {\n\t\treturn currentPromise;\n\t}\n\n\tcurrentPromise = (async () => {\n\t\ttry {\n\t\t\tif (!hasWasm()) {\n\t\t\t\tthrow new Error(\"WebAssembly is not supported in this environment\");\n\t\t\t}\n\n\t\t\t// Import the wasm-bindgen JS glue module. We try multiple paths to handle:\n\t\t\t// - URL-based: ../pkg/ (workspace-linked), ./kreuzberg_wasm.js (legacy)\n\t\t\t// - String-based: ./pkg/, ../pkg/ (edge runtimes that can't resolve file:// URLs)\n\t\t\t// String paths use variable construction to avoid Vite static analysis failures.\n\t\t\tconst baseUrl = new URL(import.meta.url);\n\t\t\tconst modulePaths = [\n\t\t\t\tnew URL(\"../pkg/kreuzberg_wasm.js\", baseUrl).href,\n\t\t\t\tnew URL(\"./kreuzberg_wasm.js\", baseUrl).href,\n\t\t\t\t[\".\", \"pkg\", \"kreuzberg_wasm.js\"].join(\"/\"),\n\t\t\t\t[\"..\", \"pkg\", \"kreuzberg_wasm.js\"].join(\"/\"),\n\t\t\t];\n\n\t\t\tlet wasmModule: unknown;\n\t\t\tlet lastError: unknown;\n\t\t\tfor (const modulePath of modulePaths) {\n\t\t\t\ttry {\n\t\t\t\t\twasmModule = await import(/* @vite-ignore */ modulePath);\n\t\t\t\t\tbreak;\n\t\t\t\t} catch (e) {\n\t\t\t\t\tlastError = e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!wasmModule) {\n\t\t\t\tthrow lastError;\n\t\t\t}\n\t\t\tconst loadedModule = wasmModule as unknown as WasmModule;\n\t\t\tsetWasmModule(loadedModule);\n\n\t\t\tif (loadedModule && typeof loadedModule.default === \"function\") {\n\t\t\t\t// If a WebAssembly.Module was provided (e.g. for Cloudflare Workers), use it directly.\n\t\t\t\tif (options?.wasmModule) {\n\t\t\t\t\tawait loadedModule.default(options.wasmModule);\n\t\t\t\t} else {\n\t\t\t\t\t// In Node.js / Deno, load WASM binary from file system to avoid fetch issues.\n\t\t\t\t\t// In restricted Deno environments (Supabase edge) file:// access fails and\n\t\t\t\t\t// loadWasmBinaryForNode() returns undefined — we then require an explicit module.\n\t\t\t\t\t// In browsers, the default() function uses fetch with import.meta.url.\n\t\t\t\t\tconst wasmBinary = await loadWasmBinaryForNode();\n\t\t\t\t\tif (wasmBinary) {\n\t\t\t\t\t\tawait loadedModule.default(wasmBinary);\n\t\t\t\t\t} else if (isEdgeEnvironment() || isDeno()) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Edge/restricted environment detected (Cloudflare Workers / Vercel Edge / Supabase). \" +\n\t\t\t\t\t\t\t\t\"Cannot automatically load .wasm file because fetch() does not support file:// URLs. \" +\n\t\t\t\t\t\t\t\t\"Pass the WASM module explicitly:\\n\\n\" +\n\t\t\t\t\t\t\t\t\" import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';\\n\" +\n\t\t\t\t\t\t\t\t\" await initWasm({ wasmModule });\\n\",\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait loadedModule.default();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (loadedModule && typeof loadedModule.initialize_pdfium_render === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tawait initializePdfiumAsync(loadedModule);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\"PDFium auto-initialization failed (PDF extraction disabled):\", error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetInitialized(true);\n\t\t\tsetInitializationError(null);\n\t\t} catch (error) {\n\t\t\tsetInitializationError(error instanceof Error ? error : new Error(String(error)));\n\t\t\tthrow wrapWasmError(error, \"initializing Kreuzberg WASM module\");\n\t\t}\n\t})();\n\n\tsetInitializationPromise(currentPromise);\n\treturn currentPromise;\n}\n","/**\n * Internal extraction module helpers\n *\n * Provides internal utilities and access to the WASM module state.\n * Re-exports state management from the centralized state module.\n */\n\nimport {\n\tgetWasmModule as getWasmModuleFromState,\n\tisInitialized as isInitializedFromState,\n\ttype WasmModule,\n} from \"../initialization/state.js\";\n\n/**\n * Get the WASM module\n *\n * @returns The WASM module\n * @throws {Error} If WASM module is not loaded\n */\nexport function getWasmModule(): WasmModule {\n\tconst wasm = getWasmModuleFromState();\n\tif (!wasm) {\n\t\tthrow new Error(\"WASM module not loaded. Call initWasm() first.\");\n\t}\n\n\treturn wasm;\n}\n\n/**\n * Check if WASM module is initialized\n *\n * @returns True if WASM module is initialized\n */\nexport function isInitialized(): boolean {\n\treturn isInitializedFromState();\n}\n","/**\n * Byte-based extraction functions\n *\n * Provides synchronous and asynchronous extraction functions for document bytes.\n */\n\nimport { configToJS, jsToExtractionResult, wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport type { ExtractionConfig as ExtractionConfigType, ExtractionResult } from \"../types.js\";\nimport { getWasmModule, isInitialized } from \"./internal.js\";\n\n/**\n * Extract content from bytes (document data)\n *\n * Extracts text, metadata, tables, images, and other content from document bytes.\n * Automatically detects document type from MIME type and applies appropriate extraction logic.\n *\n * @param data - The document bytes to extract from\n * @param mimeType - MIME type of the document (e.g., 'application/pdf', 'image/jpeg')\n * @param config - Optional extraction configuration\n * @returns Promise resolving to the extraction result\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example Extract PDF\n * ```typescript\n * const bytes = new Uint8Array(buffer);\n * const result = await extractBytes(bytes, 'application/pdf');\n * console.log(result.content);\n * console.log(result.tables);\n * ```\n *\n * @example Extract with Configuration\n * ```typescript\n * const result = await extractBytes(bytes, 'application/pdf', {\n * ocr: {\n * backend: 'tesseract',\n * language: 'deu' // German\n * },\n * images: {\n * extractImages: true,\n * targetDpi: 200\n * }\n * });\n * ```\n *\n * @example Extract from File\n * ```typescript\n * const file = inputEvent.target.files[0];\n * const bytes = await fileToUint8Array(file);\n * const result = await extractBytes(bytes, file.type);\n * ```\n */\nexport async function extractBytes(\n\tdata: Uint8Array,\n\tmimeType: string,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!data || data.length === 0) {\n\t\t\tthrow new Error(\"Document data cannot be empty\");\n\t\t}\n\n\t\tif (!mimeType) {\n\t\t\tthrow new Error(\"MIME type is required\");\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst result = await wasm.extractBytes(data, mimeType, normalizedConfig);\n\n\t\tif (!result) {\n\t\t\tthrow new Error(\"Invalid extraction result: no result from WASM module\");\n\t\t}\n\n\t\treturn jsToExtractionResult(result);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"extracting from bytes\");\n\t}\n}\n\n/**\n * Extract content from bytes synchronously\n *\n * Synchronous version of {@link extractBytes}. Extracts text, metadata, tables,\n * and other content from document bytes without async/await.\n *\n * **Note:** This function blocks the current thread until extraction completes.\n * For large documents, prefer the async {@link extractBytes} function.\n *\n * @param data - The document bytes to extract from\n * @param mimeType - MIME type of the document (e.g., 'application/pdf', 'image/jpeg')\n * @param config - Optional extraction configuration\n * @returns The extraction result\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example\n * ```typescript\n * const bytes = new Uint8Array(buffer);\n * const result = extractBytesSync(bytes, 'text/plain');\n * console.log(result.content);\n * ```\n */\nexport function extractBytesSync(\n\tdata: Uint8Array,\n\tmimeType: string,\n\tconfig?: ExtractionConfigType | null,\n): ExtractionResult {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!data || data.length === 0) {\n\t\t\tthrow new Error(\"Document data cannot be empty\");\n\t\t}\n\n\t\tif (!mimeType) {\n\t\t\tthrow new Error(\"MIME type is required\");\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst result = wasm.extractBytesSync(data, mimeType, normalizedConfig);\n\n\t\tif (!result) {\n\t\t\tthrow new Error(\"Invalid extraction result: no result from WASM module\");\n\t\t}\n\n\t\treturn jsToExtractionResult(result);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"extracting from bytes (sync)\");\n\t}\n}\n","/**\n * File-based extraction functions\n *\n * Provides extraction functions for files in filesystem-based environments (Node.js, Deno, Bun)\n * and browser File/Blob objects.\n */\n\nimport { fileToUint8Array, wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport { detectRuntime } from \"../runtime.js\";\nimport type { ExtractionConfig as ExtractionConfigType, ExtractionResult } from \"../types.js\";\nimport { extractBytes } from \"./bytes.js\";\nimport { getWasmModule, isInitialized } from \"./internal.js\";\n\n/**\n * Extract content from a file on the file system\n *\n * Node.js and Deno specific function that reads a file from the file system\n * and extracts content from it. Automatically detects MIME type if not provided.\n *\n * @param path - Path to the file to extract from\n * @param mimeType - Optional MIME type of the file. If not provided, will attempt to detect\n * @param config - Optional extraction configuration\n * @returns Promise resolving to the extraction result\n * @throws {Error} If WASM module is not initialized, file doesn't exist, or extraction fails\n *\n * @example Extract with auto-detection\n * ```typescript\n * const result = await extractFile('./document.pdf');\n * console.log(result.content);\n * ```\n *\n * @example Extract with explicit MIME type\n * ```typescript\n * const result = await extractFile('./document.docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');\n * ```\n *\n * @example Extract from Node.js with config\n * ```typescript\n * import { extractFile } from '@kreuzberg/wasm';\n * import { readFile } from 'fs/promises';\n *\n * const result = await extractFile('./report.xlsx', null, {\n * chunking: {\n * maxChars: 1000\n * }\n * });\n * ```\n */\nexport async function extractFile(\n\tpath: string,\n\tmimeType?: string | null,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!path) {\n\t\t\tthrow new Error(\"File path is required\");\n\t\t}\n\n\t\tconst runtime = detectRuntime();\n\t\tif (runtime === \"browser\") {\n\t\t\tthrow new Error(\"Use extractBytes with fileToUint8Array for browser environments\");\n\t\t}\n\n\t\tlet fileData: Uint8Array;\n\n\t\tif (runtime === \"node\") {\n\t\t\tconst { readFile } = await import(\"node:fs/promises\");\n\t\t\tconst buffer = await readFile(path);\n\t\t\tfileData = new Uint8Array(buffer);\n\t\t} else if (runtime === \"deno\") {\n\t\t\tconst deno = (globalThis as Record<string, unknown>).Deno as {\n\t\t\t\treadFile: (path: string) => Promise<Uint8Array>;\n\t\t\t};\n\t\t\tfileData = await deno.readFile(path);\n\t\t} else if (runtime === \"bun\") {\n\t\t\tconst { readFile } = await import(\"node:fs/promises\");\n\t\t\tconst buffer = await readFile(path);\n\t\t\tfileData = new Uint8Array(buffer);\n\t\t} else {\n\t\t\tthrow new Error(`Unsupported runtime for file extraction: ${runtime}`);\n\t\t}\n\n\t\tlet detectedMimeType = mimeType;\n\t\tif (!detectedMimeType) {\n\t\t\tdetectedMimeType = wasm.detectMimeFromBytes(fileData);\n\t\t}\n\n\t\tif (!detectedMimeType) {\n\t\t\tthrow new Error(\"Could not detect MIME type for file. Please provide mimeType parameter.\");\n\t\t}\n\n\t\tdetectedMimeType = wasm.normalizeMimeType(detectedMimeType);\n\n\t\treturn await extractBytes(fileData, detectedMimeType, config);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, `extracting from file: ${path}`);\n\t}\n}\n\n/**\n * Extract content from a File or Blob (browser-friendly wrapper)\n *\n * Convenience function that wraps fileToUint8Array and extractBytes,\n * providing a streamlined API for browser applications handling file inputs.\n *\n * @param file - The File or Blob to extract from\n * @param mimeType - Optional MIME type. If not provided, uses file.type if available\n * @param config - Optional extraction configuration\n * @returns Promise resolving to the extraction result\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example Simple file extraction\n * ```typescript\n * const fileInput = document.getElementById('file');\n * fileInput.addEventListener('change', async (e) => {\n * const file = e.target.files?.[0];\n * if (file) {\n * const result = await extractFromFile(file);\n * console.log(result.content);\n * }\n * });\n * ```\n *\n * @example With configuration\n * ```typescript\n * const result = await extractFromFile(file, file.type, {\n * chunking: { maxChars: 1000 },\n * images: { extractImages: true }\n * });\n * ```\n */\nexport async function extractFromFile(\n\tfile: File | Blob,\n\tmimeType?: string | null,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tconst bytes = await fileToUint8Array(file);\n\t\tlet type = mimeType ?? (file instanceof File ? file.type : \"application/octet-stream\");\n\n\t\ttype = wasm.normalizeMimeType(type);\n\n\t\treturn await extractBytes(bytes, type, config);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, `extracting from ${file instanceof File ? \"file\" : \"blob\"}`);\n\t}\n}\n","/**\n * Batch extraction functions\n *\n * Provides batch processing capabilities for extracting from multiple documents\n * in a single operation for improved efficiency.\n */\n\nimport { configToJS, fileToUint8Array, jsToExtractionResult, wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport type { ExtractionConfig as ExtractionConfigType, ExtractionResult } from \"../types.js\";\nimport { getWasmModule, isInitialized } from \"./internal.js\";\n\n/**\n * Batch extract content from multiple byte arrays asynchronously\n *\n * Extracts content from multiple documents in a single batch operation,\n * allowing for more efficient processing of multiple files.\n *\n * @param files - Array of objects containing data (Uint8Array) and mimeType (string)\n * @param config - Optional extraction configuration applied to all files\n * @returns Promise resolving to array of extraction results\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example\n * ```typescript\n * const files = [\n * { data: pdfBytes, mimeType: 'application/pdf' },\n * { data: docxBytes, mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }\n * ];\n * const results = await batchExtractBytes(files);\n * results.forEach((result) => console.log(result.content));\n * ```\n */\nexport async function batchExtractBytes(\n\tfiles: Array<{ data: Uint8Array; mimeType: string }>,\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult[]> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!Array.isArray(files)) {\n\t\t\tthrow new Error(\"Files parameter must be an array\");\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tthrow new Error(\"Files array cannot be empty\");\n\t\t}\n\n\t\tconst dataList: Uint8Array[] = [];\n\t\tconst mimeTypes: string[] = [];\n\n\t\tfor (let i = 0; i < files.length; i += 1) {\n\t\t\tconst file = files[i];\n\t\t\tif (!file || typeof file !== \"object\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: must be an object with data and mimeType`);\n\t\t\t}\n\n\t\t\tconst f = file as Record<string, unknown>;\n\n\t\t\tif (!(f.data instanceof Uint8Array)) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data must be Uint8Array`);\n\t\t\t}\n\n\t\t\tif (typeof f.mimeType !== \"string\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: mimeType must be a string`);\n\t\t\t}\n\n\t\t\tif (f.data.length === 0) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data cannot be empty`);\n\t\t\t}\n\n\t\t\tdataList.push(f.data);\n\t\t\tmimeTypes.push(f.mimeType);\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst results = await wasm.batchExtractBytes(dataList, mimeTypes, normalizedConfig);\n\n\t\tif (!Array.isArray(results)) {\n\t\t\tthrow new Error(\"Invalid batch extraction result: expected array\");\n\t\t}\n\n\t\treturn results.map((result, index) => {\n\t\t\tif (!result) {\n\t\t\t\tthrow new Error(`Invalid extraction result at index ${index}: no result from WASM module`);\n\t\t\t}\n\n\t\t\treturn jsToExtractionResult(result);\n\t\t});\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"batch extracting from bytes\");\n\t}\n}\n\n/**\n * Batch extract content from multiple byte arrays synchronously\n *\n * Synchronous version of {@link batchExtractBytes}. Extracts content from multiple\n * documents in a single batch operation without async/await.\n *\n * **Note:** This function blocks the current thread until all extractions complete.\n * For large batches, prefer the async {@link batchExtractBytes} function.\n *\n * @param files - Array of objects containing data (Uint8Array) and mimeType (string)\n * @param config - Optional extraction configuration applied to all files\n * @returns Array of extraction results\n * @throws {Error} If WASM module is not initialized or extraction fails\n *\n * @example\n * ```typescript\n * const files = [\n * { data: txtBytes, mimeType: 'text/plain' },\n * { data: htmlBytes, mimeType: 'text/html' }\n * ];\n * const results = batchExtractBytesSync(files);\n * results.forEach((result) => console.log(result.content));\n * ```\n */\nexport function batchExtractBytesSync(\n\tfiles: Array<{ data: Uint8Array; mimeType: string }>,\n\tconfig?: ExtractionConfigType | null,\n): ExtractionResult[] {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\tif (!Array.isArray(files)) {\n\t\t\tthrow new Error(\"Files parameter must be an array\");\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tthrow new Error(\"Files array cannot be empty\");\n\t\t}\n\n\t\tconst dataList: Uint8Array[] = [];\n\t\tconst mimeTypes: string[] = [];\n\n\t\tfor (let i = 0; i < files.length; i += 1) {\n\t\t\tconst file = files[i];\n\t\t\tif (!file || typeof file !== \"object\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: must be an object with data and mimeType`);\n\t\t\t}\n\n\t\t\tconst f = file as Record<string, unknown>;\n\n\t\t\tif (!(f.data instanceof Uint8Array)) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data must be Uint8Array`);\n\t\t\t}\n\n\t\t\tif (typeof f.mimeType !== \"string\") {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: mimeType must be a string`);\n\t\t\t}\n\n\t\t\tif (f.data.length === 0) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: data cannot be empty`);\n\t\t\t}\n\n\t\t\tdataList.push(f.data);\n\t\t\tmimeTypes.push(f.mimeType);\n\t\t}\n\n\t\tconst normalizedConfig = configToJS(config ?? null);\n\n\t\tconst results = wasm.batchExtractBytesSync(dataList, mimeTypes, normalizedConfig);\n\n\t\tif (!Array.isArray(results)) {\n\t\t\tthrow new Error(\"Invalid batch extraction result: expected array\");\n\t\t}\n\n\t\treturn results.map((result, index) => {\n\t\t\tif (!result) {\n\t\t\t\tthrow new Error(`Invalid extraction result at index ${index}: no result from WASM module`);\n\t\t\t}\n\n\t\t\treturn jsToExtractionResult(result);\n\t\t});\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"batch extracting from bytes (sync)\");\n\t}\n}\n\n/**\n * Batch extract content from multiple File objects asynchronously\n *\n * Convenience function that converts File objects to Uint8Array and calls batchExtractBytes.\n * Automatically uses the file.type as MIME type if available.\n *\n * @param files - Array of File objects to extract from\n * @param config - Optional extraction configuration applied to all files\n * @returns Promise resolving to array of extraction results\n * @throws {Error} If WASM module is not initialized, files cannot be read, or extraction fails\n *\n * @example\n * ```typescript\n * const fileInput = document.getElementById('files');\n * const files = Array.from(fileInput.files ?? []);\n * const results = await batchExtractFiles(files);\n * results.forEach((result, index) => {\n * console.log(`File ${index}: ${result.content.substring(0, 50)}...`);\n * });\n * ```\n */\nexport async function batchExtractFiles(\n\tfiles: File[],\n\tconfig?: ExtractionConfigType | null,\n): Promise<ExtractionResult[]> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\ttry {\n\t\tif (!Array.isArray(files)) {\n\t\t\tthrow new Error(\"Files parameter must be an array\");\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\tthrow new Error(\"Files array cannot be empty\");\n\t\t}\n\n\t\tconst byteFiles: Array<{ data: Uint8Array; mimeType: string }> = [];\n\n\t\tfor (let i = 0; i < files.length; i += 1) {\n\t\t\tconst file = files[i];\n\t\t\tif (!(file instanceof File)) {\n\t\t\t\tthrow new Error(`Invalid file at index ${i}: must be a File object`);\n\t\t\t}\n\n\t\t\tconst bytes = await fileToUint8Array(file);\n\t\t\tbyteFiles.push({\n\t\t\t\tdata: bytes,\n\t\t\t\tmimeType: file.type || \"application/octet-stream\",\n\t\t\t});\n\t\t}\n\n\t\treturn await batchExtractBytes(byteFiles, config);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"batch extracting from files\");\n\t}\n}\n","/**\n * OCR Backend Registry\n *\n * Provides a registry for OCR backends in the WASM environment.\n * This enables auto-registration and management of OCR backends.\n *\n * Note: The WASM package provides a lightweight registry in the browser.\n * For more advanced features like Rust integration, use @kreuzberg/node or @kreuzberg/deno.\n *\n * @example\n * ```typescript\n * import { TesseractWasmBackend } from '@kreuzberg/wasm/ocr/tesseract-wasm-backend';\n * import { enableOcr } from '@kreuzberg/wasm';\n *\n * // Simple auto-registration\n * await enableOcr();\n * ```\n */\n\nimport type { OcrBackendProtocol } from \"../types.js\";\n\n/** Global registry of OCR backends */\nconst ocrBackendRegistry = new Map<string, OcrBackendProtocol>();\n\n/**\n * Register an OCR backend\n *\n * Registers an OCR backend with the WASM extraction pipeline.\n * If a backend with the same name is already registered, it will be replaced.\n *\n * @param backend - OCR backend implementing OcrBackendProtocol\n * @throws {Error} If backend validation fails\n *\n * @example\n * ```typescript\n * import { TesseractWasmBackend } from '@kreuzberg/wasm/ocr/tesseract-wasm-backend';\n * import { registerOcrBackend } from '@kreuzberg/wasm/ocr/registry';\n *\n * const backend = new TesseractWasmBackend();\n * await backend.initialize();\n * registerOcrBackend(backend);\n * ```\n */\nexport function registerOcrBackend(backend: OcrBackendProtocol): void {\n\tif (!backend) {\n\t\tthrow new Error(\"Backend cannot be null or undefined\");\n\t}\n\n\tif (typeof backend.name !== \"function\") {\n\t\tthrow new Error(\"Backend must implement name() method\");\n\t}\n\n\tif (typeof backend.supportedLanguages !== \"function\") {\n\t\tthrow new Error(\"Backend must implement supportedLanguages() method\");\n\t}\n\n\tif (typeof backend.processImage !== \"function\") {\n\t\tthrow new Error(\"Backend must implement processImage() method\");\n\t}\n\n\tconst backendName = backend.name();\n\n\tif (!backendName || typeof backendName !== \"string\") {\n\t\tthrow new Error(\"Backend name must be a non-empty string\");\n\t}\n\n\tif (ocrBackendRegistry.has(backendName)) {\n\t\tconsole.warn(`OCR backend \"${backendName}\" is already registered and will be replaced`);\n\t}\n\n\tocrBackendRegistry.set(backendName, backend);\n}\n\n/**\n * Get a registered OCR backend by name\n *\n * @param name - Backend name\n * @returns The OCR backend or undefined if not found\n *\n * @example\n * ```typescript\n * import { getOcrBackend } from '@kreuzberg/wasm/ocr/registry';\n *\n * const backend = getOcrBackend('tesseract-wasm');\n * if (backend) {\n * console.log('Available languages:', backend.supportedLanguages());\n * }\n * ```\n */\nexport function getOcrBackend(name: string): OcrBackendProtocol | undefined {\n\treturn ocrBackendRegistry.get(name);\n}\n\n/**\n * List all registered OCR backends\n *\n * @returns Array of registered backend names\n *\n * @example\n * ```typescript\n * import { listOcrBackends } from '@kreuzberg/wasm/ocr/registry';\n *\n * const backends = listOcrBackends();\n * console.log('Available OCR backends:', backends);\n * ```\n */\nexport function listOcrBackends(): string[] {\n\treturn Array.from(ocrBackendRegistry.keys());\n}\n\n/**\n * Unregister an OCR backend\n *\n * @param name - Backend name to unregister\n * @throws {Error} If backend is not found\n *\n * @example\n * ```typescript\n * import { unregisterOcrBackend } from '@kreuzberg/wasm/ocr/registry';\n *\n * unregisterOcrBackend('tesseract-wasm');\n * ```\n */\nexport async function unregisterOcrBackend(name: string): Promise<void> {\n\tconst backend = ocrBackendRegistry.get(name);\n\n\tif (!backend) {\n\t\treturn;\n\t}\n\n\tif (typeof backend.shutdown === \"function\") {\n\t\ttry {\n\t\t\tawait backend.shutdown();\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`Error shutting down OCR backend \"${name}\": ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tocrBackendRegistry.delete(name);\n}\n\n/**\n * Clear all registered OCR backends\n *\n * Unregisters all OCR backends and calls their shutdown methods.\n *\n * @example\n * ```typescript\n * import { clearOcrBackends } from '@kreuzberg/wasm/ocr/registry';\n *\n * // Clean up all backends when shutting down\n * await clearOcrBackends();\n * ```\n */\nexport async function clearOcrBackends(): Promise<void> {\n\tconst backends = Array.from(ocrBackendRegistry.entries());\n\n\tfor (const [name, backend] of backends) {\n\t\tif (typeof backend.shutdown === \"function\") {\n\t\t\ttry {\n\t\t\t\tawait backend.shutdown();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Error shutting down OCR backend \"${name}\": ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tocrBackendRegistry.clear();\n}\n","/**\n * Tesseract WASM OCR Backend\n *\n * Provides OCR capabilities using tesseract-wasm library for browser environments.\n * Loads training data on-demand from jsDelivr CDN and implements the OcrBackendProtocol.\n *\n * ## Browser-Only Requirement\n *\n * This backend requires browser APIs like createImageBitmap and Web Workers.\n * It will NOT work in Node.js environments without additional canvas polyfills.\n *\n * ## Supported Languages\n *\n * Common ISO 639-1 and ISO 639-2 codes:\n * - English: \"eng\"\n * - German: \"deu\"\n * - French: \"fra\"\n * - Spanish: \"spa\"\n * - Italian: \"ita\"\n * - Portuguese: \"por\"\n * - Dutch: \"nld\"\n * - Russian: \"rus\"\n * - Chinese (Simplified): \"chi_sim\"\n * - Chinese (Traditional): \"chi_tra\"\n * - Japanese: \"jpn\"\n * - Korean: \"kor\"\n * - Arabic: \"ara\"\n * - Hindi: \"hin\"\n *\n * For complete language list, see: https://github.com/naptha/tesseract.js\n *\n * @example Basic Usage\n * ```typescript\n * import { TesseractWasmBackend } from '@kreuzberg/wasm/ocr/tesseract-wasm-backend';\n * import { registerOcrBackend, extractBytes, initWasm } from '@kreuzberg/wasm';\n *\n * // Initialize\n * await initWasm();\n * const backend = new TesseractWasmBackend();\n * await backend.initialize();\n * registerOcrBackend(backend);\n *\n * // Use in extraction\n * const imageBytes = new Uint8Array(buffer);\n * const result = await extractBytes(imageBytes, 'image/png', {\n * ocr: { backend: 'tesseract-wasm', language: 'eng' }\n * });\n * console.log(result.content); // Extracted text\n * ```\n *\n * @example With Language Auto-Detection\n * ```typescript\n * const backend = new TesseractWasmBackend();\n * await backend.initialize();\n * registerOcrBackend(backend);\n *\n * // Extract without specifying language - backend will auto-detect\n * const result = await extractBytes(imageBytes, 'image/png', {\n * ocr: { backend: 'tesseract-wasm' } // language will auto-detect\n * });\n * ```\n */\n\nimport type { OcrBackendProtocol } from \"../types.js\";\n\n/**\n * Tesseract WASM Client interface\n * Type definition for tesseract-wasm's OCRClient class\n */\ninterface TesseractClient {\n\tloadModel(modelPath: string): Promise<void>;\n\tloadImage(image: ImageBitmap | Blob): Promise<void>;\n\tgetText(): Promise<string>;\n\tgetConfidence(): Promise<number>;\n\tgetPageMetadata(): Promise<Record<string, unknown>>;\n\tdestroy(): void;\n\tterminate(): void;\n}\n\n/**\n * TesseractWasmBackend - OCR backend using tesseract-wasm library\n *\n * Implements the OcrBackendProtocol for Kreuzberg document extraction pipeline.\n * Provides comprehensive OCR support with model caching, error handling, and progress reporting.\n */\nexport class TesseractWasmBackend implements OcrBackendProtocol {\n\t/** Tesseract WASM client instance */\n\tprivate client: TesseractClient | null = null;\n\n\t/** Track which models are currently loaded to avoid redundant loads */\n\tprivate loadedLanguages: Set<string> = new Set();\n\n\t/** Cache for language availability validation */\n\tprivate supportedLangsCache: string[] | null = null;\n\n\t/** Progress callback for UI updates */\n\tprivate progressCallback: ((progress: number) => void) | null = null;\n\n\t/** Base URL for training data CDN */\n\tprivate readonly CDN_BASE_URL = \"https://cdn.jsdelivr.net/npm/tesseract-wasm@0.11.0/dist\";\n\n\t/**\n\t * Return the unique name of this OCR backend\n\t *\n\t * @returns Backend identifier \"tesseract-wasm\"\n\t */\n\tname(): string {\n\t\treturn \"tesseract-wasm\";\n\t}\n\n\t/**\n\t * Return list of supported language codes\n\t *\n\t * Returns a curated list of commonly available Tesseract language models.\n\t * Tesseract supports many more languages through custom models.\n\t *\n\t * @returns Array of ISO 639-1/2/3 language codes\n\t */\n\tsupportedLanguages(): string[] {\n\t\tif (this.supportedLangsCache) {\n\t\t\treturn this.supportedLangsCache;\n\t\t}\n\n\t\tthis.supportedLangsCache = [\n\t\t\t\"eng\",\n\t\t\t\"deu\",\n\t\t\t\"fra\",\n\t\t\t\"spa\",\n\t\t\t\"ita\",\n\t\t\t\"por\",\n\t\t\t\"nld\",\n\t\t\t\"rus\",\n\t\t\t\"jpn\",\n\t\t\t\"kor\",\n\t\t\t\"chi_sim\",\n\t\t\t\"chi_tra\",\n\n\t\t\t\"pol\",\n\t\t\t\"tur\",\n\t\t\t\"swe\",\n\t\t\t\"dan\",\n\t\t\t\"fin\",\n\t\t\t\"nor\",\n\t\t\t\"ces\",\n\t\t\t\"slk\",\n\t\t\t\"ron\",\n\t\t\t\"hun\",\n\t\t\t\"hrv\",\n\t\t\t\"srp\",\n\t\t\t\"bul\",\n\t\t\t\"ukr\",\n\t\t\t\"ell\",\n\n\t\t\t\"ara\",\n\t\t\t\"heb\",\n\t\t\t\"hin\",\n\t\t\t\"tha\",\n\t\t\t\"vie\",\n\t\t\t\"mkd\",\n\t\t\t\"ben\",\n\t\t\t\"tam\",\n\t\t\t\"tel\",\n\t\t\t\"kan\",\n\t\t\t\"mal\",\n\t\t\t\"mya\",\n\t\t\t\"khm\",\n\t\t\t\"lao\",\n\t\t\t\"sin\",\n\t\t];\n\n\t\treturn this.supportedLangsCache;\n\t}\n\n\t/**\n\t * Initialize the OCR backend\n\t *\n\t * Creates the Tesseract WASM client instance. This is called once when\n\t * the backend is registered with the extraction pipeline.\n\t *\n\t * The actual model loading happens in processImage() on-demand to avoid\n\t * loading all models upfront.\n\t *\n\t * @throws {Error} If tesseract-wasm is not available or initialization fails\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * try {\n\t * await backend.initialize();\n\t * } catch (error) {\n\t * console.error('Failed to initialize OCR:', error);\n\t * }\n\t * ```\n\t */\n\tasync initialize(): Promise<void> {\n\t\tif (this.client) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst tesseractModule = await this.loadTesseractWasm();\n\n\t\t\t// @ts-expect-error - tesseract-wasm types are not fully typed\n\t\t\tif (!tesseractModule || typeof tesseractModule.OCRClient !== \"function\") {\n\t\t\t\tthrow new Error(\"tesseract-wasm OCRClient not found. Ensure tesseract-wasm is installed and available.\");\n\t\t\t}\n\n\t\t\t// @ts-expect-error - tesseract-wasm types are not fully typed\n\t\t\tthis.client = new tesseractModule.OCRClient();\n\n\t\t\tthis.loadedLanguages.clear();\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Failed to initialize TesseractWasmBackend: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Process image bytes and extract text via OCR\n\t *\n\t * Handles image loading, model loading, OCR processing, and result formatting.\n\t * Automatically loads the language model on first use and caches it for subsequent calls.\n\t *\n\t * @param imageBytes - Raw image data (Uint8Array) or Base64-encoded string\n\t * @param language - ISO 639-2/3 language code (e.g., \"eng\", \"deu\")\n\t * @returns Promise resolving to OCR result with content and metadata\n\t * @throws {Error} If image processing fails, model loading fails, or language is unsupported\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * await backend.initialize();\n\t *\n\t * const imageBuffer = fs.readFileSync('scanned.png');\n\t * const result = await backend.processImage(\n\t * new Uint8Array(imageBuffer),\n\t * 'eng'\n\t * );\n\t *\n\t * console.log(result.content); // Extracted text\n\t * console.log(result.metadata.confidence); // OCR confidence score\n\t * ```\n\t */\n\tasync processImage(\n\t\timageBytes: Uint8Array | string,\n\t\tlanguage: string,\n\t): Promise<{\n\t\tcontent: string;\n\t\tmime_type: string;\n\t\tmetadata: Record<string, unknown>;\n\t\ttables: unknown[];\n\t}> {\n\t\tif (!this.client) {\n\t\t\tthrow new Error(\"TesseractWasmBackend not initialized. Call initialize() first.\");\n\t\t}\n\n\t\tconst supported = this.supportedLanguages();\n\t\tconst normalizedLang = language.toLowerCase();\n\t\tconst isSupported = supported.some((lang) => lang.toLowerCase() === normalizedLang);\n\n\t\tif (!isSupported) {\n\t\t\tthrow new Error(`Language \"${language}\" is not supported. Supported languages: ${supported.join(\", \")}`);\n\t\t}\n\n\t\ttry {\n\t\t\tif (!this.loadedLanguages.has(normalizedLang)) {\n\t\t\t\tthis.reportProgress(10);\n\t\t\t\tawait this.loadLanguageModel(normalizedLang);\n\t\t\t\tthis.loadedLanguages.add(normalizedLang);\n\t\t\t\tthis.reportProgress(30);\n\t\t\t}\n\n\t\t\tthis.reportProgress(40);\n\t\t\tconst imageBitmap = await this.convertToImageBitmap(imageBytes);\n\n\t\t\tthis.reportProgress(50);\n\t\t\tawait this.client.loadImage(imageBitmap);\n\n\t\t\tthis.reportProgress(70);\n\t\t\tconst text = await this.client.getText();\n\n\t\t\tconst confidence = await this.getConfidenceScore();\n\t\t\tconst pageMetadata = await this.getPageMetadata();\n\n\t\t\tthis.reportProgress(90);\n\n\t\t\treturn {\n\t\t\t\tcontent: text,\n\t\t\t\tmime_type: \"text/plain\",\n\t\t\t\tmetadata: {\n\t\t\t\t\tlanguage: normalizedLang,\n\t\t\t\t\tconfidence,\n\t\t\t\t\t...pageMetadata,\n\t\t\t\t},\n\t\t\t\ttables: [],\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`OCR processing failed for language \"${language}\": ${message}`);\n\t\t} finally {\n\t\t\tthis.reportProgress(100);\n\t\t}\n\t}\n\n\t/**\n\t * Shutdown the OCR backend and release resources\n\t *\n\t * Properly cleans up the Tesseract WASM client, freeing memory and Web Workers.\n\t * Called when the backend is unregistered or the application shuts down.\n\t *\n\t * @throws {Error} If cleanup fails (errors are logged but not critical)\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * await backend.initialize();\n\t * // ... use backend ...\n\t * await backend.shutdown(); // Clean up resources\n\t * ```\n\t */\n\tasync shutdown(): Promise<void> {\n\t\ttry {\n\t\t\tif (this.client) {\n\t\t\t\tif (typeof this.client.destroy === \"function\") {\n\t\t\t\t\tthis.client.destroy();\n\t\t\t\t}\n\t\t\t\tif (typeof this.client.terminate === \"function\") {\n\t\t\t\t\tthis.client.terminate();\n\t\t\t\t}\n\t\t\t\tthis.client = null;\n\t\t\t}\n\n\t\t\tthis.loadedLanguages.clear();\n\t\t\tthis.supportedLangsCache = null;\n\t\t\tthis.progressCallback = null;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`Warning during TesseractWasmBackend shutdown: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Set a progress callback for UI updates\n\t *\n\t * Allows the UI to display progress during OCR processing.\n\t * The callback will be called with values from 0 to 100.\n\t *\n\t * @param callback - Function to call with progress percentage\n\t *\n\t * @example\n\t * ```typescript\n\t * const backend = new TesseractWasmBackend();\n\t * backend.setProgressCallback((progress) => {\n\t * console.log(`OCR Progress: ${progress}%`);\n\t * document.getElementById('progress-bar').style.width = `${progress}%`;\n\t * });\n\t * ```\n\t */\n\tsetProgressCallback(callback: (progress: number) => void): void {\n\t\tthis.progressCallback = callback;\n\t}\n\n\t/**\n\t * Load language model from CDN\n\t *\n\t * Fetches the training data for a specific language from jsDelivr CDN.\n\t * This is an MVP approach - models are cached by the browser.\n\t *\n\t * @param language - ISO 639-2/3 language code\n\t * @throws {Error} If model download fails or language is not available\n\t *\n\t * @internal\n\t */\n\tprivate async loadLanguageModel(language: string): Promise<void> {\n\t\tif (!this.client) {\n\t\t\tthrow new Error(\"Client not initialized\");\n\t\t}\n\n\t\tconst modelFilename = `${language}.traineddata`;\n\t\tconst modelUrl = `${this.CDN_BASE_URL}/${modelFilename}`;\n\n\t\ttry {\n\t\t\tawait this.client.loadModel(modelUrl);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Failed to load model for language \"${language}\" from ${modelUrl}: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Convert image bytes or Base64 string to ImageBitmap\n\t *\n\t * Handles both Uint8Array and Base64-encoded image data, converting to\n\t * ImageBitmap format required by Tesseract WASM.\n\t *\n\t * @param imageBytes - Image data as Uint8Array or Base64 string\n\t * @returns Promise resolving to ImageBitmap\n\t * @throws {Error} If conversion fails (browser API not available or invalid image data)\n\t *\n\t * @internal\n\t */\n\tprivate async convertToImageBitmap(imageBytes: Uint8Array | string): Promise<ImageBitmap> {\n\t\tif (typeof createImageBitmap === \"undefined\") {\n\t\t\tthrow new Error(\"createImageBitmap is not available. TesseractWasmBackend requires a browser environment.\");\n\t\t}\n\n\t\ttry {\n\t\t\tlet bytes = imageBytes;\n\t\t\tif (typeof imageBytes === \"string\") {\n\t\t\t\tconst binaryString = atob(imageBytes);\n\t\t\t\tbytes = new Uint8Array(binaryString.length);\n\t\t\t\tfor (let i = 0; i < binaryString.length; i++) {\n\t\t\t\t\t(bytes as Uint8Array)[i] = binaryString.charCodeAt(i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst blob = new Blob([bytes as Uint8Array] as BlobPart[]);\n\n\t\t\tconst imageBitmap = await createImageBitmap(blob);\n\t\t\treturn imageBitmap;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Failed to convert image bytes to ImageBitmap: ${message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Get confidence score from OCR result\n\t *\n\t * Attempts to retrieve confidence score from Tesseract.\n\t * Returns a safe default if unavailable.\n\t *\n\t * @returns Confidence score between 0 and 1\n\t *\n\t * @internal\n\t */\n\tprivate async getConfidenceScore(): Promise<number> {\n\t\ttry {\n\t\t\tif (this.client && typeof this.client.getConfidence === \"function\") {\n\t\t\t\tconst confidence = await this.client.getConfidence();\n\t\t\t\treturn confidence > 1 ? confidence / 100 : confidence;\n\t\t\t}\n\t\t} catch {}\n\t\treturn 0.9;\n\t}\n\n\t/**\n\t * Get page metadata from OCR result\n\t *\n\t * Retrieves additional metadata like image dimensions and processing info.\n\t *\n\t * @returns Metadata object (may be empty if unavailable)\n\t *\n\t * @internal\n\t */\n\tprivate async getPageMetadata(): Promise<Record<string, unknown>> {\n\t\ttry {\n\t\t\tif (this.client && typeof this.client.getPageMetadata === \"function\") {\n\t\t\t\treturn await this.client.getPageMetadata();\n\t\t\t}\n\t\t} catch {}\n\t\treturn {};\n\t}\n\n\t/**\n\t * Dynamically load tesseract-wasm module\n\t *\n\t * Uses dynamic import to load tesseract-wasm only when needed,\n\t * avoiding hard dependency in browser environments where it may not be bundled.\n\t *\n\t * @returns tesseract-wasm module object\n\t * @throws {Error} If module cannot be imported\n\t *\n\t * @internal\n\t */\n\tprivate async loadTesseractWasm(): Promise<unknown> {\n\t\ttry {\n\t\t\t// @ts-expect-error - tesseract-wasm has package.json exports issues with TypeScript\n\t\t\tconst module = await import(\"tesseract-wasm\");\n\t\t\treturn module;\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to import tesseract-wasm. Ensure it is installed via: npm install tesseract-wasm. Error: ${message}`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Report progress to progress callback\n\t *\n\t * Internal helper for notifying progress updates during OCR processing.\n\t *\n\t * @param progress - Progress percentage (0-100)\n\t *\n\t * @internal\n\t */\n\tprivate reportProgress(progress: number): void {\n\t\tif (this.progressCallback) {\n\t\t\ttry {\n\t\t\t\tthis.progressCallback(Math.min(100, Math.max(0, progress)));\n\t\t\t} catch {}\n\t\t}\n\t}\n}\n","/**\n * OCR Worker Bridge\n *\n * Manages the OCR worker lifecycle and provides an async interface for running\n * ocrRecognize() off the main thread. Falls back to direct (blocking) invocation\n * when workers are not available (e.g. edge runtimes).\n */\n\nimport { isNode } from \"../runtime.js\";\n\ninterface PendingRequest {\n\tresolve: (text: string) => void;\n\treject: (error: Error) => void;\n}\n\n/** Abstraction over Node.js Worker and browser Worker */\ninterface WorkerHandle {\n\tpostMessage(data: unknown): void;\n\tterminate(): void | Promise<unknown>;\n}\n\nlet workerHandle: WorkerHandle | null = null;\nconst pendingRequests: Map<number, PendingRequest> = new Map();\nlet nextRequestId = 0;\nlet workerReady = false;\nlet readyResolve: (() => void) | null = null;\nlet readyReject: ((error: Error) => void) | null = null;\n\n/** Whether the worker failed to initialize and we should use the direct fallback. */\nlet useFallback = false;\n\n/** Direct (blocking) fallback function, set by the enabler when creating the backend. */\nlet fallbackFn: ((imageData: Uint8Array, tessdata: Uint8Array, language: string) => string) | null = null;\n\nasync function cleanupWorker(): Promise<void> {\n\tif (workerHandle) {\n\t\tawait workerHandle.terminate();\n\t\tworkerHandle = null;\n\t}\n\tworkerReady = false;\n}\n\nfunction handleWorkerMessage(msg: Record<string, unknown>): void {\n\tswitch (msg[\"type\"]) {\n\t\tcase \"ready\":\n\t\t\tworkerReady = true;\n\t\t\treadyResolve?.();\n\t\t\treadyResolve = null;\n\t\t\treadyReject = null;\n\t\t\tbreak;\n\t\tcase \"init-error\":\n\t\t\treadyReject?.(new Error(msg[\"error\"] as string));\n\t\t\treadyResolve = null;\n\t\t\treadyReject = null;\n\t\t\tbreak;\n\t\tcase \"result\": {\n\t\t\tconst id = msg[\"id\"] as number;\n\t\t\tconst pending = pendingRequests.get(id);\n\t\t\tif (pending) {\n\t\t\t\tpendingRequests.delete(id);\n\t\t\t\tpending.resolve(msg[\"text\"] as string);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase \"error\": {\n\t\t\tconst id = msg[\"id\"] as number;\n\t\t\tconst pending = pendingRequests.get(id);\n\t\t\tif (pending) {\n\t\t\t\tpendingRequests.delete(id);\n\t\t\t\tpending.reject(new Error(msg[\"error\"] as string));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Create and initialize the OCR worker.\n *\n * @param wasmGluePath - Absolute path (Node.js) or URL (browser) to the WASM glue JS module\n * @param wasmBinary - Pre-loaded WASM binary (Node.js file-system loaded bytes)\n * @param directFallback - Direct blocking function used when workers are unavailable\n */\nexport async function createOcrWorker(\n\twasmGluePath: string,\n\twasmBinary: Uint8Array | undefined,\n\tdirectFallback: (imageData: Uint8Array, tessdata: Uint8Array, language: string) => string,\n): Promise<void> {\n\tfallbackFn = directFallback;\n\n\tif (workerHandle) return;\n\n\tconst readyPromise = new Promise<void>((resolve, reject) => {\n\t\treadyResolve = resolve;\n\t\treadyReject = reject;\n\t});\n\n\ttry {\n\t\tif (isNode()) {\n\t\t\tawait createNodeWorker(wasmGluePath, wasmBinary);\n\t\t} else if (typeof Worker !== \"undefined\") {\n\t\t\tawait createBrowserWorker(wasmGluePath, wasmBinary);\n\t\t} else {\n\t\t\t// No worker support — use direct fallback\n\t\t\tuseFallback = true;\n\t\t\treturn;\n\t\t}\n\n\t\t// Timeout prevents indefinite hang if the worker loads but never sends \"ready\"\n\t\t// (e.g. WASM module import fails silently inside the worker)\n\t\tconst timeoutMs = 30_000;\n\t\tconst timeout = new Promise<void>((_, reject) => {\n\t\t\tsetTimeout(() => reject(new Error(\"OCR worker initialization timed out\")), timeoutMs);\n\t\t});\n\t\tawait Promise.race([readyPromise, timeout]);\n\t} catch {\n\t\t// Worker creation or init failed — fall back to direct calls\n\t\tawait cleanupWorker();\n\t\tuseFallback = true;\n\t}\n}\n\nasync function createNodeWorker(wasmGluePath: string, wasmBinary: Uint8Array | undefined): Promise<void> {\n\tconst { Worker } = await import(/* @vite-ignore */ \"node:worker_threads\");\n\tconst nodePath = await import(/* @vite-ignore */ \"node:path\");\n\tconst nodeUrl = await import(/* @vite-ignore */ \"node:url\");\n\n\tconst __dirname = nodePath.dirname(nodeUrl.fileURLToPath(import.meta.url));\n\tconst workerPath = nodePath.join(__dirname, \"ocr-worker.js\");\n\n\tconst worker = new Worker(workerPath, {\n\t\tworkerData: { wasmGluePath, wasmBinary },\n\t});\n\n\tworker.on(\"message\", (msg: Record<string, unknown>) => handleWorkerMessage(msg));\n\tworker.on(\"error\", (err: Error) => {\n\t\t// Reject all pending requests\n\t\tfor (const pending of pendingRequests.values()) {\n\t\t\tpending.reject(err);\n\t\t}\n\t\tpendingRequests.clear();\n\t\treadyReject?.(err);\n\t});\n\n\tworkerHandle = {\n\t\tpostMessage: (data: unknown) => worker.postMessage(data),\n\t\tterminate: () => worker.terminate(),\n\t};\n}\n\nasync function createBrowserWorker(wasmGluePath: string, wasmBinary: Uint8Array | undefined): Promise<void> {\n\tconst workerUrl = new URL(\"./ocr-worker.js\", import.meta.url);\n\tconst worker = new Worker(workerUrl, { type: \"module\" });\n\n\tworker.onmessage = (e: MessageEvent) => handleWorkerMessage(e.data as Record<string, unknown>);\n\tworker.onerror = (e: ErrorEvent) => {\n\t\tconst err = new Error(e.message);\n\t\tfor (const pending of pendingRequests.values()) {\n\t\t\tpending.reject(err);\n\t\t}\n\t\tpendingRequests.clear();\n\t\treadyReject?.(err);\n\t};\n\n\tworkerHandle = {\n\t\tpostMessage: (data: unknown) => worker.postMessage(data),\n\t\tterminate: () => worker.terminate(),\n\t};\n\n\t// Browser worker needs an init message (no workerData equivalent)\n\tworker.postMessage({\n\t\ttype: \"init\",\n\t\twasmGluePath,\n\t\twasmBinary,\n\t});\n}\n\n/**\n * Run OCR in the worker thread. Returns a Promise that resolves with the recognized text.\n * Falls back to direct (blocking) call if workers are unavailable.\n */\nexport function runOcrInWorker(imageData: Uint8Array, tessdata: Uint8Array, language: string): Promise<string> {\n\tif (useFallback || !workerHandle || !workerReady) {\n\t\tif (fallbackFn) {\n\t\t\ttry {\n\t\t\t\tconst text = fallbackFn(imageData, tessdata, language);\n\t\t\t\treturn Promise.resolve(text);\n\t\t\t} catch (e: unknown) {\n\t\t\t\treturn Promise.reject(e instanceof Error ? e : new Error(String(e)));\n\t\t\t}\n\t\t}\n\t\treturn Promise.reject(new Error(\"OCR worker not initialized and no fallback available\"));\n\t}\n\n\tconst id = nextRequestId++;\n\treturn new Promise<string>((resolve, reject) => {\n\t\tpendingRequests.set(id, { resolve, reject });\n\t\tworkerHandle!.postMessage({\n\t\t\ttype: \"ocr\",\n\t\t\tid,\n\t\t\timageData,\n\t\t\ttessdata,\n\t\t\tlanguage,\n\t\t});\n\t});\n}\n\n/**\n * Check whether OCR is using the worker thread or the direct fallback.\n */\nexport function isUsingWorker(): boolean {\n\treturn workerHandle !== null && workerReady && !useFallback;\n}\n\n/**\n * Terminate the OCR worker and clean up resources.\n */\nexport async function terminateOcrWorker(): Promise<void> {\n\tif (workerHandle) {\n\t\tawait workerHandle.terminate();\n\t\tworkerHandle = null;\n\t}\n\tworkerReady = false;\n\tuseFallback = false;\n\tfallbackFn = null;\n\n\t// Reject any still-pending requests\n\tfor (const pending of pendingRequests.values()) {\n\t\tpending.reject(new Error(\"OCR worker terminated\"));\n\t}\n\tpendingRequests.clear();\n}\n","/**\n * OCR enabler module\n *\n * Provides convenient functions for enabling and setting up OCR backends.\n * Automatically selects the appropriate backend based on build capabilities:\n * - Native WASM OCR (kreuzberg-tesseract compiled to WASM, works everywhere)\n * - Browser fallback: TesseractWasmBackend (using tesseract-wasm npm package + createImageBitmap)\n */\n\nimport { isInitialized } from \"../extraction/internal.js\";\nimport { getWasmModule } from \"../initialization/state.js\";\nimport { registerOcrBackend } from \"../ocr/registry.js\";\nimport { TesseractWasmBackend } from \"../ocr/tesseract-wasm-backend.js\";\nimport { createOcrWorker, runOcrInWorker, terminateOcrWorker } from \"../ocr/worker-bridge.js\";\nimport { isBrowser, isNode } from \"../runtime.js\";\nimport type { OcrBackendProtocol } from \"../types.js\";\n\n/** Default CDN URL for tessdata files (Tesseract fast models) */\nconst TESSDATA_CDN_BASE = \"https://raw.githubusercontent.com/tesseract-ocr/tessdata_fast/main\";\n\n/**\n * Native WASM OCR backend using kreuzberg-tesseract compiled into the WASM binary.\n *\n * This backend works in all environments (Browser, Node.js, Deno, etc.)\n * because Tesseract is statically linked into the WASM module.\n * Tessdata is downloaded from CDN and passed to Tesseract via memory (no filesystem needed).\n */\nclass NativeWasmOcrBackend implements OcrBackendProtocol {\n\tprivate tessdataCache: Map<string, Uint8Array> = new Map();\n\tprivate tessdataCdnBase: string = TESSDATA_CDN_BASE;\n\tprivate progressCallback: ((progress: number) => void) | null = null;\n\n\tname(): string {\n\t\treturn \"kreuzberg-tesseract\";\n\t}\n\n\tsupportedLanguages(): string[] {\n\t\treturn [\n\t\t\t\"eng\",\n\t\t\t\"deu\",\n\t\t\t\"fra\",\n\t\t\t\"spa\",\n\t\t\t\"ita\",\n\t\t\t\"por\",\n\t\t\t\"nld\",\n\t\t\t\"rus\",\n\t\t\t\"jpn\",\n\t\t\t\"kor\",\n\t\t\t\"chi_sim\",\n\t\t\t\"chi_tra\",\n\t\t\t\"pol\",\n\t\t\t\"tur\",\n\t\t\t\"swe\",\n\t\t\t\"dan\",\n\t\t\t\"fin\",\n\t\t\t\"nor\",\n\t\t\t\"ces\",\n\t\t\t\"slk\",\n\t\t\t\"ron\",\n\t\t\t\"hun\",\n\t\t\t\"hrv\",\n\t\t\t\"srp\",\n\t\t\t\"bul\",\n\t\t\t\"ukr\",\n\t\t\t\"ell\",\n\t\t\t\"ara\",\n\t\t\t\"heb\",\n\t\t\t\"hin\",\n\t\t\t\"tha\",\n\t\t\t\"vie\",\n\t\t\t\"mkd\",\n\t\t\t\"ben\",\n\t\t\t\"tam\",\n\t\t\t\"tel\",\n\t\t\t\"kan\",\n\t\t\t\"mal\",\n\t\t\t\"mya\",\n\t\t\t\"khm\",\n\t\t\t\"lao\",\n\t\t\t\"sin\",\n\t\t];\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tconst wasm = getWasmModule();\n\t\tif (!wasm?.ocrIsAvailable || !wasm.ocrIsAvailable()) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Native WASM OCR is not available. Build with the 'ocr-wasm' feature to enable kreuzberg-tesseract.\",\n\t\t\t);\n\t\t}\n\n\t\t// Resolve path to the WASM glue module for the worker thread\n\t\tlet wasmGluePath: string;\n\t\tlet wasmBinary: Uint8Array | undefined;\n\n\t\tif (isNode()) {\n\t\t\tconst nodePath = await import(/* @vite-ignore */ \"node:path\");\n\t\t\tconst nodeUrl = await import(/* @vite-ignore */ \"node:url\");\n\t\t\tconst nodeFs = await import(/* @vite-ignore */ \"node:fs/promises\");\n\t\t\tconst __dirname = nodePath.dirname(nodeUrl.fileURLToPath(import.meta.url));\n\t\t\twasmGluePath = nodePath.join(__dirname, \"..\", \"pkg\", \"kreuzberg_wasm.js\");\n\t\t\ttry {\n\t\t\t\tconst wasmPath = nodePath.join(__dirname, \"..\", \"pkg\", \"kreuzberg_wasm_bg.wasm\");\n\t\t\t\tconst buf = await nodeFs.readFile(wasmPath);\n\t\t\t\twasmBinary = new Uint8Array(buf);\n\t\t\t} catch {\n\t\t\t\t// Binary will be loaded by glue code's default() fetch\n\t\t\t}\n\t\t} else {\n\t\t\twasmGluePath = new URL(\"../pkg/kreuzberg_wasm.js\", import.meta.url).href;\n\t\t}\n\n\t\t// Direct (blocking) fallback for when workers are unavailable\n\t\tconst directFallback = (imageData: Uint8Array, tessdata: Uint8Array, language: string): string => {\n\t\t\tif (!wasm.ocrRecognize) throw new Error(\"ocrRecognize not available\");\n\t\t\treturn wasm.ocrRecognize(imageData, tessdata, language);\n\t\t};\n\n\t\tawait createOcrWorker(wasmGluePath, wasmBinary, directFallback);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tthis.tessdataCache.clear();\n\t\tthis.progressCallback = null;\n\t\tawait terminateOcrWorker();\n\t}\n\n\tsetProgressCallback(callback: (progress: number) => void): void {\n\t\tthis.progressCallback = callback;\n\t}\n\n\tasync processImage(\n\t\timageBytes: Uint8Array | string,\n\t\tlanguage: string,\n\t): Promise<{\n\t\tcontent: string;\n\t\tmime_type: string;\n\t\tmetadata: Record<string, unknown>;\n\t\ttables: unknown[];\n\t}> {\n\t\tconst normalizedLang = language.toLowerCase();\n\n\t\tthis.reportProgress(10);\n\n\t\t// Download tessdata if not cached\n\t\tconst tessdata = await this.getTessdata(normalizedLang);\n\n\t\tthis.reportProgress(40);\n\n\t\t// Convert base64 string to Uint8Array if needed\n\t\tlet imageData: Uint8Array;\n\t\tif (typeof imageBytes === \"string\") {\n\t\t\tconst binaryString = atob(imageBytes);\n\t\t\timageData = new Uint8Array(binaryString.length);\n\t\t\tfor (let i = 0; i < binaryString.length; i++) {\n\t\t\t\timageData[i] = binaryString.charCodeAt(i);\n\t\t\t}\n\t\t} else {\n\t\t\timageData = imageBytes;\n\t\t}\n\n\t\tthis.reportProgress(50);\n\n\t\t// Run OCR in a worker thread to avoid blocking the main event loop.\n\t\t// Falls back to direct (blocking) call if workers are unavailable.\n\t\tconst text = await runOcrInWorker(imageData, tessdata, normalizedLang);\n\n\t\tthis.reportProgress(90);\n\n\t\treturn {\n\t\t\tcontent: text,\n\t\t\tmime_type: \"text/plain\",\n\t\t\tmetadata: { language: normalizedLang },\n\t\t\ttables: [],\n\t\t};\n\t}\n\n\tprivate async getTessdata(language: string): Promise<Uint8Array> {\n\t\tconst cached = this.tessdataCache.get(language);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst url = `${this.tessdataCdnBase}/${language}.traineddata`;\n\t\tconst response = await fetch(url);\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to download tessdata for \"${language}\" from ${url}: ${response.status}`);\n\t\t}\n\n\t\tconst data = new Uint8Array(await response.arrayBuffer());\n\t\tthis.tessdataCache.set(language, data);\n\t\treturn data;\n\t}\n\n\tprivate reportProgress(progress: number): void {\n\t\tif (this.progressCallback) {\n\t\t\ttry {\n\t\t\t\tthis.progressCallback(Math.min(100, Math.max(0, progress)));\n\t\t\t} catch {\n\t\t\t\t// Ignore callback errors\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Enable OCR functionality with the appropriate backend for the current runtime\n *\n * Automatically selects the best available OCR backend:\n * 1. **Native WASM OCR** (preferred): If built with `ocr-wasm` feature, uses kreuzberg-tesseract\n * compiled directly into the WASM binary. Works in all environments (Browser, Node.js, Deno).\n * 2. **Browser fallback**: Uses `TesseractWasmBackend` with the `tesseract-wasm` npm package\n * (requires `createImageBitmap` browser API).\n *\n * ## Network Requirement\n *\n * Training data will be loaded from jsDelivr CDN on first use of each language.\n * Ensure network access to cdn.jsdelivr.net is available.\n *\n * @throws {Error} If WASM is not initialized or no OCR backend is available\n *\n * @example Basic Usage (works in all environments)\n * ```typescript\n * import { enableOcr, extractBytes, initWasm } from '@kreuzberg/wasm';\n *\n * await initWasm();\n * await enableOcr();\n *\n * const imageBytes = new Uint8Array(buffer);\n * const result = await extractBytes(imageBytes, 'image/png', {\n * ocr: { backend: 'kreuzberg-tesseract', language: 'eng' }\n * });\n *\n * console.log(result.content);\n * ```\n */\nexport async function enableOcr(): Promise<void> {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\ttry {\n\t\t// Try native WASM OCR first (works in all environments)\n\t\tconst wasm = getWasmModule();\n\t\tif (wasm?.ocrIsAvailable?.()) {\n\t\t\tconst backend = new NativeWasmOcrBackend();\n\t\t\tawait backend.initialize();\n\t\t\tregisterOcrBackend(backend);\n\t\t\tregisterBackendInRustRegistry(wasm, backend);\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback: browser-only tesseract-wasm npm backend\n\t\tif (isBrowser()) {\n\t\t\tconst backend = new TesseractWasmBackend();\n\t\t\tawait backend.initialize();\n\t\t\tregisterOcrBackend(backend);\n\t\t\tregisterBackendInRustRegistry(wasm, backend);\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t\"No OCR backend available. \" +\n\t\t\t\t\"Build with the 'ocr-wasm' feature to enable native Tesseract OCR in all environments, \" +\n\t\t\t\t\"or use a browser environment with the tesseract-wasm npm package.\",\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Failed to enable OCR: ${message}`);\n\t}\n}\n\n/**\n * Register an OCR backend in the Rust-side plugin registry.\n *\n * The Rust extraction pipeline looks up OCR backends from its own registry\n * (not the JS-side Map). This creates a thin adapter that bridges the\n * OcrBackendProtocol interface to what the Rust wasm-bindgen bridge expects:\n * - name() returns \"tesseract\" (matching the default OcrConfig.backend value)\n * - processImage() returns a JSON string (not an object)\n */\nfunction registerBackendInRustRegistry(wasm: ReturnType<typeof getWasmModule>, backend: OcrBackendProtocol): void {\n\tconst registerFn = wasm?.register_ocr_backend;\n\tif (!registerFn) {\n\t\treturn;\n\t}\n\n\tconst rustAdapter = {\n\t\tname: () => \"tesseract\",\n\t\tsupportedLanguages: () => backend.supportedLanguages?.() ?? [\"eng\"],\n\t\tprocessImage: async (imageBase64: string, language: string): Promise<string> => {\n\t\t\tconst result = await backend.processImage(imageBase64, language);\n\t\t\treturn typeof result === \"string\" ? result : JSON.stringify(result);\n\t\t},\n\t};\n\n\ttry {\n\t\tregisterFn(rustAdapter);\n\t} catch {\n\t\t// Registration may fail if already registered; non-fatal\n\t}\n}\n","/**\n * Plugin Registry Module\n *\n * This module manages registrations and execution of post-processors and validators\n * for document extraction pipelines.\n *\n * # Thread Safety\n * All registrations are stored in Maps and are single-threaded safe for WASM environments.\n *\n * # Global Callback Functions\n * The WASM module can invoke processing via global callback functions:\n * - `__kreuzberg_execute_post_processor`: Execute a registered post-processor\n * - `__kreuzberg_execute_validator`: Execute a registered validator\n */\n\nimport type { ExtractionResult } from \"./types.js\";\n\n/**\n * Post-processor plugin interface\n *\n * A post-processor modifies extraction results after extraction completes.\n */\nexport interface PostProcessor {\n\t/**\n\t * Get the processor name (must be non-empty string)\n\t */\n\tname(): string;\n\n\t/**\n\t * Get the processing stage (optional, defaults to \"middle\")\n\t * - \"early\": Process early in the pipeline\n\t * - \"middle\": Process in the middle of the pipeline\n\t * - \"late\": Process late in the pipeline\n\t */\n\tstage?(): \"early\" | \"middle\" | \"late\";\n\n\t/**\n\t * Process an extraction result\n\t * Can be sync or async\n\t */\n\tprocess(result: ExtractionResult): ExtractionResult | Promise<ExtractionResult>;\n\n\t/**\n\t * Shutdown the processor (optional)\n\t */\n\tshutdown?(): void | Promise<void>;\n}\n\n/**\n * Validator plugin interface\n *\n * A validator checks extraction results for correctness\n */\nexport interface Validator {\n\t/**\n\t * Get the validator name (must be non-empty string)\n\t */\n\tname(): string;\n\n\t/**\n\t * Get the validation priority (optional, defaults to 50)\n\t * Higher numbers = higher priority (execute first)\n\t */\n\tpriority?(): number;\n\n\t/**\n\t * Validate an extraction result\n\t * Can be sync or async\n\t */\n\tvalidate(\n\t\tresult: ExtractionResult,\n\t): { valid: boolean; errors: string[] } | Promise<{ valid: boolean; errors: string[] }>;\n\n\t/**\n\t * Shutdown the validator (optional)\n\t */\n\tshutdown?(): void | Promise<void>;\n}\n\n/** Map of post-processor name -> processor instance */\nconst postProcessors = new Map<string, PostProcessor>();\n\n/** Map of validator name -> validator instance */\nconst validators = new Map<string, Validator>();\n\n// ============================================================================\n// Post-Processor Registry Functions\n// ============================================================================\n\n/**\n * Validate a post-processor object\n *\n * @throws {Error} If the processor doesn't implement required methods\n */\nfunction validatePostProcessor(processor: unknown): processor is PostProcessor {\n\tif (processor === null || processor === undefined) {\n\t\tthrow new Error(\"Post-processor cannot be null or undefined\");\n\t}\n\n\tconst obj = processor as Record<string, unknown>;\n\n\tif (typeof obj.name !== \"function\") {\n\t\tthrow new Error(\"Post-processor must implement name() method\");\n\t}\n\n\tif (typeof obj.process !== \"function\") {\n\t\tthrow new Error(\"Post-processor must implement process() method\");\n\t}\n\n\tconst name = obj.name();\n\tif (typeof name !== \"string\" || name.trim() === \"\") {\n\t\tthrow new Error(\"Post-processor name must be a non-empty string\");\n\t}\n\n\treturn true;\n}\n\n/**\n * Register a post-processor plugin\n *\n * @param processor - The post-processor to register\n * @throws {Error} If the processor is invalid or missing required methods\n *\n * @example\n * ```typescript\n * const processor = {\n * name: () => \"my-processor\",\n * stage: () => \"middle\",\n * process: async (result) => {\n * result.content = result.content.toUpperCase();\n * return result;\n * }\n * };\n * registerPostProcessor(processor);\n * ```\n */\nexport function registerPostProcessor(processor: PostProcessor): void {\n\tvalidatePostProcessor(processor);\n\n\tconst name = processor.name();\n\n\tif (postProcessors.has(name)) {\n\t\tconsole.warn(`Post-processor \"${name}\" already registered, overwriting with new implementation`);\n\t}\n\n\tpostProcessors.set(name, processor);\n}\n\n/**\n * Get a registered post-processor by name\n *\n * @param name - The processor name\n * @returns The processor, or undefined if not found\n *\n * @example\n * ```typescript\n * const processor = getPostProcessor(\"my-processor\");\n * if (processor) {\n * console.log(\"Found processor:\", processor.name());\n * }\n * ```\n */\nexport function getPostProcessor(name: string): PostProcessor | undefined {\n\treturn postProcessors.get(name);\n}\n\n/**\n * List all registered post-processor names\n *\n * @returns Array of processor names\n *\n * @example\n * ```typescript\n * const names = listPostProcessors();\n * console.log(\"Registered processors:\", names);\n * ```\n */\nexport function listPostProcessors(): string[] {\n\treturn Array.from(postProcessors.keys());\n}\n\n/**\n * Unregister a post-processor and call its shutdown method\n *\n * @param name - The processor name\n * @throws {Error} If the processor is not registered\n *\n * @example\n * ```typescript\n * await unregisterPostProcessor(\"my-processor\");\n * ```\n */\nexport async function unregisterPostProcessor(name: string): Promise<void> {\n\tconst processor = postProcessors.get(name);\n\n\tif (!processor) {\n\t\tconst available = Array.from(postProcessors.keys());\n\t\tconst availableStr = available.length > 0 ? ` Available: ${available.join(\", \")}` : \"\";\n\t\tthrow new Error(`Post-processor \"${name}\" is not registered.${availableStr}`);\n\t}\n\n\ttry {\n\t\tif (processor.shutdown) {\n\t\t\tawait processor.shutdown();\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(`Error during shutdown of post-processor \"${name}\":`, error);\n\t}\n\n\tpostProcessors.delete(name);\n}\n\n/**\n * Clear all registered post-processors\n *\n * Calls shutdown on all processors before clearing.\n *\n * @example\n * ```typescript\n * await clearPostProcessors();\n * ```\n */\nexport async function clearPostProcessors(): Promise<void> {\n\tconst entries = Array.from(postProcessors.entries());\n\n\tfor (const [_name, processor] of entries) {\n\t\ttry {\n\t\t\tif (processor.shutdown) {\n\t\t\t\tawait processor.shutdown();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Error during shutdown of post-processor \"${_name}\":`, error);\n\t\t}\n\t}\n\n\tpostProcessors.clear();\n}\n\n// ============================================================================\n// Validator Registry Functions\n// ============================================================================\n\n/**\n * Validate a validator object\n *\n * @throws {Error} If the validator doesn't implement required methods\n */\nfunction validateValidator(validator: unknown): validator is Validator {\n\tif (validator === null || validator === undefined) {\n\t\tthrow new Error(\"Validator cannot be null or undefined\");\n\t}\n\n\tconst obj = validator as Record<string, unknown>;\n\n\tif (typeof obj.name !== \"function\") {\n\t\tthrow new Error(\"Validator must implement name() method\");\n\t}\n\n\tif (typeof obj.validate !== \"function\") {\n\t\tthrow new Error(\"Validator must implement validate() method\");\n\t}\n\n\tconst name = obj.name();\n\tif (typeof name !== \"string\" || name.trim() === \"\") {\n\t\tthrow new Error(\"Validator name must be a non-empty string\");\n\t}\n\n\treturn true;\n}\n\n/**\n * Register a validator plugin\n *\n * @param validator - The validator to register\n * @throws {Error} If the validator is invalid or missing required methods\n *\n * @example\n * ```typescript\n * const validator = {\n * name: () => \"my-validator\",\n * priority: () => 50,\n * validate: async (result) => {\n * if (!result.content) {\n * return { valid: false, errors: [\"Content is empty\"] };\n * }\n * return { valid: true, errors: [] };\n * }\n * };\n * registerValidator(validator);\n * ```\n */\nexport function registerValidator(validator: Validator): void {\n\tvalidateValidator(validator);\n\n\tconst name = validator.name();\n\n\tif (validators.has(name)) {\n\t\tconsole.warn(`Validator \"${name}\" already registered, overwriting with new implementation`);\n\t}\n\n\tvalidators.set(name, validator);\n}\n\n/**\n * Get a registered validator by name\n *\n * @param name - The validator name\n * @returns The validator, or undefined if not found\n *\n * @example\n * ```typescript\n * const validator = getValidator(\"my-validator\");\n * if (validator) {\n * console.log(\"Found validator:\", validator.name());\n * }\n * ```\n */\nexport function getValidator(name: string): Validator | undefined {\n\treturn validators.get(name);\n}\n\n/**\n * List all registered validator names\n *\n * @returns Array of validator names\n *\n * @example\n * ```typescript\n * const names = listValidators();\n * console.log(\"Registered validators:\", names);\n * ```\n */\nexport function listValidators(): string[] {\n\treturn Array.from(validators.keys());\n}\n\n/**\n * Unregister a validator and call its shutdown method\n *\n * @param name - The validator name\n * @throws {Error} If the validator is not registered\n *\n * @example\n * ```typescript\n * await unregisterValidator(\"my-validator\");\n * ```\n */\nexport async function unregisterValidator(name: string): Promise<void> {\n\tconst validator = validators.get(name);\n\n\tif (!validator) {\n\t\tconst available = Array.from(validators.keys());\n\t\tconst availableStr = available.length > 0 ? ` Available: ${available.join(\", \")}` : \"\";\n\t\tthrow new Error(`Validator \"${name}\" is not registered.${availableStr}`);\n\t}\n\n\ttry {\n\t\tif (validator.shutdown) {\n\t\t\tawait validator.shutdown();\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(`Error during shutdown of validator \"${name}\":`, error);\n\t}\n\n\tvalidators.delete(name);\n}\n\n/**\n * Clear all registered validators\n *\n * Calls shutdown on all validators before clearing.\n *\n * @example\n * ```typescript\n * await clearValidators();\n * ```\n */\nexport async function clearValidators(): Promise<void> {\n\tconst entries = Array.from(validators.entries());\n\n\tfor (const [_name, validator] of entries) {\n\t\ttry {\n\t\t\tif (validator.shutdown) {\n\t\t\t\tawait validator.shutdown();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Error during shutdown of validator \"${_name}\":`, error);\n\t\t}\n\t}\n\n\tvalidators.clear();\n}\n\n// ============================================================================\n// Global Callback Functions (for WASM module callbacks)\n// ============================================================================\n\n/**\n * Global callback for executing a post-processor from WASM\n *\n * Called by the WASM module to execute a registered post-processor.\n * Makes the callback available to WASM via the global scope.\n *\n * @internal\n */\nexport function executePostProcessor(name: string, result: ExtractionResult): Promise<ExtractionResult> {\n\tconst processor = postProcessors.get(name);\n\n\tif (!processor) {\n\t\treturn Promise.reject(new Error(`Post-processor \"${name}\" is not registered`));\n\t}\n\n\ttry {\n\t\tconst output = processor.process(result);\n\n\t\tif (output instanceof Promise) {\n\t\t\treturn output;\n\t\t}\n\n\t\treturn Promise.resolve(output);\n\t} catch (error) {\n\t\treturn Promise.reject(new Error(`Error executing post-processor \"${name}\": ${String(error)}`));\n\t}\n}\n\n/**\n * Global callback for executing a validator from WASM\n *\n * Called by the WASM module to execute a registered validator.\n * Makes the callback available to WASM via the global scope.\n *\n * @internal\n */\nexport function executeValidator(\n\tname: string,\n\tresult: ExtractionResult,\n): Promise<{ valid: boolean; errors: string[] }> {\n\tconst validator = validators.get(name);\n\n\tif (!validator) {\n\t\treturn Promise.reject(new Error(`Validator \"${name}\" is not registered`));\n\t}\n\n\ttry {\n\t\tconst output = validator.validate(result);\n\n\t\tif (output instanceof Promise) {\n\t\t\treturn output;\n\t\t}\n\n\t\treturn Promise.resolve(output);\n\t} catch (error) {\n\t\treturn Promise.reject(new Error(`Error executing validator \"${name}\": ${String(error)}`));\n\t}\n}\n\n/**\n * Expose global callback functions for WASM module\n *\n * This makes the plugin execution functions available as global callbacks\n * that the WASM module can invoke via JavaScript.\n *\n * @internal\n */\nexport function setupGlobalCallbacks(): void {\n\t// Make callbacks available to WASM module\n\tif (typeof globalThis !== \"undefined\") {\n\t\tconst callbacksObj = globalThis as Record<string, unknown>;\n\t\tcallbacksObj.__kreuzberg_execute_post_processor = executePostProcessor;\n\t\tcallbacksObj.__kreuzberg_execute_validator = executeValidator;\n\t}\n}\n\n// Setup callbacks when module is imported\nsetupGlobalCallbacks();\n","/**\n * MIME type utilities\n *\n * Provides functions for MIME type detection and extension lookup\n * using the WASM module's native capabilities.\n */\n\nimport { wrapWasmError } from \"../adapters/wasm-adapter.js\";\nimport { getWasmModule, isInitialized } from \"../extraction/internal.js\";\n\n/**\n * Detect MIME type from raw bytes\n *\n * Uses magic-byte detection to determine the MIME type of a byte buffer.\n *\n * @param data - The raw bytes to detect MIME type from\n * @returns The detected MIME type string (e.g., 'application/pdf', 'image/png')\n * @throws {Error} If WASM module is not initialized or detection fails\n *\n * @example\n * ```typescript\n * const bytes = new Uint8Array(buffer);\n * const mimeType = detectMimeFromBytes(bytes);\n * console.log(mimeType); // 'application/pdf'\n * ```\n */\nexport function detectMimeFromBytes(data: Uint8Array): string {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\treturn wasm.detectMimeFromBytes(data);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"detecting MIME type from bytes\");\n\t}\n}\n\n/**\n * Get file extensions for a MIME type\n *\n * Returns known file extensions associated with the given MIME type.\n *\n * @param mimeType - The MIME type to look up extensions for\n * @returns Array of file extension strings (e.g., ['pdf'], ['jpg', 'jpeg'])\n * @throws {Error} If WASM module is not initialized or lookup fails\n *\n * @example\n * ```typescript\n * const extensions = getExtensionsForMime('application/pdf');\n * console.log(extensions); // ['pdf']\n * ```\n */\nexport function getExtensionsForMime(mimeType: string): string[] {\n\tif (!isInitialized()) {\n\t\tthrow new Error(\"WASM module not initialized. Call initWasm() first.\");\n\t}\n\n\tconst wasm = getWasmModule();\n\n\ttry {\n\t\treturn wasm.getExtensionsForMime(mimeType);\n\t} catch (error) {\n\t\tthrow wrapWasmError(error, \"getting extensions for MIME type\");\n\t}\n}\n"],"mappings":"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","names":["normalized","document","getWasmModule","wasm","isInitialized","isInitialized","wasm","getWasmModule","isInitialized","wasm","getWasmModule","isInitialized","wasm","getWasmModule","Worker","wasm","isInitialized","isInitialized","wasm","getWasmModule"]}
@@ -12,9 +12,9 @@ export interface InitWasmOptions {
12
12
  /**
13
13
  * A pre-loaded WebAssembly.Module for the Kreuzberg WASM binary.
14
14
  *
15
- * Required in edge environments (Cloudflare Workers, Vercel Edge) where
16
- * the runtime cannot fetch `file://` URLs. Import the `.wasm` file as a
17
- * static import in your worker and pass it here.
15
+ * Required in restricted edge environments (Cloudflare Workers, Vercel Edge,
16
+ * Supabase edge functions) where the runtime cannot fetch `file://` URLs.
17
+ * Import the `.wasm` file as a static import and pass it here.
18
18
  *
19
19
  * @example Cloudflare Workers
20
20
  * ```typescript
@@ -28,6 +28,17 @@ export interface InitWasmOptions {
28
28
  * }
29
29
  * };
30
30
  * ```
31
+ *
32
+ * @example Supabase Edge Functions (Deno)
33
+ * ```typescript
34
+ * import wasmModule from '@kreuzberg/wasm/kreuzberg_wasm_bg.wasm';
35
+ * import { initWasm, extractBytes } from '@kreuzberg/wasm';
36
+ *
37
+ * Deno.serve(async (req: Request) => {
38
+ * await initWasm({ wasmModule });
39
+ * // ... use extraction functions
40
+ * });
41
+ * ```
31
42
  */
32
43
  wasmModule?: WebAssembly.Module;
33
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-loader.d.ts","sourceRoot":"","sources":["../../typescript/initialization/wasm-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;CAChC;AA+BD,OAAO,EACN,sBAAsB,EAEtB,aAAa,EACb,aAAa,EACb,KAAK,UAAU,EAKf,KAAK,UAAU,EACf,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAEvC;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAWnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsFvE"}
1
+ {"version":3,"file":"wasm-loader.d.ts","sourceRoot":"","sources":["../../typescript/initialization/wasm-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC;CAChC;AAuDD,OAAO,EACN,sBAAsB,EAEtB,aAAa,EACb,aAAa,EACb,KAAK,UAAU,EAKf,KAAK,UAAU,EACf,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;AAEvC;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAElC;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAWnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFvE"}
@@ -22,7 +22,7 @@
22
22
  <img src="https://img.shields.io/maven-central/v/dev.kreuzberg/kreuzberg?label=Java&color=007ec6" alt="Java">
23
23
  </a>
24
24
  <a href="https://github.com/kreuzberg-dev/kreuzberg/releases">
25
- <img src="https://img.shields.io/github/v/tag/kreuzberg-dev/kreuzberg?label=Go&color=007ec6&filter=v4.5.2" alt="Go">
25
+ <img src="https://img.shields.io/github/v/tag/kreuzberg-dev/kreuzberg?label=Go&color=007ec6&filter=v4.6.0" alt="Go">
26
26
  </a>
27
27
  <a href="https://www.nuget.org/packages/Kreuzberg/">
28
28
  <img src="https://img.shields.io/nuget/v/Kreuzberg?label=C%23&color=007ec6" alt="C#">
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
 
63
63
 
64
- Extract text, tables, images, and metadata from 88+ file formats including PDF, Office documents, and images. WebAssembly bindings for browsers, Deno, and Cloudflare Workers with portable deployment and multi-threading support.
64
+ Extract text, tables, images, and metadata from 91+ file formats including PDF, Office documents, and images. WebAssembly bindings for browsers, Deno, and Cloudflare Workers with portable deployment and multi-threading support.
65
65
 
66
66
 
67
67
  ## Installation
@@ -271,9 +271,9 @@ extractDocuments(fileBytes, mimes)
271
271
 
272
272
  ## Features
273
273
 
274
- ### Supported File Formats (88+)
274
+ ### Supported File Formats (91+)
275
275
 
276
- 88+ file formats across 8 major categories with intelligent format detection and comprehensive metadata extraction.
276
+ 91+ file formats across 8 major categories with intelligent format detection and comprehensive metadata extraction.
277
277
 
278
278
  #### Office Documents
279
279
 
@@ -510,7 +510,7 @@ WASM runs in single-threaded environments without access to ONNX Runtime, which
510
510
  - **Language Detection** – Identify document language
511
511
  - **Image Extraction** – Embedded images from documents
512
512
 
513
- All 88+ file formats supported by Kreuzberg are available in WASM, with the exception that features requiring ONNX Runtime (layout detection) will fail gracefully with an unsupported error.
513
+ All 91+ file formats supported by Kreuzberg are available in WASM, with the exception that features requiring ONNX Runtime (layout detection) will fail gracefully with an unsupported error.
514
514
 
515
515
  ## Documentation
516
516
 
@@ -1785,13 +1785,13 @@ function __wbg_get_imports() {
1785
1785
  console.warn(arg0);
1786
1786
  },
1787
1787
  __wbindgen_cast_0000000000000001: function(arg0, arg1) {
1788
- // Cast intrinsic for `Closure(Closure { dtor_idx: 3643, function: Function { arguments: [Externref], shim_idx: 3644, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
1788
+ // Cast intrinsic for `Closure(Closure { dtor_idx: 3562, function: Function { arguments: [Externref], shim_idx: 3563, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
1789
1789
  const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__hcbea9f36b367d3d8, wasm_bindgen__convert__closures_____invoke__h240eec0b57535315);
1790
1790
  return ret;
1791
1791
  },
1792
1792
  __wbindgen_cast_0000000000000002: function(arg0, arg1) {
1793
1793
  // Cast intrinsic for `Closure(Closure { dtor_idx: 4, function: Function { arguments: [Externref], shim_idx: 5, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
1794
- const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h716c2b336799e050, wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38);
1794
+ const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__hc7dad678599db7a2, wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2);
1795
1795
  return ret;
1796
1796
  },
1797
1797
  __wbindgen_cast_0000000000000003: function(arg0) {
@@ -1833,8 +1833,8 @@ function __wbg_get_imports() {
1833
1833
  };
1834
1834
  }
1835
1835
 
1836
- function wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38(arg0, arg1, arg2) {
1837
- wasm.wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38(arg0, arg1, arg2);
1836
+ function wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2(arg0, arg1, arg2) {
1837
+ wasm.wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2(arg0, arg1, arg2);
1838
1838
  }
1839
1839
 
1840
1840
  function wasm_bindgen__convert__closures_____invoke__h240eec0b57535315(arg0, arg1, arg2) {
@@ -1691,13 +1691,13 @@ export function __wbg_warn_69424c2d92a2fa73(arg0) {
1691
1691
  console.warn(arg0);
1692
1692
  }
1693
1693
  export function __wbindgen_cast_0000000000000001(arg0, arg1) {
1694
- // Cast intrinsic for `Closure(Closure { dtor_idx: 3643, function: Function { arguments: [Externref], shim_idx: 3644, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
1694
+ // Cast intrinsic for `Closure(Closure { dtor_idx: 3562, function: Function { arguments: [Externref], shim_idx: 3563, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`.
1695
1695
  const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__hcbea9f36b367d3d8, wasm_bindgen__convert__closures_____invoke__h240eec0b57535315);
1696
1696
  return ret;
1697
1697
  }
1698
1698
  export function __wbindgen_cast_0000000000000002(arg0, arg1) {
1699
1699
  // Cast intrinsic for `Closure(Closure { dtor_idx: 4, function: Function { arguments: [Externref], shim_idx: 5, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
1700
- const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h716c2b336799e050, wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38);
1700
+ const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__hc7dad678599db7a2, wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2);
1701
1701
  return ret;
1702
1702
  }
1703
1703
  export function __wbindgen_cast_0000000000000003(arg0) {
@@ -1730,8 +1730,8 @@ export function __wbindgen_init_externref_table() {
1730
1730
  table.set(offset + 2, true);
1731
1731
  table.set(offset + 3, false);
1732
1732
  }
1733
- function wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38(arg0, arg1, arg2) {
1734
- wasm.wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38(arg0, arg1, arg2);
1733
+ function wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2(arg0, arg1, arg2) {
1734
+ wasm.wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2(arg0, arg1, arg2);
1735
1735
  }
1736
1736
 
1737
1737
  function wasm_bindgen__convert__closures_____invoke__h240eec0b57535315(arg0, arg1, arg2) {
Binary file
@@ -46,10 +46,10 @@ export const write_block_from_callback_wasm: (a: number, b: number, c: number) =
46
46
  export const compress: (a: number, b: number, c: number, d: number) => [number, number, number];
47
47
  export const decompress: (a: any, b: number, c: number, d: any) => [number, number];
48
48
  export const wasm_bindgen__closure__destroy__hcbea9f36b367d3d8: (a: number, b: number) => void;
49
- export const wasm_bindgen__closure__destroy__h716c2b336799e050: (a: number, b: number) => void;
49
+ export const wasm_bindgen__closure__destroy__hc7dad678599db7a2: (a: number, b: number) => void;
50
50
  export const wasm_bindgen__convert__closures_____invoke__h240eec0b57535315: (a: number, b: number, c: any) => [number, number];
51
51
  export const wasm_bindgen__convert__closures_____invoke__h8e9fc28c4e841be2: (a: number, b: number, c: any, d: any) => void;
52
- export const wasm_bindgen__convert__closures_____invoke__h41ca64df44699e38: (a: number, b: number, c: any) => void;
52
+ export const wasm_bindgen__convert__closures_____invoke__hca08002761cb7af2: (a: number, b: number, c: any) => void;
53
53
  export const __wbindgen_externrefs: WebAssembly.Table;
54
54
  export const __wbindgen_malloc_command_export: (a: number, b: number) => number;
55
55
  export const __wbindgen_realloc_command_export: (a: number, b: number, c: number, d: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kreuzberg/wasm",
3
- "version": "4.5.2",
3
+ "version": "4.6.0",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@10.17.0",
6
6
  "description": "Kreuzberg document intelligence - WebAssembly bindings",
@@ -25,6 +25,8 @@
25
25
  "./dist/pkg/*": "./dist/pkg/*",
26
26
  "./dist/kreuzberg_wasm.js": "./dist/kreuzberg_wasm.js",
27
27
  "./kreuzberg_wasm_bg.wasm": "./dist/pkg/kreuzberg_wasm_bg.wasm",
28
+ "./pkg/kreuzberg_wasm.js": "./dist/pkg/kreuzberg_wasm.js",
29
+ "./pkg/kreuzberg_wasm_bg.wasm": "./dist/pkg/kreuzberg_wasm_bg.wasm",
28
30
  "./runtime": {
29
31
  "types": "./dist/runtime.d.ts",
30
32
  "import": "./dist/runtime.js",
@@ -108,13 +110,13 @@
108
110
  },
109
111
  "devDependencies": {
110
112
  "@types/node": "^25.5.0",
111
- "@vitest/coverage-v8": "^4.1.0",
112
- "@vitest/ui": "^4.1.0",
113
+ "@vitest/coverage-v8": "^4.1.1",
114
+ "@vitest/ui": "^4.1.1",
113
115
  "jsdom": "^29.0.1",
114
- "oxlint": "^1.56.0",
116
+ "oxlint": "^1.57.0",
115
117
  "tsup": "^8.5.1",
116
- "typescript": "^5.9.3",
117
- "vitest": "^4.1.0"
118
+ "typescript": "^6.0.2",
119
+ "vitest": "^4.1.1"
118
120
  },
119
121
  "optionalDependencies": {
120
122
  "tesseract-wasm": "^0.11.0"