jerkjs 2.5.4 → 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/BENCHMARK_RESULTS.md +60 -0
- package/CHANGELOG.md +43 -0
- package/ESTADISTICAS_RENDIMIENTO.md +106 -0
- package/README.md +142 -423
- package/README_LEGACY.md +513 -0
- 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/doc-2.5/SESSION_SECURITY_FLAGS.md +174 -0
- package/doc-2.5/an/303/241lisis-completo-jerk-framework.md +213 -0
- package/docs/CACHE_SYSTEM_MAP.md +206 -0
- package/docs/SERVER_OPTIMIZATION_NOTES.md +87 -0
- package/index.js +7 -1
- package/jerk2.5.webp +0 -0
- 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 +199 -46
- package/lib/middleware/session.js +11 -3
- 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
- package/@qaLoadModel/controllers/ProductController.js +0 -143
- package/@qaLoadModel/controllers/UserController.js +0 -143
- package/@qaLoadModel/models/ProductModel.js +0 -41
- package/@qaLoadModel/models/UserModel.js +0 -41
- package/@qaLoadModel/package.json +0 -22
- package/@qaLoadModel/qa_report.md +0 -71
- package/@qaLoadModel/results.md +0 -97
- package/@qaLoadModel/routes.json +0 -58
- package/@qaLoadModel/server.js +0 -43
- package/@qaLoadModel/simple-test.js +0 -96
- package/@qaLoadModel/test-models.js +0 -144
- package/@qaLoadModel/test_endpoints.sh +0 -35
- package/@qaLoadModel/test_final.js +0 -89
- package/@qaLoadModel/views/products/index.html +0 -45
- package/@qaLoadModel/views/products/show.html +0 -27
- package/@qaLoadModel/views/users/index.html +0 -44
- package/@qaLoadModel/views/users/show.html +0 -26
- package/qa/INFORME_QA_JERKJS_ROUTING.md +0 -108
- package/qa/informe_qa_fix_enrutamiento.md +0 -93
- package/qa-app/controllers/homeController.js +0 -9
- package/qa-app/controllers/userController.js +0 -76
- package/qa-app/hooks-config.js +0 -65
- package/qa-app/models/UserModel.js +0 -36
- package/qa-app/package-lock.json +0 -1683
- package/qa-app/package.json +0 -25
- package/qa-app/public/css/style.css +0 -15
- package/qa-app/public/images/logo.png +0 -3
- package/qa-app/public/index.html +0 -15
- package/qa-app/public/js/main.js +0 -7
- package/qa-app/routes/api-routes.json +0 -23
- package/qa-app/routes/page-routes.json +0 -16
- package/qa-app/routes/static-routes.json +0 -20
- package/qa-app/server.js +0 -68
- package/qa-app/views/footer.html +0 -3
- package/qa-app/views/index.html +0 -20
- package/qa-app/views/users.html +0 -20
- package/utils/find_file_path.sh +0 -36
- /package/{doc2.5.3 → doc-2.5}/manual-mvc-completo.md +0 -0
package/README.md
CHANGED
|
@@ -1,217 +1,99 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-

|
|
4
|
-
|
|
5
|
-
**¿Nuevo en JERK? Comienza tu proyecto rápidamente con nuestro Starter Kit**
|
|
6
|
-
|
|
7
|
-
Nuestro Starter Kit en `standard/server.js` es la forma más rápida de comenzar con JERK. Viene con todas las funcionalidades del framework ya configuradas, permitiéndote concentrarte en desarrollar tu aplicación en lugar de configurar infraestructura.
|
|
8
|
-
|
|
9
|
-
**Características del Starter Kit:**
|
|
10
|
-
- Configuración lista para usar con todos los componentes principales
|
|
11
|
-
- Carga de rutas desde archivo JSON (`routes.json`)
|
|
12
|
-
- Sistema de controladores preconfigurado
|
|
13
|
-
- Middlewares esenciales ya integrados (autenticación, CORS, compresión, firewall, etc.)
|
|
14
|
-
- Sistema de logging y manejo de errores implementado
|
|
15
|
-
- **NUEVO: Arquitectura completa MVC con modelos y soporte para bases de datos**
|
|
16
|
-
- **NUEVO: Compatible con qbuilderjs para consultas SQL seguras y eficientes**
|
|
17
|
-
|
|
18
|
-
**Cómo comenzar:**
|
|
19
|
-
1. Edita el archivo `routes.json` para definir tus rutas y asociarlas a tus controladores
|
|
20
|
-
|
|
21
|
-
Ejemplo básico de `routes.json`:
|
|
22
|
-
```json
|
|
23
|
-
[
|
|
24
|
-
{
|
|
25
|
-
"path": "/",
|
|
26
|
-
"method": "GET",
|
|
27
|
-
"controller": "HomeController",
|
|
28
|
-
"handler": "index",
|
|
29
|
-
"contentType": "text/html"
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"path": "/api/users",
|
|
33
|
-
"method": "GET",
|
|
34
|
-
"controller": "UserController",
|
|
35
|
-
"handler": "getAllUsers",
|
|
36
|
-
"contentType": "application/json"
|
|
37
|
-
}
|
|
38
|
-
]
|
|
39
|
-
```
|
|
1
|
+

