jerkjs 2.5.8 → 2.6.1

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +162 -99
  2. package/README.md +113 -190
  3. package/RESULTADOS_WAF.md +63 -0
  4. package/doc-2.5/MANUAL_MODULOS_ADMIN.md +287 -0
  5. package/doc-2.5/QUEUE_CLI_MODULE_MANUAL.md +289 -0
  6. package/doc-2.5/QUEUE_SYSTEM_MANUAL.md +320 -0
  7. package/doc-2.5/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
  8. package/doc-2.5/WAF_MODULE_MANUAL.md +229 -0
  9. package/index.js +12 -3
  10. package/jerk-admin-client/README.md +69 -0
  11. package/jerk-admin-client/package.json +23 -0
  12. package/jerk-admin-client.js +257 -0
  13. package/lib/admin/AdminExtension.js +74 -19
  14. package/lib/admin/modules/ControllerGeneratorModule.js +414 -0
  15. package/lib/admin/modules/QueueManagementModule.js +265 -0
  16. package/lib/admin/modules/RouteCacheModule.js +227 -0
  17. package/lib/admin/modules/RouteManagerModule.js +468 -0
  18. package/lib/admin/modules/STATS_MODULE_README.md +15 -0
  19. package/lib/admin/modules/ViewCacheStatsModule.js +92 -0
  20. package/lib/admin/modules/WAFModule.js +737 -0
  21. package/lib/core/server.js +72 -69
  22. package/lib/middleware/firewall.js +112 -17
  23. package/lib/mvc/viewEngine.js +69 -10
  24. package/lib/queue/GlobalQueueStorage.js +38 -0
  25. package/lib/queue/QueueSystem.js +451 -0
  26. package/lib/queue/admin_example.js +114 -0
  27. package/lib/queue/example.js +268 -0
  28. package/lib/queue/integration.js +109 -0
  29. package/lib/utils/globalViewCacheInfo.js +16 -0
  30. package/lib/utils/globalWAFStats.js +54 -0
  31. package/package.json +2 -2
  32. package/test-colors.js +46 -0
  33. package/test-help-alias.js +31 -0
  34. package/ESTADISTICAS_RENDIMIENTO.md +0 -106
  35. package/debug_hook.js +0 -11
  36. package/docs/CACHE_SYSTEM_MAP.md +0 -206
