161 lines
3.5 KiB
JavaScript
161 lines
3.5 KiB
JavaScript
import { getProxyPoolById } from "@/models";
|
|
|
|
// Safely normalize any value into a trimmed string.
|
|
function normalizeString(value) {
|
|
if (value === undefined || value === null) return "";
|
|
return String(value).trim();
|
|
}
|
|
|
|
/**
|
|
* Normalize legacy proxy configuration.
|
|
*/
|
|
function normalizeLegacyProxy(providerSpecificData = {}) {
|
|
const connectionProxyEnabled =
|
|
providerSpecificData?.connectionProxyEnabled === true;
|
|
|
|
const connectionProxyUrl = normalizeString(
|
|
providerSpecificData?.connectionProxyUrl
|
|
);
|
|
|
|
const connectionNoProxy = normalizeString(
|
|
providerSpecificData?.connectionNoProxy
|
|
);
|
|
|
|
return {
|
|
connectionProxyEnabled,
|
|
connectionProxyUrl,
|
|
connectionNoProxy,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Resolve final proxy configuration.
|
|
*
|
|
* Priority:
|
|
* 1. Proxy Pool
|
|
* 2. Legacy Proxy
|
|
* 3. No Proxy
|
|
*/
|
|
export async function resolveConnectionProxyConfig(
|
|
providerSpecificData = {}
|
|
) {
|
|
try {
|
|
const proxyPoolIdRaw = normalizeString(
|
|
providerSpecificData?.proxyPoolId
|
|
);
|
|
|
|
// "__none__" means explicitly disabled
|
|
const proxyPoolId =
|
|
proxyPoolIdRaw === "__none__" ? "" : proxyPoolIdRaw;
|
|
|
|
const legacy = normalizeLegacyProxy(providerSpecificData);
|
|
|
|
/**
|
|
* -----------------------------
|
|
* Proxy Pool Resolution
|
|
* -----------------------------
|
|
*/
|
|
if (proxyPoolId) {
|
|
const proxyPool = await getProxyPoolById(proxyPoolId);
|
|
|
|
const proxyUrl = normalizeString(proxyPool?.proxyUrl);
|
|
const noProxy = normalizeString(proxyPool?.noProxy);
|
|
|
|
const isValidPool =
|
|
proxyPool &&
|
|
proxyPool.isActive === true &&
|
|
proxyUrl;
|
|
|
|
if (isValidPool) {
|
|
/**
|
|
* Vercel/Cloudflare relay proxies use base URL rewriting
|
|
* instead of HTTP_PROXY environment variables.
|
|
*/
|
|
if (proxyPool.type === "vercel" || proxyPool.type === "cloudflare") {
|
|
return {
|
|
source: proxyPool.type,
|
|
|
|
proxyPoolId,
|
|
proxyPool,
|
|
|
|
connectionProxyEnabled: false,
|
|
connectionProxyUrl: "",
|
|
connectionNoProxy: noProxy,
|
|
|
|
strictProxy: proxyPool.strictProxy === true,
|
|
|
|
vercelRelayUrl: proxyUrl, // Still mapped to vercelRelayUrl in the unified payload since they use the exact same header spec
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Standard proxy pool
|
|
*/
|
|
return {
|
|
source: "pool",
|
|
|
|
proxyPoolId,
|
|
proxyPool,
|
|
|
|
connectionProxyEnabled: true,
|
|
connectionProxyUrl: proxyUrl,
|
|
connectionNoProxy: noProxy,
|
|
|
|
strictProxy: proxyPool.strictProxy === true,
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* -----------------------------
|
|
* Legacy Proxy Fallback
|
|
* -----------------------------
|
|
*/
|
|
if (
|
|
legacy.connectionProxyEnabled &&
|
|
legacy.connectionProxyUrl
|
|
) {
|
|
return {
|
|
source: "legacy",
|
|
|
|
proxyPoolId: proxyPoolId || null,
|
|
proxyPool: null,
|
|
|
|
...legacy,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* -----------------------------
|
|
* No Proxy Config
|
|
* -----------------------------
|
|
*/
|
|
return {
|
|
source: "none",
|
|
|
|
proxyPoolId: proxyPoolId || null,
|
|
proxyPool: null,
|
|
|
|
...legacy,
|
|
};
|
|
} catch (error) {
|
|
console.error(
|
|
"[resolveConnectionProxyConfig] Failed to resolve proxy config:",
|
|
error
|
|
);
|
|
|
|
return {
|
|
source: "error",
|
|
|
|
proxyPoolId: null,
|
|
proxyPool: null,
|
|
|
|
connectionProxyEnabled: false,
|
|
connectionProxyUrl: "",
|
|
connectionNoProxy: "",
|
|
|
|
strictProxy: false,
|
|
};
|
|
}
|
|
}
|