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 committed 2026-01-02 20:06:17 -05:00
1 parent a00cf3691e
commit a59ad0e8c6
3 files changed
+14 -7

No files matched your search

+1 -1
View File
@@ -105,7 +105,7 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [
baseUrl: 'https://api.minimax.io/anthropic', baseUrl: 'https://api.minimax.io/anthropic',
defaultProfileName: 'mm', defaultProfileName: 'mm',
defaultModel: 'MiniMax-M2.1', defaultModel: 'MiniMax-M2.1',
apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY', apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY_HERE',
apiKeyHint: 'Get your API key at platform.minimax.io', apiKeyHint: 'Get your API key at platform.minimax.io',
category: 'alternative', category: 'alternative',
}, },
+12 -5
View File
@@ -64,6 +64,13 @@ async function validateProviderKey(
} }
return new Promise((resolve) => { return new Promise((resolve) => {
let resolved = false;
const safeResolve = (result: ValidationResult) => {
if (resolved) return;
resolved = true;
resolve(result);
};
const isHttps = url.protocol === 'https:'; const isHttps = url.protocol === 'https:';
const httpModule = isHttps ? https : http; const httpModule = isHttps ? https : http;
const defaultPort = isHttps ? 443 : 80; const defaultPort = isHttps ? 443 : 80;
@@ -83,9 +90,9 @@ async function validateProviderKey(
clearTimeout(timeoutId); clearTimeout(timeoutId);
if (res.statusCode === 200) { if (res.statusCode === 200) {
resolve({ valid: true }); safeResolve({ valid: true });
} else if (res.statusCode === 401 || res.statusCode === 403) { } else if (res.statusCode === 401 || res.statusCode === 403) {
resolve({ safeResolve({
valid: false, valid: false,
error: `API key rejected by ${config.displayName}`, error: `API key rejected by ${config.displayName}`,
suggestion: suggestion:
@@ -100,7 +107,7 @@ async function validateProviderKey(
`[CCS-Preflight] Unexpected status ${res.statusCode} from ${url.href} - fail-open` `[CCS-Preflight] Unexpected status ${res.statusCode} from ${url.href} - fail-open`
); );
} }
resolve({ valid: true }); safeResolve({ valid: true });
} }
res.resume(); res.resume();
@@ -108,12 +115,12 @@ async function validateProviderKey(
req.on('error', () => { req.on('error', () => {
clearTimeout(timeoutId); clearTimeout(timeoutId);
resolve({ valid: true }); safeResolve({ valid: true });
}); });
const timeoutId = setTimeout(() => { const timeoutId = setTimeout(() => {
req.destroy(); req.destroy();
resolve({ valid: true }); safeResolve({ valid: true });
}, timeoutMs); }, timeoutMs);
req.end(); req.end();
+1 -1
View File
@@ -106,7 +106,7 @@ export const PROVIDER_PRESETS: ProviderPreset[] = [
badge: '1M context', badge: '1M context',
defaultModel: 'MiniMax-M2.1', defaultModel: 'MiniMax-M2.1',
requiresApiKey: true, requiresApiKey: true,
apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY', apiKeyPlaceholder: 'YOUR_MINIMAX_API_KEY_HERE',
apiKeyHint: 'Get your API key at platform.minimax.io', apiKeyHint: 'Get your API key at platform.minimax.io',
category: 'alternative', category: 'alternative',
}, },