kukuy 1.5.0 → 1.6.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/README.md CHANGED
@@ -1,65 +1,26 @@
1
- # KUKUY
1
+ # KUKUY - Balanceador de Carga
2
2
 
3
- ![Kukuy Logo](kukuu1.webp)
3
+ KUKUY es un sistema de balanceo de carga backend desarrollado en Node.js que permite distribuir solicitudes entre múltiples servidores backend utilizando diferentes algoritmos de balanceo. El sistema incluye características avanzadas como soporte para hooks, filtros, rutas personalizadas y un panel de control web.
4
4
 
5
- Un balanceador de carga desarrollado en Node.js que distribuye solicitudes entre múltiples servidores backend usando el algoritmo RoundRobin.
5
+ ## Características Principales
6
6
 
7
- ## Información del Proyecto
8
-
9
- - **Página Oficial**: [https://bsanchez.unaux.com/](https://bsanchez.unaux.com/)
10
- - **Repositorio Oficial**: [https://gitlab.com/bytedogssyndicate1/kukuy](https://gitlab.com/bytedogssyndicate1/kukuy)
11
-
12
- ## Instalación
13
-
14
- Para instalar Kukuy globalmente en tu sistema:
15
-
16
- ```bash
17
- npm install -g kukuy
18
- ```
19
-
20
- O para instalarlo localmente en tu proyecto:
21
-
22
- ```bash
23
- npm install kukuy
24
- ```
25
-
26
- ## Características
27
-
28
- - Distribución de carga usando algoritmo RoundRobin
29
- - Soporte para HTTP y HTTPS
30
- - Configuración mediante variables de entorno
31
- - Arquitectura modular con soporte para hooks y filtros
32
- - Verificación de salud de servidores backend
33
- - Enrutamiento basado en patrones
34
- - Sistema de logging detallado para servidores online/offline
35
- - Caching de respuestas para mejorar el rendimiento
36
- - Panel de control web para monitoreo
37
-
38
- ## Instalación
39
-
40
- ```bash
41
- npm install
42
- ```
7
+ - **Algoritmos de Balanceo**: Soporta algoritmos como Round Robin e IP Hash
8
+ - **Soporte para HTTPS/SSL**: Capacidad de manejar conexiones seguras
9
+ - **Panel de Control Web**: Interfaz gráfica para monitorear el estado del sistema
10
+ - **Sistema de Plugins**: Arquitectura extensible mediante plugins
11
+ - **Hooks y Filtros**: Capacidad para interceptar y modificar solicitudes/responses
12
+ - **Rutas Personalizadas**: Configuración flexible de rutas para diferentes grupos de servidores
13
+ - **Monitoreo en Tiempo Real**: Métricas detalladas sobre rendimiento y estado de servidores
14
+ - **Reintento Inteligente**: Reenvío automático de solicitudes a servidores alternativos en caso de fallo
43
15
 
44
16
  ## Configuración
45
17
 
46
- El balanceador se configura mediante variables de entorno:
47
-
48
- - `BALANCER_HTTP_PORT`: Puerto para conexiones HTTP (por defecto: 8080)
49
- - `BALANCER_HTTPS_PORT`: Puerto para conexiones HTTPS (opcional)
50
- - `CONFIG_FILE_PATH`: Ruta al archivo de configuración de servidores (por defecto: ./servers.json)
51
- - `ROUTES_FILE_PATH`: Ruta al archivo de configuración de rutas (por defecto: ./routes.json)
52
- - `LOAD_BALANCING_ALGORITHM`: Algoritmo de balanceo a usar ('roundrobin' o 'iphash') (por defecto: 'roundrobin')
53
- - `SSL_CERT_PATH`: Ruta al certificado SSL (requerido para HTTPS)
54
- - `SSL_KEY_PATH`: Ruta a la llave privada SSL (requerido para HTTPS)
55
- - `HEALTH_CHECK_INTERVAL`: Intervalo para verificación de salud en ms (por defecto: 30000)
56
- - `LOG_LEVEL`: Nivel de logging (info, warn, error, debug) (por defecto: info)
57
- - `LOG_FILE_PATH`: Ruta al archivo de logs (por defecto: ./balancer.log)
18
+ ### Archivos de Configuración
58
19
 
59
- ## Archivos de Configuración
20
+ El sistema utiliza varios archivos de configuración:
60
21
 
61
- ### servers.json
62
- Define los servidores backend:
22
+ #### `servers.json`
23
+ Define los servidores backend a los que se distribuirán las solicitudes:
63
24
 
64
25
  ```json
65
26
  {
@@ -67,21 +28,24 @@ Define los servidores backend:
67
28
  {
68
29
  "url": "http://localhost:3001",
69
30
  "weight": 1,
70
- "tags": ["api"],
71
- "active": true
31
+ "tags": ["api"]
72
32
  },
73
33
  {
74
34
  "url": "http://localhost:3002",
75
35
  "weight": 1,
76
- "tags": ["api"],
77
- "active": true
36
+ "tags": ["api"]
37
+ },
38
+ {
39
+ "url": "http://localhost:3003",
40
+ "weight": 1,
41
+ "tags": ["web"]
78
42
  }
79
43
  ]
80
44
  }
81
45
  ```
82
46
 
83
- ### routes.json
84
- Define las reglas de enrutamiento para dirigir solicitudes específicas a grupos particulares de servidores backend basados en patrones de URL:
47
+ #### `routes.json`
48
+ Define las rutas y a qué grupo de servidores deben dirigirse:
85
49
 
86
50
  ```json
87
51
  {
@@ -100,173 +64,124 @@ Define las reglas de enrutamiento para dirigir solicitudes específicas a grupos
100
64
  }
101
65
  ```
102
66
 
103
- Las rutas permiten una distribución selectiva del tráfico:
104
- - Las rutas definen patrones de URL (usando comodín `*`) y métodos HTTP permitidos
105
- - El campo `target` especifica la etiqueta de servidores backend a los que se dirigirá la solicitud
106
- - Por ejemplo, todas las solicitudes que empiezan con `/api/` se enviarán solo a servidores que tengan la etiqueta "api"
107
- - Las solicitudes que no coincidan con ninguna ruta específica se distribuirán entre todos los servidores disponibles
67
+ ### Variables de Entorno
108
68
 
109
- ## Uso
69
+ - `LOAD_BALANCING_ALGORITHM`: Algoritmo de balanceo ('roundrobin' o 'iphash')
70
+ - `BALANCER_HTTP_PORT`: Puerto HTTP del balanceador (por defecto 8080)
71
+ - `BALANCER_HTTPS_PORT`: Puerto HTTPS del balanceador
72
+ - `CONFIG_FILE_PATH`: Ruta al archivo de configuración de servidores
73
+ - `ROUTES_FILE_PATH`: Ruta al archivo de configuración de rutas
74
+ - `SSL_CERT_PATH`: Ruta al certificado SSL
75
+ - `SSL_KEY_PATH`: Ruta a la llave privada SSL
76
+ - `DASHBOARD_PORT`: Puerto del panel de control web (por defecto 8082)
77
+ - `WEBSOCKET_PORT`: Puerto del servidor WebSocket (por defecto 8083)
78
+ - `HEALTH_CHECK_INTERVAL`: Intervalo de verificación de salud de servidores
79
+ - `LOG_LEVEL`: Nivel de logging (por defecto 'info')
110
80
 
111
- ### Iniciar en modo producción:
112
- ```bash
113
- npm start
114
- ```
81
+ ## Algoritmos de Balanceo
115
82
 
116
- ### Iniciar en modo desarrollo:
117
- ```bash
118
- npm run dev
119
- ```
83
+ ### Round Robin
84
+ Distribuye las solicitudes de forma equitativa entre todos los servidores disponibles, ciclando secuencialmente.
120
85
 
121
- ### Con variables de entorno personalizadas:
122
- ```bash
123
- BALANCER_HTTP_PORT=9090 BALANCER_HTTPS_PORT=9443 CONFIG_FILE_PATH=./my-servers.json npm start
124
- ```
125
-
126
- ### Con algoritmo de balanceo específico:
127
- ```bash
128
- # Usar algoritmo RoundRobin (predeterminado)
129
- LOAD_BALANCING_ALGORITHM=roundrobin npm start
86
+ ### IP Hash
87
+ Utiliza la dirección IP del cliente para determinar a qué servidor se enviará la solicitud, asegurando que las solicitudes del mismo cliente siempre vayan al mismo servidor.
130
88
 
131
- # Usar algoritmo IPHash
132
- LOAD_BALANCING_ALGORITHM=iphash npm start
133
- ```
89
+ ## Scripts de Inicio
134
90
 
135
- ### Scripts de inicio predefinidos:
91
+ El proyecto incluye scripts preconfigurados para iniciar el balanceador:
136
92
 
137
- #### Iniciar con algoritmo RoundRobin:
93
+ ### `start-roundrobin.sh`
94
+ Inicia el balanceador con el algoritmo Round Robin:
138
95
  ```bash
139
96
  ./start-roundrobin.sh
140
97
  ```
141
98
 
142
- #### Iniciar con algoritmo IPHash:
99
+ ### `start-iphash.sh`
100
+ Inicia el balanceador con el algoritmo IP Hash:
143
101
  ```bash
144
102
  ./start-iphash.sh
145
103
  ```
146
104
 
147
- Los scripts utilizan la configuración por defecto y el puerto 8080. Puedes modificarlos según tus necesidades.
148
-
149
- ### API del Panel Web
105
+ ### `start-ssl.sh` y `start-ssl-config.sh`
106
+ Scripts para iniciar el balanceador con soporte SSL/TLS.
150
107
 
151
- El balanceador incluye una API REST para monitoreo en tiempo real:
108
+ ## Panel de Control Web
152
109
 
153
- #### Endpoints disponibles:
154
- - `GET /api/status` - Estado general del balanceador
155
- - `GET /api/metrics` - Métricas generales de rendimiento
156
- - `GET /api/servers` - Estado de los servidores backend
157
- - `GET /api/server-stats` - Estadísticas detalladas por servidor
158
-
159
- #### Ejemplo de respuesta de estadísticas por servidor:
160
- ```json
161
- {
162
- "serverStats": {
163
- "1": {
164
- "id": 1,
165
- "totalRequests": 10,
166
- "successfulRequests": 10,
167
- "failedRequests": 0,
168
- "totalResponseTime": 1250,
169
- "minResponseTime": 5,
170
- "maxResponseTime": 346,
171
- "avgResponseTime": 125,
172
- "responseCodes": {"200": 10},
173
- "lastActive": 1769298297602,
174
- "responseTimes": [346, 7, 7, 12, 45, 67, 89, 102, 115, 120]
175
- }
176
- }
177
- }
178
- ```
110
+ KUKUY incluye un panel de control web accesible en `http://localhost:8082` (por defecto) que muestra:
179
111
 
180
- ## Hooks Disponibles
112
+ - Estado general del sistema
113
+ - Métricas de rendimiento (RPS, tiempo de respuesta promedio)
114
+ - Estado de los servidores backend
115
+ - Información sobre el algoritmo de balanceo actual
116
+ - Gráficos de uso reciente
181
117
 
182
- - `onRequestReceived`: Se ejecuta cuando se recibe una solicitud
183
- - `onServerSelected`: Se ejecuta después de seleccionar un servidor backend
184
- - `onResponseSent`: Se ejecuta cuando se envía la respuesta al cliente
185
- - `onServerError`: Se ejecuta cuando ocurre un error con un servidor backend
118
+ ## Sistema de Plugins
186
119
 
187
- ## Filtros Disponibles
120
+ La arquitectura de KUKUY permite extender su funcionalidad mediante plugins. Los plugins se colocan en el directorio `kukuy-plugins/` y deben incluir un archivo `manifest.json` con la configuración del plugin.
188
121
 
189
- - `AuthenticationFilter`: Verificación de autenticación
190
- - `RateLimitFilter`: Control de límite de peticiones
191
- - `LoggingFilter`: Registro de solicitudes
192
- - `CachingFilter`: Caché de respuestas
122
+ ### Estructura de un Plugin
193
123
 
194
- ## Componentes Implementados
124
+ Un plugin típico incluye:
195
125
 
196
- ### Core
197
- - `Balancer.js`: Punto de entrada principal del sistema
198
- - `ServerPool.js`: Gestión del conjunto de servidores backend
199
- - `RequestHandler.js`: Manejo de solicitudes entrantes (integrado en Balancer.js)
126
+ - `manifest.json`: Metadatos del plugin
127
+ - `index.js`: Código principal del plugin con funciones `init()` y `deinit()`
200
128
 
201
- ### Algoritmos
202
- - `LoadBalancingAlgorithm.js`: Interfaz base para algoritmos de balanceo
203
- - `RoundRobinAlgorithm.js`: Implementación del algoritmo RoundRobin como plugin
204
- - `IPHashAlgorithm.js`: Implementación del algoritmo IPHash como plugin con asociación persistente IP-servidor
205
- - `AlgorithmManager.js`: Gestor de algoritmos de balanceo con selección dinámica
206
-
207
- ### Configuración
208
- - `ConfigManager.js`: Lee y procesa variables de entorno
209
- - `RouteLoader.js`: Carga rutas y paths desde archivos de configuración
210
-
211
- ### Protocolos
212
- - `HttpBalancer.js`: Manejo de conexiones HTTP
213
- - `HttpsBalancer.js`: Manejo de conexiones HTTPS
214
-
215
- ### Extensibilidad
216
- - `HookManager.js`: Integración con `jerk-hooked-lib`
217
- - `FilterChain.js`: Aplicación de filters a las solicitudes
218
-
219
- ### Utilidades
220
- - `Logger.js`: Sistema de logging
221
- - `BalancerLogger.js`: Sistema de logging detallado para servidores online/offline
222
- - `HealthChecker.js`: Verificación de estado de servidores backend
223
- - `MetricsCollector.js`: Recolección de métricas de rendimiento
224
-
225
- ## Componentes No Implementados (Mejoras Futuras)
129
+ Ejemplo de `manifest.json`:
130
+ ```json
131
+ {
132
+ "name": "Nombre del Plugin",
133
+ "version": "1.0.0",
134
+ "description": "Descripción del plugin",
135
+ "author": "Autor",
136
+ "main": "index.js",
137
+ "kukuyVersion": "^1.6.0",
138
+ "hooks": ["onRequestReceived", "onResponseSent"],
139
+ "filters": ["request_processing"],
140
+ "enabled": true
141
+ }
142
+ ```
226
143
 
227
- ### Funcionalidades Avanzadas
228
- - **Hot Reload de Configuración**: Actualización de configuración sin reinicio (requiere implementación de listeners de cambio de archivos)
229
- - **API REST para Gestión de Servidores**: Endpoint para añadir/eliminar servidores dinámicamente
230
- - **Sistema de Alertas**: Notificaciones cuando servidores caen o se recuperan
231
- - **Soporte para WebSocket**: Balanceo de conexiones WebSocket
232
- - **Compresión de Respuestas**: Soporte para Gzip/Brotli
233
- - **Persistencia de Sesión**: Sticky sessions basadas en cookies o IP
144
+ ## Hooks y Filtros
234
145
 
235
- ### Algoritmos de Balanceo Adicionales
236
- - **Weighted Round Robin**: Balanceo con pesos por servidor
237
- - **Least Connections**: Enviar a servidor con menos conexiones
238
- - **IP Hash**: Distribución basada en dirección IP del cliente
146
+ ### Hooks
147
+ Permiten ejecutar código en puntos específicos del ciclo de vida de una solicitud:
148
+ - `onRequestReceived`: Cuando se recibe una solicitud
149
+ - `onServerSelected`: Después de seleccionar un servidor destino
150
+ - `onResponseSent`: Antes de enviar la respuesta al cliente
151
+ - `onServerError`: Cuando ocurre un error con un servidor backend
239
152
 
240
- ## Pruebas
153
+ ### Filtros
154
+ Permiten interceptar y potencialmente modificar o bloquear solicitudes antes de que sean procesadas:
155
+ - Se pueden aplicar filtros de solicitud (`request`)
156
+ - Permiten implementar lógica de seguridad, autenticación, etc.
241
157
 
242
- ### Prueba de Estrés
243
- El proyecto incluye un script de prueba de estrés:
244
- ```bash
245
- DURATION_SECONDS=30 CONCURRENT_REQUESTS=20 node stress-test.js
246
- ```
158
+ ## Seguridad
247
159
 
248
- ## Issues Conocidos
160
+ - El sistema incluye mecanismos para marcar servidores como fallidos temporalmente
161
+ - Implementa reintento inteligente hacia servidores alternativos
162
+ - Permite configurar límites de intentos fallidos antes de excluir un servidor
249
163
 
250
- ### Actualización de Estado de Servidores
251
- El dashboard no refleja en tiempo real cuando servidores se vuelven offline o se levantan después de iniciar el balanceador. La información de estado de los servidores puede no actualizar inmediatamente cuando un servidor backend cambia de estado.
164
+ ## Monitoreo y Métricas
252
165
 
253
- Para más detalles, véase el archivo [ISSUES.md](./ISSUES.md).
166
+ KUKUY proporciona métricas detalladas sobre:
167
+ - Solicitudes totales procesadas
168
+ - RPS (Solicitudes por segundo) acumulado e instantáneo
169
+ - Tiempo de respuesta promedio
170
+ - Tasa de éxito
171
+ - Estado de salud de los servidores
172
+ - Uso de recursos del sistema (CPU, memoria)
254
173
 
255
174
  ## Licencia
256
175
 
257
- Este proyecto está licenciado bajo la Licencia Pública General GNU (GPL) versión 3 o posterior.
176
+ Este proyecto está licenciado bajo la Licencia GPL-3.0 o posterior.
258
177
 
259
- Copyright (C) 2026 Desarrollador
178
+ ## Autor
260
179
 
261
- Este programa es software libre: usted puede redistribuirlo y/o modificarlo
262
- bajo los términos de la Licencia Pública General GNU publicada por la
263
- Free Software Foundation, ya sea la versión 3 de la Licencia, o
264
- (a su elección) cualquier versión posterior.
180
+ Benjamín Sánchez Cárdenas
181
+ Email de contacto: bytedogssyndicate@gmail.com
182
+ Página web oficial: https://bsanchez.unaux.com/
183
+ Repositorio oficial: https://gitlab.com/bytedogssyndicate1/kukuy
265
184
 
266
- Este programa se distribuye con la esperanza de que sea útil, pero
267
- SIN NINGUNA GARANTÍA; ni siquiera la garantía implícita de
268
- COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.
269
- Consulte la Licencia Pública General GNU para obtener más detalles.
185
+ ## Contribuciones
270
186
 
271
- Debería haber recibido una copia de la Licencia Pública General GNU
272
- junto con este programa. Si no, consulte <https://www.gnu.org/licenses/>.
187
+ Las contribuciones son bienvenidas. Por favor, abre un issue o pull request para discutir cambios propuestos.
package/balancer.log ADDED
@@ -0,0 +1,2 @@
1
+ {"timestamp":"2026-01-30T19:04:05.202Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":631,"statusCode":200}}
2
+ {"timestamp":"2026-01-30T19:04:34.272Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":56,"statusCode":200}}
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDtzCCAp+gAwIBAgIUFTU+RfyHp2GmFigOSZ9AiN8SGLcwDQYJKoZIhvcNAQEL
3
+ BQAwazELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFk
4
+ cmlkMQ4wDAYDVQQKDAVLdWt1eTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDESMBAG
5
+ A1UEAwwJbG9jYWxob3N0MB4XDTI2MDEyNjAxNTU1NFoXDTI3MDEyNjAxNTU1NFow
6
+ azELMAkGA1UEBhMCRVMxDzANBgNVBAgMBk1hZHJpZDEPMA0GA1UEBwwGTWFkcmlk
7
+ MQ4wDAYDVQQKDAVLdWt1eTEWMBQGA1UECwwNSVQgRGVwYXJ0bWVudDESMBAGA1UE
8
+ AwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlN3F
9
+ rAiKzKOIybQsmGIF+sBmfgkqsC/jq3EBsOnIDXG2Kz0AVLNCD1nxTmYB06x7TN7V
10
+ xCSXiaGJEAW2v2+CLOpiFtO9S9hnxsoENN3DI/ZNYVBD5QbPFdkyTUw31iq8Vdhp
11
+ tkrxwnY7q7S/Ss1BEKxL/y0f4bSD9bXAYbTJRFlx5bv8KE0+Opr3EywGmyd9Fwwq
12
+ Zf4+z19kc4/ILmguzrMTZ9MblzKN5VAxoQ+h5SzKY/pgIPTX9Y25ciKwlN8nPrYs
13
+ 32CfFVqyH1sWY+hz8nhPIqJ++R12cofTyjBkfUoo7hE87wsIITmttxA9gJfd9k2j
14
+ jy6ebm40SGaHXjU7twIDAQABo1MwUTAdBgNVHQ4EFgQUYK1YQGMWkT9TpbPspqtu
15
+ tWzX3EMwHwYDVR0jBBgwFoAUYK1YQGMWkT9TpbPspqtutWzX3EMwDwYDVR0TAQH/
16
+ BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEADQWlR94ZUUSv+nYzpvhyonnxDoy+
17
+ YU4MATcisHc6HnbLUdwX95dSzIFLg/aurqcadWTL6q2RQusUpfpNdVPJXvXUXz/W
18
+ ebk1Q97qcz8jFp9hbZxb93mrmJE0JccMU36WZPVM8J9K8p11JABn+sJRQFIAOauU
19
+ C7ETVs84+b3JNLGH9Y3cJpB6Jm7DntFXZmp6Ehe8On4SwqIRfN11CKQs7SqcHXts
20
+ X6tgXisc7HskSbXXG5oSHKz+uwngH2V85RH/pKgly80IRT3FbPzFRBdSCDk6B4PM
21
+ Bqow/h9NX65Vd5aRFpsmje4eqrO2g0YQsPmpVAndIstn+HlW5YyLAb5dmA==
22
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCU3cWsCIrMo4jJ
3
+ tCyYYgX6wGZ+CSqwL+OrcQGw6cgNcbYrPQBUs0IPWfFOZgHTrHtM3tXEJJeJoYkQ
4
+ Bba/b4Is6mIW071L2GfGygQ03cMj9k1hUEPlBs8V2TJNTDfWKrxV2Gm2SvHCdjur
5
+ tL9KzUEQrEv/LR/htIP1tcBhtMlEWXHlu/woTT46mvcTLAabJ30XDCpl/j7PX2Rz
6
+ j8guaC7OsxNn0xuXMo3lUDGhD6HlLMpj+mAg9Nf1jblyIrCU3yc+tizfYJ8VWrIf
7
+ WxZj6HPyeE8ion75HXZyh9PKMGR9SijuETzvCwghOa23ED2Al932TaOPLp5ubjRI
8
+ ZodeNTu3AgMBAAECggEAIXLhNwHmWgvGsPeca5Le4BQ6E0ixAEyKXduy8xLcYfTy
9
+ Zy26NM3gYn2lpCV0dKDVRZTuODe2mvSiTOjTwpjmCXySlKl356JU0wxSPKS1c4+k
10
+ nGCCGORaRID8dfTRuPv6PFm3iv+06apSRwcCUmbjH0FvhAMaHkdGvT9c3jdWX9ZX
11
+ YpHtnQQzWQSdNByT6ELqUCD2lw9AtzRSdvMDEZ/H7WfepcJ8jNNAzLkNQIuezDR1
12
+ ciFA5dDhT8vOkEBV1LiQz0uUscsyefhDG1rUmFJxUng9IW2qNFEKxBfiWdZIGEK3
13
+ PInBm4QpOLHh1q6+XK2yeRSnw8uMfgPlDQgr5cGDYQKBgQDKLD01Letd0URs0INL
14
+ LRLox/k8GrCKEDXl+y7EvbWnLriDck4I+fkuQKenxQdVCBCOKGRgm92j3Y8vB+9I
15
+ QU8lIzohgAUt5GAm+7ZNdwbTX3hYmUmIFXdZEvIBZ61Xw+ghwSWh44Af5S8w4xoi
16
+ C5ewa4iBvSApOHzs6Q6/Tf8WYQKBgQC8gEATZNmiXH3ITYdGVmEY5uzqRyJIXt3y
17
+ BbfFooZc31daUx4HDnjgzdY8I5cr3JfNy1HvpXcLMWH79nRbEcwvaiKkqkvaGxHW
18
+ e6NTTkU46P4lAwtzsfM7eQrtRnfJGLUF7ZQzc/W05BkdyLq2Fmrox8Mt01rZs9Yo
19
+ R+4tv5LZFwKBgQCJ9uSSDNMIg81RAH4IaCr2Rbj0ZjZBEUzms6G3yspS21Q5B2Dv
20
+ ST7dbGu81nzpbwZ1LGVLdDItJ/4VFzIYOdE7w61gvQ9LwQRItg8zD93NkuH6fCis
21
+ wBFg7MfPY6PsN5mKp1b6AdkmauzoTKJBx21tjARsnNZ8qrq9pVFWBXDlIQKBgQC1
22
+ bOa/A9DoEQdLEzuAukCn/BLIhgB8ETqi51fyEzQpDRkBKYB8IDS9gb+RkFu+bol5
23
+ HBjXg7UpA7WgEZv5zw5sEEYZoIJzAJzRh5wx4OKFHNMHAoAyMXK+qgiXSLyfw3Tv
24
+ qLN8Nj6lhOibnwf9m2P4edPkNkl5wTn8+QZH59vJrwKBgDi7kLHz+fLxM6BYQ92F
25
+ mRgxHoY1Cj0jpPEGx+9A7e8f2zQUSb9nUU0et0NHmiGmgkUTqVwy7lWGFSXjvoaz
26
+ Vm1UrDskAbngwmSHpPDeBZTOHHR9PRyPWdJqUzJjk7boQK9gK65BeYLkY9klJFIN
27
+ bWZG2VQiV6rOcc/8WWgZtlrG
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,91 @@
1
+ # Sistema de Plugins para Kukuy
2
+
3
+ ## Introducción
4
+
5
+ Kukuy incluye un sistema de plugins que permite extender su funcionalidad sin modificar el código base. Los plugins se almacenan en el directorio `kukuy-plugins/` y se cargan automáticamente al iniciar Kukuy.
6
+
7
+ ## Estructura de un Plugin
8
+
9
+ Cada plugin debe tener la siguiente estructura:
10
+
11
+ ```
12
+ kukuy-plugins/
13
+ └── nombre-del-plugin/
14
+ ├── manifest.json
15
+ └── index.js
16
+ ```
17
+
18
+ ## Manifest
19
+
20
+ El archivo `manifest.json` debe contener:
21
+
22
+ ```json
23
+ {
24
+ "name": "Nombre del Plugin",
25
+ "version": "1.0.0",
26
+ "description": "Descripción del plugin",
27
+ "author": "Autor del plugin",
28
+ "main": "index.js",
29
+ "kukuyVersion": "^1.6.0",
30
+ "hooks": ["onRequestReceived", "onResponseSent"],
31
+ "filters": ["request_processing"],
32
+ "enabled": true
33
+ }
34
+ ```
35
+
36
+ Campos obligatorios:
37
+ - `name`: Nombre del plugin
38
+ - `version`: Versión del plugin
39
+ - `description`: Descripción del plugin
40
+ - `main`: Archivo principal del plugin
41
+ - `enabled`: Si el plugin está habilitado o no
42
+
43
+ Campos opcionales:
44
+ - `author`: Autor del plugin
45
+ - `kukuyVersion`: Versión de Kukuy requerida
46
+ - `hooks`: Lista de hooks que el plugin usa
47
+ - `filters`: Lista de filtros que el plugin usa
48
+ - `dependencies`: Dependencias del plugin
49
+
50
+ ## Archivo Principal
51
+
52
+ El archivo principal (por defecto `index.js`) debe exportar las funciones:
53
+
54
+ - `init(balancer)`: Se llama cuando se carga el plugin
55
+ - `deinit(balancer)`: Se llama cuando se descarga el plugin (opcional)
56
+
57
+ ## API de Extensión
58
+
59
+ Dentro del plugin, puedes usar la API de extensión para registrar filtros y hooks:
60
+
61
+ ```javascript
62
+ async function init(balancer) {
63
+ const extension = balancer.getPostStartupExtension();
64
+
65
+ // Registrar un filtro
66
+ extension.registerFilter('request_processing', async (data) => {
67
+ // Lógica del filtro
68
+ return { allowed: true };
69
+ });
70
+
71
+ // Registrar un hook
72
+ extension.registerHook('onRequestReceived', async ({ req, res }) => {
73
+ // Lógica del hook
74
+ });
75
+ }
76
+ ```
77
+
78
+ ## Hooks Disponibles
79
+
80
+ - `onRequestReceived`: Se ejecuta cuando se recibe una solicitud
81
+ - `onServerSelected`: Se ejecuta después de seleccionar el servidor
82
+ - `onResponseSent`: Se ejecuta antes de enviar la respuesta
83
+ - `onServerError`: Se ejecuta cuando ocurre un error
84
+
85
+ ## Filtros Disponibles
86
+
87
+ - `request_processing`: Se aplica al procesamiento de solicitudes
88
+
89
+ ## Variables de Entorno
90
+
91
+ - `PLUGINS_DIR`: Directorio donde buscar plugins (por defecto: `./kukuy-plugins`)
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Plugin de ejemplo para Kukuy
3
+ * Demuestra cómo crear un plugin que se carga automáticamente
4
+ */
5
+
6
+ async function init(balancer) {
7
+ console.log('Inicializando plugin de ejemplo...');
8
+
9
+ const extension = balancer.getPostStartupExtension();
10
+
11
+ // Registrar un filtro de ejemplo
12
+ extension.registerFilter('request_processing', async (data) => {
13
+ const { req, res } = data;
14
+ console.log(`Plugin: Procesando solicitud ${req.method} ${req.url}`);
15
+
16
+ // Agregar un header personalizado
17
+ req.headers['x-plugin-example'] = 'activated';
18
+
19
+ return { allowed: true };
20
+ }, 5);
21
+
22
+ // Registrar un hook para cuando se recibe una solicitud
23
+ extension.registerHook('onRequestReceived', async ({ req, res }) => {
24
+ console.log(`Plugin: Solicitud recibida - ${req.method} ${req.url}`);
25
+ }, 5);
26
+
27
+ // Registrar un hook para cuando se envía la respuesta
28
+ extension.registerHook('onResponseSent', async ({ req, res, serverRes, responseTime }) => {
29
+ console.log(`Plugin: Respuesta enviada para ${req.url} en ${responseTime}ms`);
30
+ }, 5);
31
+
32
+ console.log('Plugin de ejemplo inicializado correctamente');
33
+ }
34
+
35
+ async function deinit(balancer) {
36
+ console.log('Desactivando plugin de ejemplo...');
37
+ }
38
+
39
+ module.exports = { init, deinit };
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "Plugin de Ejemplo",
3
+ "version": "1.0.0",
4
+ "description": "Plugin de ejemplo para demostrar la arquitectura de plugins",
5
+ "author": "Desarrollador",
6
+ "main": "index.js",
7
+ "kukuyVersion": "^1.6.0",
8
+ "hooks": ["onRequestReceived", "onResponseSent"],
9
+ "filters": ["request_processing"],
10
+ "enabled": true
11
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kukuy",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Balanceador de carga Backend",
5
5
  "main": "kukuy.js",
6
6
  "scripts": {
@@ -9,6 +9,7 @@
9
9
  "test": "echo \"Error: no test specified\" && exit 1"
10
10
  },
11
11
  "keywords": [
12
+ "backend",
12
13
  "load-balancer",
13
14
  "round-robin",
14
15
  "ip-hash",
package/servers_real.json CHANGED
@@ -14,6 +14,11 @@
14
14
  "url": "http://localhost:5445",
15
15
  "weight": 1,
16
16
  "tags": ["backend"]
17
+ },
18
+ {
19
+ "url": "http://localhost:6666",
20
+ "weight": 1,
21
+ "tags": ["backend"]
17
22
  }
18
23
  ]
19
24
  }