From 1f3d9e04204acdda4d540a6456ab1d002b5e2703 Mon Sep 17 00:00:00 2001 From: qianzhicheng95 Date: Thu, 2 Apr 2026 19:49:13 +0800 Subject: [PATCH] fix: use curl for binary download to support proxy and add npmmirror fallback (#226) Node.js https.get() does not honor https_proxy/HTTP_PROXY env vars, causing silent download failures behind firewalls. Switch to curl which natively supports proxy settings, and add npmmirror.com as a fallback mirror for regions where GitHub is slow or blocked. Change-Id: If9ace1e467e46f2a3009610a808bce8d78259e78 --- scripts/install.js | 55 +++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/scripts/install.js b/scripts/install.js index db0eb4ff..3393840f 100644 --- a/scripts/install.js +++ b/scripts/install.js @@ -1,6 +1,5 @@ const fs = require("fs"); const path = require("path"); -const https = require("https"); const { execSync } = require("child_process"); const os = require("os"); @@ -32,45 +31,34 @@ if (!platform || !arch) { const isWindows = process.platform === "win32"; const ext = isWindows ? ".zip" : ".tar.gz"; const archiveName = `${NAME}-${VERSION}-${platform}-${arch}${ext}`; -const url = `https://github.com/${REPO}/releases/download/v${VERSION}/${archiveName}`; +const GITHUB_URL = `https://github.com/${REPO}/releases/download/v${VERSION}/${archiveName}`; +const MIRROR_URL = `https://registry.npmmirror.com/-/binary/lark-cli/v${VERSION}/${archiveName}`; + const binDir = path.join(__dirname, "..", "bin"); const dest = path.join(binDir, NAME + (isWindows ? ".exe" : "")); fs.mkdirSync(binDir, { recursive: true }); function download(url, destPath) { - return new Promise((resolve, reject) => { - const client = url.startsWith("https") ? https : require("http"); - client - .get(url, (res) => { - if (res.statusCode === 302 || res.statusCode === 301) { - return download(res.headers.location, destPath).then( - resolve, - reject - ); - } - if (res.statusCode !== 200) { - return reject( - new Error(`Download failed with status ${res.statusCode}: ${url}`) - ); - } - const file = fs.createWriteStream(destPath); - res.pipe(file); - file.on("finish", () => { - file.close(); - resolve(); - }); - }) - .on("error", reject); - }); + // --ssl-revoke-best-effort: on Windows (Schannel), avoid CRYPT_E_REVOCATION_OFFLINE + // errors when the certificate revocation list server is unreachable + const sslFlag = isWindows ? "--ssl-revoke-best-effort " : ""; + execSync( + `curl ${sslFlag}--fail --location --silent --show-error --connect-timeout 10 --max-time 120 --output "${destPath}" "${url}"`, + { stdio: ["ignore", "ignore", "pipe"] } + ); } -async function install() { +function install() { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "lark-cli-")); const archivePath = path.join(tmpDir, archiveName); try { - await download(url, archivePath); + try { + download(GITHUB_URL, archivePath); + } catch (err) { + download(MIRROR_URL, archivePath); + } if (isWindows) { execSync( @@ -94,7 +82,14 @@ async function install() { } } -install().catch((err) => { +try { + install(); +} catch (err) { console.error(`Failed to install ${NAME}:`, err.message); + console.error( + `\nIf you are behind a firewall or in a restricted network, try setting a proxy:\n` + + ` export https_proxy=http://your-proxy:port\n` + + ` npm install -g @larksuite/cli` + ); process.exit(1); -}); +}