@gravity-ui/gateway 3.1.2-alpha.0 → 3.1.4-alpha.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.
@@ -71,14 +71,14 @@ function getCredentialsMap(caCertificatePath) {
71
71
  };
72
72
  }
73
73
  exports.getCredentialsMap = getCredentialsMap;
74
- function decodeResponse(response, packageRoot, ctx, encodedFields = [], ErrorConstructor) {
74
+ function decodeResponse(response, packageRoot, ctx, encodedFields = [], ErrorConstructor, decodeAnyMessageProtoLoaderOptions) {
75
75
  const systemFields = ['metadata', 'response', 'error.details'];
76
76
  [...systemFields, ...encodedFields].forEach((fieldName) => {
77
77
  try {
78
78
  const parsedFieldName = fieldName.replace(/\.\*$/, '');
79
79
  const fieldValue = lodash_1.default.get(response, parsedFieldName);
80
80
  if (fieldValue) {
81
- lodash_1.default.set(response, parsedFieldName, (0, grpc_1.decodeAnyMessageRecursively)(packageRoot, fieldValue));
81
+ lodash_1.default.set(response, parsedFieldName, (0, grpc_1.decodeAnyMessageRecursively)(packageRoot, fieldValue, decodeAnyMessageProtoLoaderOptions));
82
82
  }
83
83
  }
84
84
  catch (error) {
@@ -301,15 +301,15 @@ async function getServiceInstance(root, config, endpointData, grpcOptions, crede
301
301
  }
302
302
  return serviceInstance;
303
303
  }
304
- async function getResponseData({ config, response, ctx, packageRoot, args, ErrorConstructor, }) {
304
+ async function getResponseData({ config, response, ctx, packageRoot, args, ErrorConstructor, decodeAnyMessageProtoLoaderOptions, }) {
305
305
  // Handle operation's runtime protocol buffers
306
306
  if (response) {
307
307
  const encodedFields = config.encodedFields;
308
308
  if (Array.isArray(response)) {
309
- response.forEach((responseItem) => decodeResponse(responseItem, packageRoot, ctx, encodedFields, ErrorConstructor));
309
+ response.forEach((responseItem) => decodeResponse(responseItem, packageRoot, ctx, encodedFields, ErrorConstructor, decodeAnyMessageProtoLoaderOptions));
310
310
  }
311
311
  else if (typeof response === 'object') {
312
- decodeResponse(response, packageRoot, ctx, encodedFields, ErrorConstructor);
312
+ decodeResponse(response, packageRoot, ctx, encodedFields, ErrorConstructor, decodeAnyMessageProtoLoaderOptions);
313
313
  }
314
314
  }
315
315
  let responseData = response;
@@ -526,7 +526,7 @@ function createGrpcAction({ root, credentials }, endpoints, config, serviceKey,
526
526
  ctx.log('ServerStream error', {
527
527
  debugHeaders: (0, common_2.sanitizeDebugHeaders)(debugHeaders),
528
528
  });
529
- processError(new parse_error_1.GrpcError('ClientReadableStream error', (0, parse_error_1.parseGrpcError)(error, root, lang), error));
529
+ processError(new parse_error_1.GrpcError('ClientReadableStream error', (0, parse_error_1.parseGrpcError)(error, root, lang, config.decodeAnyMessageProtoLoaderOptions), error));
530
530
  });
531
531
  stream.on('status', (status) => {
532
532
  ctx.log('ServerStream status changed', status);
@@ -566,7 +566,7 @@ function createGrpcAction({ root, credentials }, endpoints, config, serviceKey,
566
566
  ctx.log('BidiStream error', {
567
567
  debugHeaders: (0, common_2.sanitizeDebugHeaders)(debugHeaders),
568
568
  });
569
- processError(new parse_error_1.GrpcError('BidiStream error', (0, parse_error_1.parseGrpcError)(error, root, lang), error));
569
+ processError(new parse_error_1.GrpcError('BidiStream error', (0, parse_error_1.parseGrpcError)(error, root, lang, config.decodeAnyMessageProtoLoaderOptions), error));
570
570
  });
571
571
  stream.on('status', (status) => {
572
572
  ctx.log('BidiStream status changed', status);
@@ -618,7 +618,7 @@ function createGrpcAction({ root, credentials }, endpoints, config, serviceKey,
618
618
  return;
619
619
  }
620
620
  if (error) {
621
- reject(new parse_error_1.GrpcError('gRPC request error', (0, parse_error_1.parseGrpcError)(error, root, lang), error));
621
+ reject(new parse_error_1.GrpcError('gRPC request error', (0, parse_error_1.parseGrpcError)(error, root, lang, config.decodeAnyMessageProtoLoaderOptions), error));
622
622
  return;
623
623
  }
624
624
  const responseData = await getResponseData({
@@ -628,6 +628,7 @@ function createGrpcAction({ root, credentials }, endpoints, config, serviceKey,
628
628
  args,
629
629
  packageRoot: root,
630
630
  ErrorConstructor,
631
+ decodeAnyMessageProtoLoaderOptions: config.decodeAnyMessageProtoLoaderOptions,
631
632
  });
632
633
  const responseHeaders = {};
633
634
  if (config.proxyResponseHeaders) {
@@ -23,7 +23,6 @@ export declare const DEFAULT_GRPC_OPTIONS: {
23
23
  export declare const DEFAULT_PROTO_LOADER_OPTIONS: {
24
24
  longs: StringConstructor;
25
25
  enums: StringConstructor;
26
- bytes: StringConstructor;
27
26
  defaults: boolean;
28
27
  oneofs: boolean;
29
28
  };
@@ -66,7 +66,6 @@ exports.DEFAULT_GRPC_OPTIONS = {
66
66
  exports.DEFAULT_PROTO_LOADER_OPTIONS = {
67
67
  longs: String,
68
68
  enums: String,
69
- bytes: String,
70
69
  defaults: true,
71
70
  oneofs: true,
72
71
  };
@@ -4,6 +4,7 @@ import { ClientDuplexStream, ClientReadableStream, ClientWritableStream } from '
4
4
  import { HandlerType } from '@grpc/grpc-js/build/src/server-call';
5
5
  import { AxiosInterceptorManager, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
6
6
  import type { Request, Response } from 'express';
7
+ import * as protobufjs from 'protobufjs';
7
8
  import type { GrpcContext } from '../components/grpc';
8
9
  import { Lang } from '../constants';
9
10
  import { GatewayContext } from './context';
@@ -141,6 +142,7 @@ export interface ApiServiceBaseGrpcActionConfig<Context extends GatewayContext,
141
142
  secureWithoutRootCert?: boolean;
142
143
  encodedFields?: string[];
143
144
  type?: HandlerType;
145
+ decodeAnyMessageProtoLoaderOptions?: protobufjs.IConversionOptions;
144
146
  }
145
147
  export interface ApiServiceFileGrpcActionConfig<Context extends GatewayContext, TOutput, TParams, TTransformed> extends ApiServiceBaseGrpcActionConfig<Context, TOutput, TParams, TTransformed> {
146
148
  protoPath: string;
@@ -1,5 +1,5 @@
1
1
  import * as grpc from '@grpc/grpc-js';
2
2
  import * as protobufjs from 'protobufjs';
3
- export declare function decodeAnyMessageRecursively(root: protobufjs.Root, message?: unknown): unknown;
3
+ export declare function decodeAnyMessageRecursively(root: protobufjs.Root, message?: unknown, decodeAnyMessageProtoLoaderOptions?: protobufjs.IConversionOptions): unknown;
4
4
  export declare function isRetryableError(error?: grpc.ServiceError): boolean;
5
5
  export declare function isRecreateServiceError(error?: grpc.ServiceError): boolean;
@@ -6,16 +6,16 @@ const constants_1 = require("../constants");
6
6
  function isEncodedMessage(message) {
7
7
  return Boolean(message.type_url && message.value);
8
8
  }
9
- function decodeAnyMessageRecursively(root, message) {
9
+ function decodeAnyMessageRecursively(root, message, decodeAnyMessageProtoLoaderOptions) {
10
10
  if (!message || typeof message !== 'object') {
11
11
  return message;
12
12
  }
13
13
  if (Array.isArray(message)) {
14
- return message.map((innerMessage) => decodeAnyMessageRecursively(root, innerMessage));
14
+ return message.map((innerMessage) => decodeAnyMessageRecursively(root, innerMessage, decodeAnyMessageProtoLoaderOptions));
15
15
  }
16
16
  if (typeof message === 'object' && !isEncodedMessage(message)) {
17
17
  return Object.entries(message).reduce((res, [key, value]) => {
18
- res[key] = decodeAnyMessageRecursively(root, value);
18
+ res[key] = decodeAnyMessageRecursively(root, value, decodeAnyMessageProtoLoaderOptions);
19
19
  return res;
20
20
  }, {});
21
21
  }
@@ -25,8 +25,8 @@ function decodeAnyMessageRecursively(root, message) {
25
25
  }
26
26
  const typeName = message.type_url.substring(lastSlashIndex + 1);
27
27
  const type = root.lookupType(typeName);
28
- const decodedMessage = type.toObject(type.decode(message.value), constants_1.DEFAULT_PROTO_LOADER_OPTIONS);
29
- return decodeAnyMessageRecursively(root, decodedMessage);
28
+ const decodedMessage = type.toObject(type.decode(message.value), Object.assign(Object.assign({}, constants_1.DEFAULT_PROTO_LOADER_OPTIONS), decodeAnyMessageProtoLoaderOptions));
29
+ return decodeAnyMessageRecursively(root, decodedMessage, decodeAnyMessageProtoLoaderOptions);
30
30
  }
31
31
  exports.decodeAnyMessageRecursively = decodeAnyMessageRecursively;
32
32
  function isRetryableError(error) {
@@ -17,7 +17,7 @@ export declare function parseMixedError(e: Error & {
17
17
  };
18
18
  };
19
19
  export declare function parseRestError(error: any, lang?: string): GatewayError;
20
- export declare function parseGrpcError(error: grpc.ServiceError, packageRoot: protobufjs.Root, lang?: Lang): GatewayError;
20
+ export declare function parseGrpcError(error: grpc.ServiceError, packageRoot: protobufjs.Root, lang?: Lang, decodeAnyMessageProtoLoaderOptions?: protobufjs.IConversionOptions): GatewayError;
21
21
  export declare class GrpcError extends Error {
22
22
  private parsedError;
23
23
  private rawError;
@@ -135,7 +135,7 @@ function parseRestError(error, lang) {
135
135
  };
136
136
  }
137
137
  exports.parseRestError = parseRestError;
138
- function decodeGrpcStatusMessage(metadata, packageRoot) {
138
+ function decodeGrpcStatusMessage(metadata, packageRoot, decodeAnyMessageProtoLoaderOptions) {
139
139
  const statusMessageBin = metadata.get('grpc-status-details-bin')[0];
140
140
  if (!statusMessageBin) {
141
141
  return undefined;
@@ -143,9 +143,9 @@ function decodeGrpcStatusMessage(metadata, packageRoot) {
143
143
  return (0, grpc_1.decodeAnyMessageRecursively)(packageRoot, {
144
144
  type_url: 'type.googleapis.com/google.rpc.Status',
145
145
  value: statusMessageBin,
146
- });
146
+ }, decodeAnyMessageProtoLoaderOptions);
147
147
  }
148
- function parseGrpcError(error, packageRoot, lang = constants_1.Lang.Ru) {
148
+ function parseGrpcError(error, packageRoot, lang = constants_1.Lang.Ru, decodeAnyMessageProtoLoaderOptions) {
149
149
  let title = lang === constants_1.Lang.Ru ? 'Ошибка' : 'Error';
150
150
  if (error.code === 7) {
151
151
  // Always redefine title for Access denied errors
@@ -156,7 +156,7 @@ function parseGrpcError(error, packageRoot, lang = constants_1.Lang.Ru) {
156
156
  let details;
157
157
  if (error.metadata) {
158
158
  try {
159
- const statusMessage = decodeGrpcStatusMessage(error.metadata, packageRoot);
159
+ const statusMessage = decodeGrpcStatusMessage(error.metadata, packageRoot, decodeAnyMessageProtoLoaderOptions);
160
160
  if (statusMessage) {
161
161
  code = statusMessage.code;
162
162
  description = statusMessage.message;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/gateway",
3
- "version": "3.1.2-alpha.0",
3
+ "version": "3.1.4-alpha.0",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "build/index.js",