{
  "version": 3,
  "sources": ["../../../../src/packages/worker/index.ts"],
  "sourcesContent": ["// cspell:ignore checkin\nimport path from 'node:path';\nimport os from 'node:os';\nimport { WorkerPool } from '@rushstack/worker-pool';\nimport { PnpmError } from '../error/index.ts';\nimport { execSync } from 'node:child_process';\nimport isWindows from 'is-windows';\n// import type { PackageFilesIndex } from '../store.cafs/index.ts';\nimport type { DependencyManifest } from '../types/index.ts';\nimport { quote as shellQuote } from 'shell-quote';\nimport type {\n  TarballExtractMessage,\n  AddDirToStoreMessage,\n  LinkPkgMessage,\n  SymlinkAllModulesMessage,\n} from './types.ts';\nimport process from 'node:process';\n\nlet workerPool: WorkerPool | undefined;\n\nexport async function restartWorkerPool(): Promise<void> {\n  await finishWorkers();\n\n  workerPool = createTarballWorkerPool();\n}\n\nexport async function finishWorkers(): Promise<void> {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-expect-error\n  await global.finishWorkers?.();\n}\n\nfunction createTarballWorkerPool(): WorkerPool {\n  const maxWorkers =\n    Math.max(\n      2,\n      (os.availableParallelism() || os.cpus().length) -\n        Math.abs(\n          typeof process.env.PNPM_WORKERS === 'string'\n            ? Number.parseInt(process.env.PNPM_WORKERS)\n            : 0\n        )\n    ) - 1;\n  const workerPool = new WorkerPool({\n    id: 'pnpm',\n    maxWorkers,\n    workerScriptPath: path.join(__dirname, 'worker.js'),\n  });\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-expect-error\n  if (typeof global.finishWorkers === 'function') {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-expect-error\n    const previous = global.finishWorkers;\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-expect-error\n    global.finishWorkers = async () => {\n      await previous();\n      await workerPool.finishAsync();\n    };\n  } else {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-expect-error\n    global.finishWorkers = () => {\n      return workerPool.finishAsync();\n    };\n  }\n\n  return workerPool;\n}\n\nexport type AddFilesResult = {\n  filesIndex: Record<string, string>;\n  manifest: DependencyManifest;\n  requiresBuild: boolean;\n};\n\ntype AddFilesFromDirOptions = Pick<\n  AddDirToStoreMessage,\n  | 'storeDir'\n  | 'dir'\n  | 'filesIndexFile'\n  | 'sideEffectsCacheKey'\n  | 'readManifest'\n  | 'pkg'\n  | 'files'\n>;\n\nexport async function addFilesFromDir(\n  opts: AddFilesFromDirOptions\n): Promise<AddFilesResult> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  return new Promise<{\n    filesIndex: Record<string, string>;\n    manifest: DependencyManifest;\n    requiresBuild: boolean;\n  }>((resolve, reject) => {\n    localWorker.once('message', ({ status, error, value }) => {\n      workerPool?.checkinWorker(localWorker);\n\n      if (status === 'error') {\n        reject(\n          new PnpmError(\n            error.code ?? 'GIT_FETCH_FAILED',\n            error.message as string\n          )\n        );\n\n        return;\n      }\n\n      resolve(value);\n    });\n\n    localWorker.postMessage({\n      type: 'add-dir',\n      storeDir: opts.storeDir,\n      dir: opts.dir,\n      filesIndexFile: opts.filesIndexFile,\n      sideEffectsCacheKey: opts.sideEffectsCacheKey,\n      readManifest: opts.readManifest,\n      pkg: opts.pkg,\n      files: opts.files,\n    });\n  });\n}\n\nexport class TarballIntegrityError extends PnpmError {\n  readonly found: string;\n  readonly expected: string;\n  readonly algorithm: string;\n  readonly sri: string;\n  readonly url: string;\n\n  constructor(opts: {\n    attempts?: number;\n    found: string;\n    expected: string;\n    algorithm: string;\n    sri: string;\n    url: string;\n  }) {\n    super(\n      'TARBALL_INTEGRITY',\n      `Got unexpected checksum for \"${opts.url}\". Wanted \"${opts.expected}\". Got \"${opts.found}\".`,\n      {\n        attempts: opts.attempts,\n        hint: `This error may happen when a package is republished to the registry with the same version.\nIn this case, the metadata in the local pnpm cache will contain the old integrity checksum.\n\nIf you think that this is the case, then run \"pnpm store prune\" and rerun the command that failed.\n\"pnpm store prune\" will remove your local metadata cache.`,\n      }\n    );\n    this.found = opts.found;\n    this.expected = opts.expected;\n    this.algorithm = opts.algorithm;\n    this.sri = opts.sri;\n    this.url = opts.url;\n  }\n}\n\ntype AddFilesFromTarballOptions = Pick<\n  TarballExtractMessage,\n  | 'buffer'\n  | 'storeDir'\n  | 'filesIndexFile'\n  | 'integrity'\n  | 'readManifest'\n  | 'pkg'\n> & {\n  url: string;\n};\n\nexport async function addFilesFromTarball(\n  opts: AddFilesFromTarballOptions\n): Promise<AddFilesResult> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  return new Promise<{\n    filesIndex: Record<string, string>;\n    manifest: DependencyManifest;\n    requiresBuild: boolean;\n  }>((resolve, reject) => {\n    localWorker.once('message', ({ status, error, value }) => {\n      workerPool?.checkinWorker(localWorker);\n\n      if (status === 'error') {\n        if (error.type === 'integrity_validation_failed') {\n          reject(\n            new TarballIntegrityError({\n              ...error,\n              url: opts.url,\n            })\n          );\n          return;\n        }\n\n        reject(\n          new PnpmError(\n            error.code ?? 'TARBALL_EXTRACT',\n            `Failed to add tarball from \"${opts.url}\" to store: ${error.message as string}`\n          )\n        );\n\n        return;\n      }\n\n      resolve(value);\n    });\n\n    localWorker.postMessage({\n      type: 'extract',\n      buffer: opts.buffer,\n      storeDir: opts.storeDir,\n      integrity: opts.integrity,\n      filesIndexFile: opts.filesIndexFile,\n      readManifest: opts.readManifest,\n      pkg: opts.pkg,\n    });\n  });\n}\n\nexport async function readPkgFromCafs<T>(\n  storeDir: string,\n  verifyStoreIntegrity: boolean,\n  filesIndexFile: string,\n  readManifest?: boolean | undefined\n): Promise<T> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  return new Promise<T>((resolve, reject) => {\n    localWorker.once('message', ({ status, error, value }) => {\n      workerPool?.checkinWorker(localWorker);\n\n      if (status === 'error') {\n        reject(\n          new PnpmError(\n            error.code ?? 'READ_FROM_STORE',\n            error.message as string\n          )\n        );\n\n        return;\n      }\n\n      resolve(value);\n    });\n\n    localWorker.postMessage({\n      type: 'readPkgFromCafs',\n      storeDir,\n      filesIndexFile,\n      readManifest,\n      verifyStoreIntegrity,\n    });\n  });\n}\n\nexport async function importPackage<IP>(\n  opts: Omit<LinkPkgMessage, 'type'>\n): Promise<IP> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  return new Promise<IP>((resolve, reject) => {\n    localWorker.once('message', ({ status, error, value }) => {\n      workerPool?.checkinWorker(localWorker);\n\n      if (status === 'error') {\n        reject(\n          new PnpmError(error.code ?? 'LINKING_FAILED', error.message as string)\n        );\n\n        return;\n      }\n\n      resolve(value);\n    });\n\n    localWorker.postMessage({\n      type: 'link',\n      ...opts,\n    });\n  });\n}\n\nexport async function symlinkAllModules(\n  opts: Omit<SymlinkAllModulesMessage, 'type'>\n): Promise<{ isBuilt: boolean; importMethod?: string | undefined }> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  return new Promise<{ isBuilt: boolean; importMethod?: string | undefined }>(\n    (resolve, reject) => {\n      localWorker.once('message', ({ status, error, value }) => {\n        workerPool?.checkinWorker(localWorker);\n\n        if (status === 'error') {\n          const hint =\n            opts.deps[0]?.modules != null\n              ? createErrorHint(error, opts.deps[0].modules)\n              : undefined;\n\n          reject(\n            new PnpmError(\n              error.code ?? 'SYMLINK_FAILED',\n              error.message as string,\n              { hint }\n            )\n          );\n\n          return;\n        }\n\n        resolve(value);\n      });\n\n      localWorker.postMessage({\n        type: 'symlinkAllModules',\n        ...opts,\n      });\n    }\n  );\n}\n\nfunction createErrorHint(err: Error, checkedDir: string): string | undefined {\n  if ('code' in err && err.code === 'EISDIR' && isWindows()) {\n    const checkedDrive = `${checkedDir.split(':')[0]}:`;\n    if (isDriveExFat(checkedDrive)) {\n      return `The \"${checkedDrive}\" drive is exFAT, which does not support symlinks. This will cause installation to fail. You can set the node-linker to \"hoisted\" to avoid this issue.`;\n    }\n  }\n  return undefined;\n}\n\n// In Windows system exFAT drive, symlink will result in error.\nfunction isDriveExFat(drive: string): boolean {\n  try {\n    // cspell:disable-next-line\n    const output = execSync(\n      `wmic logicaldisk where ${shellQuote([`DeviceID='${drive}'`])} get FileSystem`\n    ).toString();\n\n    const lines = output.trim().split('\\n');\n\n    const name = lines.length > 1 ? (lines[1]?.trim() ?? '') : '';\n\n    return name === 'exFAT';\n  } catch {\n    return false;\n  }\n}\n\nexport async function hardLinkDir(\n  src: string,\n  destDirs: string[]\n): Promise<void> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  await new Promise<void>((resolve, reject) => {\n    localWorker.once('message', ({ status, error }) => {\n      workerPool?.checkinWorker(localWorker);\n\n      if (status === 'error') {\n        reject(\n          new PnpmError(\n            error.code ?? 'HARDLINK_FAILED',\n            error.message as string\n          )\n        );\n\n        return;\n      }\n\n      resolve();\n    });\n\n    localWorker.postMessage({\n      type: 'hardLinkDir',\n      src,\n      destDirs,\n    });\n  });\n}\n\nexport async function initStoreDir(storeDir: string): Promise<void> {\n  if (typeof workerPool === 'undefined') {\n    workerPool = createTarballWorkerPool();\n  }\n\n  const localWorker = await workerPool.checkoutWorkerAsync(true);\n\n  return new Promise<void>((resolve, reject) => {\n    localWorker.once('message', ({ status, error }) => {\n      workerPool?.checkinWorker(localWorker);\n\n      if (status === 'error') {\n        reject(\n          new PnpmError(\n            error.code ?? 'INIT_CAFS_FAILED',\n            error.message as string\n          )\n        );\n\n        return;\n      }\n\n      resolve();\n    });\n\n    localWorker.postMessage({\n      type: 'init-store',\n      storeDir,\n    });\n  });\n}\n"],
  "mappings": "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",
  "names": ["workerPool"]
}
