jerkjs 2.5.6 → 2.5.8

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.
@@ -0,0 +1,232 @@
1
+ # Manual de Integración de la Extensión de Administración
2
+
3
+ ## Introducción
4
+
5
+ Este manual explica cómo integrar la extensión de administración de JERK Framework en tus proyectos. La extensión proporciona un servidor TCP de administración que permite monitorear y gestionar tu aplicación en tiempo real.
6
+
7
+ ## Características
8
+
9
+ - **Servidor TCP de administración**: Accesible solo desde localhost por seguridad
10
+ - **Monitoreo en tiempo real**: Visualización de rutas registradas y activas
11
+ - **Sistema de módulos extensible**: Arquitectura para añadir nuevas funcionalidades
12
+ - **Integración con hooks**: Sistema de extensibilidad basado en el sistema de hooks del framework
13
+ - **Puerto configurable**: Por defecto en el puerto 9999
14
+
15
+ ## Requisitos Previos
16
+
17
+ - JERK Framework v2.5.8 o superior
18
+ - Node.js 14.0.0 o superior
19
+ - Acceso a la instancia del servidor APIServer
20
+
21
+ ## Instalación
22
+
23
+ La extensión de administración ya viene incluida en JERK Framework v2.5.8+, por lo que no requiere instalación adicional.
24
+
25
+ ## Integración Básica
26
+
27
+ ### Método 1: Inicialización Directa
28
+
29
+ ```javascript
30
+ const { APIServer } = require('jerkjs');
31
+
32
+ const server = new APIServer({ port: 3000 });
33
+
34
+ // Inicializar la extensión de administración
35
+ server.initializeAdminExtension({
36
+ port: 9999,
37
+ host: '127.0.0.1' // Solo localhost (recomendado)
38
+ });
39
+
40
+ server.start();
41
+ ```
42
+
43
+ ### Método 2: Con Opciones Personalizadas
44
+
45
+ ```javascript
46
+ const { APIServer } = require('jerkjs');
47
+
48
+ const server = new APIServer({
49
+ port: 3000,
50
+ host: 'localhost'
51
+ });
52
+
53
+ // Inicializar con opciones personalizadas
54
+ server.initializeAdminExtension({
55
+ port: 9999, // Puerto personalizado (por defecto: 9999)
56
+ host: '127.0.0.1' // Host personalizado (por defecto: '127.0.0.1')
57
+ });
58
+
59
+ server.start();
60
+ ```
61
+
62
+ ## Integración con Carga de Rutas
63
+
64
+ ### Recomendado: Después de Cargar Rutas
65
+
66
+ Para asegurar que la extensión capture todas las rutas registradas, es recomendable inicializarla después de cargar las rutas:
67
+
68
+ ```javascript
69
+ const {
70
+ APIServer,
71
+ RouteDirectoryLoader,
72
+ ViewEngine,
73
+ ModelManager
74
+ } = require('jerkjs');
75
+
76
+ const server = new APIServer({ port: 3000 });
77
+
78
+ // Configurar otros componentes
79
+ const viewEngine = new ViewEngine({ viewsDir: './views' });
80
+ const modelManager = new ModelManager();
81
+ server.viewEngine = viewEngine;
82
+ server.modelManager = modelManager;
83
+
84
+ // Cargar rutas desde directorio
85
+ const routeDirectoryLoader = new RouteDirectoryLoader();
86
+ routeDirectoryLoader.loadRoutesFromDirectory(server, './routes')
87
+ .then(routes => {
88
+ console.log(`${routes.length} rutas cargadas exitosamente`);
89
+
90
+ // Inicializar la extensión de administración DESPUÉS de cargar rutas
91
+ server.initializeAdminExtension({
92
+ port: 9999,
93
+ host: '127.0.0.1'
94
+ });
95
+
96
+ // Iniciar el servidor
97
+ server.start();
98
+ })
99
+ .catch(error => {
100
+ console.error('Error cargando rutas:', error.message);
101
+ });
102
+ ```
103
+
104
+ ## Integración en Diferentes Puntos del Ciclo de Vida
105
+
106
+ ### Durante la Configuración del Servidor
107
+
108
+ ```javascript
109
+ const { APIServer, SessionManager } = require('jerkjs');
110
+
111
+ const server = new APIServer({ port: 3000 });
112
+
113
+ // Configurar sesión
114
+ const sessionManager = new SessionManager();
115
+ server.use(sessionManager.middleware());
116
+
117
+ // Inicializar extensión de administración en cualquier punto
118
+ server.initializeAdminExtension({
119
+ port: 9999,
120
+ host: '127.0.0.1'
121
+ });
122
+
123
+ server.start();
124
+ ```
125
+
126
+ ### Usando el Hook de Inicialización de Extensiones (Recomendado)
127
+
128
+ Para garantizar que la extensión se inicialice después de que todas las rutas hayan sido completamente cargadas y el servidor esté operativo, puedes usar el hook `admin_extensions_initialize`:
129
+
130
+ ```javascript
131
+ const { hooks } = require('jerkjs');
132
+
133
+ // Registrar un listener para el hook de inicialización de extensiones
134
+ hooks.addAction('admin_extensions_initialize', (server) => {
135
+ // Inicializar la extensión de administración después de que el servidor esté completamente iniciado
136
+ server.initializeAdminExtension({
137
+ port: 9999,
138
+ host: '127.0.0.1'
139
+ });
140
+ });
141
+ ```
142
+
143
+ Este enfoque garantiza que la extensión de administración se inicialice en el momento óptimo del ciclo de vida del servidor, después de que todas las rutas hayan sido cargadas y el servidor esté completamente operativo.
144
+
145
+ ### En Middleware o Controladores
146
+
147
+ La extensión se puede inicializar en cualquier momento, incluso en middleware o controladores, aunque no es recomendable:
148
+
149
+ ```javascript
150
+ // En un archivo de middleware
151
+ function initializeAdminIfNotExists(req, res, next) {
152
+ if (!req.server.adminExtension) {
153
+ req.server.initializeAdminExtension({
154
+ port: 9999,
155
+ host: '127.0.0.1'
156
+ });
157
+ }
158
+ next();
159
+ }
160
+ ```
161
+
162
+ ## Comandos Disponibles
163
+
164
+ Una vez iniciada la extensión, puedes conectarte usando telnet o nc:
165
+
166
+ ```bash
167
+ telnet localhost 9999
168
+ # o
169
+ nc localhost 9999
170
+ ```
171
+
172
+ ### Comandos del Módulo de Rutas:
173
+ - `routes` - Muestra las rutas registradas
174
+ - `active` - Muestra las rutas activas (solicitudes recientes)
175
+
176
+ ### Comandos del Módulo de Sistema:
177
+ - `version` - Muestra la versión del framework
178
+ - `status` - Muestra el estado del servidor
179
+ - `help` - Muestra la ayuda
180
+
181
+ ### Comandos Generales:
182
+ - `help` - Muestra la ayuda general
183
+ - `quit` - Cierra la conexión
184
+
185
+ ## Seguridad
186
+
187
+ - El servidor de administración solo escucha en localhost (127.0.0.1) por defecto
188
+ - No es accesible desde fuera de la máquina local
189
+ - Se recomienda mantener el puerto 9999 (o el puerto elegido) detrás del firewall
190
+ - No enviar información sensible a través de la conexión de administración
191
+
192
+ ## Configuración Avanzada
193
+
194
+ ### Puerto Personalizado
195
+
196
+ ```javascript
197
+ server.initializeAdminExtension({
198
+ port: 8888, // Puerto personalizado
199
+ host: '127.0.0.1'
200
+ });
201
+ ```
202
+
203
+ ### Múltiples Instancias (No Recomendado)
204
+
205
+ Aunque técnicamente posible, no se recomienda inicializar múltiples extensiones de administración en el mismo servidor.
206
+
207
+ ## Troubleshooting
208
+
209
+ ### El comando `routes` no muestra rutas
210
+ - Asegúrate de que la extensión se inicialice después de cargar las rutas
211
+ - Verifica que las rutas se hayan registrado correctamente
212
+
213
+ ### No puedo conectarme al puerto
214
+ - Verifica que el puerto esté disponible
215
+ - Asegúrate de que el firewall no esté bloqueando la conexión
216
+ - Confirma que la extensión se haya inicializado correctamente
217
+
218
+ ### Comandos no reconocidos
219
+ - Asegúrate de estar usando la versión correcta de JERK Framework
220
+ - Verifica que la extensión se haya inicializado correctamente
221
+
222
+ ## Buenas Prácticas
223
+
224
+ 1. **Inicializar después de cargar rutas**: Para capturar todas las rutas registradas
225
+ 2. **Usar localhost**: Siempre usar 127.0.0.1 como host para seguridad
226
+ 3. **Puerto dedicado**: Usar un puerto diferente al del servidor web principal
227
+ 4. **Entornos de desarrollo**: Adecuado para entornos de desarrollo y pruebas
228
+ 5. **No en producción**: No se recomienda usar en entornos de producción sin medidas de seguridad adicionales
229
+
230
+ ## Conclusión
231
+
232
+ La extensión de administración se integra de forma transparente en JERK Framework y proporciona herramientas poderosas para monitorear y gestionar tu aplicación. La integración es simple y flexible, permitiendo inicializarla en cualquier punto del ciclo de vida del servidor.
@@ -0,0 +1,206 @@
1
+ # Mapa de Procesos de Caché del Framework JERK
2
+
3
+ ## Introducción
4
+
5
+ Este documento describe los diferentes sistemas de caché implementados en el framework JERK y cómo se integran en los flujos del sistema.
6
+
7
+ ## Sistemas de Caché
8
+
9
+ ### 1. Caché de Expresiones Regulares para Rutas (RouteMatcher)
10
+
11
+ **Ubicación**: `lib/router/RouteMatcher.js`
12
+ **Tipo**: Mapa de caché (Map)
13
+ **Propósito**: Almacenar expresiones regulares compiladas para rutas parametrizadas
14
+ **Clave**: Ruta con parámetros (ej. `/users/:id`)
15
+ **Valor**: Expresión regular compilada
16
+ **Flujo de proceso**:
17
+ 1. Al procesar una ruta parametrizada, se convierte a expresión regular
18
+ 2. Antes de compilar, se verifica si ya existe en el cache
19
+ 3. Si existe, se devuelve la expresión regular cacheada
20
+ 4. Si no existe, se compila, se almacena en cache y se devuelve
21
+
22
+ **Beneficios**:
23
+ - Evita compilación repetida de expresiones regulares
24
+ - Mejora el rendimiento de coincidencia de rutas parametrizadas
25
+ - Reduce el uso de CPU en operaciones repetidas
26
+
27
+ ### 2. Caché de Vistas (ViewEngine)
28
+
29
+ **Ubicación**: `lib/mvc/viewEngine.js`
30
+ **Tipo**: Mapa de caché (Map)
31
+ **Propósito**: Almacenar contenido de vistas ya procesadas (sin variables)
32
+ **Clave**: Ruta completa del archivo de vista
33
+ **Valor**: Contenido de la vista procesado (condiciones, bucles, etc. resueltos)
34
+ **Flujo de proceso**:
35
+ 1. Al solicitar una vista, se verifica si está en cache
36
+ 2. Si está en cache, se procesa con las variables y se devuelve
37
+ 3. Si no está en cache, se lee el archivo, se procesa (condiciones, bucles, etc.)
38
+ 4. Si el cache está habilitado, se almacena la vista procesada (sin variables)
39
+ 5. Se procesan las variables y se devuelve el resultado
40
+
41
+ **Beneficios**:
42
+ - Evita lectura repetida de archivos de vistas
43
+ - Evita procesamiento repetido de condiciones y bucles
44
+ - Mejora el rendimiento de renderizado de vistas
45
+
46
+ ### 3. Caché de Controladores (ControllerLoader)
47
+
48
+ **Ubicación**: `lib/loader/controllerLoader.js`
49
+ **Tipo**: Sistema de caché de módulos de Node.js
50
+ **Propósito**: Evitar recarga repetida de módulos de controladores
51
+ **Clave**: Ruta del archivo del controlador
52
+ **Valor**: Instancia del módulo del controlador
53
+ **Flujo de proceso**:
54
+ 1. Al cargar un controlador, se verifica si ya está en el cache de require
55
+ 2. Si no está en cache, se carga y se mantiene en require.cache
56
+ 3. En subsiguientes solicitudes, se devuelve la instancia cacheada
57
+
58
+ **Beneficios**:
59
+ - Evita recarga repetida de módulos
60
+ - Mejora el rendimiento de carga de controladores
61
+ - Reduce el uso de memoria
62
+
63
+ ### 4. Índices de Rutas (RouteMatcher)
64
+
65
+ **Ubicación**: `lib/router/RouteMatcher.js`
66
+ **Tipo**: Mapas de índices y estructuras de datos
67
+ **Propósito**: Optimizar la búsqueda de rutas mediante pre-filtrado
68
+ **Componentes**:
69
+ - `exactRoutes`: Mapa de rutas exactas por método y path
70
+ - `routeBuckets`: Estructura jerárquica por método, número de segmentos y primer segmento
71
+ - `indexesValid`: Bandera para validar si los índices están actualizados
72
+
73
+ **Flujo de proceso**:
74
+ 1. Al registrar rutas, se actualizan los índices
75
+ 2. Al buscar una ruta, se usan los índices para pre-filtrar candidatos
76
+ 3. Se buscan coincidencias exactas primero (más rápido)
77
+ 4. Se buscan rutas parametrizadas solo entre candidatos filtrados
78
+ 5. Se buscan rutas estáticas por prefijo entre candidatos filtrados
79
+
80
+ **Beneficios**:
81
+ - Reduce drásticamente el número de rutas a evaluar
82
+ - Mejora el rendimiento de coincidencia de rutas
83
+ - Escala mejor con un gran número de rutas
84
+
85
+ ## Flujos de Integración de Caché
86
+
87
+ ### Flujo de Procesamiento de Solicitudes
88
+
89
+ ```
90
+ Solicitud HTTP
91
+
92
+ Middleware de seguridad
93
+
94
+ Verificación de índices de rutas (RouteMatcher)
95
+
96
+ → Búsqueda por ruta exacta (más rápida)
97
+
98
+ → Pre-filtrado por número de segmentos y primer segmento
99
+
100
+ → Búsqueda en rutas candidatas
101
+
102
+ → Coincidencia con expresiones regulares (usando cache)
103
+
104
+ Ejecución del handler de la ruta
105
+
106
+ Renderizado de vista (usando cache de vistas)
107
+
108
+ Respuesta HTTP
109
+ ```
110
+
111
+ ### Flujo de Caché de Expresiones Regulares
112
+
113
+ ```
114
+ Solicitud de coincidencia de ruta parametrizada
115
+
116
+ → ¿Está la expresión regular en cache?
117
+
118
+ ┌─────────────┬─────────────┐
119
+ │ SÍ │ NO │
120
+ │ │ │
121
+ │ Devolver │ Compilar │
122
+ │ regex │ expresión │
123
+ │ cacheada │ regular │
124
+ │ │ │
125
+ └─────────────┴─────────────┘
126
+
127
+ Almacenar en cache
128
+
129
+ Usar para coincidencia
130
+ ```
131
+
132
+ ### Flujo de Caché de Vistas
133
+
134
+ ```
135
+ Solicitud de renderizado de vista
136
+
137
+ → ¿Está la vista en cache?
138
+
139
+ ┌─────────────┬─────────────┐
140
+ │ SÍ │ NO │
141
+ │ │ │
142
+ │ Procesar │ Leer archivo│
143
+ │ con vars │ de vista │
144
+ │ │ │
145
+ │ Devolver │ Procesar │
146
+ │ resultado │ condiciónes,│
147
+ │ │ bucles, etc.│
148
+ │ │ │
149
+ │ │ → ¿Cache │
150
+ │ │ habilitado?│
151
+ │ │ ↓ │
152
+ │ │ ┌─────────┼─┐
153
+ │ │ │ SÍ │ │
154
+ │ │ │ │ │
155
+ │ │ │ Almacenar││
156
+ │ │ │ vista en ││
157
+ │ │ │ cache ││
158
+ │ │ └─────────┼─┘
159
+ │ │ │
160
+ └─────────────┴─────────────┘
161
+
162
+ Devolver HTML renderizado
163
+ ```
164
+
165
+ ## Estrategias de Invalidación de Caché
166
+
167
+ ### Caché de Expresiones Regulares
168
+ - No requiere invalidación frecuente
169
+ - Se actualiza automáticamente al cambiar las rutas
170
+
171
+ ### Caché de Vistas
172
+ - Se puede limpiar manualmente con `viewEngine.clearCache()`
173
+ - No se invalida automáticamente (diseñado para vistas estáticas)
174
+
175
+ ### Caché de Controladores
176
+ - Se mantiene durante todo el ciclo de vida del proceso
177
+ - Se puede limpiar manualmente eliminando del `require.cache`
178
+
179
+ ### Índices de Rutas
180
+ - Se actualizan automáticamente al registrar nuevas rutas
181
+ - Se invalidan si cambia el número total de rutas
182
+
183
+ ## Beneficios del Sistema de Caché
184
+
185
+ 1. **Mejora de Rendimiento**: Reducción significativa de operaciones repetidas
186
+ 2. **Eficiencia de CPU**: Menos compilación de expresiones regulares y procesamiento de vistas
187
+ 3. **Eficiencia de I/O**: Menos lecturas de disco para archivos de vistas
188
+ 4. **Escalabilidad**: Mejor manejo de alto volumen de solicitudes
189
+ 5. **Optimización de Memoria**: Reutilización de estructuras de datos ya procesadas
190
+
191
+ ## Consideraciones de Seguridad
192
+
193
+ - Las cachés no almacenan datos sensibles de usuarios
194
+ - Las expresiones regulares cacheadas no contienen información de entrada del usuario
195
+ - Las vistas cacheadas no contienen datos de sesión o variables de usuario
196
+ - El sistema de caché no expone información interna del sistema
197
+
198
+ ## Conclusión
199
+
200
+ El framework JERK implementa múltiples niveles de caché para optimizar el rendimiento:
201
+ - Caché de expresiones regulares para rutas parametrizadas
202
+ - Caché de vistas procesadas
203
+ - Índices optimizados para búsqueda de rutas
204
+ - Caché de módulos de controladores
205
+
206
+ Estos sistemas de caché trabajan juntos para proporcionar un rendimiento óptimo al minimizar operaciones repetidas y maximizar la eficiencia del procesamiento de solicitudes.
@@ -0,0 +1,206 @@
1
+ # Mapa de Procesos de Caché del Framework JERK
2
+
3
+ ## Introducción
4
+
5
+ Este documento describe los diferentes sistemas de caché implementados en el framework JERK y cómo se integran en los flujos del sistema.
6
+
7
+ ## Sistemas de Caché
8
+
9
+ ### 1. Caché de Expresiones Regulares para Rutas (RouteMatcher)
10
+
11
+ **Ubicación**: `lib/router/RouteMatcher.js`
12
+ **Tipo**: Mapa de caché (Map)
13
+ **Propósito**: Almacenar expresiones regulares compiladas para rutas parametrizadas
14
+ **Clave**: Ruta con parámetros (ej. `/users/:id`)
15
+ **Valor**: Expresión regular compilada
16
+ **Flujo de proceso**:
17
+ 1. Al procesar una ruta parametrizada, se convierte a expresión regular
18
+ 2. Antes de compilar, se verifica si ya existe en el cache
19
+ 3. Si existe, se devuelve la expresión regular cacheada
20
+ 4. Si no existe, se compila, se almacena en cache y se devuelve
21
+
22
+ **Beneficios**:
23
+ - Evita compilación repetida de expresiones regulares
24
+ - Mejora el rendimiento de coincidencia de rutas parametrizadas
25
+ - Reduce el uso de CPU en operaciones repetidas
26
+
27
+ ### 2. Caché de Vistas (ViewEngine)
28
+
29
+ **Ubicación**: `lib/mvc/viewEngine.js`
30
+ **Tipo**: Mapa de caché (Map)
31
+ **Propósito**: Almacenar contenido de vistas ya procesadas (sin variables)
32
+ **Clave**: Ruta completa del archivo de vista
33
+ **Valor**: Contenido de la vista procesado (condiciones, bucles, etc. resueltos)
34
+ **Flujo de proceso**:
35
+ 1. Al solicitar una vista, se verifica si está en cache
36
+ 2. Si está en cache, se procesa con las variables y se devuelve
37
+ 3. Si no está en cache, se lee el archivo, se procesa (condiciones, bucles, etc.)
38
+ 4. Si el cache está habilitado, se almacena la vista procesada (sin variables)
39
+ 5. Se procesan las variables y se devuelve el resultado
40
+
41
+ **Beneficios**:
42
+ - Evita lectura repetida de archivos de vistas
43
+ - Evita procesamiento repetido de condiciones y bucles
44
+ - Mejora el rendimiento de renderizado de vistas
45
+
46
+ ### 3. Caché de Controladores (ControllerLoader)
47
+
48
+ **Ubicación**: `lib/loader/controllerLoader.js`
49
+ **Tipo**: Sistema de caché de módulos de Node.js
50
+ **Propósito**: Evitar recarga repetida de módulos de controladores
51
+ **Clave**: Ruta del archivo del controlador
52
+ **Valor**: Instancia del módulo del controlador
53
+ **Flujo de proceso**:
54
+ 1. Al cargar un controlador, se verifica si ya está en el cache de require
55
+ 2. Si no está en cache, se carga y se mantiene en require.cache
56
+ 3. En subsiguientes solicitudes, se devuelve la instancia cacheada
57
+
58
+ **Beneficios**:
59
+ - Evita recarga repetida de módulos
60
+ - Mejora el rendimiento de carga de controladores
61
+ - Reduce el uso de memoria
62
+
63
+ ### 4. Índices de Rutas (RouteMatcher)
64
+
65
+ **Ubicación**: `lib/router/RouteMatcher.js`
66
+ **Tipo**: Mapas de índices y estructuras de datos
67
+ **Propósito**: Optimizar la búsqueda de rutas mediante pre-filtrado
68
+ **Componentes**:
69
+ - `exactRoutes`: Mapa de rutas exactas por método y path
70
+ - `routeBuckets`: Estructura jerárquica por método, número de segmentos y primer segmento
71
+ - `indexesValid`: Bandera para validar si los índices están actualizados
72
+
73
+ **Flujo de proceso**:
74
+ 1. Al registrar rutas, se actualizan los índices
75
+ 2. Al buscar una ruta, se usan los índices para pre-filtrar candidatos
76
+ 3. Se buscan coincidencias exactas primero (más rápido)
77
+ 4. Se buscan rutas parametrizadas solo entre candidatos filtrados
78
+ 5. Se buscan rutas estáticas por prefijo entre candidatos filtrados
79
+
80
+ **Beneficios**:
81
+ - Reduce drásticamente el número de rutas a evaluar
82
+ - Mejora el rendimiento de coincidencia de rutas
83
+ - Escala mejor con un gran número de rutas
84
+
85
+ ## Flujos de Integración de Caché
86
+
87
+ ### Flujo de Procesamiento de Solicitudes
88
+
89
+ ```
90
+ Solicitud HTTP
91
+
92
+ Middleware de seguridad
93
+
94
+ Verificación de índices de rutas (RouteMatcher)
95
+
96
+ → Búsqueda por ruta exacta (más rápida)
97
+
98
+ → Pre-filtrado por número de segmentos y primer segmento
99
+
100
+ → Búsqueda en rutas candidatas
101
+
102
+ → Coincidencia con expresiones regulares (usando cache)
103
+
104
+ Ejecución del handler de la ruta
105
+
106
+ Renderizado de vista (usando cache de vistas)
107
+
108
+ Respuesta HTTP
109
+ ```
110
+
111
+ ### Flujo de Caché de Expresiones Regulares
112
+
113
+ ```
114
+ Solicitud de coincidencia de ruta parametrizada
115
+
116
+ → ¿Está la expresión regular en cache?
117
+
118
+ ┌─────────────┬─────────────┐
119
+ │ SÍ │ NO │
120
+ │ │ │
121
+ │ Devolver │ Compilar │
122
+ │ regex │ expresión │
123
+ │ cacheada │ regular │
124
+ │ │ │
125
+ └─────────────┴─────────────┘
126
+
127
+ Almacenar en cache
128
+
129
+ Usar para coincidencia
130
+ ```
131
+
132
+ ### Flujo de Caché de Vistas
133
+
134
+ ```
135
+ Solicitud de renderizado de vista
136
+
137
+ → ¿Está la vista en cache?
138
+
139
+ ┌─────────────┬─────────────┐
140
+ │ SÍ │ NO │
141
+ │ │ │
142
+ │ Procesar │ Leer archivo│
143
+ │ con vars │ de vista │
144
+ │ │ │
145
+ │ Devolver │ Procesar │
146
+ │ resultado │ condiciónes,│
147
+ │ │ bucles, etc.│
148
+ │ │ │
149
+ │ │ → ¿Cache │
150
+ │ │ habilitado?│
151
+ │ │ ↓ │
152
+ │ │ ┌─────────┼─┐
153
+ │ │ │ SÍ │ │
154
+ │ │ │ │ │
155
+ │ │ │ Almacenar││
156
+ │ │ │ vista en ││
157
+ │ │ │ cache ││
158
+ │ │ └─────────┼─┘
159
+ │ │ │
160
+ └─────────────┴─────────────┘
161
+
162
+ Devolver HTML renderizado
163
+ ```
164
+
165
+ ## Estrategias de Invalidación de Caché
166
+
167
+ ### Caché de Expresiones Regulares
168
+ - No requiere invalidación frecuente
169
+ - Se actualiza automáticamente al cambiar las rutas
170
+
171
+ ### Caché de Vistas
172
+ - Se puede limpiar manualmente con `viewEngine.clearCache()`
173
+ - No se invalida automáticamente (diseñado para vistas estáticas)
174
+
175
+ ### Caché de Controladores
176
+ - Se mantiene durante todo el ciclo de vida del proceso
177
+ - Se puede limpiar manualmente eliminando del `require.cache`
178
+
179
+ ### Índices de Rutas
180
+ - Se actualizan automáticamente al registrar nuevas rutas
181
+ - Se invalidan si cambia el número total de rutas
182
+
183
+ ## Beneficios del Sistema de Caché
184
+
185
+ 1. **Mejora de Rendimiento**: Reducción significativa de operaciones repetidas
186
+ 2. **Eficiencia de CPU**: Menos compilación de expresiones regulares y procesamiento de vistas
187
+ 3. **Eficiencia de I/O**: Menos lecturas de disco para archivos de vistas
188
+ 4. **Escalabilidad**: Mejor manejo de alto volumen de solicitudes
189
+ 5. **Optimización de Memoria**: Reutilización de estructuras de datos ya procesadas
190
+
191
+ ## Consideraciones de Seguridad
192
+
193
+ - Las cachés no almacenan datos sensibles de usuarios
194
+ - Las expresiones regulares cacheadas no contienen información de entrada del usuario
195
+ - Las vistas cacheadas no contienen datos de sesión o variables de usuario
196
+ - El sistema de caché no expone información interna del sistema
197
+
198
+ ## Conclusión
199
+
200
+ El framework JERK implementa múltiples niveles de caché para optimizar el rendimiento:
201
+ - Caché de expresiones regulares para rutas parametrizadas
202
+ - Caché de vistas procesadas
203
+ - Índices optimizados para búsqueda de rutas
204
+ - Caché de módulos de controladores
205
+
206
+ Estos sistemas de caché trabajan juntos para proporcionar un rendimiento óptimo al minimizar operaciones repetidas y maximizar la eficiencia del procesamiento de solicitudes.
package/index.js CHANGED
@@ -48,6 +48,9 @@ const ModelControllerExample = require('./lib/mvc/ModelControllerExample');
48
48
 
49
49
  // Componentes de manejo de errores
50
50
  const { ErrorHandler, ValidationError, AuthenticationError, DatabaseError } = require('./lib/utils/errorHandler');
51
+
52
+ // Componentes de caché
53
+ const CacheHooks = require('./lib/cache/CacheHooks');
51
54
  // Componentes del QueryBuilder (v2.3.0) - MODIFICADO PARA USAR QBUILDERJS
52
55
  const QueryBuilder = require('qbuilderjs');
53
56
  // No hay middleware ni hooks ya que se eliminó la implementación interna
@@ -113,7 +116,10 @@ module.exports = {
113
116
  ErrorHandler,
114
117
  ValidationError,
115
118
  AuthenticationError,
116
- DatabaseError
119
+ DatabaseError,
120
+
121
+ // Componentes de administración (v2.5.7)
122
+ AdminExtension: require('./lib/admin/AdminExtension')
117
123
  };
118
124
 
119
125
  // También exportar clases individuales por conveniencia