jerkjs 2.1.7 → 2.2.0

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 (54) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +201 -4
  3. package/index.js +29 -4
  4. package/lib/core/server.js +328 -27
  5. package/lib/loader/routeLoader.js +148 -117
  6. package/lib/mvc/GenericAdapter.js +136 -0
  7. package/lib/mvc/MariaDBAdapter.js +315 -0
  8. package/lib/mvc/MemoryAdapter.js +269 -0
  9. package/lib/mvc/ModelControllerExample.js +285 -0
  10. package/lib/mvc/controllerBase.js +60 -0
  11. package/lib/mvc/modelBase.js +383 -0
  12. package/lib/mvc/modelManager.js +284 -0
  13. package/lib/mvc/userModel.js +265 -0
  14. package/lib/mvc/viewEngine.js +32 -1
  15. package/lib/utils/mimeType.js +62 -0
  16. package/package.json +5 -3
  17. package/BUG_REPORTE_COMPRESION.txt +0 -72
  18. package/JERK_FRAMEWORK_DIAGRAM.txt +0 -492
  19. package/JERK_FRAMEWORK_DIAGRAM_MERMAID.mmd +0 -124
  20. package/JERK_FRAMEWORK_DOCUMENTATION.md +0 -527
  21. package/LICENSE +0 -201
  22. package/README_EN.md +0 -230
  23. package/README_PT.md +0 -230
  24. package/docs/ARQUITECTURA_ROUTES.md +0 -140
  25. package/docs/EXTENSION_MANUAL.md +0 -955
  26. package/docs/FIREWALL_MANUAL.md +0 -416
  27. package/docs/HOOK-2.0.md +0 -512
  28. package/docs/HOOKS_REFERENCE_IMPROVED.md +0 -596
  29. package/docs/MANUAL_API_SDK.md +0 -536
  30. package/docs/MARIADB_TOKENS_IMPLEMENTATION.md +0 -110
  31. package/docs/MIDDLEWARE_MANUAL.md +0 -518
  32. package/docs/OAUTH2_GOOGLE_MANUAL.md +0 -405
  33. package/docs/ROUTING_WITHOUT_JSON_GUIDE.md +0 -454
  34. package/docs/frontend-and-sessions.md +0 -353
  35. package/docs/guia_inicio_rapido_jerkjs.md +0 -113
  36. package/examples/examples.arj +0 -0
  37. package/standard/CompressionTestController.js +0 -56
  38. package/standard/HealthController.js +0 -16
  39. package/standard/HomeController.js +0 -12
  40. package/standard/ProductController.js +0 -18
  41. package/standard/README.md +0 -47
  42. package/standard/UserController.js +0 -23
  43. package/standard/package.json +0 -22
  44. package/standard/routes.json +0 -65
  45. package/standard/server.js +0 -140
  46. package/standardA/controllers/AuthController.js +0 -82
  47. package/standardA/controllers/HomeController.js +0 -19
  48. package/standardA/controllers/UserController.js +0 -41
  49. package/standardA/server.js +0 -311
  50. package/standardA/views/auth/dashboard.html +0 -51
  51. package/standardA/views/auth/login.html +0 -47
  52. package/standardA/views/index.html +0 -32
  53. package/standardA/views/users/detail.html +0 -28
  54. package/standardA/views/users/list.html +0 -36
