@gaias/basenode 1.3.6 → 1.3.9
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 +640 -46
- package/dist/libs/rabbitmq/DistributedEvents.d.ts +1 -3
- package/dist/libs/rabbitmq/DistributedEvents.d.ts.map +1 -1
- package/dist/libs/rabbitmq/DistributedEvents.js.map +1 -1
- package/dist/libs/rabbitmq/DistributedEventsLoader.d.ts +1 -0
- package/dist/libs/rabbitmq/DistributedEventsLoader.d.ts.map +1 -1
- package/dist/libs/rabbitmq/DistributedEventsLoader.js +13 -3
- package/dist/libs/rabbitmq/DistributedEventsLoader.js.map +1 -1
- package/dist/libs/rabbitmq/EventsManager.d.ts +4 -1
- package/dist/libs/rabbitmq/EventsManager.d.ts.map +1 -1
- package/dist/libs/rabbitmq/EventsManager.js.map +1 -1
- package/dist/libs/rabbitmq/RabbitMQConfig.d.ts +4 -0
- package/dist/libs/rabbitmq/RabbitMQConfig.d.ts.map +1 -0
- package/dist/libs/rabbitmq/RabbitMQConfig.js +3 -0
- package/dist/libs/rabbitmq/RabbitMQConfig.js.map +1 -0
- package/dist/libs/rabbitmq/ReliableDistributedEvents.d.ts +21 -0
- package/dist/libs/rabbitmq/ReliableDistributedEvents.d.ts.map +1 -0
- package/dist/libs/rabbitmq/ReliableDistributedEvents.js +157 -0
- package/dist/libs/rabbitmq/ReliableDistributedEvents.js.map +1 -0
- package/dist/libs/rabbitmq/index.d.ts +2 -0
- package/dist/libs/rabbitmq/index.d.ts.map +1 -1
- package/dist/libs/rabbitmq/index.js +2 -0
- package/dist/libs/rabbitmq/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
# @gaias/basenode
|
|
2
2
|
|
|
3
|
-
[](https://github.com/gaias/basenode)
|
|
4
4
|
[](https://nodejs.org)
|
|
5
5
|
[]()
|
|
6
6
|
|
|
7
|
+
[English](#english) | [简体中文](#简体中文)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<a name="english"></a>
|
|
12
|
+
|
|
13
|
+
## English
|
|
14
|
+
|
|
7
15
|
A comprehensive Node.js API development framework built on Koa, TypeORM, TypeDI, and routing-controllers. Provides a microframework architecture with built-in support for RESTful APIs, WebSocket controllers, database ORM, distributed events, Redis caching, and API gateway integration.
|
|
8
16
|
|
|
9
|
-
|
|
17
|
+
### Features
|
|
10
18
|
|
|
11
19
|
- **Modern Framework Stack**: Koa 3.x, TypeORM 0.3.x, TypeDI, routing-controllers
|
|
12
20
|
- **TypeScript First**: Full TypeScript support with decorators and strict type checking
|
|
@@ -24,9 +32,9 @@ A comprehensive Node.js API development framework built on Koa, TypeORM, TypeDI,
|
|
|
24
32
|
- **OpenAPI**: Automatic OpenAPI/Swagger documentation generation
|
|
25
33
|
- **Development Tools**: Hot reload, linting, testing, code generation
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+
### Quick Start
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
#### Prerequisites
|
|
30
38
|
|
|
31
39
|
- Node.js >= 18.0.0
|
|
32
40
|
- Yarn >= 1.22.x
|
|
@@ -34,7 +42,7 @@ A comprehensive Node.js API development framework built on Koa, TypeORM, TypeDI,
|
|
|
34
42
|
- Redis 6.0+ (optional, for caching)
|
|
35
43
|
- RabbitMQ 3.8+ (optional, for distributed events)
|
|
36
44
|
|
|
37
|
-
|
|
45
|
+
#### Installation
|
|
38
46
|
|
|
39
47
|
```bash
|
|
40
48
|
# Clone the repository
|
|
@@ -45,7 +53,7 @@ cd basenode
|
|
|
45
53
|
yarn install
|
|
46
54
|
```
|
|
47
55
|
|
|
48
|
-
|
|
56
|
+
#### Configuration
|
|
49
57
|
|
|
50
58
|
1. **Database Configuration**
|
|
51
59
|
|
|
@@ -93,7 +101,7 @@ API_GATEWAY_HOST_PORT=192.168.1.100:9180 # Gateway admin API address
|
|
|
93
101
|
DOMAINS=example.com,*.example.com # Allowed domains for gateway
|
|
94
102
|
```
|
|
95
103
|
|
|
96
|
-
|
|
104
|
+
#### Running the Application
|
|
97
105
|
|
|
98
106
|
```bash
|
|
99
107
|
# Development mode with hot reload
|
|
@@ -110,7 +118,7 @@ The application will start on `http://localhost:3000` (or configured port).
|
|
|
110
118
|
|
|
111
119
|
Access the health check endpoint: `http://localhost:3000/_healthcheck`
|
|
112
120
|
|
|
113
|
-
|
|
121
|
+
### Project Structure
|
|
114
122
|
|
|
115
123
|
```
|
|
116
124
|
.
|
|
@@ -164,9 +172,9 @@ Access the health check endpoint: `http://localhost:3000/_healthcheck`
|
|
|
164
172
|
└── keys/ # JWT keys (generated)
|
|
165
173
|
```
|
|
166
174
|
|
|
167
|
-
|
|
175
|
+
### Development Commands
|
|
168
176
|
|
|
169
|
-
|
|
177
|
+
#### Running
|
|
170
178
|
|
|
171
179
|
```bash
|
|
172
180
|
# Development with hot reload
|
|
@@ -179,7 +187,7 @@ yarn devPro
|
|
|
179
187
|
yarn ncc:run
|
|
180
188
|
```
|
|
181
189
|
|
|
182
|
-
|
|
190
|
+
#### Building
|
|
183
191
|
|
|
184
192
|
```bash
|
|
185
193
|
# Build for publishing
|
|
@@ -189,7 +197,7 @@ yarn build:publish
|
|
|
189
197
|
yarn ncc:build
|
|
190
198
|
```
|
|
191
199
|
|
|
192
|
-
|
|
200
|
+
#### Database Code Generation
|
|
193
201
|
|
|
194
202
|
```bash
|
|
195
203
|
# Generate entities from database schema
|
|
@@ -207,7 +215,7 @@ yarn gen:idx
|
|
|
207
215
|
|
|
208
216
|
**Note**: Define tables to generate in `gen_db.json` before running.
|
|
209
217
|
|
|
210
|
-
|
|
218
|
+
#### Testing & Quality
|
|
211
219
|
|
|
212
220
|
```bash
|
|
213
221
|
# Run tests
|
|
@@ -226,7 +234,7 @@ yarn lint
|
|
|
226
234
|
yarn lint:fix
|
|
227
235
|
```
|
|
228
236
|
|
|
229
|
-
|
|
237
|
+
#### Security
|
|
230
238
|
|
|
231
239
|
```bash
|
|
232
240
|
# Run security audit
|
|
@@ -244,7 +252,7 @@ yarn security:json
|
|
|
244
252
|
|
|
245
253
|
See [docs/SECURITY.md](docs/SECURITY.md) for comprehensive security guidelines.
|
|
246
254
|
|
|
247
|
-
|
|
255
|
+
#### Dependency Management
|
|
248
256
|
|
|
249
257
|
```bash
|
|
250
258
|
# Check for outdated dependencies
|
|
@@ -254,7 +262,7 @@ yarn deps:check
|
|
|
254
262
|
yarn deps:update
|
|
255
263
|
```
|
|
256
264
|
|
|
257
|
-
|
|
265
|
+
#### Other Tools
|
|
258
266
|
|
|
259
267
|
```bash
|
|
260
268
|
# Generate RSA keys for JWT
|
|
@@ -264,9 +272,9 @@ yarn gen:keys
|
|
|
264
272
|
yarn buildNum
|
|
265
273
|
```
|
|
266
274
|
|
|
267
|
-
|
|
275
|
+
### Usage Examples
|
|
268
276
|
|
|
269
|
-
|
|
277
|
+
#### Creating a RESTful Controller
|
|
270
278
|
|
|
271
279
|
```typescript
|
|
272
280
|
import { rest, di } from '@/libs/deps';
|
|
@@ -297,7 +305,7 @@ export class UserController extends UniversalController {
|
|
|
297
305
|
}
|
|
298
306
|
```
|
|
299
307
|
|
|
300
|
-
|
|
308
|
+
#### Creating a Service with Repository
|
|
301
309
|
|
|
302
310
|
```typescript
|
|
303
311
|
import { di } from '@/libs/deps';
|
|
@@ -317,7 +325,7 @@ export class UserService extends UniversalService<User> {
|
|
|
317
325
|
}
|
|
318
326
|
```
|
|
319
327
|
|
|
320
|
-
|
|
328
|
+
#### Validation with VO (Value Object)
|
|
321
329
|
|
|
322
330
|
```typescript
|
|
323
331
|
import { cv } from '@/libs/deps';
|
|
@@ -341,7 +349,7 @@ export class UserVo {
|
|
|
341
349
|
}
|
|
342
350
|
```
|
|
343
351
|
|
|
344
|
-
|
|
352
|
+
#### Pagination
|
|
345
353
|
|
|
346
354
|
```typescript
|
|
347
355
|
import { rest, di } from '@/libs/deps';
|
|
@@ -362,7 +370,7 @@ export class UserController {
|
|
|
362
370
|
}
|
|
363
371
|
```
|
|
364
372
|
|
|
365
|
-
|
|
373
|
+
#### Caching
|
|
366
374
|
|
|
367
375
|
```typescript
|
|
368
376
|
import { rest, di } from '@/libs/deps';
|
|
@@ -395,7 +403,7 @@ export class DataController {
|
|
|
395
403
|
}
|
|
396
404
|
```
|
|
397
405
|
|
|
398
|
-
|
|
406
|
+
#### Distributed Events
|
|
399
407
|
|
|
400
408
|
```typescript
|
|
401
409
|
import { di } from '@/libs/deps';
|
|
@@ -435,34 +443,34 @@ export class UserEventHandler {
|
|
|
435
443
|
}
|
|
436
444
|
```
|
|
437
445
|
|
|
438
|
-
|
|
446
|
+
### Key Technologies
|
|
439
447
|
|
|
440
|
-
|
|
448
|
+
#### Core Framework
|
|
441
449
|
- **[Koa](https://koajs.com/)** 3.0.3 - Lightweight web framework
|
|
442
450
|
- **[routing-controllers](https://github.com/typestack/routing-controllers)** 0.11.3 - Decorator-based routing
|
|
443
451
|
- **[socket-controllers](https://github.com/typestack/socket-controllers)** 0.3.1 - WebSocket controllers
|
|
444
452
|
- **[TypeDI](https://github.com/typestack/typedi)** 0.10.0 - Dependency injection
|
|
445
453
|
- **[microframework](https://github.com/typestack/microframework)** 0.6.4 - Loader pattern
|
|
446
454
|
|
|
447
|
-
|
|
455
|
+
#### Data Layer
|
|
448
456
|
- **[TypeORM](https://typeorm.io/)** 0.3.27 - SQL ORM
|
|
449
457
|
- **[typeorm-transactional](https://github.com/Aliheym/typeorm-transactional)** 0.5.0 - Transaction management
|
|
450
458
|
- **[mysql2](https://github.com/sidorares/node-mysql2)** 3.15.2 - MySQL/MariaDB driver
|
|
451
459
|
- **[class-validator](https://github.com/typestack/class-validator)** 0.14.2 - Validation
|
|
452
460
|
- **[class-transformer](https://github.com/typestack/class-transformer)** 0.5.1 - Transformation
|
|
453
461
|
|
|
454
|
-
|
|
462
|
+
#### Caching & Messaging
|
|
455
463
|
- **[ioredis](https://github.com/luin/ioredis)** 5.8.1 - Redis client
|
|
456
464
|
- **[amqplib](https://github.com/amqp-node/amqplib)** 0.10.9 - RabbitMQ client
|
|
457
465
|
|
|
458
|
-
|
|
466
|
+
#### Utilities
|
|
459
467
|
- **[pino](https://github.com/pinojs/pino)** 10.0.0 - High-performance logger
|
|
460
468
|
- **[jsonwebtoken](https://github.com/auth0/node-jsonwebtoken)** 9.0.2 - JWT authentication
|
|
461
469
|
- **[nanoid](https://github.com/ai/nanoid)** 5.1.6 - Unique ID generator
|
|
462
470
|
- **[axios](https://github.com/axios/axios)** 1.12.2 - HTTP client
|
|
463
471
|
- **[helmet](https://github.com/helmetjs/helmet)** 8.1.0 - Security headers
|
|
464
472
|
|
|
465
|
-
|
|
473
|
+
### Documentation
|
|
466
474
|
|
|
467
475
|
- **[CLAUDE.md](CLAUDE.md)** - Comprehensive framework documentation
|
|
468
476
|
- **[docs/SECURITY.md](docs/SECURITY.md)** - Security guidelines and best practices
|
|
@@ -472,7 +480,7 @@ export class UserEventHandler {
|
|
|
472
480
|
- **[docs/BUILD_AND_USE.md](docs/BUILD_AND_USE.md)** - Building and usage instructions
|
|
473
481
|
- **[docs/DOCKER_OPTIMIZATION.md](docs/DOCKER_OPTIMIZATION.md)** - Docker optimization guide
|
|
474
482
|
|
|
475
|
-
|
|
483
|
+
#### Module Documentation
|
|
476
484
|
|
|
477
485
|
- `src/libs/deps/README.md` - Unified dependency exports
|
|
478
486
|
- `src/libs/validator/README.md` - Validation helpers
|
|
@@ -486,7 +494,7 @@ export class UserEventHandler {
|
|
|
486
494
|
- `src/libs/type/README.md` - Type utilities
|
|
487
495
|
- `src/libs/universal/README.md` - Universal CRUD patterns
|
|
488
496
|
|
|
489
|
-
|
|
497
|
+
### Security
|
|
490
498
|
|
|
491
499
|
This project takes security seriously. We use:
|
|
492
500
|
|
|
@@ -500,7 +508,7 @@ See [docs/SECURITY.md](docs/SECURITY.md) for detailed information.
|
|
|
500
508
|
|
|
501
509
|
**Important**: Always use `@IsSafeUrl()` instead of `@IsUrl()` to avoid CVE-2025-56200.
|
|
502
510
|
|
|
503
|
-
|
|
511
|
+
### Contributing
|
|
504
512
|
|
|
505
513
|
Contributions are welcome! Please follow these guidelines:
|
|
506
514
|
|
|
@@ -511,7 +519,7 @@ Contributions are welcome! Please follow these guidelines:
|
|
|
511
519
|
5. Run security check: `yarn security:check`
|
|
512
520
|
6. Create a pull request to `develope` branch
|
|
513
521
|
|
|
514
|
-
|
|
522
|
+
#### Development Guidelines
|
|
515
523
|
|
|
516
524
|
- Follow existing code conventions
|
|
517
525
|
- Use TypeScript strict mode
|
|
@@ -519,7 +527,7 @@ Contributions are welcome! Please follow these guidelines:
|
|
|
519
527
|
- Write tests for new features
|
|
520
528
|
- Update documentation as needed
|
|
521
529
|
|
|
522
|
-
|
|
530
|
+
### Publishing
|
|
523
531
|
|
|
524
532
|
This is a private npm package. To publish:
|
|
525
533
|
|
|
@@ -543,48 +551,634 @@ yarn publish:github
|
|
|
543
551
|
|
|
544
552
|
See [docs/PUBLISHING.md](docs/PUBLISHING.md) for detailed publishing instructions.
|
|
545
553
|
|
|
546
|
-
|
|
554
|
+
### Troubleshooting
|
|
547
555
|
|
|
548
|
-
|
|
556
|
+
#### Database Connection Issues
|
|
549
557
|
|
|
550
558
|
- Verify `cfg/database.yml` connection string
|
|
551
559
|
- Check MariaDB/MySQL is running
|
|
552
560
|
- Ensure database user has proper permissions
|
|
553
561
|
|
|
554
|
-
|
|
562
|
+
#### Redis Connection Issues
|
|
555
563
|
|
|
556
564
|
- Check Redis is running: `redis-cli ping`
|
|
557
565
|
- Verify `cfg/redis.yml` settings
|
|
558
566
|
- Can disable Redis by setting `disableRedis: true` in bootstrap
|
|
559
567
|
|
|
560
|
-
|
|
568
|
+
#### TypeORM Entity Not Found
|
|
561
569
|
|
|
562
570
|
- Ensure entity is registered in bootstrap `entities` array
|
|
563
571
|
- Check entity file has `@Entity()` decorator
|
|
564
572
|
- Verify import path is correct
|
|
565
573
|
|
|
566
|
-
|
|
574
|
+
### License
|
|
567
575
|
|
|
568
576
|
UNLICENSED - Private package
|
|
569
577
|
|
|
570
|
-
|
|
578
|
+
### Author
|
|
571
579
|
|
|
572
580
|
FOT Team
|
|
573
581
|
|
|
574
|
-
|
|
582
|
+
### Links
|
|
575
583
|
|
|
576
584
|
- [Repository](https://github.com/gaias/basenode)
|
|
577
585
|
- [Issue Tracker](https://github.com/gaias/basenode/issues)
|
|
578
586
|
- [npm Package](https://www.npmjs.com/package/@gaias/basenode)
|
|
579
587
|
|
|
580
|
-
|
|
588
|
+
### Version History
|
|
581
589
|
|
|
582
|
-
- **1.
|
|
590
|
+
- **1.3.6** (Current) - Latest updates and improvements
|
|
583
591
|
- **1.0.13** - Security enhancements and dependency updates
|
|
584
592
|
- **1.0.0** - Initial release
|
|
585
593
|
|
|
586
594
|
---
|
|
587
595
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
596
|
+
<a name="简体中文"></a>
|
|
597
|
+
|
|
598
|
+
## 简体中文
|
|
599
|
+
|
|
600
|
+
一个基于 Koa、TypeORM、TypeDI 和 routing-controllers 构建的全面的 Node.js API 开发框架。提供微框架架构,内置支持 RESTful API、WebSocket 控制器、数据库 ORM、分布式事件、Redis 缓存和 API 网关集成。
|
|
601
|
+
|
|
602
|
+
### 特性
|
|
603
|
+
|
|
604
|
+
- **现代框架栈**:Koa 3.x、TypeORM 0.3.x、TypeDI、routing-controllers
|
|
605
|
+
- **TypeScript 优先**:完整的 TypeScript 支持,包括装饰器和严格类型检查
|
|
606
|
+
- **RESTful 和 WebSocket**:同时支持 REST API 和 WebSocket 控制器
|
|
607
|
+
- **数据库 ORM**:TypeORM 支持 MySQL/MariaDB,自动生成实体
|
|
608
|
+
- **依赖注入**:基于 TypeDI 的 IoC 容器,实现清晰架构
|
|
609
|
+
- **验证**:class-validator 支持国际化错误消息
|
|
610
|
+
- **缓存**:双层缓存(L1 内存、L2 Redis)
|
|
611
|
+
- **分布式事件**:基于 RabbitMQ 的发布/订阅系统
|
|
612
|
+
- **API 网关**:APISIX 集成实现服务注册
|
|
613
|
+
- **领导者选举**:基于 Redis 的分布式系统领导者选举
|
|
614
|
+
- **健康检查**:内置健康检查端点和系统指标
|
|
615
|
+
- **分页**:完整的分页解决方案,支持排序
|
|
616
|
+
- **安全性**:内置安全特性、漏洞跟踪和缓解措施
|
|
617
|
+
- **OpenAPI**:自动生成 OpenAPI/Swagger 文档
|
|
618
|
+
- **开发工具**:热重载、代码检查、测试、代码生成
|
|
619
|
+
|
|
620
|
+
### 快速开始
|
|
621
|
+
|
|
622
|
+
#### 系统要求
|
|
623
|
+
|
|
624
|
+
- Node.js >= 18.0.0
|
|
625
|
+
- Yarn >= 1.22.x
|
|
626
|
+
- MariaDB/MySQL 5.7+ 或 8.0+(生产环境)
|
|
627
|
+
- Redis 6.0+(可选,用于缓存)
|
|
628
|
+
- RabbitMQ 3.8+(可选,用于分布式事件)
|
|
629
|
+
|
|
630
|
+
#### 安装
|
|
631
|
+
|
|
632
|
+
```bash
|
|
633
|
+
# 克隆仓库
|
|
634
|
+
git clone https://github.com/gaias/basenode.git
|
|
635
|
+
cd basenode
|
|
636
|
+
|
|
637
|
+
# 安装依赖
|
|
638
|
+
yarn install
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
#### 配置
|
|
642
|
+
|
|
643
|
+
1. **数据库配置**
|
|
644
|
+
|
|
645
|
+
编辑 `cfg/database.yml`:
|
|
646
|
+
```yaml
|
|
647
|
+
mariaDBUrl: mysql://用户名:密码@localhost:3306/数据库名
|
|
648
|
+
output: ./example
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
2. **应用配置**
|
|
652
|
+
|
|
653
|
+
编辑 `cfg/application.yml`:
|
|
654
|
+
```yaml
|
|
655
|
+
appName: example
|
|
656
|
+
version: 1
|
|
657
|
+
port: 3000
|
|
658
|
+
privateKeyPath: ./keys/privateKey
|
|
659
|
+
publicKeyPath: ./keys/publicKey
|
|
660
|
+
```
|
|
661
|
+
|
|
662
|
+
3. **Redis 配置**(可选)
|
|
663
|
+
|
|
664
|
+
编辑 `cfg/redis.yml`:
|
|
665
|
+
```yaml
|
|
666
|
+
host: localhost
|
|
667
|
+
port: 6379
|
|
668
|
+
password: 你的密码
|
|
669
|
+
db: 0
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
4. **RabbitMQ 配置**(可选)
|
|
673
|
+
|
|
674
|
+
编辑 `cfg/rabbitmq.yml`:
|
|
675
|
+
```yaml
|
|
676
|
+
url: amqp://localhost:5672
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
5. **环境变量**(可选)
|
|
680
|
+
|
|
681
|
+
创建 `.env` 文件或导出变量:
|
|
682
|
+
```bash
|
|
683
|
+
NODE_ENV=development # 环境:development、production、test
|
|
684
|
+
ENABLE_API_GATEWAY=true # 启用 APISIX 网关注册
|
|
685
|
+
API_GATEWAY_HOST_PORT=192.168.1.100:9180 # 网关管理 API 地址
|
|
686
|
+
DOMAINS=example.com,*.example.com # 网关允许的域名
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
#### 运行应用
|
|
690
|
+
|
|
691
|
+
```bash
|
|
692
|
+
# 开发模式(热重载)
|
|
693
|
+
yarn dev
|
|
694
|
+
|
|
695
|
+
# 开发模式(启用 API 网关)
|
|
696
|
+
yarn devPro
|
|
697
|
+
|
|
698
|
+
# 生产模式(构建后)
|
|
699
|
+
yarn ncc:run
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
应用将在 `http://localhost:3000`(或配置的端口)启动。
|
|
703
|
+
|
|
704
|
+
访问健康检查端点:`http://localhost:3000/_healthcheck`
|
|
705
|
+
|
|
706
|
+
### 项目结构
|
|
707
|
+
|
|
708
|
+
```
|
|
709
|
+
.
|
|
710
|
+
├── src/ # 框架源代码
|
|
711
|
+
│ ├── libs/ # 框架组件
|
|
712
|
+
│ │ ├── apisix/ # APISIX HTTP 客户端
|
|
713
|
+
│ │ ├── cache/ # 双层缓存系统
|
|
714
|
+
│ │ ├── configure/ # YAML 配置管理
|
|
715
|
+
│ │ ├── deps/ # 依赖库导出
|
|
716
|
+
│ │ ├── error/ # 错误处理
|
|
717
|
+
│ │ ├── gateway/ # API 网关集成
|
|
718
|
+
│ │ ├── generator/ # ID 生成(nanoid、snowflake)
|
|
719
|
+
│ │ ├── healthcheck/ # 健康检查端点
|
|
720
|
+
│ │ ├── koa/ # Koa 服务器设置
|
|
721
|
+
│ │ ├── leader/ # 基于 Redis 的领导者选举
|
|
722
|
+
│ │ ├── logger/ # Pino 日志包装器
|
|
723
|
+
│ │ ├── network/ # 网络工具
|
|
724
|
+
│ │ ├── orm/ # TypeORM 扩展
|
|
725
|
+
│ │ ├── pagination/ # 分页工具
|
|
726
|
+
│ │ ├── rabbitmq/ # RabbitMQ 分布式事件
|
|
727
|
+
│ │ ├── redis/ # Redis 客户端包装器
|
|
728
|
+
│ │ ├── register/ # API 路由注册
|
|
729
|
+
│ │ ├── type/ # 类型定义
|
|
730
|
+
│ │ ├── universal/ # 通用 CRUD 模式
|
|
731
|
+
│ │ └── validator/ # 验证辅助工具
|
|
732
|
+
│ ├── server/ # 启动逻辑
|
|
733
|
+
│ └── utils/ # 工具类(JWT、加密、YAML)
|
|
734
|
+
├── example/ # 示例应用
|
|
735
|
+
│ ├── app.ts # 入口点
|
|
736
|
+
│ ├── controllers/ # RESTful 控制器
|
|
737
|
+
│ ├── wsControllers/ # WebSocket 控制器
|
|
738
|
+
│ ├── entities/ # TypeORM 实体
|
|
739
|
+
│ ├── repositories/ # 仓储类
|
|
740
|
+
│ ├── services/ # 业务逻辑服务
|
|
741
|
+
│ ├── vo/ # 值对象(DTO)
|
|
742
|
+
│ └── events/ # 分布式事件处理器
|
|
743
|
+
├── cfg/ # YAML 配置文件
|
|
744
|
+
│ ├── application.yml # 应用设置
|
|
745
|
+
│ ├── database.yml # 数据库连接
|
|
746
|
+
│ ├── redis.yml # Redis 连接
|
|
747
|
+
│ ├── rabbitmq.yml # RabbitMQ 连接
|
|
748
|
+
│ ├── logger.yml # 日志设置
|
|
749
|
+
│ ├── apisix.apikey.yml # API 网关设置
|
|
750
|
+
│ └── openapi.yml # OpenAPI/Swagger 配置
|
|
751
|
+
├── tools/ # 开发工具
|
|
752
|
+
│ ├── DBSchemaGenerator.ts # 从数据库生成实体
|
|
753
|
+
│ ├── RepositoryGenerator.ts # 生成仓储类
|
|
754
|
+
│ └── repository.mst # Mustache 模板
|
|
755
|
+
├── docs/ # 文档
|
|
756
|
+
├── k8s/ # Kubernetes 清单
|
|
757
|
+
└── keys/ # JWT 密钥(生成的)
|
|
758
|
+
```
|
|
759
|
+
|
|
760
|
+
### 开发命令
|
|
761
|
+
|
|
762
|
+
#### 运行
|
|
763
|
+
|
|
764
|
+
```bash
|
|
765
|
+
# 开发模式(热重载)
|
|
766
|
+
yarn dev
|
|
767
|
+
|
|
768
|
+
# 开发模式(带 API 网关)
|
|
769
|
+
yarn devPro
|
|
770
|
+
|
|
771
|
+
# 运行编译后的应用
|
|
772
|
+
yarn ncc:run
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
#### 构建
|
|
776
|
+
|
|
777
|
+
```bash
|
|
778
|
+
# 构建用于发布
|
|
779
|
+
yarn build:publish
|
|
780
|
+
|
|
781
|
+
# 构建单文件可执行文件
|
|
782
|
+
yarn ncc:build
|
|
783
|
+
```
|
|
784
|
+
|
|
785
|
+
#### 数据库代码生成
|
|
786
|
+
|
|
787
|
+
```bash
|
|
788
|
+
# 从数据库架构生成实体
|
|
789
|
+
yarn gen:db-schema
|
|
790
|
+
|
|
791
|
+
# 生成仓储类
|
|
792
|
+
yarn gen:db-repo
|
|
793
|
+
|
|
794
|
+
# 生成实体和仓储
|
|
795
|
+
yarn gen:db
|
|
796
|
+
|
|
797
|
+
# 生成索引文件
|
|
798
|
+
yarn gen:idx
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
**注意**:运行前在 `gen_db.json` 中定义要生成的表。
|
|
802
|
+
|
|
803
|
+
#### 测试与质量
|
|
804
|
+
|
|
805
|
+
```bash
|
|
806
|
+
# 运行测试
|
|
807
|
+
yarn test
|
|
808
|
+
|
|
809
|
+
# 监视模式运行测试
|
|
810
|
+
yarn test:watch
|
|
811
|
+
|
|
812
|
+
# 带覆盖率运行测试
|
|
813
|
+
yarn test:coverage
|
|
814
|
+
|
|
815
|
+
# 类型检查和代码检查
|
|
816
|
+
yarn lint
|
|
817
|
+
|
|
818
|
+
# 自动修复代码检查问题
|
|
819
|
+
yarn lint:fix
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
#### 安全
|
|
823
|
+
|
|
824
|
+
```bash
|
|
825
|
+
# 运行安全审计
|
|
826
|
+
yarn security
|
|
827
|
+
|
|
828
|
+
# 显示审计摘要
|
|
829
|
+
yarn security:summary
|
|
830
|
+
|
|
831
|
+
# 增强安全检查(推荐)
|
|
832
|
+
yarn security:check
|
|
833
|
+
|
|
834
|
+
# 生成安全报告
|
|
835
|
+
yarn security:json
|
|
836
|
+
```
|
|
837
|
+
|
|
838
|
+
查看 [docs/SECURITY.md](docs/SECURITY.md) 了解全面的安全指南。
|
|
839
|
+
|
|
840
|
+
#### 依赖管理
|
|
841
|
+
|
|
842
|
+
```bash
|
|
843
|
+
# 检查过时的依赖
|
|
844
|
+
yarn deps:check
|
|
845
|
+
|
|
846
|
+
# 更新依赖
|
|
847
|
+
yarn deps:update
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
#### 其他工具
|
|
851
|
+
|
|
852
|
+
```bash
|
|
853
|
+
# 为 JWT 生成 RSA 密钥
|
|
854
|
+
yarn gen:keys
|
|
855
|
+
|
|
856
|
+
# 更新构建编号
|
|
857
|
+
yarn buildNum
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
### 使用示例
|
|
861
|
+
|
|
862
|
+
#### 创建 RESTful 控制器
|
|
863
|
+
|
|
864
|
+
```typescript
|
|
865
|
+
import { rest, di } from '@/libs/deps';
|
|
866
|
+
import { UniversalController } from '@/libs/universal';
|
|
867
|
+
import { UserService } from './services/UserService';
|
|
868
|
+
import { UserVo } from './vo/UserVo';
|
|
869
|
+
|
|
870
|
+
@rest.JsonController('/api/users')
|
|
871
|
+
@di.Service()
|
|
872
|
+
export class UserController extends UniversalController {
|
|
873
|
+
@di.Inject()
|
|
874
|
+
private userService: UserService;
|
|
875
|
+
|
|
876
|
+
@rest.Get('/')
|
|
877
|
+
async getAll() {
|
|
878
|
+
return this.userService.getAll(UserVo);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
@rest.Post('/')
|
|
882
|
+
async create(@rest.Body() data: UserVo) {
|
|
883
|
+
// rest.Body 自动启用 excludeExtraneousValues 以提高安全性
|
|
884
|
+
return this.userService.create(data);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
@rest.Get('/:id')
|
|
888
|
+
async getById(@rest.Param('id') id: number) {
|
|
889
|
+
return this.userService.readById(id, UserVo);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
#### 创建带仓储的服务
|
|
895
|
+
|
|
896
|
+
```typescript
|
|
897
|
+
import { di } from '@/libs/deps';
|
|
898
|
+
import { UniversalService } from '@/libs/universal';
|
|
899
|
+
import { User } from './entities/User';
|
|
900
|
+
import { UserRepo } from './repositories/UserRepo';
|
|
901
|
+
|
|
902
|
+
@di.Service()
|
|
903
|
+
export class UserService extends UniversalService<User> {
|
|
904
|
+
constructor(@di.Inject(() => UserRepo) private userRepo: UserRepo) {
|
|
905
|
+
super(userRepo);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
async findByEmail(email: string): Promise<User | null> {
|
|
909
|
+
return this.userRepo.findOne({ where: { email } });
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
#### 使用 VO 进行验证
|
|
915
|
+
|
|
916
|
+
```typescript
|
|
917
|
+
import { cv } from '@/libs/deps';
|
|
918
|
+
import { i18n } from '@/libs/validator';
|
|
919
|
+
import { IsSafeUrl } from '@/libs/validator';
|
|
920
|
+
|
|
921
|
+
export class UserVo {
|
|
922
|
+
@i18n(cv.IsString)
|
|
923
|
+
@i18n(cv.MaxLength, 50)
|
|
924
|
+
userName: string;
|
|
925
|
+
|
|
926
|
+
@i18n(cv.IsEmail)
|
|
927
|
+
email: string;
|
|
928
|
+
|
|
929
|
+
@IsSafeUrl()
|
|
930
|
+
website?: string;
|
|
931
|
+
|
|
932
|
+
@i18n(cv.IsOptional)
|
|
933
|
+
@i18n(cv.MinLength, 6)
|
|
934
|
+
password?: string;
|
|
935
|
+
}
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
#### 分页
|
|
939
|
+
|
|
940
|
+
```typescript
|
|
941
|
+
import { rest, di } from '@/libs/deps';
|
|
942
|
+
import { PaginationIn, PaginationOut } from '@/libs/pagination';
|
|
943
|
+
import { UserService } from './services/UserService';
|
|
944
|
+
import { UserVo } from './vo/UserVo';
|
|
945
|
+
|
|
946
|
+
@rest.JsonController('/api/users')
|
|
947
|
+
@di.Service()
|
|
948
|
+
export class UserController {
|
|
949
|
+
@di.Inject()
|
|
950
|
+
private userService: UserService;
|
|
951
|
+
|
|
952
|
+
@rest.Post('/search')
|
|
953
|
+
async search(@rest.Body() pagination: PaginationIn): Promise<PaginationOut<UserVo, User>> {
|
|
954
|
+
return this.userService.search(pagination);
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
```
|
|
958
|
+
|
|
959
|
+
#### 缓存
|
|
960
|
+
|
|
961
|
+
```typescript
|
|
962
|
+
import { rest, di } from '@/libs/deps';
|
|
963
|
+
import { L1Cache } from '@/libs/cache';
|
|
964
|
+
import { CacheService } from '@/libs/cache';
|
|
965
|
+
|
|
966
|
+
@rest.JsonController('/api/data')
|
|
967
|
+
@di.Service()
|
|
968
|
+
export class DataController {
|
|
969
|
+
@di.Inject()
|
|
970
|
+
private cacheService: CacheService;
|
|
971
|
+
|
|
972
|
+
@rest.Get('/cached')
|
|
973
|
+
@L1Cache({ ttlSeconds: 60 })
|
|
974
|
+
async getCachedData() {
|
|
975
|
+
// L1 缓存 - 内存
|
|
976
|
+
return { data: '这将被缓存 60 秒' };
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
@rest.Get('/redis')
|
|
980
|
+
async getRedisData() {
|
|
981
|
+
// L2 缓存 - Redis
|
|
982
|
+
const cached = await this.cacheService.get('key');
|
|
983
|
+
if (cached) return cached;
|
|
984
|
+
|
|
985
|
+
const data = { data: '新数据' };
|
|
986
|
+
await this.cacheService.set('key', data, 300);
|
|
987
|
+
return data;
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
```
|
|
991
|
+
|
|
992
|
+
#### 分布式事件
|
|
993
|
+
|
|
994
|
+
```typescript
|
|
995
|
+
import { di } from '@/libs/deps';
|
|
996
|
+
import { DistributedEvents } from '@/libs/rabbitmq';
|
|
997
|
+
|
|
998
|
+
@di.Service()
|
|
999
|
+
export class UserService {
|
|
1000
|
+
@di.Inject()
|
|
1001
|
+
private events: DistributedEvents;
|
|
1002
|
+
|
|
1003
|
+
async createUser(data: UserVo) {
|
|
1004
|
+
const user = await this.userRepo.save(data);
|
|
1005
|
+
|
|
1006
|
+
// 发布事件到 RabbitMQ
|
|
1007
|
+
await this.events.pub('user.created', { userId: user.id });
|
|
1008
|
+
|
|
1009
|
+
return user;
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
// 事件处理器
|
|
1014
|
+
@di.Service()
|
|
1015
|
+
export class UserEventHandler {
|
|
1016
|
+
@di.Inject()
|
|
1017
|
+
private events: DistributedEvents;
|
|
1018
|
+
|
|
1019
|
+
async init() {
|
|
1020
|
+
// 订阅事件
|
|
1021
|
+
await this.events.sub(['user.created']);
|
|
1022
|
+
|
|
1023
|
+
this.events.on('RemoteEvent', (eventName, data) => {
|
|
1024
|
+
if (eventName === 'user.created') {
|
|
1025
|
+
console.log('用户已创建:', data);
|
|
1026
|
+
}
|
|
1027
|
+
});
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
### 核心技术
|
|
1033
|
+
|
|
1034
|
+
#### 核心框架
|
|
1035
|
+
- **[Koa](https://koajs.com/)** 3.0.3 - 轻量级 Web 框架
|
|
1036
|
+
- **[routing-controllers](https://github.com/typestack/routing-controllers)** 0.11.3 - 基于装饰器的路由
|
|
1037
|
+
- **[socket-controllers](https://github.com/typestack/socket-controllers)** 0.3.1 - WebSocket 控制器
|
|
1038
|
+
- **[TypeDI](https://github.com/typestack/typedi)** 0.10.0 - 依赖注入
|
|
1039
|
+
- **[microframework](https://github.com/typestack/microframework)** 0.6.4 - 加载器模式
|
|
1040
|
+
|
|
1041
|
+
#### 数据层
|
|
1042
|
+
- **[TypeORM](https://typeorm.io/)** 0.3.27 - SQL ORM
|
|
1043
|
+
- **[typeorm-transactional](https://github.com/Aliheym/typeorm-transactional)** 0.5.0 - 事务管理
|
|
1044
|
+
- **[mysql2](https://github.com/sidorares/node-mysql2)** 3.15.2 - MySQL/MariaDB 驱动
|
|
1045
|
+
- **[class-validator](https://github.com/typestack/class-validator)** 0.14.2 - 验证
|
|
1046
|
+
- **[class-transformer](https://github.com/typestack/class-transformer)** 0.5.1 - 转换
|
|
1047
|
+
|
|
1048
|
+
#### 缓存与消息
|
|
1049
|
+
- **[ioredis](https://github.com/luin/ioredis)** 5.8.1 - Redis 客户端
|
|
1050
|
+
- **[amqplib](https://github.com/amqp-node/amqplib)** 0.10.9 - RabbitMQ 客户端
|
|
1051
|
+
|
|
1052
|
+
#### 工具
|
|
1053
|
+
- **[pino](https://github.com/pinojs/pino)** 10.0.0 - 高性能日志
|
|
1054
|
+
- **[jsonwebtoken](https://github.com/auth0/node-jsonwebtoken)** 9.0.2 - JWT 认证
|
|
1055
|
+
- **[nanoid](https://github.com/ai/nanoid)** 5.1.6 - 唯一 ID 生成器
|
|
1056
|
+
- **[axios](https://github.com/axios/axios)** 1.12.2 - HTTP 客户端
|
|
1057
|
+
- **[helmet](https://github.com/helmetjs/helmet)** 8.1.0 - 安全头
|
|
1058
|
+
|
|
1059
|
+
### 文档
|
|
1060
|
+
|
|
1061
|
+
- **[CLAUDE.md](CLAUDE.md)** - 全面的框架文档
|
|
1062
|
+
- **[docs/SECURITY.md](docs/SECURITY.md)** - 安全指南和最佳实践
|
|
1063
|
+
- **[docs/VULNERABILITY_MITIGATION.md](docs/VULNERABILITY_MITIGATION.md)** - 漏洞跟踪
|
|
1064
|
+
- **[docs/QUICKSTART.md](docs/QUICKSTART.md)** - 快速开始指南
|
|
1065
|
+
- **[docs/PUBLISHING.md](docs/PUBLISHING.md)** - 发布指南
|
|
1066
|
+
- **[docs/BUILD_AND_USE.md](docs/BUILD_AND_USE.md)** - 构建和使用说明
|
|
1067
|
+
- **[docs/DOCKER_OPTIMIZATION.md](docs/DOCKER_OPTIMIZATION.md)** - Docker 优化指南
|
|
1068
|
+
|
|
1069
|
+
#### 模块文档
|
|
1070
|
+
|
|
1071
|
+
- `src/libs/deps/README.md` - 统一依赖导出
|
|
1072
|
+
- `src/libs/validator/README.md` - 验证辅助工具
|
|
1073
|
+
- `src/libs/apisix/README.md` - API 网关集成
|
|
1074
|
+
- `src/libs/gateway/README.md` - 网关加载器
|
|
1075
|
+
- `src/libs/generator/README.md` - ID 生成
|
|
1076
|
+
- `src/libs/koa/README.md` - Koa 服务器设置
|
|
1077
|
+
- `src/libs/network/README.md` - 网络工具
|
|
1078
|
+
- `src/libs/rabbitmq/README.md` - 分布式事件
|
|
1079
|
+
- `src/libs/register/README.md` - API 路由注册
|
|
1080
|
+
- `src/libs/type/README.md` - 类型工具
|
|
1081
|
+
- `src/libs/universal/README.md` - 通用 CRUD 模式
|
|
1082
|
+
|
|
1083
|
+
### 安全性
|
|
1084
|
+
|
|
1085
|
+
本项目高度重视安全性。我们使用:
|
|
1086
|
+
|
|
1087
|
+
- 使用 `yarn security:check` 定期进行安全审计
|
|
1088
|
+
- 依赖漏洞跟踪和缓解
|
|
1089
|
+
- 自定义验证器避免已知 CVE(例如,使用 `@IsSafeUrl()` 而非 `@IsUrl()`)
|
|
1090
|
+
- 传递依赖的安全解析
|
|
1091
|
+
- 安全文档和最佳实践
|
|
1092
|
+
|
|
1093
|
+
详细信息请查看 [docs/SECURITY.md](docs/SECURITY.md)。
|
|
1094
|
+
|
|
1095
|
+
**重要**:始终使用 `@IsSafeUrl()` 而非 `@IsUrl()` 以避免 CVE-2025-56200。
|
|
1096
|
+
|
|
1097
|
+
### 贡献
|
|
1098
|
+
|
|
1099
|
+
欢迎贡献!请遵循以下指南:
|
|
1100
|
+
|
|
1101
|
+
1. Fork 仓库
|
|
1102
|
+
2. 从 `develope` 创建功能分支
|
|
1103
|
+
3. 使用描述性提交进行更改
|
|
1104
|
+
4. 运行测试和代码检查:`yarn test && yarn lint`
|
|
1105
|
+
5. 运行安全检查:`yarn security:check`
|
|
1106
|
+
6. 创建到 `develope` 分支的拉取请求
|
|
1107
|
+
|
|
1108
|
+
#### 开发指南
|
|
1109
|
+
|
|
1110
|
+
- 遵循现有代码约定
|
|
1111
|
+
- 使用 TypeScript 严格模式
|
|
1112
|
+
- 为公共 API 添加 JSDoc 注释
|
|
1113
|
+
- 为新功能编写测试
|
|
1114
|
+
- 根据需要更新文档
|
|
1115
|
+
|
|
1116
|
+
### 发布
|
|
1117
|
+
|
|
1118
|
+
这是一个私有 npm 包。要发布:
|
|
1119
|
+
|
|
1120
|
+
```bash
|
|
1121
|
+
# 更新 package.json 中的版本
|
|
1122
|
+
# 更新构建编号
|
|
1123
|
+
yarn buildNum
|
|
1124
|
+
|
|
1125
|
+
# 运行发布前检查
|
|
1126
|
+
yarn publish:check
|
|
1127
|
+
|
|
1128
|
+
# 构建用于发布
|
|
1129
|
+
yarn build:publish
|
|
1130
|
+
|
|
1131
|
+
# 发布到 npm
|
|
1132
|
+
yarn publish:npmjs
|
|
1133
|
+
|
|
1134
|
+
# 或发布到 GitHub packages
|
|
1135
|
+
yarn publish:github
|
|
1136
|
+
```
|
|
1137
|
+
|
|
1138
|
+
详细发布说明请查看 [docs/PUBLISHING.md](docs/PUBLISHING.md)。
|
|
1139
|
+
|
|
1140
|
+
### 故障排除
|
|
1141
|
+
|
|
1142
|
+
#### 数据库连接问题
|
|
1143
|
+
|
|
1144
|
+
- 验证 `cfg/database.yml` 连接字符串
|
|
1145
|
+
- 检查 MariaDB/MySQL 是否正在运行
|
|
1146
|
+
- 确保数据库用户具有适当的权限
|
|
1147
|
+
|
|
1148
|
+
#### Redis 连接问题
|
|
1149
|
+
|
|
1150
|
+
- 检查 Redis 是否正在运行:`redis-cli ping`
|
|
1151
|
+
- 验证 `cfg/redis.yml` 设置
|
|
1152
|
+
- 可以通过在启动时设置 `disableRedis: true` 来禁用 Redis
|
|
1153
|
+
|
|
1154
|
+
#### TypeORM 实体未找到
|
|
1155
|
+
|
|
1156
|
+
- 确保实体在启动时注册到 `entities` 数组中
|
|
1157
|
+
- 检查实体文件是否有 `@Entity()` 装饰器
|
|
1158
|
+
- 验证导入路径是否正确
|
|
1159
|
+
|
|
1160
|
+
### 许可证
|
|
1161
|
+
|
|
1162
|
+
UNLICENSED - 私有包
|
|
1163
|
+
|
|
1164
|
+
### 作者
|
|
1165
|
+
|
|
1166
|
+
FOT 团队
|
|
1167
|
+
|
|
1168
|
+
### 链接
|
|
1169
|
+
|
|
1170
|
+
- [仓库](https://github.com/gaias/basenode)
|
|
1171
|
+
- [问题跟踪](https://github.com/gaias/basenode/issues)
|
|
1172
|
+
- [npm 包](https://www.npmjs.com/package/@gaias/basenode)
|
|
1173
|
+
|
|
1174
|
+
### 版本历史
|
|
1175
|
+
|
|
1176
|
+
- **1.3.6**(当前)- 最新更新和改进
|
|
1177
|
+
- **1.0.13** - 安全增强和依赖更新
|
|
1178
|
+
- **1.0.0** - 初始版本
|
|
1179
|
+
|
|
1180
|
+
---
|
|
1181
|
+
|
|
1182
|
+
**Last Updated | 最后更新**: 2025-12-31
|
|
1183
|
+
**Framework Version | 框架版本**: 1.3.6
|
|
1184
|
+
**Build Number | 构建编号**: 251025471
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistributedEvents.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEvents.ts"],"names":[],"mappings":"AAuHA,OAAO,YAAY,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"DistributedEvents.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEvents.ts"],"names":[],"mappings":"AAuHA,OAAO,YAAY,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAoKlD,qBACa,iBAAkB,SAAQ,YAAY;IAOjD,OAAO,CAAC,MAAM,CAAuC;IAqBrD,OAAO,CAAC,OAAO,CAAe;IAe9B,OAAO,CAAC,SAAS,CAAS;WA6Eb,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM;IAkJrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;IA4JpB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IA4FvC,KAAK;CAGZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistributedEvents.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEvents.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAsHA,sDAA2B;AAC3B,kEAAyC;AACzC,mCAAiC;AACjC,sCAAmC;
|
|
1
|
+
{"version":3,"file":"DistributedEvents.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { MicroframeworkSettings } from 'microframework';
|
|
|
2
2
|
import { ClassType } from '../type';
|
|
3
3
|
export type DistributedEventsLoaderOption = {
|
|
4
4
|
eventsHandlers?: ClassType[];
|
|
5
|
+
useReliable?: boolean;
|
|
5
6
|
};
|
|
6
7
|
export declare const rabbitmqLoader: (option: DistributedEventsLoaderOption) => (settings?: MicroframeworkSettings) => Promise<void>;
|
|
7
8
|
//# sourceMappingURL=DistributedEventsLoader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistributedEventsLoader.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEventsLoader.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"DistributedEventsLoader.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEventsLoader.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAepC,MAAM,MAAM,6BAA6B,GAAG;IA2B1C,cAAc,CAAC,EAAE,SAAS,EAAE,CAAC;IAoD7B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAsFF,eAAO,MAAM,cAAc,GAAI,QAAQ,6BAA6B,MAAM,WAAW,sBAAsB,kBAgD1G,CAAC"}
|
|
@@ -6,6 +6,7 @@ const logger_1 = require("../logger");
|
|
|
6
6
|
const configure_1 = require("../configure");
|
|
7
7
|
const EventsManager_1 = require("./EventsManager");
|
|
8
8
|
const DistributedEvents_1 = require("./DistributedEvents");
|
|
9
|
+
const ReliableDistributedEvents_1 = require("./ReliableDistributedEvents");
|
|
9
10
|
const rabbitmqLoader = (option) => (settings) => {
|
|
10
11
|
const appCfg = configure_1.ConfigManager.getConfig('application');
|
|
11
12
|
const rabbitmqCfg = configure_1.ConfigManager.getConfig('rabbitmq');
|
|
@@ -14,11 +15,20 @@ const rabbitmqLoader = (option) => (settings) => {
|
|
|
14
15
|
logger.warn('⚠️ RabbitMQ configuration not found, skipping RabbitMQ initialization');
|
|
15
16
|
return Promise.resolve();
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
const EventsClass = option.useReliable ? ReliableDistributedEvents_1.ReliableDistributedEvents : DistributedEvents_1.DistributedEvents;
|
|
19
|
+
const versionName = option.useReliable ? 'Reliable' : 'Standard';
|
|
20
|
+
logger.info(`📦 Using ${versionName} version of DistributedEvents`);
|
|
21
|
+
return EventsClass.open(rabbitmqCfg, appCfg.appName).then((events) => {
|
|
22
|
+
if (option.useReliable) {
|
|
23
|
+
typedi_1.Container.set(ReliableDistributedEvents_1.ReliableDistributedEvents, events);
|
|
24
|
+
typedi_1.Container.set(DistributedEvents_1.DistributedEvents, events);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
typedi_1.Container.set(DistributedEvents_1.DistributedEvents, events);
|
|
28
|
+
}
|
|
19
29
|
settings?.onShutdown(async () => events.close());
|
|
20
30
|
return EventsManager_1.EventsManager.start(events, option.eventsHandlers).then(() => {
|
|
21
|
-
|
|
31
|
+
logger.info(`✅ RabbitMQ (${versionName}) - Connected to ${rabbitmqCfg.connection}`);
|
|
22
32
|
});
|
|
23
33
|
});
|
|
24
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistributedEventsLoader.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEventsLoader.ts"],"names":[],"mappings":";;;AAyCA,mCAAmC;AACnC,sCAAmC;AAEnC,4CAAgE;AAChE,mDAAgD;AAChD,
|
|
1
|
+
{"version":3,"file":"DistributedEventsLoader.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/DistributedEventsLoader.ts"],"names":[],"mappings":";;;AAyCA,mCAAmC;AACnC,sCAAmC;AAEnC,4CAAgE;AAChE,mDAAgD;AAChD,2DAAwD;AACxD,2EAAwE;AAiLjE,MAAM,cAAc,GAAG,CAAC,MAAqC,EAAE,EAAE,CAAC,CAAC,QAAiC,EAAE,EAAE;IAG7G,MAAM,MAAM,GAAG,yBAAa,CAAC,SAAS,CAAoB,aAAa,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,yBAAa,CAAC,SAAS,CAAiB,UAAU,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,eAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAGlD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACtF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAID,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,qDAAyB,CAAC,CAAC,CAAC,qCAAiB,CAAC;IACvF,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;IAEjE,MAAM,CAAC,IAAI,CAAC,YAAY,WAAW,+BAA+B,CAAC,CAAC;IAIpE,OAAO,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAGnE,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAEvB,kBAAS,CAAC,GAAG,CAAC,qDAAyB,EAAE,MAAmC,CAAC,CAAC;YAG9E,kBAAS,CAAC,GAAG,CAAC,qCAAiB,EAAE,MAAa,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YAEN,kBAAS,CAAC,GAAG,CAAC,qCAAiB,EAAE,MAA2B,CAAC,CAAC;QAChE,CAAC;QAID,QAAQ,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAIjD,OAAO,6BAAa,CAAC,KAAK,CAAC,MAAa,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;YAGzE,MAAM,CAAC,IAAI,CAAC,gBAAgB,WAAW,oBAAoB,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAhDW,QAAA,cAAc,kBAgDzB"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { DistributedEvents } from './DistributedEvents';
|
|
2
|
+
import { ReliableDistributedEvents } from './ReliableDistributedEvents';
|
|
2
3
|
import { ClassType } from '../type';
|
|
4
|
+
type AnyDistributedEvents = DistributedEvents | ReliableDistributedEvents;
|
|
3
5
|
export type DistributedEventListener = {
|
|
4
6
|
clazz: ClassType;
|
|
5
7
|
method: string;
|
|
@@ -12,6 +14,7 @@ export declare class EventsManager {
|
|
|
12
14
|
static readonly registry: Registry;
|
|
13
15
|
private logger;
|
|
14
16
|
static addDistributedEventListener(event: string, listener: DistributedEventListener): void;
|
|
15
|
-
static start(de:
|
|
17
|
+
static start(de: AnyDistributedEvents, listeners?: ClassType[]): Promise<void>;
|
|
16
18
|
}
|
|
19
|
+
export {};
|
|
17
20
|
//# sourceMappingURL=EventsManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsManager.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/EventsManager.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"EventsManager.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/EventsManager.ts"],"names":[],"mappings":"AA+CA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAapC,KAAK,oBAAoB,GAAG,iBAAiB,GAAG,yBAAyB,CAAC;AAU1E,MAAM,MAAM,wBAAwB,GAAG;IASrC,KAAK,EAAE,SAAS,CAAC;IAUjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AA0BF,MAAM,WAAW,QAAQ;IACvB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;CAClD;AAuDD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,IAC3B,QAAQ,GAAG,EAAE,aAAa,MAAM,UAMzC;AAaD,qBAAa,aAAa;IAYxB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAM;IAMxC,OAAO,CAAC,MAAM,CAAmC;IA0BjD,MAAM,CAAC,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,wBAAwB,GAAG,IAAI;WA6E9E,KAAK,CAAC,EAAE,EAAE,oBAAoB,EAAE,SAAS,GAAE,SAAS,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CA2CzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventsManager.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/EventsManager.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"EventsManager.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/EventsManager.ts"],"names":[],"mappings":";;;AAgLA,0BAOC;AAzID,mCAAmC;AAGnC,sCAAmC;AA+HnC,SAAgB,OAAO,CAAC,KAAa;IACnC,OAAO,CAAC,MAAW,EAAE,WAAmB,EAAE,EAAE;QAC1C,aAAa,CAAC,2BAA2B,CAAC,KAAK,EAAE;YAC/C,KAAK,EAAE,MAAM,CAAC,WAAW;YACzB,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAaD,MAAa,aAAa;IAA1B;QAkBU,WAAM,GAAG,eAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAkJnD,CAAC;IAxHC,MAAM,CAAC,2BAA2B,CAAC,KAAa,EAAE,QAAkC;QAGlF,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE,CAAC;YAChD,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACrC,CAAC;QAID,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAmED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAwB,EAAE,YAAyB,EAAE;QAGtE,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAGnC,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAE3C,IAAI,IAAI,EAAE,CAAC;gBAGT,KAAK,OAAO,CAAC,GAAG,CACd,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBAGf,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;oBAExD,IAAI,IAAI,EAAE,CAAC;wBAGT,MAAM,QAAQ,GAAG,kBAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBAIrC,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;oBACpC,CAAC;oBAED,OAAO,SAAS,CAAC;gBACnB,CAAC,CAAC,CACH,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBAGZ,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QAIH,MAAM,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;;AAnKH,sCAoKC;AAxJiB,sBAAQ,GAAa,EAAE,AAAf,CAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RabbitMQConfig.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/RabbitMQConfig.ts"],"names":[],"mappings":"AAoCA,MAAM,MAAM,cAAc,GAAG;IAc3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RabbitMQConfig.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/RabbitMQConfig.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import amqp from 'amqplib';
|
|
2
|
+
import EventEmitter from 'eventemitter3';
|
|
3
|
+
import { RabbitMQConfig } from './RabbitMQConfig';
|
|
4
|
+
export declare class ReliableDistributedEvents extends EventEmitter {
|
|
5
|
+
private logger;
|
|
6
|
+
private channel;
|
|
7
|
+
private queueName;
|
|
8
|
+
static open(config: RabbitMQConfig, queueName: string): Promise<ReliableDistributedEvents>;
|
|
9
|
+
sub(events: string[]): Promise<void>;
|
|
10
|
+
pub<T = unknown>(event: string, data: T, options?: {
|
|
11
|
+
retries?: number;
|
|
12
|
+
retryDelay?: number;
|
|
13
|
+
}): Promise<boolean>;
|
|
14
|
+
pubBatch<T = unknown>(events: Array<{
|
|
15
|
+
event: string;
|
|
16
|
+
data: T;
|
|
17
|
+
}>): Promise<boolean[]>;
|
|
18
|
+
setupReturnHandler(handler: (msg: amqp.Message) => void): void;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ReliableDistributedEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReliableDistributedEvents.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/ReliableDistributedEvents.ts"],"names":[],"mappings":"AAmIA,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,YAAY,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA2KlD,qBACa,yBAA0B,SAAQ,YAAY;IAOzD,OAAO,CAAC,MAAM,CAA+C;IAqB7D,OAAO,CAAC,OAAO,CAAsB;IAerC,OAAO,CAAC,SAAS,CAAS;WA6Eb,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM;IAkJrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE;IA6KpB,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GACA,OAAO,CAAC,OAAO,CAAC;IAgHb,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAyG1F,kBAAkB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,GAAG,IAAI;IAoFxD,KAAK;CAmBZ"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
var ReliableDistributedEvents_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ReliableDistributedEvents = void 0;
|
|
14
|
+
const amqplib_1 = __importDefault(require("amqplib"));
|
|
15
|
+
const eventemitter3_1 = __importDefault(require("eventemitter3"));
|
|
16
|
+
const typedi_1 = require("typedi");
|
|
17
|
+
const logger_1 = require("../logger");
|
|
18
|
+
const EVENTS_EXCHANGE = 'BizEvents';
|
|
19
|
+
const DEAD_LETTER_EXCHANGE = 'BizEventDeadLetter';
|
|
20
|
+
const DEAD_LETTER_QUEUE = 'DeadLetters';
|
|
21
|
+
const DEAD_LETTER_ROUTING_KEY = 'DeadLetter';
|
|
22
|
+
let ReliableDistributedEvents = ReliableDistributedEvents_1 = class ReliableDistributedEvents extends eventemitter3_1.default {
|
|
23
|
+
constructor() {
|
|
24
|
+
super(...arguments);
|
|
25
|
+
this.logger = logger_1.Logger.getLogger(ReliableDistributedEvents_1);
|
|
26
|
+
}
|
|
27
|
+
static async open(config, queueName) {
|
|
28
|
+
const conn = await amqplib_1.default.connect(config.connection);
|
|
29
|
+
const channel = await conn.createConfirmChannel();
|
|
30
|
+
const events = new ReliableDistributedEvents_1();
|
|
31
|
+
events.channel = channel;
|
|
32
|
+
events.queueName = queueName;
|
|
33
|
+
await channel.assertExchange(DEAD_LETTER_EXCHANGE, 'direct', {
|
|
34
|
+
durable: true,
|
|
35
|
+
});
|
|
36
|
+
await channel.assertQueue(queueName, {
|
|
37
|
+
durable: true,
|
|
38
|
+
arguments: {
|
|
39
|
+
'x-dead-letter-exchange': DEAD_LETTER_EXCHANGE,
|
|
40
|
+
'x-dead-letter-routing-key': DEAD_LETTER_ROUTING_KEY,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
await channel.assertQueue(DEAD_LETTER_QUEUE, {
|
|
44
|
+
durable: true,
|
|
45
|
+
});
|
|
46
|
+
await channel.assertExchange(EVENTS_EXCHANGE, 'topic', {
|
|
47
|
+
durable: true,
|
|
48
|
+
});
|
|
49
|
+
await channel.bindQueue(DEAD_LETTER_QUEUE, DEAD_LETTER_EXCHANGE, DEAD_LETTER_ROUTING_KEY);
|
|
50
|
+
return events;
|
|
51
|
+
}
|
|
52
|
+
async sub(events) {
|
|
53
|
+
await Promise.all(events.map((event) => this.channel.bindQueue(this.queueName, EVENTS_EXCHANGE, event)));
|
|
54
|
+
void this.channel.consume(this.queueName, (msg) => {
|
|
55
|
+
if (msg) {
|
|
56
|
+
const eventName = msg?.properties?.headers['x-eventName'];
|
|
57
|
+
const content = msg.content.toString();
|
|
58
|
+
const data = JSON.parse(content);
|
|
59
|
+
try {
|
|
60
|
+
this.logger.debug(`Received event: ${eventName}, Content: ${content}`);
|
|
61
|
+
this.emit('RemoteEvent', eventName, data);
|
|
62
|
+
this.channel.ack(msg);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
66
|
+
this.logger.debug(`Message rejected: ${eventName} with error: ${errorMessage}`);
|
|
67
|
+
this.channel.reject(msg, !msg.fields.redelivered);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async pub(event, data, options) {
|
|
73
|
+
const maxRetries = options?.retries ?? 3;
|
|
74
|
+
const retryDelay = options?.retryDelay ?? 1000;
|
|
75
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
76
|
+
try {
|
|
77
|
+
this.channel.publish(EVENTS_EXCHANGE, event, Buffer.from(JSON.stringify(data)), {
|
|
78
|
+
contentEncoding: 'UTF-8',
|
|
79
|
+
contentType: 'text/json',
|
|
80
|
+
deliveryMode: 2,
|
|
81
|
+
headers: {
|
|
82
|
+
'x-eventName': event,
|
|
83
|
+
},
|
|
84
|
+
mandatory: true,
|
|
85
|
+
});
|
|
86
|
+
await this.channel.waitForConfirms();
|
|
87
|
+
this.logger.debug(`✅ Event published successfully: ${event}`);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
92
|
+
this.logger.error(`❌ Failed to publish event (attempt ${attempt}/${maxRetries}): ${event} - ${errorMessage}`);
|
|
93
|
+
if (attempt < maxRetries) {
|
|
94
|
+
this.logger.debug(`⏳ Retrying in ${retryDelay}ms...`);
|
|
95
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new Error(`Failed to publish event '${event}' after ${maxRetries} attempts: ${errorMessage}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
async pubBatch(events) {
|
|
105
|
+
try {
|
|
106
|
+
for (const item of events) {
|
|
107
|
+
this.channel.publish(EVENTS_EXCHANGE, item.event, Buffer.from(JSON.stringify(item.data)), {
|
|
108
|
+
contentEncoding: 'UTF-8',
|
|
109
|
+
contentType: 'text/json',
|
|
110
|
+
deliveryMode: 2,
|
|
111
|
+
headers: {
|
|
112
|
+
'x-eventName': item.event,
|
|
113
|
+
},
|
|
114
|
+
mandatory: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
await this.channel.waitForConfirms();
|
|
118
|
+
this.logger.debug(`✅ Batch published ${events.length} events successfully`);
|
|
119
|
+
return events.map(() => true);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
123
|
+
this.logger.error(`❌ Failed to batch publish ${events.length} events: ${errorMessage}`);
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
setupReturnHandler(handler) {
|
|
128
|
+
this.channel.on('return', (msg) => {
|
|
129
|
+
const eventName = msg.properties?.headers?.['x-eventName'] || 'unknown';
|
|
130
|
+
const details = JSON.stringify({
|
|
131
|
+
exchange: msg.fields.exchange,
|
|
132
|
+
routingKey: msg.fields.routingKey,
|
|
133
|
+
replyText: msg.fields.replyText,
|
|
134
|
+
});
|
|
135
|
+
this.logger.error(`⚠️ Message returned (no route): ${eventName} - ${details}`);
|
|
136
|
+
handler(msg);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
async close() {
|
|
140
|
+
try {
|
|
141
|
+
this.logger.debug('Waiting for pending message confirmations before closing...');
|
|
142
|
+
await this.channel.waitForConfirms();
|
|
143
|
+
this.logger.debug('All pending confirmations received');
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
147
|
+
this.logger.error(`Error waiting for confirmations before close: ${errorMessage}`);
|
|
148
|
+
}
|
|
149
|
+
await this.channel.close();
|
|
150
|
+
this.logger.debug('RabbitMQ channel closed successfully');
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
exports.ReliableDistributedEvents = ReliableDistributedEvents;
|
|
154
|
+
exports.ReliableDistributedEvents = ReliableDistributedEvents = ReliableDistributedEvents_1 = __decorate([
|
|
155
|
+
(0, typedi_1.Service)()
|
|
156
|
+
], ReliableDistributedEvents);
|
|
157
|
+
//# sourceMappingURL=ReliableDistributedEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReliableDistributedEvents.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/ReliableDistributedEvents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/index.ts"],"names":[],"mappings":"AAEA,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC"}
|
|
@@ -17,4 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./DistributedEvents"), exports);
|
|
18
18
|
__exportStar(require("./DistributedEventsLoader"), exports);
|
|
19
19
|
__exportStar(require("./EventsManager"), exports);
|
|
20
|
+
__exportStar(require("./RabbitMQConfig"), exports);
|
|
21
|
+
__exportStar(require("./ReliableDistributedEvents"), exports);
|
|
20
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,sDAAoC;AACpC,4DAA0C;AAC1C,kDAAgC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/libs/rabbitmq/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,sDAAoC;AACpC,4DAA0C;AAC1C,kDAAgC;AAChC,mDAAiC;AACjC,8DAA4C"}
|