tess-core-engine
Version:
Tess Core: framework cognitivo modular con API Fluent
69 lines (59 loc) • 1.89 kB
JavaScript
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;