feat: новая функция
This commit is contained in:
105
backend/utils/proxyManager.js
Normal file
105
backend/utils/proxyManager.js
Normal file
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* Менеджер прокси настроек для RPC провайдеров
|
||||
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||||
*/
|
||||
|
||||
const rpcProviderService = require('../services/rpcProviderService');
|
||||
|
||||
class ProxyManager {
|
||||
constructor() {
|
||||
this.initialized = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Инициализация менеджера прокси
|
||||
*/
|
||||
async initialize() {
|
||||
if (this.initialized) return;
|
||||
|
||||
try {
|
||||
await this.configureNoProxyFromRpcProviders();
|
||||
this.initialized = true;
|
||||
console.log('[ProxyManager] ✅ Инициализация завершена');
|
||||
} catch (error) {
|
||||
console.error('[ProxyManager] ❌ Ошибка инициализации:', error.message);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Настройка NO_PROXY на основе RPC провайдеров из базы данных
|
||||
*/
|
||||
async configureNoProxyFromRpcProviders() {
|
||||
try {
|
||||
const providers = await rpcProviderService.getAllRpcProviders();
|
||||
|
||||
const rpcDomains = providers
|
||||
.map(provider => provider.rpc_url)
|
||||
.filter(url => url && url.startsWith('http'))
|
||||
.map(url => {
|
||||
try {
|
||||
const urlObj = new URL(url);
|
||||
return urlObj.hostname;
|
||||
} catch (e) {
|
||||
console.warn(`[ProxyManager] Неверный URL: ${url}`, e.message);
|
||||
return null;
|
||||
}
|
||||
})
|
||||
.filter(hostname => hostname)
|
||||
.filter((hostname, index, array) => array.indexOf(hostname) === index); // убираем дубликаты
|
||||
|
||||
if (rpcDomains.length > 0) {
|
||||
const existingNoProxy = process.env.NO_PROXY || '';
|
||||
|
||||
// Добавляем RPC домены к существующему NO_PROXY
|
||||
const newDomains = rpcDomains.filter(domain => !existingNoProxy.includes(domain));
|
||||
|
||||
if (newDomains.length > 0) {
|
||||
process.env.NO_PROXY = existingNoProxy ? `${existingNoProxy},${newDomains.join(',')}` : newDomains.join(',');
|
||||
console.log('[ProxyManager] ✅ Добавлены RPC домены в NO_PROXY:', newDomains.join(', '));
|
||||
console.log('[ProxyManager] 📋 Обновленный NO_PROXY:', process.env.NO_PROXY);
|
||||
} else {
|
||||
console.log('[ProxyManager] ℹ️ Все RPC домены уже в NO_PROXY');
|
||||
}
|
||||
} else {
|
||||
console.warn('[ProxyManager] ⚠️ Не найдено RPC провайдеров для настройки NO_PROXY');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[ProxyManager] ❌ Не удалось загрузить RPC провайдеры для NO_PROXY:', error.message);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверить текущие настройки прокси
|
||||
*/
|
||||
getProxyStatus() {
|
||||
return {
|
||||
httpProxy: process.env.HTTP_PROXY || null,
|
||||
httpsProxy: process.env.HTTPS_PROXY || null,
|
||||
noProxy: process.env.NO_PROXY || null,
|
||||
initialized: this.initialized
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Принудительно обновить настройки NO_PROXY
|
||||
*/
|
||||
async refresh() {
|
||||
this.initialized = false;
|
||||
await this.initialize();
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем singleton
|
||||
const proxyManager = new ProxyManager();
|
||||
|
||||
module.exports = {
|
||||
ProxyManager,
|
||||
proxyManager,
|
||||
// Экспортируем методы для удобства
|
||||
initialize: () => proxyManager.initialize(),
|
||||
configureNoProxyFromRpcProviders: () => proxyManager.configureNoProxyFromRpcProviders(),
|
||||
getProxyStatus: () => proxyManager.getProxyStatus(),
|
||||
refresh: () => proxyManager.refresh()
|
||||
};
|
||||
Reference in New Issue
Block a user