@rsdk/http.server 6.0.0-next.10 → 6.0.0-next.12

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.
@@ -1,3 +1,3 @@
1
1
  export * from './http-errors.formatter';
2
2
  export * from './http-errors.sender';
3
- export * from './http-errors.transformer';
3
+ export * from './route-not-found.filter';
@@ -16,5 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./http-errors.formatter"), exports);
18
18
  __exportStar(require("./http-errors.sender"), exports);
19
- __exportStar(require("./http-errors.transformer"), exports);
19
+ __exportStar(require("./route-not-found.filter"), exports);
20
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error-handling/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,uDAAqC;AACrC,4DAA0C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/error-handling/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,uDAAqC;AACrC,2DAAyC"}
@@ -0,0 +1,19 @@
1
+ import { ArgumentsHost, ExceptionFilter, NotFoundException as NestNotFoundException } from '@nestjs/common';
2
+ import { ILogger } from '@rsdk/logging';
3
+ import { Observable } from 'rxjs';
4
+ /**
5
+ * Специализированный фильтр для обработки ошибок NotFound.
6
+ * Имеет более высокий приоритет, чем GlobalExceptionsFilter,
7
+ * т. к. задуман для перехвата только NotFoundException. Её выбрасывает
8
+ * nest, когда не находит маршрут.
9
+ *
10
+ * К сожалению, эти ошибки не попадают в интерцепторы и, соответственно,
11
+ * приходится обрабатывать их вот так отдельно.
12
+ */
13
+ export declare class RouteNotFoundFilter implements ExceptionFilter {
14
+ private readonly logger;
15
+ private readonly formatter;
16
+ private readonly sender;
17
+ constructor(logger: ILogger);
18
+ catch(exception: NestNotFoundException, host: ArgumentsHost): Observable<any>;
19
+ }
@@ -0,0 +1,52 @@
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 __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RouteNotFoundFilter = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@rsdk/core");
18
+ const http_errors_formatter_1 = require("./http-errors.formatter");
19
+ const http_errors_sender_1 = require("./http-errors.sender");
20
+ /**
21
+ * Специализированный фильтр для обработки ошибок NotFound.
22
+ * Имеет более высокий приоритет, чем GlobalExceptionsFilter,
23
+ * т. к. задуман для перехвата только NotFoundException. Её выбрасывает
24
+ * nest, когда не находит маршрут.
25
+ *
26
+ * К сожалению, эти ошибки не попадают в интерцепторы и, соответственно,
27
+ * приходится обрабатывать их вот так отдельно.
28
+ */
29
+ let RouteNotFoundFilter = class RouteNotFoundFilter {
30
+ logger;
31
+ formatter = new http_errors_formatter_1.HttpErrorsFormatter();
32
+ sender = new http_errors_sender_1.HttpErrorsSender();
33
+ constructor(logger) {
34
+ this.logger = logger;
35
+ }
36
+ catch(exception, host) {
37
+ const ctx = host.switchToHttp();
38
+ const { method, path } = ctx.getRequest();
39
+ const pipelineEx = new core_1.NotFoundException(exception.message);
40
+ // Логируем ошибку со всеми деталями
41
+ this.logger.error(`Route not found [HTTP] ${method} ${path}`);
42
+ const formattedEx = this.formatter.format(pipelineEx);
43
+ return this.sender.send(host, formattedEx);
44
+ }
45
+ };
46
+ exports.RouteNotFoundFilter = RouteNotFoundFilter;
47
+ exports.RouteNotFoundFilter = RouteNotFoundFilter = __decorate([
48
+ (0, common_1.Catch)(common_1.NotFoundException),
49
+ __param(0, (0, core_1.InjectLogger)(RouteNotFoundFilter)),
50
+ __metadata("design:paramtypes", [Object])
51
+ ], RouteNotFoundFilter);
52
+ //# sourceMappingURL=route-not-found.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-not-found.filter.js","sourceRoot":"","sources":["../../src/error-handling/route-not-found.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAKwB;AACxB,qCAA6D;AAI7D,mEAA8D;AAC9D,6DAAwD;AAExD;;;;;;;;GAQG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAKwB;IAJrC,SAAS,GAAG,IAAI,2CAAmB,EAAE,CAAC;IACtC,MAAM,GAAG,IAAI,qCAAgB,EAAE,CAAC;IAEjD,YACsD,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAClE,CAAC;IAEJ,KAAK,CACH,SAAgC,EAChC,IAAmB;QAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;QAE1C,MAAM,UAAU,GAAG,IAAI,wBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAE5D,oCAAoC;QACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;CACF,CAAA;AAxBY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,cAAK,EAAC,0BAAqB,CAAC;IAMxB,WAAA,IAAA,mBAAY,EAAC,mBAAmB,CAAC,CAAA;;GALzB,mBAAmB,CAwB/B"}
@@ -1,9 +1,9 @@
1
1
  import { type ExecutionContext } from '@nestjs/common';
