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
package/CHANGELOG.md
CHANGED
|
@@ -1,12 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## [2.5.
|
|
3
|
+
## [2.5.8] - 2026-02-09
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- Extensión de administración con servidor TCP para monitoreo y gestión del framework
|
|
7
|
+
- Módulo de rutas para ver rutas registradas y activas en tiempo de ejecución
|
|
8
|
+
- Integración de hooks y filters para extensibilidad de la extensión de administración
|
|
9
|
+
- Puerto de administración solo accesible desde localhost para seguridad
|
|
10
|
+
- Sistema de módulos extensible para futuras funcionalidades de administración
|
|
11
|
+
- Módulo de tiempo (TimeModule) con comandos 'time' y 'date' que muestran hora y fecha en color azul
|
|
12
|
+
- Módulo de sistema (SystemModule) con comandos 'sysinfo', 'system' y 'resources' que muestran información del sistema en tabla formateada con color verde
|
|
13
|
+
- Módulo de estadísticas (StatsModule) con comandos 'stats', 'statistics', 'requests' y 'endpoints' que muestran métricas del servidor en tiempo real:
|
|
14
|
+
- Cantidad de requests procesados mostrando kilobytes
|
|
15
|
+
- Cantidad de responses enviadas mostrando kilobytes
|
|
16
|
+
- Accesos a las rutas registradas (input y output)
|
|
17
|
+
- Endpoints y rutas más accedidas
|
|
18
|
+
- Sistema de almacenamiento global de estadísticas para acceso directo y confiable sin depender de hooks
|
|
19
|
+
- Sistema de carga de módulos personalizados como submódulos de la extensión de administración
|
|
20
|
+
- Soporte para integrar módulos externos sin modificar el core de la extensión de administración
|
|
21
|
+
- Hook 'admin_extensions_initialize' para inicializar la extensión de administración después de que el servidor esté completamente iniciado y todas las rutas hayan sido cargadas
|
|
22
|
+
- Implementación automática de la extensión de administración usando hooks en lugar de inicialización manual
|
|
23
|
+
|
|
24
|
+
## [2.5.7] - 2026-02-08
|
|
4
25
|
|
|
5
26
|
### Added
|
|
6
27
|
- Implementación de filtros para personalizar las flags de seguridad de las cookies de sesión
|
|
7
28
|
- Añadidos los filtros `session_cookie_flags` y `session_cookie_destroy_flags` para permitir la modificación de las flags de las cookies de sesión
|
|
8
29
|
- Soporte para añadir flags de seguridad como `Secure` y `SameSite` a través del sistema de filtros
|
|
9
30
|
- Documentación sobre cómo añadir soporte para flags adicionales como `Partitioned`
|
|
31
|
+
- Optimización del sistema de enrutamiento con índices por número de segmentos y primer segmento para mejorar el rendimiento de búsqueda de rutas
|
|
32
|
+
- Implementación de buckets de rutas basados en aridad (número de segmentos) y prefix hints para reducir el espacio de búsqueda
|
|
10
33
|
|
|
11
34
|
### Changed
|
|
12
35
|
- El sistema de sesiones ahora permite la personalización de flags de seguridad mediante filtros
|
|
@@ -16,6 +39,8 @@
|
|
|
16
39
|
- Mejora en el manejo de rutas estáticas para reducir operaciones de normalización repetidas
|
|
17
40
|
- Implementación de caché para el método render en la respuesta para evitar redefiniciones innecesarias
|
|
18
41
|
|
|
42
|
+
## [2.5.6] - 2026-02-08
|
|
43
|
+
|
|
19
44
|
## [2.5.5] - 2026-02-08
|
|
20
45
|
|
|
21
46
|
## [2.5.4] - 2026-02-08
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Informe de Pruebas del Módulo de Estadísticas - JERK Framework v2.5.8
|
|
2
|
+
|
|
3
|
+
## Resumen Ejecutivo
|
|
4
|
+
|
|
5
|
+
El módulo de estadísticas para la extensión de administración de JERK Framework ha sido sometido a pruebas exhaustivas que demuestran su capacidad para capturar y mostrar métricas precisas del servidor en tiempo real. Las pruebas incluyeron desde operaciones básicas hasta pruebas de estrés con 20,000 solicitudes concurrentes.
|
|
6
|
+
|
|
7
|
+
## Características del Módulo de Estadísticas
|
|
8
|
+
|
|
9
|
+
### Funcionalidades Implementadas
|
|
10
|
+
1. **Cantidad de requests procesados mostrando kilobytes**
|
|
11
|
+
2. **Cantidad de responses enviadas mostrando kilobytes**
|
|
12
|
+
3. **Accesos a las rutas registradas (input y output)**
|
|
13
|
+
4. **Endpoints y rutas más accedidas**
|
|
14
|
+
|
|
15
|
+
### Comandos Disponibles
|
|
16
|
+
- `stats` o `statistics`: Muestra estadísticas generales del servidor
|
|
17
|
+
- `requests`: Muestra estadísticas específicas de solicitudes
|
|
18
|
+
- `endpoints`: Muestra estadísticas de endpoints y rutas más accedidas
|
|
19
|
+
|
|
20
|
+
## Pruebas Realizadas
|
|
21
|
+
|
|
22
|
+
### 1. Pruebas Básicas
|
|
23
|
+
- Login con usuario testuser: ✅ Exitoso
|
|
24
|
+
- Consumo de endpoints con autenticación: ✅ Exitoso
|
|
25
|
+
- Uso del endpoint qwen con cola asincrónica: ✅ Exitoso
|
|
26
|
+
|
|
27
|
+
### 2. Pruebas con Apache Bench (ab)
|
|
28
|
+
- 100 solicitudes concurrentes a 10 por vez: ✅ Exitoso
|
|
29
|
+
- 50 solicitudes concurrentes al endpoint de resultados qwen: ✅ Exitoso
|
|
30
|
+
- 500 solicitudes concurrentes a 20 por vez: ✅ Exitoso
|
|
31
|
+
- 1000 solicitudes concurrentes a 50 por vez: ✅ Exitoso
|
|
32
|
+
- **20,000 solicitudes concurrentes a 100 por vez**: ✅ Exitoso
|
|
33
|
+
|
|
34
|
+
### 3. Pruebas de Rendimiento
|
|
35
|
+
- **Rendimiento Máximo**: 1,235.46 RPS (requests por segundo)
|
|
36
|
+
- **Tiempo Total de Prueba**: 16.188 segundos para 20,000 solicitudes
|
|
37
|
+
- **Conexiones Concurrentes**: 100
|
|
38
|
+
- **Tasa de Éxito**: 100% (0 fallos)
|
|
39
|
+
|
|
40
|
+
## Resultados de las Pruebas
|
|
41
|
+
|
|
42
|
+
### Estadísticas Generales (Después de 20,000 solicitudes)
|
|
43
|
+
- **Solicitudes procesadas**: 21,666
|
|
44
|
+
- **Solicitudes procesadas (KB)**: 740 Bytes
|
|
45
|
+
- **Respuestas enviadas**: 21,666
|
|
46
|
+
- **Respuestas enviadas (KB)**: 287.69 MB
|
|
47
|
+
- **Rutas registradas**: 45
|
|
48
|
+
- **Rutas activas**: 10
|
|
49
|
+
|
|
50
|
+
### Distribución de Accesos
|
|
51
|
+
- **GET /api/endpoints**: 20,602 accesos (dominante por la prueba de estrés)
|
|
52
|
+
- **GET /api/qwen/result/:id**: 1,051 accesos
|
|
53
|
+
- **POST /api/qwen/queue**: 3 accesos
|
|
54
|
+
- **POST /api/analytics**: 3 accesos
|
|
55
|
+
- **Otros endpoints**: variados accesos
|
|
56
|
+
|
|
57
|
+
### Métricas de Rendimiento
|
|
58
|
+
- **Transfer rate**: 17,911.75 KB/s recibidos
|
|
59
|
+
- **Tiempo medio por solicitud**: 80.942 ms
|
|
60
|
+
- **Tiempo de procesamiento**: 15-272 ms (rango)
|
|
61
|
+
- **50% de solicitudes**: respondidas en ≤75 ms
|
|
62
|
+
- **99% de solicitudes**: respondidas en ≤172 ms
|
|
63
|
+
|
|
64
|
+
## Validación de Requisitos
|
|
65
|
+
|
|
66
|
+
### ✅ Cantidad de requests procesados mostrando kilobytes
|
|
67
|
+
- Contador preciso de solicitudes: 21,666
|
|
68
|
+
- Medición de bytes recibidos: 740 Bytes
|
|
69
|
+
|
|
70
|
+
### ✅ Cantidad de responses enviadas mostrando kilobytes
|
|
71
|
+
- Contador preciso de respuestas: 21,666
|
|
72
|
+
- Medición de bytes enviados: 287.69 MB
|
|
73
|
+
|
|
74
|
+
### ✅ Accesos a las rutas registradas (input y output)
|
|
75
|
+
- Registro detallado de todas las rutas accedidas
|
|
76
|
+
- Visualización clara de accesos por método y ruta
|
|
77
|
+
|
|
78
|
+
### ✅ Endpoints y rutas más accedidas
|
|
79
|
+
- Visualización de endpoints más accedidos (top 10)
|
|
80
|
+
- Visualización de rutas más accedidas (top 10)
|
|
81
|
+
- Actualización en tiempo real
|
|
82
|
+
|
|
83
|
+
## Arquitectura del Sistema de Estadísticas
|
|
84
|
+
|
|
85
|
+
### Componentes Principales
|
|
86
|
+
1. **`globalStats`**: Sistema de almacenamiento global en `lib/utils/globalStats.js`
|
|
87
|
+
2. **Actualización directa**: Las estadísticas se actualizan en el servidor cuando ocurren eventos
|
|
88
|
+
3. **Módulo StatsModule**: Lee las estadísticas globales y las muestra a través de comandos
|
|
89
|
+
|
|
90
|
+
### Ventajas del Diseño
|
|
91
|
+
- **Acceso directo**: Sin dependencia de hooks para actualización
|
|
92
|
+
- **Confiable**: Persistencia de datos entre solicitudes
|
|
93
|
+
- **Rápido**: Bajo overhead de procesamiento
|
|
94
|
+
- **Escalable**: Funciona eficientemente bajo alta carga
|
|
95
|
+
|
|
96
|
+
## Conclusiones
|
|
97
|
+
|
|
98
|
+
El módulo de estadísticas para JERK Framework v2.5.8 ha demostrado un rendimiento excepcional bajo condiciones de estrés extremo. Las pruebas con 20,000 solicitudes concurrentes han confirmado que:
|
|
99
|
+
|
|
100
|
+
1. **Estabilidad**: 0 fallos en 20,000 solicitudes
|
|
101
|
+
2. **Precisión**: Métricas actualizadas correctamente en tiempo real
|
|
102
|
+
3. **Rendimiento**: Más de 1,200 RPS consistentes
|
|
103
|
+
4. **Escalabilidad**: Capacidad para manejar alta concurrencia
|
|
104
|
+
5. **Funcionalidad**: Cumplimiento completo de todos los requisitos
|
|
105
|
+
|
|
106
|
+
El módulo está listo para producción y proporciona una herramienta invaluable para el monitoreo y análisis del rendimiento del servidor.
|
package/README.md
CHANGED
|
@@ -1,8 +1,69 @@
|
|
|
1
1
|

