@gravity-ui/gateway 3.1.1 → 3.1.3-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.
package/build/components/grpc.js
CHANGED
|
@@ -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, actionConfig.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, actionConfig.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, actionConfig.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: actionConfig.decodeAnyMessageProtoLoaderOptions,
|
|
631
632
|
});
|
|
632
633
|
const responseHeaders = {};
|
|
633
634
|
if (config.proxyResponseHeaders) {
|
package/build/models/common.d.ts
CHANGED
|
@@ -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';
|
|
@@ -30,6 +31,7 @@ export interface ApiActionConfig<Context extends GatewayContext, TRequestData, T
|
|
|
30
31
|
callback?: (response: TResponseData) => void;
|
|
31
32
|
authArgs?: Record<string, unknown>;
|
|
32
33
|
userId?: string;
|
|
34
|
+
decodeAnyMessageProtoLoaderOptions?: protobufjs.IConversionOptions;
|
|
33
35
|
}
|
|
34
36
|
export interface GRPCActionData {
|
|
35
37
|
[key: string]: unknown;
|
package/build/utils/grpc.d.ts
CHANGED
|
@@ -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;
|
package/build/utils/grpc.js
CHANGED
|
@@ -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;
|