@@ -1,527 +0,0 @@
1
- # JERK Framework v2.0 - Documentación Técnica y Diagramas de Arquitectura
2
-
3
- ## Introducción
4
-
5
- JERK Framework v2.0 es un framework de servidor HTTP ligero y modular diseñado para aplicaciones web modernas. Este documento proporciona una visión completa de la arquitectura del framework, incluyendo todos los flujos de datos, procesos internos y estructuras de archivos. La documentación está organizada en secciones que cubren desde el flujo principal de solicitudes HTTP hasta los detalles más específicos de cada componente del sistema.
6
-
7
- El framework sigue una arquitectura modular que separa claramente las responsabilidades entre diferentes capas: servidor HTTP, enrutamiento, middlewares, carga de rutas, motor de plantillas, gestión de sesiones y autenticación. Esta separación permite que cada componente funcione de manera independiente mientras trabaja en conjunto para procesar solicitudes HTTP de manera eficiente y segura.
8
-
9
- La documentación técnica que se presenta a continuación incluye diagramas de flujo Mermaid que ilustran visualmente los procesos internos del framework. Estos diagramas están diseñados para facilitar la comprensión de la lógica de negocio y los flujos de datos, lo cual es especialmente útil para desarrolladores que necesitan mantener o extender el framework.
10
-
11
- ---
12
-
13
- ## 1. Estructura de Archivos del Proyecto
14
-
15
- La organización del proyecto JERK Framework v2.0 sigue una estructura de directorios clara y escalable que separa los componentes por funcionalidad. Esta estructura permite un mantenimiento más sencillo del código y facilita la comprensión de las relaciones entre los diferentes módulos del framework.
16
-
17
- ```mermaid
18
- flowchart TB
19
- ROOT[index.js]
20
- ROOT --> LIB[lib/]
21
- LIB --> CORE[lib/core/]
22
- CORE --> SERVER[server.js APIServer]
23
- CORE --> ROUTER[router.js Router]
24
- LIB --> MIDDLEWARE[lib/middleware/]
25
- MIDDLEWARE --> AUTH[authenticator.js Authenticator]
26
- MIDDLEWARE --> FIREWALL[firewall.js Firewall]
27
- LIB --> LOADER[lib/loader/]
28
- LOADER --> ROUTELOADER[routeLoader.js RouteLoader]
29
- LIB --> MVC[lib/mvc/]
30
- MVC --> VIEWENGINE[viewEngine.js ViewEngine]
31
- MVC --> CONTROLLER[controllerBase.js ControllerBase]
32
- LIB --> UTILS[lib/utils/]
33
- UTILS --> TOKEN[tokenManager.js TokenManager]
34
- UTILS --> LOGGER[logger.js Logger]
35
- ```
36
-
37
- ### Descripción de los Directorios Principales
38
-
39
- El directorio `lib/core/` contiene los componentes esenciales del framework que definen la funcionalidad base del servidor HTTP. El archivo `server.js` implementa la clase `APIServer` que es el punto de entrada principal para el manejo de solicitudes, mientras que `router.js` contiene la lógica de enrutamiento que determina qué handler debe ejecutarse para cada solicitud entrante.
40
-
41
- El directorio `lib/middleware/` alberga todos los middlewares disponibles en el framework. El archivo `authenticator.js` implementa múltiples estrategias de autenticación, incluyendo JWT, API Key, Basic, OAuth2 y OpenID Connect. El archivo `firewall.js` proporciona funcionalidad de seguridad para bloquear direcciones IP maliciosas y aplicar reglas de seguridad personalizadas.
42
-
43
- El directorio `lib/loader/` contiene el `routeLoader.js` que es responsable de cargar las definiciones de rutas desde archivos JSON y registrarlas en el servidor. Esta separación permite que las rutas se definan en archivos de configuración externos, facilitando la organización y mantenimiento de las rutas de la aplicación.
44
-
45
- El directorio `lib/mvc/` implements el patrón Modelo-Vista-Controlador con el motor de plantillas `viewEngine.js` y la clase base `controllerBase.js` que proporciona funcionalidades comunes para todos los controladores de la aplicación.
46
-
47
- El directorio `lib/utils/` contiene utilidades auxiliares como el `tokenManager.js` para la gestión de tokens JWT y el `logger.js` para el registro de eventos y errores del sistema.
48
-
49
- ---
50
-
51
- ## 2. Flujo Principal de Solicitud HTTP
52
-
53
- El flujo principal de una solicitud HTTP en JERK Framework v2.0 sigue una secuencia bien definida de pasos que comienzan con la recepción de la solicitud y terminan con el envío de la respuesta al cliente. Este flujo está diseñado para manejar tanto solicitudes simples como solicitudes complejas que requieren múltiples middlewares y procesamiento asíncrono.
54
-
55
- El proceso inicia cuando el servidor recibe una solicitud HTTP y verifica que el método utilizado sea válido. Si el método no está soportado, el servidor responde con un error 405 Method Not Allowed. Una vez validado el método, se procede a parsear la URL para extraer el pathname y los parámetros de consulta, los cuales se almacenan en las propiedades `req.query` y `req.params` del objeto de solicitud.
56
-
57
- A continuación, el servidor captura el cuerpo de la solicitud respetando un límite máximo de tamaño configurado. Si el tamaño del cuerpo excede este límite, el servidor responde con un error 413 Request Too Large. En caso contrario, se procede a parsear el cuerpo de la solicitud si el tipo de contenido es JSON.
58
-
59
- ```mermaid
60
- flowchart TD
61
- START([INICIO])
62
- START --> A[APIServer.start]
63
- A --> B[HTTP Request recibido]
64
- B --> C[Verificar metodo HTTP]
65
- C --> D{Es metodo valido?}
66
- D -->|NO| E[405 Method Not Allowed]
67
- E --> END([FIN])
68
- D -->|SI| F[Parse URL: pathname, query]
69
- F --> G[req.query = query]
70
- G --> H[req.params = {}]
71
- H --> I[req.body = '', bodySize = 0]
72
- I --> J[Capturar body con limite maxBodySize]
73
- J --> K{bodySize > maxBodySize?}
74
- K -->|SI| L[413 Request Too Large]
75
- L --> END
76
- K -->|NO| M[Fin de recepcion de datos]
77
- M --> N{Es JSON content-type?}
78
- N -->|SI| O[Parse body como JSON]
79
- N -->|NO| P[Continuar con raw body]
80
- O --> Q{Es solicitud OPTIONS?}
81
- P --> Q
82
- Q -->|SI| R[Ejecutar middlewares CORS]
83
- R --> S{Hay ruta especifica para OPTIONS?}
84
- S -->|SI| T[Agregar parametros req.params]
85
- T --> U[Ejecutar handler de ruta]
86
- U --> END
87
- S -->|NO| V[204 No Content]
88
- V --> END
89
- Q -->|NO| W[findRoute method pathname]
90
- W --> X{Ruta encontrada?}
91
- X -->|NO| Y[404 Not Found]
92
- Y --> END
93
- X -->|SI| Z[Agregar parametros req.params]
94
- Z --> AA[Ejecutar middlewares en secuencia]
95
- AA --> BB{Middleware respondio?}
96
- BB -->|SI| END
97
- BB -->|NO| CC[Ejecutar handler de ruta]
98
- CC --> DD{Handler es asincrono?}
99
- DD -->|SI| EE[await handler req res]
100
- DD -->|NO| FF[handler req res]
101
- EE --> END
102
- FF --> END
103
- ```
104
-
105
- Para solicitudes OPTIONS, el framework ejecuta los middlewares CORS configurados para determinar si hay una ruta específica definida para manejar este tipo de solicitudes. Si existe una ruta específica, se agregan los parámetros correspondientes y se ejecuta el handler asociado. Si no existe una ruta específica, el servidor responde con un código 204 No Content.
106
-
107
- Cuando la solicitud no es OPTIONS, el framework busca una ruta coincidente utilizando la función `findRoute()` que toma como parámetros el método HTTP y el pathname de la solicitud. Si no se encuentra ninguna ruta, el servidor responde con un error 404 Not Found. Si se encuentra una ruta, se agregan los parámetros extraídos al objeto `req.params` y se procede a ejecutar los middlewares registrados en secuencia.
108
-
109
- Cada middleware tiene la opción de responder directamente a la solicitud o pasar el control al siguiente middleware. Si algún middleware responde, el flujo termina y la respuesta se envía al cliente. Si ningún middleware responde, se ejecuta el handler de ruta asociado. El framework soporta tanto handlers síncronos como asíncronos, utilizando `await` para los handlers asíncronos.
110
-
111
- ---
112
-
113
- ## 3. Algoritmo de Enrutamiento: findRoute()
114
-
115
- El algoritmo de enrutamiento de JERK Framework v2.0 implementa un sistema de búsqueda de dos niveles que primero intenta encontrar una coincidencia exacta y, si no la encuentra, procede a buscar rutas parametrizadas que coincidan con el patrón de la URL solicitada.
116
-
117
- El algoritmo comienza buscando una coincidencia exacta entre el pathname de la solicitud y las rutas registradas en el servidor. Esta búsqueda es extremadamente rápida ya que utiliza una tabla hash para almacenar las rutas exactas. Si se encuentra una coincidencia exacta, se devuelve inmediatamente el objeto de ruta con un objeto de parámetros vacío.
118
-
119
- ```mermaid
120
- flowchart TD
121
- START1([INICIO findRoute])
122
- START1 --> A1[findRoute method pathname]
123
- A1 --> B1[Busqueda de ruta exacta]
124
- B1 --> C1{Encuentra ruta exacta?}
125
- C1 -->|SI| D1[Devolver route, params: {}]
126
- D1 --> END1([FIN])
127
- C1 -->|NO| E1[Busqueda de rutas parametrizadas]
128
- E1 --> F1[Iterar por cada ruta]
129
- F1 --> G1{Mismo metodo HTTP?}
130
- G1 -->|NO| H1[Siguiente ruta]
131
- G1 -->|SI| I1[Convertir ruta a regex: pathToRegex route.path]
132
- I1 --> J1{pathname.match routeRegex?}
133
- J1 -->|SI| K1[Extraer parametros: extractParams route.path pathname]
134
- K1 --> L1[Devolver route, params]
135
- L1 --> END1
136
- J1 -->|NO| H1
137
- H1 --> M1{Mas rutas?}
138
- M1 -->|SI| F1
139
- M1 -->|NO| N1[Devolver null]
140
- N1 --> END1
141
- ```
142
-
143
- Si no se encuentra una coincidencia exacta, el algoritmo itera a través de todas las rutas parametrizadas registradas para el método HTTP solicitado. Para cada ruta, primero verifica que el método HTTP coincida. Si no coincide, continúa con la siguiente ruta. Si coincide, convierte la ruta a una expresión regular utilizando la función `pathToRegex()`.
144
-
145
- La expresión regular generada se utiliza para verificar si el pathname de la solicitud coincide con el patrón de la ruta. Si coincide, se extraen los parámetros dinámicos utilizando la función `extractParams()` y se devuelve el objeto de ruta junto con los parámetros extraídos. Si no coincide, se continúa con la siguiente ruta. Este proceso continúa hasta encontrar una coincidencia o agotar todas las rutas disponibles.
146
-
147
- ---
148
-
149
- ## 4. Conversión de Rutas a Expresiones Regulares: pathToRegex()
150
-
151
- La función `pathToRegex()` es responsable de convertir rutas con parámetros dinámicos en expresiones regulares que pueden utilizarse para hacer coincidir URLs entrantes. Este proceso es fundamental para el sistema de enrutamiento parametrizado del framework.
152
-
153
- ```mermaid
154
- flowchart TD
155
- START2([INICIO pathToRegex])
156
- START2 --> A2[pathToRegex path]
157
- A2 --> B2[Escapar caracteres especiales]
158
- B2 --> C2[Reemplazar :param con [^/]+?]
159
- C2 --> D2[Crear RegExp: new RegExp ^${regexPath}$]
160
- D2 --> END2([FIN])
161
- ```
162
-
163
- El proceso comienza escapando todos los caracteres especiales de la ruta para evitar que sean interpretados como metacaracteres de expresiones regulares. A continuación, se reemplazan los marcadores de parámetros (como `:id`, `:userId`, `:productId`) con el patrón de expresión regular `([^/]+?)`, que captura cualquier secuencia de caracteres que no contenga barras diagonales.
164
-
165
- Finalmente, se construye un objeto RegExp que envuelve el patrón generado con anclas de inicio (`^`) y fin (`$`) para asegurar que la URL completa coincida con el patrón, no solo una parte de ella. Esta expresión regular se utilizará posteriormente para verificar si el pathname de la solicitud coincide con el patrón de la ruta.
166
-
167
- ---
168
-
169
- ## 5. Extracción de Parámetros: extractParams()
170
-
171
- La función `extractParams()` extrae los valores de los parámetros dinámicos de una URL que coincide con una ruta parametrizada. Esta función complementa a `pathToRegex()` proporcionando una interfaz para acceder a los valores capturados por la expresión regular.
172
-
173
- ```mermaid
174
- flowchart TD
175
- START3([INICIO extractParams])
176
- START3 --> A3[extractParams routePath actualPath]
177
- A3 --> B3[Encontrar parametros con /:([a-zA-Z0-9_]+)/g]
178
- B3 --> C3[Crear array paramNames]
179
- C3 --> D3[Generar routeRegex con pathToRegex]
180
- D3 --> E3[Obtener values con actualPath.match routeRegex]
181
- E3 --> F3[Asignar valores: params paramNames i = values i+1]
182
- F3 --> G3[Devolver params]
183
- G3 --> END3([FIN])
184
- ```
185
-
186
- El proceso comienza extrayendo los nombres de los parámetros de la ruta utilizando una expresión regular que busca todos los marcadores de parámetros (`/:([a-zA-Z0-9_]+)/g`). Estos nombres se almacenan en un array que se utilizará posteriormente para construir el objeto de parámetros.
187
-
188
- A continuación, se genera una expresión regular para la ruta utilizando la función `pathToRegex()`. Esta expresión regular se utiliza para hacer coincidir el pathname real de la solicitud. El resultado de esta coincidencia es un array donde el primer elemento es la URL completa coincidente y los elementos siguientes son los valores capturados para cada parámetro.
189
-
190
- Finalmente, se construye el objeto de parámetros asignando cada valor capturado al nombre del parámetro correspondiente. Los nombres de los parámetros se obtienen del array creado anteriormente y los valores se obtienen del resultado de la coincidencia de la expresión regular. El resultado es un objeto que mapea cada nombre de parámetro a su valor correspondiente en la URL.
191
-
192
- ---
193
-
194
- ## 6. Flujo de Carga de Rutas
195
-
196
- El flujo de carga de rutas es el proceso mediante el cual JERK Framework v2.0 carga y registra las rutas definidas en archivos JSON externos. Este proceso incluye validación de la estructura de las rutas, procesamiento de cada ruta individual y aplicación de middlewares de autenticación cuando corresponde.
197
-
198
- El proceso comienza verificando que el archivo de rutas exista en la ubicación especificada. Si el archivo no existe, se genera un error y el proceso termina. Si el archivo existe, se lee su contenido y se parsea como JSON. A continuación, se valida la estructura del array de rutas para asegurar que cada elemento contenga todas las propiedades requeridas.
199
-
200
- ```mermaid
201
- flowchart TD
202
- START4([INICIO RouteLoader])
203
- START4 --> A4[RouteLoader.loadRoutes server filePath]
204
- A4 --> B4{Existe archivo?}
205
- B4 -->|NO| C4[Error: Archivo no encontrado]
206
- C4 --> END4
207
- B4 -->|SI| D4[Leer y parsear JSON]
208
- D4 --> E4[validateRoutesStructure routes]
209
- E4 --> F4[Iterar por cada route]
210
- F4 --> G4[loadSingleRoute server route]
211
- G4 --> H4{Tiene contentType?}
212
- H4 -->|SI| I4[Crear wrapper con setHeader]
213
- H4 -->|NO| J4[Usar handler directamente]
214
- I4 --> K4
215
- J4 --> K4{Tiene autenticacion?}
216
- K4 -->|NO| L4[server.addRoute method path handler]
217
- K4 -->|SI| M4{Es autenticacion de sesion?}
218
- M4 -->|SI| N4[sessionAuth middleware]
219
- M4 -->|NO| O4[authenticator.authenticate middleware]
220
- N4 --> P4[Crear authenticatedHandler]
221
- O4 --> P4
222
- P4 --> Q4[server.addRoute method path authenticatedHandler]
223
- L4 --> R4{Mas rutas?}
224
- Q4 --> R4
225
- R4 -->|SI| F4
226
- R4 -->|NO| S4([Rutas cargadas exitosamente])
227
- ```
228
-
229
- Para cada ruta en el array, se verifica si tiene un tipo de contenido personalizado definido. Si lo tiene, se crea un wrapper que establece el header de tipo de contenido antes de ejecutar el handler. Esto permite que diferentes rutas devuelvan diferentes tipos de contenido sin modificar el handler principal.
230
-
231
- A continuación, se verifica si la ruta requiere autenticación. Si no la requiere, el handler se registra directamente en el servidor. Si la requiere, se determina qué tipo de autenticación debe aplicarse (basada en sesión o basada en token) y se crea un handler autenticado que envolverá el handler original. Este handler autenticado ejecutará el middleware de autenticación correspondiente antes de permitir el acceso al handler de la ruta.
232
-
233
- ---
234
-
235
- ## 7. Validación de Estructura de Rutas
236
-
237
- La validación de la estructura de rutas es un paso crítico en el proceso de carga de rutas que asegura que todas las rutas definidas cumplan con los requisitos mínimos del framework. Esta validación previene errores en tiempo de ejecución al detectar problemas de configuración antes de que el servidor comience a procesar solicitudes.
238
-
239
- ```mermaid
240
- flowchart TD
241
- START10([INICIO validateRoutesStructure])
242
- START10 --> A10[validateRoutesStructure routes]
243
- A10 --> B10{routes es array?}
244
- B10 -->|NO| C10[Error: No es array]
245
- C10 --> END10
246
- B10 -->|SI| D10[Iterar por cada route]
247
- D10 --> E10{route es objeto?}
248
- E10 -->|NO| F10[Error: No es objeto]
249
- F10 --> END10
250
- E10 -->|SI| G10{Tiene path?}
251
- G10 -->|NO| H10[Error: Falta path]
252
- H10 --> END10
253
- G10 -->|SI| I10{Tiene method?}
254
- I10 -->|NO| J10[Error: Falta method]
255
- J10 --> END10
256
- I10 -->|SI| K10{Tiene controller?}
257
- K10 -->|NO| L10[Error: Falta controller]
258
- L10 --> END10
259
- K10 -->|SI| M10{Tiene handler?}
260
- M10 -->|NO| N10[Error: Falta handler]
261
- N10 --> END10
262
- M10 -->|SI| O10{contentType es string si existe?}
263
- O10 -->|NO| P10[Error: contentType invalido]
264
- P10 --> END10
265
- O10 -->|SI| Q10[Siguiente ruta]
266
- Q10 --> R10{Mas rutas?}
267
- R10 -->|SI| D10
268
- R10 -->|NO| S10([Validacion exitosa])
269
- ```
270
-
271
- La validación comienza verificando que el parámetro `routes` sea un array. Si no lo es, se genera un error indicando que la estructura de rutas debe ser un array. A continuación, se itera por cada elemento del array y se verifica que sea un objeto. Si algún elemento no es un objeto, se genera un error correspondiente.
272
-
273
- Para cada objeto de ruta, se verifican las propiedades requeridas en el siguiente orden: `path`, `method`, `controller` y `handler`. Cada una de estas propiedades es obligatoria y si falta cualquiera de ellas, se genera un error específico indicando cuál es la propiedad faltante. La propiedad `contentType` es opcional pero, si existe, debe ser una cadena de texto válida.
274
-
275
- ---
276
-
277
- ## 8. Sistema de Autenticación
278
-
279
- El sistema de autenticación de JERK Framework v2.0 implementa múltiples estrategias que permiten a los desarrolladores elegir el método de autenticación más apropiado para su aplicación. Cada estrategia tiene sus propias características y casos de uso específicos.
280
-
281
- El proceso de autenticación comienza verificando que la estrategia solicitada exista y esté configurada correctamente. Si la estrategia no existe, se genera un error indicando que no se encontró la estrategia solicitada. A continuación, se obtiene la dirección IP del cliente para verificar si está bloqueada por el firewall.
282
-
283
- ```mermaid
284
- flowchart TD
285
- START5([INICIO Authenticator])
286
- START5 --> A5[Authenticator.authenticate strategyName options]
287
- A5 --> B5{Existe estrategia?}
288
- B5 -->|NO| C5[Error: Estrategia no encontrada]
289
- C5 --> END5
290
- B5 -->|SI| D5[Obtener IP cliente]
291
- D5 --> E5{IP esta bloqueada?}
292
- E5 -->|SI| F5[403 Forbidden - Acceso bloqueado]
293
- F5 --> END5
294
- E5 -->|NO| G5[Ejecutar estrategia]
295
- G5 --> H5{Autenticacion exitosa?}
296
- H5 -->|SI| I5[Registrar exito, resetear intentos, next]
297
- I5 --> END5
298
- H5 -->|NO| J5[Incrementar intentos fallidos, registrar fallo, 401 Unauthorized]
299
- J5 --> END5
300
- ```
301
-
302
- Si la IP del cliente está bloqueada, el servidor responde con un error 403 Forbidden indicando que el acceso fue bloqueado por el firewall. Si la IP no está bloqueada, se procede a ejecutar la estrategia de autenticación configurada. El resultado de esta ejecución determina si la autenticación fue exitosa o fallida.
303
-
304
- En caso de éxito, se registra el evento de autenticación exitosa, se resetean los intentos fallidos previos del cliente y se llama a la función `next()` para continuar con el procesamiento de la solicitud. En caso de fallo, se incrementa el contador de intentos fallidos, se registra el evento de fallo y se responde con un error 401 Unauthorized.
305
-
306
- ---
307
-
308
- ## 9. Estrategias de Autenticación Disponibles
309
-
310
- JERK Framework v2.0 soporta cinco estrategias de autenticación principales, cada una diseñada para diferentes escenarios de seguridad y requisitos de integración.
311
-
312
- ```mermaid
313
- flowchart TB
314
- subgraph JWT[JWT Strategy]
315
- JWT1[Verificar Authorization: Bearer token]
316
- JWT2[Validar con jwt.verify]
317
- JWT3{Token expirado?}
318
- JWT4[Intentar refresh con refresh token]
319
- JWT5[Agregar req.user con payload]
320
- end
321
-
322
- subgraph APIKEY[API Key Strategy]
323
- API1[Verificar header X-API-Key]
324
- API2[Comparar con claves validas]
325
- API3{Configuracion por tenant?}
326
- API4[Usar claves especificas]
327
- end
328
-
329
- subgraph BASIC[Basic Strategy]
330
- BAS1[Verificar Authorization: Basic base64]
331
- BAS2[Decodificar y comparar credenciales]
332
- BAS3[Agregar req.user con nombre]
333
- end
334
-
335
- subgraph OAUTH2[OAuth2 Strategy]
336
- OA1[Verificar token Bearer o codigo]
337
- OA2[Validar con proveedor OAuth2]
338
- OA3[Agregar req.oauth2User]
339
- end
340
-
341
- subgraph OIDC[OpenID Connect Strategy]
342
- OID1[Verificar ID token]
343
- OID2[Validar con proveedor OIDC]
344
- OID3[Agregar req.oidcUser]
345
- end
346
- ```
347
-
348
- ### JWT Strategy (JSON Web Tokens)
349
-
350
- La estrategia JWT es ideal para aplicaciones que requieren autenticación sin estado y compatibilidad con aplicaciones móviles y APIs. La estrategia verifica el header Authorization buscando un token Bearer, valida el token utilizando `jwt.verify()`, y si el token está expirado, intenta renovarlo utilizando un refresh token. Una vez validado, el payload decodificado se agrega al objeto `req.user`.
351
-
352
- ### API Key Strategy
353
-
354
- La estrategia de API Key es adecuada para autenticación de servicios y sistemas externos que necesitan acceso programático a la API. La estrategia verifica el header X-API-Key y lo compara con las claves válidas almacenadas. Si la configuración incluye multi-tenancy, se utilizan claves específicas para cada tenant.
355
-
356
- ### Basic Strategy
357
-
358
- La estrategia Basic es simple y rápida de implementar, adecuada para aplicaciones internas o APIs que operan sobre HTTPS. La estrategia decodifica las credenciales codificadas en base64 del header Authorization y las compara con las credenciales almacenadas. Si las credenciales son válidas, el nombre de usuario se agrega a `req.user`.
359
-
360
- ### OAuth2 Strategy
361
-
362
- La estrategia OAuth2 es adecuada para aplicaciones que necesitan integrarse con proveedores de identidad externos como Google, Facebook o Microsoft. La estrategia verifica tokens Bearer o códigos de autorización, los valida con el proveedor OAuth2 correspondiente, y agrega el usuario autenticado a `req.oauth2User`.
363
-
364
- ### OpenID Connect Strategy
365
-
366
- La estrategia OpenID Connect extiende OAuth2 proporcionando autenticación federada con verificación de identidad. Es ideal para aplicaciones empresariales que necesitan autenticación SSO (Single Sign-On) con proveedores de identidad compatibles con OIDC.
367
-
368
- ---
369
-
370
- ## 10. Sistema de Firewall
371
-
372
- El sistema de firewall de JERK Framework v2.0 proporciona una capa adicional de seguridad que protege la aplicación contra direcciones IP maliciosas y ataques automatizados. El firewall opera como un middleware que se ejecuta antes de cualquier otro procesamiento de solicitud.
373
-
374
- ```mermaid
375
- flowchart TD
376
- START6([INICIO Firewall])
377
- START6 --> A6[Firewall.middleware]
378
- A6 --> B6[Obtener IP cliente]
379
- B6 --> C6{IP esta bloqueada?}
380
- C6 -->|SI| D6[403 Forbidden - Acceso denegado por firewall]
381
- D6 --> END6
382
- C6 -->|NO| E6[checkRules req]
383
- E6 --> F6{Coincide con alguna regla?}
384
- F6 -->|SI| G6{Accion es bloquear?}
385
- G6 -->|SI| H6[Incrementar intentos, 403 Forbidden]
386
- H6 --> END6
387
- G6 -->|NO| I6[Continuar con monitoreo]
388
- I6 --> J6[next - Continuar con siguiente middleware]
389
- J6 --> END6
390
- F6 -->|NO| J6
391
- ```
392
-
393
- El proceso del firewall comienza obteniendo la dirección IP del cliente de la solicitud. A continuación, verifica si esta IP está en la lista de IPs bloqueadas. Si está bloqueada, responde inmediatamente con un error 403 Forbidden indicando que el acceso fue denegado por el firewall.
394
-
395
- Si la IP no está bloqueada, el firewall verifica si la solicitud coincide con alguna regla de seguridad personalizada. Estas reglas pueden definir patrones de comportamiento malicioso, como solicitudes a rutas sensibles o patrones de tráfico anómalos. Si se encuentra una coincidencia, se verifica si la acción configurada es bloquear o simplemente monitorear.
396
-
397
- Si la acción es bloquear, se incrementa el contador de intentos fallidos para esa IP y se responde con un error 403 Forbidden. Si la acción es monitorear, se permite que la solicitud continúe pero se registra el evento para análisis posterior. Si ninguna regla coincide, la solicitud continúa normalmente con el siguiente middleware.
398
-
399
- ---
400
-
401
- ## 11. Motor de Plantillas (ViewEngine)
402
-
403
- El motor de plantillas de JERK Framework v2.0 proporciona funcionalidad para renderizar vistas HTML dinámicas utilizando un sistema de plantillas flexible que soporta includes, bucles condicionales y filtros de variables.
404
-
405
- ```mermaid
406
- flowchart TD
407
- START7([INICIO ViewEngine])
408
- START7 --> A7[ViewEngine.render viewName data options]
409
- A7 --> B7[getViewPath viewName]
410
- B7 --> C7{Existe vista?}
411
- C7 -->|NO| D7[Error: Vista no encontrada]
412
- D7 --> END7
413
- C7 -->|SI| E7{Habilitado cache y esta en cache?}
414
- E7 -->|SI| F7[Obtener del cache]
415
- E7 -->|NO| G7[Leer contenido de vista]
416
- F7 --> H7
417
- G7 --> H7[processIncludes content dirname]
418
- H7 --> I7{Habilitar cache?}
419
- I7 -->|SI| J7[Guardar en cache]
420
- I7 -->|NO| K7[Continuar]
421
- J7 --> L7[processTemplate content data options]
422
- K7 --> L7
423
- L7 --> M7[processForeach template data options]
424
- M7 --> N7[processConditionals template data options]
425
- N7 --> O7[replaceVariablesAndFilters template data options]
426
- O7 --> P7[Devolver template procesado]
427
- P7 --> END7
428
- ```
429
-
430
- El proceso de renderizado comienza determinando la ruta completa del archivo de vista solicitado. Si el archivo de vista no existe, se genera un error indicando que la vista no fue encontrada. Si el archivo existe, se verifica si el sistema de caché está habilitado y si la vista ya está almacenada en caché.
431
-
432
- Si la vista está en caché, se obtiene directamente del caché para evitar la lectura del archivo y el procesamiento repetido. Si no está en caché, se lee el contenido del archivo de vista. Antes de procesar la plantilla, se procesan los includes que pueden insertar el contenido de otras plantillas dentro de la plantilla principal.
433
-
434
- Si el caché está habilitado, el contenido procesado se almacena en caché para futuras solicitudes de la misma vista. A continuación, se procede a procesar la plantilla completa, lo que incluye el procesamiento de bucles foreach, la evaluación de condicionales, y la sustitución de variables y filtros.
435
-
436
- ---
437
-
438
- ## 12. Sistema de Sesiones
439
-
440
- El sistema de sesiones de JERK Framework v2.0 proporciona gestión de estado del lado del servidor mediante cookies de sesión. Este sistema permite mantener información del usuario entre múltiples solicitudes HTTP.
441
-
442
- ```mermaid
443
- flowchart TD
444
- START8([INICIO SessionManager])
445
- START8 --> A8[SessionManager.middleware]
446
- A8 --> B8{Tiene cookie de sesion?}
447
- B8 -->|NO| C8[Crear nueva sesion]
448
- B8 -->|SI| D8[Validar sesion existente]
449
- C8 --> E8
450
- D8 --> E8{Sesion valida?}
451
- E8 -->|NO| C8
452
- E8 -->|SI| F8[Actualizar ultima actividad]
453
- F8 --> G8[Agregar req.session]
454
- G8 --> H8[next]
455
- H8 --> END8([FIN])
456
- ```
457
-
458
- El middleware de sesiones comienza verificando si la solicitud incluye una cookie de sesión. Si no incluye cookie de sesión, se crea una nueva sesión y se genera un identificador único que se almacena en una cookie en el cliente. Si incluye cookie de sesión, se recupera la sesión existente del almacenamiento del servidor.
459
-
460
- A continuación, se valida la sesión existente verificando que no haya expirado y que los datos de la sesión sean válidos. Si la sesión no es válida, se destruye y se crea una nueva sesión. Si la sesión es válida, se actualiza el timestamp de última actividad para mantener la sesión activa.
461
-
462
- Finalmente, se agrega el objeto de sesión al objeto de solicitud (`req.session`) y se llama a la función `next()` para continuar con el procesamiento de la solicitud. El objeto de sesión está disponible para todos los middlewares y handlers posteriores que necesiten acceder a la información del usuario.
463
-
464
- ---
465
-
466
- ## 13. Sistema de Hooks
467
-
468
- El sistema de hooks de JERK Framework v2.0 implementa un patrón de extensibilidad que permite a los desarrolladores modificar o extender el comportamiento del framework en puntos específicos de la ejecución. El sistema soporta dos tipos de hooks: acciones y filtros.
469
-
470
- ### Acciones (doAction)
471
-
472
- Las acciones son hooks que ejecutan código en puntos específicos del ciclo de vida de la aplicación. No retornan ningún valor y se utilizan para realizar tareas secundarias como registro de日志 o limpieza de recursos.
473
-
474
- ```mermaid
475
- flowchart TD
476
- START9A([INICIO doAction])
477
- START9A --> A9A[hooks.doAction nombre_hook args]
478
- A9A --> B9A[Buscar listeners para nombre_hook]
479
- B9A --> C9A[Ejecutar cada listener en secuencia]
480
- C9A --> D9A[Continuar]
481
- D9A --> END9A([FIN])
482
- ```
483
-
484
- ### Filtros (applyFilters)
485
-
486
- Los filtros son hooks que reciben un valor, lo modifican y retornan el valor modificado. Se utilizan para transformar datos en puntos específicos del procesamiento, como modificar el contenido de una respuesta antes de enviarla al cliente.
487
-
488
- ```mermaid
489
- flowchart TD
490
- START9B([INICIO applyFilters])
491
- START9B --> A9B[hooks.applyFilters nombre_filtro value args]
492
- A9B --> B9B[Buscar listeners para nombre_filtro]
493
- B9B --> C9B[Aplicar cada listener al valor en secuencia]
494
- C9B --> D9B[Devolver valor modificado]
495
- D9B --> END9B([FIN])
496
- ```
497
-
498
- El sistema de hooks mantiene un registro de todos los listeners registrados para cada hook. Cuando se ejecuta un hook, el sistema busca todos los listeners asociados, los ejecuta en el orden en que fueron registrados, y pasa los argumentos correspondientes. Para los filtros, cada listener puede modificar el valor que se pasa al siguiente listener en la cadena.
499
-
500
- ---
501
-
502
- ## 14. Resumen de Arquitectura
503
-
504
- La arquitectura de JERK Framework v2.0 está diseñada para proporcionar un equilibrio entre simplicidad y funcionalidad. El framework sigue principios de diseño que facilitan tanto el desarrollo rápido de aplicaciones como la escalabilidad a medida que los requisitos de la aplicación crecen.
505
-
506
- El flujo principal de solicitudes HTTP sigue una secuencia clara que comienza con la recepción de la solicitud y termina con el envío de la respuesta. En el camino, la solicitud atraviesa múltiples capas de procesamiento que incluyen validación de parámetros, verificación de autenticación, búsqueda de rutas, ejecución de middlewares y renderizado de vistas.
507
-
508
- El sistema de enrutamiento es eficiente y flexible, permitiendo tanto rutas exactas como rutas parametrizadas. La implementación de expresiones regulares permite patrones de URL complejos mientras mantiene un rendimiento óptimo. El sistema de parámetros extraídos proporciona acceso sencillo a los valores dinámicos de la URL.
509
-
510
- El sistema de seguridad integrado proporciona múltiples capas de protección, incluyendo firewall de IP, autenticación flexible y validación de entrada. Las múltiples estrategias de autenticación permiten que el framework se adapte a diferentes requisitos de seguridad y escenarios de integración.
511
-
512
- El motor de plantillas y el sistema de sesiones proporcionan funcionalidades esenciales para aplicaciones web modernas. El sistema de hooks permite una extensibilidad profunda del framework sin modificar el código base, facilitando la creación de plugins y extensiones reutilizables.
513
-
514
- ---
515
-
516
- ## Referencias de Archivos
517
-
518
- - **Archivo principal de entrada**: `index.js`
519
- - **Núcleo del servidor**: `lib/core/server.js`, `lib/core/router.js`
520
- - **Middlewares de seguridad**: `lib/middleware/authenticator.js`, `lib/middleware/firewall.js`
521
- - **Cargador de rutas**: `lib/loader/routeLoader.js`
522
- - **Componentes MVC**: `lib/mvc/viewEngine.js`, `lib/mvc/controllerBase.js`
523
- - **Utilidades**: `lib/utils/tokenManager.js`, `lib/utils/logger.js`
524
-
525
- ---
526
-
527
- *Documentación generada para JERK Framework v2.0. Para más información, consulte la guía de inicio rápido en `docs/guia_inicio_rapido_jerkjs.md`.*