|
|
2
|
+
##### JERK Framework v2.5.8
|
|
40
3
|
|
|
41
|
-
|
|
4
|
+
**JERK Framework** es un framework de desarrollo web completo para Node.js que implementa una arquitectura MVC (Modelo-Vista-Controlador) con soporte para APIs REST, seguridad avanzada, y sistemas de plantillas.
|
|
42
5
|
|
|
43
|
-
|
|
44
|
-
```javascript
|
|
45
|
-
class HomeController {
|
|
46
|
-
index(req, res) {
|
|
47
|
-
res.render('index.html', { data: 'Hola' });
|
|
48
|
-
}
|
|
49
|
-
}
|
|
6
|
+
## 🚀 ¡Novedad! Optimización de Rendimiento del Sistema de Enrutamiento
|
|
50
7
|
|
|
51
|
-
|
|
52
|
-
```
|
|
8
|
+
**JERK Framework v2.5.7** incluye una optimización del sistema de enrutamiento que mejora drásticamente el rendimiento:
|
|
53
9
|
|
|
54
|
-
|
|
10
|
+
- **Organización por aridad**: Rutas organizadas por número de segmentos para descartar rápidamente candidatos inválidos
|
|
11
|
+
- **Índices por primer segmento**: "Prefix hints" para filtrar rápidamente rutas candidatas
|
|
12
|
+
- **Reducción del espacio de búsqueda**: Disminución drástica del número de expresiones regulares evaluadas
|
|
13
|
+
- **Resultados impresionantes**: Aumento del rendimiento de 380 a 529+ RPS (39% de mejora) en pruebas con 15,000 solicitudes concurrentes
|
|
55
14
|
|
|
56
|
-
|
|
15
|
+
Esta optimización permite al framework alcanzar más de 500 solicitudes por segundo en hardware modesto, como un procesador Celeron, gracias a la implementación de buckets de rutas basados en la profundidad de la ruta (número de segmentos) y el primer segmento.
|
|
57
16
|
|
|
58
|
-
##
|
|
17
|
+
## 🔧 Extensión de Administración
|
|
59
18
|
|
|
60
|
-
|
|
19
|
+
JERK Framework v2.5.7 incluye una extensión de administración que proporciona:
|
|
61
20
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
"static": {
|
|
69
|
-
"dir": "./public",
|
|
70
|
-
"index": ["index.html", "index.htm"],
|
|
71
|
-
"cacheControl": "public, max-age=3600"
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"path": "/assets",
|
|
76
|
-
"method": "GET",
|
|
77
|
-
"static": {
|
|
78
|
-
"dir": "./public",
|
|
79
|
-
"index": [],
|
|
80
|
-
"cacheControl": "public, max-age=86400"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
]
|
|
84
|
-
```
|
|
21
|
+
- **Servidor TCP de administración**: Accesible solo desde localhost para mayor seguridad
|
|
22
|
+
- **Monitoreo en tiempo real**: Visualización de rutas registradas y activas
|
|
23
|
+
- **Sistema de módulos**: Arquitectura extensible para futuras funcionalidades de administración
|
|
24
|
+
- **Integración con hooks**: Sistema de extensibilidad basado en el sistema de hooks del framework
|
|
25
|
+
- **Puerto configurable**: Por defecto en el puerto 9999
|
|
26
|
+
- **Módulo de estadísticas**: Visualización de métricas del servidor en tiempo real
|
|
85
27
|
|
|
86
|
-
###
|
|
87
|
-
```javascript
|
|
88
|
-
// Ruta estática para servir archivos desde ./public
|
|
89
|
-
server.addRoute({
|
|
90
|
-
method: 'GET',
|
|
91
|
-
path: '/static',
|
|
92
|
-
static: {
|
|
93
|
-
dir: './public',
|
|
94
|
-
index: ['index.html'],
|
|
95
|
-
cacheControl: 'public, max-age=3600'
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
// Ruta estática para servir archivos JS, CSS e imágenes
|
|
100
|
-
server.addRoute('GET', '/assets', {
|
|
101
|
-
static: {
|
|
102
|
-
dir: './public/assets',
|
|
103
|
-
index: [],
|
|
104
|
-
cacheControl: 'public, max-age=86400'
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
```
|
|
28
|
+
### Módulo de Estadísticas
|
|
108
29
|
|
|
109
|
-
|
|
30
|
+
El módulo de estadísticas (disponible desde v2.5.8) proporciona métricas detalladas del servidor:
|
|
110
31
|
|
|
111
|
-
|
|
112
|
-
- **
|
|
32
|
+
- **Cantidad de requests procesados**: Con visualización de kilobytes transferidos
|
|
33
|
+
- **Cantidad de responses enviadas**: Con visualización de kilobytes transferidos
|
|
34
|
+
- **Accesos a rutas**: Registro de accesos a rutas registradas (input/output)
|
|
35
|
+
- **Endpoints y rutas más accedidas**: Visualización de los endpoints y rutas más utilizados
|
|
113
36
|
|
|
114
|
-
|
|
37
|
+
### Comandos disponibles en la extensión de administración:
|
|
115
38
|
|
|
116
|
-
|
|
39
|
+
- `stats` o `statistics`: Muestra estadísticas generales del servidor
|
|
40
|
+
- `requests`: Muestra estadísticas específicas de solicitudes
|
|
41
|
+
- `endpoints`: Muestra estadísticas de endpoints y rutas más accedidas
|
|
42
|
+
- `routes`: Muestra rutas registradas y activas
|
|
43
|
+
- `time` y `date`: Muestra hora y fecha actual
|
|
44
|
+
- `sysinfo`, `system`, `resources`: Muestra información del sistema
|
|
117
45
|
|
|
118
|
-
###
|
|
119
|
-
- Organización por funcionalidad (usuarios, autenticación, API, etc.)
|
|
120
|
-
- Mayor mantenibilidad en proyectos grandes
|
|
121
|
-
- Detección automática de rutas duplicadas
|
|
122
|
-
- Mensajes de advertencia coloreados para rutas sobreescritas
|
|
123
|
-
- Recarga automática de rutas en desarrollo
|
|
124
|
-
|
|
125
|
-
### Uso del RouteDirectoryLoader:
|
|
46
|
+
### Uso de la extensión de administración:
|
|
126
47
|
|
|
127
48
|
```javascript
|
|
128
|
-
const { APIServer
|
|
49
|
+
const { APIServer } = require('jerkjs');
|
|
129
50
|
|
|
130
51
|
const server = new APIServer({ port: 3000 });
|
|
131
|
-
const routeDirectoryLoader = new RouteDirectoryLoader();
|
|
132
52
|
|
|
133
|
-
//
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
})
|
|
139
|
-
.catch(error => {
|
|
140
|
-
console.error('Error cargando rutas desde directorio:', error.message);
|
|
141
|
-
});
|
|
142
|
-
```
|
|
53
|
+
// Iniciar la extensión de administración
|
|
54
|
+
server.initializeAdminExtension({
|
|
55
|
+
port: 9999,
|
|
56
|
+
host: '127.0.0.1' // Solo localhost
|
|
57
|
+
});
|
|
143
58
|
|
|
144
|
-
|
|
145
|
-
```
|
|
146
|
-
routes/
|
|
147
|
-
├── api-routes.json
|
|
148
|
-
├── auth-routes.json
|
|
149
|
-
├── static-routes.json
|
|
150
|
-
└── user-routes.json
|
|
59
|
+
server.start();
|
|
151
60
|
```
|
|
152
61
|
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
{
|
|
157
|
-
"path": "/api/users",
|
|
158
|
-
"method": "GET",
|
|
159
|
-
"controller": "./controllers/userController.js",
|
|
160
|
-
"handler": "getAllUsers",
|
|
161
|
-
"contentType": "application/json"
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
"path": "/api/users/:id",
|
|
165
|
-
"method": "GET",
|
|
166
|
-
"controller": "./controllers/userController.js",
|
|
167
|
-
"handler": "getUserById",
|
|
168
|
-
"contentType": "application/json"
|
|
169
|
-
}
|
|
170
|
-
]
|
|
62
|
+
Una vez iniciado, puedes conectarte al servidor de administración usando telnet o nc:
|
|
63
|
+
```bash
|
|
64
|
+
telnet localhost 9999
|
|
171
65
|
```
|
|
172
66
|
|
|
173
|
-
|
|
174
|
-
Cuando el sistema detecta que una ruta ya ha sido definida previamente, muestra mensajes de advertencia:
|
|
67
|
+
## Características Principales
|
|
175
68
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
69
|
+
### 🚀 Rendimiento Optimizado
|
|
70
|
+
- Servidor HTTP/HTTPS de alto rendimiento
|
|
71
|
+
- Optimizaciones de rendimiento en el manejo de solicitudes
|
|
72
|
+
- Carga anticipada de módulos comunes para evitar operaciones redundantes
|
|
73
|
+
- Manejo eficiente de rutas estáticas y dinámicas
|
|
180
74
|
|
|
181
|
-
|
|
182
|
-
-
|
|
75
|
+
### 🔐 Seguridad Avanzada
|
|
76
|
+
- Sistema de sesiones con cookies seguras personalizables
|
|
77
|
+
- Filtros para personalizar flags de seguridad de cookies (`Secure`, `SameSite`, etc.)
|
|
78
|
+
- Web Application Firewall (WAF) con detección de patrones de ataque
|
|
79
|
+
- Sistema de autenticación con múltiples estrategias (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect)
|
|
80
|
+
- Protección contra SQL Injection, XSS y otros ataques comunes
|
|
183
81
|
|
|
184
|
-
###
|
|
185
|
-
|
|
82
|
+
### 🏗️ Arquitectura Modular
|
|
83
|
+
- Componentes independientes para mayor flexibilidad
|
|
84
|
+
- Sistema de hooks y filtros similar al de WordPress
|
|
85
|
+
- Soporte para middlewares personalizados
|
|
86
|
+
- Arquitectura MVC completa con modelos, vistas y controladores
|
|
186
87
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
88
|
+
### 📊 Soporte para Bases de Datos
|
|
89
|
+
- Adaptadores para diferentes motores de base de datos (Memory, MariaDB/MySQL, SQLite)
|
|
90
|
+
- Integración con QueryBuilder externo (qbuilderjs) para construir consultas SQL seguras
|
|
91
|
+
- Sistema de modelos con operaciones CRUD completas
|
|
191
92
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
- **Arquitectura Modular**: Componentes independientes para mayor flexibilidad
|
|
198
|
-
- **Seguridad Avanzada**: Firewall integrado (WAF) con detección de ataques
|
|
199
|
-
- **Sistema de Hooks**: Similar al sistema de WordPress para extensibility
|
|
200
|
-
- **Autenticación Flexible**: Soporte para JWT, API Keys, Basic Auth, OAuth2, OpenID Connect
|
|
201
|
-
- **Almacenamiento de Tokens**: Soporte para memoria, JSON, SQLite y MariaDB
|
|
202
|
-
- **Enrutamiento Avanzado**: Soporte para rutas parametrizadas, anidadas y estáticas
|
|
203
|
-
- **Soporte para Frontend**: Capacidad de servir contenido HTML y otros tipos de contenido
|
|
204
|
-
- **Configuración de Content-Type**: Especificación de headers Content-Type en routes.json
|
|
205
|
-
- **Middlewares Integrados**: CORS, rate limiting, compresión, firewall, etc.
|
|
206
|
-
- **Gestión de Controladores**: Carga dinámica de controladores desde archivos
|
|
207
|
-
- **Carga de Rutas**: Definición de rutas desde archivos JSON
|
|
208
|
-
- **Sistema de Sesiones**: Gestión completa de sesiones con soporte para autenticación
|
|
209
|
-
- **Motor de Plantillas MVC**: Sistema profesional de vistas con soporte para filtros, helpers y hooks
|
|
210
|
-
- **Arquitectura de Modelos Completa (MVC)**: Capa de modelos para la lógica de negocio y acceso a datos
|
|
211
|
-
- **Sistema de Adaptadores de Base de Datos**: Soporte para múltiples motores de base de datos (MariaDB, MySQL, etc.)
|
|
212
|
-
- **Compatible con qbuilderjs**: Soporte para integrar el QueryBuilder externo qbuilderjs para construir consultas SQL complejas de manera segura y eficiente
|
|
213
|
-
- **Servicio de Archivos Estáticos**: Soporte para servir archivos desde directorios locales con configuración flexible
|
|
214
|
-
- **Extensibilidad**: Sistema de hooks y filters para personalización
|
|
93
|
+
### 🎨 Motores de Plantillas
|
|
94
|
+
- Motor de plantillas con soporte para variables, condiciones, bucles e inclusiones
|
|
95
|
+
- Filtros y helpers personalizables
|
|
96
|
+
- Soporte para layouts y vistas dinámicas
|
|
215
97
|
|
|
216
98
|
## Instalación
|
|
217
99
|
|
|
@@ -222,80 +104,94 @@ npm install jerkjs
|
|
|
222
104
|
## Uso Básico
|
|
223
105
|
|
|
224
106
|
```javascript
|
|
225
|
-
const { APIServer,
|
|
107
|
+
const { APIServer, RouteDirectoryLoader, ViewEngine, ModelManager, MemoryAdapter } = require('jerkjs');
|
|
226
108
|
|
|
227
109
|
// Crear instancia del servidor
|
|
228
110
|
const server = new APIServer({
|
|
229
|
-
|
|
230
|
-
|
|
111
|
+
port: 3000,
|
|
112
|
+
host: 'localhost'
|
|
231
113
|
});
|
|
232
114
|
|
|
233
|
-
//
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
server.addRoute('GET', '/', (req, res) => {
|
|
238
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
239
|
-
res.end(JSON.stringify({ message: '¡Hola Mundo!' }));
|
|
115
|
+
// Configurar motor de vistas
|
|
116
|
+
const viewEngine = new ViewEngine({
|
|
117
|
+
viewsDir: './views',
|
|
118
|
+
defaultLayout: 'layout.html'
|
|
240
119
|
});
|
|
241
120
|
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
121
|
+
// Configurar sistema de modelos
|
|
122
|
+
const modelManager = new ModelManager();
|
|
123
|
+
const memoryAdapter = new MemoryAdapter();
|
|
124
|
+
modelManager.registerAdapter('memory', memoryAdapter);
|
|
245
125
|
|
|
246
|
-
|
|
126
|
+
// Asociar componentes al servidor
|
|
127
|
+
server.viewEngine = viewEngine;
|
|
128
|
+
server.modelManager = modelManager;
|
|
247
129
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
### Router
|
|
252
|
-
Sistema de enrutamiento avanzado con soporte para rutas anidadas y prefijos.
|
|
253
|
-
|
|
254
|
-
### Authenticator
|
|
255
|
-
Middleware de autenticación con soporte para múltiples métodos (JWT, API Keys, Basic Auth, OAuth2, OpenID Connect).
|
|
256
|
-
|
|
257
|
-
### SecurityEnhancedServer
|
|
258
|
-
Servidor con funcionalidades de seguridad avanzada (WAF) integradas.
|
|
130
|
+
// Cargar rutas desde directorio
|
|
131
|
+
const routeDirectoryLoader = new RouteDirectoryLoader();
|
|
132
|
+
routeDirectoryLoader.loadRoutesFromDirectory(server, './routes');
|
|
259
133
|
|
|
260
|
-
|
|
261
|
-
|
|
134
|
+
// Iniciar el servidor
|
|
135
|
+
server.start();
|
|
136
|
+
```
|
|
262
137
|
|
|
263
|
-
|
|
264
|
-
Gestión de tokens JWT con diferentes tipos de almacenamiento (memoria, JSON, SQLite, MariaDB).
|
|
138
|
+
## Seguridad de Sesiones
|
|
265
139
|
|
|
266
|
-
|
|
267
|
-
Middleware de firewall con detección de patrones de ataque y listas blancas/negras.
|
|
140
|
+
JERK Framework incluye un sistema de sesiones con soporte para personalización de flags de seguridad a través de filtros:
|
|
268
141
|
|
|
269
|
-
|
|
270
|
-
|
|
142
|
+
```javascript
|
|
143
|
+
const { hooks } = require('jerkjs');
|
|
271
144
|
|
|
272
|
-
|
|
273
|
-
|
|
145
|
+
// Personalizar flags de cookies de sesión
|
|
146
|
+
hooks.addFilter('session_cookie_flags', (defaultFlags, req, res, sessionId) => {
|
|
147
|
+
// Detectar si la solicitud es HTTPS
|
|
148
|
+
const isHttps = (req && req.connection && req.connection.encrypted) ||
|
|
149
|
+
(req && req.headers && req.headers['x-forwarded-proto'] === 'https');
|
|
150
|
+
|
|
151
|
+
let flags = defaultFlags;
|
|
152
|
+
|
|
153
|
+
// Agregar la flag Secure si es HTTPS
|
|
154
|
+
if (isHttps) {
|
|
155
|
+
flags += '; Secure';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Agregar SameSite según el contexto
|
|
159
|
+
flags += '; SameSite=Lax';
|
|
160
|
+
|
|
161
|
+
return flags;
|
|
162
|
+
});
|
|
163
|
+
```
|
|
274
164
|
|
|
275
|
-
|
|
276
|
-
Motor de plantillas profesional con soporte para filtros, helpers, condiciones, bucles y hooks.
|
|
165
|
+
## Componentes Principales
|
|
277
166
|
|
|
278
|
-
###
|
|
279
|
-
|
|
167
|
+
### Servidor (APIServer)
|
|
168
|
+
- Servidor HTTP/HTTPS básico con soporte para rutas parametrizadas
|
|
169
|
+
- Manejo de archivos estáticos con soporte para índices y control de caché
|
|
170
|
+
- Sistema de hooks para extensibilidad
|
|
171
|
+
- Soporte para middlewares y manejo de cuerpos de solicitud con límites de tamaño
|
|
280
172
|
|
|
281
|
-
|
|
173
|
+
### Sistema de Enrutamiento
|
|
174
|
+
- Router con soporte para rutas anidadas
|
|
175
|
+
- RouteMatcher para coincidencia de rutas parametrizadas con cacheo de expresiones regulares
|
|
176
|
+
- Soporte para rutas estáticas y dinámicas con prioridad adecuada
|
|
282
177
|
|
|
283
|
-
|
|
178
|
+
### Middleware
|
|
179
|
+
- CORS, Autenticación, Sesiones, Validación, Rate Limiting
|
|
180
|
+
- Compresión (gzip/deflate) con sistema de hooks
|
|
181
|
+
- Firewall (WAF) con detección de patrones de ataque
|
|
182
|
+
- Audit Logger para eventos de seguridad
|
|
284
183
|
|
|
285
|
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
289
|
-
-
|
|
290
|
-
- **Autenticación Robusta**: Soporte para múltiples métodos de autenticación
|
|
184
|
+
### Componentes MVC
|
|
185
|
+
- ControllerBase con soporte para vistas, layouts y variables
|
|
186
|
+
- ModelBase con operaciones CRUD
|
|
187
|
+
- ViewEngine con soporte para filtros, helpers, condiciones, bucles e inclusiones
|
|
188
|
+
- ModelManager con soporte para múltiples adaptadores
|
|
291
189
|
|
|
292
|
-
## Sistema de Hooks
|
|
190
|
+
## Sistema de Hooks y Filtros
|
|
293
191
|
|
|
294
|
-
El framework incluye un sistema de hooks y
|
|
192
|
+
El framework incluye un sistema completo de hooks y filtros similar al de WordPress:
|
|
295
193
|
|
|
296
194
|
```javascript
|
|
297
|
-
const { hooks } = require('jerkjs');
|
|
298
|
-
|
|
299
195
|
// Registrar una acción
|
|
300
196
|
hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
|
|
301
197
|
console.log(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
|
|
@@ -311,203 +207,26 @@ hooks.addFilter('session_create_data', (userData, req) => {
|
|
|
311
207
|
});
|
|
312
208
|
```
|
|
313
209
|
|
|
314
|
-
## Motor de Plantillas MVC
|
|
315
|
-
|
|
316
|
-
El framework incluye un motor de plantillas profesional con soporte para:
|
|
317
|
-
|
|
318
|
-
- Variables: `{{variable}}`
|
|
319
|
-
- Condiciones: `{{if variable}}contenido{{endif}}`
|
|
320
|
-
- Bucles: `{{foreach:array}}contenido{{endforeach}}`
|
|
321
|
-
- Inclusiones: `{{include:header}}`
|
|
322
|
-
- Filtros: `{{variable|upper}}`
|
|
323
|
-
- Helpers personalizados
|
|
324
|
-
|
|
325
|
-
## Gestión de Sesiones
|
|
326
|
-
|
|
327
|
-
El framework incluye un sistema completo de gestión de sesiones:
|
|
328
|
-
|
|
329
|
-
```javascript
|
|
330
|
-
const { SessionManager } = require('jerkjs');
|
|
331
|
-
|
|
332
|
-
const sessionManager = new SessionManager({
|
|
333
|
-
secret: 'your-session-secret',
|
|
334
|
-
timeout: 3600000 // 1 hora
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
// Usar como middleware
|
|
338
|
-
server.use(sessionManager.middleware());
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
## Ejemplos
|
|
342
|
-
|
|
343
|
-
El proyecto incluye varios ejemplos completos:
|
|
344
|
-
|
|
345
|
-
- **v2_json_auth**: Autenticación JWT con tokens almacenados en JSON
|
|
346
|
-
- **v2_mariadb_auth**: Autenticación JWT con tokens almacenados en MariaDB
|
|
347
|
-
- **v2_sqlite_auth**: Autenticación JWT con tokens almacenados en SQLite
|
|
348
|
-
- **public**: API pública de ejemplo con CORS y rate limiting
|
|
349
|
-
- **frontend**: Ejemplo de servidor que combina API y frontend con diferentes content-types
|
|
350
|
-
- **hooks**: Ejemplo avanzado de uso del sistema de hooks con logging y seguimiento de solicitudes
|
|
351
|
-
|
|
352
|
-
Para ver los ejemplos completos, visita los directorios `v2examplle/` y `examples/`.
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
## Documentación
|
|
356
|
-
|
|
357
|
-
Además de la documentación en el README, el proyecto incluye documentación adicional:
|
|
358
|
-
|
|
359
|
-
- **Guía de inicio rápido**: `docs/guia_inicio_rapido_jerkjs.md` - Una guía completa para empezar rápidamente con JERKJS, incluyendo formatos de archivos, estructura de controladores, motor de plantillas y sistema de hooks.
|
|
360
|
-
|
|
361
210
|
## Contribuciones
|
|
362
211
|
|
|
363
|
-
Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request
|
|
212
|
+
Las contribuciones son bienvenidas. Por favor, abre un issue o envía un pull request para sugerir cambios o mejoras.
|
|
364
213
|
|
|
365
214
|
## Licencia
|
|
366
215
|
|
|
367
|
-
Apache 2.0
|
|
216
|
+
Este proyecto está licenciado bajo la Apache License 2.0 - ver el archivo LICENSE para más detalles.
|
|
368
217
|
|
|
369
|
-
##
|
|
218
|
+
## Autor
|
|
370
219
|
|
|
371
|
-
JERK Framework
|
|
220
|
+
JERK Framework Team / Benjamin Sanhez Cardenas
|
|
372
221
|
|
|
373
|
-
|
|
222
|
+
## Repositorio
|
|
374
223
|
|
|
375
|
-
|
|
376
|
-
const { ModelBase, MariaDBAdapter } = require('jerkjs');
|
|
377
|
-
|
|
378
|
-
// Definir un modelo para usuarios
|
|
379
|
-
class UserModel extends ModelBase {
|
|
380
|
-
constructor(options = {}) {
|
|
381
|
-
super({
|
|
382
|
-
...options,
|
|
383
|
-
tableName: options.tableName || 'users'
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
// Definir campos del modelo
|
|
387
|
-
this.fields = {
|
|
388
|
-
id: { type: 'integer', primaryKey: true, autoIncrement: true },
|
|
389
|
-
username: { type: 'string', required: true },
|
|
390
|
-
email: { type: 'string', required: true },
|
|
391
|
-
password: { type: 'string', required: true },
|
|
392
|
-
createdAt: { type: 'datetime', default: 'CURRENT_TIMESTAMP' }
|
|
393
|
-
};
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
// Método personalizado para encontrar usuario por email
|
|
397
|
-
async findByEmail(email) {
|
|
398
|
-
return await this.findOne({ email });
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Método personalizado para crear usuario con validación
|
|
402
|
-
async createUser(userData) {
|
|
403
|
-
// Validar datos antes de crear
|
|
404
|
-
const validation = this.validate('create', userData);
|
|
405
|
-
if (!validation.isValid) {
|
|
406
|
-
throw new Error(`Validación fallida: ${validation.errors.join(', ')}`);
|
|
407
|
-
}
|
|
224
|
+
GitLab: https://gitlab.com/bytedogssyndicate1/jerk
|
|
408
225
|
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
}
|
|
226
|
+
## Informe de Rendimiento del Módulo de Estadísticas
|
|
412
227
|
|
|
413
|
-
|
|
414
|
-
const dbConfig = {
|
|
415
|
-
host: 'localhost',
|
|
416
|
-
user: 'tu_usuario',
|
|
417
|
-
password: 'tu_contraseña',
|
|
418
|
-
database: 'tu_base_de_datos'
|
|
419
|
-
};
|
|
420
|
-
|
|
421
|
-
const mariaDBAdapter = new MariaDBAdapter(dbConfig);
|
|
422
|
-
|
|
423
|
-
// Crear instancia del modelo con el adaptador
|
|
424
|
-
const userModel = new UserModel({
|
|
425
|
-
adapter: mariaDBAdapter,
|
|
426
|
-
tableName: 'users'
|
|
427
|
-
});
|
|
428
|
-
|
|
429
|
-
// Uso del modelo
|
|
430
|
-
async function ejemploUsoModelo() {
|
|
431
|
-
try {
|
|
432
|
-
// Crear un nuevo usuario
|
|
433
|
-
const nuevoUsuario = await userModel.createUser({
|
|
434
|
-
username: 'juan.perez',
|
|
435
|
-
email: 'juan@example.com',
|
|
436
|
-
password: 'contraseña_segura'
|
|
437
|
-
});
|
|
438
|
-
|
|
439
|
-
console.log('Usuario creado:', nuevoUsuario);
|
|
440
|
-
|
|
441
|
-
// Buscar usuario por email
|
|
442
|
-
const usuario = await userModel.findByEmail('juan@example.com');
|
|
443
|
-
console.log('Usuario encontrado:', usuario);
|
|
444
|
-
} catch (error) {
|
|
445
|
-
console.error('Error:', error.message);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
### Uso de Modelos en Controladores con loadModel
|
|
451
|
-
|
|
452
|
-
JERK Framework proporciona un helper `loadModel` en el ControllerBase para facilitar la carga y uso de modelos en los controladores:
|
|
453
|
-
|
|
454
|
-
```javascript
|
|
455
|
-
const ControllerBase = require('jerkjs').ControllerBase;
|
|
456
|
-
|
|
457
|
-
class UserController extends ControllerBase {
|
|
458
|
-
constructor() {
|
|
459
|
-
super();
|
|
460
|
-
|
|
461
|
-
// Cargar el modelo de usuario
|
|
462
|
-
this.userModel = this.loadModel('UserModel', {
|
|
463
|
-
// Opciones del modelo
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
async getAllUsers(req, res) {
|
|
468
|
-
try {
|
|
469
|
-
// Usar el modelo para obtener usuarios
|
|
470
|
-
const users = await this.userModel.find({});
|
|
471
|
-
|
|
472
|
-
this.json(res, { success: true, data: users });
|
|
473
|
-
} catch (error) {
|
|
474
|
-
this.json(res, { success: false, error: error.message }, 500);
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
async getUserById(req, res) {
|
|
479
|
-
try {
|
|
480
|
-
const userId = req.params.id;
|
|
481
|
-
|
|
482
|
-
// Usar el modelo para encontrar un usuario específico
|
|
483
|
-
const user = await this.userModel.findOne({ id: userId });
|
|
484
|
-
|
|
485
|
-
if (!user) {
|
|
486
|
-
this.json(res, { success: false, error: 'Usuario no encontrado' }, 404);
|
|
487
|
-
return;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
this.json(res, { success: true, data: user });
|
|
491
|
-
} catch (error) {
|
|
492
|
-
this.json(res, { success: false, error: error.message }, 500);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
async createUser(req, res) {
|
|
497
|
-
try {
|
|
498
|
-
// Usar el modelo para crear un nuevo usuario
|
|
499
|
-
const newUser = await this.userModel.createUser(req.body);
|
|
500
|
-
|
|
501
|
-
this.json(res, { success: true, data: newUser }, 201);
|
|
502
|
-
} catch (error) {
|
|
503
|
-
this.json(res, { success: false, error: error.message }, 400);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
module.exports = new UserController();
|
|
509
|
-
```
|
|
228
|
+
Para ver el informe detallado de pruebas y rendimiento del módulo de estadísticas, consulte: [ESTADISTICAS_RENDIMIENTO.md](ESTADISTICAS_RENDIMIENTO.md)
|
|
510
229
|
|
|
511
|
-
##
|
|
230
|
+
## Soporte
|
|
512
231
|
|
|
513
|
-
Para
|
|
232
|
+
Para soporte, por favor abre un issue en el repositorio o visita nuestra página web: https://jerk.page.gd/
|