fix(cliproxy): correct ARM release asset architecture boundaries (#1725)

This commit is contained in:
Tam Nhu Tran committed 2026-09-02 11:14:57 -04:00
1 parent 3658c01137
commit 87f1d9b4e8
2 files changed
+77 -4

No files matched your search

+5 -3
View File
@@ -84,7 +84,10 @@ const RELEASE_ARCH_MAP: Record<SupportedArch, SupportedArch> = {
};
const PLUS_NO_PLUGIN_ASSET_MIN_VERSION = '7.1.68-0';
const PLUS_AARCH64_ASSET_MIN_VERSION = '7.1.45-1';
const AARCH64_ASSET_MIN_VERSION: Readonly<Record<CLIProxyBackend, string>> = {
original: '6.9.48',
plus: '6.10.0-0',
};
export function mapNodeArchToReleaseArch(nodeArch: string): SupportedArch | undefined {
const arch = ARCH_MAP[nodeArch];
@@ -122,9 +125,8 @@ function getReleaseArchForBackend(
releaseArch: SupportedArch
): SupportedArch {
if (
backend === 'plus' &&
publicArch === 'arm64' &&
!isAtLeastVersion(version, PLUS_AARCH64_ASSET_MIN_VERSION)
!isAtLeastVersion(version, AARCH64_ASSET_MIN_VERSION[backend])
) {
return 'arm64';
}
@@ -86,13 +86,84 @@ describe('Backend Selection', () => {
);
});
});
it('generates correct binary name for original backend', () => {
const info = platformDetector.detectPlatform('6.6.51', 'original');
assert(info.binaryName.startsWith('CLIProxyAPI_6.6.51_'));
assert(!info.binaryName.includes('CLIProxyAPIPlus'));
});
it('selects arm64 vs aarch64 release assets across original and plus boundaries', () => {
// Original pre-rename boundaries (<= 6.9.47) use arm64
for (const version of [undefined, '6.9.45', '6.9.47']) {
const effectiveVersion = version || platformDetector.BACKEND_CONFIG.original.fallbackVersion;
withMockedProcessPlatform('darwin', 'arm64', () => {
const info = platformDetector.detectPlatform(version, 'original');
assert.strictEqual(info.arch, 'arm64');
assert.strictEqual(info.binaryName, `CLIProxyAPI_${effectiveVersion}_darwin_arm64.tar.gz`);
assert.strictEqual(
platformDetector.getDownloadUrl(version, 'original'),
`https://github.com/router-for-me/CLIProxyAPI/releases/download/v${effectiveVersion}/CLIProxyAPI_${effectiveVersion}_darwin_arm64.tar.gz`
);
});
withMockedProcessPlatform('linux', 'arm64', () => {
const info = platformDetector.detectPlatform(version, 'original');
assert.strictEqual(info.arch, 'arm64');
assert.strictEqual(info.binaryName, `CLIProxyAPI_${effectiveVersion}_linux_arm64.tar.gz`);
assert.strictEqual(
platformDetector.getDownloadUrl(version, 'original'),
`https://github.com/router-for-me/CLIProxyAPI/releases/download/v${effectiveVersion}/CLIProxyAPI_${effectiveVersion}_linux_arm64.tar.gz`
);
});
withMockedProcessPlatform('win32', 'arm64', () => {
const info = platformDetector.detectPlatform(version, 'original');
assert.strictEqual(info.arch, 'arm64');
assert.strictEqual(info.binaryName, `CLIProxyAPI_${effectiveVersion}_windows_arm64.zip`);
assert.strictEqual(
platformDetector.getDownloadUrl(version, 'original'),
`https://github.com/router-for-me/CLIProxyAPI/releases/download/v${effectiveVersion}/CLIProxyAPI_${effectiveVersion}_windows_arm64.zip`
);
});
}
// Original post-rename boundary (>= 6.9.48) uses aarch64 while public arch remains arm64
withMockedProcessPlatform('darwin', 'arm64', () => {
const info = platformDetector.detectPlatform('6.9.48', 'original');
assert.strictEqual(info.arch, 'arm64');
assert.strictEqual(info.binaryName, 'CLIProxyAPI_6.9.48_darwin_aarch64.tar.gz');
assert.strictEqual(
platformDetector.getDownloadUrl('6.9.48', 'original'),
'https://github.com/router-for-me/CLIProxyAPI/releases/download/v6.9.48/CLIProxyAPI_6.9.48_darwin_aarch64.tar.gz'
);
});
// Plus fallback / pre-rename (< 6.10.0-0) uses arm64
withMockedProcessPlatform('darwin', 'arm64', () => {
const info = platformDetector.detectPlatform('6.9.45-0', 'plus');
assert.strictEqual(info.arch, 'arm64');
assert.strictEqual(info.binaryName, 'CLIProxyAPIPlus_6.9.45-0_darwin_arm64.tar.gz');
});
// Plus post-rename (>= 6.10.0-0) uses aarch64
withMockedProcessPlatform('darwin', 'arm64', () => {
const info = platformDetector.detectPlatform('6.10.0-0', 'plus');
assert.strictEqual(info.arch, 'arm64');
assert.strictEqual(info.binaryName, 'CLIProxyAPIPlus_6.10.0-0_darwin_aarch64.tar.gz');
});
// x64 remains amd64 for both backends
withMockedProcessPlatform('linux', 'x64', () => {
assert.strictEqual(
platformDetector.detectPlatform('6.9.45', 'original').binaryName,
'CLIProxyAPI_6.9.45_linux_amd64.tar.gz'
);
assert.strictEqual(
platformDetector.detectPlatform('6.9.45-0', 'plus').binaryName,
'CLIProxyAPIPlus_6.9.45-0_linux_amd64.tar.gz'
);
});
});
it('uses static no-plugin assets when the integrated Linux image opts in', () => {
withEnvironmentVariable('CCS_CLIPROXY_NO_PLUGIN_ASSET', '1', () => {
withMockedProcessPlatform('linux', 'x64', () => {