@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.ru.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # 🚀 Robiki Proxy
2
2
 
3
- > Высокопроизводительный, гибкий обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте его как npm-пакет в вашем Node.js приложении или как автономный Docker-контейнер. Предназначен для использования только в качестве доменного прокси для локальных сред разработки.
3
+ > Высокопроизводительный обратный прокси-сервер HTTP/2 с поддержкой WebSocket, настраиваемой маршрутизацией, CORS и валидацией запросов. Используйте как npm-пакет или Docker-контейнер для локальных сред разработки.
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
- ## 🌍 Языки / Languages / Sprachen / 语言 / 言語 / Języki / Idiomas
8
+ ## 🌍 Языки
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
  ## 📦 Установка
25
25
 
26
- ### Как npm-пакет
26
+ ### npm-пакет
27
27
 
28
28
  ```bash
29
29
  npm install @robiki/proxy
30
- ```
31
-
32
- ```bash
30
+ # или
33
31
  yarn add @robiki/proxy
34
32
  ```
35
33
 
36
- ### Как Docker-контейнер
34
+ ### Docker
37
35
 
38
36
  ```bash
39
37
  docker pull robiki/proxy:latest
40
38
  ```
41
39
 
42
- ### Как сервис 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
- ## Примечания
62
-
63
- - Хосты, настроенные локально, должны быть добавлены в ваш локальный файл `hosts`.
64
- - Если вы используете пользовательские сертификаты, вам необходимо добавить файлы сертификатов в директорию `certs`.
65
-
66
40
  ## 🚀 Быстрый старт
67
41
 
68
- ### Использование как npm-пакет
42
+ ### 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('Прокси-сервер работает!');
93
65
  ```
94
66
 
95
- ### Использование с Docker
67
+ ### Docker
96
68
 
97
- 1. Создайте файл `proxy.config.json`:
69
+ Создайте `proxy.config.json`:
98
70
 
99
71
  ```json
