UNPKG

tess-core-engine

Version:

Tess Core: framework cognitivo modular con API Fluent

69 lines (59 loc) 1.89 kB
const AdapterManager = require('./AdapterManager'); const ContextBuilder = require('./ContextBuilder'); const ProtocolRunner = require('./ProtocolRunner'); const EventBus = require('./EventBus'); const adapters = require('../adapters'); class Tess { constructor() { this.engine = { adapters: new AdapterManager(), contextBuilder: new ContextBuilder(), protocolRunner: new ProtocolRunner(), events: new EventBus() }; this.errorHandler = err => console.error(err); } use(adapter) { this.engine.adapters.register(adapter.name, adapter); return this; } onError(fn) { this.errorHandler = fn; return this; } onEvent(event, fn) { this.engine.events.on(event, fn); return this; } async run(input) { try { this.engine.events.emit('input.received', input); const context = await this.engine.contextBuilder.build(input); this.engine.events.emit('context.built', context); const adapter = this.engine.adapters.match(context); if (!adapter) throw new Error('No matching adapter'); this.engine.events.emit('adapter.matched', adapter.name); const result = await this.engine.protocolRunner.run(adapter, context); this.engine.events.emit('execution.completed', result); return result; } catch (err) { this.errorHandler(err); throw err; } } static fromConfig(config) { const tess = new Tess(); config.adapters.forEach(name => { // construimos los dos posibles keys const key1 = `${name}Adapter`; const key2 = `create${name.charAt(0).toUpperCase() + name.slice(1)}Adapter`; // buscamos fábrica o factory const factory = adapters[key1] || adapters[key2]; if (typeof factory === 'function') { tess.use(factory(config[name] || {})); } }); return tess; } } module.exports = Tess;