@gnpdev/rpa-tools 1.0.14 → 1.0.15
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 +38 -40
- package/package.json +1 -1
- package/src/index.d.ts +11 -0
- package/src/index.js +18 -1
package/README.md
CHANGED
|
@@ -49,33 +49,39 @@ export const rpa = await createRpaTools({
|
|
|
49
49
|
}
|
|
50
50
|
})
|
|
51
51
|
|
|
52
|
-
// 3. Exporta
|
|
53
|
-
export const logger = rpa
|
|
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.
|
|
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
|
|
75
|
+
import { logger } from './lib/rpa.js';
|
|
69
76
|
|
|
70
77
|
logger.info('Procesando orden');
|
|
71
78
|
```
|
|
72
79
|
|
|
73
|
-
###
|
|
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 {
|
|
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
|
-
###
|
|
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
|
-
|
|
110
|
+
rpa.destroy();
|
|
105
111
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
browser.on('disconnected', () => rpa.destroy());
|
|
112
|
+
// Sugerencia: limpiar al desconectar
|
|
113
|
+
browser.on('disconnected', () => rpa.destroy());
|
|
109
114
|
```
|
|
110
115
|
|
|
111
|
-
###
|
|
112
|
-
Captura el estado completo del bot cuando ocurre una excepción
|
|
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,
|
|
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
|
-
|
|
123
|
-
|
|
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
|
-
|
|
133
|
+
step('Navegación');
|
|
133
134
|
await page.goto('https://example.com');
|
|
134
135
|
|
|
135
|
-
|
|
136
|
+
step('Login');
|
|
136
137
|
await login(page);
|
|
137
138
|
|
|
138
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
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 }) =>
|
|
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
|
}
|