@robiki/proxy 1.0.0 → 1.0.2

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.es.md ADDED
@@ -0,0 +1,639 @@
1
+ # 🚀 Robiki Proxy
2
+
3
+ > Un proxy inverso HTTP/2 de alto rendimiento y flexible con soporte WebSocket, enrutamiento configurable, CORS y validación de solicitudes. Úsalo como paquete npm en tu aplicación Node.js o como contenedor Docker independiente. Destinado a ser utilizado únicamente como proxy de dominio para entornos de desarrollo local.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@robiki/proxy.svg)](https://www.npmjs.com/package/@robiki/proxy)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ## 🌍 Idiomas / Languages / Sprachen / 语言 / 言語 / Języki / Языки
9
+
10
+ [English](README.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [Polski](README.pl.md) | [Español](README.es.md) | [Русский](README.ru.md)
11
+
12
+ ## ✨ Características
13
+
14
+ - **🔒 Soporte HTTP/2 y SSL/TLS**: Soporte completo del protocolo HTTP/2 con respaldo automático a HTTP/1.1
15
+ - **🔌 Proxy WebSocket**: Manejo y proxy de conexiones WebSocket sin problemas
16
+ - **🌐 Enrutamiento flexible**: Configura rutas por dominio/host con soporte de comodines
17
+ - **🛡️ Gestión CORS**: Configuración CORS global y por ruta
18
+ - **✅ Validación de solicitudes**: Lógica de validación personalizada para autenticación, limitación de velocidad, etc.
19
+ - **🔄 Remapeo de URL**: Transforma URLs antes de reenviarlas a servicios de destino
20
+ - **📦 Uso dual**: Usa como paquete npm o contenedor Docker
21
+ - **🎯 Soporte multi-puerto**: Escucha en múltiples puertos simultáneamente
22
+ - **⚡ Alto rendimiento**: Construido sobre la implementación nativa HTTP/2 de Node.js
23
+
24
+ ## 📦 Instalación
25
+
26
+ ### Como paquete npm
27
+
28
+ ```bash
29
+ npm install @robiki/proxy
30
+ ```
31
+
32
+ ```bash
33
+ yarn add @robiki/proxy
34
+ ```
35
+
36
+ ### Como contenedor Docker
37
+
38
+ ```bash
39
+ docker pull robiki/proxy:latest
40
+ ```
41
+
42
+ ### Como servicio Docker Compose
43
+
44
+ ```yaml
45
+ services:
46
+ proxy:
47
+ image: robiki/proxy:latest
48
+ container_name: robiki-proxy
49
+ restart: unless-stopped
50
+ ports:
51
+ - '443:443'
52
+ - '8080:8080'
53
+ - '9229:9229'
54
+ volumes:
55
+ - ./proxy.config.json:/app/proxy.config.json:ro
56
+ - ./certs:/app/certs:ro
57
+ networks:
58
+ - app-network
59
+ ```
60
+
61
+ ## Notas
62
+
63
+ - Los hosts configurados localmente deben agregarse a su archivo `hosts` local.
64
+ - Si está utilizando certificados personalizados, debe agregar los archivos de certificado al directorio `certs`.
65
+
66
+ ## 🚀 Inicio rápido
67
+
68
+ ### Uso como paquete npm
69
+
70
+ ```javascript
71
+ import { createProxy } from '@robiki/proxy';
72
+
73
+ const proxy = await createProxy({
74
+ ports: [443, 8080],
75
+ ssl: {
76
+ key: './certs/key.pem',
77
+ cert: './certs/cert.pem',
78
+ allowHTTP1: true,
79
+ },
80
+ routes: {
81
+ 'api.example.com': {
82
+ target: 'localhost:3000',
83
+ ssl: true,
84
+ },
85
+ 'example.com': {
86
+ target: 'localhost:8080',
87
+ ssl: false,
88
+ },
89
+ },
90
+ });
91
+
92
+ console.log('¡El servidor proxy está funcionando!');
93
+ ```
94
+
95
+ ### Uso con Docker
96
+
97
+ 1. Crea un archivo `proxy.config.json`:
98
+
99
+ ```json
100
+ {
101
+ "ports": [443, 8080],
102
+ "ssl": {
103
+ "key": "/app/certs/key.pem",
104
+ "cert": "/app/certs/cert.pem",
105
+ "allowHTTP1": true
106
+ },
107
+ "routes": {
108
+ "api.example.com": {
109
+ "target": "backend-service:3000",
110
+ "ssl": true
111
+ },
112
+ "example.com": {
113
+ "target": "frontend-service:8080",
114
+ "ssl": false
115
+ }
116
+ }
117
+ }
118
+ ```
119
+
120
+ 2. Crea un `docker-compose.yml`:
121
+
122
+ ```yaml
123
+ version: '3.8'
124
+
125
+ services:
126
+ proxy:
127
+ image: robiki/proxy:latest
128
+ ports:
129
+ - '443:443'
130
+ - '8080:8080'
131
+ volumes:
132
+ - ./proxy.config.json:/app/proxy.config.json:ro
133
+ - ./certs:/app/certs:ro
134
+ environment:
135
+ - PROXY_CONFIG=/app/proxy.config.json
136
+ networks:
137
+ - app-network
138
+
139
+ backend-service:
140
+ image: your-backend-image
141
+ networks:
142
+ - app-network
143
+
144
+ frontend-service:
145
+ image: your-frontend-image
146
+ networks:
147
+ - app-network
148
+
149
+ networks:
150
+ app-network:
151
+ driver: bridge
152
+ ```
153
+
154
+ 3. Inicia los servicios:
155
+
156
+ ```bash
157
+ docker-compose up -d
158
+ ```
159
+
160
+ ## 📖 Configuración
161
+
162
+ ### Archivo de configuración
163
+
164
+ Crea un archivo `proxy.config.json` con la siguiente estructura:
165
+
166
+ ```json
167
+ {
168
+ "ports": [443, 8080],
169
+ "ssl": {
170
+ "key": "./certs/key.pem",
171
+ "cert": "./certs/cert.pem",
172
+ "ca": "./certs/ca.pem",
173
+ "allowHTTP1": true
174
+ },
175
+ "cors": {
176
+ "origin": "*",
177
+ "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
178
+ "allowedHeaders": ["Content-Type", "Authorization"],
179
+ "credentials": true,
180
+ "maxAge": 86400
181
+ },
182
+ "routes": {
183
+ "api.example.com": {
184
+ "target": "backend-service:3000",
185
+ "ssl": true,
186
+ "cors": {
187
+ "origin": ["https://example.com"],
188
+ "credentials": true
189
+ }
190
+ },
191
+ "*.example.com": {
192
+ "target": "wildcard-service:4000",
193
+ "ssl": true
194
+ }
195
+ }
196
+ }
197
+ ```
198
+
199
+ ### Variables de entorno
200
+
201
+ También puedes configurar el proxy usando variables de entorno:
202
+
203
+ ```bash
204
+ # Configuración SSL
205
+ SSL_KEY=/app/certs/key.pem
206
+ SSL_CERT=/app/certs/cert.pem
207
+ SSL_CA=/app/certs/ca.pem
208
+ SSL_ALLOW_HTTP1=true
209
+
210
+ # Configuración CORS
211
+ CORS_ORIGIN=*
212
+ CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
213
+ CORS_HEADERS=Content-Type,Authorization
214
+ CORS_CREDENTIALS=true
215
+
216
+ # Modo de depuración
217
+ DEBUG=true # Habilita el registro detallado para conexiones proxy y errores
218
+ ```
219
+
220
+ ## 🎯 Uso avanzado
221
+
222
+ ### Remapeo de URL
223
+
224
+ Transforma URLs antes de reenviarlas a servicios de destino:
225
+
226
+ ```javascript
227
+ const config = {
228
+ routes: {
229
+ 'api.example.com': {
230
+ target: 'backend:3000',
231
+ ssl: true,
232
+ remap: (url) => {
233
+ // Eliminar prefijo /api
234
+ return url.replace(/^\/api/, '');
235
+ },
236
+ },
237
+ },
238
+ };
239
+ ```
240
+
241
+ ### Validación de solicitudes
242
+
243
+ Agrega lógica de validación personalizada para autenticación, limitación de velocidad, etc.:
244
+
245
+ ```javascript
246
+ const config = {
247
+ // Validación global
248
+ validate: async (info) => {
249
+ if (!info.headers.authorization) {
250
+ return {
251
+ status: false,
252
+ code: 401,
253
+ message: 'No autorizado',
254
+ headers: { 'www-authenticate': 'Bearer' },
255
+ };
256
+ }
257
+ return { status: true };
258
+ },
259
+ routes: {
260
+ 'api.example.com': {
261
+ target: 'backend:3000',
262
+ ssl: true,
263
+ // Validación específica de ruta
264
+ validate: async (info) => {
265
+ const rateLimit = await checkRateLimit(info.remoteAddress);
266
+ if (!rateLimit.allowed) {
267
+ return {
268
+ status: false,
269
+ code: 429,
270
+ message: 'Demasiadas solicitudes',
271
+ };
272
+ }
273
+ return { status: true };
274
+ },
275
+ },
276
+ },
277
+ };
278
+ ```
279
+
280
+ ### Configuración CORS personalizada
281
+
282
+ Configura CORS globalmente o por ruta:
283
+
284
+ ```javascript
285
+ const config = {
286
+ // CORS global
287
+ cors: {
288
+ origin: ['https://example.com', 'https://www.example.com'],
289
+ methods: ['GET', 'POST', 'PUT', 'DELETE'],
290
+ allowedHeaders: ['Content-Type', 'Authorization'],
291
+ credentials: true,
292
+ maxAge: 86400,
293
+ },
294
+ routes: {
295
+ 'api.example.com': {
296
+ target: 'backend:3000',
297
+ ssl: true,
298
+ // CORS específico de ruta (sobrescribe global)
299
+ cors: {
300
+ origin: '*',
301
+ credentials: false,
302
+ },
303
+ },
304
+ },
305
+ };
306
+ ```
307
+
308
+ ### Manejadores personalizados
309
+
310
+ Crea manejadores de solicitudes personalizados para casos de uso avanzados:
311
+
312
+ ```javascript
313
+ import { createCustomProxy } from '@robiki/proxy';
314
+
315
+ const customRestHandler = async (req, res) => {
316
+ if (req.url === '/health') {
317
+ res.writeHead(200, { 'content-type': 'application/json' });
318
+ return res.end(JSON.stringify({ status: 'ok' }));
319
+ }
320
+ // Volver al comportamiento de proxy predeterminado
321
+ const { restAPIProxyHandler } = await import('@robiki/proxy/connections');
322
+ return restAPIProxyHandler(req, res);
323
+ };
324
+
325
+ const proxy = await createCustomProxy(config, {
326
+ rest: customRestHandler,
327
+ websocket: customWebSocketHandler,
328
+ stream: customStreamHandler,
329
+ });
330
+ ```
331
+
332
+ ## 🔧 Referencia de API
333
+
334
+ ### `createProxy(config: ServerConfig): Promise<ProxyServer>`
335
+
336
+ Crea e inicia un servidor proxy con la configuración dada.
337
+
338
+ **Parámetros:**
339
+
340
+ - `config`: Objeto de configuración del servidor
341
+
342
+ **Retorna:** Promise que se resuelve en una instancia de `ProxyServer`
343
+
344
+ ### `ProxyServer`
345
+
346
+ **Métodos:**
347
+
348
+ - `start()`: Iniciar el servidor proxy
349
+ - `stop()`: Detener el servidor proxy
350
+ - `getConfig()`: Obtener la configuración actual
351
+
352
+ ### Tipos de configuración
353
+
354
+ #### `ServerConfig`
355
+
356
+ ```typescript
357
+ interface ServerConfig {
358
+ ports?: number[];
359
+ ssl?: CertificateConfig;
360
+ routes: Record<string, RouteConfig>;
361
+ cors?: CorsConfig;
362
+ validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
363
+ }
364
+ ```
365
+
366
+ #### `RouteConfig`
367
+
368
+ ```typescript
369
+ interface RouteConfig {
370
+ target: string;
371
+ ssl?: boolean;
372
+ remap?: (url: string) => string;
373
+ cors?: CorsConfig;
374
+ validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
375
+ }
376
+ ```
377
+
378
+ #### `CorsConfig`
379
+
380
+ ```typescript
381
+ interface CorsConfig {
382
+ origin?: string | string[];
383
+ methods?: string[];
384
+ allowedHeaders?: string[];
385
+ exposedHeaders?: string[];
386
+ credentials?: boolean;
387
+ maxAge?: number;
388
+ }
389
+ ```
390
+
391
+ #### `ConnectionInfo`
392
+
393
+ ```typescript
394
+ interface ConnectionInfo {
395
+ id: number;
396
+ method: string;
397
+ path: string;
398
+ remoteAddress: string;
399
+ scheme: string;
400
+ authority: string;
401
+ origin: string;
402
+ headers: IncomingHttpHeaders;
403
+ query: URLSearchParams;
404
+ type: RequestType;
405
+ }
406
+ ```
407
+
408
+ ## 🐳 Uso de Docker
409
+
410
+ ### Uso en otro proyecto
411
+
412
+ 1. Agrega el proxy a tu `docker-compose.yml`:
413
+
414
+ ```yaml
415
+ services:
416
+ proxy:
417
+ image: robiki/proxy:latest
418
+ ports:
419
+ - '443:443'
420
+ - '8080:8080'
421
+ volumes:
422
+ - ./proxy.config.json:/app/proxy.config.json:ro
423
+ - ./certs:/app/certs:ro
424
+ networks:
425
+ - your-network
426
+
427
+ your-service:
428
+ image: your-service-image
429
+ networks:
430
+ - your-network
431
+ ```
432
+
433
+ 2. Configura rutas en `proxy.config.json` para apuntar a tus servicios
434
+
435
+ 3. Inicia tu stack:
436
+
437
+ ```bash
438
+ docker-compose up -d
439
+ ```
440
+
441
+ ### Construir imagen personalizada
442
+
443
+ Crea un Dockerfile personalizado:
444
+
445
+ ```dockerfile
446
+ FROM robiki/proxy:latest
447
+
448
+ # Copia tu configuración
449
+ COPY proxy.config.json /app/proxy.config.json
450
+ COPY certs /app/certs
451
+
452
+ # Establece variables de entorno
453
+ ENV PROXY_CONFIG=/app/proxy.config.json
454
+ ```
455
+
456
+ ## 📚 Ejemplos
457
+
458
+ Consulta el directorio `examples/` para más ejemplos de uso:
459
+
460
+ - `basic-usage.js` - Configuración simple de proxy
461
+ - `advanced-usage.js` - Características avanzadas (validación, CORS, remapeo)
462
+ - `custom-handlers.js` - Manejadores de solicitudes personalizados
463
+ - `docker-compose.example.yml` - Configuración completa de Docker
464
+
465
+ ## 🔐 Certificados SSL/TLS
466
+
467
+ ### Generar certificados autofirmados
468
+
469
+ Para desarrollo:
470
+
471
+ ```bash
472
+ mkdir -p certs
473
+ openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
474
+ ```
475
+
476
+ ### Usar Let's Encrypt
477
+
478
+ Para producción, usa certificados Let's Encrypt:
479
+
480
+ ```bash
481
+ certbot certonly --standalone -d example.com
482
+ ```
483
+
484
+ Luego refiérelos en tu configuración:
485
+
486
+ ```json
487
+ {
488
+ "ssl": {
489
+ "key": "/etc/letsencrypt/live/example.com/privkey.pem",
490
+ "cert": "/etc/letsencrypt/live/example.com/fullchain.pem"
491
+ }
492
+ }
493
+ ```
494
+
495
+ ## 🤝 Contribuir
496
+
497
+ ¡Las contribuciones son bienvenidas! No dudes en enviar un Pull Request.
498
+
499
+ ## 📄 Licencia
500
+
501
+ MIT © Robiki sp. z o.o.
502
+
503
+ ## 🔗 Enlaces
504
+
505
+ - [Repositorio GitHub](https://github.com/robiki-ai/robiki-proxy)
506
+ - [Paquete npm](https://www.npmjs.com/package/@robiki/proxy)
507
+ - [Rastreador de problemas](https://github.com/robiki-ai/robiki-proxy/issues)
508
+
509
+ ## 💡 Casos de uso
510
+
511
+ - **Arquitectura de microservicios**: Enrutar solicitudes a diferentes servicios según dominio/ruta
512
+ - **Entorno de desarrollo**: Proxy local para probar múltiples servicios
513
+ - **API Gateway**: Punto de entrada centralizado con autenticación y limitación de velocidad
514
+ - **Terminación SSL**: Manejar SSL/TLS a nivel de proxy
515
+ - **Gestión CORS**: Configuración CORS centralizada
516
+ - **Balanceo de carga**: Distribuir tráfico entre múltiples instancias (con manejadores personalizados)
517
+
518
+ ## 🛠️ Solución de problemas
519
+
520
+ ### Modo de depuración
521
+
522
+ Habilita el registro detallado para solucionar problemas de conexión:
523
+
524
+ ```bash
525
+ # Habilitar modo de depuración
526
+ DEBUG=true node your-proxy-script.js
527
+
528
+ # O con Docker
529
+ docker run -e DEBUG=true robiki/proxy:latest
530
+
531
+ # O en docker-compose.yml
532
+ services:
533
+ proxy:
534
+ image: robiki/proxy:latest
535
+ environment:
536
+ - DEBUG=true
537
+ ```
538
+
539
+ Cuando `DEBUG=true`, el proxy registrará:
540
+ - Todos los intentos de conexión proxy (REST, WebSocket, flujos HTTP/2)
541
+ - Detalles de solicitudes y respuestas
542
+ - Errores de conexión y tiempos de espera
543
+ - Errores de proxy y errores de cliente
544
+
545
+ ### Puerto ya en uso
546
+
547
+ El proxy intentará automáticamente matar procesos en los puertos configurados. Si esto falla, libera los puertos manualmente:
548
+
549
+ ```bash
550
+ lsof -ti:443 | xargs kill -9
551
+ lsof -ti:8080 | xargs kill -9
552
+ ```
553
+
554
+ ### Errores de certificado SSL
555
+
556
+ Asegúrate de que tus archivos de certificado sean legibles y estén en el formato correcto (PEM). Para desarrollo, usa certificados autofirmados.
557
+
558
+ ### Problemas de conexión WebSocket
559
+
560
+ Asegúrate de que tus rutas WebSocket estén configuradas con el protocolo correcto (ws/wss) y que el servicio de destino admita conexiones WebSocket.
561
+
562
+ ## 🧪 Pruebas
563
+
564
+ Robiki Proxy incluye un conjunto completo de pruebas que cubre pruebas unitarias, pruebas de integración y escenarios avanzados.
565
+
566
+ ### Ejecutar pruebas
567
+
568
+ ```bash
569
+ # Ejecutar todas las pruebas
570
+ yarn test
571
+
572
+ # Ejecutar pruebas en modo watch
573
+ yarn test:watch
574
+
575
+ # Ejecutar pruebas con cobertura
576
+ yarn test:coverage
577
+
578
+ # Ejecutar pruebas con UI
579
+ yarn test:ui
580
+ ```
581
+
582
+ ### Cobertura de pruebas
583
+
584
+ El conjunto de pruebas incluye:
585
+
586
+ - **Pruebas unitarias**: Configuración, utilidades, conversión de encabezados, manejo CORS
587
+ - **Pruebas de integración**: Proxy HTTP, resolución de rutas, validación, carga de configuración
588
+ - **Pruebas avanzadas**: Proxy WebSocket, flujos HTTP/2, conexiones concurrentes
589
+ - **Pruebas Docker**: Construcción de contenedores, carga de configuración, comportamiento en tiempo de ejecución
590
+
591
+ ### Pruebas Docker
592
+
593
+ Ejecutar pruebas de integración Docker:
594
+
595
+ ```bash
596
+ # Prueba completa de integración Docker
597
+ yarn test:docker
598
+
599
+ # Probar carga de configuración específicamente
600
+ yarn test:docker:config
601
+
602
+ # Ejecutar todas las pruebas (unitarias + integración + Docker)
603
+ yarn test:all
604
+ ```
605
+
606
+ O usando Make:
607
+
608
+ ```bash
609
+ # Prueba rápida de construcción Docker
610
+ make test-docker
611
+
612
+ # Suite completa de pruebas de integración
613
+ make test-docker-full
614
+
615
+ # Prueba de carga de configuración
616
+ make test-docker-config
617
+
618
+ # Prueba Docker Compose
619
+ make test-docker-compose
620
+ ```
621
+
622
+ Consulta el [README de pruebas Docker](tests/docker/README.md) para más detalles.
623
+
624
+ ## 📊 Rendimiento
625
+
626
+ El proxy está construido sobre la implementación nativa HTTP/2 de Node.js y está diseñado para alto rendimiento:
627
+
628
+ - Manejo eficiente de flujos
629
+ - Sobrecarga mínima
630
+ - Agrupación de conexiones
631
+ - Respaldo automático a HTTP/1.1
632
+
633
+ Para implementaciones de producción, considera:
634
+
635
+ - Usar un gestor de procesos (PM2, systemd)
636
+ - Habilitar clustering para sistemas multi-núcleo
637
+ - Monitoreo con health checks
638
+ - Configurar registro adecuado
639
+