@impactor/nest 3.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +89 -6
- package/index.d.ts +41 -40
- package/package.json +31 -33
- package/src/configs/app.d.ts +7 -4
- package/src/configs/app.js +11 -18
- package/src/configs/app.js.map +1 -1
- package/src/configs/database.js +1 -11
- package/src/configs/database.js.map +1 -1
- package/src/configs/microservice.js +6 -16
- package/src/configs/microservice.js.map +1 -1
- package/src/configs/multi-queue-rabbitmq-server.js +28 -34
- package/src/configs/multi-queue-rabbitmq-server.js.map +1 -1
- package/src/configs/redis-config.js +1 -11
- package/src/configs/redis-config.js.map +1 -1
- package/src/create-app.d.ts +1 -1
- package/src/create-app.js +47 -55
- package/src/create-app.js.map +1 -1
- package/src/create-microservice.d.ts +1 -1
- package/src/create-microservice.js +18 -22
- package/src/create-microservice.js.map +1 -1
- package/src/create-testing-microservice.d.ts +1 -1
- package/src/create-testing-microservice.js +16 -20
- package/src/create-testing-microservice.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-controller-path.d.ts +1 -1
- package/src/decorators/controller/add-decorators/add-controller-path.js +7 -15
- package/src/decorators/controller/add-decorators/add-controller-path.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-controller-tags.d.ts +1 -1
- package/src/decorators/controller/add-decorators/add-controller-tags.js +9 -17
- package/src/decorators/controller/add-decorators/add-controller-tags.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-http-method.d.ts +2 -2
- package/src/decorators/controller/add-decorators/add-http-method.js +13 -20
- package/src/decorators/controller/add-decorators/add-http-method.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-swagger-body.d.ts +2 -2
- package/src/decorators/controller/add-decorators/add-swagger-body.js +7 -17
- package/src/decorators/controller/add-decorators/add-swagger-body.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-swagger-operation.d.ts +2 -2
- package/src/decorators/controller/add-decorators/add-swagger-operation.js +8 -15
- package/src/decorators/controller/add-decorators/add-swagger-operation.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-swagger-params.d.ts +2 -2
- package/src/decorators/controller/add-decorators/add-swagger-params.js +9 -16
- package/src/decorators/controller/add-decorators/add-swagger-params.js.map +1 -1
- package/src/decorators/controller/add-decorators/add-swagger-response.d.ts +2 -2
- package/src/decorators/controller/add-decorators/add-swagger-response.js +10 -20
- package/src/decorators/controller/add-decorators/add-swagger-response.js.map +1 -1
- package/src/decorators/controller/controller.decorator.d.ts +1 -1
- package/src/decorators/controller/controller.decorator.js +12 -13
- package/src/decorators/controller/controller.decorator.js.map +1 -1
- package/src/decorators/controller/controller.factory.d.ts +1 -1
- package/src/decorators/controller/controller.factory.js +59 -67
- package/src/decorators/controller/controller.factory.js.map +1 -1
- package/src/decorators/controller/default-options.d.ts +1 -1
- package/src/decorators/controller/default-options.js +11 -26
- package/src/decorators/controller/default-options.js.map +1 -1
- package/src/decorators/controller/dto/empty.dto.js +2 -12
- package/src/decorators/controller/dto/empty.dto.js.map +1 -1
- package/src/decorators/controller/dto/update-response.dto.js +2 -12
- package/src/decorators/controller/dto/update-response.dto.js.map +1 -1
- package/src/decorators/controller/interceptors/query.interceptor.d.ts +1 -1
- package/src/decorators/controller/interceptors/query.interceptor.js +10 -19
- package/src/decorators/controller/interceptors/query.interceptor.js.map +1 -1
- package/src/decorators/controller/route-handler.d.ts +2 -2
- package/src/decorators/controller/route-handler.js +8 -16
- package/src/decorators/controller/route-handler.js.map +1 -1
- package/src/decorators/controller/route.decorator.d.ts +1 -1
- package/src/decorators/controller/route.decorator.js +11 -11
- package/src/decorators/controller/route.decorator.js.map +1 -1
- package/src/decorators/controller/services/crud-typeorm.service.d.ts +1 -2
- package/src/decorators/controller/services/crud-typeorm.service.js +19 -24
- package/src/decorators/controller/services/crud-typeorm.service.js.map +1 -1
- package/src/decorators/controller/types/index.d.ts +2 -2
- package/src/decorators/controller/types/index.js +1 -4
- package/src/decorators/controller/types/index.js.map +1 -1
- package/src/decorators/controller/utils/merge-options.d.ts +1 -1
- package/src/decorators/controller/utils/merge-options.js +3 -13
- package/src/decorators/controller/utils/merge-options.js.map +1 -1
- package/src/decorators/controller/utils/reflect.d.ts +2 -2
- package/src/decorators/controller/utils/reflect.js +24 -38
- package/src/decorators/controller/utils/reflect.js.map +1 -1
- package/src/decorators/entity.decorator.d.ts +6 -0
- package/src/decorators/entity.decorator.js +73 -0
- package/src/decorators/entity.decorator.js.map +1 -0
- package/src/decorators/prop.decorator.js +79 -38
- package/src/decorators/prop.decorator.js.map +1 -1
- package/src/exceptions/rpc-bad-request.exception.d.ts +1 -1
- package/src/exceptions/rpc-bad-request.exception.js +5 -15
- package/src/exceptions/rpc-bad-request.exception.js.map +1 -1
- package/src/exceptions/rpc-base.exception.js +10 -15
- package/src/exceptions/rpc-base.exception.js.map +1 -1
- package/src/exceptions/rpc-conflict.exception.d.ts +1 -1
- package/src/exceptions/rpc-conflict.exception.js +5 -15
- package/src/exceptions/rpc-conflict.exception.js.map +1 -1
- package/src/exceptions/rpc-internal-server-error.exception.d.ts +1 -1
- package/src/exceptions/rpc-internal-server-error.exception.js +5 -15
- package/src/exceptions/rpc-internal-server-error.exception.js.map +1 -1
- package/src/exceptions/rpc-method-not-allowed.exception.d.ts +1 -1
- package/src/exceptions/rpc-method-not-allowed.exception.js +5 -15
- package/src/exceptions/rpc-method-not-allowed.exception.js.map +1 -1
- package/src/exceptions/rpc-not-found.exception.d.ts +1 -1
- package/src/exceptions/rpc-not-found.exception.js +5 -15
- package/src/exceptions/rpc-not-found.exception.js.map +1 -1
- package/src/exceptions/rpc-not-implemented.exception.d.ts +1 -1
- package/src/exceptions/rpc-not-implemented.exception.js +5 -15
- package/src/exceptions/rpc-not-implemented.exception.js.map +1 -1
- package/src/exceptions/rpc-unauthorized.exception.d.ts +1 -1
- package/src/exceptions/rpc-unauthorized.exception.js +5 -15
- package/src/exceptions/rpc-unauthorized.exception.js.map +1 -1
- package/src/filters/error-to-rpc-exception.filter.js +12 -22
- package/src/filters/error-to-rpc-exception.filter.js.map +1 -1
- package/src/filters/error-to-ws-exception.filter.js +10 -20
- package/src/filters/error-to-ws-exception.filter.js.map +1 -1
- package/src/filters/typeorm-exception.filter.js +9 -19
- package/src/filters/typeorm-exception.filter.js.map +1 -1
- package/src/filters/ws-exception.filter.js +6 -16
- package/src/filters/ws-exception.filter.js.map +1 -1
- package/src/generate-metadata.d.ts +3 -3
- package/src/generate-metadata.js +18 -74
- package/src/generate-metadata.js.map +1 -1
- package/src/guards/auth.guard.js +43 -44
- package/src/guards/auth.guard.js.map +1 -1
- package/src/modules/basic/basic.controller.js +6 -16
- package/src/modules/basic/basic.controller.js.map +1 -1
- package/src/modules/basic/basic.module.js +15 -23
- package/src/modules/basic/basic.module.js.map +1 -1
- package/src/modules/basic/basic.service.js +4 -14
- package/src/modules/basic/basic.service.js.map +1 -1
- package/src/register-entities.d.ts +1 -0
- package/src/register-entities.js +135 -0
- package/src/register-entities.js.map +1 -0
- package/src/utils/logger.js +2 -12
- package/src/utils/logger.js.map +1 -1
- package/src/utils/typeorm-to-swagger.d.ts +3 -0
- package/src/utils/typeorm-to-swagger.js +308 -0
- package/src/utils/typeorm-to-swagger.js.map +1 -0
- package/nx.json +0 -190
- package/src/nest-swagger-metadata.js +0 -553
- package/src/nest-swagger-metadata.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,6 +2,13 @@ utils for NestJs
|
|
|
2
2
|
|
|
3
3
|
## Decorators
|
|
4
4
|
|
|
5
|
+
## @Controller()
|
|
6
|
+
|
|
7
|
+
Quickly generate all API endpoints and Crud operations of a controller without a single line of code.
|
|
8
|
+
It also generate Swagger decorators for all routes.
|
|
9
|
+
|
|
10
|
+
[Read more...](./README.controller.md)
|
|
11
|
+
|
|
5
12
|
## @Prop()
|
|
6
13
|
|
|
7
14
|
a param decorator that extracts a field from the request
|
|
@@ -30,20 +37,96 @@ and add the suitable Swagger's docs.
|
|
|
30
37
|
|
|
31
38
|
```
|
|
32
39
|
|
|
33
|
-
##
|
|
40
|
+
## Exceptions
|
|
34
41
|
|
|
35
|
-
|
|
36
|
-
It also generate Swagger decorators for all routes.
|
|
42
|
+
RPC exceptions equivalent to the corresponding HTTP exceptions, such as:
|
|
37
43
|
|
|
38
|
-
|
|
44
|
+
- `RpcBadRequestException` -> `HttpBadRequestException`
|
|
45
|
+
- `RpcConflictException` -> `HttpConflictException`
|
|
46
|
+
- `RpcInternalServerErrorException` -> `HttpInternalServerErrorException`
|
|
47
|
+
- `RpcMethodNotAllowedException` -> `HttpMethodNotAllowedException`
|
|
48
|
+
- `RpcNotFoundException` -> `HttpNotFoundException`
|
|
49
|
+
- `RpcNotImplementedException` -> `HttpNotImplementedException`
|
|
50
|
+
- `RpcUnauthorizedException` -> `HttpUnauthorizedException`
|
|
51
|
+
|
|
52
|
+
Use these exceptions in microservices instead of the HTTP exceptions Nest provides, so you can handle RPC exception correctly.
|
|
53
|
+
|
|
54
|
+
usage:
|
|
55
|
+
|
|
56
|
+
inside microservices:
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
export function doAction() {
|
|
60
|
+
// if a bad request is received
|
|
61
|
+
throw new RpcBadRequestException(); // correct
|
|
62
|
+
throw new HttpBadRequestException(); // wrong
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
if you returned an instance of HttpException, Nest will handle it just like any other http, causes the exception not propagated to the microservice that requested the action and your response will be lost.
|
|
67
|
+
|
|
68
|
+
Using RPC exceptions instead, with the RPC exception filter we provide, you can handle this type of exceptions correctly.
|
|
39
69
|
|
|
40
70
|
## Exception Filters
|
|
41
71
|
|
|
42
|
-
-
|
|
72
|
+
- RPC: convert Error to RpcException
|
|
43
73
|
- WS: convert Error to WsException
|
|
44
|
-
- TypeORM
|
|
74
|
+
- TypeORM: detect TypeORM exceptions and handle them.
|
|
75
|
+
|
|
76
|
+
## Guards
|
|
77
|
+
|
|
78
|
+
### Auth guard
|
|
79
|
+
|
|
80
|
+
- `JwtAuthGuard`: inspects the JWT token and guard your routes based on this token.
|
|
81
|
+
|
|
82
|
+
it also checks the specified roles to determine weather to pass the guard or not.
|
|
83
|
+
|
|
84
|
+
Thi guard also provides the following decorators:
|
|
85
|
+
|
|
86
|
+
- `@Public()` and `@Private()`: to allow or disallow un-authenticated users to use the route. You can use it in the class-level or route-level.
|
|
87
|
+
- `@Roles()`: if provided, the guard checks the user roles before allowing him to use the route. you need to provide the user role when creating `req.user` object.
|
|
88
|
+
|
|
89
|
+
### example
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
// app.module.ts
|
|
93
|
+
import { JwtAuthGuard } from "@impactor/nest"
|
|
94
|
+
|
|
95
|
+
@Module({
|
|
96
|
+
imports: [...],
|
|
97
|
+
providers: [
|
|
98
|
+
AppService,
|
|
99
|
+
{
|
|
100
|
+
provide: APP_GUARD,
|
|
101
|
+
useClass: JwtAuthGuard, //<---
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
// users.controller.ts
|
|
109
|
+
import { Public, Private } from "@impactor/nest";
|
|
110
|
+
|
|
111
|
+
@Controller()
|
|
112
|
+
@Private() //<--- lock all routes
|
|
113
|
+
export class UsersController {
|
|
114
|
+
@Pot()
|
|
115
|
+
addUser() {}
|
|
116
|
+
|
|
117
|
+
@Get()
|
|
118
|
+
@Public() //<--- allow this route
|
|
119
|
+
getUserById() {}
|
|
120
|
+
|
|
121
|
+
@Get()
|
|
122
|
+
@Roles("admin", "moderators") //<--- limit access to admins and moderators only
|
|
123
|
+
getAllUsers() {}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
45
126
|
|
|
46
127
|
## Features
|
|
47
128
|
|
|
48
129
|
- `BasicModule`
|
|
130
|
+
- `createApp()`: create a Nest app [learn more](./README.createApp.md)
|
|
49
131
|
- `createMicroservice()`: create a microservice
|
|
132
|
+
- `generate-metadata`: generate Swagger metadata
|
package/index.d.ts
CHANGED
|
@@ -1,40 +1,41 @@
|
|
|
1
|
-
export * from './src/configs/app';
|
|
2
|
-
export * from './src/configs/database';
|
|
3
|
-
export * from './src/configs/multi-queue-rabbitmq-server';
|
|
4
|
-
export * from './src/configs/redis-config';
|
|
5
|
-
export * from './src/create-microservice';
|
|
6
|
-
export * from './src/create-testing-microservice';
|
|
7
|
-
export * from './src/decorators/prop.decorator';
|
|
8
|
-
export * from './src/exceptions/rpc-bad-request.exception';
|
|
9
|
-
export * from './src/exceptions/rpc-conflict.exception';
|
|
10
|
-
export * from './src/exceptions/rpc-internal-server-error.exception';
|
|
11
|
-
export * from './src/exceptions/rpc-method-not-allowed.exception';
|
|
12
|
-
export * from './src/exceptions/rpc-not-found.exception';
|
|
13
|
-
export * from './src/exceptions/rpc-not-implemented.exception';
|
|
14
|
-
export * from './src/exceptions/rpc-unauthorized.exception';
|
|
15
|
-
export * from './src/filters/error-to-rpc-exception.filter';
|
|
16
|
-
export * from './src/filters/error-to-ws-exception.filter';
|
|
17
|
-
export * from './src/filters/typeorm-exception.filter';
|
|
18
|
-
export * from './src/filters/ws-exception.filter';
|
|
19
|
-
export * from './src/generate-metadata';
|
|
20
|
-
export * from './src/create-app';
|
|
21
|
-
export * from './src/guards/auth.guard';
|
|
22
|
-
export * from './src/modules/basic/basic.controller';
|
|
23
|
-
export * from './src/modules/basic/basic.module';
|
|
24
|
-
export * from './src/modules/basic/basic.service';
|
|
25
|
-
export * from './src/decorators/controller/add-decorators/add-http-method';
|
|
26
|
-
export * from './src/decorators/controller/add-decorators/add-swagger-body';
|
|
27
|
-
export * from './src/decorators/controller/add-decorators/add-swagger-operation';
|
|
28
|
-
export * from './src/decorators/controller/add-decorators/add-swagger-params';
|
|
29
|
-
export * from './src/decorators/controller/add-decorators/add-swagger-response';
|
|
30
|
-
export * from './src/decorators/controller/controller.factory';
|
|
31
|
-
export * from './src/decorators/controller/default-options';
|
|
32
|
-
export * from './src/decorators/controller/route.decorator';
|
|
33
|
-
export * from './src/decorators/controller/controller.decorator';
|
|
34
|
-
export * from './src/decorators/controller/dto/empty.dto';
|
|
35
|
-
export * from './src/decorators/controller/dto/update-response.dto';
|
|
36
|
-
export * from './src/decorators/controller/interceptors/query.interceptor';
|
|
37
|
-
export * from './src/decorators/controller/route-handler';
|
|
38
|
-
export * from './src/decorators/controller/services/crud-typeorm.service';
|
|
39
|
-
export * from './src/decorators/controller/types';
|
|
40
|
-
export * from './src/decorators/controller/utils/merge-options';
|
|
1
|
+
export * from './src/configs/app.js';
|
|
2
|
+
export * from './src/configs/database.js';
|
|
3
|
+
export * from './src/configs/multi-queue-rabbitmq-server.js';
|
|
4
|
+
export * from './src/configs/redis-config.js';
|
|
5
|
+
export * from './src/create-microservice.js';
|
|
6
|
+
export * from './src/create-testing-microservice.js';
|
|
7
|
+
export * from './src/decorators/prop.decorator.js';
|
|
8
|
+
export * from './src/exceptions/rpc-bad-request.exception.js';
|
|
9
|
+
export * from './src/exceptions/rpc-conflict.exception.js';
|
|
10
|
+
export * from './src/exceptions/rpc-internal-server-error.exception.js';
|
|
11
|
+
export * from './src/exceptions/rpc-method-not-allowed.exception.js';
|
|
12
|
+
export * from './src/exceptions/rpc-not-found.exception.js';
|
|
13
|
+
export * from './src/exceptions/rpc-not-implemented.exception.js';
|
|
14
|
+
export * from './src/exceptions/rpc-unauthorized.exception.js';
|
|
15
|
+
export * from './src/filters/error-to-rpc-exception.filter.js';
|
|
16
|
+
export * from './src/filters/error-to-ws-exception.filter.js';
|
|
17
|
+
export * from './src/filters/typeorm-exception.filter.js';
|
|
18
|
+
export * from './src/filters/ws-exception.filter.js';
|
|
19
|
+
export * from './src/generate-metadata.js';
|
|
20
|
+
export * from './src/create-app.js';
|
|
21
|
+
export * from './src/guards/auth.guard.js';
|
|
22
|
+
export * from './src/modules/basic/basic.controller.js';
|
|
23
|
+
export * from './src/modules/basic/basic.module.js';
|
|
24
|
+
export * from './src/modules/basic/basic.service.js';
|
|
25
|
+
export * from './src/decorators/controller/add-decorators/add-http-method.js';
|
|
26
|
+
export * from './src/decorators/controller/add-decorators/add-swagger-body.js';
|
|
27
|
+
export * from './src/decorators/controller/add-decorators/add-swagger-operation.js';
|
|
28
|
+
export * from './src/decorators/controller/add-decorators/add-swagger-params.js';
|
|
29
|
+
export * from './src/decorators/controller/add-decorators/add-swagger-response.js';
|
|
30
|
+
export * from './src/decorators/controller/controller.factory.js';
|
|
31
|
+
export * from './src/decorators/controller/default-options.js';
|
|
32
|
+
export * from './src/decorators/controller/route.decorator.js';
|
|
33
|
+
export * from './src/decorators/controller/controller.decorator.js';
|
|
34
|
+
export * from './src/decorators/controller/dto/empty.dto.js';
|
|
35
|
+
export * from './src/decorators/controller/dto/update-response.dto.js';
|
|
36
|
+
export * from './src/decorators/controller/interceptors/query.interceptor.js';
|
|
37
|
+
export * from './src/decorators/controller/route-handler.js';
|
|
38
|
+
export * from './src/decorators/controller/services/crud-typeorm.service.js';
|
|
39
|
+
export * from './src/decorators/controller/types/index.js';
|
|
40
|
+
export * from './src/decorators/controller/utils/merge-options.js';
|
|
41
|
+
export * from './src/decorators/entity.decorator.js';
|
package/package.json
CHANGED
|
@@ -1,32 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@impactor/nest",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "utils for NestJs. Automatically generate APIs and crud operators for NestJs apps",
|
|
6
6
|
"private": false,
|
|
7
7
|
"publishConfig": {
|
|
8
|
-
"access": "public"
|
|
8
|
+
"access": "public",
|
|
9
|
+
"linkDirectory": false
|
|
9
10
|
},
|
|
10
11
|
"nx": {
|
|
11
12
|
"projectType": "library",
|
|
12
13
|
"targets": {
|
|
13
|
-
"build": {}
|
|
14
|
-
"semantic-release": {}
|
|
14
|
+
"build": {}
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"imports": {
|
|
18
|
-
"#*": "
|
|
18
|
+
"#*": "./*"
|
|
19
19
|
},
|
|
20
20
|
"exports": {
|
|
21
21
|
".": {
|
|
22
22
|
"types": "./index.d.js",
|
|
23
23
|
"default": "./index.js"
|
|
24
24
|
},
|
|
25
|
+
"./*": {
|
|
26
|
+
"types": "./src/*",
|
|
27
|
+
"default": "./src/*"
|
|
28
|
+
},
|
|
25
29
|
"./package.json": {
|
|
26
30
|
"default": "./package.json"
|
|
27
|
-
}
|
|
28
|
-
"./*": "./src/*"
|
|
31
|
+
}
|
|
29
32
|
},
|
|
33
|
+
"types": "./index.d.ts",
|
|
34
|
+
"main": "./index.js",
|
|
30
35
|
"keywords": [
|
|
31
36
|
"crud",
|
|
32
37
|
"NestJs",
|
|
@@ -35,43 +40,34 @@
|
|
|
35
40
|
"js"
|
|
36
41
|
],
|
|
37
42
|
"dependencies": {
|
|
43
|
+
"@fastify/multipart": "^9.4.0",
|
|
44
|
+
"@impactor/javascript": "5.0.0",
|
|
45
|
+
"@impactor/nodejs": "5.0.0",
|
|
38
46
|
"@nestjs/cli": "^11.0.16",
|
|
39
|
-
"@nestjs/common": "^11.1.
|
|
47
|
+
"@nestjs/common": "^11.1.13",
|
|
40
48
|
"@nestjs/config": "^4.0.2",
|
|
41
|
-
"@nestjs/core": "^11.1.
|
|
42
|
-
"@nestjs/microservices": "^11.1.
|
|
43
|
-
"@nestjs/
|
|
44
|
-
"@nestjs/platform-
|
|
49
|
+
"@nestjs/core": "^11.1.13",
|
|
50
|
+
"@nestjs/microservices": "^11.1.13",
|
|
51
|
+
"@nestjs/passport": "^11.0.5",
|
|
52
|
+
"@nestjs/platform-express": "^11.1.13",
|
|
53
|
+
"@nestjs/platform-fastify": "^11.1.13",
|
|
45
54
|
"@nestjs/swagger": "^11.2.5",
|
|
46
|
-
"@nestjs/testing": "^11.1.
|
|
55
|
+
"@nestjs/testing": "^11.1.13",
|
|
47
56
|
"@nestjs/typeorm": "^11.0.0",
|
|
48
|
-
"@nestjs/websockets": "^11.1.
|
|
57
|
+
"@nestjs/websockets": "^11.1.13",
|
|
49
58
|
"amqplib": "^0.10.9",
|
|
50
59
|
"class-validator": "^0.14.3",
|
|
51
|
-
"fastify": "^5.7.
|
|
60
|
+
"fastify": "^5.7.4",
|
|
61
|
+
"merge-anything": "^6.0.6",
|
|
52
62
|
"nest-winston": "^1.10.2",
|
|
63
|
+
"reflect-metadata": "^0.2.2",
|
|
53
64
|
"rxjs": "^7.8.2",
|
|
54
65
|
"tslib": "^2.8.1",
|
|
55
66
|
"typeorm": "^0.3.28",
|
|
56
|
-
"winston": "^3.19.0"
|
|
57
|
-
"@fastify/multipart": "^9.3.0",
|
|
58
|
-
"@impactor/javascript": "3.0.2",
|
|
59
|
-
"@impactor/nodejs": "3.0.2",
|
|
60
|
-
"@nestjs/passport": "^11.0.5",
|
|
61
|
-
"merge-anything": "^6.0.6",
|
|
62
|
-
"reflect-metadata": "^0.2.2"
|
|
67
|
+
"winston": "^3.19.0"
|
|
63
68
|
},
|
|
64
69
|
"devDependencies": {
|
|
65
|
-
"
|
|
66
|
-
"tsx": "^4.21.0",
|
|
67
|
-
"@nestjs/cli": "^11.0.16",
|
|
68
|
-
"@nestjs/platform-fastify": "^11.1.12",
|
|
69
|
-
"@swc/cli": "^0.7.10",
|
|
70
|
-
"@swc/core": "^1.15.8",
|
|
71
|
-
"@types/node": "^25.0.9",
|
|
72
|
-
"typescript": "^5.9.3",
|
|
73
|
-
"semantic-release": "^25.0.2",
|
|
74
|
-
"semantic-release-monorepo": "^8.0.2"
|
|
70
|
+
"tsx": "^4.21.0"
|
|
75
71
|
},
|
|
76
72
|
"engines": {
|
|
77
73
|
"node": "^18.19.1 || ^20.11.1 || >=22.0.0"
|
|
@@ -98,5 +94,7 @@
|
|
|
98
94
|
"url": "https://www.patreon.com/GoogleDev"
|
|
99
95
|
}
|
|
100
96
|
],
|
|
101
|
-
"scripts": {
|
|
97
|
+
"scripts": {
|
|
98
|
+
"start": "NODE_ENV=production pnpm tsx --env-file-if-exists=.env --env-file-if-exists=.env.local --env-file-if-exists=.env.production --env-file-if-exists=.env.production.local main.js"
|
|
99
|
+
}
|
|
102
100
|
}
|
package/src/configs/app.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ValidationPipeOptions, type VersioningOptions } from '@nestjs/common';
|
|
2
|
-
import type { GlobalPrefixOptions
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import type { GlobalPrefixOptions } from '@nestjs/common/interfaces/global-prefix-options.interface.js';
|
|
3
|
+
import type { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface.js';
|
|
4
|
+
import { type NestExpressApplication } from '@nestjs/platform-express';
|
|
5
|
+
import { type NestFastifyApplication } from '@nestjs/platform-fastify';
|
|
6
|
+
import { type OpenAPIObject } from '@nestjs/swagger';
|
|
6
7
|
export type IApp = NestFastifyApplication | NestExpressApplication;
|
|
7
8
|
export interface IPrefix extends GlobalPrefixOptions {
|
|
8
9
|
prefix: string;
|
|
@@ -12,9 +13,11 @@ export interface IAppConfig extends NestApplicationOptions {
|
|
|
12
13
|
prefix?: string | IPrefix;
|
|
13
14
|
versioning?: VersioningOptions;
|
|
14
15
|
swagger?: Partial<Omit<OpenAPIObject, 'paths'>>;
|
|
16
|
+
swaggerPath?: string;
|
|
15
17
|
multipart?: boolean;
|
|
16
18
|
validationPipe?: ValidationPipeOptions;
|
|
17
19
|
package?: string | Record<string, unknown>;
|
|
20
|
+
registerEntities?: boolean | Function[];
|
|
18
21
|
onServerRun?: (app: IApp) => void | Promise<void>;
|
|
19
22
|
onServerError?: (error: Error, app: IApp) => void | Promise<void>;
|
|
20
23
|
}
|
package/src/configs/app.js
CHANGED
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return appConfig;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _logger = require("../utils/logger");
|
|
12
|
-
const _common = require("@nestjs/common");
|
|
13
|
-
const appConfig = {
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { VersioningType } from "@nestjs/common";
|
|
3
|
+
/**
|
|
4
|
+
* the default app configs
|
|
5
|
+
*/ export const appConfig = {
|
|
14
6
|
port: process.env.PORT,
|
|
15
7
|
prefix: {
|
|
16
8
|
prefix: 'api',
|
|
@@ -37,11 +29,12 @@ const appConfig = {
|
|
|
37
29
|
}
|
|
38
30
|
}
|
|
39
31
|
},
|
|
32
|
+
swaggerPath: '',
|
|
40
33
|
versioning: {
|
|
41
34
|
defaultVersion: [
|
|
42
35
|
'1.0'
|
|
43
36
|
],
|
|
44
|
-
type:
|
|
37
|
+
type: VersioningType.URI
|
|
45
38
|
},
|
|
46
39
|
// cors: {
|
|
47
40
|
// // todo: add APP_URL or localhost by default
|
|
@@ -50,14 +43,14 @@ const appConfig = {
|
|
|
50
43
|
// allowedHeaders: '*',
|
|
51
44
|
// },
|
|
52
45
|
onServerRun: async (app)=>{
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
logger.log(`running at ${await app.getUrl()}`);
|
|
47
|
+
logger.log(`Env: ${process.env.NODE_ENV}`);
|
|
55
48
|
if (process.env.DB_NAME) {
|
|
56
|
-
|
|
49
|
+
logger.log(`database: ${process.env.DB_NAME}@${process.env.DB_HOST || 'localhost'}`);
|
|
57
50
|
}
|
|
58
51
|
},
|
|
59
52
|
onServerError: (error, _app)=>{
|
|
60
|
-
|
|
53
|
+
logger.error(`Server failed to run`);
|
|
61
54
|
throw error;
|
|
62
55
|
}
|
|
63
56
|
};
|
package/src/configs/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/configs/app.ts"],"sourcesContent":["import { logger } from '../utils/logger';\nimport {\n ValidationPipeOptions,\n type VersioningOptions,\n VersioningType,\n} from '@nestjs/common';\nimport type {
|
|
1
|
+
{"version":3,"sources":["../../../src/configs/app.ts"],"sourcesContent":["import { logger } from '../utils/logger.js';\nimport {\n ValidationPipeOptions,\n type VersioningOptions,\n VersioningType,\n} from '@nestjs/common';\nimport type { GlobalPrefixOptions } from '@nestjs/common/interfaces/global-prefix-options.interface.js';\nimport type { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface.js';\nimport { type NestExpressApplication } from '@nestjs/platform-express';\nimport { type NestFastifyApplication } from '@nestjs/platform-fastify';\nimport { type OpenAPIObject } from '@nestjs/swagger';\n\nexport type IApp = NestFastifyApplication | NestExpressApplication;\nexport interface IPrefix extends GlobalPrefixOptions {\n prefix: string;\n}\n\n// todo: adaptor: fastify | express = fastify\nexport interface IAppConfig extends NestApplicationOptions {\n /**\n * The port that the app will listen to\n * if not provided, `app.listen()` is not called\n */\n port?: string | number;\n /** the global prefix for every HTTP route path. see Nest.setGlobalPrefix() */\n prefix?: string | IPrefix;\n versioning?: VersioningOptions;\n /**\n * Swagger API spec.\n * https://spec.openapis.org/oas\n */\n swagger?: Partial<Omit<OpenAPIObject, 'paths'>>;\n /**\n * The path to the Swagger UI page\n * @default ''\n */\n swaggerPath?: string;\n /** whether to enable parsing multiPart */\n multipart?: boolean;\n /**\n * validation pipe options\n */\n validationPipe?: ValidationPipeOptions;\n /**\n * package.json absolute path or object, or the path of the project root dir\n * used to extract info for Swagger docs, such as title, description, and version.\n */\n // todo: import IPackage interface from @impactor/javascript (move from @impactor/nx-manager)\n package?: string | Record<string, unknown>;\n /**\n * weather to register entities to automatically generate Swagger and class-validator decorators\n * You can specify list of models to be registered\n */\n registerEntities?: boolean | Function[];\n /**\n * a hook that executed when the server runs and listens to the specified port\n * get the server by app.getHttpServer()\n */\n onServerRun?: (app: IApp) => void | Promise<void>;\n onServerError?: (error: Error, app: IApp) => void | Promise<void>;\n}\n\n/**\n * the default app configs\n */\nexport const appConfig: IAppConfig = {\n port: process.env.PORT,\n prefix: { prefix: 'api', exclude: ['sitemap.xml', 'robots.txt'] },\n // or use `DocumentBuilder` from \"@nestjs/swagger\"\n swagger: {\n openapi: '3.1.0',\n info: { title: 'API', version: '1.0' },\n components: {\n securitySchemes: {\n // add `@ApiBearerAuth()` to controllers which you need to check their bearer auth header\n bearer: {\n scheme: 'bearer',\n bearerFormat: 'JWT',\n type: 'http',\n },\n },\n },\n },\n swaggerPath: '',\n versioning: {\n defaultVersion: ['1.0'],\n type: VersioningType.URI,\n },\n // cors: {\n // // todo: add APP_URL or localhost by default\n // origin: '*',\n // methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n // allowedHeaders: '*',\n // },\n onServerRun: async (app) => {\n logger.log(`running at ${await app.getUrl()}`);\n logger.log(`Env: ${process.env.NODE_ENV}`);\n if (process.env.DB_NAME) {\n logger.log(\n `database: ${process.env.DB_NAME}@${process.env.DB_HOST || 'localhost'}`,\n );\n }\n },\n onServerError: (error, _app) => {\n logger.error(`Server failed to run`);\n throw error;\n },\n};\n"],"names":["logger","VersioningType","appConfig","port","process","env","PORT","prefix","exclude","swagger","openapi","info","title","version","components","securitySchemes","bearer","scheme","bearerFormat","type","swaggerPath","versioning","defaultVersion","URI","onServerRun","app","log","getUrl","NODE_ENV","DB_NAME","DB_HOST","onServerError","error","_app"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAGEC,cAAc,QACT,iBAAiB;AAyDxB;;CAEC,GACD,OAAO,MAAMC,YAAwB;IACnCC,MAAMC,QAAQC,GAAG,CAACC,IAAI;IACtBC,QAAQ;QAAEA,QAAQ;QAAOC,SAAS;YAAC;YAAe;SAAa;IAAC;IAChE,kDAAkD;IAClDC,SAAS;QACPC,SAAS;QACTC,MAAM;YAAEC,OAAO;YAAOC,SAAS;QAAM;QACrCC,YAAY;YACVC,iBAAiB;gBACf,yFAAyF;gBACzFC,QAAQ;oBACNC,QAAQ;oBACRC,cAAc;oBACdC,MAAM;gBACR;YACF;QACF;IACF;IACAC,aAAa;IACbC,YAAY;QACVC,gBAAgB;YAAC;SAAM;QACvBH,MAAMlB,eAAesB,GAAG;IAC1B;IACA,UAAU;IACV,iDAAiD;IACjD,iBAAiB;IACjB,+CAA+C;IAC/C,yBAAyB;IACzB,KAAK;IACLC,aAAa,OAAOC;QAClBzB,OAAO0B,GAAG,CAAC,CAAC,WAAW,EAAE,MAAMD,IAAIE,MAAM,IAAI;QAC7C3B,OAAO0B,GAAG,CAAC,CAAC,KAAK,EAAEtB,QAAQC,GAAG,CAACuB,QAAQ,EAAE;QACzC,IAAIxB,QAAQC,GAAG,CAACwB,OAAO,EAAE;YACvB7B,OAAO0B,GAAG,CACR,CAAC,UAAU,EAAEtB,QAAQC,GAAG,CAACwB,OAAO,CAAC,CAAC,EAAEzB,QAAQC,GAAG,CAACyB,OAAO,IAAI,aAAa;QAE5E;IACF;IACAC,eAAe,CAACC,OAAOC;QACrBjC,OAAOgC,KAAK,CAAC,CAAC,oBAAoB,CAAC;QACnC,MAAMA;IACR;AACF,EAAE"}
|
package/src/configs/database.js
CHANGED
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "typeORMConfigs", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return typeORMConfigs;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const typeORMConfigs = {
|
|
1
|
+
export const typeORMConfigs = {
|
|
12
2
|
// @ts-ignore
|
|
13
3
|
type: process.env.DB_TYPE ?? 'postgres',
|
|
14
4
|
host: process.env.DB_HOST ?? 'localhost',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/configs/database.ts"],"sourcesContent":["import { type DataSourceOptions } from 'typeorm';\n\nexport const typeORMConfigs: DataSourceOptions = {\n // @ts-ignore\n type: process.env.DB_TYPE ?? 'postgres',\n host: process.env.DB_HOST ?? 'localhost',\n username: process.env.DB_USER ?? 'postgres',\n password: process.env.DB_PASSWORD,\n database: process.env.DB_NAME,\n // TODO: this should be disabled in prod to prevent the db data from being lost\n synchronize: true,\n autoLoadEntities: true,\n};\n"],"names":["typeORMConfigs","type","process","env","DB_TYPE","host","DB_HOST","username","DB_USER","password","DB_PASSWORD","database","DB_NAME","synchronize","autoLoadEntities"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/configs/database.ts"],"sourcesContent":["import { type DataSourceOptions } from 'typeorm';\n\nexport const typeORMConfigs: DataSourceOptions = {\n // @ts-ignore\n type: process.env.DB_TYPE ?? 'postgres',\n host: process.env.DB_HOST ?? 'localhost',\n username: process.env.DB_USER ?? 'postgres',\n password: process.env.DB_PASSWORD,\n database: process.env.DB_NAME,\n // TODO: this should be disabled in prod to prevent the db data from being lost\n synchronize: true,\n autoLoadEntities: true,\n};\n"],"names":["typeORMConfigs","type","process","env","DB_TYPE","host","DB_HOST","username","DB_USER","password","DB_PASSWORD","database","DB_NAME","synchronize","autoLoadEntities"],"mappings":"AAEA,OAAO,MAAMA,iBAAoC;IAC/C,aAAa;IACbC,MAAMC,QAAQC,GAAG,CAACC,OAAO,IAAI;IAC7BC,MAAMH,QAAQC,GAAG,CAACG,OAAO,IAAI;IAC7BC,UAAUL,QAAQC,GAAG,CAACK,OAAO,IAAI;IACjCC,UAAUP,QAAQC,GAAG,CAACO,WAAW;IACjCC,UAAUT,QAAQC,GAAG,CAACS,OAAO;IAC7B,+EAA+E;IAC/EC,aAAa;IACbC,kBAAkB;AACpB,EAAE"}
|
|
@@ -1,24 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "microserviceOptions", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return microserviceOptions;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _logger = require("../utils/logger");
|
|
12
|
-
const microserviceOptions = {
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
export const microserviceOptions = {
|
|
13
3
|
onServerRun: (_app)=>{
|
|
14
|
-
|
|
15
|
-
|
|
4
|
+
logger.log(`running `);
|
|
5
|
+
logger.log(`Env: ${process.env.NODE_ENV}`);
|
|
16
6
|
if (process.env.DB_NAME) {
|
|
17
|
-
|
|
7
|
+
logger.log(`database: ${process.env.DB_NAME}@${process.env.DB_HOST || 'localhost'}`);
|
|
18
8
|
}
|
|
19
9
|
},
|
|
20
10
|
onServerError: (error, _app)=>{
|
|
21
|
-
|
|
11
|
+
logger.error(`Server failed to run`);
|
|
22
12
|
throw error;
|
|
23
13
|
}
|
|
24
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/configs/microservice.ts"],"sourcesContent":["import { MicroserviceOptions } from '@nestjs/microservices';\nimport { logger } from '../utils/logger';\nimport { INestMicroservice } from '@nestjs/common';\n\nexport type IMicroserviceOptions = MicroserviceOptions & {\n onServerRun?: (app: INestMicroservice) => void | Promise<void>;\n onServerError?: (\n error: Error,\n app: INestMicroservice,\n ) => void | Promise<void>;\n};\n\nexport const microserviceOptions: IMicroserviceOptions = {\n onServerRun: (_app) => {\n logger.log(`running `);\n logger.log(`Env: ${process.env.NODE_ENV}`);\n if (process.env.DB_NAME) {\n logger.log(\n `database: ${process.env.DB_NAME}@${process.env.DB_HOST || 'localhost'}`,\n );\n }\n },\n onServerError: (error, _app) => {\n logger.error(`Server failed to run`);\n throw error;\n },\n};\n"],"names":["microserviceOptions","onServerRun","_app","
|
|
1
|
+
{"version":3,"sources":["../../../src/configs/microservice.ts"],"sourcesContent":["import { MicroserviceOptions } from '@nestjs/microservices';\nimport { logger } from '../utils/logger.js';\nimport { INestMicroservice } from '@nestjs/common';\n\nexport type IMicroserviceOptions = MicroserviceOptions & {\n onServerRun?: (app: INestMicroservice) => void | Promise<void>;\n onServerError?: (\n error: Error,\n app: INestMicroservice,\n ) => void | Promise<void>;\n};\n\nexport const microserviceOptions: IMicroserviceOptions = {\n onServerRun: (_app) => {\n logger.log(`running `);\n logger.log(`Env: ${process.env.NODE_ENV}`);\n if (process.env.DB_NAME) {\n logger.log(\n `database: ${process.env.DB_NAME}@${process.env.DB_HOST || 'localhost'}`,\n );\n }\n },\n onServerError: (error, _app) => {\n logger.error(`Server failed to run`);\n throw error;\n },\n};\n"],"names":["logger","microserviceOptions","onServerRun","_app","log","process","env","NODE_ENV","DB_NAME","DB_HOST","onServerError","error"],"mappings":"AACA,SAASA,MAAM,QAAQ,qBAAqB;AAW5C,OAAO,MAAMC,sBAA4C;IACvDC,aAAa,CAACC;QACZH,OAAOI,GAAG,CAAC,CAAC,QAAQ,CAAC;QACrBJ,OAAOI,GAAG,CAAC,CAAC,KAAK,EAAEC,QAAQC,GAAG,CAACC,QAAQ,EAAE;QACzC,IAAIF,QAAQC,GAAG,CAACE,OAAO,EAAE;YACvBR,OAAOI,GAAG,CACR,CAAC,UAAU,EAAEC,QAAQC,GAAG,CAACE,OAAO,CAAC,CAAC,EAAEH,QAAQC,GAAG,CAACG,OAAO,IAAI,aAAa;QAE5E;IACF;IACAC,eAAe,CAACC,OAAOR;QACrBH,OAAOW,KAAK,CAAC,CAAC,oBAAoB,CAAC;QACnC,MAAMA;IACR;AACF,EAAE"}
|
|
@@ -1,23 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { Server } from "@nestjs/microservices";
|
|
2
|
+
import { Logger, NotImplementedException } from "@nestjs/common";
|
|
3
|
+
import { connect } from "amqplib";
|
|
4
|
+
/**
|
|
5
|
+
* a custom RabbitMQ transport that creates multiple queues in a single channel
|
|
6
|
+
* https://docs.nestjs.com/microservices/custom-transport
|
|
7
|
+
*/ // todo: options: channel, queues[], method= sendToQueue|publish, logLevel=dev?info:log
|
|
8
|
+
export class MultiQueueRabbitMQServer extends Server {
|
|
9
|
+
constructor(configService){
|
|
10
|
+
super(), this.configService = configService, this.logger = new Logger(MultiQueueRabbitMQServer.name);
|
|
11
|
+
this.options = {
|
|
12
|
+
queues: [
|
|
13
|
+
// holds messages about creating and updating assets such as users, vehicles
|
|
14
|
+
'assets',
|
|
15
|
+
// holds authentication messages
|
|
16
|
+
'auth',
|
|
17
|
+
// holds messages about maps calculations
|
|
18
|
+
'maps',
|
|
19
|
+
// holds messages about orders updates, such as `orders.received`
|
|
20
|
+
'orders'
|
|
21
|
+
],
|
|
22
|
+
// `MICROSERVICE_URLS` is multiple space-separated urls separated
|
|
23
|
+
connection: this.configService.get('MICROSERVICE_URLS', 'amqp://localhost:5672').split(' ')[0]
|
|
24
|
+
};
|
|
9
25
|
}
|
|
10
|
-
});
|
|
11
|
-
const _microservices = require("@nestjs/microservices");
|
|
12
|
-
const _common = require("@nestjs/common");
|
|
13
|
-
const _amqplib = require("amqplib");
|
|
14
|
-
let MultiQueueRabbitMQServer = class MultiQueueRabbitMQServer extends _microservices.Server {
|
|
15
26
|
get configs() {
|
|
16
27
|
return this._configs;
|
|
17
28
|
}
|
|
18
29
|
async listen(callback) {
|
|
19
30
|
try {
|
|
20
|
-
let connection = typeof this.options.connection === 'string' ? await
|
|
31
|
+
let connection = typeof this.options.connection === 'string' ? await connect(this.options.connection) : this.options.connection;
|
|
21
32
|
this._configs = {
|
|
22
33
|
...this.options,
|
|
23
34
|
connection,
|
|
@@ -64,28 +75,11 @@ let MultiQueueRabbitMQServer = class MultiQueueRabbitMQServer extends _microserv
|
|
|
64
75
|
}
|
|
65
76
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
66
77
|
on(_event, _callback) {
|
|
67
|
-
throw new
|
|
78
|
+
throw new NotImplementedException();
|
|
68
79
|
}
|
|
69
80
|
unwrap() {
|
|
70
|
-
throw new
|
|
71
|
-
}
|
|
72
|
-
constructor(configService){
|
|
73
|
-
super(), this.configService = configService, this.logger = new _common.Logger(MultiQueueRabbitMQServer.name);
|
|
74
|
-
this.options = {
|
|
75
|
-
queues: [
|
|
76
|
-
// holds messages about creating and updating assets such as users, vehicles
|
|
77
|
-
'assets',
|
|
78
|
-
// holds authentication messages
|
|
79
|
-
'auth',
|
|
80
|
-
// holds messages about maps calculations
|
|
81
|
-
'maps',
|
|
82
|
-
// holds messages about orders updates, such as `orders.received`
|
|
83
|
-
'orders'
|
|
84
|
-
],
|
|
85
|
-
// `MICROSERVICE_URLS` is multiple space-separated urls separated
|
|
86
|
-
connection: this.configService.get('MICROSERVICE_URLS', 'amqp://localhost:5672').split(' ')[0]
|
|
87
|
-
};
|
|
81
|
+
throw new NotImplementedException();
|
|
88
82
|
}
|
|
89
|
-
}
|
|
83
|
+
}
|
|
90
84
|
|
|
91
85
|
//# sourceMappingURL=multi-queue-rabbitmq-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/configs/multi-queue-rabbitmq-server.ts"],"sourcesContent":["import { type CustomTransportStrategy, Server } from '@nestjs/microservices';\nimport { Logger, NotImplementedException } from '@nestjs/common';\nimport { type Channel, type ChannelModel, connect } from 'amqplib';\nimport { ConfigService } from '@nestjs/config';\n\nexport interface MultiQueueOptions {\n connection: ChannelModel | string;\n queues: string[];\n channel?: Channel;\n}\n\n/**\n * the final configs after resolving the provided options\n */\nexport interface MultiQueueConfigs extends Omit<\n Required<MultiQueueOptions>,\n 'connection'\n> {\n connection: ChannelModel;\n}\n\n/**\n * a custom RabbitMQ transport that creates multiple queues in a single channel\n * https://docs.nestjs.com/microservices/custom-transport\n */\n// todo: options: channel, queues[], method= sendToQueue|publish, logLevel=dev?info:log\n\nexport class MultiQueueRabbitMQServer\n extends Server\n implements CustomTransportStrategy\n{\n protected readonly logger = new Logger(MultiQueueRabbitMQServer.name);\n // todo: pass options in the constructor using DI token\n private options: MultiQueueOptions;\n private _configs: MultiQueueConfigs;\n\n constructor(private readonly configService: ConfigService) {\n super();\n\n this.options = {\n queues: [\n // holds messages about creating and updating assets such as users, vehicles\n 'assets',\n // holds authentication messages\n 'auth',\n // holds messages about maps calculations\n 'maps',\n // holds messages about orders updates, such as `orders.received`\n 'orders',\n ],\n // `MICROSERVICE_URLS` is multiple space-separated urls separated\n connection: this.configService\n .get<string>('MICROSERVICE_URLS', 'amqp://localhost:5672')\n .split(' ')[0],\n };\n }\n\n get configs() {\n return this._configs;\n }\n\n async listen(callback: () => void) {\n try {\n let connection =\n typeof this.options.connection === 'string'\n ? await connect(this.options.connection)\n : this.options.connection;\n\n this._configs = {\n ...this.options,\n connection,\n channel: this.options.channel || (await connection.createChannel()),\n };\n\n this.logger.log('Successfully connected to RabbitMQ.');\n\n for (let queue of this.options.queues) {\n await this.configs.channel.assertQueue(queue, { durable: true });\n this.logger.log(`Listening on queue: ${queue}`);\n\n await this.configs.channel.consume(queue, (message) => {\n let content = message?.content.toString();\n\n if (content) {\n let { pattern, data } = JSON.parse(content);\n let handler = this.messageHandlers.get(pattern);\n\n if (handler) {\n void handler(data).then((res) => {\n if (message?.properties?.replyTo) {\n // ✅ Check if replyTo exists\n this.configs.channel.sendToQueue(\n message.properties.replyTo,\n Buffer.from(JSON.stringify(res)),\n {\n correlationId: message.properties.correlationId,\n },\n );\n } else {\n this.logger.warn(\n `No replyTo queue specified for pattern: ${pattern}`,\n );\n }\n });\n } else {\n this.logger.warn(`No handler found for pattern: ${pattern}`);\n }\n\n this.configs.channel.ack(message!);\n }\n });\n }\n\n callback();\n } catch (error) {\n this.logger.error('Failed to connect to RabbitMQ', error);\n }\n }\n\n async close() {\n await this.configs.channel.close();\n await this.configs.connection.close();\n this.logger.log('RabbitMQ connection closed.');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n on(_event: string, _callback: Function) {\n throw new NotImplementedException();\n }\n\n unwrap<T = never>(): T {\n throw new NotImplementedException();\n }\n}\n"],"names":["MultiQueueRabbitMQServer","
|
|
1
|
+
{"version":3,"sources":["../../../src/configs/multi-queue-rabbitmq-server.ts"],"sourcesContent":["import { type CustomTransportStrategy, Server } from '@nestjs/microservices';\nimport { Logger, NotImplementedException } from '@nestjs/common';\nimport { type Channel, type ChannelModel, connect } from 'amqplib';\nimport { ConfigService } from '@nestjs/config';\n\nexport interface MultiQueueOptions {\n connection: ChannelModel | string;\n queues: string[];\n channel?: Channel;\n}\n\n/**\n * the final configs after resolving the provided options\n */\nexport interface MultiQueueConfigs extends Omit<\n Required<MultiQueueOptions>,\n 'connection'\n> {\n connection: ChannelModel;\n}\n\n/**\n * a custom RabbitMQ transport that creates multiple queues in a single channel\n * https://docs.nestjs.com/microservices/custom-transport\n */\n// todo: options: channel, queues[], method= sendToQueue|publish, logLevel=dev?info:log\n\nexport class MultiQueueRabbitMQServer\n extends Server\n implements CustomTransportStrategy\n{\n protected readonly logger = new Logger(MultiQueueRabbitMQServer.name);\n // todo: pass options in the constructor using DI token\n private options: MultiQueueOptions;\n private _configs: MultiQueueConfigs;\n\n constructor(private readonly configService: ConfigService) {\n super();\n\n this.options = {\n queues: [\n // holds messages about creating and updating assets such as users, vehicles\n 'assets',\n // holds authentication messages\n 'auth',\n // holds messages about maps calculations\n 'maps',\n // holds messages about orders updates, such as `orders.received`\n 'orders',\n ],\n // `MICROSERVICE_URLS` is multiple space-separated urls separated\n connection: this.configService\n .get<string>('MICROSERVICE_URLS', 'amqp://localhost:5672')\n .split(' ')[0],\n };\n }\n\n get configs() {\n return this._configs;\n }\n\n async listen(callback: () => void) {\n try {\n let connection =\n typeof this.options.connection === 'string'\n ? await connect(this.options.connection)\n : this.options.connection;\n\n this._configs = {\n ...this.options,\n connection,\n channel: this.options.channel || (await connection.createChannel()),\n };\n\n this.logger.log('Successfully connected to RabbitMQ.');\n\n for (let queue of this.options.queues) {\n await this.configs.channel.assertQueue(queue, { durable: true });\n this.logger.log(`Listening on queue: ${queue}`);\n\n await this.configs.channel.consume(queue, (message) => {\n let content = message?.content.toString();\n\n if (content) {\n let { pattern, data } = JSON.parse(content);\n let handler = this.messageHandlers.get(pattern);\n\n if (handler) {\n void handler(data).then((res) => {\n if (message?.properties?.replyTo) {\n // ✅ Check if replyTo exists\n this.configs.channel.sendToQueue(\n message.properties.replyTo,\n Buffer.from(JSON.stringify(res)),\n {\n correlationId: message.properties.correlationId,\n },\n );\n } else {\n this.logger.warn(\n `No replyTo queue specified for pattern: ${pattern}`,\n );\n }\n });\n } else {\n this.logger.warn(`No handler found for pattern: ${pattern}`);\n }\n\n this.configs.channel.ack(message!);\n }\n });\n }\n\n callback();\n } catch (error) {\n this.logger.error('Failed to connect to RabbitMQ', error);\n }\n }\n\n async close() {\n await this.configs.channel.close();\n await this.configs.connection.close();\n this.logger.log('RabbitMQ connection closed.');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n on(_event: string, _callback: Function) {\n throw new NotImplementedException();\n }\n\n unwrap<T = never>(): T {\n throw new NotImplementedException();\n }\n}\n"],"names":["Server","Logger","NotImplementedException","connect","MultiQueueRabbitMQServer","configService","logger","name","options","queues","connection","get","split","configs","_configs","listen","callback","channel","createChannel","log","queue","assertQueue","durable","consume","message","content","toString","pattern","data","JSON","parse","handler","messageHandlers","then","res","properties","replyTo","sendToQueue","Buffer","from","stringify","correlationId","warn","ack","error","close","on","_event","_callback","unwrap"],"mappings":"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"}
|
|
@@ -1,14 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "redisConnfig", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return redisConnfig;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const redisConnfig = {
|
|
1
|
+
export const redisConnfig = {
|
|
12
2
|
port: Number.parseInt(process.env.REDIS_PORT || '6379', 10),
|
|
13
3
|
redisUrl: process.env.REDIS_URL || 'redis://redis'
|
|
14
4
|
};
|