{"version":3,"file":"electronGet.js","sourceRoot":"","sources":["../../src/util/electronGet.ts"],"names":[],"mappings":"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","sourcesContent":["import * as get from \"@electron/get\"\nimport {\n  ElectronDownloadCacheMode,\n  ElectronDownloadRequest,\n  ElectronDownloadRequestOptions,\n  ElectronPlatformArtifactDetails,\n  GotDownloaderOptions,\n  MirrorOptions,\n} from \"@electron/get\"\nimport { buildGotProxyAgent, exec, exists, log, PADDING, parseValidEnvVarUrl, sanitizeDirPath, to7zaOutputSwitch } from \"builder-util\"\nimport { getPath7za } from \"../toolsets/7zip\"\nimport { MultiProgress } from \"electron-publish/out/multiProgress\"\nimport { createReadStream, createWriteStream } from \"fs\"\nimport * as fs from \"fs/promises\"\nimport * as crypto from \"crypto\"\nimport * as os from \"os\"\nimport * as path from \"path\"\nimport * as lockfile from \"proper-lockfile\"\nimport { pipeline } from \"stream/promises\"\nimport * as tar from \"tar\"\nimport * as unzipper from \"unzipper\"\nimport { HttpError, retry } from \"builder-util-runtime\"\nimport { ElectronPlatformName } from \"../electron/ElectronFramework\"\nimport { CacheState, cleanupCacheDirectory, computeCacheMetadata, readCacheStateFile, validateCacheDirectory, writeCacheState } from \"./cacheState\"\nimport type { ProgressBar } from \"electron-publish\"\n\nexport type ElectronGetOptions = Omit<\n  ElectronPlatformArtifactDetails,\n  | \"platform\"\n  | \"arch\"\n  | \"version\"\n  | \"artifactName\"\n  | \"artifactSuffix\"\n  | \"customFilename\"\n  | \"tempDirectory\"\n  | \"downloader\"\n  | \"cacheMode\"\n  | \"cacheRoot\"\n  | \"downloadOptions\"\n  | \"isGeneric\"\n  | \"mirrorOptions\" // to be added below\n> & {\n  mirrorOptions?: Omit<MirrorOptions, \"customDir\" | \"customFilename\" | \"customVersion\">\n}\n\nexport type ArtifactDownloadOptions = {\n  electronDownload?: ElectronGetOptions | ElectronDownloadOptions | null\n  artifactName: string\n  platformName: string\n  arch: string\n  version: string\n  cacheDir?: string\n}\n\nexport interface ElectronDownloadOptions {\n  // https://github.com/electron-userland/electron-builder/issues/3077\n  // must be optional\n  version?: string\n\n  /**\n   * The [cache location](https://github.com/electron-userland/electron-download#cache-location).\n   */\n  cache?: string | null\n\n  /**\n   * The mirror.\n   */\n  mirror?: string | null\n\n  /** @private */\n  customDir?: string | null\n  /** @private */\n  customFilename?: string | null\n\n  /** @private */\n  strictSSL?: boolean\n  /** @private */\n  isVerifyChecksum?: boolean\n\n  platform?: ElectronPlatformName\n  arch?: string\n}\n\nfunction hashUrlSafe(input: string, length = 6): string {\n  let hash = 5381\n  for (let i = 0; i < input.length; i++) {\n    hash = ((hash << 5) + hash) ^ input.charCodeAt(i)\n  }\n  hash >>>= 0\n  const out = hash.toString(36)\n  return out.length >= length ? out.slice(0, length) : out.padStart(length, \"0\")\n}\n\nexport function getCacheDirectory(options: { isAvoidSystemOnWindows?: boolean; allowEnvVarOverride: boolean }): string {\n  const { isAvoidSystemOnWindows = true, allowEnvVarOverride } = options\n  const env = process.env.ELECTRON_BUILDER_CACHE?.trim()\n  if (allowEnvVarOverride && env && path.parse(env).root) {\n    return env\n  }\n\n  const appName = \"electron-builder\"\n  const platform = os.platform()\n  const homeDir = os.homedir()\n\n  if (platform === \"darwin\") {\n    return path.join(homeDir, \"Library\", \"Caches\", appName)\n  }\n  if (platform === \"win32\") {\n    const localAppData = process.env.LOCALAPPDATA?.trim()\n    const username = process.env.USERNAME?.trim()?.toLowerCase()\n    // https://github.com/electron-userland/electron-builder/issues/1164\n    const isSystemUser = isAvoidSystemOnWindows && (localAppData?.toLowerCase()?.includes(\"\\\\windows\\\\system32\\\\\") || username === \"system\")\n    if (!localAppData || isSystemUser) {\n      return path.join(os.tmpdir(), `${appName}-cache`)\n    }\n    return path.join(localAppData, appName, \"Cache\")\n  }\n\n  const xdgCache = process.env.XDG_CACHE_HOME\n  return xdgCache && path.parse(xdgCache).root ? path.join(xdgCache, appName) : path.join(homeDir, \".cache\", appName)\n}\n\nfunction resolveCacheMode(): ElectronDownloadCacheMode {\n  const varName = \"ELECTRON_DOWNLOAD_CACHE_MODE\"\n  const cacheOverride = process.env[varName]?.trim()\n  if (cacheOverride && Number(cacheOverride) in ElectronDownloadCacheMode) {\n    const mode = Number(cacheOverride) as ElectronDownloadCacheMode\n    log.debug({ mode }, `cache mode overridden via env var ${varName}`)\n    return mode\n  }\n  return ElectronDownloadCacheMode.ReadWrite\n}\n\nasync function extractZipStreaming(file: string, dir: string): Promise<void> {\n  // Pass 1: read central directory once to collect Unix modes (one seek to EOF)\n  const zipDir = await unzipper.Open.file(file)\n  const entryModes = new Map<string, number>()\n  for (const entry of zipDir.files) {\n    const mode = (entry.externalFileAttributes >> 16) & 0xffff\n    if (mode > 0) {\n      entryModes.set(entry.path, mode)\n    }\n  }\n  const isSymlink = (mode: number) => (mode & 0o170000) === 0o120000\n\n  // Pass 2: stream from byte 0 — no per-entry seeks, no Docker hang\n  const entries = createReadStream(file).pipe(unzipper.Parse({ forceStream: true }))\n  for await (const entry of entries as AsyncIterable<unzipper.Entry>) {\n    const destPath = path.resolve(dir, entry.path)\n    if (!destPath.startsWith(dir + path.sep) && destPath !== dir) {\n      throw new Error(`Path traversal blocked: ${entry.path}`)\n    }\n    const mode = entryModes.get(entry.path) ?? 0\n    if (mode > 0 && isSymlink(mode)) {\n      const target = (await entry.buffer()).toString()\n      if (path.isAbsolute(target)) {\n        throw new Error(`Absolute symlink target blocked: ${target}`)\n      }\n      const resolvedTarget = path.resolve(path.dirname(destPath), target)\n      if (!resolvedTarget.startsWith(dir + path.sep) && resolvedTarget !== dir) {\n        throw new Error(`Symlink target escapes extraction dir: ${target}`)\n      }\n      await fs.mkdir(path.dirname(destPath), { recursive: true })\n      await fs.symlink(target, destPath)\n    } else if (entry.type === \"Directory\") {\n      await fs.mkdir(destPath, { recursive: true })\n      entry.autodrain()\n    } else {\n      await fs.mkdir(path.dirname(destPath), { recursive: true })\n      await pipeline(entry, createWriteStream(destPath))\n      if (mode > 0) {\n        await fs.chmod(destPath, mode & 0o7777)\n      }\n    }\n  }\n}\n\nexport async function extractArchive(file: string, dir: string) {\n  const tmpDir = `${dir}.tmp`\n  await fs.mkdir(tmpDir, { recursive: true })\n\n  const release = await lockfile.lock(tmpDir, {\n    // 100 retries (not 15) so concurrent callers wait out a slow first extraction instead of failing\n    // with ELOCKED; the update heartbeat keeps an in-progress holder's lock fresh against `stale`.\n    retries: { retries: 100, minTimeout: 1000, maxTimeout: 5000 },\n    stale: 120000, // Increased from 60s to allow long-running extractions\n  })\n\n  try {\n    // rm + mkdir happen AFTER acquiring the lock so no concurrent caller can clear our tmpDir mid-extraction\n    await fs.rm(tmpDir, { recursive: true, force: true })\n    await fs.mkdir(tmpDir, { recursive: true })\n\n    // Guard against the transient window in @electron/get's non-atomic putFileInCache (remove → move).\n    // A concurrent worker may have deleted and not yet replaced the source archive; wait briefly for it.\n    for (let i = 0; !(await exists(file)); i++) {\n      if (i >= 4) {\n        throw Object.assign(new Error(`Source archive not found after retries: ${file}`), { code: \"ENOENT\", path: file })\n      }\n      log.warn({ file, attempt: i + 1 }, \"source archive transiently missing, retrying\")\n      await new Promise(r => setTimeout(r, 300 * (i + 1)))\n    }\n\n    if (file.endsWith(\".tar.gz\") || file.endsWith(\".tgz\")) {\n      await tar.extract({ file, cwd: tmpDir, strip: 1 })\n    } else if (file.endsWith(\".tar.xz\") || file.endsWith(\".txz\")) {\n      // node-tar cannot decompress xz, so use 7za to turn the .tar.xz into a .tar, then extract that tar.\n      const cmd7za = await getPath7za()\n      const xzOutDir = `${tmpDir}.xz`\n      await fs.rm(xzOutDir, { recursive: true, force: true })\n      await fs.mkdir(xzOutDir, { recursive: true })\n      try {\n        await exec(cmd7za, [\"x\", \"-bd\", file, to7zaOutputSwitch(sanitizeDirPath(xzOutDir)), \"-y\"])\n        const innerTar = (await fs.readdir(xzOutDir)).find(f => f.endsWith(\".tar\"))\n        if (innerTar == null) {\n          throw new Error(`xz decompression of ${path.basename(file)} produced no .tar archive`)\n        }\n        await tar.extract({ file: path.join(xzOutDir, innerTar), cwd: tmpDir, strip: 1 })\n      } finally {\n        await fs.rm(xzOutDir, { recursive: true, force: true })\n      }\n    } else if (file.endsWith(\".zip\")) {\n      await extractZipStreaming(file, tmpDir)\n    } else if (file.endsWith(\".7z\")) {\n      const cmd7za = await getPath7za()\n      try {\n        await exec(cmd7za, [\"x\", \"-bd\", file, to7zaOutputSwitch(sanitizeDirPath(tmpDir)), \"-y\"])\n      } catch (e: any) {\n        // Check if extraction actually failed or just had benign warnings\n        const files = await fs.readdir(tmpDir)\n        if (files.length === 0) {\n          log.warn({ file, tmpDir, error: e.message }, \"7z extraction produced no output\")\n          throw new Error(`7z extraction failed for ${file}: ${e.message}`)\n        }\n        // If files were extracted despite the error, log and continue\n        log.warn({ error: e.message, filesExtracted: files.length }, \"7z reported error but extracted files\")\n      }\n    } else {\n      throw new Error(`Unsupported archive format: ${path.basename(file)}`)\n    }\n\n    // Verify extraction produced files\n    const extractedFiles = await fs.readdir(tmpDir)\n    if (extractedFiles.length === 0) {\n      throw new Error(`Extraction of ${path.basename(file)} produced no files`)\n    }\n\n    await fs.rm(dir, { recursive: true, force: true })\n    await fs.rename(tmpDir, dir)\n  } finally {\n    await release().catch(err => log.warn({ err }, \"failed to release lockfile\"))\n  }\n}\n\nasync function downloadArtifactToFile(config: Parameters<typeof get.downloadArtifact>[0], label: string): Promise<string> {\n  // Serialize concurrent downloads of the same artifact across vitest workers to prevent @electron/get's\n  // non-atomic putFileInCache (remove + move) from racing with a concurrent reader.\n  const artifactLockKey = crypto\n    .createHash(\"sha256\")\n    .update(JSON.stringify({ v: config.version, p: (config as any).platform, a: (config as any).arch, n: (config as any).artifactName }))\n    .digest(\"hex\")\n    .slice(0, 20)\n  const artifactLockPath = path.join(os.tmpdir(), `eb-dl-${artifactLockKey}.lock`)\n  // This lock is taken when the artifact is not yet in @electron/get's download cache. 100 retries\n  // matches the other toolset locks; stale (10min) + proper-lockfile's update heartbeat keep a live\n  // downloader's lock fresh so the longer wait never falsely steals an in-progress download.\n  const releaseArtifactLock = await lockfile.lock(artifactLockPath, {\n    retries: { retries: 100, minTimeout: 500, maxTimeout: 5000 },\n    stale: 600_000,\n    realpath: false,\n  })\n  let lastLoggedMilestone = -1\n  const state: { bar: ProgressBar | undefined } = { bar: undefined }\n\n  const downloadOptions: GotDownloaderOptions = {\n    timeout: { request: 10 * 60 * 1000 }, // prevent indefinite hang on stalled connections\n    ...config.downloadOptions,\n    agent: config.downloadOptions?.agent ?? buildGotProxyAgent(),\n    getProgressCallback: info => {\n      // @electron/get passes downloadOptions (including this callback) to its internal\n      // SHASUMS256.txt validation download. That file is tiny (<1 MB) and fires at 100%\n      // immediately, producing a spurious bar even when the artifact itself is cached.\n      // Skip progress display for any download whose total size is known and small.\n      if (info.total && info.total < 1_000_000) {\n        return Promise.resolve()\n      }\n      if (!state.bar && process.stdout.isTTY) {\n        log.info({ label }, \"downloading\")\n        state.bar = new MultiProgress().createBar(`${\" \".repeat(PADDING + 2)}[:bar] :percent | ${label}`, { total: 100 })\n      }\n      const pct = info.percent != null ? Math.floor(info.percent * 100) : 0\n      if (state.bar) {\n        state.bar.update(pct)\n      } else {\n        // log every 25% milestone for non-TTY environments (e.g. CI logs) to provide some visibility into download progress without overwhelming logs with too many updates\n        const percentCompleted = info.transferred && info.total ? Math.floor((info.transferred / info.total) * 100) : Math.floor(pct / 25) * 25\n        if (percentCompleted > lastLoggedMilestone && percentCompleted > 0) {\n          lastLoggedMilestone = percentCompleted\n          log.info({ label, progress: `${percentCompleted}%` }, percentCompleted !== 100 ? \"downloading\" : \"downloaded\")\n        }\n      }\n      return Promise.resolve()\n    },\n  }\n\n  const configWithProgress = { ...config, downloadOptions }\n  try {\n    let filePath: string\n    try {\n      filePath = await retry(() => get.downloadArtifact(configWithProgress), {\n        retries: 3,\n        interval: 2000,\n        backoff: 2000,\n        shouldRetry: (e: any) => {\n          if (e instanceof HttpError) {\n            return e.isServerError()\n          }\n          if (typeof e?.response?.statusCode === \"number\") {\n            return e.response.statusCode >= 500\n          }\n          return typeof e?.code === \"string\" && [\"ENOTFOUND\", \"ETIMEDOUT\", \"ECONNRESET\", \"EPIPE\", \"ENOENT\"].includes(e.code)\n        },\n      })\n    } catch (err) {\n      if (typeof (err as any)?.message === \"string\" && (err as any).message.includes(\"dest already exists\")) {\n        filePath = await get.downloadArtifact(configWithProgress)\n      } else {\n        throw err\n      }\n    }\n    if (!(await exists(filePath))) {\n      log.warn({ filePath, label }, \"cached artifact missing from disk; retrying with cache write\")\n      filePath = await get.downloadArtifact({ ...configWithProgress, cacheMode: ElectronDownloadCacheMode.WriteOnly })\n    }\n    if (!state.bar && lastLoggedMilestone === -1) {\n      log.info({ label }, \"using cached artifact\")\n    }\n    return filePath\n  } finally {\n    state.bar?.update(100)\n    state.bar?.terminate()\n    await releaseArtifactLock().catch(err => log.warn({ err }, \"failed to release artifact download lock\"))\n  }\n}\n\n/**\n * Checks electron-builder's own archive cache for a previously downloaded archive.\n * Validates the SHA-256 checksum when one is known. Returns the cached path on hit,\n * null on miss or checksum mismatch (mismatch also deletes the stale file).\n */\nasync function resolveFromArchiveCache(archiveCachePath: string, label: string, expectedSha256: string | undefined): Promise<string | null> {\n  if (!(await exists(archiveCachePath))) {\n    return null\n  }\n  if (expectedSha256) {\n    const hash = await new Promise<string>((resolve, reject) => {\n      const h = crypto.createHash(\"sha256\")\n      const s = createReadStream(archiveCachePath)\n      s.on(\"error\", reject)\n      s.on(\"data\", (chunk: Buffer | string) => h.update(chunk))\n      s.on(\"end\", () => resolve(h.digest(\"hex\")))\n    })\n    if (hash !== expectedSha256) {\n      log.warn({ file: label, archiveCachePath }, \"cached archive checksum mismatch — removing and re-downloading\")\n      await fs.rm(archiveCachePath).catch(() => {})\n      return null\n    }\n  }\n  log.debug({ file: label, archiveCachePath }, \"using cached archive — skipping download\")\n  return archiveCachePath\n}\n\n/**\n * Copies a freshly downloaded archive into electron-builder's own archive cache so that\n * future builds (including offline environments) can skip the network request entirely.\n */\nasync function persistToArchiveCache(sourcePath: string, archiveCachePath: string): Promise<void> {\n  try {\n    await fs.mkdir(path.dirname(archiveCachePath), { recursive: true })\n    await fs.copyFile(sourcePath, archiveCachePath)\n  } catch (err) {\n    log.warn({ err, archiveCachePath }, \"failed to persist archive to cache — will re-download next time\")\n  }\n}\n\n/**\n * Core download + extract engine. Handles lockfile, cache-hit short-circuit,\n * progress bar, extraction (.zip or .tar.gz), and completion marker.\n * Both public download functions delegate here after building their respective configs.\n */\nasync function downloadAndExtract(config: Parameters<typeof get.downloadArtifact>[0], extractDir: string, label: string, archiveCachePath?: string): Promise<string> {\n  await fs.mkdir(extractDir, { recursive: true })\n\n  // Pre-lock fast path: only short-circuit for a definitively complete and valid cache.\n  // Do NOT clean up here — concurrent processes could race to delete under each other.\n  const stateData = await readCacheStateFile(extractDir)\n  if (stateData?.state === CacheState.complete) {\n    const isValid = await validateCacheDirectory(extractDir, stateData.fileCount)\n    if (isValid) {\n      log.debug({ file: label, path: extractDir }, \"using cached artifact - cache valid\")\n      return extractDir\n    }\n  }\n\n  // Be patient: when many targets/builds contend on the same toolset cache concurrently, all but the\n  // first wait here while the winner downloads+extracts (a large bundle can take >1min). 15 retries\n  // (~67s) is too few and waiters fail with ELOCKED before the winner finishes; 100 matches the\n  // patience of withToolsetLock. proper-lockfile's update heartbeat keeps a live holder's lock fresh,\n  // so increasing waiter retries never falsely steals an in-progress extraction.\n  const release = await lockfile.lock(extractDir, {\n    retries: { retries: 100, minTimeout: 1000, maxTimeout: 5000 },\n    stale: 120000,\n  })\n  let downloadedFile: string | null = null\n  try {\n    // Re-check after acquiring lock: another worker may have completed while we waited.\n    const stateDataAfterLock = await readCacheStateFile(extractDir)\n    if (stateDataAfterLock?.state === CacheState.complete) {\n      const isValid = await validateCacheDirectory(extractDir, stateDataAfterLock.fileCount)\n      if (isValid) {\n        log.debug({ file: label, path: extractDir }, \"using cached artifact - skipping download/extract\")\n        return extractDir\n      }\n      log.warn({ extractDir }, \"Cache marked complete but files invalid, clearing\")\n    } else if (stateDataAfterLock?.state === CacheState.corrupted) {\n      log.warn({ extractDir }, \"Corrupted cache detected, cleaning up and re-extracting\")\n    }\n\n    // Cleanup inside the lock — skip lock files since we currently hold them\n    await cleanupCacheDirectory(extractDir, { skipLockFiles: true })\n    await fs.mkdir(extractDir, { recursive: true })\n\n    // Check electron-builder's own archive cache before touching @electron/get.\n    // The cache lives alongside the extract dir: <cacheDir>/<releaseName>/<filename>.\n    // This lets repeated builds (or offline environments) skip the download entirely once\n    // the archive has been fetched at least once.\n    if (archiveCachePath) {\n      downloadedFile = await resolveFromArchiveCache(archiveCachePath, label, (config as any).checksums?.[label])\n    }\n\n    if (!downloadedFile) {\n      log.debug({ file: label }, \"downloading\")\n      downloadedFile = await downloadArtifactToFile(config, label)\n      if (!downloadedFile) {\n        throw new Error(`Failed to download artifact: ${label}`)\n      }\n      // Persist the downloaded archive so future builds (and offline environments) can\n      // skip the network request entirely.\n      if (archiveCachePath) {\n        await persistToArchiveCache(downloadedFile, archiveCachePath)\n      }\n    }\n\n    await writeCacheState(extractDir, CacheState.downloaded)\n\n    // Mark extracting so stale-lock detection can recover a crashed mid-extraction process\n    await writeCacheState(extractDir, CacheState.extracting)\n\n    // Extract while holding the lock to prevent concurrent interference\n    await extractArchive(downloadedFile, extractDir)\n\n    // Compute metadata with a full recursive walk now that tmpDir has been renamed to extractDir\n    const { fileCount, extractedSize } = await computeCacheMetadata(extractDir)\n\n    // Write complete state with metadata BEFORE releasing the lock; throwOnError=true so a\n    // failed write (disk full, permissions) propagates instead of silently producing a no-op cache\n    await writeCacheState(extractDir, CacheState.complete, { fileCount, extractedSize }, true)\n  } finally {\n    await release().catch(err => log.warn({ err }, \"failed to release lockfile\"))\n  }\n  return extractDir\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Downloads a generic artifact (.tar.gz or .zip) from a GitHub release.\n * Used for electron-builder-binaries tools (appimage, etc.).\n */\nexport async function downloadBuilderToolset(options: {\n  releaseName: string\n  filenameWithExt: string\n  checksums?: Record<string, string>\n  githubOrgRepo?: string\n  overrideUrl?: string\n}): Promise<string> {\n  const { releaseName, filenameWithExt, checksums, githubOrgRepo = \"electron-userland/electron-builder-binaries\", overrideUrl } = options\n\n  if (/[/\\\\]|\\.\\./.test(filenameWithExt)) {\n    throw new Error(`downloadBuilderToolset: unsafe filenameWithExt \"${filenameWithExt}\" — must be a plain filename with no path separators or traversal sequences`)\n  }\n\n  const baseUrl = getBinariesMirrorUrl(githubOrgRepo)\n  const fullUrl = overrideUrl ? `${overrideUrl}/${filenameWithExt}` : `${baseUrl}${releaseName}/${filenameWithExt}`\n  const suffix = hashUrlSafe(fullUrl, 5)\n  const folderName = `${filenameWithExt.replace(/\\.(tar\\.gz|tgz|tar\\.xz|txz|zip|7z)$/, \"\")}-${suffix}`\n  const extractDir = path.join(getCacheDirectory({ allowEnvVarOverride: true }), releaseName, folderName)\n\n  // Use resolveAssetURL so @electron/get's ELECTRON_MIRROR env var check cannot override\n  // the builder-binaries URL we've already resolved (see getArtifactRemoteURL in @electron/get).\n  const mirrorOptions: MirrorOptions = {\n    resolveAssetURL: async () => Promise.resolve(fullUrl),\n  }\n\n  // Predictable archive cache: <cacheDir>/<releaseName>/<filename>, next to the extract dir.\n  // downloadAndExtract checks here before touching @electron/get and persists the archive here\n  // after every successful download, so subsequent builds never need a network round-trip.\n  const archiveCachePath = path.join(getCacheDirectory({ allowEnvVarOverride: true }), releaseName, filenameWithExt)\n\n  const config: ElectronDownloadRequest & ElectronDownloadRequestOptions & { isGeneric: true } = {\n    version: \"9.9.9\", // must be >1.3.2 to bypass @electron/get validation shortcut\n    artifactName: filenameWithExt,\n    cacheRoot: path.resolve(getCacheDirectory({ allowEnvVarOverride: true }), \"downloads\"),\n    cacheMode: resolveCacheMode(),\n    ...(checksums != null ? { checksums } : { unsafelyDisableChecksums: true }),\n    mirrorOptions,\n    isGeneric: true,\n  }\n  return downloadAndExtract(config, extractDir, filenameWithExt, archiveCachePath)\n}\n\n// Keys present in ElectronGetOptions but absent from ElectronDownloadOptions.\n// Used to discriminate between the two config shapes at runtime.\nconst ELECTRON_GET_EXCLUSIVE_KEYS: readonly string[] = [\"mirrorOptions\", \"force\", \"unsafelyDisableChecksums\"]\n\nfunction isElectronGetOptions(dl: ElectronGetOptions | ElectronDownloadOptions): dl is ElectronGetOptions {\n  return ELECTRON_GET_EXCLUSIVE_KEYS.some(k => Object.hasOwnProperty.call(dl, k))\n}\n\n/**\n * Downloads and extracts an electron platform artifact (e.g. ffmpeg) using @electron/get.\n * Deduplicates concurrent calls for the same artifact within the same process.\n */\nfunction buildElectronArtifactConfig(options: ArtifactDownloadOptions): ElectronPlatformArtifactDetails {\n  const { electronDownload, arch, version, platformName: platform, artifactName, cacheDir: cacheRoot } = options\n\n  let artifactConfig: ElectronPlatformArtifactDetails = { cacheRoot, platform, arch, version, artifactName }\n\n  if (electronDownload != null) {\n    if (isElectronGetOptions(electronDownload)) {\n      const { mirrorOptions, ...rest } = electronDownload\n      artifactConfig = { ...artifactConfig, ...rest, cacheRoot, mirrorOptions }\n    } else {\n      const { mirror, customDir, cache, customFilename, isVerifyChecksum, strictSSL, platform: overridePlatform, arch: overrideArch } = electronDownload\n      // strictSSL: false disables TLS certificate validation for all\n      // electron/tool downloads.  This option exists only for air-gapped or\n      // self-signed-cert environments; ensure your build network is fully trusted.\n      if (strictSSL === false) {\n        log.warn(\n          { option: \"electronDownload.strictSSL\" },\n          \"strictSSL is false — TLS certificate validation is DISABLED for Electron downloads. Only use this option in a trusted, isolated build environment.\"\n        )\n      }\n      artifactConfig = {\n        ...artifactConfig,\n        unsafelyDisableChecksums: isVerifyChecksum === false,\n        cacheRoot: cache ?? cacheRoot,\n        mirrorOptions: {\n          mirror: mirror || undefined,\n          customDir: customDir || undefined,\n          customFilename: customFilename || undefined,\n        },\n        ...(strictSSL === false ? { downloadOptions: { https: { rejectUnauthorized: false } } } : {}),\n      }\n      if (overridePlatform != null) {\n        artifactConfig.platform = overridePlatform\n      }\n      if (overrideArch != null) {\n        artifactConfig.arch = overrideArch\n      }\n    }\n  }\n\n  artifactConfig.cacheMode = resolveCacheMode()\n  return artifactConfig\n}\n\n/**\n * Downloads the electron artifact zip via @electron/get (with caching) and returns the zip file path.\n * Use when you need to extract the zip yourself (e.g. directly to appOutDir to preserve empty dirs and symlinks).\n */\nexport function downloadElectronArtifactZip(options: ArtifactDownloadOptions): Promise<string> {\n  const config = buildElectronArtifactConfig(options)\n  return downloadArtifactToFile(config, config.artifactName)\n}\n\nexport async function downloadElectronArtifact(options: ArtifactDownloadOptions): Promise<string> {\n  const { arch, version, platformName: platform, artifactName } = options\n  const artifactConfig = buildElectronArtifactConfig(options)\n\n  const suffix = hashUrlSafe(JSON.stringify(artifactConfig), 5)\n  const folderName = `${artifactName}-v${version}-${platform}-${arch}-${suffix}`\n  const extractDir = path.join(getCacheDirectory({ allowEnvVarOverride: true }), `${artifactName}-v${version}`, folderName)\n\n  return downloadAndExtract(artifactConfig, extractDir, artifactName)\n}\n\n/**\n * Get the binaries mirror URL from environment variables.\n * Supports various npm config formats and falls back to GitHub.\n */\nexport function getBinariesMirrorUrl(githubOrgRepo: string): string {\n  const allowHttp = process.env[\"ELECTRON_BUILDER_BINARIES_ALLOW_HTTP\"] === \"true\"\n  for (const envVar of [\n    \"NPM_CONFIG_ELECTRON_BUILDER_BINARIES_MIRROR\",\n    \"npm_config_electron_builder_binaries_mirror\",\n    \"npm_package_config_electron_builder_binaries_mirror\",\n    \"ELECTRON_BUILDER_BINARIES_MIRROR\",\n  ]) {\n    const url = parseValidEnvVarUrl(envVar, allowHttp)\n    if (url) {\n      return url.endsWith(\"/\") ? url : `${url}/`\n    }\n  }\n  return `https://github.com/${githubOrgRepo}/releases/download/`\n}\n"]}