@gnpdev/rpa-tools 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -49,33 +49,39 @@ export const rpa = await createRpaTools({
49
49
  }
50
50
  })
51
51
 
52
- // 3. Exporta el objeto Logger
53
- export const logger = rpa.logger;
54
-
55
- // 4. Genera el objeto de estado para cambio de Paso a paso
56
- export const state = {
57
- currentStep: 'Inicio'
58
- };
59
-
52
+ // 3. Exporta las herramientas
53
+ export const { logger, state, step } = rpa;
60
54
  ```
61
55
 
62
56
  ## Uso en la Aplicación
63
57
 
64
- ### 1. Logging Estructurado
58
+ ### 1. Gestión de Pasos y Estado
59
+ La librería mantiene el rastro del paso actual del bot. Cada vez que llamas a `step()`, se actualiza el estado interno y se genera un log automático.
60
+
61
+ ```javascript
62
+ import { step, state } from './lib/rpa.js';
63
+
64
+ step('Inicio de Sesión');
65
+ console.log(state.currentStep); // 'Inicio de Sesión'
66
+
67
+ step('Extracción de Datos');
68
+ // Genera log: info { "step": "Extracción de Datos" } "Nuevo paso"
69
+ ```
70
+
71
+ ### 2. Logging Estructurado
65
72
  Usa el logger preconfigurado que ya incluye el `botId` en cada entrada.
66
73
 
67
74
  ```javascript
68
- import { logger, rpa } from './lib/rpa.js';
75
+ import { logger } from './lib/rpa.js';
69
76
 
70
77
  logger.info('Procesando orden');
71
78
  ```
72
79
 
73
- ### 2. Gestión de Credenciales
80
+ ### 3. Gestión de Credenciales
74
81
  Recupera de forma segura el `usuario`, `password` e `idUsuario` de una aplicación específica vinculada al bot.
75
82
 
76
83
  ```javascript
77
- import { logger, rpa } from './lib/rpa.js';
78
-
84
+ import { rpa, logger } from './lib/rpa.js';
79
85
 
80
86
  logger.info('Obtener credenciales');
81
87
  const credentials = await rpa.getCredentials('Portal CRM');
@@ -86,7 +92,7 @@ if (credentials) {
86
92
  }
87
93
  ```
88
94
 
89
- ### 3. Capturas de Pantalla bajo demanda (Playwright)
95
+ ### 4. Capturas de Pantalla bajo demanda (Playwright)
90
96
  Activa el watcher pasando la instancia de `page`. El bot detectará cambios en la tabla de la DB para tomar screenshots automáticamente.
91
97
 
92
98
  ```javascript
@@ -101,52 +107,44 @@ rpa.watchDebugFlag(page);
101
107
 
102
108
 
103
109
  // Al terminar el proceso del bot
104
- rpa.destroy();
110
+ rpa.destroy();
105
111
 
106
- puedes incluir
107
-
108
- browser.on('disconnected', () => rpa.destroy());
112
+ // Sugerencia: limpiar al desconectar
113
+ browser.on('disconnected', () => rpa.destroy());
109
114
  ```
110
115
 
111
- ### 4. Captura Automática de Errores (Screenshot + Trace)
112
- Captura el estado completo del bot cuando ocurre una excepción: Screenshot (.webp), Trace de Playwright (.zip) y registro en la base de datos `bots.tb_error_bots`.
116
+ ### 5. Captura Automática de Errores (Screenshot + Trace)
117
+ Captura el estado completo del bot cuando ocurre una excepción. **`captureError` detecta automáticamente el paso actual** definido con `step()`.
113
118
 
114
119
  ```javascript
115
120
  import { chromium } from 'playwright';
116
- import { rpa, logger, state } from './lib/rpa.js';
121
+ import { rpa, logger, step } from './lib/rpa.js';
117
122
 
118
123
  const browser = await chromium.launch({ headless: true });
119
124
  const context = await browser.newContext();
120
125
  const page = await context.newPage();
121
126
 
122
- // ── Activar tracing ANTES de que empiece la sesión ──────────────────────
123
- // screenshots:true captura visual en cada snapshot
124
- // snapshots:true → guarda el DOM y estado de red en cada paso
125
- await context.tracing.start({
126
- screenshots: true,
127
- snapshots: true,
128
- });
127
+ // ── Activar tracing ANTES de que empiece la sesión ──────────────────────
128
+ await context.tracing.start({ screenshots: true, snapshots: true });
129
129
 
