kukuy 1.6.0 → 1.9.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 +59 -3
- package/balancer.log +28 -0
- package/kukuy-plugins/README.md +77 -43
- package/kukuy-plugins/cache-plugin/index.js +477 -0
- package/kukuy-plugins/cache-plugin/manifest.json +17 -0
- package/kukuy-plugins/ejemplo-plugin/index.js +7 -5
- package/kukuy-plugins/ejemplo-plugin/manifest.json +2 -2
- package/kukuy-plugins/health-checker/index.js +168 -0
- package/kukuy-plugins/health-checker/manifest.json +16 -0
- package/kukuy-plugins/health-monitor/index.js +58 -0
- package/kukuy-plugins/health-monitor/manifest.json +16 -0
- package/kukuy-plugins/redirect-plugin/index.js +172 -0
- package/kukuy-plugins/redirect-plugin/manifest.json +15 -0
- package/package.json +7 -4
- package/src/core/Balancer.js +100 -34
- package/src/core/ServerPool.js +2 -2
- package/src/extensibility/FilterChain.js +2 -9
- package/src/extensibility/HookManager.js +1 -0
- package/src/plugins/PluginManager.js +48 -0
- package/src/utils/HealthChecker.js +61 -6
package/README.md
CHANGED
|
@@ -9,9 +9,12 @@ KUKUY es un sistema de balanceo de carga backend desarrollado en Node.js que pe
|
|
|
9
9
|
- **Panel de Control Web**: Interfaz gráfica para monitorear el estado del sistema
|
|
10
10
|
- **Sistema de Plugins**: Arquitectura extensible mediante plugins
|
|
11
11
|
- **Hooks y Filtros**: Capacidad para interceptar y modificar solicitudes/responses
|
|
12
|
+
- **Sistema de Cache Robusto**: Almacenamiento en memoria con TTL configurable y política LRU
|
|
12
13
|
- **Rutas Personalizadas**: Configuración flexible de rutas para diferentes grupos de servidores
|
|
13
14
|
- **Monitoreo en Tiempo Real**: Métricas detalladas sobre rendimiento y estado de servidores
|
|
14
15
|
- **Reintento Inteligente**: Reenvío automático de solicitudes a servidores alternativos en caso de fallo
|
|
16
|
+
- **Verificación de Salud Periódica**: Sistema automatizado que verifica regularmente la salud de los servidores backend
|
|
17
|
+
- **Monitoreo de Eventos de Salud**: Registro y seguimiento detallado de eventos relacionados con la verificación de salud
|
|
15
18
|
|
|
16
19
|
## Configuración
|
|
17
20
|
|
|
@@ -75,7 +78,7 @@ Define las rutas y a qué grupo de servidores deben dirigirse:
|
|
|
75
78
|
- `SSL_KEY_PATH`: Ruta a la llave privada SSL
|
|
76
79
|
- `DASHBOARD_PORT`: Puerto del panel de control web (por defecto 8082)
|
|
77
80
|
- `WEBSOCKET_PORT`: Puerto del servidor WebSocket (por defecto 8083)
|
|
78
|
-
- `HEALTH_CHECK_INTERVAL`: Intervalo de verificación de salud de servidores
|
|
81
|
+
- `HEALTH_CHECK_INTERVAL`: Intervalo de verificación de salud de servidores (en milisegundos, por defecto 30000)
|
|
79
82
|
- `LOG_LEVEL`: Nivel de logging (por defecto 'info')
|
|
80
83
|
|
|
81
84
|
## Algoritmos de Balanceo
|
|
@@ -119,6 +122,32 @@ KUKUY incluye un panel de control web accesible en `http://localhost:8082` (por
|
|
|
119
122
|
|
|
120
123
|
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.
|
|
121
124
|
|
|
125
|
+
## Plugins de Verificación de Salud
|
|
126
|
+
|
|
127
|
+
KUKUY incluye dos plugins especializados para la gestión de la salud de los servidores backend:
|
|
128
|
+
|
|
129
|
+
### Plugin de Verificación de Salud Periódica (`health-checker`)
|
|
130
|
+
|
|
131
|
+
Este plugin implementa un sistema de verificación de salud proactivo que:
|
|
132
|
+
|
|
133
|
+
- Verifica la salud de todos los servidores backend en intervalos regulares
|
|
134
|
+
- Utiliza la configuración `HEALTH_CHECK_INTERVAL` para determinar la frecuencia de verificación
|
|
135
|
+
- Se comunica con el endpoint `/health` de cada servidor para determinar su estado
|
|
136
|
+
- Actualiza dinámicamente el estado de salud de los servidores en el pool
|
|
137
|
+
- Integra con el sistema de hooks para notificar eventos de salud
|
|
138
|
+
|
|
139
|
+
### Plugin de Monitoreo de Eventos de Salud (`health-monitor`)
|
|
140
|
+
|
|
141
|
+
Este plugin proporciona monitoreo y registro detallado de los eventos relacionados con la salud de los servidores:
|
|
142
|
+
|
|
143
|
+
- Registra eventos cuando comienza una verificación de salud
|
|
144
|
+
- Muestra el resultado de las verificaciones (saludable/no saludable)
|
|
145
|
+
- Captura y registra errores, timeouts y excepciones durante las verificaciones
|
|
146
|
+
- Proporciona alertas cuando un servidor no está saludable
|
|
147
|
+
- Muestra información detallada sobre el estado de los servidores
|
|
148
|
+
|
|
149
|
+
Ambos plugins trabajan juntos para proporcionar un sistema completo de monitoreo de salud que va más allá de la verificación reactiva (solo cuando un servidor falla) hacia un enfoque proactivo que mantiene un seguimiento constante del estado de los servidores backend.
|
|
150
|
+
|
|
122
151
|
### Estructura de un Plugin
|
|
123
152
|
|
|
124
153
|
Un plugin típico incluye:
|
|
@@ -147,13 +176,40 @@ Ejemplo de `manifest.json`:
|
|
|
147
176
|
Permiten ejecutar código en puntos específicos del ciclo de vida de una solicitud:
|
|
148
177
|
- `onRequestReceived`: Cuando se recibe una solicitud
|
|
149
178
|
- `onServerSelected`: Después de seleccionar un servidor destino
|
|
150
|
-
- `
|
|
179
|
+
- `onResponseReady`: Antes de enviar la respuesta al cliente (permite interceptar la respuesta del servidor backend)
|
|
180
|
+
- `onResponseSent`: Después de enviar la respuesta al cliente
|
|
151
181
|
- `onServerError`: Cuando ocurre un error con un servidor backend
|
|
152
182
|
|
|
153
183
|
### Filtros
|
|
154
184
|
Permiten interceptar y potencialmente modificar o bloquear solicitudes antes de que sean procesadas:
|
|
155
|
-
- Se pueden aplicar filtros de solicitud (`
|
|
185
|
+
- Se pueden aplicar filtros de solicitud (`request_processing`)
|
|
156
186
|
- Permiten implementar lógica de seguridad, autenticación, etc.
|
|
187
|
+
- Soportan prioridades para controlar el orden de ejecución
|
|
188
|
+
|
|
189
|
+
### Sistema de Cache Robusto
|
|
190
|
+
KUKUY incluye un sistema avanzado de cache que:
|
|
191
|
+
- Almacena respuestas en memoria con TTL (Time To Live) configurable
|
|
192
|
+
- Implementa política LRU (Least Recently Used) para manejo de espacio
|
|
193
|
+
- Permite configurar métodos HTTP cacheables (por defecto: GET)
|
|
194
|
+
- Soporta códigos de estado cacheables (por defecto: 200, 201, 204)
|
|
195
|
+
- Incluye limpieza automática de entradas expiradas
|
|
196
|
+
- Ofrece estadísticas detalladas sobre el uso de la caché
|
|
197
|
+
- Se integra completamente con el sistema de hooks y filtros
|
|
198
|
+
|
|
199
|
+
Los plugins de cache pueden:
|
|
200
|
+
- Interceptar solicitudes para verificar si están en caché
|
|
201
|
+
- Almacenar respuestas del servidor backend en caché
|
|
202
|
+
- Servir respuestas directamente desde la caché sin contactar al servidor backend
|
|
203
|
+
- Configurar TTL por defecto y reglas de expiración
|
|
204
|
+
- Implementar compresión opcional de contenido cacheado
|
|
205
|
+
- Tienen la máxima prioridad (0) para asegurar que se ejecuten antes que otros plugins
|
|
206
|
+
|
|
207
|
+
### Jerarquía de Prioridades
|
|
208
|
+
- **Prioridad 0**: Plugin de cache (máxima prioridad)
|
|
209
|
+
- **Prioridad 1-4**: Otros plugins críticos
|
|
210
|
+
- **Prioridad 5**: Plugin de ejemplo y otros plugins estándar
|
|
211
|
+
- **Prioridad 6-9**: Plugins de funcionalidad intermedia
|
|
212
|
+
- **Prioridad 10+**: Manejadores de errores y eventos especiales
|
|
157
213
|
|
|
158
214
|
## Seguridad
|
|
159
215
|
|
package/balancer.log
CHANGED
|
@@ -1,2 +1,30 @@
|
|
|
1
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
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}}
|
|
3
|
+
{"timestamp":"2026-01-30T20:17:23.725Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":727,"statusCode":200}}
|
|
4
|
+
{"timestamp":"2026-01-30T20:17:24.900Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":525,"statusCode":200}}
|
|
5
|
+
{"timestamp":"2026-01-30T20:17:38.252Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":663,"statusCode":200}}
|
|
6
|
+
{"timestamp":"2026-01-30T20:17:39.346Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":524,"statusCode":200}}
|
|
7
|
+
{"timestamp":"2026-01-30T20:17:47.856Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":58,"statusCode":200}}
|
|
8
|
+
{"timestamp":"2026-01-30T20:17:48.459Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":55,"statusCode":200}}
|
|
9
|
+
{"timestamp":"2026-01-30T20:17:51.323Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":81,"statusCode":200}}
|
|
10
|
+
{"timestamp":"2026-01-30T20:17:51.938Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":39,"statusCode":200}}
|
|
11
|
+
{"timestamp":"2026-01-30T20:17:57.742Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":73,"statusCode":200}}
|
|
12
|
+
{"timestamp":"2026-01-30T20:17:58.347Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":52,"statusCode":200}}
|
|
13
|
+
{"timestamp":"2026-01-30T20:18:16.831Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":98,"statusCode":200}}
|
|
14
|
+
{"timestamp":"2026-01-30T20:18:17.792Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":400,"statusCode":200}}
|
|
15
|
+
{"timestamp":"2026-01-30T20:21:10.507Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":135,"statusCode":200}}
|
|
16
|
+
{"timestamp":"2026-01-30T20:21:11.101Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":47,"statusCode":200}}
|
|
17
|
+
{"timestamp":"2026-01-30T20:21:27.474Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":35,"statusCode":200}}
|
|
18
|
+
{"timestamp":"2026-01-30T20:21:28.076Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":53,"statusCode":200}}
|
|
19
|
+
{"timestamp":"2026-01-30T20:22:15.368Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":121,"statusCode":200}}
|
|
20
|
+
{"timestamp":"2026-01-30T20:22:16.014Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":58,"statusCode":200}}
|
|
21
|
+
{"timestamp":"2026-01-30T20:22:29.162Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":48,"statusCode":200}}
|
|
22
|
+
{"timestamp":"2026-01-30T20:22:29.742Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":37,"statusCode":200}}
|
|
23
|
+
{"timestamp":"2026-01-30T20:23:10.703Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":123,"statusCode":200}}
|
|
24
|
+
{"timestamp":"2026-01-30T20:23:11.347Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":82,"statusCode":200}}
|
|
25
|
+
{"timestamp":"2026-01-30T20:23:25.118Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":32,"statusCode":200}}
|
|
26
|
+
{"timestamp":"2026-01-30T20:23:25.726Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":29,"statusCode":200}}
|
|
27
|
+
{"timestamp":"2026-01-30T20:26:32.857Z","level":"INFO","message":"Servidor ONLINE - ID: 1, URL: http://localhost:3434","eventType":"target_online","serverId":1,"serverUrl":"http://localhost:3434","request":{"url":"/track/registerSession","method":"POST","responseTime":145,"statusCode":200}}
|
|
28
|
+
{"timestamp":"2026-01-30T20:26:33.445Z","level":"INFO","message":"Servidor ONLINE - ID: 2, URL: http://localhost:8765","eventType":"target_online","serverId":2,"serverUrl":"http://localhost:8765","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":27,"statusCode":200}}
|
|
29
|
+
{"timestamp":"2026-01-30T20:26:36.917Z","level":"INFO","message":"Servidor ONLINE - ID: 3, URL: http://localhost:5445","eventType":"target_online","serverId":3,"serverUrl":"http://localhost:5445","request":{"url":"/track/registerSession","method":"POST","responseTime":73,"statusCode":200}}
|
|
30
|
+
{"timestamp":"2026-01-30T20:26:37.556Z","level":"INFO","message":"Servidor ONLINE - ID: 4, URL: http://localhost:6666","eventType":"target_online","serverId":4,"serverUrl":"http://localhost:6666","request":{"url":"/track/insertSiteFlow","method":"POST","responseTime":28,"statusCode":200}}
|
package/kukuy-plugins/README.md
CHANGED
|
@@ -1,12 +1,67 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Plugins de Kukuy
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Este directorio contiene plugins para extender la funcionalidad del balanceador Kukuy.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Plugins Disponibles
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
### 1. Plugin de Cache Robusto (`cache-plugin`)
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Este plugin implementa un sistema de cache robusto que permite almacenar en caché las respuestas del servidor backend para mejorar el rendimiento.
|
|
10
|
+
|
|
11
|
+
#### Características:
|
|
12
|
+
- Soporta diferentes métodos HTTP cacheables (por defecto: GET)
|
|
13
|
+
- Configurable mediante variables de entorno
|
|
14
|
+
- Implementa LRU (Least Recently Used) para manejar el tamaño máximo de caché
|
|
15
|
+
- Soporta TTL (Time To Live) configurable
|
|
16
|
+
- Limpieza automática de entradas expiradas
|
|
17
|
+
|
|
18
|
+
#### Variables de entorno:
|
|
19
|
+
- `CACHE_MAX_SIZE`: Número máximo de entradas en la caché (por defecto: 100)
|
|
20
|
+
- `CACHE_DEFAULT_TTL`: Tiempo de vida por defecto en milisegundos (por defecto: 300000 - 5 minutos)
|
|
21
|
+
- `CACHE_ENABLE_COMPRESSION`: Habilitar compresión (por defecto: false)
|
|
22
|
+
- `CACHEABLE_METHODS`: Métodos HTTP cacheables separados por coma (por defecto: GET)
|
|
23
|
+
- `CACHEABLE_STATUS_CODES`: Códigos de estado cacheables separados por coma (por defecto: 200,201,204)
|
|
24
|
+
|
|
25
|
+
#### Uso:
|
|
26
|
+
El plugin se activa automáticamente si está habilitado en el manifest.json.
|
|
27
|
+
|
|
28
|
+
### 2. Plugin de Redirección (`redirect-plugin`)
|
|
29
|
+
|
|
30
|
+
Este plugin permite implementar reglas de redirección personalizadas.
|
|
31
|
+
|
|
32
|
+
#### Características:
|
|
33
|
+
- Soporta patrones de URL con expresiones regulares
|
|
34
|
+
- Tipos de redirección: temporal (302) y permanente (301)
|
|
35
|
+
- Configurable mediante variables de entorno
|
|
36
|
+
|
|
37
|
+
#### Variables de entorno:
|
|
38
|
+
- `REDIRECT_RULES`: Reglas de redirección en formato JSON
|
|
39
|
+
|
|
40
|
+
#### Ejemplo de regla de redirección:
|
|
41
|
+
```json
|
|
42
|
+
[
|
|
43
|
+
{
|
|
44
|
+
"pattern": "/old-page",
|
|
45
|
+
"target": "/new-page",
|
|
46
|
+
"type": "permanent"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"pattern": "^/api/v1/(.*)$",
|
|
50
|
+
"target": "/api/v2/$1",
|
|
51
|
+
"type": "temporary"
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Cómo Crear un Nuevo Plugin
|
|
57
|
+
|
|
58
|
+
Para crear un nuevo plugin, sigue estos pasos:
|
|
59
|
+
|
|
60
|
+
1. Crea un directorio con el nombre de tu plugin en `kukuy-plugins/`
|
|
61
|
+
2. Crea un archivo `manifest.json` con la información del plugin
|
|
62
|
+
3. Crea un archivo `index.js` con la lógica del plugin
|
|
63
|
+
|
|
64
|
+
### Estructura de un Plugin
|
|
10
65
|
|
|
11
66
|
```
|
|
12
67
|
kukuy-plugins/
|
|
@@ -15,16 +70,14 @@ kukuy-plugins/
|
|
|
15
70
|
└── index.js
|
|
16
71
|
```
|
|
17
72
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
El archivo `manifest.json` debe contener:
|
|
73
|
+
### Ejemplo de `manifest.json`:
|
|
21
74
|
|
|
22
75
|
```json
|
|
23
76
|
{
|
|
24
|
-
"name": "
|
|
77
|
+
"name": "Mi Plugin",
|
|
25
78
|
"version": "1.0.0",
|
|
26
|
-
"description": "Descripción
|
|
27
|
-
"author": "Autor
|
|
79
|
+
"description": "Descripción de mi plugin",
|
|
80
|
+
"author": "Autor",
|
|
28
81
|
"main": "index.js",
|
|
29
82
|
"kukuyVersion": "^1.6.0",
|
|
30
83
|
"hooks": ["onRequestReceived", "onResponseSent"],
|
|
@@ -33,59 +86,40 @@ El archivo `manifest.json` debe contener:
|
|
|
33
86
|
}
|
|
34
87
|
```
|
|
35
88
|
|
|
36
|
-
|
|
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:
|
|
89
|
+
### Ejemplo de `index.js`:
|
|
60
90
|
|
|
61
91
|
```javascript
|
|
62
92
|
async function init(balancer) {
|
|
93
|
+
console.log('Inicializando mi plugin...');
|
|
94
|
+
|
|
63
95
|
const extension = balancer.getPostStartupExtension();
|
|
64
96
|
|
|
65
|
-
// Registrar
|
|
97
|
+
// Registrar filtros y hooks
|
|
66
98
|
extension.registerFilter('request_processing', async (data) => {
|
|
67
99
|
// Lógica del filtro
|
|
68
100
|
return { allowed: true };
|
|
69
101
|
});
|
|
70
102
|
|
|
71
|
-
// Registrar un hook
|
|
72
103
|
extension.registerHook('onRequestReceived', async ({ req, res }) => {
|
|
73
104
|
// Lógica del hook
|
|
74
105
|
});
|
|
75
106
|
}
|
|
107
|
+
|
|
108
|
+
async function deinit(balancer) {
|
|
109
|
+
console.log('Desactivando mi plugin...');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
module.exports = { init, deinit };
|
|
76
113
|
```
|
|
77
114
|
|
|
78
115
|
## Hooks Disponibles
|
|
79
116
|
|
|
80
117
|
- `onRequestReceived`: Se ejecuta cuando se recibe una solicitud
|
|
81
118
|
- `onServerSelected`: Se ejecuta después de seleccionar el servidor
|
|
82
|
-
- `
|
|
119
|
+
- `onResponseReady`: Se ejecuta cuando la respuesta del servidor backend está lista
|
|
120
|
+
- `onResponseSent`: Se ejecuta antes de enviar la respuesta al cliente
|
|
83
121
|
- `onServerError`: Se ejecuta cuando ocurre un error
|
|
84
122
|
|
|
85
123
|
## Filtros Disponibles
|
|
86
124
|
|
|
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`)
|
|
125
|
+
- `request_processing`: Se aplica al procesamiento de solicitudes
|