2
2
  import type { Controller, INestApplication } from '@nestjs/common/interfaces';
3
3
  import type { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface';
4
- import type { AbstractHttpAdapter } from '@nestjs/core';
4
+ import { type AbstractHttpAdapter } from '@nestjs/core';
5
5
  import type { Constructor, DeepPartial } from '@rsdk/common';
6
- import type { ConfigContext, GenericHeaders, HttpOptions, IErrorsFormatter, IErrorsSender, IErrorsTransformer, IHttpTransport, LogFormatter, PlatformContext } from '@rsdk/core';
6
+ import type { ConfigContext, GenericHeaders, HttpOptions, IErrorsFormatter, IErrorsSender, IErrorsTransformer, IHttpTransport, LogFormatter, NestModuleDefinitions, PlatformContext } from '@rsdk/core';
7
7
  import type { OpenApiOptions } from '@rsdk/http.openapi';
8
8
  import type { ILogger } from '@rsdk/logging';
9
9
  import { HttpConfig } from './http.config';
@@ -55,6 +55,7 @@ export declare abstract class AbstractHttpTransport implements IHttpTransport {
55
55
  getMetricsController(): Constructor<Controller>;
56
56
  createHttpOptions(configContext: ConfigContext): HttpOptions;
57
57
  createAdapter(configContext: ConfigContext): AbstractHttpAdapter;
58
+ modules(): NestModuleDefinitions;
58
59
  configureApp(app: INestApplication, context: PlatformContext, logger: ILogger): Promise<void>;
59
60
  abstract createHttpAdapter(config: HttpConfig): AbstractHttpAdapter;
60
61
  abstract logFormatter(): LogFormatter;
@@ -2,10 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AbstractHttpTransport = void 0;
4
4
  exports.isFromFile = isFromFile;
5
+ const core_1 = require("@nestjs/core");
5
6
  const swagger_1 = require("@nestjs/swagger");
6
7
  const common_node_1 = require("@rsdk/common.node");
7
- const core_1 = require("@rsdk/core");
8
+ const core_2 = require("@rsdk/core");
8
9
  const http_openapi_1 = require("@rsdk/http.openapi");
10
+ const route_not_found_filter_1 = require("./error-handling/route-not-found.filter");
9
11
  const controllers_1 = require("./controllers");
10
12
  const error_handling_1 = require("./error-handling");
11
13
  const http_config_1 = require("./http.config");
@@ -31,7 +33,7 @@ class AbstractHttpTransport {
31
33
  return new error_handling_1.HttpErrorsSender();
32
34
  }
33
35
  errorTransformers() {
34
- return [new error_handling_1.HttpErrorsTransformer()];
36
+ return [];
35
37
  }
36
38
  getProtocol() {
37
39
  return 'http';
@@ -49,6 +51,15 @@ class AbstractHttpTransport {
49
51
  createAdapter(configContext) {
50
52
  return this.createHttpAdapter(configContext.resolve(http_config_1.HttpConfig));
51
53
  }
54
+ modules() {
55
+ return [
56
+ {
57
+ module: route_not_found_filter_1.RouteNotFoundFilter,
58
+ imports: [],
59
+ providers: [{ provide: core_1.APP_FILTER, useClass: route_not_found_filter_1.RouteNotFoundFilter }],
60
+ },
61
+ ];
62
+ }
52
63
  async configureApp(app, context, logger) {
53
64
  const configContext = await context.getConfigContext();
54
65
  const { swaggerUI } = configContext.resolve(http_config_1.HttpConfig);
@@ -74,9 +85,9 @@ class AbstractHttpTransport {
74
85
  continue;
75
86
  }
76
87
  const document = await new http_openapi_1.OpenApiGenerator(context, {
77
- title: app.get(core_1.APP_NAME),
78
- version: app.get(core_1.APP_VERSION),
79
- description: app.get(core_1.APP_DESCRIPTION),
88
+ title: app.get(core_2.APP_NAME),
89
+ version: app.get(core_2.APP_VERSION),
90
+ description: app.get(core_2.APP_DESCRIPTION),
80
91
  ...config,
81
92
  }).generate();
82
93
  swagger_1.SwaggerModule.setup(url, app, document);
@@ -1 +1 @@
1
- {"version":3,"file":"http.transport.js","sourceRoot":"","sources":["../src/http.transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.transport.js","sourceRoot":"","sources":["../src/http.transport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdk/http.server",
3
- "version": "6.0.0-next.10",
3
+ "version": "6.0.0-next.12",
4
4
  "description": "HTTP transport for rsdk apps (needs some of HTTP adapters)",
5
5
  "license": "Apache License 2.0",
6
6
  "publishConfig": {
@@ -26,5 +26,5 @@
26
26
  "reflect-metadata": "^0.1.12 || ^0.2.0",
27
27
  "rxjs": "^7.8.1"
28
28
  },
29
- "gitHead": "26c1a04480e6209098be6636afbde7fd357da61a"
29
+ "gitHead": "5d940f876c6b8c86c80835e49f8d26b7384f5b53"
30
30
  }
@@ -1,3 +1,3 @@
1
1
  export * from './http-errors.formatter';
2
2
  export * from './http-errors.sender';
3
- export * from './http-errors.transformer';
3
+ export * from './route-not-found.filter';
@@ -0,0 +1,48 @@
1
+ import {
2
+ ArgumentsHost,
3
+ Catch,
4
+ ExceptionFilter,
5
+ NotFoundException as NestNotFoundException,
6
+ } from '@nestjs/common';
7
+ import { InjectLogger, NotFoundException } from '@rsdk/core';
8
+ import { ILogger } from '@rsdk/logging';
9
+ import { Observable } from 'rxjs';
10
+
11
+ import { HttpErrorsFormatter } from './http-errors.formatter';
12
+ import { HttpErrorsSender } from './http-errors.sender';
13
+
14
+ /**
15
+ * Специализированный фильтр для обработки ошибок NotFound.
16
+ * Имеет более высокий приоритет, чем GlobalExceptionsFilter,
17
+ * т. к. задуман для перехвата только NotFoundException. Её выбрасывает
18
+ * nest, когда не находит маршрут.
19
+ *
20
+ * К сожалению, эти ошибки не попадают в интерцепторы и, соответственно,
21
+ * приходится обрабатывать их вот так отдельно.
22
+ */
23
+ @Catch(NestNotFoundException)
24
+ export class RouteNotFoundFilter implements ExceptionFilter {
25
+ private readonly formatter = new HttpErrorsFormatter();
26
+ private readonly sender = new HttpErrorsSender();
27
+
28
+ constructor(
29
+ @InjectLogger(RouteNotFoundFilter) private readonly logger: ILogger,
30
+ ) {}
31
+
32
+ catch(
33
+ exception: NestNotFoundException,
34
+ host: ArgumentsHost,
35
+ ): Observable<any> {
36
+ const ctx = host.switchToHttp();
37
+ const { method, path } = ctx.getRequest();
38
+
39
+ const pipelineEx = new NotFoundException(exception.message);
40
+
41
+ // Логируем ошибку со всеми деталями
42
+ this.logger.error(`Route not found [HTTP] ${method} ${path}`);
43
+
44
+ const formattedEx = this.formatter.format(pipelineEx);
45
+
46
+ return this.sender.send(host, formattedEx);
47
+ }
48
+ }
@@ -1,7 +1,7 @@
1
1
  import { type ExecutionContext } from '@nestjs/common';
2
2
  import type { Controller, INestApplication } from '@nestjs/common/interfaces';
3
3
  import type { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface';
4
- import type { AbstractHttpAdapter } from '@nestjs/core';
4
+ import { type AbstractHttpAdapter, APP_FILTER } from '@nestjs/core';
5
5
  import type { OpenAPIObject } from '@nestjs/swagger';
6
6
  import { SwaggerModule } from '@nestjs/swagger';
7
7
  import type { Constructor, DeepPartial } from '@rsdk/common';
@@ -15,6 +15,7 @@ import type {
15
15
  IErrorsTransformer,
16
16
  IHttpTransport,
17
17
  LogFormatter,
18
+ NestModuleDefinitions,
18
19
  PlatformContext,
19
20
  } from '@rsdk/core';
20
21
  import { APP_DESCRIPTION, APP_NAME, APP_VERSION } from '@rsdk/core';
@@ -23,12 +24,9 @@ import { OpenApiGenerator } from '@rsdk/http.openapi';
23
24
  import type { ILogger } from '@rsdk/logging';
24
25
  import _ from 'lodash';
25
26
 
27
+ import { RouteNotFoundFilter } from './error-handling/route-not-found.filter';
26
28
  import { HealthHttpController, MetricsHttpController } from './controllers';
27
- import {
28
- HttpErrorsFormatter,
29
- HttpErrorsSender,
30
- HttpErrorsTransformer,
31
- } from './error-handling';
29
+ import { HttpErrorsFormatter, HttpErrorsSender } from './error-handling';
32
30
  import { HttpConfig } from './http.config';
33
31
  import { HttpHeaders } from './http.headers';
34
32
 
@@ -94,7 +92,7 @@ export abstract class AbstractHttpTransport implements IHttpTransport {
94
92
  }
95
93
 
96
94
  errorTransformers(): IErrorsTransformer[] {
97
- return [new HttpErrorsTransformer()];
95
+ return [];
98
96
  }
99
97
 
100
98
  getProtocol(): string {
@@ -119,6 +117,16 @@ export abstract class AbstractHttpTransport implements IHttpTransport {
119
117
  return this.createHttpAdapter(configContext.resolve(HttpConfig));
120
118
  }
121
119
 
120
+ modules(): NestModuleDefinitions {
121
+ return [
122
+ {
123
+ module: RouteNotFoundFilter,
124
+ imports: [],
125
+ providers: [{ provide: APP_FILTER, useClass: RouteNotFoundFilter }],
126
+ },
127
+ ];
128
+ }
129
+
122
130
  async configureApp(
123
131
  app: INestApplication,
124
132
  context: PlatformContext,
@@ -1,5 +0,0 @@
1
- import type { IErrorsTransformer, PipelineException } from '@rsdk/core';
2
- export declare class HttpErrorsTransformer implements IErrorsTransformer {
3
- match(ex: any): boolean;
4
- transform(ex: any): PipelineException;
5
- }
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HttpErrorsTransformer = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const core_1 = require("@rsdk/core");
6
- class HttpErrorsTransformer {
7
- match(ex) {
8
- return ex instanceof common_1.NotFoundException;
9
- }
10
- transform(ex) {
11
- const err = new core_1.NotFoundException(ex.message);
12
- err.stack = ex.stack;
13
- return err;
14
- }
15
- }
16
- exports.HttpErrorsTransformer = HttpErrorsTransformer;
17
- //# sourceMappingURL=http-errors.transformer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-errors.transformer.js","sourceRoot":"","sources":["../../src/error-handling/http-errors.transformer.ts"],"names":[],"mappings":";;;AAAA,2CAA4E;AAE5E,qCAA+C;AAE/C,MAAa,qBAAqB;IAChC,KAAK,CAAC,EAAO;QACX,OAAO,EAAE,YAAY,0BAAqB,CAAC;IAC7C,CAAC;IAED,SAAS,CAAC,EAAO;QACf,MAAM,GAAG,GAAG,IAAI,wBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QAE9C,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;QAErB,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAZD,sDAYC"}
@@ -1,17 +0,0 @@
1
- import { NotFoundException as NestNotFoundException } from '@nestjs/common';
2
- import type { IErrorsTransformer, PipelineException } from '@rsdk/core';
3
- import { NotFoundException } from '@rsdk/core';
4
-
5
- export class HttpErrorsTransformer implements IErrorsTransformer {
6
- match(ex: any): boolean {
7
- return ex instanceof NestNotFoundException;
8
- }
9
-
10
- transform(ex: any): PipelineException {
11
- const err = new NotFoundException(ex.message);
12
-
13
- err.stack = ex.stack;
14
-
15
- return err;
16
- }
17
- }