@rsdk/grpc.server 2.6.0-next.12 → 2.6.0-next.14

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/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [2.6.0-next.14](https://github.com/R-Vision/rsdk/compare/v2.6.0-next.13...v2.6.0-next.14) (2023-08-03)
7
+
8
+ ### Features
9
+
10
+ * **grpc.clients:** grpc rich error ([#85](https://github.com/R-Vision/rsdk/issues/85)) ([be99f40](https://github.com/R-Vision/rsdk/commit/be99f408295bf1750f6f0c39e067cca971d973e3))
11
+
12
+ # [2.6.0-next.13](https://github.com/R-Vision/rsdk/compare/v2.6.0-next.12...v2.6.0-next.13) (2023-08-01)
13
+
14
+ **Note:** Version bump only for package @rsdk/grpc.server
15
+
6
16
  # [2.6.0-next.12](https://github.com/R-Vision/rsdk/compare/v2.6.0-next.11...v2.6.0-next.12) (2023-07-28)
7
17
 
8
18
  **Note:** Version bump only for package @rsdk/grpc.server
@@ -1,12 +1,10 @@
1
1
  import type { ArgumentsHost } from '@nestjs/common';
2
2
  import type { IErrorsFormatter } from '@rsdk/core';
3
- interface FormattedGrpcError {
4
- code: number;
5
- details: string;
6
- }
3
+ import { ExceptionKind } from '@rsdk/core';
4
+ import type { FormattedGrpcError } from './types';
7
5
  export declare class GrpcErrorsFormatter implements IErrorsFormatter {
6
+ static readonly defaultKind = ExceptionKind.UNKNOWN;
8
7
  private readonly statusMap;
9
8
  match(host: ArgumentsHost): boolean;
10
9
  format(ex: unknown): FormattedGrpcError;
11
10
  }
12
- export {};
@@ -27,6 +27,7 @@ exports.GrpcErrorsFormatter = void 0;
27
27
  const grpc = __importStar(require("@grpc/grpc-js"));
28
28
  const core_1 = require("@rsdk/core");
29
29
  class GrpcErrorsFormatter {
30
+ static defaultKind = core_1.ExceptionKind.UNKNOWN;
30
31
  statusMap = {
31
32
  [core_1.ExceptionKind.AUTHENTICATION]: grpc.status.UNAUTHENTICATED,
32
33
  [core_1.ExceptionKind.NOT_ALLOWED]: grpc.status.PERMISSION_DENIED,
@@ -44,15 +45,21 @@ class GrpcErrorsFormatter {
44
45
  }
45
46
  format(ex) {
46
47
  if (ex instanceof core_1.PipelineException) {
47
- const details = [ex.message, ...core_1.PipelineException.innerMessages(ex)].join(': ');
48
+ const message = [ex.message, ...core_1.PipelineException.innerMessages(ex)].join(': ');
48
49
  return {
49
50
  code: this.statusMap[ex.kind],
50
- details,
51
+ message,
52
+ details: ex.details,
53
+ kind: ex.kind,
54
+ rsdkCode: ex.code.toString(),
51
55
  };
52
56
  }
53
57
  return {
54
- code: this.statusMap[core_1.ExceptionKind.UNKNOWN],
55
- details: ex.message ?? 'UNKNOWN ERROR',
58
+ code: this.statusMap[GrpcErrorsFormatter.defaultKind],
59
+ message: ex?.message ?? 'UNKNOWN ERROR',
60
+ details: ex?.details,
61
+ kind: ex?.kind ?? GrpcErrorsFormatter.defaultKind,
62
+ rsdkCode: ex?.code?.toString(),
56
63
  };
57
64
  }
58
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"grpc-errors.formatter.js","sourceRoot":"","sources":["../src/grpc-errors.formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAsC;AAGtC,qCAA8D;AAQ9D,MAAa,mBAAmB;IACb,SAAS,GAAuC;QAC/D,CAAC,oBAAa,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;QAC3D,CAAC,oBAAa,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAC1D,CAAC,oBAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;QACzD,CAAC,oBAAa,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACnD,CAAC,oBAAa,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;QACtD,CAAC,oBAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;QAC9C,CAAC,oBAAa,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;QACvD,CAAC,oBAAa,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;QAChD,CAAC,oBAAa,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;QACpD,CAAC,oBAAa,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;KAC7C,CAAC;IAEF,KAAK,CAAC,IAAmB;QACvB,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,EAAW;QAChB,IAAI,EAAE,YAAY,wBAAiB,EAAE;YACnC,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,wBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACvE,IAAI,CACL,CAAC;YAEF,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC7B,OAAO;aACR,CAAC;SACH;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAa,CAAC,OAAO,CAAC;YAC3C,OAAO,EAAG,EAAU,CAAC,OAAO,IAAI,eAAe;SAChD,CAAC;IACJ,CAAC;CACF;AAnCD,kDAmCC"}
1
+ {"version":3,"file":"grpc-errors.formatter.js","sourceRoot":"","sources":["../src/grpc-errors.formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAsC;AAGtC,qCAA8D;AAI9D,MAAa,mBAAmB;IAC9B,MAAM,CAAU,WAAW,GAAG,oBAAa,CAAC,OAAO,CAAC;IACnC,SAAS,GAAuC;QAC/D,CAAC,oBAAa,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;QAC3D,CAAC,oBAAa,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;QAC1D,CAAC,oBAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB;QACzD,CAAC,oBAAa,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;QACnD,CAAC,oBAAa,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;QACtD,CAAC,oBAAa,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;QAC9C,CAAC,oBAAa,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;QACvD,CAAC,oBAAa,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;QAChD,CAAC,oBAAa,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;QACpD,CAAC,oBAAa,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;KAC7C,CAAC;IAEF,KAAK,CAAC,IAAmB;QACvB,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,EAAW;QAChB,IAAI,EAAE,YAAY,wBAAiB,EAAE;YACnC,MAAM,OAAO,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,wBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CACvE,IAAI,CACL,CAAC;YAEF,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;gBAC7B,OAAO;gBACP,OAAO,EAAE,EAAE,CAAC,OAAO;gBACnB,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;aAC7B,CAAC;SACH;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;YACrD,OAAO,EAAG,EAAU,EAAE,OAAO,IAAI,eAAe;YAChD,OAAO,EAAG,EAAU,EAAE,OAAO;YAC7B,IAAI,EAAG,EAAU,EAAE,IAAI,IAAI,mBAAmB,CAAC,WAAW;YAC1D,QAAQ,EAAG,EAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;SACxC,CAAC;IACJ,CAAC;;AAzCH,kDA0CC"}
@@ -0,0 +1,8 @@
1
+ import type { ArgumentsHost } from '@nestjs/common';
2
+ import type { IErrorsSender } from '@rsdk/core';
3
+ import type { EMPTY, Observable } from 'rxjs';
4
+ import type { FormattedGrpcError } from './types';
5
+ export declare class GrpcErrorsSender implements IErrorsSender {
6
+ match(host: ArgumentsHost): boolean;
7
+ send(_host: ArgumentsHost, ex: FormattedGrpcError): Observable<any> | typeof EMPTY;
8
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GrpcErrorsSender = void 0;
4
+ const grpc_error_v1_1 = require("@rsdk/builtin-contract/dist/grpc.error.v1");
5
+ const nice_grpc_1 = require("nice-grpc");
6
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
7
+ // @ts-ignore потому что не добавили в тайпинги...
8
+ const convertMetadata_1 = require("nice-grpc/lib/utils/convertMetadata");
9
+ const rxjs_1 = require("rxjs");
10
+ class GrpcErrorsSender {
11
+ match(host) {
12
+ return host.getType() === 'rpc';
13
+ }
14
+ send(_host, ex) {
15
+ const niceGrpcMetadata = (0, nice_grpc_1.Metadata)();
16
+ const status = grpc_error_v1_1.Status.fromPartial({
17
+ code: ex.code,
18
+ details: ex.details,
19
+ message: ex.message,
20
+ });
21
+ niceGrpcMetadata.set('grpc-status-details-bin', grpc_error_v1_1.Status.encode(status).finish());
22
+ const error = {
23
+ code: ex.code,
24
+ details: ex.details,
25
+ metadata: (0, convertMetadata_1.convertMetadataToGrpcJs)(niceGrpcMetadata),
26
+ };
27
+ return (0, rxjs_1.throwError)(() => error);
28
+ }
29
+ }
30
+ exports.GrpcErrorsSender = GrpcErrorsSender;
31
+ //# sourceMappingURL=grpc-errors.sender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-errors.sender.js","sourceRoot":"","sources":["../src/grpc-errors.sender.ts"],"names":[],"mappings":";;;AACA,6EAAmE;AAEnE,yCAAyD;AACzD,6DAA6D;AAC7D,kDAAkD;AAClD,yEAA8E;AAE9E,+BAAkC;AAIlC,MAAa,gBAAgB;IAC3B,KAAK,CAAC,IAAmB;QACvB,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,CACF,KAAoB,EACpB,EAAsB;QAEtB,MAAM,gBAAgB,GAAG,IAAA,oBAAgB,GAAE,CAAC;QAE5C,MAAM,MAAM,GAAG,sBAAM,CAAC,WAAW,CAAC;YAChC,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,OAAO,EAAE,EAAE,CAAC,OAAO;SACpB,CAAC,CAAC;QAEH,gBAAgB,CAAC,GAAG,CAClB,yBAAyB,EACzB,sBAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAC/B,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,QAAQ,EAAE,IAAA,yCAAuB,EAAC,gBAAgB,CAAC;SACpD,CAAC;QAEF,OAAO,IAAA,iBAAU,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;CACF;AA7BD,4CA6BC"}
@@ -1,7 +1,7 @@
1
1
  import type { Controller } from '@nestjs/common/interfaces';
2
2
  import type { MicroserviceOptions } from '@nestjs/microservices';
3
3
  import type { Constructor } from '@rsdk/common';
4
- import type { ConfigContext, IErrorsFormatter, IErrorsTransformer, IMicroserviceTransport } from '@rsdk/core';
4
+ import type { ConfigContext, IErrorsFormatter, IErrorsSender, IErrorsTransformer, IMicroserviceTransport } from '@rsdk/core';
5
5
  import type { Package } from '@rsdk/grpc.loader';
6
6
  export declare class GrpcTransport implements IMicroserviceTransport {
7
7
  private readonly logger;
@@ -13,6 +13,7 @@ export declare class GrpcTransport implements IMicroserviceTransport {
13
13
  constructor(...packages: Package[]);
14
14
  getProtocol(): string;
15
15
  getErrorsFormatter(): IErrorsFormatter;
16
+ getErrorsSender(): IErrorsSender;
16
17
  getErrorTransformers(): IErrorsTransformer[];
17
18
  getMetricsController(): Constructor<Controller>;
18
19
  getHealthController(): Constructor<Controller>;
@@ -12,6 +12,7 @@ const logging_1 = require("@rsdk/logging");
12
12
  const controllers_1 = require("./controllers");
13
13
  const grpc_config_1 = require("./grpc.config");
14
14
  const grpc_errors_formatter_1 = require("./grpc-errors.formatter");
15
+ const grpc_errors_sender_1 = require("./grpc-errors.sender");
15
16
  class GrpcTransport {
16
17
  logger = logging_1.LoggerFactory.create(GrpcTransport);
17
18
  packages;
@@ -28,6 +29,9 @@ class GrpcTransport {
28
29
  getErrorsFormatter() {
29
30
  return new grpc_errors_formatter_1.GrpcErrorsFormatter();
30
31
  }
32
+ getErrorsSender() {
33
+ return new grpc_errors_sender_1.GrpcErrorsSender();
34
+ }
31
35
  getErrorTransformers() {
32
36
  return [];
33
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"grpc.transport.js","sourceRoot":"","sources":["../src/grpc.transport.ts"],"names":[],"mappings":";;;;;;AAEA,gGAA2E;AAC3E,kGAA6E;AAQ7E,qCAA+C;AAE/C,mDAAsD;AACtD,2CAA8C;AAE9C,+CAAoE;AACpE,+CAA2C;AAC3C,mEAA8D;AAE9D,MAAa,aAAa;IACP,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7C,QAAQ,CAAY;IAE7B,OAAO,CAAU;IACjB,OAAO,CAAU;IACjB,OAAO,CAAU;IAEjB,aAAa,GAAG,KAAK,CAAC;IAE9B,YAAY,GAAG,QAAmB;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,2CAAmB,EAAE,CAAC;IACnC,CAAC;IAED,oBAAoB;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oBAAoB;QAClB,OAAO,+BAAiB,CAAC;IAC3B,CAAC;IAED,mBAAmB;QACjB,OAAO,8BAAgB,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,aAA4B;QAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,wBAAU,CAAC,CAAC;QAExE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,yBAAyB;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAiB,CAAC,IAAI,CAAC,EAAE;YAC5D,QAAQ,CAAC,IAAI,CAAC,wBAAiB,CAAC,CAAC;SAClC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAkB,CAAC,IAAI,CAAC,EAAE;YAC7D,QAAQ,CAAC,IAAI,CAAC,yBAAkB,CAAC,CAAC;SACnC;QAED,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE;gBAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;aACjE;SACF;QAED,OAAO,IAAA,+BAAiB,EAAC,QAAQ,EAAE;YACjC,0BAA0B;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAQ;YACtB,OAAO,EAAE,IAAI,CAAC,OAAQ;YACtB,OAAO,EAAE,IAAI,CAAC,OAAQ;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,MAAM,IAAI,wBAAiB,CAAC,sCAAsC,CAAC,CAAC;SACrE;IACH,CAAC;CACF;AArFD,sCAqFC"}
1
+ {"version":3,"file":"grpc.transport.js","sourceRoot":"","sources":["../src/grpc.transport.ts"],"names":[],"mappings":";;;;;;AAEA,gGAA2E;AAC3E,kGAA6E;AAS7E,qCAA+C;AAE/C,mDAAsD;AACtD,2CAA8C;AAE9C,+CAAoE;AACpE,+CAA2C;AAC3C,mEAA8D;AAC9D,6DAAwD;AAExD,MAAa,aAAa;IACP,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7C,QAAQ,CAAY;IAE7B,OAAO,CAAU;IACjB,OAAO,CAAU;IACjB,OAAO,CAAU;IAEjB,aAAa,GAAG,KAAK,CAAC;IAE9B,YAAY,GAAG,QAAmB;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,WAAW;QACT,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,2CAAmB,EAAE,CAAC;IACnC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,qCAAgB,EAAE,CAAC;IAChC,CAAC;IAED,oBAAoB;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,oBAAoB;QAClB,OAAO,+BAAiB,CAAC;IAC3B,CAAC;IAED,mBAAmB;QACjB,OAAO,8BAAgB,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,aAA4B;QAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,wBAAU,CAAC,CAAC;QAExE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,yBAAyB;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,wBAAiB,CAAC,IAAI,CAAC,EAAE;YAC5D,QAAQ,CAAC,IAAI,CAAC,wBAAiB,CAAC,CAAC;SAClC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,yBAAkB,CAAC,IAAI,CAAC,EAAE;YAC7D,QAAQ,CAAC,IAAI,CAAC,yBAAkB,CAAC,CAAC;SACnC;QAED,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;YAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE;gBAC7D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;aACjE;SACF;QAED,OAAO,IAAA,+BAAiB,EAAC,QAAQ,EAAE;YACjC,0BAA0B;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAQ;YACtB,OAAO,EAAE,IAAI,CAAC,OAAQ;YACtB,OAAO,EAAE,IAAI,CAAC,OAAQ;SACvB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACvB,MAAM,IAAI,wBAAiB,CAAC,sCAAsC,CAAC,CAAC;SACrE;IACH,CAAC;CACF;AAzFD,sCAyFC"}
@@ -0,0 +1,8 @@
1
+ import type { ExceptionKind } from '@rsdk/core';
2
+ export interface FormattedGrpcError {
3
+ code: number;
4
+ message: string;
5
+ details: any;
6
+ kind: ExceptionKind;
7
+ rsdkCode: string;
8
+ }
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdk/grpc.server",
3
- "version": "2.6.0-next.12",
3
+ "version": "2.6.0-next.14",
4
4
  "description": "Grpc transport for platform, clients and common grpc stuff",
5
5
  "license": "Apache License 2.0",
6
6
  "publishConfig": {
@@ -17,15 +17,15 @@
17
17
  "@grpc/grpc-js": "^1.8.8",
18
18
  "@nestjs/common": "^9.0.0",
19
19
  "@nestjs/microservices": "^9.0.0",
20
- "@rsdk/builtin-contract": "^2.6.0-next.5",
21
- "@rsdk/common": "^2.6.0-next.12",
22
- "@rsdk/core": "^2.6.0-next.12",
23
- "@rsdk/grpc.common": "^2.6.0-next.12",
20
+ "@rsdk/builtin-contract": "^2.6.0-next.14",
21
+ "@rsdk/common": "^2.6.0-next.13",
22
+ "@rsdk/core": "^2.6.0-next.13",
23
+ "@rsdk/grpc.common": "^2.6.0-next.13",
24
24
  "@rsdk/grpc.loader": "^2.4.2",
25
- "@rsdk/logging": "^2.6.0-next.12",
25
+ "@rsdk/logging": "^2.6.0-next.13",
26
26
  "nice-grpc": "^2.1.4",
27
27
  "nice-grpc-opentelemetry": "^0.1.3",
28
28
  "rxjs": "^7.0.0"
29
29
  },
30
- "gitHead": "aab7d53b4eb7873285c36c927c71b0d45d007554"
30
+ "gitHead": "d233dca2ccb88a31a2bb23990fe78553122e6166"
31
31
  }
@@ -3,13 +3,10 @@ import type { ArgumentsHost } from '@nestjs/common';
3
3
  import type { IErrorsFormatter } from '@rsdk/core';
4
4
  import { ExceptionKind, PipelineException } from '@rsdk/core';
5
5
 
6
- // Reverse engineered from @grpc/grpc-js source code
7
- interface FormattedGrpcError {
8
- code: number;
9
- details: string;
10
- }
6
+ import type { FormattedGrpcError } from './types';
11
7
 
12
8
  export class GrpcErrorsFormatter implements IErrorsFormatter {
9
+ static readonly defaultKind = ExceptionKind.UNKNOWN;
13
10
  private readonly statusMap: Record<ExceptionKind, grpc.status> = {
14
11
  [ExceptionKind.AUTHENTICATION]: grpc.status.UNAUTHENTICATED,
15
12
  [ExceptionKind.NOT_ALLOWED]: grpc.status.PERMISSION_DENIED,
@@ -29,19 +26,25 @@ export class GrpcErrorsFormatter implements IErrorsFormatter {
29
26
 
30
27
  format(ex: unknown): FormattedGrpcError {
31
28
  if (ex instanceof PipelineException) {
32
- const details = [ex.message, ...PipelineException.innerMessages(ex)].join(
29
+ const message = [ex.message, ...PipelineException.innerMessages(ex)].join(
33
30
  ': ',
34
31
  );
35
32
 
36
33
  return {
37
34
  code: this.statusMap[ex.kind],
38
- details,
35
+ message,
36
+ details: ex.details,
37
+ kind: ex.kind,
38
+ rsdkCode: ex.code.toString(),
39
39
  };
40
40
  }
41
41
 
42
42
  return {
43
- code: this.statusMap[ExceptionKind.UNKNOWN],
44
- details: (ex as any).message ?? 'UNKNOWN ERROR',
43
+ code: this.statusMap[GrpcErrorsFormatter.defaultKind],
44
+ message: (ex as any)?.message ?? 'UNKNOWN ERROR',
45
+ details: (ex as any)?.details,
46
+ kind: (ex as any)?.kind ?? GrpcErrorsFormatter.defaultKind,
47
+ rsdkCode: (ex as any)?.code?.toString(),
45
48
  };
46
49
  }
47
50
  }
@@ -0,0 +1,42 @@
1
+ import type { ArgumentsHost } from '@nestjs/common';
2
+ import { Status } from '@rsdk/builtin-contract/dist/grpc.error.v1';
3
+ import type { IErrorsSender } from '@rsdk/core';
4
+ import { Metadata as NiceGrpcMetadata } from 'nice-grpc';
5
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
6
+ // @ts-ignore потому что не добавили в тайпинги...
7
+ import { convertMetadataToGrpcJs } from 'nice-grpc/lib/utils/convertMetadata';
8
+ import type { EMPTY, Observable } from 'rxjs';
9
+ import { throwError } from 'rxjs';
10
+
11
+ import type { FormattedGrpcError } from './types';
12
+
13
+ export class GrpcErrorsSender implements IErrorsSender {
14
+ match(host: ArgumentsHost): boolean {
15
+ return host.getType() === 'rpc';
16
+ }
17
+
18
+ send(
19
+ _host: ArgumentsHost,
20
+ ex: FormattedGrpcError,
21
+ ): Observable<any> | typeof EMPTY {
22
+ const niceGrpcMetadata = NiceGrpcMetadata();
23
+
24
+ const status = Status.fromPartial({
25
+ code: ex.code,
26
+ details: ex.details,
27
+ message: ex.message,
28
+ });
29
+
30
+ niceGrpcMetadata.set(
31
+ 'grpc-status-details-bin',
32
+ Status.encode(status).finish(),
33
+ );
34
+ const error = {
35
+ code: ex.code,
36
+ details: ex.details,
37
+ metadata: convertMetadataToGrpcJs(niceGrpcMetadata),
38
+ };
39
+
40
+ return throwError(() => error);
41
+ }
42
+ }
@@ -6,6 +6,7 @@ import type { Constructor } from '@rsdk/common';
6
6
  import type {
7
7
  ConfigContext,
8
8
  IErrorsFormatter,
9
+ IErrorsSender,
9
10
  IErrorsTransformer,
10
11
  IMicroserviceTransport,
11
12
  } from '@rsdk/core';
@@ -17,6 +18,7 @@ import { LoggerFactory } from '@rsdk/logging';
17
18
  import { HealthController, MetricsController } from './controllers';
18
19
  import { GRPCConfig } from './grpc.config';
19
20
  import { GrpcErrorsFormatter } from './grpc-errors.formatter';
21
+ import { GrpcErrorsSender } from './grpc-errors.sender';
20
22
 
21
23
  export class GrpcTransport implements IMicroserviceTransport {
22
24
  private readonly logger = LoggerFactory.create(GrpcTransport);
@@ -40,6 +42,10 @@ export class GrpcTransport implements IMicroserviceTransport {
40
42
  return new GrpcErrorsFormatter();
41
43
  }
42
44
 
45
+ getErrorsSender(): IErrorsSender {
46
+ return new GrpcErrorsSender();
47
+ }
48
+
43
49
  getErrorTransformers(): IErrorsTransformer[] {
44
50
  return [];
45
51
  }
package/src/types.ts ADDED
@@ -0,0 +1,10 @@
1
+ // Reverse engineered from @grpc/grpc-js source code
2
+ import type { ExceptionKind } from '@rsdk/core';
3
+
4
+ export interface FormattedGrpcError {
5
+ code: number;
6
+ message: string;
7
+ details: any;
8
+ kind: ExceptionKind;
9
+ rsdkCode: string;
10
+ }