{"version":3,"file":"cache.mjs","names":[],"sources":["../../src/compiler/cache.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nconst SHARED_BUILD_SCHEMA = 1;\nconst OBJECTS_DIRECTORY = 'objects';\nconst INDEX_DIRECTORY = 'index';\nconst LOCKS_DIRECTORY = 'locks';\nconst MANIFEST_FILE = 'manifest.json';\nconst OWNER_FILE = 'owner.json';\nconst LOCK_STALE_MS = 5 * 60_000;\nconst LOCK_TIMEOUT_MS = 60_000;\nconst LOCK_RETRY_MS = 25;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst PRIVATE_FILE_MODE = 0o600;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/u;\nconst OUTPUT_ROOT_TOKEN = '__DOOMPI_PATH_OUTPUT__';\nexport interface SharedBuildInput {\n  logicalPath: string;\n  sha256: string;\n  token: string;\n  /** Canonical source path for inputs outside the synchronized repository. */\n  sourcePath?: string;\n}\n\nexport interface SharedBuildAsset {\n  contents: string | Uint8Array;\n  mode?: number;\n}\n\nexport interface SharedBuildArtifact {\n  path: string;\n  sha256: string;\n  mode?: number;\n}\n\nexport interface SharedBuildManifest {\n  schema: number;\n  key: string;\n  lookupKey: string;\n  entry: string;\n  inputs: SharedBuildInput[];\n  artifacts: SharedBuildArtifact[];\n}\n\nexport interface ResolvedSharedBuild {\n  directory: string;\n  manifest: SharedBuildManifest;\n  replacements: ReadonlyMap<string, string>;\n}\n\ninterface SharedBuildIndex {\n  schema: number;\n  keys: string[];\n}\n\nexport interface PublishSharedBuildOptions {\n  cacheDirectory: string;\n  lookupKey: string;\n  entry: string;\n  inputs: SharedBuildInput[];\n  artifacts: ReadonlyMap<string, string | Uint8Array | SharedBuildAsset>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function contentSha256(contents: string | Uint8Array): string {\n  return crypto.createHash('sha256').update(contents).digest('hex');\n}\n\nfunction safeRelativePath(value: string): string | undefined {\n  if (value === '' || path.isAbsolute(value)) return undefined;\n  const normalized = path.normalize(value);\n  return normalized === '..' || normalized.startsWith(`..${path.sep}`) ? undefined : normalized;\n}\n\nfunction parseManifest(value: unknown): SharedBuildManifest | undefined {\n  if (\n    !isRecord(value) ||\n    value.schema !== SHARED_BUILD_SCHEMA ||\n    typeof value.key !== 'string' ||\n    !SHA256_PATTERN.test(value.key) ||\n    typeof value.lookupKey !== 'string' ||\n    !SHA256_PATTERN.test(value.lookupKey) ||\n    typeof value.entry !== 'string' ||\n    !Array.isArray(value.inputs) ||\n    !Array.isArray(value.artifacts)\n  ) {\n    return undefined;\n  }\n  const inputs: SharedBuildInput[] = [];\n  for (const input of value.inputs) {\n    if (\n      !isRecord(input) ||\n      typeof input.logicalPath !== 'string' ||\n      typeof input.sha256 !== 'string' ||\n      (input.sha256 !== '' && !SHA256_PATTERN.test(input.sha256)) ||\n      typeof input.token !== 'string' ||\n      (input.sourcePath !== undefined && (typeof input.sourcePath !== 'string' || !path.isAbsolute(input.sourcePath)))\n    ) {\n      return undefined;\n    }\n    inputs.push({\n      logicalPath: input.logicalPath,\n      sha256: input.sha256,\n      token: input.token,\n      ...(typeof input.sourcePath === 'string' ? { sourcePath: input.sourcePath } : {}),\n    });\n  }\n  const artifacts: SharedBuildArtifact[] = [];\n  for (const artifact of value.artifacts) {\n    if (\n      !isRecord(artifact) ||\n      typeof artifact.path !== 'string' ||\n      typeof artifact.sha256 !== 'string' ||\n      !SHA256_PATTERN.test(artifact.sha256) ||\n      (artifact.mode !== undefined &&\n        (typeof artifact.mode !== 'number' ||\n          !Number.isInteger(artifact.mode) ||\n          artifact.mode < 0 ||\n          artifact.mode > 0o777))\n    ) {\n      return undefined;\n    }\n    if (!safeRelativePath(artifact.path)) return undefined;\n    artifacts.push({\n      path: artifact.path,\n      sha256: artifact.sha256,\n      ...(typeof artifact.mode === 'number' ? { mode: artifact.mode } : {}),\n    });\n  }\n  if (!safeRelativePath(value.entry)) return undefined;\n  return {\n    schema: SHARED_BUILD_SCHEMA,\n    key: value.key,\n    lookupKey: value.lookupKey,\n    entry: value.entry,\n    inputs,\n    artifacts,\n  };\n}\n\nfunction readJson(target: string): unknown {\n  try {\n    return JSON.parse(fs.readFileSync(target, 'utf8')) as unknown;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction writeAtomic(target: string, contents: string | Uint8Array, mode = PRIVATE_FILE_MODE): void {\n  fs.mkdirSync(path.dirname(target), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n  const temporary = `${target}.${process.pid}.${crypto.randomUUID()}.tmp`;\n  try {\n    fs.writeFileSync(temporary, contents, { mode });\n    fs.renameSync(temporary, target);\n    fs.chmodSync(target, mode);\n  } catch (error) {\n    fs.rmSync(temporary, { force: true });\n    throw error;\n  }\n}\n\nfunction indexPath(cacheDirectory: string, lookupKey: string): string {\n  return path.join(cacheDirectory, INDEX_DIRECTORY, `${lookupKey}.json`);\n}\n\nfunction readIndex(cacheDirectory: string, lookupKey: string): SharedBuildIndex {\n  const parsed = readJson(indexPath(cacheDirectory, lookupKey));\n  if (!isRecord(parsed) || parsed.schema !== SHARED_BUILD_SCHEMA || !Array.isArray(parsed.keys)) {\n    return { schema: SHARED_BUILD_SCHEMA, keys: [] };\n  }\n  return {\n    schema: SHARED_BUILD_SCHEMA,\n    keys: parsed.keys.filter((key): key is string => typeof key === 'string'),\n  };\n}\n\nfunction writeIndex(cacheDirectory: string, lookupKey: string, key: string): void {\n  const current = readIndex(cacheDirectory, lookupKey);\n  const keys = [key, ...current.keys.filter((candidate) => candidate !== key)];\n  writeAtomic(\n    indexPath(cacheDirectory, lookupKey),\n    `${JSON.stringify({ schema: SHARED_BUILD_SCHEMA, keys }, null, 2)}\\n`,\n  );\n}\n\nfunction objectDirectory(cacheDirectory: string, key: string): string {\n  return path.join(cacheDirectory, OBJECTS_DIRECTORY, key);\n}\n\nfunction artifactBytes(directory: string, artifact: SharedBuildArtifact): Buffer | undefined {\n  const relative = safeRelativePath(artifact.path);\n  if (!relative) return undefined;\n  try {\n    if (fs.lstatSync(directory).isSymbolicLink()) return undefined;\n    const target = path.join(directory, relative);\n    if (fs.lstatSync(target).isSymbolicLink()) return undefined;\n    const canonicalDirectory = fs.realpathSync(directory);\n    const canonicalTarget = fs.realpathSync(target);\n    const confined = path.relative(canonicalDirectory, canonicalTarget);\n    if (confined.startsWith('..') || path.isAbsolute(confined)) return undefined;\n    const bytes = fs.readFileSync(canonicalTarget);\n    return contentSha256(bytes) === artifact.sha256 ? bytes : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nexport function findSharedBuild(\n  cacheDirectory: string,\n  lookupKey: string,\n  resolveInput: (input: SharedBuildInput) => string | undefined,\n): ResolvedSharedBuild | undefined {\n  if (!SHA256_PATTERN.test(lookupKey)) return undefined;\n  for (const key of readIndex(cacheDirectory, lookupKey).keys) {\n    if (!SHA256_PATTERN.test(key)) continue;\n    const directory = objectDirectory(cacheDirectory, key);\n    const manifest = parseManifest(readJson(path.join(directory, MANIFEST_FILE)));\n    if (!manifest || manifest.key !== key || manifest.lookupKey !== lookupKey || !manifestKeyMatches(manifest))\n      continue;\n    if (manifest.artifacts.some((artifact) => artifactBytes(directory, artifact) === undefined)) continue;\n    const replacements = new Map<string, string>();\n    let valid = true;\n    for (const input of manifest.inputs) {\n      const target = resolveInput(input);\n      if (!target) {\n        valid = false;\n        break;\n      }\n      if (input.sha256 !== '') {\n        try {\n          if (contentSha256(fs.readFileSync(target)) !== input.sha256) {\n            valid = false;\n            break;\n          }\n        } catch {\n          valid = false;\n          break;\n        }\n      }\n      replacements.set(input.token, target);\n    }\n    if (valid) return { directory, manifest, replacements };\n  }\n  return undefined;\n}\n\nfunction manifestKey(\n  options: Omit<PublishSharedBuildOptions, 'cacheDirectory'>,\n  artifacts: SharedBuildArtifact[],\n): string {\n  return contentSha256(\n    JSON.stringify({\n      schema: SHARED_BUILD_SCHEMA,\n      lookupKey: options.lookupKey,\n      entry: options.entry,\n      inputs: options.inputs,\n      artifacts,\n    }),\n  );\n}\n\nfunction manifestKeyMatches(manifest: SharedBuildManifest): boolean {\n  return (\n    manifest.key ===\n    manifestKey(\n      {\n        lookupKey: manifest.lookupKey,\n        entry: manifest.entry,\n        inputs: manifest.inputs,\n        artifacts: new Map(),\n      },\n      manifest.artifacts,\n    )\n  );\n}\n\nfunction sharedObjectMatches(directory: string, expected: SharedBuildManifest): boolean {\n  const current = parseManifest(readJson(path.join(directory, MANIFEST_FILE)));\n  if (!current || current.key !== expected.key || !manifestKeyMatches(current)) return false;\n  return expected.artifacts.every((artifact) => artifactBytes(directory, artifact) !== undefined);\n}\n\nexport function publishSharedBuild(options: PublishSharedBuildOptions): SharedBuildManifest {\n  if (!SHA256_PATTERN.test(options.lookupKey)) {\n    throw new Error(`Shared build lookup key must be a full SHA-256 digest: ${options.lookupKey}`);\n  }\n  if (options.inputs.some((input) => input.sourcePath !== undefined && !path.isAbsolute(input.sourcePath))) {\n    throw new Error('Shared build external source paths must be absolute');\n  }\n  const artifacts = [...options.artifacts.entries()]\n    .map(([artifactPath, value]) => {\n      const asset: SharedBuildAsset =\n        typeof value === 'string' || value instanceof Uint8Array ? { contents: value } : value;\n      const relative = safeRelativePath(artifactPath);\n      if (!relative) throw new Error(`Shared build artifact escapes its object: ${artifactPath}`);\n      return {\n        path: relative,\n        sha256: contentSha256(asset.contents),\n        ...(asset.mode === undefined ? {} : { mode: asset.mode }),\n      };\n    })\n    .sort((left, right) => left.path.localeCompare(right.path));\n  const inputs = [...options.inputs].sort((left, right) => left.logicalPath.localeCompare(right.logicalPath));\n  const key = manifestKey({ ...options, inputs }, artifacts);\n  const manifest: SharedBuildManifest = {\n    schema: SHARED_BUILD_SCHEMA,\n    key,\n    lookupKey: options.lookupKey,\n    entry: options.entry,\n    inputs,\n    artifacts,\n  };\n  const finalDirectory = objectDirectory(options.cacheDirectory, key);\n  if (fs.existsSync(finalDirectory) && !sharedObjectMatches(finalDirectory, manifest)) {\n    fs.rmSync(finalDirectory, { recursive: true, force: true });\n  }\n  if (!fs.existsSync(finalDirectory)) {\n    const temporaryDirectory = `${finalDirectory}.${process.pid}.${crypto.randomUUID()}.tmp`;\n    try {\n      fs.mkdirSync(temporaryDirectory, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n      for (const [artifactPath, value] of options.artifacts) {\n        const asset: SharedBuildAsset =\n          typeof value === 'string' || value instanceof Uint8Array ? { contents: value } : value;\n        const relative = safeRelativePath(artifactPath);\n        if (!relative) throw new Error(`Shared build artifact escapes its object: ${artifactPath}`);\n        const target = path.join(temporaryDirectory, relative);\n        fs.mkdirSync(path.dirname(target), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n        fs.writeFileSync(target, asset.contents, { mode: asset.mode ?? PRIVATE_FILE_MODE });\n        fs.chmodSync(target, asset.mode ?? PRIVATE_FILE_MODE);\n      }\n      fs.writeFileSync(path.join(temporaryDirectory, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\\n`, {\n        mode: PRIVATE_FILE_MODE,\n      });\n      fs.mkdirSync(path.dirname(finalDirectory), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n      try {\n        fs.renameSync(temporaryDirectory, finalDirectory);\n      } catch (error) {\n        if (!fs.existsSync(finalDirectory)) throw error;\n      }\n    } finally {\n      fs.rmSync(temporaryDirectory, { recursive: true, force: true });\n    }\n  }\n  writeIndex(options.cacheDirectory, options.lookupKey, key);\n  return manifest;\n}\n\nexport function materializeSharedBuild(build: ResolvedSharedBuild, outputDirectory: string): string {\n  const replacements = [...build.replacements.entries()].sort(([left], [right]) => right.length - left.length);\n  for (const artifact of build.manifest.artifacts) {\n    const bytes = artifactBytes(build.directory, artifact);\n    if (!bytes) throw new Error(`Shared build artifact is corrupt: ${artifact.path}`);\n    let contents: string | Uint8Array = bytes;\n    if (artifact.path.endsWith('.mjs')) {\n      let source = bytes.toString('utf8');\n      source = source\n        .replaceAll(`${OUTPUT_ROOT_TOKEN}:url`, pathToFileURL(outputDirectory).href)\n        .replaceAll(OUTPUT_ROOT_TOKEN, outputDirectory);\n      for (const [token, target] of replacements) {\n        source = source.replaceAll(`${token}:url`, pathToFileURL(target).href).replaceAll(token, target);\n      }\n      if (source.includes('__DOOMPI_PATH_'))\n        throw new Error(`Shared build left unresolved path tokens in ${artifact.path}`);\n      contents = source;\n    }\n    writeAtomic(path.join(outputDirectory, artifact.path), contents, artifact.mode ?? PRIVATE_FILE_MODE);\n  }\n  return path.join(outputDirectory, build.manifest.entry);\n}\n\nfunction processAlive(processId: number): boolean {\n  try {\n    process.kill(processId, 0);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nfunction lockIsStale(lockDirectory: string): boolean {\n  const owner = readJson(path.join(lockDirectory, OWNER_FILE));\n  if (!isRecord(owner) || typeof owner.pid !== 'number' || typeof owner.createdAt !== 'number') return true;\n  return Date.now() - owner.createdAt > LOCK_STALE_MS && !processAlive(owner.pid);\n}\n\nasync function sleep(milliseconds: number): Promise<void> {\n  await new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport async function withSharedBuildLock<T>(\n  cacheDirectory: string,\n  lookupKey: string,\n  operation: () => Promise<T>,\n): Promise<T> {\n  if (!SHA256_PATTERN.test(lookupKey)) {\n    throw new Error(`Shared build lock key must be a full SHA-256 digest: ${lookupKey}`);\n  }\n  const lockDirectory = path.join(cacheDirectory, LOCKS_DIRECTORY, `${lookupKey}.lock`);\n  fs.mkdirSync(path.dirname(lockDirectory), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n  const startedAt = Date.now();\n  while (true) {\n    try {\n      fs.mkdirSync(lockDirectory, { mode: PRIVATE_DIRECTORY_MODE });\n      fs.writeFileSync(\n        path.join(lockDirectory, OWNER_FILE),\n        `${JSON.stringify({ pid: process.pid, createdAt: Date.now() })}\\n`,\n        { mode: PRIVATE_FILE_MODE },\n      );\n      break;\n    } catch (error) {\n      if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST') throw error;\n      if (lockIsStale(lockDirectory)) {\n        fs.rmSync(lockDirectory, { recursive: true, force: true });\n        continue;\n      }\n      if (Date.now() - startedAt >= LOCK_TIMEOUT_MS) {\n        throw new Error(`Timed out waiting for shared build lock ${lookupKey}`);\n      }\n      await sleep(LOCK_RETRY_MS);\n    }\n  }\n  try {\n    return await operation();\n  } finally {\n    fs.rmSync(lockDirectory, { recursive: true, force: true });\n  }\n}\n"],"mappings":"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"}