{"version":3,"file":"worker.cjs","sources":["../src/core/lsr.ts","../src/core/worker.ts"],"sourcesContent":["/**\n * kpathsea `ls-R` filename-database rendering.\n *\n * The worker regenerates the db from its in-memory TDS map on every fresh\n * engine instance, so `$TEXMFDBS` lookups are always exact — including files\n * added by the lazy-fetch retry after the bundled ls-R was created.\n */\n\n/**\n * Render an ls-R database for the given TDS-relative file paths. Every\n * directory gets its own `./dir:` block listing files and immediate\n * subdirectories — the shape kpathsea's db parser expects.\n */\nexport function buildLsR(paths: Iterable<string>): string {\n  const byDir = new Map<string, Set<string>>();\n  const entry = (dir: string, name: string) => {\n    let set = byDir.get(dir);\n    if (!set) byDir.set(dir, (set = new Set()));\n    set.add(name);\n  };\n  for (const path of paths) {\n    if (path === 'ls-R') continue; // the db must not index itself\n    const parts = path.split('/');\n    for (let i = 0; i < parts.length; i++) {\n      entry(parts.slice(0, i).join('/'), parts[i]!);\n    }\n  }\n  const lines = ['% ls-R -- filename database for kpathsea; do not change this line.'];\n  for (const dir of [...byDir.keys()].sort()) {\n    lines.push('', `./${dir}:`, ...[...byDir.get(dir)!].sort());\n  }\n  return lines.join('\\n') + '\\n';\n}\n","/**\n * Worker entry point. One Comlink-exposed instance per engine.\n *\n * The worker caches the engine's ES-module factory, the ICU data bytes and\n * the full TDS file map, and builds a FRESH Emscripten module instance for\n * every run(): TeX engines are not reentrant — a second callMain() on the\n * same instance misbehaves (static C state, getopt position and kpathsea\n * caches survive the first run; observed as wrong exit codes and wasm\n * \"index out of bounds\" traps). Instance setup costs an instantiation plus\n * repopulating MEMFS from the cached map, which is what correctness costs.\n *\n * Compile-time mandates we worked around:\n * - Emscripten ENV must be set BEFORE init; we sidestep by using TL's\n *   `-cnf-line=KEY=VAL` args which inject texmf.cnf settings at runtime.\n * - kpathsea search paths derive from $SELFAUTOPARENT (= dirname(thisProgram));\n *   we use thisProgram='/bin/<engine>' so /texmf-dist/web2c is in the cnf path.\n * - ICU's libicudata.a archive members are ELF; we link a stub icudt78_dat\n *   and JS-side load icudt78l.dat via _udata_setCommonData_78 for ICU engines.\n * - VFS backends live in the main thread. Comlink can only proxy top-level\n *   arguments, so they arrive as ONE proxied \"host\" object (dispatch by\n *   index) plus a cloneable capability list (see BackendHost/BackendMeta).\n */\n\nimport * as Comlink from 'comlink';\nimport type { EngineConfig, EngineId, RunOptions, RunResult, VfsBackend } from './types';\nimport { createBundleFs } from '../vfs/bundlefs';\nimport { loadManifest } from './manifest';\nimport { buildLsR } from './lsr';\nimport { safeRelativePath, safeResolve } from './paths';\n\n/** Cloneable capability descriptor for one VFS backend. */\nexport interface BackendMeta {\n  id: string;\n  hasList: boolean;\n  hasInit: boolean;\n  hasDispose: boolean;\n}\n\n/**\n * Main-thread dispatcher for the whole backend chain. Passed to init() as a\n * top-level Comlink proxy (nested proxies are not supported by Comlink).\n */\nexport interface BackendHost {\n  read(index: number, tdsPath: string): Promise<Uint8Array | null>;\n  exists(index: number, tdsPath: string): Promise<boolean>;\n  list(index: number, tdsPrefix: string): Promise<string[]>;\n  init(index: number): Promise<void>;\n  dispose(index: number): Promise<void>;\n}\n\nexport interface WorkerInitOptions {\n  engineId: EngineId;\n  /** Structured-cloneable subset of EngineConfig (no `vfs`). */\n  config: EngineConfig;\n  /** Capability list, index-aligned with the BackendHost dispatcher. */\n  backendMeta?: BackendMeta[];\n  /** Optional: bytes of `icudt78l.dat`. Required for xelatex + bibtexu locale ops. */\n  icuData?: Uint8Array;\n  /**\n   * Build the manifest's core BundleFS in here rather than on the main\n   * thread. Set by createEngine when it owns the backend chain: a\n   * main-thread BundleFS would hold the whole TDS twice (once per side) and\n   * ship every one of its ~17k files across the RPC boundary one read at a\n   * time. Not set when the caller supplied an explicit `vfs` chain — that\n   * chain is theirs to arrange.\n   */\n  bundleFromManifest?: boolean;\n}\n\nexport interface WorkerApi {\n  init(opts: WorkerInitOptions, host?: BackendHost & Comlink.ProxyMarked): Promise<void>;\n  run(opts: RunOptions): Promise<RunResult>;\n  dispose(): Promise<void>;\n}\n\n/**\n * The WASMFS (-sWASMFS=1) JS API is a *subset* of the legacy FS shim:\n * FS.isDir/isFile don't exist, and FS.analyzePath internally readFile()s any\n * existing path — which throws EISDIR for directories. Only the members\n * below are safe to use; existence/type checks go through stat() (see\n * pathExists / isDirMode).\n */\ninterface EmscriptenFS {\n  mkdir(path: string): void;\n  writeFile(path: string, data: Uint8Array | string): void;\n  readFile(path: string): Uint8Array;\n  readdir(path: string): string[];\n  stat(path: string): { mode: number; size: number };\n  chdir(path: string): void;\n  unlink(path: string): void;\n}\n\ninterface EmscriptenModule {\n  FS: EmscriptenFS;\n  ENV: Record<string, string>;\n  callMain(args: string[]): number;\n  HEAPU8: Uint8Array;\n  HEAPU32: Uint32Array;\n  _malloc(size: number): number;\n  _free(ptr: number): void;\n  _udata_setCommonData_78?: (dataPtr: number, errPtr: number) => void;\n  print?: (text: string) => void;\n  printErr?: (text: string) => void;\n}\n\ntype ModuleFactory = (\n  opts?: Partial<EmscriptenModule> & Record<string, unknown>,\n) => Promise<EmscriptenModule>;\n\n/** Engines that speak web2c/kpathsea argv conventions (-fmt, -cnf-line). */\nconst TEX_ENGINES: ReadonlySet<EngineId> = new Set(['pdflatex', 'xelatex', 'lualatex']);\n\n/** Minimal fontconfig config for XeTeX (see createInstance). */\nconst FONTS_CONF = `<?xml version=\"1.0\"?>\n<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n<fontconfig>\n  <dir>/texmf-dist/fonts/opentype</dir>\n  <dir>/texmf-dist/fonts/truetype</dir>\n  <dir>/texmf-dist/fonts/type1</dir>\n  <cachedir>/tmp/fontcache</cachedir>\n  <config>\n    <rescan><int>0</int></rescan>\n  </config>\n</fontconfig>\n`;\n\n/**\n * Per-engine default `-fmt` path. Present once the TDS map has been\n * populated into MEMFS; consumers can override via RunOptions.env.\n */\nconst FMT_PATH: Partial<Record<EngineId, string>> = {\n  pdflatex: '/texmf-dist/web2c/pdftex/pdflatex.fmt',\n  xelatex: '/texmf-dist/web2c/xetex/xelatex.fmt',\n  lualatex: '/texmf-dist/web2c/luatex/lualatex.fmt',\n};\n\n/** The diagnostic file each tool writes; xdvipdfmx has none (stderr only). */\nconst LOG_EXT: Partial<Record<EngineId, string>> = {\n  pdflatex: '.log',\n  xelatex: '.log',\n  lualatex: '.log',\n  bibtexu: '.blg',\n  biber: '.blg',\n  makeindex: '.ilg',\n};\n\n/** The argument each tool takes its job stem from. */\nconst INPUT_ARG_RE: Partial<Record<EngineId, RegExp>> = {\n  pdflatex: /\\.(tex|ltx)$/i,\n  xelatex: /\\.(tex|ltx)$/i,\n  lualatex: /\\.(tex|ltx)$/i,\n  bibtexu: /\\.aux$/i,\n  biber: /\\.bcf$/i,\n  makeindex: /\\.idx$/i,\n  xdvipdfmx: /\\.xdv$/i,\n};\n\n/** A caller that passes -fmt= or builds a format with -ini owns the choice. */\nfunction selectsOwnFormat(args: string[]): boolean {\n  return args.some((a) => /^--?(fmt|ini|initialize)\\b/.test(a));\n}\n\nclass WorkerImpl implements WorkerApi {\n  private engineId: EngineId | null = null;\n  private config: EngineConfig | null = null;\n  private backends: VfsBackend[] = [];\n  private glueFactory: ModuleFactory | null = null;\n  /**\n   * The wasm compiled ONCE per worker. Every run needs a fresh Emscripten\n   * *instance* (engines aren't reentrant), but without this cache the glue\n   * re-fetches and re-compiles the multi-MB binary each time — WKWebView\n   * has no wasm code cache, so on iOS that's a full compile per run.\n   * null → the glue manages its own loading (fallback).\n   */\n  private wasmModule: WebAssembly.Module | null = null;\n  private icuData: Uint8Array | null = null;\n  /** TDS-relative path → bytes; repopulated into every fresh instance. */\n  private tdsFiles = new Map<string, Uint8Array>();\n  /**\n   * /tmp/texmf-var contents harvested after each run and re-seeded into the\n   * next fresh instance — luaotfload's font-name database alone is worth\n   * multi-second rebuilds otherwise. Worker-scoped, so it can never outlive\n   * the TDS it was built from (a TDS change means a new worker + init()).\n   */\n  private varFiles = new Map<string, Uint8Array>();\n  /**\n   * basename → full TDS paths, built from the manifest (config.manifestUrl).\n   * The lazy-fetch retry resolves log-reported names (\"lmodern.sty\") to\n   * exact backend paths through this instead of guessing locations; the\n   * guessing heuristic stays as fallback for unindexed names.\n   */\n  private nameIndex = new Map<string, string[]>();\n  /** Whether the last created instance mounted the TDS lazily (see tryMountLazyTds). */\n  private lazyMounted = false;\n  /** The eager-fallback warning is worth saying once, not once per instance. */\n  private eagerWarned = false;\n  // Stable sinks bound at module-factory time. Emscripten's glue captures\n  // print/printErr into internal out/err ONCE at instantiation — reassigning\n  // module.print afterwards has no effect, so the closures must stay fixed\n  // and write through mutable buffers instead.\n  private stdoutBuf = '';\n  private stderrBuf = '';\n\n  async init(opts: WorkerInitOptions, host?: BackendHost): Promise<void> {\n    this.engineId = opts.engineId;\n    this.config = opts.config;\n    this.backends = (opts.backendMeta ?? []).map((meta, i) =>\n      reconstructBackend(meta, i, host ?? null),\n    );\n\n    // The core bundle is fetched and unpacked here in the worker (highest\n    // priority backend) — the browser HTTP cache dedupes the download\n    // across engine instances and no file bytes cross the RPC boundary.\n    const allowUnverified = opts.config.allowUnverifiedAssets === true;\n    if (opts.config.bundleUrl) {\n      this.backends.unshift(\n        await createBundleFs({\n          bundleUrl: opts.config.bundleUrl,\n          ...(opts.config.bundleSha256 ? { sha256: opts.config.bundleSha256 } : {}),\n          allowUnverified,\n        }),\n      );\n    } else if (opts.bundleFromManifest && opts.config.manifestUrl) {\n      this.backends.unshift(\n        await createBundleFs({ manifestUrl: opts.config.manifestUrl, allowUnverified }),\n      );\n    }\n\n    for (const b of this.backends) {\n      await b.init?.();\n    }\n\n    const glueUrl = this.resolveEngineGlueUrl();\n    this.glueFactory = (\n      (await import(/* @vite-ignore */ glueUrl)) as { default: ModuleFactory }\n    ).default;\n\n    // Compile the wasm once up front (see wasmModule doc). Any failure —\n    // exotic URL scheme, missing CORS, Node file:// — falls back to the\n    // glue's own loader, which is correct just slower.\n    if (this.config.enginePath) {\n      try {\n        const r = await fetch(this.config.enginePath);\n        if (r.ok) {\n          this.wasmModule = await WebAssembly.compile(await r.arrayBuffer());\n        }\n      } catch {\n        this.wasmModule = null;\n      }\n    }\n\n    this.icuData = opts.icuData ?? null;\n    if (!this.icuData && opts.config.icuDataUrl) {\n      const r = await fetch(opts.config.icuDataUrl);\n      if (!r.ok) {\n        throw new Error(\n          `texlive-wasm: HTTP ${r.status} fetching icuDataUrl ${opts.config.icuDataUrl}`,\n        );\n      }\n      this.icuData = new Uint8Array(await r.arrayBuffer());\n    }\n\n    // Drain every backend that exposes list() into the in-worker TDS map.\n    for (const backend of this.backends) {\n      if (!backend.list) continue;\n      const paths = await backend.list('');\n      for (const tdsPath of paths) {\n        // A backend's own listing is not automatically trustworthy — an\n        // archive it unpacked chose these names.\n        const rel = safeRelativePath(tdsPath);\n        if (!rel) continue;\n        const bytes = await backend.read(tdsPath);\n        if (bytes) this.tdsFiles.set(rel, bytes);\n      }\n    }\n\n    // Optional precise-resolution index for the lazy-fetch retry. Failure is\n    // non-fatal: the heuristic resolver still works, just less precisely.\n    if (opts.config.manifestUrl) {\n      try {\n        const manifest = await loadManifest(opts.config.manifestUrl);\n        for (const path of Object.keys(manifest.files)) {\n          const name = path.slice(path.lastIndexOf('/') + 1);\n          const existing = this.nameIndex.get(name);\n          if (existing) existing.push(path);\n          else this.nameIndex.set(name, [path]);\n        }\n      } catch {\n        this.nameIndex.clear();\n      }\n    }\n  }\n\n  /** Build a fresh engine instance with the TDS + ICU state applied. */\n  private async createInstance(): Promise<EmscriptenModule> {\n    if (!this.engineId || !this.glueFactory) {\n      throw new Error('Worker.init() must be called before run()');\n    }\n    const cachedModule = this.wasmModule;\n    const module = await this.glueFactory({\n      noInitialRun: true,\n      thisProgram: `/bin/${this.engineId}`,\n      print: (line: string) => {\n        this.stdoutBuf += line + '\\n';\n      },\n      printErr: (line: string) => {\n        this.stderrBuf += line + '\\n';\n      },\n      // Instantiate from the worker-cached Module instead of letting the\n      // glue re-fetch + re-compile the binary for every fresh instance.\n      ...(cachedModule\n        ? {\n            instantiateWasm: (\n              imports: WebAssembly.Imports,\n              done: (instance: WebAssembly.Instance, module?: WebAssembly.Module) => void,\n            ) => {\n              void WebAssembly.instantiate(cachedModule, imports).then((instance) =>\n                done(instance, cachedModule),\n              );\n              return {}; // async instantiation — exports arrive via done()\n            },\n          }\n        : {}),\n    });\n\n    if (this.icuData && module._udata_setCommonData_78) {\n      const ptr = module._malloc(this.icuData.length);\n      module.HEAPU8.set(this.icuData, ptr);\n      const errPtr = module._malloc(4);\n      module.HEAPU32[errPtr >> 2] = 0;\n      module._udata_setCommonData_78(ptr, errPtr);\n      // U_ZERO_ERROR is 0; non-zero is informational, ICU still works\n      // with fallback paths. We don't fail instance creation.\n    }\n\n    const FS = module.FS;\n    const dirs = new Set<string>(['/']);\n    mkdirCached(FS, '/bin', dirs);\n    FS.writeFile(`/bin/${this.engineId}`, new Uint8Array());\n    mkdirCached(FS, '/project', dirs);\n    // XeTeX resolves by-name font requests through fontconfig, which hard-\n    // fails at startup without a config file (\"cannot read font names\").\n    // Point it at the TDS font trees; both paths are probed by our build\n    // (/etc/fonts and the --prefix=/usr/local default).\n    if (this.engineId === 'xelatex') {\n      mkdirCached(FS, '/etc/fonts', dirs);\n      mkdirCached(FS, '/usr/local/etc/fonts', dirs);\n      mkdirCached(FS, '/tmp/fontcache', dirs);\n      FS.writeFile('/etc/fonts/fonts.conf', FONTS_CONF);\n      FS.writeFile('/usr/local/etc/fonts/fonts.conf', FONTS_CONF);\n    }\n    if (!pathExists(FS, '/tmp')) FS.mkdir('/tmp');\n    dirs.add('/tmp');\n    // Writable cache root for luaotfload and friends (see TEXMFVAR/\n    // TEXMFCACHE -cnf-line args in run()); re-seed the caches harvested\n    // from previous runs so they don't get rebuilt from scratch.\n    mkdirCached(FS, '/tmp/texmf-var', dirs);\n    for (const [rel, bytes] of this.varFiles) {\n      const absolute = `/tmp/texmf-var/${rel}`;\n      mkdirCached(FS, dirname(absolute), dirs);\n      FS.writeFile(absolute, bytes);\n    }\n\n    // biber's VFS (biber-vfs.tar.gz: perl/ + biber/ trees) mounts at the\n    // filesystem ROOT — it is a Perl runtime, not a texmf tree. Everything\n    // else is TDS-relative under /texmf-dist.\n    //\n    // TDS materialization has two paths:\n    //  - LAZY (preferred): engines built with the wasmfs-lazy backend keep\n    //    the file BYTES on the JS side; only cheap file nodes are created\n    //    and data is copied into the heap read-by-read. Saves ~250 MB of\n    //    heap per instance and nearly all of the per-run setup time.\n    //  - EAGER (permanent fallback): write every file into MEMFS — older\n    //    artifacts, biber, or any lazy-mount failure land here.\n    //\n    // The lazy mount MUST be attempted before anything creates /texmf-dist:\n    // wasmfs_create_directory is mkdir-like, so mounting onto an existing\n    // directory fails with EEXIST and silently drops us into the eager path.\n    this.lazyMounted = this.engineId === 'biber' ? false : this.tryMountLazyTds(module, dirs);\n    if (!this.lazyMounted) {\n      const fsRoot = this.engineId === 'biber' ? '' : '/texmf-dist';\n      if (fsRoot) mkdirCached(FS, fsRoot, dirs);\n      for (const [tdsPath, bytes] of this.tdsFiles) {\n        const absolute = `${fsRoot}/${tdsPath}`;\n        mkdirCached(FS, dirname(absolute), dirs);\n        FS.writeFile(absolute, bytes);\n      }\n    }\n    if (this.engineId !== 'biber') {\n      // Regenerate the kpathsea filename database from what is ACTUALLY in\n      // the map — any bundled ls-R is stale the moment the lazy-fetch retry\n      // adds a file, and with $TEXMFDBS set the db is authoritative. Keeping\n      // it exact turns every `//` search into an O(1) db hit. (Under the\n      // lazy mount the write lands in the handler's copy-on-write map.)\n      FS.writeFile('/texmf-dist/ls-R', buildLsR(this.tdsFiles.keys()));\n    }\n    return module;\n  }\n\n  /**\n   * Mount /texmf-dist as a lazy WASMFS JSImpl tree (engine/scripts/\n   * wasmfs-lazy.c). Returns false when the artifact lacks the backend or\n   * anything goes wrong — the caller then materializes eagerly.\n   *\n   * Every failure path is announced: the eager fallback still produces the\n   * right PDF, so a silent degradation is invisible until an engine instance\n   * has copied a quarter of a gigabyte into the heap and the WebView dies.\n   */\n  private tryMountLazyTds(module: EmscriptenModule, dirs: Set<string>): boolean {\n    if (this.config?.lazyTds === false) return false;\n    const m = module as EmscriptenModule & {\n      _texlive_mount_lazy?: () => number;\n      _texlive_touch?: (pathPtr: number) => number;\n      stringToUTF8?: (str: string, ptr: number, max: number) => void;\n      texliveLazyBackend?: unknown;\n    };\n    if (!m._texlive_mount_lazy || !m._texlive_touch || !m.stringToUTF8) {\n      this.warnEagerFallback(\n        'the engine artifact does not export the lazy WASMFS backend (rebuild it)',\n      );\n      return false;\n    }\n    try {\n      // Per-instance handler: file id → bytes (tar-backed views for touched\n      // nodes, copy-on-write for anything the engine writes, e.g. ls-R).\n      const fileBytes = new Map<number, Uint8Array>();\n      let pending: Uint8Array | null = null;\n      m.texliveLazyBackend = {\n        allocFile: (file: number) => {\n          if (pending) {\n            fileBytes.set(file, pending);\n            pending = null;\n          }\n        },\n        freeFile: (file: number) => {\n          fileBytes.delete(file);\n        },\n        getSize: (file: number) => fileBytes.get(file)?.length ?? 0,\n        read: (file: number, buffer: number, length: number, offset: number) => {\n          const bytes = fileBytes.get(file);\n          if (!bytes || offset >= bytes.length) return 0;\n          const n = Math.min(length, bytes.length - offset);\n          module.HEAPU8.set(bytes.subarray(offset, offset + n), buffer);\n          return n;\n        },\n        write: (file: number, buffer: number, length: number, offset: number) => {\n          const prev = fileBytes.get(file) ?? new Uint8Array(0);\n          let next: Uint8Array;\n          if (prev.length >= offset + length) {\n            next = prev.slice();\n          } else {\n            next = new Uint8Array(offset + length);\n            next.set(prev);\n          }\n          next.set(module.HEAPU8.subarray(buffer, buffer + length), offset);\n          fileBytes.set(file, next);\n          return length;\n        },\n        setSize: (file: number, size: number) => {\n          const prev = fileBytes.get(file) ?? new Uint8Array(0);\n          const next = new Uint8Array(size);\n          next.set(prev.subarray(0, Math.min(size, prev.length)));\n          fileBytes.set(file, next);\n          return 0;\n        },\n      };\n      const mountRc = m._texlive_mount_lazy();\n      if (mountRc !== 0) {\n        // -EEXIST here means something created /texmf-dist before the mount.\n        this.warnEagerFallback(`texlive_mount_lazy() failed with ${mountRc}`);\n        return false;\n      }\n      dirs.add('/texmf-dist');\n      const scratch = module._malloc(4096);\n      let failedTouch: string | null = null;\n      try {\n        for (const [tdsPath, bytes] of this.tdsFiles) {\n          const absolute = `/texmf-dist/${tdsPath}`;\n          mkdirCached(module.FS, dirname(absolute), dirs);\n          pending = bytes;\n          m.stringToUTF8(absolute, scratch, 4096);\n          const rc = m._texlive_touch(scratch);\n          pending = null; // a failed touch must not leak onto the next node\n          if (rc !== 0) {\n            // One unreachable file would surface much later as a mysterious\n            // \"I can't find file\" — fail the mount instead and materialize\n            // the tree the slow way, which cannot miss a file.\n            failedTouch = `${absolute} (rc=${rc})`;\n            break;\n          }\n        }\n      } finally {\n        module._free(scratch);\n      }\n      if (failedTouch) {\n        this.warnEagerFallback(`texlive_touch() failed for ${failedTouch}`);\n        return false;\n      }\n      return true;\n    } catch (err) {\n      this.warnEagerFallback(`lazy mount threw (${String(err)})`);\n      return false;\n    }\n  }\n\n  /** Once per worker: a compile builds several instances, all with the same verdict. */\n  private warnEagerFallback(reason: string): void {\n    if (this.eagerWarned) return;\n    this.eagerWarned = true;\n    console.warn(\n      `texlive-wasm: ${this.engineId} is materializing the TeX tree eagerly because ` +\n        `${reason}. Every engine instance now copies the whole tree into the wasm heap; ` +\n        `on a mobile WebView that is a likely out-of-memory.`,\n    );\n  }\n\n  async run(opts: RunOptions): Promise<RunResult> {\n    if (!this.engineId || !this.config || !this.glueFactory) {\n      throw new Error('Worker.init() must be called before run()');\n    }\n    const startedAt = performance.now();\n\n    // On-miss lazy fetch: a hard \"I can't find file X\" fails the compile;\n    // we parse those out of the .log, pull the files from the backends into\n    // the TDS map, and re-run — on a fresh instance, like every run. One\n    // retry resolves everything a nonstopmode pass reported; raise\n    // maxRetries when packages pull in further missing files transitively\n    // (cheap with local backends like TauriFS).\n    const lazy = opts.lazyFetch ?? true;\n    const maxRetries = lazy === false ? 0 : lazy === true ? 1 : Math.max(0, lazy.maxRetries ?? 1);\n    let exitCode = 0;\n    let retriesUsed = 0;\n    let stdout = '';\n    let stderr = '';\n    let outputs = new Map<string, Uint8Array>();\n    let log = '';\n\n    // What we wrote into /project, so the run can hand back only what the\n    // engine actually produced (see collectProduced).\n    const inputs = new Map<string, Uint8Array>();\n\n    for (let attempt = 0; attempt <= maxRetries; attempt++) {\n      let module: EmscriptenModule;\n      let FS: EmscriptenFS;\n      try {\n        module = await this.createInstance();\n        FS = module.FS;\n        inputs.clear();\n        for (const file of opts.files ?? []) {\n          const rel = safeRelativePath(file.path);\n          if (!rel) {\n            throw new Error(\n              `texlive-wasm: refusing file input with an escaping path: ${file.path}`,\n            );\n          }\n          const bytes = normalizeBytes(file.content);\n          const absolute = `/project/${rel}`;\n          mkdirP(FS, dirname(absolute));\n          FS.writeFile(absolute, bytes);\n          inputs.set(rel, bytes);\n        }\n      } catch (err) {\n        rethrowIfOom(err);\n        throw err;\n      }\n      // The engine reads and writes relative to the cwd, so an unconfined one\n      // is a write primitive anywhere in the tree.\n      const cwd = safeResolve('/project', opts.cwd ?? '/project');\n      if (!cwd) {\n        throw new Error(`texlive-wasm: refusing a cwd outside /project: ${opts.cwd}`);\n      }\n      FS.chdir(cwd);\n\n      const argv = [...this.standardArgs(FS, opts), ...opts.args];\n\n      this.stdoutBuf = '';\n      this.stderrBuf = '';\n      try {\n        exitCode = module.callMain(argv);\n      } catch (err) {\n        const e = err as { status?: number };\n        if (typeof e?.status === 'number') {\n          exitCode = e.status;\n        } else {\n          rethrowIfOom(err);\n          throw err;\n        }\n      }\n      stdout += this.stdoutBuf;\n      stderr += this.stderrBuf;\n\n      outputs = new Map<string, Uint8Array>();\n      collectProduced(FS, '/project', '', inputs, outputs);\n      log = this.findLog(FS, opts.args);\n\n      // Harvest engine-written caches (luaotfload font db, etc.) for the\n      // next instance — even failed compiles usually completed the cache\n      // build, so harvest unconditionally.\n      if (this.config?.persistTexmfVar !== false) {\n        try {\n          collectFiles(FS, '/tmp/texmf-var', '', this.varFiles);\n        } catch {\n          // A run that never touched the cache dir is fine.\n        }\n      }\n\n      if (exitCode === 0 || attempt === maxRetries) break;\n\n      // xdvipdfmx writes no log file — its complaints only exist on stderr.\n      const missing = parseMissingFiles(log || `${this.stdoutBuf}\\n${this.stderrBuf}`);\n      if (missing.length === 0) break;\n      const fetched = await this.fetchMissingIntoTds(missing);\n      if (fetched === 0) break;\n      retriesUsed++;\n    }\n\n    const result: RunResult = {\n      exitCode,\n      stdout,\n      stderr,\n      outputs,\n      log,\n      durationMs: performance.now() - startedAt,\n      lazyFetchRetries: retriesUsed,\n      lazyTds: this.lazyMounted,\n    };\n    // Hand the output buffers over instead of structured-cloning them: the\n    // PDF (and any generated image) is otherwise copied once more on its way\n    // out of the worker. Only whole-buffer views are transferable — detaching\n    // a buffer we only partly own would take the rest of it with us.\n    const transferables = new Set<ArrayBuffer>();\n    for (const bytes of outputs.values()) {\n      const buffer = bytes.buffer;\n      if (\n        buffer instanceof ArrayBuffer &&\n        bytes.byteOffset === 0 &&\n        bytes.byteLength === buffer.byteLength\n      ) {\n        transferables.add(buffer);\n      }\n    }\n    return Comlink.transfer(result, [...transferables]);\n  }\n\n  /** -fmt/-cnf-line are web2c TeX-engine conventions; the other engines reject them. */\n  private standardArgs(FS: EmscriptenFS, opts: RunOptions): string[] {\n    if (!this.engineId || !TEX_ENGINES.has(this.engineId)) return [];\n    const args: string[] = [];\n    const fmt = FMT_PATH[this.engineId];\n    if (fmt && pathExists(FS, fmt)) {\n      args.push(`-fmt=${fmt}`);\n    } else if (!selectsOwnFormat(opts.args)) {\n      // Without a format the engine falls back to mktexfmt, which needs\n      // fork(2) — ENOSYS in wasm. That surfaces as an unreadable crash deep\n      // in kpathsea, so say what is actually missing instead.\n      throw new Error(\n        `texlive-wasm: no LaTeX format for ${this.engineId} — ${fmt} is not in the TeX tree. ` +\n          `Install the engine's core bundle ('npx @typeward/texlive-wasm download-assets') and point ` +\n          `config.bundleUrl or config.manifestUrl at it, or pass your own -fmt=/-ini argument.`,\n      );\n    }\n    args.push(\n      '-cnf-line=TEXMFCNF=/texmf-dist/web2c',\n      '-cnf-line=TEXMF=/texmf-dist',\n      '-cnf-line=TEXMFDIST=/texmf-dist',\n      // Writable cache — luaotfload refuses to start without one. Both vars\n      // must point at the SAME root: with openout_any=p (paranoid, the TL\n      // default) LuaTeX only permits absolute-path writes under $TEXMFVAR /\n      // $TEXMFSYSVAR, and luaotfload prefers $TEXMFCACHE — pointing it\n      // anywhere else gets every cache mkdir/write \"operation not\n      // permitted\" (verified against the real engine).\n      '-cnf-line=TEXMFVAR=/tmp/texmf-var',\n      '-cnf-line=TEXMFCACHE=/tmp/texmf-var',\n      // The ls-R we regenerate per instance is exact, so db lookups are\n      // authoritative and every recursive `//` search below becomes a hash\n      // hit instead of a MEMFS directory walk.\n      '-cnf-line=TEXMFDBS=/texmf-dist',\n      '-cnf-line=TEXINPUTS=.;/texmf-dist/tex//',\n      '-cnf-line=TFMFONTS=/texmf-dist/fonts/tfm//',\n      '-cnf-line=VFFONTS=/texmf-dist/fonts/vf//',\n      '-cnf-line=T1FONTS=/texmf-dist/fonts/type1//',\n      '-cnf-line=ENCFONTS=/texmf-dist/fonts/enc//',\n      '-cnf-line=TEXFONTMAPS=/texmf-dist/fonts/map//',\n      '-cnf-line=OPENTYPEFONTS=/texmf-dist/fonts/opentype//;/texmf-dist/fonts/truetype//;/texmf-dist/fonts/type1//',\n      '-cnf-line=TRUETYPEFONTS=/texmf-dist/fonts/truetype//',\n    );\n    // RunOptions.env entries become texmf.cnf overrides — the only runtime\n    // environment channel Emscripten leaves us (ENV is frozen after init).\n    for (const [key, value] of Object.entries(opts.env ?? {})) {\n      args.push(`-cnf-line=${key}=${value}`);\n    }\n    return args;\n  }\n\n  /**\n   * For each missing TDS path the log complained about, walk the backend\n   * chain and store the bytes into the TDS map (the next instance picks\n   * them up). Returns how many files were resolved. Searches multiple\n   * plausible TDS sublocations because the log usually says\n   * \"lmroman10-regular.otf\", not the absolute TDS path.\n   */\n  private async fetchMissingIntoTds(missing: string[]): Promise<number> {\n    let written = 0;\n    for (const name of missing) {\n      // Exact manifest paths first; heuristic location guessing as fallback.\n      const indexed = name.includes('/') ? [] : (this.nameIndex.get(name) ?? []);\n      // These names were parsed out of an engine log — i.e. out of whatever\n      // the document asked TeX to \\input. Nothing downstream of here may see\n      // a path that leaves /texmf-dist.\n      const candidates = [...indexed, ...expandMissingName(name)]\n        .map((c) => safeRelativePath(c))\n        .filter((c): c is string => c !== null);\n      for (const candidate of candidates) {\n        let bytes: Uint8Array | null = null;\n        for (const backend of this.backends) {\n          try {\n            const r = await backend.read(candidate);\n            if (r) {\n              bytes = r;\n              break;\n            }\n          } catch {\n            // A flaky backend (offline CDN, 5xx) must not abort the whole\n            // retry — fall through to the next backend.\n          }\n        }\n        if (bytes) {\n          this.tdsFiles.set(candidate, bytes);\n          written++;\n          break;\n        }\n      }\n    }\n    return written;\n  }\n\n  /**\n   * Locate the diagnostic file this engine writes. TeX engines write\n   * `<jobname>.log`; the helpers each have their own (bibtexu/biber `.blg`,\n   * makeindex `.ilg`) and none of them accepts a `-jobname`, so their names\n   * derive from the file they were pointed at. Without this, the on-miss\n   * lazy fetch below is a no-op for every helper — it never even finds a log\n   * to read. xdvipdfmx writes no log at all; its diagnostics are on stderr.\n   */\n  private findLog(FS: EmscriptenFS, args: string[]): string {\n    if (!this.engineId) return '';\n    const ext = LOG_EXT[this.engineId];\n    if (!ext) return ''; // xdvipdfmx: diagnostics go to stderr, not a file\n    const stem = this.jobStem(args);\n    if (!stem) return '';\n    // The tool writes its log into the cwd under the job stem, regardless of\n    // where the input file lived.\n    return readTextFile(FS, `/project/${stem}${ext}`);\n  }\n\n  /** Job stem: honors -jobname, else the basename of the tool's input file. */\n  private jobStem(args: string[]): string | undefined {\n    const jobArg = args.find((a) => /^--?jobname=/.test(a));\n    if (jobArg) return jobArg.split('=')[1];\n    const inputRe = INPUT_ARG_RE[this.engineId ?? 'pdflatex'] ?? /\\.(tex|ltx)$/i;\n    const candidates = args.filter((a) => !a.startsWith('-'));\n    // biber is handed a bare jobname (\"main\"), not a file, so fall back to\n    // the last positional argument when nothing matches the input pattern.\n    const match = candidates.find((a) => inputRe.test(a)) ?? candidates[candidates.length - 1];\n    return match?.replace(inputRe, '').split('/').pop();\n  }\n\n  async dispose(): Promise<void> {\n    for (const b of this.backends) {\n      await b.dispose?.();\n    }\n    this.glueFactory = null;\n    this.wasmModule = null;\n    this.tdsFiles.clear();\n    this.varFiles.clear();\n  }\n\n  private resolveEngineGlueUrl(): string {\n    if (!this.config || !this.engineId) {\n      throw new Error('resolveEngineGlueUrl: config missing');\n    }\n    if (this.config.enginePath) {\n      return this.config.enginePath.replace(/\\.wasm$/, '.js');\n    }\n    // No artifact ships inside the npm package (the .wasm files live on\n    // GitHub Releases), so there is no meaningful default URL to guess —\n    // and a bundler-mangled relative URL would 404 confusingly anyway.\n    throw new Error(\n      `texlive-wasm: config.enginePath is required. Download the engine artifacts ` +\n        `('npx @typeward/texlive-wasm download-assets') and pass e.g. ` +\n        `enginePath: '/texlive-wasm/${this.engineId}/emscripten/${this.engineId}.wasm'.`,\n    );\n  }\n}\n\n// ----- helpers --------------------------------------------------------------\n\nfunction reconstructBackend(\n  meta: BackendMeta,\n  index: number,\n  host: BackendHost | null,\n): VfsBackend {\n  if (!host) {\n    throw new Error('Worker.init(): backendMeta supplied without a BackendHost proxy');\n  }\n  const backend: VfsBackend = {\n    id: meta.id,\n    read: (tdsPath: string) => host.read(index, tdsPath),\n    exists: (tdsPath: string) => host.exists(index, tdsPath),\n  };\n  if (meta.hasList) backend.list = (tdsPrefix: string) => host.list(index, tdsPrefix);\n  if (meta.hasInit) backend.init = () => host.init(index);\n  if (meta.hasDispose) backend.dispose = () => host.dispose(index);\n  return backend;\n}\n\nfunction dirname(p: string): string {\n  const i = p.lastIndexOf('/');\n  return i <= 0 ? '/' : p.slice(0, i);\n}\n\n/**\n * Emscripten reports heap-growth failure as an abort (\"Cannot enlarge memory\n * arrays\", \"OOM\") or a bare RangeError from WebAssembly.Memory.grow. Rethrow\n * those under a stable name (Comlink preserves name/message across the worker\n * boundary) so apps can react — dispose idle engines, retry — instead of\n * treating it as an opaque engine crash.\n */\nfunction rethrowIfOom(err: unknown): void {\n  const text = err instanceof Error ? `${err.name}: ${err.message}` : String(err);\n  if (err instanceof RangeError || /cannot enlarge memory|out of memory|\\bOOM\\b/i.test(text)) {\n    const oom = new Error(\n      `engine ran out of memory (${text}); dispose idle engines or reduce concurrent workers, then retry`,\n    );\n    oom.name = 'EngineOutOfMemoryError';\n    throw oom;\n  }\n}\n\n/** Existence check that is safe for directories under WASMFS (see interface note). */\nfunction pathExists(FS: EmscriptenFS, path: string): boolean {\n  try {\n    FS.stat(path);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** S_IFDIR test on a stat mode — the WASMFS shim has no FS.isDir. */\nfunction isDirMode(mode: number): boolean {\n  return (mode & 0xf000) === 0x4000;\n}\n\nfunction mkdirP(FS: EmscriptenFS, path: string): void {\n  if (!path || path === '/' || pathExists(FS, path)) return;\n  mkdirP(FS, dirname(path));\n  FS.mkdir(path);\n}\n\n/**\n * mkdir -p with a caller-held cache of created dirs — populating tens of\n * thousands of TDS files per instance makes per-file stat() checks add up.\n */\nfunction mkdirCached(FS: EmscriptenFS, path: string, seen: Set<string>): void {\n  if (!path || seen.has(path)) return;\n  const parent = dirname(path);\n  if (parent !== path) mkdirCached(FS, parent, seen);\n  if (!pathExists(FS, path)) FS.mkdir(path);\n  seen.add(path);\n}\n\nfunction normalizeBytes(content: string | Uint8Array): Uint8Array {\n  return typeof content === 'string' ? new TextEncoder().encode(content) : content;\n}\n\nfunction collectFiles(\n  FS: EmscriptenFS,\n  absDir: string,\n  relPrefix: string,\n  out: Map<string, Uint8Array>,\n): void {\n  for (const name of FS.readdir(absDir)) {\n    if (name === '.' || name === '..') continue;\n    const abs = `${absDir}/${name}`;\n    const rel = relPrefix ? `${relPrefix}/${name}` : name;\n    const st = FS.stat(abs);\n    if (isDirMode(st.mode)) {\n      collectFiles(FS, abs, rel, out);\n    } else {\n      out.set(rel, FS.readFile(abs));\n    }\n  }\n}\n\n/**\n * Like collectFiles, but skips files that are byte-for-byte the input we\n * wrote — echoing a project's images and fonts back across the worker\n * boundary on every pass is the single biggest avoidable copy in a compile.\n * The size check keeps the common case (a big unchanged asset) from being\n * read out of the FS at all.\n */\nfunction collectProduced(\n  FS: EmscriptenFS,\n  absDir: string,\n  relPrefix: string,\n  inputs: Map<string, Uint8Array>,\n  out: Map<string, Uint8Array>,\n): void {\n  for (const name of FS.readdir(absDir)) {\n    if (name === '.' || name === '..') continue;\n    const abs = `${absDir}/${name}`;\n    const rel = relPrefix ? `${relPrefix}/${name}` : name;\n    const st = FS.stat(abs);\n    if (isDirMode(st.mode)) {\n      collectProduced(FS, abs, rel, inputs, out);\n      continue;\n    }\n    const input = inputs.get(rel);\n    if (input && input.length === st.size) {\n      const current = FS.readFile(abs);\n      if (sameBytes(input, current)) continue;\n      out.set(rel, current);\n      continue;\n    }\n    out.set(rel, FS.readFile(abs));\n  }\n}\n\nfunction sameBytes(a: Uint8Array, b: Uint8Array): boolean {\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n  return true;\n}\n\n/**\n * Pull \"I can't find file `x.sty'\" / \"Font ... not found\" / \"! LaTeX\n * Error: File `x.sty' not found\" lines out of the .log and return the\n * referenced filenames.\n *\n * The helper tools each complain in their own dialect — bibtexu wants a\n * .bst, makeindex an .ist, xdvipdfmx a CMap or a font map — and they write\n * those complaints into their own log (.blg/.ilg, see WorkerImpl.findLog),\n * so their patterns live here too.\n */\nfunction parseMissingFiles(log: string): string[] {\n  if (!log) return [];\n  const out = new Set<string>();\n  const patterns = [\n    // TeX engines.\n    /I can't find file `([^']+)'/g,\n    /File `([^']+)' not found/g,\n    /file `([^']+)' is not loadable/g,\n    /Cannot find ([\\w.-]+\\.(?:sty|cls|fd|def|cfg|tfm|vf|pfb|otf|ttf|mf|enc|map))/gi,\n    // bibtex/bibtexu (.blg): \"I couldn't open style file plainnat.bst\".\n    /I couldn't open (?:style|database|auxiliary) file ([\\w./-]+)/g,\n    // makeindex (.ilg): \"Index style file custom.ist not found\".\n    /[Ii]ndex style file ([\\w./-]+) not found/g,\n    /Couldn't (?:open|find) (?:style|input) file ([\\w./-]+)/g,\n    // xdvipdfmx / dvipdfmx (stderr): missing CMaps, font maps, encodings.\n    /Could not open (?:file|font|CMap)[:\\s]+\"?([\\w./-]+)\"?/g,\n    /Unable to find (?:file|font)[:\\s]+\"?([\\w./-]+)\"?/g,\n  ];\n  for (const re of patterns) {\n    let m;\n    while ((m = re.exec(log)) !== null) {\n      const name = m[1]?.trim();\n      if (name && !name.includes('//') && !name.startsWith('-')) out.add(name);\n    }\n  }\n  return Array.from(out);\n}\n\n/**\n * Given a bare file name like \"amsmath.sty\", produce the candidate TDS\n * subpaths a backend might serve it under. The backend's read() will be\n * tried for each in order.\n */\nfunction expandMissingName(name: string): string[] {\n  if (name.startsWith('/')) return [name];\n  if (name.includes('/')) return [name];\n  const ext = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n  const stem = name;\n  const out = [stem];\n  if (ext === 'sty' || ext === 'cls' || ext === 'def' || ext === 'fd' || ext === 'cfg') {\n    out.push(`tex/latex/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n    out.push(`tex/latex/base/${stem}`);\n  } else if (ext === 'tex' || ext === 'ltx') {\n    out.push(`tex/generic/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n  } else if (ext === 'tfm') {\n    out.push(`fonts/tfm/public/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n  } else if (ext === 'otf' || ext === 'ttf') {\n    out.push(`fonts/opentype/public/${stem.replace(/\\d.*$/, '')}/${stem}`);\n    out.push(`fonts/truetype/public/${stem.replace(/\\d.*$/, '')}/${stem}`);\n  } else if (ext === 'pfb' || ext === 'pfa') {\n    out.push(`fonts/type1/public/${stem.replace(/\\d.*$/, '')}/${stem}`);\n  } else if (ext === 'map' || ext === 'enc') {\n    out.push(`fonts/${ext}/dvips/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n  } else if (ext === 'bst') {\n    // bibtexu's styles: TDS puts them under bibtex/bst/<package>/.\n    out.push(`bibtex/bst/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n    out.push(`bibtex/bst/base/${stem}`);\n  } else if (ext === 'bib') {\n    out.push(`bibtex/bib/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n  } else if (ext === 'ist' || ext === 'mst') {\n    out.push(`makeindex/${stem.replace(/\\.\\w+$/, '')}/${stem}`);\n    out.push(`makeindex/base/${stem}`);\n  } else if (ext === '' || ext === 'cmap') {\n    // xdvipdfmx CMaps have no extension (\"UniJIS-UCS2-H\").\n    out.push(`fonts/cmap/${stem}`);\n  }\n  return out;\n}\n\nfunction readTextFile(FS: EmscriptenFS, path: string): string {\n  if (!pathExists(FS, path)) return '';\n  try {\n    return new TextDecoder('utf-8', { fatal: false }).decode(FS.readFile(path));\n  } catch {\n    return '';\n  }\n}\n\nconst api = new WorkerImpl();\n// Only bind Comlink when we really are the worker. Importing this module from\n// anywhere else (a test that drives the FS orchestration against a fake\n// Emscripten module, an SSR pass) must not attach handlers to a foreign\n// global — a Worker global has postMessage, Node does not.\nif (typeof (globalThis as { postMessage?: unknown }).postMessage === 'function') {\n  Comlink.expose(api);\n}\n\nexport { WorkerImpl };\n"],"names":["createBundleFs","paths","safeRelativePath","manifest","loadManifest","safeResolve","Comlink"],"mappings":"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"}