130
+ browser.on('disconnected', () => rpa.destroy());
130
131
 
131
132
  try {
132
- // Lógica de tu bot...
133
+ step('Navegación');
133
134
  await page.goto('https://example.com');
134
135
 
135
- state.currentStep = 'Login';
136
+ step('Login');
136
137
  await login(page);
137
138
 
138
- state.currentStep = 'Procesar Datos';
139
+ step('Procesar Datos');
139
140
  await page.click('#boton-inexistente');
141
+
140
142
  } catch (err) {
141
- // Captura automática de evidencia
142
- const { errorId } = await rpa.captureError({
143
- page,
144
- context,
145
- err,
146
- step: state.currentStep
147
- });
148
-
149
- logger.error({ errorId, step: currentStep }, 'Fallo crítico capturado');
143
+ // Captura automática de evidencia (usa el paso 'Procesar Datos' automáticamente)
144
+ const { errorId } = await rpa.captureError({ page, context, err });
145
+
146
+ logger.error({ errorId }, 'Fallo crítico capturado');
147
+ rpa.destroy();
150
148
  throw err;
151
149
  }
152
150
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gnpdev/rpa-tools",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "description": "Libreria para logs y screenshot de bots",
5
5
  "author": "Sergio Antonio Trujillo del Valle",
6
6
  "main": "src/index.js",
package/src/index.d.ts CHANGED
@@ -49,6 +49,17 @@ export interface RpaTools {
49
49
  /** Instancia de Pino lista para usar en el bot */
50
50
  logger: Logger;
51
51
 
52
+ /** Estado compartido del bot */
53
+ state: {
54
+ currentStep: string;
55
+ };
56
+
57
+ /**
58
+ * Cambia el paso actual, actualiza el estado y emite un log info.
59
+ * @param name - Nombre del nuevo paso
60
+ */
61
+ step: (name: string) => void;
62
+
52
63
  /**
53
64
  * Inicia el polling que activa/desactiva screenshots
54
65
  * según bot_debug_config en la BD.
package/src/index.js CHANGED
@@ -46,11 +46,28 @@ async function createRpaTools(opts = {}) {
46
46
  const watcher = new ScreenshotWatcher({ botId, pool: db, minioClient, bucket, logger });
47
47
  const credentials = new CredentialManager({ botId, pool: db });
48
48
 
49
+ const state = { currentStep: 'Inicio' };
50
+
49
51
  return {
50
52
  logger,
53
+ state,
54
+ step: (name) => {
55
+ state.currentStep = name;
56
+ logger.info({ step: name }, 'Nuevo paso');
57
+ },
51
58
  watchDebugFlag: (page, pollMs) => watcher.watch(page, pollMs),
52
59
  getCredentials: (nombre) => credentials.getAppCredentials(nombre),
53
- captureError: ({ page, context, err, step }) => captureError({ page, context, err, step, botId, pool: db, minioClient, bucket, logger }),
60
+ captureError: ({ page, context, err, step }) => captureError({
61
+ page,
62
+ context,
63
+ err,
64
+ step: step || state.currentStep,
65
+ botId,
66
+ pool: db,
67
+ minioClient,
68
+ bucket,
69
+ logger
70
+ }),
54
71
  destroy: () => watcher.destroy(),
55
72
  };
56
73
  }
package/src/watcher.js CHANGED
@@ -63,13 +63,13 @@ class ScreenshotWatcher {
63
63
  return;
64
64
  }
65
65
 
66
- if (cfg.screenshots && !this._shotTimer) {
67
- this.logger.info({ intervalSec: cfg.interval_sec }, 'Screenshots activados');
68
- this._startScreenshots(page, cfg.interval_sec * 1000);
66
+ if (cfg.screenshots_activo && !this._shotTimer) {
67
+ this.logger.info({ intervalSec: cfg.intervalo_sec }, 'Screenshots activados');
68
+ this._startScreenshots(page, cfg.intervalo_sec * 1000);
69
69
  return;
70
70
  }
71
71
 
72
- if (!cfg.screenshots && this._shotTimer) {
72
+ if (!cfg.screenshots_activo && this._shotTimer) {
73
73
  this.logger.info('Screenshots desactivados');
74
74
  this._stopScreenshots();
75
75
  }