TeqFW: inicialización y detención de plugins

Fecha de publicación: 2021-08-17

Algunos plugins de TeqFW necesitan realizar tareas cuando la aplicación se inicia o se detiene; por ejemplo, abrir conexiones con la base de datos al arrancar y cerrarlas al finalizar.

El plugin puede declarar en su descriptor TeqFW (./teqfw.json) un módulo ES6 con una fábrica para el inicializador y otro para el finalizador:

{
  "core": {
    "plugin": {
      "onInit": "Vnd_Prj_Back_Plugin_Init",
      "onStop": "Vnd_Prj_Back_Plugin_Stop"
    }
  }
}

Un módulo ES6 típico tiene esta forma:

export default function Factory(spec) {
  // EXTRACT DEPS
  // ...
  // COMPOSE RESULT
  async function action() {
    // ...
  }
  return action;
}

Jerarquía de plugins

Los plugins de una aplicación forman una jerarquía según sus dependencias. TeqFW las obtiene del nodo /dependencies de package.json:

{
  "name": "@teqfw/web",
  "dependencies": { "@teqfw/core": "*" }
}

Los plugins de nivel básico, como core, se inicializan y detienen antes que los de nivel superior, como web.

Inicialización

La inicialización ocurre al iniciar una aplicación TeqFW, en TeqFw_Core_Back_App.init, después de cargar la configuración local, explorar plugins e inicializar el contenedor DI:

this.init = async function ({path, version}) {
  initBootConfig(config, path, version);
  config.loadLocal(path);
  const registry = await pluginScan.exec(path);
  initDiContainer(registry);
  await initPlugins(registry);
};

La aplicación ejecuta los inicializadores uno a uno, desde core hasta niveles superiores como app.

Detención

La detención se realiza mediante el método público TeqFw_Core_Back_App.stop. Puede invocarse directamente y TeqFW también lo llama al recibir una señal del proceso:

this.run = async function () {
  const me = this;
  async function onStop() {
    await me.stop();
    process.exit();
  }
  process.on('SIGINT', onStop);
  process.on('SIGTERM', onStop);
  process.on('SIGQUIT', onStop);
};
this.stop = async function () { /* ... */ };

Los finalizadores se ejecutan en el mismo orden ascendente: de core a app.

Fragmentos adicionales de código fuente

this.init = async function ({path, version}) {
initBootConfig(config, path, version);
// …
config.loadLocal(path);
const registry = await pluginScan.exec(path);
initDiContainer(registry);
await initPlugins(registry);
// …
}
this.run = async function () {
const me = this; async function onStop() {
await me.stop();
process.exit();
} process.on(‘SIGINT’, onStop);
process.on(‘SIGTERM’, onStop);
process.on(‘SIGQUIT’, onStop);
// …
};this.stop = async function () {/* … */} Функции останова плагинов запускаются также по очереди, снизу-вверх — от базовых уровне (core) к верхним (app).