ваше сообщение коммита
This commit is contained in:
110
backend/utils/networkLoader.js
Normal file
110
backend/utils/networkLoader.js
Normal file
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* Утилита для загрузки поддерживаемых сетей из deploy_params
|
||||
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||||
*/
|
||||
|
||||
const DeployParamsService = require('../services/deployParamsService');
|
||||
|
||||
class NetworkLoader {
|
||||
constructor() {
|
||||
this.cache = new Map();
|
||||
this.cacheTimeout = 5 * 60 * 1000; // 5 минут
|
||||
this.fallbackChainIds = [11155111, 421614, 84532, 17000];
|
||||
}
|
||||
|
||||
/**
|
||||
* Общий метод для загрузки данных из deploy_params
|
||||
* @param {string} field - Поле для извлечения
|
||||
* @param {boolean} useCache - Использовать кеш
|
||||
* @returns {Promise<Array|Object>} - Данные из deploy_params
|
||||
*/
|
||||
async _loadFromDatabase(field, useCache = true) {
|
||||
const cacheKey = field;
|
||||
|
||||
// Проверяем кеш
|
||||
if (useCache && this.cache.has(cacheKey)) {
|
||||
const cached = this.cache.get(cacheKey);
|
||||
if (Date.now() - cached.timestamp < this.cacheTimeout) {
|
||||
console.log(`📋 Используем кешированные ${field}`);
|
||||
return cached.data;
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const deployParamsService = new DeployParamsService();
|
||||
const latestParams = await deployParamsService.getLatestDeployParams(1);
|
||||
await deployParamsService.close();
|
||||
|
||||
if (latestParams.length > 0) {
|
||||
const params = latestParams[0];
|
||||
let data;
|
||||
|
||||
switch (field) {
|
||||
case 'supportedChainIds':
|
||||
data = params.supportedChainIds || params.supported_chain_ids || [];
|
||||
break;
|
||||
case 'rpcUrls':
|
||||
data = params.rpcUrls || params.rpc_urls || {};
|
||||
break;
|
||||
default:
|
||||
data = params[field] || {};
|
||||
}
|
||||
|
||||
console.log(`✅ Загружены ${field} из deploy_params:`, Array.isArray(data) ? data : Object.keys(data));
|
||||
|
||||
// Кешируем результат
|
||||
this.cache.set(cacheKey, {
|
||||
data: data,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
// Если нет данных в deploy_params
|
||||
console.log(`⚠️ Нет ${field} в deploy_params`);
|
||||
return field === 'supportedChainIds' ? this.fallbackChainIds : {};
|
||||
} catch (error) {
|
||||
console.error(`❌ Ошибка загрузки ${field}:`, error.message);
|
||||
return field === 'supportedChainIds' ? this.fallbackChainIds : {};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить поддерживаемые сети из deploy_params
|
||||
* @param {boolean} useCache - Использовать кеш
|
||||
* @returns {Promise<Array>} - Массив chainId
|
||||
*/
|
||||
async getSupportedChainIds(useCache = true) {
|
||||
return await this._loadFromDatabase('supportedChainIds', useCache);
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить RPC URLs из deploy_params
|
||||
* @param {boolean} useCache - Использовать кеш
|
||||
* @returns {Promise<Object>} - Объект с RPC URLs
|
||||
*/
|
||||
async getRpcUrls(useCache = true) {
|
||||
return await this._loadFromDatabase('rpcUrls', useCache);
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить кеш
|
||||
*/
|
||||
clearCache() {
|
||||
this.cache.clear();
|
||||
console.log('🗑️ Кеш NetworkLoader очищен');
|
||||
}
|
||||
}
|
||||
|
||||
// Создаем singleton
|
||||
const networkLoader = new NetworkLoader();
|
||||
|
||||
module.exports = {
|
||||
NetworkLoader,
|
||||
networkLoader,
|
||||
// Экспортируем методы для удобства
|
||||
getSupportedChainIds: () => networkLoader.getSupportedChainIds(),
|
||||
getRpcUrls: () => networkLoader.getRpcUrls(),
|
||||
clearCache: () => networkLoader.clearCache()
|
||||
};
|
||||
Reference in New Issue
Block a user