|
|
2
|
-
##### JERK Framework v2.5.
|
|
2
|
+
##### JERK Framework v2.5.8
|
|
3
3
|
|
|
4
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.
|
|
5
5
|
|
|
6
|
+
## 🚀 ¡Novedad! Optimización de Rendimiento del Sistema de Enrutamiento
|
|
7
|
+
|
|
8
|
+
**JERK Framework v2.5.7** incluye una optimización del sistema de enrutamiento que mejora drásticamente el rendimiento:
|
|
9
|
+
|
|
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
|
|
14
|
+
|
|
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.
|
|
16
|
+
|
|
17
|
+
## 🔧 Extensión de Administración
|
|
18
|
+
|
|
19
|
+
JERK Framework v2.5.7 incluye una extensión de administración que proporciona:
|
|
20
|
+
|
|
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
|
|
27
|
+
|
|
28
|
+
### Módulo de Estadísticas
|
|
29
|
+
|
|
30
|
+
El módulo de estadísticas (disponible desde v2.5.8) proporciona métricas detalladas del servidor:
|
|
31
|
+
|
|
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
|
|
36
|
+
|
|
37
|
+
### Comandos disponibles en la extensión de administración:
|
|
38
|
+
|
|
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
|
|
45
|
+
|
|
46
|
+
### Uso de la extensión de administración:
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
const { APIServer } = require('jerkjs');
|
|
50
|
+
|
|
51
|
+
const server = new APIServer({ port: 3000 });
|
|
52
|
+
|
|
53
|
+
// Iniciar la extensión de administración
|
|
54
|
+
server.initializeAdminExtension({
|
|
55
|
+
port: 9999,
|
|
56
|
+
host: '127.0.0.1' // Solo localhost
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
server.start();
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Una vez iniciado, puedes conectarte al servidor de administración usando telnet o nc:
|
|
63
|
+
```bash
|
|
64
|
+
telnet localhost 9999
|
|
65
|
+
```
|
|
66
|
+
|
|
6
67
|
## Características Principales
|
|
7
68
|
|
|
8
69
|
### 🚀 Rendimiento Optimizado
|
|
@@ -162,6 +223,10 @@ JERK Framework Team / Benjamin Sanhez Cardenas
|
|
|
162
223
|
|
|
163
224
|
GitLab: https://gitlab.com/bytedogssyndicate1/jerk
|
|
164
225
|
|
|
226
|
+
## Informe de Rendimiento del Módulo de Estadísticas
|
|
227
|
+
|
|
228
|
+
Para ver el informe detallado de pruebas y rendimiento del módulo de estadísticas, consulte: [ESTADISTICAS_RENDIMIENTO.md](ESTADISTICAS_RENDIMIENTO.md)
|
|
229
|
+
|
|
165
230
|
## Soporte
|
|
166
231
|
|
|
167
|
-
Para soporte, por favor abre un issue en el repositorio o visita nuestra página web: https://jerk.page.gd/
|
|
232
|
+
Para soporte, por favor abre un issue en el repositorio o visita nuestra página web: https://jerk.page.gd/
|
package/debug_hook.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Modificar temporalmente el archivo de hooks para mostrar la estructura completa del objeto
|
|
2
|
+
const { hooks } = require('../index.js');
|
|
3
|
+
|
|
4
|
+
// Hook para registrar cada ruta encontrada - versión de depuración
|
|
5
|
+
hooks.addAction('route_matched', (matchedRoute, req, res) => {
|
|
6
|
+
console.log(`[${new Date().toISOString()}] DEBUG route_matched:`);
|
|
7
|
+
console.log(` matchedRoute:`, JSON.stringify(matchedRoute, null, 2));
|
|
8
|
+
console.log(` req.method:`, req ? req.method : 'undefined');
|
|
9
|
+
console.log(` req.url:`, req ? req.url : 'undefined');
|
|
10
|
+
console.log('---');
|
|
11
|
+
});
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Manual de Extensión de Comandos para la Extensión de Administración de JERK
|
|
2
|
+
|
|
3
|
+
## Introducción
|
|
4
|
+
|
|
5
|
+
Este manual explica cómo crear nuevos comandos para la extensión de administración de JERK Framework. La extensión está diseñada con una arquitectura modular que permite añadir fácilmente nuevas funcionalidades.
|
|
6
|
+
|
|
7
|
+
## Arquitectura de la Extensión
|
|
8
|
+
|
|
9
|
+
La extensión de administración está construida con un sistema de módulos donde cada módulo puede definir comandos y un handler para procesarlos.
|
|
10
|
+
|
|
11
|
+
### Estructura de un Módulo
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
{
|
|
15
|
+
name: 'Nombre del Módulo',
|
|
16
|
+
description: 'Descripción del módulo',
|
|
17
|
+
commands: ['comando1', 'comando2'], // Lista de comandos que maneja
|
|
18
|
+
handler: function(command, socket) { // Función que maneja los comandos
|
|
19
|
+
// Lógica para manejar los comandos
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Cómo Crear un Nuevo Módulo con Comandos
|
|
25
|
+
|
|
26
|
+
### Paso 1: Localizar el Archivo de la Extensión
|
|
27
|
+
|
|
28
|
+
El archivo principal de la extensión se encuentra en:
|
|
29
|
+
`/lib/admin/AdminExtension.js`
|
|
30
|
+
|
|
31
|
+
### Paso 2: Registrar un Nuevo Módulo
|
|
32
|
+
|
|
33
|
+
En el método `registerModules()`, añade tu nuevo módulo:
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
/**
|
|
37
|
+
* Registra los módulos de administración
|
|
38
|
+
*/
|
|
39
|
+
registerModules() {
|
|
40
|
+
// Módulo de rutas - el primer módulo
|
|
41
|
+
this.modules.set('routes', {
|
|
42
|
+
name: 'Routes Module',
|
|
43
|
+
description: 'Módulo para ver rutas registradas y activas',
|
|
44
|
+
commands: ['routes', 'active'],
|
|
45
|
+
handler: this.handleRoutesCommand.bind(this)
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Módulo de sistema - para comandos generales
|
|
49
|
+
this.modules.set('system', {
|
|
50
|
+
name: 'System Module',
|
|
51
|
+
description: 'Módulo para información del sistema',
|
|
52
|
+
commands: ['version', 'status', 'help'],
|
|
53
|
+
handler: this.handleSystemCommand.bind(this)
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// TU NUEVO MÓDULO AQUÍ
|
|
57
|
+
this.modules.set('mymodule', {
|
|
58
|
+
name: 'My Custom Module',
|
|
59
|
+
description: 'Módulo para funcionalidades personalizadas',
|
|
60
|
+
commands: ['mycommand', 'anothercommand'],
|
|
61
|
+
handler: this.handleMyModuleCommand.bind(this)
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Paso 3: Crear el Handler del Módulo
|
|
67
|
+
|
|
68
|
+
Después de registrar el módulo, debes crear la función handler que procesará los comandos:
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
/**
|
|
72
|
+
* Manejador para el módulo personalizado
|
|
73
|
+
*/
|
|
74
|
+
handleMyModuleCommand(command, socket) {
|
|
75
|
+
switch (command) {
|
|
76
|
+
case 'mycommand':
|
|
77
|
+
this.handleMyCommand(socket);
|
|
78
|
+
break;
|
|
79
|
+
case 'anothercommand':
|
|
80
|
+
this.handleAnotherCommand(socket);
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
socket.write(`Comando desconocido para el módulo: ${command}\n`);
|
|
84
|
+
socket.write(`Comandos disponibles: mycommand, anothercommand\n\n`);
|
|
85
|
+
socket.write(`> `);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Maneja el comando 'mycommand'
|
|
91
|
+
*/
|
|
92
|
+
handleMyCommand(socket) {
|
|
93
|
+
socket.write('\n=== Mi Comando Personalizado ===\n');
|
|
94
|
+
socket.write('Este es un ejemplo de comando personalizado.\n');
|
|
95
|
+
socket.write('Puedes añadir cualquier lógica aquí.\n\n');
|
|
96
|
+
socket.write('> ');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Maneja el comando 'anothercommand'
|
|
101
|
+
*/
|
|
102
|
+
handleAnotherCommand(socket) {
|
|
103
|
+
socket.write('\n=== Otro Comando ===\n');
|
|
104
|
+
socket.write('Este es otro ejemplo de comando.\n\n');
|
|
105
|
+
socket.write('> ');
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Ejemplo Completo: Módulo de Estadísticas
|
|
110
|
+
|
|
111
|
+
Aquí tienes un ejemplo completo de cómo crear un módulo de estadísticas:
|
|
112
|
+
|
|
113
|
+
```javascript
|
|
114
|
+
/**
|
|
115
|
+
* Registra los módulos de administración
|
|
116
|
+
*/
|
|
117
|
+
registerModules() {
|
|
118
|
+
// ... otros módulos ...
|
|
119
|
+
|
|
120
|
+
// Módulo de estadísticas
|
|
121
|
+
this.modules.set('stats', {
|
|
122
|
+
name: 'Statistics Module',
|
|
123
|
+
description: 'Módulo para ver estadísticas del servidor',
|
|
124
|
+
commands: ['stats', 'memory', 'requests'],
|
|
125
|
+
handler: this.handleStatsCommand.bind(this)
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Manejador para el módulo de estadísticas
|
|
131
|
+
*/
|
|
132
|
+
handleStatsCommand(command, socket) {
|
|
133
|
+
switch (command) {
|
|
134
|
+
case 'stats':
|
|
135
|
+
this.showGeneralStats(socket);
|
|
136
|
+
break;
|
|
137
|
+
case 'memory':
|
|
138
|
+
this.showMemoryStats(socket);
|
|
139
|
+
break;
|
|
140
|
+
case 'requests':
|
|
141
|
+
this.showRequestStats(socket);
|
|
142
|
+
break;
|
|
143
|
+
default:
|
|
144
|
+
socket.write(`Comando desconocido para el módulo de estadísticas: ${command}\n`);
|
|
145
|
+
socket.write(`Comandos disponibles: stats, memory, requests\n\n`);
|
|
146
|
+
socket.write(`> `);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Muestra estadísticas generales
|
|
152
|
+
*/
|
|
153
|
+
showGeneralStats(socket) {
|
|
154
|
+
const uptime = process.uptime();
|
|
155
|
+
const totalRequests = this.activeRoutes.size;
|
|
156
|
+
|
|
157
|
+
socket.write('\n=== Estadísticas Generales ===\n');
|
|
158
|
+
socket.write(`Tiempo de actividad: ${Math.floor(uptime)} segundos\n`);
|
|
159
|
+
socket.write(`Solicitudes procesadas: ${totalRequests}\n`);
|
|
160
|
+
socket.write(`Clientes conectados: ${this.clients.size}\n\n`);
|
|
161
|
+
socket.write(`> `);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Muestra estadísticas de memoria
|
|
166
|
+
*/
|
|
167
|
+
showMemoryStats(socket) {
|
|
168
|
+
const memUsage = process.memoryUsage();
|
|
169
|
+
|
|
170
|
+
socket.write('\n=== Uso de Memoria ===\n');
|
|
171
|
+
socket.write(`RSS: ${(memUsage.rss / 1024 / 1024).toFixed(2)} MB\n`);
|
|
172
|
+
socket.write(`Heap Total: ${(memUsage.heapTotal / 1024 / 1024).toFixed(2)} MB\n`);
|
|
173
|
+
socket.write(`Heap Used: ${(memUsage.heapUsed / 1024 / 1024).toFixed(2)} MB\n`);
|
|
174
|
+
socket.write(`External: ${(memUsage.external / 1024 / 1024).toFixed(2)} MB\n\n`);
|
|
175
|
+
socket.write(`> `);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Muestra estadísticas de solicitudes
|
|
180
|
+
*/
|
|
181
|
+
showRequestStats(socket) {
|
|
182
|
+
socket.write('\n=== Estadísticas de Solicitudes ===\n');
|
|
183
|
+
socket.write(`Solicitudes activas registradas: ${this.activeRoutes.size}\n`);
|
|
184
|
+
|
|
185
|
+
if (this.activeRoutes.size > 0) {
|
|
186
|
+
socket.write('Métodos HTTP utilizados:\n');
|
|
187
|
+
const methods = {};
|
|
188
|
+
for (const [url, info] of this.activeRoutes) {
|
|
189
|
+
methods[info.method] = (methods[info.method] || 0) + 1;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
for (const [method, count] of Object.entries(methods)) {
|
|
193
|
+
socket.write(` ${method}: ${count} solicitudes\n`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
socket.write('\n> ');
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Buenas Prácticas
|
|
202
|
+
|
|
203
|
+
1. **Nombres de comandos claros**: Usa nombres descriptivos y cortos para los comandos.
|
|
204
|
+
|
|
205
|
+
2. **Manejo de errores**: Siempre incluye un caso `default` en los switches para manejar comandos desconocidos.
|
|
206
|
+
|
|
207
|
+
3. **Formato consistente**: Mantén un formato consistente en las respuestas para mejorar la experiencia del usuario.
|
|
208
|
+
|
|
209
|
+
4. **Prompts finales**: Asegúrate de escribir `> ` al final de cada comando para mostrar el prompt.
|
|
210
|
+
|
|
211
|
+
5. **Documentación**: Documenta cada nuevo comando y su funcionalidad.
|
|
212
|
+
|
|
213
|
+
## Integración con Hooks del Framework
|
|
214
|
+
|
|
215
|
+
Puedes integrar tu módulo con los hooks del framework para capturar eventos en tiempo real:
|
|
216
|
+
|
|
217
|
+
```javascript
|
|
218
|
+
/**
|
|
219
|
+
* Registra los hooks necesarios para rastrear rutas
|
|
220
|
+
*/
|
|
221
|
+
registerHooks() {
|
|
222
|
+
if (this.hooks) {
|
|
223
|
+
// Hook para rastrear rutas registradas
|
|
224
|
+
this.hooks.addAction('route_registered', (route) => {
|
|
225
|
+
this.registeredRoutes.push(route);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Hook para rastrear rutas activas
|
|
229
|
+
this.hooks.addAction('request_received', (req, res) => {
|
|
230
|
+
const routeInfo = {
|
|
231
|
+
method: req.method,
|
|
232
|
+
url: req.url,
|
|
233
|
+
timestamp: new Date().toISOString(),
|
|
234
|
+
remoteAddress: req.connection.remoteAddress
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Usar la URL como clave y almacenar la última solicitud
|
|
238
|
+
this.activeRoutes.set(req.url, routeInfo);
|
|
239
|
+
|
|
240
|
+
// Disparar hook específico para módulos de administración
|
|
241
|
+
this.hooks.doAction('admin_route_active', routeInfo);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// Hook para cuando se cierra el servidor
|
|
245
|
+
this.hooks.addAction('server_stopped', () => {
|
|
246
|
+
this.close();
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// Añade aquí tus propios hooks personalizados
|
|
250
|
+
this.hooks.addAction('my_custom_event', (data) => {
|
|
251
|
+
// Procesa el evento personalizado
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Conclusión
|
|
258
|
+
|
|
259
|
+
Crear nuevos comandos para la extensión de administración es sencillo gracias a su arquitectura modular. Simplemente registra un nuevo módulo con sus comandos y handler, y la extensión se encargará del resto.
|
|
260
|
+
|
|
261
|
+
La extensión está diseñada para ser fácilmente extensible, permitiendo añadir nuevas funcionalidades de administración según las necesidades del proyecto.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ejemplo de uso del hook para inicializar la extensión de administración
|
|
3
|
+
*
|
|
4
|
+
* Este archivo demuestra cómo usar el hook 'admin_extensions_initialize'
|
|
5
|
+
* para inicializar la extensión de administración después de que el servidor
|
|
6
|
+
* esté completamente iniciado y todas las rutas hayan sido cargadas.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Suponiendo que tienes acceso al sistema de hooks
|
|
10
|
+
const { hooks } = require('jerkjs');
|
|
11
|
+
|
|
12
|
+
// Registrar un listener para el hook de inicialización de extensiones
|
|
13
|
+
hooks.addAction('admin_extensions_initialize', (server) => {
|
|
14
|
+
console.log('Inicializando extensión de administración...');
|
|
15
|
+
|
|
16
|
+
// Inicializar la extensión de administración
|
|
17
|
+
server.initializeAdminExtension({
|
|
18
|
+
port: 9999,
|
|
19
|
+
host: '127.0.0.1'
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
console.log('Extensión de administración inicializada.');
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Alternativamente, puedes usar un archivo de configuración de hooks
|
|
27
|
+
* como el que se usa en test-app/hooks-config.js
|
|
28
|
+
*/
|