From 1e78dfc0e55765ff0999b09b82f2781856f13902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sat, 14 Mar 2026 23:00:15 +0900 Subject: [PATCH 1/2] fix(runtime): avoid unsupported Windows runtime arch throws --- scripts/backend/runtime-arch-utils.mjs | 16 +++++++++++++++- scripts/backend/runtime-arch-utils.test.mjs | 11 +++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/scripts/backend/runtime-arch-utils.mjs b/scripts/backend/runtime-arch-utils.mjs index b52ddc9..82e970c 100644 --- a/scripts/backend/runtime-arch-utils.mjs +++ b/scripts/backend/runtime-arch-utils.mjs @@ -61,4 +61,18 @@ export const isWindowsArm64BundledRuntime = ({ platform = process.platform, arch = process.arch, env = process.env, -} = {}) => platform === 'win32' && resolveBundledRuntimeArch({ platform, arch, env }) === 'arm64'; +} = {}) => { + if (platform !== 'win32') { + return false; + } + + const hasBundledRuntimeOverride = + env[BUNDLED_RUNTIME_ARCH_ENV] !== undefined && String(env[BUNDLED_RUNTIME_ARCH_ENV]).trim(); + const hasTargetArchOverride = + env[DESKTOP_TARGET_ARCH_ENV] !== undefined && String(env[DESKTOP_TARGET_ARCH_ENV]).trim(); + if (!hasBundledRuntimeOverride && !hasTargetArchOverride && !PROCESS_ARCH_MAP[arch]) { + return false; + } + + return resolveBundledRuntimeArch({ platform, arch, env }) === 'arm64'; +}; diff --git a/scripts/backend/runtime-arch-utils.test.mjs b/scripts/backend/runtime-arch-utils.test.mjs index 86eaa36..fba3bae 100644 --- a/scripts/backend/runtime-arch-utils.test.mjs +++ b/scripts/backend/runtime-arch-utils.test.mjs @@ -55,3 +55,14 @@ test('isWindowsArm64BundledRuntime uses explicit bundled runtime arch handoff', false, ); }); + +test('isWindowsArm64BundledRuntime returns false for unsupported Windows host arch', () => { + assert.equal( + isWindowsArm64BundledRuntime({ + platform: 'win32', + arch: 'ia32', + env: {}, + }), + false, + ); +}); From 865e76b8a2064f3eeee9bebe898d94757102f673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=B0=B8=E8=B5=AB?= <1259085392@qq.com> Date: Sat, 14 Mar 2026 23:06:06 +0900 Subject: [PATCH 2/2] refactor(runtime): extract runtime arch override helper --- scripts/backend/runtime-arch-utils.mjs | 18 ++++++++++-------- scripts/backend/runtime-arch-utils.test.mjs | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/scripts/backend/runtime-arch-utils.mjs b/scripts/backend/runtime-arch-utils.mjs index 82e970c..cb2088f 100644 --- a/scripts/backend/runtime-arch-utils.mjs +++ b/scripts/backend/runtime-arch-utils.mjs @@ -7,6 +7,12 @@ const PROCESS_ARCH_MAP = { arm64: 'arm64', }; +const hasNonEmptyEnvOverride = (env, key) => Boolean(String(env[key] ?? '').trim()); + +export const hasRuntimeArchOverride = (env = process.env) => + hasNonEmptyEnvOverride(env, BUNDLED_RUNTIME_ARCH_ENV) || + hasNonEmptyEnvOverride(env, DESKTOP_TARGET_ARCH_ENV); + export const normalizeDesktopArch = (rawArch, sourceName) => { const raw = String(rawArch ?? '').trim().toLowerCase(); if (raw === 'amd64' || raw === 'x64') { @@ -22,7 +28,7 @@ export const normalizeDesktopArch = (rawArch, sourceName) => { export const resolveDesktopTargetArch = ({ arch = process.arch, env = process.env } = {}) => { const overrideRaw = env[DESKTOP_TARGET_ARCH_ENV]; - if (overrideRaw !== undefined && String(overrideRaw).trim()) { + if (hasNonEmptyEnvOverride(env, DESKTOP_TARGET_ARCH_ENV)) { return normalizeDesktopArch(overrideRaw, DESKTOP_TARGET_ARCH_ENV); } @@ -40,7 +46,7 @@ export const resolveBundledRuntimeArch = ({ env = process.env, } = {}) => { const explicitBundledRuntimeArch = env[BUNDLED_RUNTIME_ARCH_ENV]; - if (explicitBundledRuntimeArch !== undefined && String(explicitBundledRuntimeArch).trim()) { + if (hasNonEmptyEnvOverride(env, BUNDLED_RUNTIME_ARCH_ENV)) { return normalizeDesktopArch(explicitBundledRuntimeArch, BUNDLED_RUNTIME_ARCH_ENV); } @@ -50,7 +56,7 @@ export const resolveBundledRuntimeArch = ({ } const windowsArmBackendArch = env[WINDOWS_ARM_BACKEND_ARCH_ENV]; - if (windowsArmBackendArch === undefined || !String(windowsArmBackendArch).trim()) { + if (!hasNonEmptyEnvOverride(env, WINDOWS_ARM_BACKEND_ARCH_ENV)) { return 'amd64'; } @@ -66,11 +72,7 @@ export const isWindowsArm64BundledRuntime = ({ return false; } - const hasBundledRuntimeOverride = - env[BUNDLED_RUNTIME_ARCH_ENV] !== undefined && String(env[BUNDLED_RUNTIME_ARCH_ENV]).trim(); - const hasTargetArchOverride = - env[DESKTOP_TARGET_ARCH_ENV] !== undefined && String(env[DESKTOP_TARGET_ARCH_ENV]).trim(); - if (!hasBundledRuntimeOverride && !hasTargetArchOverride && !PROCESS_ARCH_MAP[arch]) { + if (!hasRuntimeArchOverride(env) && !PROCESS_ARCH_MAP[arch]) { return false; } diff --git a/scripts/backend/runtime-arch-utils.test.mjs b/scripts/backend/runtime-arch-utils.test.mjs index fba3bae..f32bcdc 100644 --- a/scripts/backend/runtime-arch-utils.test.mjs +++ b/scripts/backend/runtime-arch-utils.test.mjs @@ -1,6 +1,7 @@ import assert from 'node:assert/strict'; import { test } from 'node:test'; +import * as runtimeArchUtils from './runtime-arch-utils.mjs'; import { isWindowsArm64BundledRuntime, resolveBundledRuntimeArch, @@ -66,3 +67,23 @@ test('isWindowsArm64BundledRuntime returns false for unsupported Windows host ar false, ); }); + +test('hasRuntimeArchOverride returns booleans for recognized override env vars', () => { + assert.equal(typeof runtimeArchUtils.hasRuntimeArchOverride, 'function'); + assert.equal(runtimeArchUtils.hasRuntimeArchOverride({}), false); + assert.equal( + runtimeArchUtils.hasRuntimeArchOverride({ + ASTRBOT_DESKTOP_BUNDLED_RUNTIME_ARCH: ' ', + ASTRBOT_DESKTOP_TARGET_ARCH: ' ', + }), + false, + ); + assert.equal( + runtimeArchUtils.hasRuntimeArchOverride({ ASTRBOT_DESKTOP_BUNDLED_RUNTIME_ARCH: 'arm64' }), + true, + ); + assert.equal( + runtimeArchUtils.hasRuntimeArchOverride({ ASTRBOT_DESKTOP_TARGET_ARCH: 'arm64' }), + true, + ); +});