UNPKG

userface

Version:

Universal Data-Driven UI Engine with live data, validation, and multi-platform support

188 lines (187 loc) 7.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AdapterManager = void 0; const logger_1 = require("./logger"); // Менеджер адаптеров рендереров class AdapterManager { constructor() { // Адаптеры рендереров Object.defineProperty(this, "adapters", { enumerable: true, configurable: true, writable: true, value: new Map() }); // Статистика адаптеров Object.defineProperty(this, "stats", { enumerable: true, configurable: true, writable: true, value: { totalAdapters: 0, activeAdapters: 0, errors: 0 } }); } // === РЕГИСТРАЦИЯ АДАПТЕРОВ === registerAdapter(adapter) { try { if (!adapter || !adapter.id) { throw new Error('Invalid adapter: missing id'); } this.adapters.set(adapter.id, adapter); this.stats.totalAdapters = this.adapters.size; this.stats.activeAdapters++; logger_1.logger.info(`Registered adapter: ${adapter.id}`, 'AdapterManager', { id: adapter.id, platform: adapter.meta?.platform }); } catch (error) { this.stats.errors++; logger_1.logger.error(`Failed to register adapter`, 'AdapterManager', error, { adapter }); } } reinstallAdapter(adapter) { try { if (!adapter || !adapter.id) { throw new Error('Invalid adapter: missing id'); } const existing = this.adapters.get(adapter.id); if (existing) { logger_1.logger.info(`Reinstalling adapter: ${adapter.id}`, 'AdapterManager', { id: adapter.id }); } this.adapters.set(adapter.id, adapter); logger_1.logger.info(`Reinstalled adapter: ${adapter.id}`, 'AdapterManager', { id: adapter.id }); } catch (error) { this.stats.errors++; logger_1.logger.error(`Failed to reinstall adapter`, 'AdapterManager', error, { adapter }); } } // === ПОЛУЧЕНИЕ АДАПТЕРОВ === getAdapter(adapterId) { const adapter = this.adapters.get(adapterId); if (adapter) { logger_1.logger.debug(`Retrieved adapter: ${adapterId}`, 'AdapterManager'); } else { logger_1.logger.debug(`Adapter not found: ${adapterId}`, 'AdapterManager'); } return adapter; } getAllAdapters() { const adapters = Array.from(this.adapters.values()); logger_1.logger.debug(`Retrieved all adapters: ${adapters.length}`, 'AdapterManager'); return adapters; } getAdaptersByPlatform(targetPlatform) { const adapters = Array.from(this.adapters.values()).filter(adapter => adapter.meta?.platform === targetPlatform); logger_1.logger.debug(`Retrieved adapters for platform ${targetPlatform}: ${adapters.length}`, 'AdapterManager'); return adapters; } hasAdapter(adapterId) { return this.adapters.has(adapterId); } // === РЕНДЕРИНГ === renderWithAdapter(spec, adapterId) { try { const adapter = this.getAdapter(adapterId); if (!adapter) { throw new Error(`Adapter not found: ${adapterId}`); } if (!adapter.render) { throw new Error(`Adapter ${adapterId} has no render method`); } logger_1.logger.info(`Rendering with adapter: ${adapterId}`, 'AdapterManager', { adapterId }); const result = adapter.render(spec); logger_1.logger.info(`Rendered successfully with adapter: ${adapterId}`, 'AdapterManager', { adapterId }); return result; } catch (error) { this.stats.errors++; logger_1.logger.error(`Failed to render with adapter: ${adapterId}`, 'AdapterManager', error, { adapterId }); throw error; } } renderWithAllAdapters(spec) { const results = {}; const errors = {}; logger_1.logger.info(`Rendering with all adapters: ${this.adapters.size}`, 'AdapterManager'); for (const [adapterId, adapter] of this.adapters) { try { if (adapter.render) { results[adapterId] = adapter.render(spec); logger_1.logger.debug(`Rendered with adapter: ${adapterId}`, 'AdapterManager'); } else { errors[adapterId] = 'No render method'; logger_1.logger.warn(`Adapter ${adapterId} has no render method`, 'AdapterManager'); } } catch (error) { errors[adapterId] = error.message; this.stats.errors++; logger_1.logger.error(`Failed to render with adapter: ${adapterId}`, 'AdapterManager', error); } } logger_1.logger.info(`Rendered with all adapters: ${Object.keys(results).length} success, ${Object.keys(errors).length} errors`, 'AdapterManager', { successCount: Object.keys(results).length, errorCount: Object.keys(errors).length }); return results; } // === ВАЛИДАЦИЯ === validateAdapter(adapter) { const issues = []; // Проверяем обязательные поля if (!adapter.id) { issues.push('Missing adapter id'); } if (!adapter.render) { issues.push('Missing render method'); } if (!adapter.meta) { issues.push('Missing meta information'); } if (!adapter.meta?.platform) { issues.push('Missing platform in meta'); } const isValid = issues.length === 0; logger_1.logger.debug(`Validated adapter: ${adapter.id}`, 'AdapterManager', { isValid, issuesCount: issues.length }); return { isValid, issues }; } // === УДАЛЕНИЕ === removeAdapter(adapterId) { const hadAdapter = this.adapters.has(adapterId); if (hadAdapter) { this.adapters.delete(adapterId); this.stats.totalAdapters = this.adapters.size; this.stats.activeAdapters--; logger_1.logger.info(`Removed adapter: ${adapterId}`, 'AdapterManager', { id: adapterId }); } return hadAdapter; } clearAdapters() { const adapterCount = this.adapters.size; this.adapters.clear(); this.stats.totalAdapters = 0; this.stats.activeAdapters = 0; logger_1.logger.info(`Cleared all adapters: ${adapterCount} removed`, 'AdapterManager', { removedCount: adapterCount }); } // === СТАТИСТИКА === getStats() { return { ...this.stats, adapters: Array.from(this.adapters.keys()), platforms: Array.from(this.adapters.values()).map(a => a.meta?.platform).filter(Boolean) }; } } exports.AdapterManager = AdapterManager;