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.
Files changed (170) hide show
  1. package/CHANGELOG.md +664 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +25 -0
  4. package/README.md +246 -0
  5. package/apps.zip +0 -0
  6. package/bin/adminclient +105 -0
  7. package/bin/blackcoffee +133 -0
  8. package/cli/admin-users.js +282 -0
  9. package/cli/commands/app.js +561 -0
  10. package/cli/commands/config.js +182 -0
  11. package/cli/commands/db.js +257 -0
  12. package/cli/commands/server.js +200 -0
  13. package/config/applications.json +5 -0
  14. package/config/database.json +28 -0
  15. package/config/database.json.example +23 -0
  16. package/config/server.json +32 -0
  17. package/controllers/admin/AdminController.js +529 -0
  18. package/controllers/admin/AdminViewController.js +90 -0
  19. package/controllers/admin/AuthController.js +293 -0
  20. package/controllers/admin/DatabaseAdminController.js +218 -0
  21. package/core/SQLiteAdapter.js +333 -0
  22. package/core/appLoader.js +385 -0
  23. package/core/databasePoolManager.js +431 -0
  24. package/core/hotReload.js +363 -0
  25. package/data/ADMIN-README.md +145 -0
  26. package/data/CHANGELOG.md +48 -0
  27. package/data/GTK3-NODE-PROPOSALS.md +410 -0
  28. package/data/admin-db.js +150 -0
  29. package/data/admin-gui.js +452 -0
  30. package/data/blackcoffee_admin.db-shm +0 -0
  31. package/data/blackcoffee_admin.db-wal +0 -0
  32. package/data/migrations/001_create_admin_users.sql +33 -0
  33. package/docs/APP_HOOKS_HANDLER.md +432 -0
  34. package/docs/APP_HOOKS_REQUIREMENTS.md +588 -0
  35. package/docs/ARCHITECTURE.md +435 -0
  36. package/docs/CREAR_APP_Y_USAR_POOLS.md +1595 -0
  37. package/docs/EVENTS_APP_MANUAL.md +289 -0
  38. package/docs/INSITU_BINARY_UPLOAD_PROPOSAL.md +186 -0
  39. package/docs/INSITU_FIREWALL_EXCEPTION.md +187 -0
  40. package/docs/ROADMAP.md +242 -0
  41. package/docs/ROADMAP.md.backup +243 -0
  42. package/includes/404-hooks.js +423 -0
  43. package/includes/adminAuth.js +214 -0
  44. package/includes/adminExtension.js +53 -0
  45. package/includes/appHooks.js +302 -0
  46. package/includes/initAdminDb.js +115 -0
  47. package/includes/routeLoader.js +67 -0
  48. package/includes/sessions.js +223 -0
  49. package/issues/001-duplicate-module-loading.md +92 -0
  50. package/manuales/ADMIN_EXTENSION_COMMANDS_MANUAL.md +261 -0
  51. package/manuales/ADMIN_EXTENSION_HOOK_EXAMPLE.md +28 -0
  52. package/manuales/ADMIN_EXTENSION_INTEGRATION_MANUAL.md +232 -0
  53. package/manuales/CACHE_REGEX_COMMANDS.md +136 -0
  54. package/manuales/CACHE_SYSTEM_MAP.md +206 -0
  55. package/manuales/CREACION_DE_CONTROLADORES_INSITU.md +383 -0
  56. package/manuales/QUEUE_CLI_MODULE_MANUAL.md +289 -0
  57. package/manuales/QUEUE_SYSTEM_MANUAL.md +320 -0
  58. package/manuales/ROUTE_CACHE_MODULE_MANUAL.md +205 -0
  59. package/manuales/SESSION_MANAGER_GUIDE.md +529 -0
  60. package/manuales/SESSION_SECURITY_FLAGS.md +174 -0
  61. package/manuales/WAF_MODULE_MANUAL.md +229 -0
  62. package/manuales/after_route_handler_filter_example.md +116 -0
  63. package/manuales/after_route_handler_usage.md +130 -0
  64. package/manuales/an/303/241lisis-completo-insitu-framework.md +213 -0
  65. package/manuales/async_hooks_promises_guide.md +325 -0
  66. package/manuales/before_route_handler_filter_example.md +97 -0
  67. package/manuales/before_route_handler_usage.md +122 -0
  68. package/manuales/hooks_chaining_conditions_guide.md +261 -0
  69. package/manuales/hooks_filters_documentation.md +493 -0
  70. package/manuales/hooks_filters_documentation_en.md +493 -0
  71. package/manuales/hooks_vs_middlewares_comparison.md +87 -0
  72. package/manuales/manual-mvc-completo.md +934 -0
  73. package/manuales/modulos_administracion.md +89 -0
  74. package/manuales/router_execution_points.md +74 -0
  75. package/manuales/static_file_hooks_usage.md +222 -0
  76. package/models/AdminUserModel.js +132 -0
  77. package/package.json +45 -0
  78. package/programatically/PRoutes.js +89 -0
  79. package/programatically/initFlow.js +211 -0
  80. package/public/admin/css/db-pools.css +336 -0
  81. package/public/admin/css/styles.css +310 -0
  82. package/public/admin/database.html +312 -0
  83. package/public/admin/index.html +116 -0
  84. package/public/admin/js/app.js +470 -0
  85. package/public/admin/js/db-pools.js +253 -0
  86. package/public/admin/login.html +278 -0
  87. package/public/assets/css/styles.css +477 -0
  88. package/public/assets/js/main.js +89 -0
  89. package/public/index.html +136 -0
  90. package/public/templates/404.html +158 -0
  91. package/routes/admin-views.json +20 -0
  92. package/routes/admin.json +38 -0
  93. package/routes/auth.json +32 -0
  94. package/routes/static.json +18 -0
  95. package/server.js +299 -0
  96. package/test-aplicacion.con-logisession/BlackCoffee.js +226 -0
  97. package/test-aplicacion.con-logisession/SSL_SETUP.md +53 -0
  98. package/test-aplicacion.con-logisession/certs/ca-certificate.pem +32 -0
  99. package/test-aplicacion.con-logisession/certs/ca-private-key.pem +52 -0
  100. package/test-aplicacion.con-logisession/certs/certificate-2048.pem +22 -0
  101. package/test-aplicacion.con-logisession/certs/certificate.pem +32 -0
  102. package/test-aplicacion.con-logisession/certs/private-key-2048.pem +28 -0
  103. package/test-aplicacion.con-logisession/certs/private-key.pem +52 -0
  104. package/test-aplicacion.con-logisession/config/iaQueueSetup.js +84 -0
  105. package/test-aplicacion.con-logisession/config/qwen-rules.json +39 -0
  106. package/test-aplicacion.con-logisession/controllers/analyticsController.js +117 -0
  107. package/test-aplicacion.con-logisession/controllers/auth/AdminAuthController.js +142 -0
  108. package/test-aplicacion.con-logisession/controllers/auth/AuthController.js +439 -0
  109. package/test-aplicacion.con-logisession/controllers/auth/AuthViewController.js +223 -0
  110. package/test-aplicacion.con-logisession/controllers/endpointController.js +66 -0
  111. package/test-aplicacion.con-logisession/controllers/example.js +183 -0
  112. package/test-aplicacion.con-logisession/controllers/iaQueueController.js +367 -0
  113. package/test-aplicacion.con-logisession/controllers/queueController.js +206 -0
  114. package/test-aplicacion.con-logisession/controllers/qwenQueueController.js +197 -0
  115. package/test-aplicacion.con-logisession/controllers/test.js +0 -0
  116. package/test-aplicacion.con-logisession/controllers/tracking/EventsNoFinishController.js +78 -0
  117. package/test-aplicacion.con-logisession/controllers/tracking/TrackingController.js +412 -0
  118. package/test-aplicacion.con-logisession/controllers/tracking/TrackingControllerWithLoadModel.js +437 -0
  119. package/test-aplicacion.con-logisession/hooks/admin-hooks.js +20 -0
  120. package/test-aplicacion.con-logisession/hooks/general-hooks.js +97 -0
  121. package/test-aplicacion.con-logisession/hooks/queue-hooks.js +64 -0
  122. package/test-aplicacion.con-logisession/hooks/route-directory-hooks.js +38 -0
  123. package/test-aplicacion.con-logisession/hooks/security-hooks.js +24 -0
  124. package/test-aplicacion.con-logisession/insitu-admin-client/README.md +69 -0
  125. package/test-aplicacion.con-logisession/insitu-admin-client/package.json +23 -0
  126. package/test-aplicacion.con-logisession/insitu-admin-client.js +257 -0
  127. package/test-aplicacion.con-logisession/models/ExampleModel.js +88 -0
  128. package/test-aplicacion.con-logisession/models/QueueJobModel.js +263 -0
  129. package/test-aplicacion.con-logisession/models/TokenModel.js +207 -0
  130. package/test-aplicacion.con-logisession/models/auth/AuthModel.js +66 -0
  131. package/test-aplicacion.con-logisession/models/auth/UserModel.js +189 -0
  132. package/test-aplicacion.con-logisession/models/tracking/CompletedCartModel.js +213 -0
  133. package/test-aplicacion.con-logisession/models/tracking/EventModel.js +366 -0
  134. package/test-aplicacion.con-logisession/models/tracking/EventsNoFinishModel.js +131 -0
  135. package/test-aplicacion.con-logisession/models/tracking/SessionModel.js +360 -0
  136. package/test-aplicacion.con-logisession/models/tracking/SiteFlowModel.js +286 -0
  137. package/test-aplicacion.con-logisession/models/tracking/TokenModel.js +207 -0
  138. package/test-aplicacion.con-logisession/package-lock.json +3313 -0
  139. package/test-aplicacion.con-logisession/package.json +32 -0
  140. package/test-aplicacion.con-logisession/public/blackcoffee-welcome/index.html +1339 -0
  141. package/test-aplicacion.con-logisession/public/css/style.css +64 -0
  142. package/test-aplicacion.con-logisession/public/ejemplo-estatica/index.html +18 -0
  143. package/test-aplicacion.con-logisession/public/ejemplo-estatica/script.js +16 -0
  144. package/test-aplicacion.con-logisession/public/ejemplo-estatica/styles.css +43 -0
  145. package/test-aplicacion.con-logisession/public/images/logo.svg +7 -0
  146. package/test-aplicacion.con-logisession/public/js/main.js +67 -0
  147. package/test-aplicacion.con-logisession/routes/analytics-routes.json +8 -0
  148. package/test-aplicacion.con-logisession/routes/auth-routes.json +98 -0
  149. package/test-aplicacion.con-logisession/routes/blackcoffee-welcome-routes.json +20 -0
  150. package/test-aplicacion.con-logisession/routes/duplicate-test-routes.json.disabled +16 -0
  151. package/test-aplicacion.con-logisession/routes/ejemplo-estatica-routes.json +11 -0
  152. package/test-aplicacion.con-logisession/routes/endpoints-routes.json +8 -0
  153. package/test-aplicacion.con-logisession/routes/ia-queue-routes.json +26 -0
  154. package/test-aplicacion.con-logisession/routes/product-routes.json.disabled +20 -0
  155. package/test-aplicacion.con-logisession/routes/queue-routes.json +32 -0
  156. package/test-aplicacion.con-logisession/routes/qwen-routes.json +14 -0
  157. package/test-aplicacion.con-logisession/routes/static-routes.json +29 -0
  158. package/test-aplicacion.con-logisession/routes/tracking-routes.json +58 -0
  159. package/test-aplicacion.con-logisession/routes/tracking-with-loadmodel-routes.json +51 -0
  160. package/test-aplicacion.con-logisession/utils/dbAdapter.js +88 -0
  161. package/test-aplicacion.con-logisession/utils/qbWrapper.js +4 -0
  162. package/test-aplicacion.con-logisession/utils/queueProcessor.js +305 -0
  163. package/test-aplicacion.con-logisession/utils/qwenRulesService.js +131 -0
  164. package/test-aplicacion.con-logisession/utils/tokenHelper.js +22 -0
  165. package/test-aplicacion.con-logisession/views/auth/dashboard.html +443 -0
  166. package/test-aplicacion.con-logisession/views/auth/forgot-password.html +200 -0
  167. package/test-aplicacion.con-logisession/views/auth/login.html +213 -0
  168. package/test-aplicacion.con-logisession/views/auth/register.html +294 -0
  169. package/test-aplicacion.con-logisession/views/contact/form.html +47 -0
  170. 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.