@@ -0,0 +1,320 @@
1
+ # Manual de Uso del Sistema de Colas para el Framework JERK
2
+
3
+ ## Tabla de Contenidos
4
+ 1. [Introducción](#introducción)
5
+ 2. [Características del Sistema de Colas](#características-del-sistema-de-colas)
6
+ 3. [Instalación y Configuración](#instalación-y-configuración)
7
+ 4. [Conceptos Básicos](#conceptos-básicos)
8
+ 5. [Uso Básico](#uso-básico)
9
+ 6. [Uso Avanzado](#uso-avanzado)
10
+ 7. [Hooks Personalizados](#hooks-personalizados)
11
+ 8. [Gestión de Errores y Reintentos](#gestión-de-errores-y-reintentos)
12
+ 9. [Ejemplos de Uso](#ejemplos-de-uso)
13
+
14
+ ## Introducción
15
+
16
+ El Sistema de Colas es una extensión del Framework JERK que permite la ejecución asíncrona de tareas en múltiples colas concurrentes. Este sistema es ideal para operaciones que consumen tiempo como procesamiento de imágenes, envío de correos electrónicos, procesamiento de pagos, y otras operaciones que no deben bloquear la respuesta inmediata a las solicitudes del usuario.
17
+
18
+ ## Características del Sistema de Colas
19
+
20
+ - **Soporte para N colas**: Puedes crear tantas colas como necesites, cada una con su propia configuración.
21
+ - **Concurrencia configurable**: Controla cuántas tareas se ejecutan simultáneamente por cola.
22
+ - **Hooks personalizados**: Personaliza la lógica de procesamiento y fallback para cada cola.
23
+ - **Sistema de reintentos**: Manejo automático de fallos con reintentos configurables.
24
+ - **Gestión de prioridades**: Asigna prioridades a las tareas para determinar su orden de ejecución.
25
+ - **Sistema de fallback**: Manejo de tareas que fallan definitivamente.
26
+ - **Totalmente asíncrono**: No bloquea el hilo principal de ejecución.
27
+
28
+ ## Instalación y Configuración
29
+
30
+ El Sistema de Colas ya está incluido en el Framework JERK a partir de la versión 2.6.0. Para usarlo:
31
+
32
+ ```javascript
33
+ const { QueueIntegration } = require('jerkjs');
34
+ ```
35
+
36
+ ## Conceptos Básicos
37
+
38
+ ### Cola
39
+ Una cola es una unidad lógica que agrupa tareas similares. Cada cola puede tener su propia configuración de concurrencia, reintentos y hooks personalizados.
40
+
41
+ ### Tarea
42
+ Una tarea es una función que encapsula la lógica que se va a ejecutar en segundo plano. Las tareas pueden ser asíncronas y devolver Promises.
43
+
44
+ ### Hook
45
+ Un hook es un punto de extensión que permite personalizar el comportamiento del sistema de colas, como la lógica de procesamiento de tareas o la lógica de fallback.
46
+
47
+ ## Uso Básico
48
+
49
+ ### 1. Crear una instancia del sistema de colas
50
+
51
+ ```javascript
52
+ const { QueueIntegration } = require('jerkjs');
53
+
54
+ // Crear una instancia de la integración de colas
55
+ const queueIntegration = new QueueIntegration();
56
+ ```
57
+
58
+ ### 2. Crear una cola simple
59
+
60
+ ```javascript
61
+ // Crear una cola con configuración por defecto
62
+ queueIntegration.createQueue('procesamiento-general', {
63
+ concurrency: 2, // Máximo 2 tareas ejecutándose simultáneamente
64
+ retryAttempts: 3, // Reintentar hasta 3 veces si falla
65
+ retryDelay: 1000 // Esperar 1 segundo entre reintentos
66
+ });
67
+ ```
68
+
69
+ ### 3. Agregar tareas a la cola
70
+
71
+ ```javascript
72
+ // Función que representa una tarea
73
+ function procesarDatos(datos, taskObj) {
74
+ return new Promise((resolve, reject) => {
75
+ // Simular procesamiento
76
+ setTimeout(() => {
77
+ console.log(`Procesando datos:`, datos);
78
+ resolve('Procesamiento completado');
79
+ }, 2000);
80
+ });
81
+ }
82
+
83
+ // Agregar una tarea a la cola
84
+ const taskId = queueIntegration.addTask(
85
+ 'procesamiento-general', // Nombre de la cola
86
+ procesarDatos, // Función de la tarea
87
+ { id: 1, nombre: 'dato1' }, // Datos para la tarea
88
+ 0 // Prioridad (0 es la más alta)
89
+ );
90
+ ```
91
+
92
+ ### 4. Iniciar el sistema de colas
93
+
94
+ ```javascript
95
+ // Iniciar la ejecución de tareas
96
+ queueIntegration.start();
97
+ ```
98
+
99
+ ## Uso Avanzado
100
+
101
+ ### Crear colas con hooks personalizados
102
+
103
+ ```javascript
104
+ const { HookSystem } = require('jerkjs');
105
+
106
+ // Crear un sistema de hooks específico para esta cola
107
+ const procesamientoImagenesHooks = new HookSystem();
108
+
109
+ // Hook para personalizar la lógica de procesamiento
110
+ procesamientoImagenesHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
111
+ console.log(`Preparando para procesar imagen: ${taskObj.id}`);
112
+
113
+ // Envolver la tarea original con lógica adicional
114
+ const wrappedTask = async (datos, taskObj) => {
115
+ console.log(`Iniciando procesamiento de imagen: ${taskObj.id}`);
116
+ try {
117
+ const result = await task(datos, taskObj);
118
+ console.log(`Imagen procesada exitosamente: ${taskObj.id}`);
119
+ return result;
120
+ } catch (error) {
121
+ console.log(`Error procesando imagen: ${taskObj.id} - ${error.message}`);
122
+ throw error;
123
+ }
124
+ };
125
+
126
+ return wrappedTask;
127
+ });
128
+
129
+ // Hook para manejar la lógica de fallback
130
+ procesamientoImagenesHooks.addAction('queue_task_fallback', (queueName, task, error) => {
131
+ console.log(`Ejecutando fallback para imagen:`, error.message);
132
+ // Lógica personalizada para manejar tareas que fallan definitivamente
133
+ });
134
+
135
+ // Crear la cola con hooks personalizados
136
+ queueIntegration.createQueue('imagenes', {
137
+ concurrency: 3,
138
+ retryAttempts: 2,
139
+ retryDelay: 1000
140
+ }, procesamientoImagenesHooks);
141
+ ```
142
+
143
+ ### Prioridades de tareas
144
+
145
+ Las tareas se pueden agregar con diferentes niveles de prioridad. Un valor más bajo indica una prioridad más alta:
146
+
147
+ ```javascript
148
+ // Tarea de alta prioridad (prioridad 0)
149
+ queueIntegration.addTask('imagenes', procesarImagen, { archivo: 'importante.jpg' }, 0);
150
+
151
+ // Tarea de prioridad media (prioridad 5)
152
+ queueIntegration.addTask('imagenes', procesarImagen, { archivo: 'normal.jpg' }, 5);
153
+
154
+ // Tarea de baja prioridad (prioridad 10)
155
+ queueIntegration.addTask('imagenes', procesarImagen, { archivo: 'opcional.jpg' }, 10);
156
+ ```
157
+
158
+ ## Hooks Personalizados
159
+
160
+ El sistema de colas proporciona varios puntos de extensión a través de hooks:
161
+
162
+ ### Hooks Disponibles
163
+
164
+ - `queue_execute_task`: Se ejecuta antes de procesar una tarea. Permite modificar la lógica de la tarea.
165
+ - `queue_task_completed`: Se ejecuta cuando una tarea se completa exitosamente.
166
+ - `queue_task_failed`: Se ejecuta cuando una tarea falla.
167
+ - `queue_task_retry`: Se ejecuta cuando una tarea se reintenta.
168
+ - `queue_task_fallback`: Se ejecuta cuando una tarea falla definitivamente después de todos los reintentos.
169
+ - `queue_task_added`: Se ejecuta cuando se agrega una tarea a la cola.
170
+ - `queue_system_started`: Se ejecuta cuando se inicia el sistema de colas.
171
+ - `queue_system_stopped`: Se ejecuta cuando se detiene el sistema de colas.
172
+
173
+ ### Ejemplo de hook personalizado
174
+
175
+ ```javascript
176
+ const misHooks = new HookSystem();
177
+
178
+ // Hook para registrar todas las tareas completadas
179
+ misHooks.addAction('queue_task_completed', (queueName, task) => {
180
+ console.log(`Tarea completada en cola ${queueName}:`, task.id);
181
+ });
182
+
183
+ // Hook para registrar errores
184
+ misHooks.addAction('queue_task_failed', (queueName, task, error) => {
185
+ console.log(`Tarea fallida en cola ${queueName}:`, task.id, error.message);
186
+ });
187
+ ```
188
+
189
+ ## Gestión de Errores y Reintentos
190
+
191
+ El sistema de colas incluye un mecanismo robusto para manejar errores:
192
+
193
+ ### Configuración de reintentos
194
+
195
+ ```javascript
196
+ queueIntegration.createQueue('procesamiento-confiable', {
197
+ retryAttempts: 5, // Número máximo de reintentos
198
+ retryDelay: 2000 // Milisegundos de espera entre reintentos
199
+ });
200
+ ```
201
+
202
+ ### Lógica de fallback
203
+
204
+ Cuando una tarea falla después de todos los reintentos, se ejecuta la lógica de fallback:
205
+
206
+ ```javascript
207
+ const hooks = new HookSystem();
208
+
209
+ hooks.addAction('queue_task_fallback', (queueName, task, error) => {
210
+ // Aquí puedes implementar lógica personalizada para manejar tareas fallidas
211
+ console.log(`Tarea fallida definitivamente:`, task.id);
212
+ console.log(`Error:`, error.message);
213
+
214
+ // Por ejemplo, guardar en una base de datos para procesamiento manual
215
+ // o enviar una alerta al equipo de soporte
216
+ });
217
+ ```
218
+
219
+ ## Ejemplos de Uso
220
+
221
+ ### Ejemplo completo: Procesamiento de imágenes
222
+
223
+ ```javascript
224
+ const { QueueIntegration, HookSystem } = require('jerkjs');
225
+
226
+ // Crear instancia del sistema de colas
227
+ const queueIntegration = new QueueIntegration();
228
+
229
+ // Configurar cola de imágenes con hooks personalizados
230
+ const imagenHooks = new HookSystem();
231
+
232
+ imagenHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
233
+ console.log(`[IMAGEN] Preparando para procesar: ${taskObj.id}`);
234
+ return task;
235
+ });
236
+
237
+ imagenHooks.addAction('queue_task_fallback', (queueName, task, error) => {
238
+ console.log(`[IMAGEN] Error definitivo:`, error.message);
239
+ });
240
+
241
+ queueIntegration.createQueue('imagenes', {
242
+ concurrency: 3,
243
+ retryAttempts: 2,
244
+ retryDelay: 1000
245
+ }, imagenHooks);
246
+
247
+ // Función de tarea para procesamiento de imágenes
248
+ function procesarImagen(datos, taskObj) {
249
+ return new Promise((resolve, reject) => {
250
+ console.log(`[IMAGEN] Procesando: ${datos.nombreArchivo}`);
251
+
252
+ // Simular procesamiento
253
+ setTimeout(() => {
254
+ if (Math.random() < 0.2) { // 20% de fallos
255
+ reject(new Error(`Error procesando ${datos.nombreArchivo}`));
256
+ } else {
257
+ console.log(`[IMAGEN] Completado: ${datos.nombreArchivo}`);
258
+ resolve(`Imagen ${datos.nombreArchivo} procesada`);
259
+ }
260
+ }, 2000);
261
+ });
262
+ }
263
+
264
+ // Agregar tareas
265
+ for (let i = 0; i < 5; i++) {
266
+ queueIntegration.addTask('imagenes', procesarImagen, {
267
+ id: i,
268
+ nombreArchivo: `imagen_${i}.jpg`
269
+ }, i);
270
+ }
271
+
272
+ // Iniciar el sistema
273
+ queueIntegration.start();
274
+
275
+ // Verificar estado periódicamente
276
+ setInterval(() => {
277
+ console.log('Estado:', queueIntegration.getStatus());
278
+ }, 5000);
279
+ ```
280
+
281
+ ### Ejemplo: Envío de correos electrónicos
282
+
283
+ ```javascript
284
+ // Cola para envío de correos
285
+ queueIntegration.createQueue('correos', {
286
+ concurrency: 2, // Máximo 2 envíos simultáneos
287
+ retryAttempts: 3, // Reintentar hasta 3 veces
288
+ retryDelay: 2000 // Esperar 2 segundos entre reintentos
289
+ });
290
+
291
+ function enviarCorreo(datos, taskObj) {
292
+ return new Promise((resolve, reject) => {
293
+ console.log(`Enviando correo a: ${datos.destinatario}`);
294
+
295
+ // Simular envío de correo
296
+ setTimeout(() => {
297
+ if (Math.random() < 0.15) { // 15% de fallos
298
+ reject(new Error(`Fallo al enviar correo a ${datos.destinatario}`));
299
+ } else {
300
+ console.log(`Correo enviado a: ${datos.destinatario}`);
301
+ resolve(`Correo enviado a ${datos.destinatario}`);
302
+ }
303
+ }, 1500);
304
+ });
305
+ }
306
+
307
+ // Agregar tareas de correo
308
+ const destinatarios = ['usuario1@example.com', 'usuario2@example.com', 'usuario3@example.com'];
309
+ destinatarios.forEach((destinatario, index) => {
310
+ queueIntegration.addTask('correos', enviarCorreo, {
311
+ destinatario: destinatario,
312
+ asunto: 'Correo de prueba',
313
+ contenido: 'Contenido del correo'
314
+ }, index);
315
+ });
316
+ ```
317
+
318
+ ## Conclusión
319
+
320
+ El Sistema de Colas del Framework JERK proporciona una solución robusta y flexible para la ejecución asíncrona de tareas. Con soporte para múltiples colas, configuración de concurrencia, hooks personalizados y manejo de errores, es ideal para aplicaciones que requieren procesamiento en segundo plano sin bloquear la respuesta a las solicitudes del usuario.
@@ -0,0 +1,205 @@
1
+ # Manual del Módulo de Cache de Rutas para JERK Framework
2
+
3
+ ## Tabla de Contenidos
4
+ 1. [Introducción](#introducción)
5
+ 2. [Comandos Disponibles](#comandos-disponibles)
6
+ 3. [Uso Básico](#uso-básico)
7
+ 4. [Uso Avanzado](#uso-avanzado)
8
+ 5. [Ejemplos de Uso](#ejemplos-de-uso)
9
+
10
+ ## Introducción
11
+
12
+ El módulo de Cache de Rutas es una extensión del sistema de administración CLI de JERK Framework que permite monitorear y gestionar el cache de rutas del sistema. Proporciona comandos para ver el estado del cache, visualizar su contenido, y limpiarlo cuando sea necesario.
13
+
14
+ ## Comandos Disponibles
15
+
16
+ ### Comandos Generales de Cache de Rutas
17
+ - `route-cache` o `cache-stats`: Muestra estadísticas del cache de rutas
18
+ - `cache-view`: Muestra el contenido completo del cache de rutas
19
+ - `cache-dynamic`: Muestra solo el cache de rutas dinámicas (parametrizadas)
20
+ - `cache-static`: Muestra solo el cache de rutas estáticas (exactas)
21
+ - `cache-clear`: Limpia todo el cache de rutas
22
+
23
+ ## Uso Básico
24
+
25
+ ### Conectar al Sistema de Administración
26
+
27
+ Para acceder al módulo de cache de rutas, primero debes conectarte al sistema de administración:
28
+
29
+ ```bash
30
+ telnet localhost 9999
31
+ ```
32
+
33
+ O alternativamente:
34
+
35
+ ```bash
36
+ nc localhost 9999
37
+ ```
38
+
39
+ ### Ver estadísticas del cache de rutas
40
+
41
+ Comando: `route-cache` o `cache-stats`
42
+
43
+ Este comando muestra estadísticas generales del cache de rutas:
44
+
45
+ ```
46
+ > route-cache
47
+
48
+ === Estadísticas del Cache de Rutas ===
49
+ Rutas dinámicas (parametrizadas) en cache: 5
50
+ Rutas estáticas exactas en cache: 10
51
+ Tamaño total de índices: 15
52
+ Índices válidos: Sí
53
+
54
+ >
55
+ ```
56
+
57
+ ### Ver contenido del cache de rutas
58
+
59
+ Comando: `cache-view`
60
+
61
+ Este comando muestra el contenido completo del cache de rutas:
62
+
63
+ ```
64
+ > cache-view
65
+
66
+ === Contenido del Cache de Rutas ===
67
+
68
+ --- Rutas Dinámicas (Parametrizadas) en Cache ---
69
+ 1. /users/:id -> /^\/users\/([^\/]+?)$/
70
+ 2. /posts/:slug -> /^\/posts\/([^\/]+?)$/
71
+
72
+ --- Rutas Estáticas Exactas en Cache ---
73
+ 1. GET /api/users -> anonymous
74
+ 2. POST /api/users -> anonymous
75
+
76
+ >
77
+ ```
78
+
79
+ ## Uso Avanzado
80
+
81
+ ### Ver solo cache de rutas dinámicas
82
+
83
+ Comando: `cache-dynamic`
84
+
85
+ Muestra únicamente las rutas dinámicas (parametrizadas) en el cache:
86
+
87
+ ```
88
+ > cache-dynamic
89
+
90
+ === Cache de Rutas Dinámicas (Parametrizadas) ===
91
+ 1. Ruta: /users/:id
92
+ Regex: /^\/users\/([^\/]+?)$/
93
+
94
+ 2. Ruta: /posts/:slug
95
+ Regex: /^\/posts\/([^\/]+?)$/
96
+
97
+ Total: 2 rutas dinámicas en cache.
98
+
99
+ >
100
+ ```
101
+
102
+ ### Ver solo cache de rutas estáticas
103
+
104
+ Comando: `cache-static`
105
+
106
+ Muestra únicamente las rutas estáticas (exactas) en el cache:
107
+
108
+ ```
109
+ > cache-static
110
+
111
+ === Cache de Rutas Estáticas (Exactas) ===
112
+ 1. GET /api/users
113
+ Handler: anonymous
114
+ Static: true
115
+
116
+ 2. POST /api/users
117
+ Handler: anonymous
118
+ Static: true
119
+
120
+ Total: 2 rutas estáticas en cache.
121
+
122
+ >
123
+ ```
124
+
125
+ ### Limpiar el cache de rutas
126
+
127
+ Comando: `cache-clear`
128
+
129
+ Elimina todas las entradas del cache de rutas:
130
+
131
+ ```
132
+ > cache-clear
133
+
134
+ === Limpieza del Cache de Rutas ===
135
+ Rutas dinámicas eliminadas: 5
136
+ Rutas estáticas eliminadas: 10
137
+ Cache de rutas limpiado exitosamente.
138
+
139
+ >
140
+ ```
141
+
142
+ ## Ejemplos de Uso
143
+
144
+ ### Ejemplo 1: Diagnóstico de rendimiento
145
+
146
+ Para diagnosticar problemas de rendimiento relacionados con el cache de rutas:
147
+
148
+ ```
149
+ > route-cache
150
+ Rutas dinámicas (parametrizadas) en cache: 50
151
+ Rutas estáticas exactas en cache: 100
152
+ Tamaño total de índices: 150
153
+ Índices válidos: Sí
154
+
155
+ > cache-dynamic
156
+ [Detalles de las 50 rutas dinámicas en cache]
157
+ >
158
+ ```
159
+
160
+ ### Ejemplo 2: Verificación de rutas parametrizadas
161
+
162
+ Para verificar específicamente las rutas parametrizadas en el cache:
163
+
164
+ ```
165
+ > cache-dynamic
166
+ === Cache de Rutas Dinámicas (Parametrizadas) ===
167
+ 1. Ruta: /users/:id
168
+ Regex: /^\/users\/([^\/]+?)$/
169
+
170
+ 2. Ruta: /products/:category/:id
171
+ Regex: /^\/products\/([^\/]+?)\/([^\/]+?)$/
172
+
173
+ Total: 2 rutas dinámicas en cache.
174
+
175
+ >
176
+ ```
177
+
178
+ ## Solución de Problemas
179
+
180
+ ### Problema: Comando no reconocido
181
+
182
+ **Síntoma**: El sistema responde con "Comando desconocido para el módulo de cache de rutas"
183
+
184
+ **Solución**: Verifica que estás usando uno de los comandos válidos: `route-cache`, `cache-stats`, `cache-view`, `cache-dynamic`, `cache-static`, `cache-clear`
185
+
186
+ ### Problema: No se encuentra el componente RouteMatcher
187
+
188
+ **Síntoma**: El sistema responde con "No se encontró el componente RouteMatcher"
189
+
190
+ **Solución**: Asegúrate de que el servidor esté completamente iniciado y que el componente RouteMatcher haya sido correctamente instanciado.
191
+
192
+ ## Compatibilidad
193
+
194
+ - **Versión mínima del framework**: JERK 2.5.8
195
+ - **Puerto de administración**: Por defecto 9999 (configurable)
196
+ - **Acceso**: Solo desde localhost por razones de seguridad
197
+ - **Protocolo**: Conexión TCP con interfaz de línea de comandos
198
+
199
+ ## Autor
200
+
201
+ JERK Framework Team
202
+
203
+ ## Versión
204
+
205
+ v2.6.0