fix(minimax): prevent double-resolve race condition and align placeholder

- Add resolved flag + safeResolve() wrapper to prevent timeout/response race
- Align apiKeyPlaceholder to YOUR_MINIMAX_API_KEY_HERE across presets
This commit is contained in:
kaitranntt
2026-01-02 20:06:17 -05:00
parent a00cf3691e
commit a59ad0e8c6
3 changed files with 14 additions and 7 deletions
+1 -1
View File
@@ -105,7 +105,7 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [
baseUrl: 'https://api.minimax.io/anthropic',
defaultProfileName: 'mm',
defaultModel: 'MiniMax-M2.1',
apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY',
apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY_HERE',
apiKeyHint: 'Get your API key at platform.minimax.io',
category: 'alternative',
},
+12 -5
View File
@@ -64,6 +64,13 @@ async function validateProviderKey(
}
return new Promise((resolve) => {
let resolved = false;
const safeResolve = (result: ValidationResult) => {
if (resolved) return;
resolved = true;
resolve(result);
};
const isHttps = url.protocol === 'https:';
const httpModule = isHttps ? https : http;
const defaultPort = isHttps ? 443 : 80;
@@ -83,9 +90,9 @@ async function validateProviderKey(
clearTimeout(timeoutId);
if (res.statusCode === 200) {
resolve({ valid: true });
safeResolve({ valid: true });
} else if (res.statusCode === 401 || res.statusCode === 403) {
resolve({
safeResolve({
valid: false,
error: `API key rejected by ${config.displayName}`,
suggestion:
@@ -100,7 +107,7 @@ async function validateProviderKey(
`[CCS-Preflight] Unexpected status ${res.statusCode} from ${url.href} - fail-open`
);
}
resolve({ valid: true });
safeResolve({ valid: true });
}
res.resume();
@@ -108,12 +115,12 @@ async function validateProviderKey(
req.on('error', () => {
clearTimeout(timeoutId);
resolve({ valid: true });
safeResolve({ valid: true });
});
const timeoutId = setTimeout(() => {
req.destroy();
resolve({ valid: true });
safeResolve({ valid: true });
}, timeoutMs);
req.end();
+1 -1
View File
@@ -106,7 +106,7 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [
badge: '1M context',
defaultModel: 'MiniMax-M2.1',
requiresApiKey: true,
apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY',
apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY_HERE',
apiKeyHint: 'Get your API key at platform.minimax.io',
category: 'alternative',
},