blackcoffee2 2.1.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.
- package/CHANGELOG.md +664 -0
- package/LICENSE +201 -0
- package/NOTICE +25 -0
- package/README.md +246 -0
- package/apps.zip +0 -0
- package/bin/adminclient +105 -0
- package/bin/blackcoffee +133 -0
- package/cli/admin-users.js +282 -0
- package/cli/commands/app.js +561 -0
- package/cli/commands/config.js +182 -0
- package/cli/commands/db.js +257 -0
- package/cli/commands/server.js +200 -0
- package/config/applications.json +5 -0
- package/config/database.json +28 -0
- package/config/database.json.example +23 -0
- package/config/server.json +32 -0
- package/controllers/admin/AdminController.js +529 -0
- package/controllers/admin/AdminViewController.js +90 -0
- package/controllers/admin/AuthController.js +293 -0
- package/controllers/admin/DatabaseAdminController.js +218 -0
- package/core/SQLiteAdapter.js +333 -0
- package/core/appLoader.js +385 -0
- package/core/databasePoolManager.js +431 -0
- package/core/hotReload.js +363 -0
- package/data/ADMIN-README.md +145 -0
- package/data/CHANGELOG.md +48 -0
- package/data/GTK3-NODE-PROPOSALS.md +410 -0
- package/data/admin-db.js +150 -0
- package/data/admin-gui.js +452 -0
- package/data/blackcoffee_admin.db-shm +0 -0
- package/data/blackcoffee_admin.db-wal +0 -0
- package/data/migrations/001_create_admin_users.sql +33 -0
- package/docs/APP_HOOKS_HANDLER.md +432 -0
- package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
- package/docs/ARCHITECTURE.md +435 -0
- package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
- package/docs/EVENTS_APP_MANUAL.md +289 -0
- package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
- package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
- package/docs/ROADMAP.md +242 -0
- package/docs/ROADMAP.md.backup +243 -0
- package/includes/404-hooks.js +423 -0
- package/includes/adminAuth.js +214 -0
- package/includes/adminExtension.js +53 -0
- package/includes/appHooks.js +302 -0
- package/includes/initAdminDb.js +115 -0
- package/includes/routeLoader.js +67 -0
- package/includes/sessions.js +223 -0
- package/issues/001-duplicate-module-loading.md +92 -0
- package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
- package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
- package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
- package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
- package/manuales/CACHE_SYSTEM_MAP.md +206 -0
- package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
- package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
- package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
- package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
- package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
- package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
- package/manuales/WAF_MODULE_MANUAL.md +229 -0
- package/manuales/after_route_handler_filter_example.md +116 -0
- package/manuales/after_route_handler_usage.md +130 -0
- package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
- package/manuales/async_hooks_promises_guide.md +325 -0
- package/manuales/before_route_handler_filter_example.md +97 -0
- package/manuales/before_route_handler_usage.md +122 -0
- package/manuales/hooks_chaining_conditions_guide.md +261 -0
- package/manuales/hooks_filters_documentation.md +493 -0
- package/manuales/hooks_filters_documentation_en.md +493 -0
- package/manuales/hooks_vs_middlewares_comparison.md +87 -0
- package/manuales/manual-mvc-completo.md +934 -0
- package/manuales/modulos_administracion.md +89 -0
- package/manuales/router_execution_points.md +74 -0
- package/manuales/static_file_hooks_usage.md +222 -0
- package/models/AdminUserModel.js +132 -0
- package/package.json +45 -0
- package/programatically/PRoutes.js +89 -0
- package/programatically/initFlow.js +211 -0
- package/public/admin/css/db-pools.css +336 -0
- package/public/admin/css/styles.css +310 -0
- package/public/admin/database.html +312 -0
- package/public/admin/index.html +116 -0
- package/public/admin/js/app.js +470 -0
- package/public/admin/js/db-pools.js +253 -0
- package/public/admin/login.html +278 -0
- package/public/assets/css/styles.css +477 -0
- package/public/assets/js/main.js +89 -0
- package/public/index.html +136 -0
- package/public/templates/404.html +158 -0
- package/routes/admin-views.json +20 -0
- package/routes/admin.json +38 -0
- package/routes/auth.json +32 -0
- package/routes/static.json +18 -0
- package/server.js +299 -0
- package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
- package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
- package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
- package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
- package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
- package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
- package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
- package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
- package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
- package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
- package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
- package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
- package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
- package/test-aplicacion.con-logisession/controllers/example.js +183 -0
- package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
- package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
- package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
- package/test-aplicacion.con-logisession/controllers/test.js +0 -0
- package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
- package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
- package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
- package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
- package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
- package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
- package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
- package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
- package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
- package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
- package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
- package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
- package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
- package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
- package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
- package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
- package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
- package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
- package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
- package/test-aplicacion.con-logisession/package-lock.json +3313 -0
- package/test-aplicacion.con-logisession/package.json +32 -0
- package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
- package/test-aplicacion.con-logisession/public/css/style.css +64 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
- package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
- package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
- package/test-aplicacion.con-logisession/public/js/main.js +67 -0
- package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
- package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
- package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
- package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
- package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
- package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
- package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
- package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
- package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
- package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
- package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
- package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
- package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
- package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
- package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
- package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
- package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
- package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
- package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
- package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
- package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
- package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
- package/test-aplicacion.con-logisession/views/products/index.html +39 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Issue: Duplicate Module Loading in AdminExtension
|
|
2
|
+
|
|
3
|
+
## Report Date
|
|
4
|
+
2026-02-16
|
|
5
|
+
|
|
6
|
+
## Affected Component
|
|
7
|
+
**File:** `lib/admin/AdminExtension.js`
|
|
8
|
+
**Framework:** Insitu Framework v1.2.0
|
|
9
|
+
|
|
10
|
+
## Problem Description
|
|
11
|
+
|
|
12
|
+
Modules are being loaded **twice** during the initialization of the AdminExtension, causing duplicate log messages and potential performance issues.
|
|
13
|
+
|
|
14
|
+
## Root Cause
|
|
15
|
+
|
|
16
|
+
In the `initialize()` method, both `registerModules()` and `loadCustomModules()` are called separately:
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
// Line 63-68 in AdminExtension.js
|
|
20
|
+
this.registerModules();
|
|
21
|
+
this.loadCustomModules(); // ← First call
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
However, `registerModules()` **also** calls `loadCustomModules()` internally:
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
// Line 173 in AdminExtension.js
|
|
28
|
+
registerModules() {
|
|
29
|
+
// ... register default modules ...
|
|
30
|
+
|
|
31
|
+
this.loadCustomModules(); // ← Second call (duplicate)
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Evidence
|
|
36
|
+
|
|
37
|
+
When starting the BlackCoffee server, the log shows duplicate messages:
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Módulo 'WAFModule' cargado exitosamente.
|
|
41
|
+
Módulo 'WAFModule' cargado exitosamente. ← Duplicate
|
|
42
|
+
|
|
43
|
+
Módulo 'CacheModule' cargado exitosamente.
|
|
44
|
+
Módulo 'CacheModule' cargado exitosamente. ← Duplicate
|
|
45
|
+
|
|
46
|
+
// ... all modules show the same pattern
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Impact
|
|
50
|
+
|
|
51
|
+
1. **Duplicate log messages** - Confusing for developers
|
|
52
|
+
2. **Potential memory leaks** - Modules might be registered twice in the modules Map
|
|
53
|
+
3. **Performance overhead** - Unnecessary file system operations
|
|
54
|
+
4. **Event handler duplication** - Hooks might be registered multiple times
|
|
55
|
+
|
|
56
|
+
## Suggested Fix
|
|
57
|
+
|
|
58
|
+
Remove the redundant `loadCustomModules()` call from the `initialize()` method:
|
|
59
|
+
|
|
60
|
+
```javascript
|
|
61
|
+
// CURRENT CODE (lines 63-68):
|
|
62
|
+
this.registerModules();
|
|
63
|
+
this.loadCustomModules(); // ← REMOVE THIS LINE
|
|
64
|
+
|
|
65
|
+
// FIXED CODE:
|
|
66
|
+
this.registerModules(); // This already calls loadCustomModules() internally
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Files to Modify
|
|
70
|
+
|
|
71
|
+
- `lib/admin/AdminExtension.js` - Line 68 (remove the call to `loadCustomModules()`)
|
|
72
|
+
|
|
73
|
+
## Testing
|
|
74
|
+
|
|
75
|
+
After applying the fix, verify that:
|
|
76
|
+
1. Each module loads only once (check logs)
|
|
77
|
+
2. All admin commands still work correctly
|
|
78
|
+
3. Custom modules from `./modules` directory still load properly
|
|
79
|
+
4. No functionality is broken
|
|
80
|
+
|
|
81
|
+
## Workaround (for BlackCoffee)
|
|
82
|
+
|
|
83
|
+
Until this is fixed in the framework, BlackCoffee can patch the file locally or tolerate the duplicate loading (it doesn't break functionality, just creates noise in logs).
|
|
84
|
+
|
|
85
|
+
## Priority
|
|
86
|
+
|
|
87
|
+
**Medium** - Doesn't break functionality but causes confusion and potential issues.
|
|
88
|
+
|
|
89
|
+
## Reported By
|
|
90
|
+
|
|
91
|
+
BlackCoffee Team
|
|
92
|
+
Repository: https://gitlab.com/bytedogssyndicate1/bc2
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Manual de Extensión de Comandos para la Extensión de Administración de Insitu
|
|
2
|
+
|
|
3
|
+
## Introducción
|
|
4
|
+
|
|
5
|
+
Este manual explica cómo crear nuevos comandos para la extensión de administración de Insitu 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('insitu');
|
|
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
|
+
*/
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# Manual de Integración de la Extensión de Administración
|
|
2
|
+
|
|
3
|
+
## Introducción
|
|
4
|
+
|
|
5
|
+
Este manual explica cómo integrar la extensión de administración de Insitu Framework en tus proyectos. La extensión proporciona un servidor TCP de administración que permite monitorear y gestionar tu aplicación en tiempo real.
|
|
6
|
+
|
|
7
|
+
## Características
|
|
8
|
+
|
|
9
|
+
- **Servidor TCP de administración**: Accesible solo desde localhost por seguridad
|
|
10
|
+
- **Monitoreo en tiempo real**: Visualización de rutas registradas y activas
|
|
11
|
+
- **Sistema de módulos extensible**: Arquitectura para añadir nuevas funcionalidades
|
|
12
|
+
- **Integración con hooks**: Sistema de extensibilidad basado en el sistema de hooks del framework
|
|
13
|
+
- **Puerto configurable**: Por defecto en el puerto 9999
|
|
14
|
+
|
|
15
|
+
## Requisitos Previos
|
|
16
|
+
|
|
17
|
+
- Insitu Framework v1.0.0 o superior
|
|
18
|
+
- Node.js 14.0.0 o superior
|
|
19
|
+
- Acceso a la instancia del servidor APIServer
|
|
20
|
+
|
|
21
|
+
## Instalación
|
|
22
|
+
|
|
23
|
+
La extensión de administración ya viene incluida en Insitu Framework v1.0.0+, por lo que no requiere instalación adicional.
|
|
24
|
+
|
|
25
|
+
## Integración Básica
|
|
26
|
+
|
|
27
|
+
### Método 1: Inicialización Directa
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
const { APIServer } = require('insitu');
|
|
31
|
+
|
|
32
|
+
const server = new APIServer({ port: 3000 });
|
|
33
|
+
|
|
34
|
+
// Inicializar la extensión de administración
|
|
35
|
+
server.initializeAdminExtension({
|
|
36
|
+
port: 9999,
|
|
37
|
+
host: '127.0.0.1' // Solo localhost (recomendado)
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
server.start();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Método 2: Con Opciones Personalizadas
|
|
44
|
+
|
|
45
|
+
```javascript
|
|
46
|
+
const { APIServer } = require('insitu');
|
|
47
|
+
|
|
48
|
+
const server = new APIServer({
|
|
49
|
+
port: 3000,
|
|
50
|
+
host: 'localhost'
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Inicializar con opciones personalizadas
|
|
54
|
+
server.initializeAdminExtension({
|
|
55
|
+
port: 9999, // Puerto personalizado (por defecto: 9999)
|
|
56
|
+
host: '127.0.0.1' // Host personalizado (por defecto: '127.0.0.1')
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
server.start();
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Integración con Carga de Rutas
|
|
63
|
+
|
|
64
|
+
### Recomendado: Después de Cargar Rutas
|
|
65
|
+
|
|
66
|
+
Para asegurar que la extensión capture todas las rutas registradas, es recomendable inicializarla después de cargar las rutas:
|
|
67
|
+
|
|
68
|
+
```javascript
|
|
69
|
+
const {
|
|
70
|
+
APIServer,
|
|
71
|
+
RouteDirectoryLoader,
|
|
72
|
+
ViewEngine,
|
|
73
|
+
ModelManager
|
|
74
|
+
} = require('insitu');
|
|
75
|
+
|
|
76
|
+
const server = new APIServer({ port: 3000 });
|
|
77
|
+
|
|
78
|
+
// Configurar otros componentes
|
|
79
|
+
const viewEngine = new ViewEngine({ viewsDir: './views' });
|
|
80
|
+
const modelManager = new ModelManager();
|
|
81
|
+
server.viewEngine = viewEngine;
|
|
82
|
+
server.modelManager = modelManager;
|
|
83
|
+
|
|
84
|
+
// Cargar rutas desde directorio
|
|
85
|
+
const routeDirectoryLoader = new RouteDirectoryLoader();
|
|
86
|
+
routeDirectoryLoader.loadRoutesFromDirectory(server, './routes')
|
|
87
|
+
.then(routes => {
|
|
88
|
+
console.log(`${routes.length} rutas cargadas exitosamente`);
|
|
89
|
+
|
|
90
|
+
// Inicializar la extensión de administración DESPUÉS de cargar rutas
|
|
91
|
+
server.initializeAdminExtension({
|
|
92
|
+
port: 9999,
|
|
93
|
+
host: '127.0.0.1'
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// Iniciar el servidor
|
|
97
|
+
server.start();
|
|
98
|
+
})
|
|
99
|
+
.catch(error => {
|
|
100
|
+
console.error('Error cargando rutas:', error.message);
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Integración en Diferentes Puntos del Ciclo de Vida
|
|
105
|
+
|
|
106
|
+
### Durante la Configuración del Servidor
|
|
107
|
+
|
|
108
|
+
```javascript
|
|
109
|
+
const { APIServer, SessionManager } = require('insitu');
|
|
110
|
+
|
|
111
|
+
const server = new APIServer({ port: 3000 });
|
|
112
|
+
|
|
113
|
+
// Configurar sesión
|
|
114
|
+
const sessionManager = new SessionManager();
|
|
115
|
+
server.use(sessionManager.middleware());
|
|
116
|
+
|
|
117
|
+
// Inicializar extensión de administración en cualquier punto
|
|
118
|
+
server.initializeAdminExtension({
|
|
119
|
+
port: 9999,
|
|
120
|
+
host: '127.0.0.1'
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
server.start();
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Usando el Hook de Inicialización de Extensiones (Recomendado)
|
|
127
|
+
|
|
128
|
+
Para garantizar que la extensión se inicialice después de que todas las rutas hayan sido completamente cargadas y el servidor esté operativo, puedes usar el hook `admin_extensions_initialize`:
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
const { hooks } = require('insitu');
|
|
132
|
+
|
|
133
|
+
// Registrar un listener para el hook de inicialización de extensiones
|
|
134
|
+
hooks.addAction('admin_extensions_initialize', (server) => {
|
|
135
|
+
// Inicializar la extensión de administración después de que el servidor esté completamente iniciado
|
|
136
|
+
server.initializeAdminExtension({
|
|
137
|
+
port: 9999,
|
|
138
|
+
host: '127.0.0.1'
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Este enfoque garantiza que la extensión de administración se inicialice en el momento óptimo del ciclo de vida del servidor, después de que todas las rutas hayan sido cargadas y el servidor esté completamente operativo.
|
|
144
|
+
|
|
145
|
+
### En Middleware o Controladores
|
|
146
|
+
|
|
147
|
+
La extensión se puede inicializar en cualquier momento, incluso en middleware o controladores, aunque no es recomendable:
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
// En un archivo de middleware
|
|
151
|
+
function initializeAdminIfNotExists(req, res, next) {
|
|
152
|
+
if (!req.server.adminExtension) {
|
|
153
|
+
req.server.initializeAdminExtension({
|
|
154
|
+
port: 9999,
|
|
155
|
+
host: '127.0.0.1'
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
next();
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Comandos Disponibles
|
|
163
|
+
|
|
164
|
+
Una vez iniciada la extensión, puedes conectarte usando telnet o nc:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
telnet localhost 9999
|
|
168
|
+
# o
|
|
169
|
+
nc localhost 9999
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Comandos del Módulo de Rutas:
|
|
173
|
+
- `routes` - Muestra las rutas registradas
|
|
174
|
+
- `active` - Muestra las rutas activas (solicitudes recientes)
|
|
175
|
+
|
|
176
|
+
### Comandos del Módulo de Sistema:
|
|
177
|
+
- `version` - Muestra la versión del framework
|
|
178
|
+
- `status` - Muestra el estado del servidor
|
|
179
|
+
- `help` - Muestra la ayuda
|
|
180
|
+
|
|
181
|
+
### Comandos Generales:
|
|
182
|
+
- `help` - Muestra la ayuda general
|
|
183
|
+
- `quit` - Cierra la conexión
|
|
184
|
+
|
|
185
|
+
## Seguridad
|
|
186
|
+
|
|
187
|
+
- El servidor de administración solo escucha en localhost (127.0.0.1) por defecto
|
|
188
|
+
- No es accesible desde fuera de la máquina local
|
|
189
|
+
- Se recomienda mantener el puerto 9999 (o el puerto elegido) detrás del firewall
|
|
190
|
+
- No enviar información sensible a través de la conexión de administración
|
|
191
|
+
|
|
192
|
+
## Configuración Avanzada
|
|
193
|
+
|
|
194
|
+
### Puerto Personalizado
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
server.initializeAdminExtension({
|
|
198
|
+
port: 8888, // Puerto personalizado
|
|
199
|
+
host: '127.0.0.1'
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Múltiples Instancias (No Recomendado)
|
|
204
|
+
|
|
205
|
+
Aunque técnicamente posible, no se recomienda inicializar múltiples extensiones de administración en el mismo servidor.
|
|
206
|
+
|
|
207
|
+
## Troubleshooting
|
|
208
|
+
|
|
209
|
+
### El comando `routes` no muestra rutas
|
|
210
|
+
- Asegúrate de que la extensión se inicialice después de cargar las rutas
|
|
211
|
+
- Verifica que las rutas se hayan registrado correctamente
|
|
212
|
+
|
|
213
|
+
### No puedo conectarme al puerto
|
|
214
|
+
- Verifica que el puerto esté disponible
|
|
215
|
+
- Asegúrate de que el firewall no esté bloqueando la conexión
|
|
216
|
+
- Confirma que la extensión se haya inicializado correctamente
|
|
217
|
+
|
|
218
|
+
### Comandos no reconocidos
|
|
219
|
+
- Asegúrate de estar usando la versión correcta de Insitu Framework
|
|
220
|
+
- Verifica que la extensión se haya inicializado correctamente
|
|
221
|
+
|
|
222
|
+
## Buenas Prácticas
|
|
223
|
+
|
|
224
|
+
1. **Inicializar después de cargar rutas**: Para capturar todas las rutas registradas
|
|
225
|
+
2. **Usar localhost**: Siempre usar 127.0.0.1 como host para seguridad
|
|
226
|
+
3. **Puerto dedicado**: Usar un puerto diferente al del servidor web principal
|
|
227
|
+
4. **Entornos de desarrollo**: Adecuado para entornos de desarrollo y pruebas
|
|
228
|
+
5. **No en producción**: No se recomienda usar en entornos de producción sin medidas de seguridad adicionales
|
|
229
|
+
|
|
230
|
+
## Conclusión
|
|
231
|
+
|
|
232
|
+
La extensión de administración se integra de forma transparente en Insitu Framework y proporciona herramientas poderosas para monitorear y gestionar tu aplicación. La integración es simple y flexible, permitiendo inicializarla en cualquier punto del ciclo de vida del servidor.
|