Spaces:
Running
Running
File size: 3,950 Bytes
ceb3821 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | /**
* 代理工具模块
* 支持 HTTP、HTTPS 和 SOCKS5 代理
*/
import { HttpsProxyAgent } from 'https-proxy-agent';
import { HttpProxyAgent } from 'http-proxy-agent';
import { SocksProxyAgent } from 'socks-proxy-agent';
/**
* 解析代理URL并返回相应的代理配置
* @param {string} proxyUrl - 代理URL,如 http://127.0.0.1:7890 或 socks5://127.0.0.1:1080
* @returns {Object|null} 代理配置对象,包含 httpAgent 和 httpsAgent
*/
export function parseProxyUrl(proxyUrl) {
if (!proxyUrl || typeof proxyUrl !== 'string') {
return null;
}
const trimmedUrl = proxyUrl.trim();
if (!trimmedUrl) {
return null;
}
try {
const url = new URL(trimmedUrl);
const protocol = url.protocol.toLowerCase();
if (protocol === 'socks5:' || protocol === 'socks4:' || protocol === 'socks:') {
// SOCKS 代理
const socksAgent = new SocksProxyAgent(trimmedUrl);
return {
httpAgent: socksAgent,
httpsAgent: socksAgent,
proxyType: 'socks'
};
} else if (protocol === 'http:' || protocol === 'https:') {
// HTTP/HTTPS 代理
return {
httpAgent: new HttpProxyAgent(trimmedUrl),
httpsAgent: new HttpsProxyAgent(trimmedUrl),
proxyType: 'http'
};
} else {
console.warn(`[Proxy] Unsupported proxy protocol: ${protocol}`);
return null;
}
} catch (error) {
console.error(`[Proxy] Failed to parse proxy URL: ${error.message}`);
return null;
}
}
/**
* 检查指定的提供商是否启用了代理
* @param {Object} config - 配置对象
* @param {string} providerType - 提供商类型
* @returns {boolean} 是否启用代理
*/
export function isProxyEnabledForProvider(config, providerType) {
if (!config || !config.PROXY_URL || !config.PROXY_ENABLED_PROVIDERS) {
return false;
}
const enabledProviders = config.PROXY_ENABLED_PROVIDERS;
if (!Array.isArray(enabledProviders)) {
return false;
}
return enabledProviders.includes(providerType);
}
/**
* 获取指定提供商的代理配置
* @param {Object} config - 配置对象
* @param {string} providerType - 提供商类型
* @returns {Object|null} 代理配置对象或 null
*/
export function getProxyConfigForProvider(config, providerType) {
if (!isProxyEnabledForProvider(config, providerType)) {
return null;
}
const proxyConfig = parseProxyUrl(config.PROXY_URL);
if (proxyConfig) {
console.log(`[Proxy] Using ${proxyConfig.proxyType} proxy for ${providerType}: ${config.PROXY_URL}`);
}
return proxyConfig;
}
/**
* 为 axios 配置代理
* @param {Object} axiosConfig - axios 配置对象
* @param {Object} config - 应用配置对象
* @param {string} providerType - 提供商类型
* @returns {Object} 更新后的 axios 配置
*/
export function configureAxiosProxy(axiosConfig, config, providerType) {
const proxyConfig = getProxyConfigForProvider(config, providerType);
if (proxyConfig) {
// 使用代理 agent
axiosConfig.httpAgent = proxyConfig.httpAgent;
axiosConfig.httpsAgent = proxyConfig.httpsAgent;
// 禁用 axios 内置的代理配置,使用我们的 agent
axiosConfig.proxy = false;
}
return axiosConfig;
}
/**
* 为 google-auth-library 配置代理
* @param {Object} config - 应用配置对象
* @param {string} providerType - 提供商类型
* @returns {Object|null} transporter 配置对象或 null
*/
export function getGoogleAuthProxyConfig(config, providerType) {
const proxyConfig = getProxyConfigForProvider(config, providerType);
if (proxyConfig) {
return {
agent: proxyConfig.httpsAgent
};
}
return null;
}
|