userface
Version:
Universal Data-Driven UI Engine with live data, validation, and multi-platform support
188 lines (187 loc) • 7.34 kB
JavaScript
;
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;