106 lines
3.6 KiB
JavaScript
106 lines
3.6 KiB
JavaScript
/**
|
||
* Менеджер прокси настроек для RPC провайдеров
|
||
* Copyright (c) 2024-2026 Тарабанов Александр Викторович
|
||
*/
|
||
|
||
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()
|
||
};
|