From cd2ef98e221089f715c0a6ffb13571e9c0170846 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sun, 8 Nov 2026 17:38:55 -0600 Subject: [PATCH] code split download client --- packages/scripts/src/downloadClient/index.ts | 122 +++---------------- packages/scripts/src/downloadClient/steam.ts | 57 +++++++++ packages/scripts/src/downloadClient/wgpkg.ts | 45 +++++++ packages/scripts/src/downloadClient/zip.ts | 13 ++ 4 files changed, 133 insertions(+), 104 deletions(-) create mode 100644 packages/scripts/src/downloadClient/steam.ts create mode 100644 packages/scripts/src/downloadClient/wgpkg.ts create mode 100644 packages/scripts/src/downloadClient/zip.ts diff --git a/packages/scripts/src/downloadClient/index.ts b/packages/scripts/src/downloadClient/index.ts index c9eb68b61..18787d63f 100644 --- a/packages/scripts/src/downloadClient/index.ts +++ b/packages/scripts/src/downloadClient/index.ts @@ -1,117 +1,31 @@ import { assertSecret } from "@blitzkit/core"; -import { $ } from "bun"; import { mkdir, rm } from "node:fs/promises"; -import { - DEPOT_DOWNLOADER_EXECUTABLE, - DEPOT_DOWNLOADER_MAX_DOWNLOADS, - DEPOT_DOWNLOADER_OUTPUT, - WGPKG_DIR, -} from "./constants"; -import { QuickGitHubRelease } from "./types"; +import { downloadSteamClient } from "./steam"; +import { downloadWGPKGClient } from "./wgpkg"; +import { downloadZipClient } from "./zip"; -const DEPOT_DOWNLOADER_RETRY_TIME = 30_000; +export const DEPOT_DOWNLOADER_RETRY_TIME = 30_000; const provider = assertSecret(import.meta.env.CLIENT_PROVIDER); -const source = assertSecret(import.meta.env.CLIENT_SOURCE); -const dir = assertSecret(import.meta.env.CLIENT_DIR); +export const source = assertSecret(import.meta.env.CLIENT_SOURCE); +export const dir = assertSecret(import.meta.env.CLIENT_DIR); await rm(dir, { recursive: true, force: true }); await mkdir(dir, { recursive: true }); -if (provider === "steam") { - const [id, platform] = source.split("/"); +switch (provider) { + case "steam": + await downloadSteamClient(); + break; - console.log("Downloading Depot Downloader..."); + case "zip": + await downloadZipClient(); + break; - const releases = await fetch( - "https://api.github.com/repos/SteamRE/DepotDownloader/releases/latest", - ).then((response) => response.json() as Promise); - const asset = releases.assets.find((asset) => - asset.name.includes("linux-x64"), - ); + case "wgpkg": + await downloadWGPKGClient(); + break; - if (!asset) { - throw new Error("No linux-x64 asset found for Steam DepotDownloader"); - } - - await rm(DEPOT_DOWNLOADER_OUTPUT, { recursive: true, force: true }); - - await $`curl -L "${asset.browser_download_url}" -o "${DEPOT_DOWNLOADER_OUTPUT}.zip"`; - await $`unzip "${DEPOT_DOWNLOADER_OUTPUT}.zip" -d "${DEPOT_DOWNLOADER_OUTPUT}"`; - await $`chmod +x "${DEPOT_DOWNLOADER_EXECUTABLE}"`; - - console.log("Downloading client..."); - - const username = assertSecret(import.meta.env.STEAM_USERNAME); - const password = assertSecret(import.meta.env.STEAM_PASSWORD); - - while (true) { - const result = await $`${ - DEPOT_DOWNLOADER_EXECUTABLE - } -os ${platform} -app ${id} -username ${ - username - } -password ${password} -dir ${dir} -max-downloads ${ - DEPOT_DOWNLOADER_MAX_DOWNLOADS - }`.nothrow(); - - if (result.exitCode === 0) { - console.log("Client downloaded successfully!"); - break; - } - - console.error( - `DepotDownloader failed (exit ${result.exitCode}). Retrying in ${DEPOT_DOWNLOADER_RETRY_TIME / 1000} seconds...`, - ); - await new Promise((resolve) => - setTimeout(resolve, DEPOT_DOWNLOADER_RETRY_TIME), - ); - } -} else if (provider === "zip") { - const url = assertSecret(import.meta.env.CLIENT_SOURCE); - - console.log("Downloading and extracting zipped client..."); - - await mkdir(dir, { recursive: true }); - await $`curl -L "${url}" | bsdtar -xf- --strip-components=1 -C ${dir}`; -} else if (provider === "wgpkg") { - let index = 1; - const urls: string[] = []; - - console.log("Discovering packages..."); - - while (true) { - const url = `${source}.${index.toString().padStart(3, "0")}`; - const response = await fetch(url); - - if (response.status === 200) { - urls.push(url); - } else if (response.status === 404) { - break; - } else { - throw new Error(`Wargaming response error status: ${response.status}`); - } - - index++; - } - - console.log(`Downloading ${urls.length} packages...`); - - await rm(WGPKG_DIR, { recursive: true, force: true }); - await mkdir(WGPKG_DIR, { recursive: true }); - - const inputContent = urls - .map((url) => { - const name = url.split("/").pop()!; - return `${url}\n out=${name}\n dir=${WGPKG_DIR}`; - }) - .join("\n"); - - await $`echo ${inputContent} | aria2c -j ${urls.length} -x 2 -s 2 -i -`; - - const firstChunk = `${WGPKG_DIR}/${urls[0].split("/").pop()!}`; - await $`7z x "${firstChunk}" -o${dir} -y`; - - await rm(WGPKG_DIR, { recursive: true }); -} else { - throw new Error(`Unknown provider: ${provider}`); + default: + throw new Error(`Unknown provider: ${provider}`); } diff --git a/packages/scripts/src/downloadClient/steam.ts b/packages/scripts/src/downloadClient/steam.ts new file mode 100644 index 000000000..0b58b921d --- /dev/null +++ b/packages/scripts/src/downloadClient/steam.ts @@ -0,0 +1,57 @@ +import { assertSecret } from "@blitzkit/core"; +import { $ } from "bun"; +import { rm } from "node:fs/promises"; +import { DEPOT_DOWNLOADER_RETRY_TIME, dir, source } from "."; +import { + DEPOT_DOWNLOADER_EXECUTABLE, + DEPOT_DOWNLOADER_MAX_DOWNLOADS, + DEPOT_DOWNLOADER_OUTPUT, +} from "./constants"; +import { QuickGitHubRelease } from "./types"; + +export async function downloadSteamClient() { + const [id, platform] = source.split("/"); + + console.log("Downloading Depot Downloader..."); + + const releases = await fetch( + "https://api.github.com/repos/SteamRE/DepotDownloader/releases/latest", + ).then((response) => response.json() as Promise); + const asset = releases.assets.find((asset) => + asset.name.includes("linux-x64"), + ); + + if (!asset) { + throw new Error("No linux-x64 asset found for Steam DepotDownloader"); + } + + await rm(DEPOT_DOWNLOADER_OUTPUT, { recursive: true, force: true }); + + await $`curl -L "${asset.browser_download_url}" -o "${DEPOT_DOWNLOADER_OUTPUT}.zip"`; + await $`unzip "${DEPOT_DOWNLOADER_OUTPUT}.zip" -d "${DEPOT_DOWNLOADER_OUTPUT}"`; + await $`chmod +x "${DEPOT_DOWNLOADER_EXECUTABLE}"`; + + console.log("Downloading client..."); + + const username = assertSecret(import.meta.env.STEAM_USERNAME); + const password = assertSecret(import.meta.env.STEAM_PASSWORD); + + while (true) { + const result = + await $`${DEPOT_DOWNLOADER_EXECUTABLE} -os ${platform} -app ${id} -username ${username} -password ${password} -dir ${dir} -max-downloads ${DEPOT_DOWNLOADER_MAX_DOWNLOADS}`.nothrow(); + + if (result.exitCode === 0) { + console.log("Client downloaded successfully!"); + break; + } + + console.error( + `DepotDownloader failed (exit ${result.exitCode}). Retrying in ${ + DEPOT_DOWNLOADER_RETRY_TIME / 1000 + } seconds...`, + ); + await new Promise((resolve) => + setTimeout(resolve, DEPOT_DOWNLOADER_RETRY_TIME), + ); + } +} diff --git a/packages/scripts/src/downloadClient/wgpkg.ts b/packages/scripts/src/downloadClient/wgpkg.ts new file mode 100644 index 000000000..c9f223e9b --- /dev/null +++ b/packages/scripts/src/downloadClient/wgpkg.ts @@ -0,0 +1,45 @@ +import { $ } from "bun"; +import { mkdir, rm } from "node:fs/promises"; +import { dir, source } from "."; +import { WGPKG_DIR } from "./constants"; + +export async function downloadWGPKGClient() { + let index = 1; + const urls: string[] = []; + + console.log("Discovering packages..."); + + while (true) { + const url = `${source}.${index.toString().padStart(3, "0")}`; + const response = await fetch(url); + + if (response.status === 200) { + urls.push(url); + } else if (response.status === 404) { + break; + } else { + throw new Error(`Wargaming response error status: ${response.status}`); + } + + index++; + } + + console.log(`Downloading ${urls.length} packages...`); + + await rm(WGPKG_DIR, { recursive: true, force: true }); + await mkdir(WGPKG_DIR, { recursive: true }); + + const inputContent = urls + .map((url) => { + const name = url.split("/").pop()!; + return `${url}\n out=${name}\n dir=${WGPKG_DIR}`; + }) + .join("\n"); + + await $`echo ${inputContent} | aria2c -j ${urls.length} -x 2 -s 2 -i -`; + + const firstChunk = `${WGPKG_DIR}/${urls[0].split("/").pop()!}`; + await $`7z x "${firstChunk}" -o${dir} -y`; + + await rm(WGPKG_DIR, { recursive: true }); +} diff --git a/packages/scripts/src/downloadClient/zip.ts b/packages/scripts/src/downloadClient/zip.ts new file mode 100644 index 000000000..8aed35271 --- /dev/null +++ b/packages/scripts/src/downloadClient/zip.ts @@ -0,0 +1,13 @@ +import { assertSecret } from "@blitzkit/core"; +import { $ } from "bun"; +import { mkdir } from "node:fs/promises"; +import { dir } from "."; + +export async function downloadZipClient() { + const url = assertSecret(import.meta.env.CLIENT_SOURCE); + + console.log("Downloading and extracting zipped client..."); + + await mkdir(dir, { recursive: true }); + await $`curl -L "${url}" | bsdtar -xf- --strip-components=1 -C ${dir}`; +}