@gravity-ui/gateway 1.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/LICENSE +21 -0
- package/README.md +269 -0
- package/bin/patch.js +13 -0
- package/build/components/grpc.d.ts +24 -0
- package/build/components/grpc.js +664 -0
- package/build/components/mixed.d.ts +11 -0
- package/build/components/mixed.js +66 -0
- package/build/components/rest.d.ts +7 -0
- package/build/components/rest.js +291 -0
- package/build/constants.d.ts +46 -0
- package/build/constants.js +101 -0
- package/build/index.d.ts +11 -0
- package/build/index.js +285 -0
- package/build/models/common.d.ts +241 -0
- package/build/models/common.js +8 -0
- package/build/models/context.d.ts +22 -0
- package/build/models/context.js +2 -0
- package/build/models/error.d.ts +12 -0
- package/build/models/error.js +2 -0
- package/build/utils/axios.d.ts +2 -0
- package/build/utils/axios.js +24 -0
- package/build/utils/common.d.ts +15 -0
- package/build/utils/common.js +50 -0
- package/build/utils/create-context-api.d.ts +4 -0
- package/build/utils/create-context-api.js +45 -0
- package/build/utils/grpc-reflection.d.ts +22 -0
- package/build/utils/grpc-reflection.js +56 -0
- package/build/utils/grpc.d.ts +15 -0
- package/build/utils/grpc.js +55 -0
- package/build/utils/overrideEndpoints/index.d.ts +2 -0
- package/build/utils/overrideEndpoints/index.js +4 -0
- package/build/utils/overrideEndpoints/overrideEndpoints.d.ts +17 -0
- package/build/utils/overrideEndpoints/overrideEndpoints.js +103 -0
- package/build/utils/parse-error.d.ts +32 -0
- package/build/utils/parse-error.js +224 -0
- package/build/utils/redact-sensitive-headers.d.ts +4 -0
- package/build/utils/redact-sensitive-headers.js +16 -0
- package/build/utils/typed-api.d.ts +2 -0
- package/build/utils/typed-api.js +7 -0
- package/build/utils/validate.d.ts +4 -0
- package/build/utils/validate.js +56 -0
- package/package.json +91 -0
- package/patches/grpc-reflection-js+0.1.2.patch +87 -0
- package/patches/protobufjs+6.11.4.patch +121 -0
- package/proto/google/api/annotations.proto +31 -0
- package/proto/google/api/http.proto +291 -0
- package/proto/google/protobuf/any.proto +158 -0
- package/proto/google/protobuf/api.proto +208 -0
- package/proto/google/protobuf/compiler/plugin.proto +183 -0
- package/proto/google/protobuf/descriptor.proto +909 -0
- package/proto/google/protobuf/duration.proto +116 -0
- package/proto/google/protobuf/empty.proto +52 -0
- package/proto/google/protobuf/field_mask.proto +245 -0
- package/proto/google/protobuf/source_context.proto +48 -0
- package/proto/google/protobuf/struct.proto +95 -0
- package/proto/google/protobuf/timestamp.proto +147 -0
- package/proto/google/protobuf/type.proto +187 -0
- package/proto/google/protobuf/wrappers.proto +123 -0
- package/proto/google/rpc/README.md +5 -0
- package/proto/google/rpc/code.proto +186 -0
- package/proto/google/rpc/error_details.proto +200 -0
- package/proto/google/rpc/status.proto +92 -0
- package/proto/google/type/dayofweek.proto +51 -0
- package/proto/google/type/timeofday.proto +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 YANDEX LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# @gravity-ui/gateway · [](https://www.npmjs.com/package/@gravity-ui/gateway) [](https://github.com/gravity-ui/gateway/actions/workflows/ci.yml?query=branch:main)
|
|
2
|
+
|
|
3
|
+
Express controller for working with REST/GRPC APIs
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```shell
|
|
8
|
+
npm install --save-dev @gravity-ui/gateway
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
First of all, you need to create a controller where you will import Gateway and Schema, and then return the initialized gateway controller:
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
import getGatewayControllers from '@gravity-ui/gateway';
|
|
17
|
+
import Schema from '<schemas package>';
|
|
18
|
+
|
|
19
|
+
const config = {
|
|
20
|
+
installation: 'external',
|
|
21
|
+
env: 'production',
|
|
22
|
+
includeProtoRoots: ['...']
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const {controller: gatewayController} = getGatewayControllers({root: Schema}, config);
|
|
26
|
+
|
|
27
|
+
export default gatewayController;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Next, the controller described above should be connected to a route of the following format (the project should use [expresskit](https://github.com/gravity-ui/expresskit)):
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
{
|
|
34
|
+
'POST /<prefix>/:scope/:service/:action': {target: '<controller>', afterAuth: ['blackbox', 'credentials']}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The `prefix` can be any prefix for API endpoints (for example, `/gateway/:service/:action`).
|
|
39
|
+
|
|
40
|
+
### Config Structure
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import {AxiosRequestConfig} from 'axios';
|
|
44
|
+
import {IncomingHttpHeaders} from 'http';
|
|
45
|
+
|
|
46
|
+
interface OnUnknownActionData {
|
|
47
|
+
service?: string;
|
|
48
|
+
action?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface Stats {
|
|
52
|
+
service: string;
|
|
53
|
+
action: string;
|
|
54
|
+
restStatus: number;
|
|
55
|
+
grpcStatus?: number;
|
|
56
|
+
requestId: string;
|
|
57
|
+
requestTime: number;
|
|
58
|
+
requestMethod: string;
|
|
59
|
+
requestUrl: string;
|
|
60
|
+
timestamp: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type SendStats = (
|
|
64
|
+
stats: Stats,
|
|
65
|
+
headers: IncomingHttpHeaders,
|
|
66
|
+
ctx: CoreContext,
|
|
67
|
+
meta: {debugHeaders: Headers}
|
|
68
|
+
) => void;
|
|
69
|
+
|
|
70
|
+
type ProxyHeadersFunction = (headers: IncomingHttpHeaders, type: ControllerType) => IncomingHttpHeaders;
|
|
71
|
+
type ProxyHeaders = string[] | ProxyHeadersFunction;
|
|
72
|
+
|
|
73
|
+
interface GatewayConfig {
|
|
74
|
+
// Gateway Installation (external/internal/...). If the configuration is not provided, it is determined from process.env.APP_INSTALLATION.
|
|
75
|
+
installation?: string;
|
|
76
|
+
// Gateway Environment (production/testing/...). If the configuration is not provided, it is determined from process.env.APP_ENV.
|
|
77
|
+
env?: string;
|
|
78
|
+
// Additional gRPC client options.
|
|
79
|
+
grpcOptions?: object;
|
|
80
|
+
// Additional Axios client options.
|
|
81
|
+
axiosConfig?: AxiosRequestConfig;
|
|
82
|
+
// List of actions that need to be connected from the schema. By default, all actions are connected.
|
|
83
|
+
actions?: string[];
|
|
84
|
+
// Called when an unknown service or action is provided.
|
|
85
|
+
onUnknownAction?: (req: Request, res: Response, data: OnUnknownActionData) => any;
|
|
86
|
+
// Called before the request is executed.
|
|
87
|
+
onBeforeAction?: (req: Request, res: Response, scope: string, service: string, action: string, config?: ApiServiceActionConfig) => any
|
|
88
|
+
// Called upon successful completion of the request.
|
|
89
|
+
onRequestSuccess?: (req: Request, res: Response, data: any) => any;
|
|
90
|
+
// Called in case of unsuccessful request execution.
|
|
91
|
+
onRequestFailed?: (req: Request, res: Response, error: any) => any;
|
|
92
|
+
// List of paths to the necessary proto files for the gateway.
|
|
93
|
+
includeProtoRoots?: string[];
|
|
94
|
+
// Configuration of the path to the certificate in gRPC.
|
|
95
|
+
// Set to null to use system certificates by default.
|
|
96
|
+
caCertificatePath?: string | null;
|
|
97
|
+
// Telemetry sending configuration.
|
|
98
|
+
sendStats?: SendStats;
|
|
99
|
+
// Configuration of headers sent to the API.
|
|
100
|
+
proxyHeaders?: ProxyHeaders;
|
|
101
|
+
// When passing a boolean value, it enables/disables debug headers in the response to the request.
|
|
102
|
+
// For unary requests to gRPC backends, debug headers will include information from the trailing metadata returned by the backend.
|
|
103
|
+
withDebugHeaders?: boolean;
|
|
104
|
+
// Validation schema for parameters used when no schema is present in the action. Documentation: https://ajv.js.org/json-schema.html#json-data-type
|
|
105
|
+
// You can use DEFAULT_VALIDATION_SCHEMA from lib/constants.ts.
|
|
106
|
+
validationSchema?: object;
|
|
107
|
+
// Enables encoding of REST path arguments.
|
|
108
|
+
encodePathArgs?: boolean;
|
|
109
|
+
// Configuration for automatic connection re-establishment upon connection error through L3 load balancer (default is false).
|
|
110
|
+
grpcRecreateService?: boolean;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Использование в NodeJS
|
|
115
|
+
|
|
116
|
+
Upon gateway initialization, in addition to exporting the controller, it also exports an `api` object, which represents the core for executing requests to the backend.
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
import getGatewayControllers from '@gravity-ui/gateway';
|
|
120
|
+
import Schema from '<schemas package>';
|
|
121
|
+
|
|
122
|
+
const config = {
|
|
123
|
+
installation: 'external',
|
|
124
|
+
env: 'production',
|
|
125
|
+
includeProtoRoots: ['...'],
|
|
126
|
+
timeout: 25000, // default 25 seconds
|
|
127
|
+
caCertificatePath: '...',
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const {api: gatewayApi} = getGatewayControllers({root: Schema}, config);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Subsequently, in the code, you can use it as follows:
|
|
134
|
+
|
|
135
|
+
```javascript
|
|
136
|
+
gatewayApi[service][action](actionConfig);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`actionConfig` has the following structure:
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
interface ApiActionConfig<Context, TRequestData> {
|
|
143
|
+
requestId: string;
|
|
144
|
+
headers: Headers;
|
|
145
|
+
args: TRequestData;
|
|
146
|
+
ctx: Context;
|
|
147
|
+
timeout?: number;
|
|
148
|
+
callback?: (response: TResponseData) => void;
|
|
149
|
+
authArgs?: Record<string, unknown>;
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Schema Scopes
|
|
154
|
+
|
|
155
|
+
Each schema belongs to its own namespace. Service and action names between schemas are completely independent and can coincide. Each scope has an independent gRPC context, which eliminates naming conflicts between schemas in proto files.
|
|
156
|
+
The scope name is the key in the first parameter of the object containing the schemas.
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
const schemasByScopes = {scope1: schema1, scope2: schema2}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Example with two scope namespaces: `root` and `anotherScope`.
|
|
163
|
+
|
|
164
|
+
```javascript
|
|
165
|
+
import getGatewayControllers from '@gravity-ui/gateway';
|
|
166
|
+
|
|
167
|
+
const {
|
|
168
|
+
controller, // Controller
|
|
169
|
+
api, // API (for Node.js environment)
|
|
170
|
+
} = getGatewayControllers({ root: rootSchema, anotherScope: anotherSchema}, config);
|
|
171
|
+
|
|
172
|
+
// API calls are made by specifying the scope.
|
|
173
|
+
const resultFromRoot = api.rootSchema.<root-service>.<root-action>(params);
|
|
174
|
+
const resultFromAnother = api.anotherSchema.<another-service>.<another-action>(params);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
There is a special scope called root. Its methods can be invoked without explicitly specifying the scope.
|
|
178
|
+
|
|
179
|
+
```javascript
|
|
180
|
+
const resultFromRoot = api.rootSchema.<root-service>.<root-action>(params);
|
|
181
|
+
// Same result
|
|
182
|
+
const sameResultFromRoot = api.<root-service>.<root-action>(params);
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
The controller for the expresskit will also expect the `:scope` parameter.
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
{
|
|
189
|
+
'POST /<prefix>/:scope/:service/:action': {...}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
If the scope parameter is not specified, the default scope is assumed to be `root`.
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
### Connecting a Specific Set of Actions
|
|
198
|
+
|
|
199
|
+
When initializing the `gateway`, there is an option to explicitly specify the actions that need to be connected from the schemas. To do this, provide a list of available client-side actions in the `actions` field in the config. If `actions` are not provided, all actions from the schemas are connected by default.
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
import getGatewayControllers from '@gravity-ui/gateway';
|
|
203
|
+
import rootSchema from '<schemas package>';
|
|
204
|
+
import localSchema from '../shared/schemas';
|
|
205
|
+
|
|
206
|
+
const config = {
|
|
207
|
+
installation: 'external',
|
|
208
|
+
env: 'production',
|
|
209
|
+
includeProtoRoots: ['...'],
|
|
210
|
+
actions: ['local.*', 'root.serviceA.*', 'root.serviceB.get'], // List of actions to be connected from the schemas. By default, all actions are connected.
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const {api: gatewayApi} = getGatewayControllers({root: rootSchema, local: localSchema}, config);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
The following combinations are available for specifying connected actions:
|
|
217
|
+
|
|
218
|
+
- `<scope>.*` - all actions from the scope scope are connected (for example, `local.*`)
|
|
219
|
+
- `<scope>.<service>.*` - all actions from the service service are connected (for example, `root.serviceA.*`)
|
|
220
|
+
- `<scope>.<service>.action` - only the specified action is connected (for example, `root.serviceB.get`)
|
|
221
|
+
|
|
222
|
+
**Important.** The actions configuration only affects the list of actions that will be accessible from the client (e.g., via the `sdk`). All actions from the schemas will continue to be accessible on Node.js.
|
|
223
|
+
|
|
224
|
+
### GATEWAY_ENDPOINTS_OVERRIDES
|
|
225
|
+
|
|
226
|
+
Through the `GATEWAY_ENDPOINTS_OVERRIDES` environment variable, you can override specific endpoints. This can be useful for testing environments. A simple example: `{"serviceName":{"endpoint":"https://example.com"}}`. You can find a more detailed format in the OverrideParams interface and test examples.
|
|
227
|
+
|
|
228
|
+
### gRPC Reflection for gRPC Actions
|
|
229
|
+
|
|
230
|
+
Instead of using gRPC proto files, a gRPC action can determine the structure of the service and the required method through reflection.
|
|
231
|
+
|
|
232
|
+
**Enabling Reflection**
|
|
233
|
+
|
|
234
|
+
To use reflection, you need to:
|
|
235
|
+
|
|
236
|
+
- Install the `grpc-reflection-js` package as a peer dependency.
|
|
237
|
+
- Apply patches to the `protobufjs` library. You can do this in the following ways:
|
|
238
|
+
|
|
239
|
+
a) Add `npx gateway-reflection-patch` to the `postinstall` script in your project and execute it. This assumes that protobufjs is located in the root of node_modules.
|
|
240
|
+
|
|
241
|
+
b) Copy the patch from the library's patches folder to your project's root, install [patch-package](https://www.npmjs.com/package/patch-package), and add the `patch-package` command to the `postinstall` script. In this case, you need to keep an eye on updates to the patches in the gateway when updating it.
|
|
242
|
+
|
|
243
|
+
If you encounter a "cannot run in wd [...]" error during Docker build, you can add unsafe-perm = true to your .npmrc file as described here.
|
|
244
|
+
|
|
245
|
+
- In the `action` configuration, replace the `protoPath` option with the `reflection` option and set its value to the appropriate `GrpcReflection` enum value. For reflection to work, the endpoint must support it.
|
|
246
|
+
|
|
247
|
+
Possible values for `GrpcReflection`, affecting the caching of reflection results:
|
|
248
|
+
|
|
249
|
+
- `OnFirstRequest` - Perform reflection on the first action request. Use cached reflections.
|
|
250
|
+
- `OnEveryRequest` - Perform reflection before every action request. Do not use cached reflections.
|
|
251
|
+
|
|
252
|
+
For the `OnFirstRequest` options you can specify the reflectionRefreshSec parameter, which indicates how often in seconds the reflection cache can be updated in the background. Cache updates happen asynchronously and don't block the current request. The initial reflection request with an empty cache might introduce some delay in the request.
|
|
253
|
+
|
|
254
|
+
**Particularities**
|
|
255
|
+
|
|
256
|
+
The cache key for reflections consists of `protoKey` and `endpoint`. Therefore, actions with shared keys will use a common cached version, which will be obtained from the earliest scenario (when the first action request with the `OnFirstRequest` strategy is made).
|
|
257
|
+
|
|
258
|
+
This function is experimental. Fixes have been applied to `protobufjs` using [patch-package](https://github.com/ds300/patch-package) based on the following PRs:
|
|
259
|
+
|
|
260
|
+
- Fix for duplicated field [PR 1784](https://github.com/protobufjs/protobuf.js/pull/1784)
|
|
261
|
+
- Conversion of parameter names to camelCase [PR 1073](https://github.com/protobufjs/protobuf.js/pull/1073)
|
|
262
|
+
- Fix for handling Map [PR 1478](https://github.com/protobufjs/protobuf.js/pull/1478)
|
|
263
|
+
grpc-reflection-js has also been patched to support custom options.
|
|
264
|
+
|
|
265
|
+
For development, you need to apply the patch locally using the command `npx patch-package`.
|
|
266
|
+
|
|
267
|
+
**ChannelCredentials Type Mismatch Error**
|
|
268
|
+
|
|
269
|
+
This error can occur due to duplicate installations of the` @grpc/grpc-js` library. It's recommended to ensure that all versions of this library are aligned and consistent to avoid this issue.
|
package/bin/patch.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
const {execSync} = require('child_process');
|
|
3
|
+
const {copyFileSync, mkdirSync} = require('fs');
|
|
4
|
+
mkdirSync('patches', {recursive: true});
|
|
5
|
+
copyFileSync(
|
|
6
|
+
'node_modules/@gravity-ui/gateway/patches/grpc-reflection-js+0.1.2.patch',
|
|
7
|
+
'patches/grpc-reflection-js+0.1.2.patch',
|
|
8
|
+
);
|
|
9
|
+
copyFileSync(
|
|
10
|
+
'node_modules/@gravity-ui/gateway/patches/protobufjs+6.11.4.patch',
|
|
11
|
+
'patches/protobufjs+6.11.4.patch',
|
|
12
|
+
);
|
|
13
|
+
execSync('npx patch-package', {stdio: 'inherit'});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
|
2
|
+
import * as protobufjs from 'protobufjs';
|
|
3
|
+
import type * as descriptor from 'protobufjs/ext/descriptor';
|
|
4
|
+
import { ApiActionConfig, ApiServiceGrpcActionConfig, EndpointsConfig, GatewayApiOptions } from '../models/common';
|
|
5
|
+
import { GatewayContext } from '../models/context';
|
|
6
|
+
import { AppErrorConstructor } from '../models/error';
|
|
7
|
+
declare module 'protobufjs' {
|
|
8
|
+
interface Root {
|
|
9
|
+
toDescriptor(protoVersion: string): protobufjs.Message<descriptor.IFileDescriptorSet> & descriptor.IFileDescriptorSet;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
interface CredentialsMap {
|
|
13
|
+
insecure: grpc.ChannelCredentials;
|
|
14
|
+
secure: grpc.ChannelCredentials;
|
|
15
|
+
secureWithoutRootCert: grpc.ChannelCredentials;
|
|
16
|
+
}
|
|
17
|
+
export interface GrpcContext {
|
|
18
|
+
root: protobufjs.Root;
|
|
19
|
+
credentials: CredentialsMap;
|
|
20
|
+
}
|
|
21
|
+
export declare function createRoot(includeGrpcPaths?: string[]): protobufjs.Root;
|
|
22
|
+
export declare function getCredentialsMap(caCertificatePath?: string | null): CredentialsMap;
|
|
23
|
+
export default function createGrpcAction<Context extends GatewayContext>({ root, credentials }: GrpcContext, endpoints: EndpointsConfig | undefined, config: ApiServiceGrpcActionConfig<Context, any, any>, serviceKey: string, actionName: string, options: GatewayApiOptions<Context>, ErrorConctructor: AppErrorConstructor): (actionConfig: ApiActionConfig<Context, any, any>) => Promise<import("../models/common").GatewayActionClientStreamResponse<any> | import("../models/common").GatewayActionServerStreamResponse<any> | import("../models/common").GatewayActionDuplexStreamResponse<any> | import("../models/common").GatewayActionUnaryResponse<any>>;
|
|
24
|
+
export {};
|