100
72
  {
@@ -108,20 +80,14 @@ console.log('Прокси-сервер работает!');
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. Создайте `docker-compose.yml`:
88
+ Создайте `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. Запустите сервисы:
104
+ Запустите:
155
105
 
156
106
  ```bash
157
107
  docker-compose up -d
@@ -159,9 +109,9 @@ docker-compose up -d
159
109
 
160
110
  ## 📖 Конфигурация
161
111
 
162
- ### Файл конфигурации
112
+ ### JSON конфигурация
163
113
 
164
- Создайте файл `proxy.config.json` со следующей структурой:
114
+ Простая декларативная конфигурация:
165
115
 
166
116
  ```json
167
117
  {
@@ -169,24 +119,17 @@ docker-compose up -d
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 @@ docker-compose up -d
196
139
  }
197
140
  ```
198
141
 
199
- ### Переменные окружения
142
+ ### JavaScript конфигурация
200
143
 
201
- Вы также можете настроить прокси с помощью переменных окружения:
202
-
203
- ```bash
204
- # Конфигурация 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
- # Конфигурация CORS
211
- CORS_ORIGIN=*
212
- CORS_METHODS=GET,POST,PUT,DELETE,OPTIONS
213
- CORS_HEADERS=Content-Type,Authorization
214
- CORS_CREDENTIALS=true
215
-
216
- # Режим отладки
217
- DEBUG=true # Включить подробное логирование для прокси-соединений и ошибок
218
- ```
219
-
220
- ## 🎯 Расширенное использование
221
-
222
- ### Переназначение URL
223
-
224
- Преобразование URL перед пересылкой к целевым сервисам:
144
+ Для расширенных функций, таких как переназначение URL и валидация:
225
145
 
226
146
  ```javascript
227
- const config = {
228
- routes: {
229
- 'api.example.com': {
230
- target: 'backend:3000',
231
- ssl: true,
232
- remap: (url) => {
233
- // Удалить префикс /api
234
- return url.replace(/^\/api/, '');
235
- },
236
- },
237
- },
238
- };
239
- ```
240
-
241
- ### Валидация запросов
242
-
243
- Добавление пользовательской логики валидации для аутентификации, ограничения скорости и т.д.:
244
-
245
- ```javascript
246
- const config = {
247
- // Глобальная валидация
248
- validate: async (info) => {
249
- if (!info.headers.authorization) {
250
- return {
251
- status: false,
252
- code: 401,
253
- message: 'Не авторизован',
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
- // Валидация для конкретного маршрута
159
+ // Переназначение URL
160
+ remap: (url) => url.replace(/^\/api/, ''),
161
+ // Валидация запросов
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: 'Слишком много запросов',
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
- ### Пользовательская конфигурация CORS
177
+ ### TypeScript конфигурация
281
178
 
282
- Настройка CORS глобально или для каждого маршрута:
179
+ Типобезопасная конфигурация с полной поддержкой IDE:
283
180
 
284
- ```javascript
285
- const config = {
286
- // Глобальный CORS
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 для конкретного маршрута (переопределяет глобальный)
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
- ### Пользовательские обработчики
207
+ export default config;
208
+ ```
309
209
 
310
- Создание пользовательских обработчиков запросов для продвинутых случаев использования:
210
+ ### Переменные окружения
311
211
 
312
- ```javascript
313
- import { createCustomProxy } from '@robiki/proxy';
212
+ ```bash
213
+ # Конфигурация 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
- // Откат к стандартному поведению прокси
321
- const { restAPIProxyHandler } = await import('@robiki/proxy/connections');
322
- return restAPIProxyHandler(req, res);
323
- };
218
+ # Конфигурация 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
+ # Режим отладки
224
+ DEBUG=true
330
225
  ```
331
226
 
332
227
  ## 🔧 Справочник API
333
228
 
334
- ### `createProxy(config: ServerConfig): Promise<ProxyServer>`
335
-
336
- Создает и запускает прокси-сервер с заданной конфигурацией.
337
-
338
- **Параметры:**
339
-
340
- - `config`: Объект конфигурации сервера
229
+ ### `createProxy(config: ServerConfig)`
341
230
 
342
- **Возвращает:** Promise, который разрешается в экземпляр `ProxyServer`
231
+ Создает и запускает прокси-сервер.
343
232
 
344
- ### `ProxyServer`
345
-
346
- **Методы:**
347
-
348
- - `start()`: Запустить прокси-сервер
349
- - `stop()`: Остановить прокси-сервер
350
- - `getConfig()`: Получить текущую конфигурацию
351
-
352
- ### Типы конфигурации
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
  ## 🐳 Использование Docker
409
263
 
410
- ### Использование в другом проекте
411
-
412
- 1. Добавьте прокси в ваш `docker-compose.yml`:
264
+ Смонтируйте ваш конфигурационный файл (JSON, .cjs или .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. Настройте маршруты в `proxy.config.json`, чтобы они указывали на ваши сервисы
434
-
435
- 3. Запустите ваш стек:
436
-
437
- ```bash
438
- docker-compose up -d
439
- ```
440
-
441
- ### Создание пользовательского образа
442
-
443
- Создайте пользовательский Dockerfile:
444
-
445
- ```dockerfile
446
- FROM robiki/proxy:latest
447
-
448
- # Скопируйте вашу конфигурацию
449
- COPY proxy.config.json /app/proxy.config.json
450
- COPY certs /app/certs
451
-
452
- # Установите переменные окружения
453
- ENV PROXY_CONFIG=/app/proxy.config.json
273
+ environment:
274
+ - PROXY_CONFIG=/app/proxy.config.cjs
454
275
  ```
455
276
 
456
- ## 📚 Примеры
457
-
458
- Проверьте директорию `examples/` для большего количества примеров использования:
277
+ ## 🔐 SSL сертификаты
459
278
 
460
- - `basic-usage.js` - Простая настройка прокси
461
- - `advanced-usage.js` - Расширенные функции (валидация, CORS, переназначение)
462
- - `custom-handlers.js` - Пользовательские обработчики запросов
463
- - `docker-compose.example.yml` - Полная настройка Docker
464
-
465
- ## 🔐 SSL/TLS сертификаты
466
-
467
- ### Генерация самоподписанных сертификатов
468
-
469
- Для разработки:
279
+ ### Разработка (самоподписанные)
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
- ### Использование Let's Encrypt
477
-
478
- Для продакшена используйте сертификаты Let's Encrypt:
286
+ ### Продакшн (Let's Encrypt)
479
287
 
480
288
  ```bash
481
289
  certbot certonly --standalone -d example.com
482
290
  ```
483
291
 
484
- Затем ссылайтесь на них в вашей конфигурации:
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
- ## 🤝 Вклад
496
-
497
- Вклады приветствуются! Пожалуйста, не стесняйтесь отправлять Pull Request.
498
-
499
- ## 📄 Лицензия
500
-
501
- MIT © Robiki sp. z o.o.
502
-
503
- ## 🔗 Ссылки
504
-
505
- - [GitHub репозиторий](https://github.com/robiki-ai/robiki-proxy)
506
- - [npm пакет](https://www.npmjs.com/package/@robiki/proxy)
507
- - [Трекер проблем](https://github.com/robiki-ai/robiki-proxy/issues)
508
-
509
- ## 💡 Случаи использования
510
-
511
- - **Архитектура микросервисов**: Маршрутизация запросов к различным сервисам на основе домена/пути
512
- - **Среда разработки**: Локальный прокси для тестирования нескольких сервисов
513
- - **API Gateway**: Централизованная точка входа с аутентификацией и ограничением скорости
514
- - **SSL терминация**: Обработка SSL/TLS на уровне прокси
515
- - **Управление CORS**: Централизованная конфигурация CORS
516
- - **Балансировка нагрузки**: Распределение трафика между несколькими экземплярами (с пользовательскими обработчиками)
517
-
518
292
  ## 🛠️ Устранение неполадок
519
293
 
520
294
  ### Режим отладки
521
295
 
522
- Включите подробное логирование для устранения проблем с подключением:
296
+ Включите подробное логирование:
523
297
 
524
298
  ```bash
525
- # Включить режим отладки
526
- DEBUG=true node your-proxy-script.js
527
-
528
- # Или с Docker
299
+ DEBUG=true node your-script.js
300
+ # или
529
301
  docker run -e DEBUG=true robiki/proxy:latest
530
-
531
- # Или в docker-compose.yml
532
- services:
533
- proxy:
534
- image: robiki/proxy:latest
535
- environment:
536
- - DEBUG=true
537
302
  ```
538
303
 
539
- Когда `DEBUG=true`, прокси будет логировать:
540
- - Все попытки прокси-соединения (REST, WebSocket, HTTP/2 потоки)
541
- - Детали запросов и ответов
542
- - Ошибки соединения и таймауты
543
- - Ошибки прокси и ошибки клиента
544
-
545
304
  ### Порт уже используется
546
305
 
547
- Прокси автоматически попытается завершить процессы на настроенных портах. Если это не удастся, освободите порты вручную:
548
-
549
306
  ```bash
550
307
  lsof -ti:443 | xargs kill -9
551
- lsof -ti:8080 | xargs kill -9
552
308
  ```
553
309
 
554
- ### Ошибки SSL сертификата
555
-
556
- Убедитесь, что ваши файлы сертификатов читаемы и в правильном формате (PEM). Для разработки используйте самоподписанные сертификаты.
557
-
558
- ### Проблемы с WebSocket соединением
559
-
560
- Убедитесь, что ваши WebSocket маршруты настроены с правильным протоколом (ws/wss) и что целевой сервис поддерживает WebSocket соединения.
561
-
562
310
  ## 🧪 Тестирование
563
311
 
564
- Robiki Proxy включает комплексный набор тестов, охватывающий модульные тесты, интеграционные тесты и продвинутые сценарии.
565
-
566
- ### Запуск тестов
567
-
568
312
  ```bash
569
313
  # Запустить все тесты
570
314
  yarn test
571
315
 
572
- # Запустить тесты в режиме наблюдения
573
- yarn test:watch
574
-
575
- # Запустить тесты с покрытием
316
+ # С покрытием
576
317
  yarn test:coverage
577
318
 
578
- # Запустить тесты с UI
579
- yarn test:ui
580
- ```
581
-
582
- ### Покрытие тестами
583
-
584
- Набор тестов включает:
585
-
586
- - **Модульные тесты**: Конфигурация, утилиты, преобразование заголовков, обработка CORS
587
- - **Интеграционные тесты**: HTTP проксирование, разрешение маршрутов, валидация, загрузка конфигурации
588
- - **Продвинутые тесты**: WebSocket проксирование, HTTP/2 потоки, одновременные соединения
589
- - **Docker тесты**: Сборка контейнеров, загрузка конфигурации, поведение во время выполнения
590
-
591
- ### Docker тесты
592
-
593
- Запуск интеграционных тестов Docker:
594
-
595
- ```bash
596
- # Полный интеграционный тест Docker
319
+ # Docker тесты
597
320
  yarn test:docker
598
-
599
- # Тест загрузки конфигурации
600
- yarn test:docker:config
601
-
602
- # Запустить все тесты (модульные + интеграционные + Docker)
603
- yarn test:all
604
321
  ```
605
322
 
606
- Или используя Make:
607
-
608
- ```bash
609
- # Быстрый тест сборки Docker
610
- make test-docker
611
-
612
- # Полный набор интеграционных тестов
613
- make test-docker-full
614
-
615
- # Тест загрузки конфигурации
616
- make test-docker-config
323
+ ## 📚 Примеры
617
324
 
618
- # Тест Docker Compose
619
- make test-docker-compose
620
- ```
325
+ Смотрите директорию `examples/`:
621
326
 
622
- Смотрите [Docker Tests README](tests/docker/README.md) для более подробной информации.
327
+ - `basic-usage.js` - Простая настройка прокси
328
+ - `advanced-usage.js` - Валидация, CORS, переназначение
329
+ - `custom-handlers.js` - Пользовательские обработчики запросов
330
+ - `docker-compose.example.yml` - Настройка Docker
623
331
 
624
- ## 📊 Производительность
332
+ ## 🤝 Вклад в проект
625
333
 
626
- Прокси построен на нативной реализации HTTP/2 в Node.js и разработан для высокой производительности:
334
+ Вклад приветствуется! Смотрите [CONTRIBUTING.md](CONTRIBUTING.md) для подробностей.
627
335
 
628
- - Эффективная обработка потоков
629
- - Минимальные накладные расходы
630
- - Пулинг соединений
631
- - Автоматический откат к HTTP/1.1
336
+ ## 📄 Лицензия
632
337
 
633
- Для продакшен развертываний рассмотрите:
338
+ MIT © Robiki sp. z o.o.
634
339
 
635
- - Использование менеджера процессов (PM2, systemd)
636
- - Включение кластеризации для многоядерных систем
637
- - Мониторинг с помощью health checks
638
- - Настройка правильного логирования
340
+ ## 🔗 Ссылки
639
341
 
342
+ - [Репозиторий GitHub](https://github.com/robiki-ai/robiki-proxy)
343
+ - [npm пакет](https://www.npmjs.com/package/@robiki/proxy)
344
+ - [Issue Tracker](https://github.com/robiki-ai/robiki-proxy/issues)