@robiki/proxy 1.0.2 → 1.0.3

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 CHANGED
@@ -1,11 +1,11 @@
1
1
  # 🚀 Robiki Proxy
2
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.
3
+ > Un proxy inverso HTTP/2 de alto rendimiento con soporte WebSocket, enrutamiento configurable, CORS y validación de solicitudes. Úsalo como paquete npm o contenedor Docker para entornos de desarrollo local.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@robiki/proxy.svg)](https://www.npmjs.com/package/@robiki/proxy)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
- ## 🌍 Idiomas / Languages / Sprachen / 语言 / 言語 / Języki / Языки
8
+ ## 🌍 Idiomas
9
9
 
10
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
11
 
@@ -23,49 +23,23 @@
23
23
 
24
24
  ## 📦 Instalación
25
25
 
26
- ### Como paquete npm
26
+ ### Paquete npm
27
27
 
28
28
  ```bash
29
29
  npm install @robiki/proxy
30
- ```
31
-
32
- ```bash
30
+ # o
33
31
  yarn add @robiki/proxy
34
32
  ```
35
33
 
36
- ### Como contenedor Docker
34
+ ### Docker
37
35
 
38
36
  ```bash
39
37
  docker pull robiki/proxy:latest
40
38
  ```
41
39
 
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
40
  ## 🚀 Inicio rápido
67
41
 
68
- ### Uso como paquete npm
42
+ ### Paquete npm
69
43
 
70
44
  ```javascript
71
45
  import { createProxy } from '@robiki/proxy';
@@ -88,13 +62,11 @@ const proxy = await createProxy({
88
62
  },
89
63
  },
90
64
  });
91
-
92
- console.log('¡El servidor proxy está funcionando!');
93
65
  ```
94
66
 
95
- ### Uso con Docker
67
+ ### Docker
96
68
 
97
- 1. Crea un archivo `proxy.config.json`:
69
+ Crea `proxy.config.json`:
98
70
 
99
71
  ```json
100
72
  {
@@ -108,20 +80,14 @@ console.log('¡El servidor proxy está funcionando!');
108
80
  "api.example.com": {
109
81
  "target": "backend-service:3000",
110
82
  "ssl": true
111
- },
112
- "example.com": {
113
- "target": "frontend-service:8080",
114
- "ssl": false
115
83
  }
116
84
  }
117
85
  }
118
86
  ```
119
87
 
120
- 2. Crea un `docker-compose.yml`:
88
+ Crea `docker-compose.yml`:
121
89
 
122
90
  ```yaml
123
- version: '3.8'
124
-
125
91
  services:
126
92
  proxy:
127
93
  image: robiki/proxy:latest
@@ -133,25 +99,9 @@ services:
133
99
  - ./certs:/app/certs:ro
134
100
  environment:
135
101
  - 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
102
  ```
153
103
 
154
- 3. Inicia los servicios:
104
+ Inicia:
155
105
 
156
106
  ```bash
157
107
  docker-compose up -d
@@ -159,9 +109,9 @@ docker-compose up -d
159
109
 
160
110
  ## 📖 Configuración
161
111
 
162
- ### Archivo de configuración
112
+ ### Configuración JSON
163
113
 
164
- Crea un archivo `proxy.config.json` con la siguiente estructura:
114
+ Configuración declarativa simple:
165
115
 
166
116
  ```json
167
117
  {
@@ -169,24 +119,17 @@ Crea un archivo `proxy.config.json` con la siguiente estructura:
169
119
  "ssl": {
170
120
  "key": "./certs/key.pem",
171
121
  "cert": "./certs/cert.pem",
172
- "ca": "./certs/ca.pem",
173
122
  "allowHTTP1": true
174
123
  },
175
124
  "cors": {
176
125
  "origin": "*",
177
- "methods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
178
- "allowedHeaders": ["Content-Type", "Authorization"],
179
- "credentials": true,
180
- "maxAge": 86400
126
+ "methods": ["GET", "POST", "PUT", "DELETE"],
127
+ "credentials": true
181
128
  },
182
129
  "routes": {
183
130
  "api.example.com": {
184
- "target": "backend-service:3000",
185
- "ssl": true,
186
- "cors": {
187
- "origin": ["https://example.com"],
188
- "credentials": true
189
- }
131
+ "target": "backend:3000",
132
+ "ssl": true
190
133
  },
191
134
  "*.example.com": {
192
135
  "target": "wildcard-service:4000",
@@ -196,78 +139,32 @@ Crea un archivo `proxy.config.json` con la siguiente estructura:
196
139
  }
197
140
  ```
198
141
 
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
142
+ ### Configuración JavaScript
242
143
 
243
- Agrega lógica de validación personalizada para autenticación, limitación de velocidad, etc.:
144
+ Para características avanzadas como remapeo de URL y validación:
244
145
 
245
146
  ```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 };
147
+ // proxy.config.cjs
148
+ module.exports = {
149
+ ports: [443, 8080],
150
+ ssl: {
151
+ key: './certs/key.pem',
152
+ cert: './certs/cert.pem',
153
+ allowHTTP1: true,
258
154
  },
259
155
  routes: {
260
156
  'api.example.com': {
261
157
  target: 'backend:3000',
262
158
  ssl: true,
263
- // Validación específica de ruta
159
+ // Remapeo de URL
160
+ remap: (url) => url.replace(/^\/api/, ''),
161
+ // Validación de solicitudes
264
162
  validate: async (info) => {
265
- const rateLimit = await checkRateLimit(info.remoteAddress);
266
- if (!rateLimit.allowed) {
163
+ if (!info.headers.authorization) {
267
164
  return {
268
165
  status: false,
269
- code: 429,
270
- message: 'Demasiadas solicitudes',
166
+ code: 401,
167
+ message: 'Unauthorized',
271
168
  };
272
169
  }
273
170
  return { status: true };
@@ -277,93 +174,80 @@ const config = {
277
174
  };
278
175
  ```
279
176
 
280
- ### Configuración CORS personalizada
177
+ ### Configuración TypeScript
281
178
 
282
- Configura CORS globalmente o por ruta:
179
+ Configuración con tipos seguros y soporte completo de IDE:
283
180
 
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,
181
+ ```typescript
182
+ // proxy.config.ts
183
+ import type { ServerConfig, ConnectionInfo } from '@robiki/proxy';
184
+
185
+ const config: ServerConfig = {
186
+ ports: [443, 8080],
187
+ ssl: {
188
+ key: './certs/key.pem',
189
+ cert: './certs/cert.pem',
190
+ allowHTTP1: true,
293
191
  },
294
192
  routes: {
295
193
  'api.example.com': {
296
194
  target: 'backend:3000',
297
195
  ssl: true,
298
- // CORS específico de ruta (sobrescribe global)
299
- cors: {
300
- origin: '*',
301
- credentials: false,
196
+ remap: (url: string) => url.replace(/^\/api/, ''),
197
+ validate: async (info: ConnectionInfo) => {
198
+ if (!info.headers['x-api-key']) {
199
+ return { status: false, code: 401, message: 'API Key Required' };
200
+ }
201
+ return { status: true };
302
202
  },
303
203
  },
304
204
  },
305
205
  };
306
- ```
307
206
 
308
- ### Manejadores personalizados
207
+ export default config;
208
+ ```
309
209
 
310
- Crea manejadores de solicitudes personalizados para casos de uso avanzados:
210
+ ### Variables de entorno
311
211
 
312
- ```javascript
313
- import { createCustomProxy } from '@robiki/proxy';
212
+ ```bash
213
+ # Configuración SSL
214
+ SSL_KEY=/app/certs/key.pem
215
+ SSL_CERT=/app/certs/cert.pem
216
+ SSL_ALLOW_HTTP1=true
314
217
 
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
- };
218
+ # Configuración CORS
219
+ CORS_ORIGIN=*
220
+ CORS_METHODS=GET,POST,PUT,DELETE
221
+ CORS_CREDENTIALS=true
324
222
 
325
- const proxy = await createCustomProxy(config, {
326
- rest: customRestHandler,
327
- websocket: customWebSocketHandler,
328
- stream: customStreamHandler,
329
- });
223
+ # Modo de depuración
224
+ DEBUG=true
330
225
  ```
331
226
 
332
227
  ## 🔧 Referencia de API
333
228
 
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`
229
+ ### `createProxy(config: ServerConfig)`
345
230
 
346
- **Métodos:**
231
+ Crea e inicia un servidor proxy.
347
232
 
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`
233
+ **ServerConfig:**
355
234
 
356
235
  ```typescript
357
236
  interface ServerConfig {
358
237
  ports?: number[];
359
- ssl?: CertificateConfig;
238
+ ssl?: {
239
+ key: string;
240
+ cert: string;
241
+ ca?: string;
242
+ allowHTTP1?: boolean;
243
+ };
360
244
  routes: Record<string, RouteConfig>;
361
245
  cors?: CorsConfig;
362
246
  validate?: (info: ConnectionInfo) => Promise<ForwardValidationResult>;
363
247
  }
364
248
  ```
365
249
 
366
- #### `RouteConfig`
250
+ **RouteConfig:**
367
251
 
368
252
  ```typescript
369
253
  interface RouteConfig {
@@ -375,265 +259,86 @@ interface RouteConfig {
375
259
  }
376
260
  ```
377
261
 
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
262
  ## 🐳 Uso de Docker
409
263
 
410
- ### Uso en otro proyecto
411
-
412
- 1. Agrega el proxy a tu `docker-compose.yml`:
264
+ Monta tu archivo de configuración (JSON, .cjs o .ts):
413
265
 
414
266
  ```yaml
415
267
  services:
416
268
  proxy:
417
269
  image: robiki/proxy:latest
418
- ports:
419
- - '443:443'
420
- - '8080:8080'
421
270
  volumes:
422
- - ./proxy.config.json:/app/proxy.config.json:ro
271
+ - ./proxy.config.cjs:/app/proxy.config.cjs:ro
423
272
  - ./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
273
+ environment:
274
+ - PROXY_CONFIG=/app/proxy.config.cjs
454
275
  ```
455
276
 
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
277
+ ## 🔐 Certificados SSL
468
278
 
469
- Para desarrollo:
279
+ ### Desarrollo (autofirmados)
470
280
 
471
281
  ```bash
472
282
  mkdir -p certs
473
283
  openssl req -x509 -newkey rsa:4096 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes
474
284
  ```
475
285
 
476
- ### Usar Let's Encrypt
477
-
478
- Para producción, usa certificados Let's Encrypt:
286
+ ### Producción (Let's Encrypt)
479
287
 
480
288
  ```bash
481
289
  certbot certonly --standalone -d example.com
482
290
  ```
483
291
 
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
292
  ## 🛠️ Solución de problemas
519
293
 
520
294
  ### Modo de depuración
521
295
 
522
- Habilita el registro detallado para solucionar problemas de conexión:
296
+ Habilita el registro detallado:
523
297
 
524
298
  ```bash
525
- # Habilitar modo de depuración
526
- DEBUG=true node your-proxy-script.js
527
-
528
- # O con Docker
299
+ DEBUG=true node your-script.js
300
+ # o
529
301
  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
302
  ```
538
303
 
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
304
  ### Puerto ya en uso
546
305
 
547
- El proxy intentará automáticamente matar procesos en los puertos configurados. Si esto falla, libera los puertos manualmente:
548
-
549
306
  ```bash
550
307
  lsof -ti:443 | xargs kill -9
551
- lsof -ti:8080 | xargs kill -9
552
308
  ```
553
309
 
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
310
  ## 🧪 Pruebas
563
311
 
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
312
  ```bash
569
313
  # Ejecutar todas las pruebas
570
314
  yarn test
571
315
 
572
- # Ejecutar pruebas en modo watch
573
- yarn test:watch
574
-
575
- # Ejecutar pruebas con cobertura
316
+ # Con cobertura
576
317
  yarn test:coverage
577
318
 
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
319
+ # Pruebas Docker
597
320
  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
321
  ```
605
322
 
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
323
+ ## 📚 Ejemplos
617
324
 
618
- # Prueba Docker Compose
619
- make test-docker-compose
620
- ```
325
+ Consulta el directorio `examples/`:
621
326
 
622
- Consulta el [README de pruebas Docker](tests/docker/README.md) para más detalles.
327
+ - `basic-usage.js` - Configuración simple de proxy
328
+ - `advanced-usage.js` - Validación, CORS, remapeo
329
+ - `custom-handlers.js` - Manejadores de solicitudes personalizados
330
+ - `docker-compose.example.yml` - Configuración Docker
623
331
 
624
- ## 📊 Rendimiento
332
+ ## 🤝 Contribuir
625
333
 
626
- El proxy está construido sobre la implementación nativa HTTP/2 de Node.js y está diseñado para alto rendimiento:
334
+ ¡Las contribuciones son bienvenidas! Consulta [CONTRIBUTING.md](CONTRIBUTING.md) para más detalles.
627
335
 
628
- - Manejo eficiente de flujos
629
- - Sobrecarga mínima
630
- - Agrupación de conexiones
631
- - Respaldo automático a HTTP/1.1
336
+ ## 📄 Licencia
632
337
 
633
- Para implementaciones de producción, considera:
338
+ MIT © Robiki sp. z o.o.
634
339
 
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
340
+ ## 🔗 Enlaces
639
341
 
342
+ - [Repositorio GitHub](https://github.com/robiki-ai/robiki-proxy)
343
+ - [Paquete npm](https://www.npmjs.com/package/@robiki/proxy)
344
+ - [Rastreador de problemas](https://github.com/robiki-ai/robiki-proxy/issues)