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.
- package/CHANGELOG.md +26 -1
- package/ESTADISTICAS_RENDIMIENTO.md +106 -0
- package/README.md +67 -2
- package/debug_hook.js +11 -0
- package/doc-2.5/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/doc-2.5/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/doc-2.5/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/doc-2.5/CACHE_SYSTEM_MAP.md +206 -0
- package/docs/CACHE_SYSTEM_MAP.md +206 -0
- package/index.js +7 -1
- package/lib/admin/AdminExtension.js +436 -0
- package/lib/admin/ModuleLoader.js +77 -0
- package/lib/admin/config.js +21 -0
- package/lib/admin/modules/CacheModule.js +145 -0
- package/lib/admin/modules/STATS_MODULE_README.md +98 -0
- package/lib/admin/modules/StatsModule.js +140 -0
- package/lib/admin/modules/SystemModule.js +140 -0
- package/lib/admin/modules/TimeModule.js +95 -0
- package/lib/cache/CacheHooks.js +141 -0
- package/lib/core/server.js +153 -10
- package/lib/mvc/viewEngine.js +26 -1
- package/lib/router/RouteMatcher.js +242 -54
- package/lib/utils/globalStats.js +16 -0
- package/package.json +2 -2
|
@@ -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
|