jerkjs 2.5.6 → 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 (46) hide show
  1. package/CHANGELOG.md +167 -79
  2. package/README.md +134 -146
  3. package/RESULTADOS_WAF.md +63 -0
  4. package/doc-2.5/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
  5. package/doc-2.5/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
  6. package/doc-2.5/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
  7. package/doc-2.5/CACHE_SYSTEM_MAP.md +206 -0
  8. package/doc-2.5/MANUAL_MODULOS_ADMIN.md +287 -0
  9. package/doc-2.5/QUEUE_CLI_MODULE_MANUAL.md +289 -0
  10. package/doc-2.5/QUEUE_SYSTEM_MANUAL.md +320 -0
  11. package/doc-2.5/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
  12. package/doc-2.5/WAF_MODULE_MANUAL.md +229 -0
  13. package/index.js +19 -4
  14. package/jerk-admin-client/README.md +69 -0
  15. package/jerk-admin-client/package.json +23 -0
  16. package/jerk-admin-client.js +257 -0
  17. package/lib/admin/AdminExtension.js +491 -0
  18. package/lib/admin/ModuleLoader.js +77 -0
  19. package/lib/admin/config.js +21 -0
  20. package/lib/admin/modules/CacheModule.js +145 -0
  21. package/lib/admin/modules/ControllerGeneratorModule.js +414 -0
  22. package/lib/admin/modules/QueueManagementModule.js +265 -0
  23. package/lib/admin/modules/RouteCacheModule.js +227 -0
  24. package/lib/admin/modules/RouteManagerModule.js +468 -0
  25. package/lib/admin/modules/STATS_MODULE_README.md +113 -0
  26. package/lib/admin/modules/StatsModule.js +140 -0
  27. package/lib/admin/modules/SystemModule.js +140 -0
  28. package/lib/admin/modules/TimeModule.js +95 -0
  29. package/lib/admin/modules/ViewCacheStatsModule.js +92 -0
  30. package/lib/admin/modules/WAFModule.js +737 -0
  31. package/lib/cache/CacheHooks.js +141 -0
  32. package/lib/core/server.js +223 -77
  33. package/lib/middleware/firewall.js +112 -17
  34. package/lib/mvc/viewEngine.js +89 -5
  35. package/lib/queue/GlobalQueueStorage.js +38 -0
  36. package/lib/queue/QueueSystem.js +451 -0
  37. package/lib/queue/admin_example.js +114 -0
  38. package/lib/queue/example.js +268 -0
  39. package/lib/queue/integration.js +109 -0
  40. package/lib/router/RouteMatcher.js +242 -54
  41. package/lib/utils/globalStats.js +16 -0
  42. package/lib/utils/globalViewCacheInfo.js +16 -0
  43. package/lib/utils/globalWAFStats.js +54 -0
  44. package/package.json +2 -2
  45. package/test-colors.js +46 -0
  46. package/test-help-alias.js +31 -0
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Ejemplo de uso del sistema de colas para el framework JERK
3
+ * Archivo de ejemplo: queue/example.js
4
+ * Demostración con 3 colas distintas
5
+ */
6
+
7
+ // Importar el sistema de colas
8
+ const QueueIntegration = require('./integration');
9
+ const { hooks } = require('../../index.js'); // Suponiendo que se está usando dentro del framework
10
+
11
+ // Crear una instancia de la integración de colas
12
+ const queueIntegration = new QueueIntegration();
13
+ const queueSystem = queueIntegration.getQueueSystem();
14
+
15
+ // Ejemplo de tarea para la cola de procesamiento de imágenes
16
+ function tareaProcesamientoImagen(datos, taskObj) {
17
+ return new Promise((resolve, reject) => {
18
+ console.log(`[IMAGEN] Procesando imagen: ${datos.nombreArchivo}`);
19
+
20
+ // Simular un proceso de procesamiento de imagen
21
+ setTimeout(() => {
22
+ if (Math.random() < 0.2) { // 20% de probabilidad de fallo
23
+ console.error(`[IMAGEN] Falló el procesamiento de: ${datos.nombreArchivo}`);
24
+ reject(new Error(`Error procesando imagen: ${datos.nombreArchivo}`));
25
+ } else {
26
+ console.log(`[IMAGEN] Imagen procesada exitosamente: ${datos.nombreArchivo}`);
27
+ resolve(`Imagen ${datos.nombreArchivo} procesada con éxito`);
28
+ }
29
+ }, 2000);
30
+ });
31
+ }
32
+
33
+ // Ejemplo de tarea para la cola de envío de correos
34
+ function tareaEnvioCorreo(datos, taskObj) {
35
+ return new Promise((resolve, reject) => {
36
+ console.log(`[CORREO] Enviando correo a: ${datos.destinatario}`);
37
+
38
+ // Simular un proceso de envío de correo
39
+ setTimeout(() => {
40
+ if (Math.random() < 0.15) { // 15% de probabilidad de fallo
41
+ console.error(`[CORREO] Falló el envío a: ${datos.destinatario}`);
42
+ reject(new Error(`Error enviando correo a: ${datos.destinatario}`));
43
+ } else {
44
+ console.log(`[CORREO] Correo enviado exitosamente a: ${datos.destinatario}`);
45
+ resolve(`Correo enviado a ${datos.destinatario} con éxito`);
46
+ }
47
+ }, 1500);
48
+ });
49
+ }
50
+
51
+ // Ejemplo de tarea para la cola de procesamiento de pagos
52
+ function tareaProcesamientoPago(datos, taskObj) {
53
+ return new Promise((resolve, reject) => {
54
+ console.log(`[PAGO] Procesando pago de: $${datos.monto} para ${datos.usuario}`);
55
+
56
+ // Simular un proceso de procesamiento de pago
57
+ setTimeout(() => {
58
+ if (Math.random() < 0.25) { // 25% de probabilidad de fallo
59
+ console.error(`[PAGO] Falló el procesamiento de pago para: ${datos.usuario}`);
60
+ reject(new Error(`Error procesando pago para: ${datos.usuario}`));
61
+ } else {
62
+ console.log(`[PAGO] Pago procesado exitosamente para: ${datos.usuario}`);
63
+ resolve(`Pago de $${datos.monto} para ${datos.usuario} procesado con éxito`);
64
+ }
65
+ }, 3000);
66
+ });
67
+ }
68
+
69
+ // Configurar la cola de procesamiento de imágenes con hooks personalizados
70
+ function setupColaImagenes() {
71
+ const HookSystem = require('../../lib/core/hooks');
72
+ const imagenHooks = new HookSystem();
73
+
74
+ // Hook para personalizar la lógica de procesamiento de tareas de imagen
75
+ imagenHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
76
+ console.log(`[IMAGEN] Preparando para procesar tarea de imagen: ${taskObj.id}`);
77
+ // Aquí puedes modificar la tarea o agregar lógica personalizada
78
+ const wrappedTask = async (datos, taskObj) => {
79
+ console.log(`[IMAGEN] Iniciando ejecución de tarea de imagen: ${taskObj.id} con datos:`, datos);
80
+ try {
81
+ const result = await task(datos, taskObj);
82
+ console.log(`[IMAGEN] Tarea de imagen completada: ${taskObj.id}`);
83
+ return result;
84
+ } catch (error) {
85
+ console.log(`[IMAGEN] Error en tarea de imagen: ${taskObj.id} - ${error.message}`);
86
+ throw error;
87
+ }
88
+ };
89
+ return wrappedTask;
90
+ });
91
+
92
+ // Hook para manejar la lógica de fallback para tareas de imagen
93
+ imagenHooks.addAction('queue_task_fallback', (queueName, task, error) => {
94
+ console.log(`[IMAGEN] Ejecutando lógica de fallback para tarea de imagen:`, error.message);
95
+ // Aquí puedes implementar la lógica de fallback personalizada para imágenes
96
+ console.log(`[IMAGEN] Guardando información de error para procesamiento posterior...`);
97
+ });
98
+
99
+ // Crear la cola de imágenes con los hooks personalizados
100
+ queueIntegration.createQueue('imagenes', {
101
+ concurrency: 3,
102
+ retryAttempts: 2,
103
+ retryDelay: 1000
104
+ }, imagenHooks);
105
+ }
106
+
107
+ // Configurar la cola de envío de correos con hooks personalizados
108
+ function setupColaCorreos() {
109
+ const HookSystem = require('../../lib/core/hooks');
110
+ const correoHooks = new HookSystem();
111
+
112
+ // Hook para personalizar la lógica de procesamiento de tareas de correo
113
+ correoHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
114
+ console.log(`[CORREO] Preparando para enviar correo: ${taskObj.id}`);
115
+ // Aquí puedes modificar la tarea o agregar lógica personalizada
116
+ const wrappedTask = async (datos, taskObj) => {
117
+ console.log(`[CORREO] Iniciando ejecución de tarea de correo: ${taskObj.id} con datos:`, datos);
118
+ try {
119
+ const result = await task(datos, taskObj);
120
+ console.log(`[CORREO] Tarea de correo completada: ${taskObj.id}`);
121
+ return result;
122
+ } catch (error) {
123
+ console.log(`[CORREO] Error en tarea de correo: ${taskObj.id} - ${error.message}`);
124
+ throw error;
125
+ }
126
+ };
127
+ return wrappedTask;
128
+ });
129
+
130
+ // Hook para manejar la lógica de fallback para tareas de correo
131
+ correoHooks.addAction('queue_task_fallback', (queueName, task, error) => {
132
+ console.log(`[CORREO] Ejecutando lógica de fallback para tarea de correo:`, error.message);
133
+ // Aquí puedes implementar la lógica de fallback personalizada para correos
134
+ console.log(`[CORREO] Agregando destinatario a lista de reintento...`);
135
+ });
136
+
137
+ // Crear la cola de correos con los hooks personalizados
138
+ queueIntegration.createQueue('correos', {
139
+ concurrency: 2,
140
+ retryAttempts: 3,
141
+ retryDelay: 2000
142
+ }, correoHooks);
143
+ }
144
+
145
+ // Configurar la cola de procesamiento de pagos con hooks personalizados
146
+ function setupColaPagos() {
147
+ const HookSystem = require('../../lib/core/hooks');
148
+ const pagoHooks = new HookSystem();
149
+
150
+ // Hook para personalizar la lógica de procesamiento de tareas de pago
151
+ pagoHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
152
+ console.log(`[PAGO] Preparando para procesar pago: ${taskObj.id}`);
153
+ // Aquí puedes modificar la tarea o agregar lógica personalizada
154
+ const wrappedTask = async (datos, taskObj) => {
155
+ console.log(`[PAGO] Iniciando ejecución de tarea de pago: ${taskObj.id} con datos:`, datos);
156
+ try {
157
+ const result = await task(datos, taskObj);
158
+ console.log(`[PAGO] Tarea de pago completada: ${taskObj.id}`);
159
+ return result;
160
+ } catch (error) {
161
+ console.log(`[PAGO] Error en tarea de pago: ${taskObj.id} - ${error.message}`);
162
+ throw error;
163
+ }
164
+ };
165
+ return wrappedTask;
166
+ });
167
+
168
+ // Hook para manejar la lógica de fallback para tareas de pago
169
+ pagoHooks.addAction('queue_task_fallback', (queueName, task, error) => {
170
+ console.log(`[PAGO] Ejecutando lógica de fallback para tarea de pago:`, error.message);
171
+ // Aquí puedes implementar la lógica de fallback personalizada para pagos
172
+ console.log(`[PAGO] Marcando transacción como pendiente para revisión manual...`);
173
+ });
174
+
175
+ // Crear la cola de pagos con los hooks personalizados
176
+ queueIntegration.createQueue('pagos', {
177
+ concurrency: 1,
178
+ retryAttempts: 5,
179
+ retryDelay: 3000
180
+ }, pagoHooks);
181
+ }
182
+
183
+ // Ejemplo de uso con 3 colas distintas
184
+ function ejemploDeUso() {
185
+ // Configurar las 3 colas con sus hooks personalizados
186
+ setupColaImagenes();
187
+ setupColaCorreos();
188
+ setupColaPagos();
189
+
190
+ // Agregar tareas a la cola de imágenes
191
+ console.log("\nAgregando tareas a la cola de imágenes...");
192
+ for (let i = 0; i < 5; i++) {
193
+ const taskId = queueIntegration.addTask('imagenes', tareaProcesamientoImagen, {
194
+ id: i,
195
+ nombreArchivo: `imagen_${i}.jpg`,
196
+ tamano: `${Math.floor(Math.random() * 10) + 1}MB`
197
+ }, i); // Usar el índice como prioridad (0 es la más alta)
198
+
199
+ console.log(`Tarea de imagen agregada con ID: ${taskId}`);
200
+ }
201
+
202
+ // Agregar tareas a la cola de correos
203
+ console.log("\nAgregando tareas a la cola de correos...");
204
+ const destinatarios = ['juan@ejemplo.com', 'maria@ejemplo.com', 'pedro@ejemplo.com', 'ana@ejemplo.com', 'luis@ejemplo.com'];
205
+ for (let i = 0; i < destinatarios.length; i++) {
206
+ const taskId = queueIntegration.addTask('correos', tareaEnvioCorreo, {
207
+ id: i,
208
+ destinatario: destinatarios[i],
209
+ asunto: `Mensaje de prueba #${i}`
210
+ }, i);
211
+
212
+ console.log(`Tarea de correo agregada con ID: ${taskId}`);
213
+ }
214
+
215
+ // Agregar tareas a la cola de pagos
216
+ console.log("\nAgregando tareas a la cola de pagos...");
217
+ const usuarios = ['Cliente A', 'Cliente B', 'Cliente C', 'Cliente D', 'Cliente E'];
218
+ for (let i = 0; i < usuarios.length; i++) {
219
+ const taskId = queueIntegration.addTask('pagos', tareaProcesamientoPago, {
220
+ id: i,
221
+ usuario: usuarios[i],
222
+ monto: (Math.floor(Math.random() * 1000) + 100),
223
+ metodo: i % 2 === 0 ? 'Tarjeta' : 'PayPal'
224
+ }, i);
225
+
226
+ console.log(`Tarea de pago agregada con ID: ${taskId}`);
227
+ }
228
+
229
+ // Iniciar el procesamiento de tareas
230
+ console.log("\nIniciando el sistema de colas...");
231
+ queueIntegration.start();
232
+
233
+ // Mostrar estado periódicamente
234
+ setInterval(() => {
235
+ console.log('\n--- Estado del sistema de colas ---');
236
+ const status = queueIntegration.getStatus();
237
+ for (const [queueName, queueStatus] of Object.entries(status)) {
238
+ console.log(`${queueName}: Pendientes=${queueStatus.pendingTasks}, En proceso=${queueStatus.runningTasks}, Fallidas=${queueStatus.failedTasks}`);
239
+ }
240
+ console.log('------------------------------------\n');
241
+ }, 5000);
242
+
243
+ // Detener el sistema después de 60 segundos
244
+ setTimeout(() => {
245
+ console.log("\nDeteniendo el sistema de colas...");
246
+ queueIntegration.stop();
247
+ console.log('Sistema de colas detenido');
248
+
249
+ // Mostrar estado final
250
+ console.log('\n--- Estado final del sistema de colas ---');
251
+ const finalStatus = queueIntegration.getStatus();
252
+ for (const [queueName, queueStatus] of Object.entries(finalStatus)) {
253
+ console.log(`${queueName}: Pendientes=${queueStatus.pendingTasks}, En proceso=${queueStatus.runningTasks}, Fallidas=${queueStatus.failedTasks}`);
254
+ }
255
+ console.log('------------------------------------------\n');
256
+ }, 60000);
257
+ }
258
+
259
+ // Exportar para que pueda ser usado en otros lugares
260
+ module.exports = {
261
+ QueueIntegration,
262
+ ejemploDeUso
263
+ };
264
+
265
+ // Si este archivo se ejecuta directamente, correr el ejemplo
266
+ if (require.main === module) {
267
+ ejemploDeUso();
268
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Integración del Sistema de Colas para el framework JERK
3
+ * Implementación del componente queue/integration.js
4
+ * Archivo de integración para usar el sistema de colas como extensión del framework
5
+ */
6
+
7
+ const { queueSystem } = require('./GlobalQueueStorage');
8
+
9
+ class QueueIntegration {
10
+ /**
11
+ * Constructor de la integración
12
+ * @param {Object} options - Opciones de configuración
13
+ */
14
+ constructor(options = {}) {
15
+ // Usar el sistema de colas global
16
+ this.queueSystem = queueSystem;
17
+
18
+ // Obtener los hooks del framework
19
+ try {
20
+ const framework = require('../../index.js');
21
+ this.globalHooks = framework.hooks;
22
+ } catch (error) {
23
+ // Si no está disponible, crear instancia local
24
+ const HookSystem = require('../core/hooks');
25
+ this.globalHooks = new HookSystem();
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Inicializa la integración con el framework
31
+ * @param {Object} frameworkInstance - Instancia del framework JERK
32
+ */
33
+ initialize(frameworkInstance) {
34
+ // Registrar el sistema de colas en la instancia del framework
35
+ frameworkInstance.queueSystem = this.queueSystem;
36
+
37
+ // Disparar hook cuando se inicializa la integración
38
+ this.globalHooks.doAction('queue_integration_initialized', this.queueSystem);
39
+ }
40
+
41
+ /**
42
+ * Obtiene el sistema de colas
43
+ * @returns {QueueSystem} - Instancia del sistema de colas
44
+ */
45
+ getQueueSystem() {
46
+ return this.queueSystem;
47
+ }
48
+
49
+ /**
50
+ * Crea una cola específica con hooks personalizados
51
+ * @param {string} queueName - Nombre de la cola
52
+ * @param {Object} options - Opciones específicas para la cola
53
+ * @param {Object} hooks - Sistema de hooks específico para esta cola (opcional)
54
+ * @returns {Object} - Cola creada
55
+ */
56
+ createQueue(queueName, options = {}, hooks = null) {
57
+ // Si se proporcionan hooks específicos para esta cola, usarlos
58
+ if (hooks) {
59
+ options.hooks = hooks;
60
+ }
61
+
62
+ // Crear la cola con las opciones
63
+ return this.queueSystem.getOrCreateQueue(queueName, options);
64
+ }
65
+
66
+ /**
67
+ * Agrega una tarea a una cola
68
+ * @param {string} queueName - Nombre de la cola
69
+ * @param {Function} task - Función que representa la tarea
70
+ * @param {Object} data - Datos para la tarea
71
+ * @param {number} priority - Prioridad de la tarea
72
+ * @returns {string} - ID único de la tarea
73
+ */
74
+ addTask(queueName, task, data = {}, priority = 0) {
75
+ return this.queueSystem.addTask(queueName, task, data, priority);
76
+ }
77
+
78
+ /**
79
+ * Inicia la ejecución de tareas en todas las colas
80
+ */
81
+ start() {
82
+ this.queueSystem.start();
83
+ }
84
+
85
+ /**
86
+ * Detiene la ejecución de tareas en todas las colas
87
+ */
88
+ stop() {
89
+ this.queueSystem.stop();
90
+ }
91
+
92
+ /**
93
+ * Obtiene el estado actual del sistema de colas
94
+ * @returns {Object} - Estado del sistema de colas
95
+ */
96
+ getStatus() {
97
+ return this.queueSystem.getStatus();
98
+ }
99
+
100
+ /**
101
+ * Reintenta todas las tareas fallidas en una cola específica
102
+ * @param {string} queueName - Nombre de la cola
103
+ */
104
+ retryFailedTasks(queueName) {
105
+ this.queueSystem.retryFailedTasks(queueName);
106
+ }
107
+ }
108
+
109
+ module.exports = QueueIntegration;