@restorecommerce/chassis-srv 0.3.12 → 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/CHANGELOG.md +5 -0
- package/lib/command-interface/index.d.ts +14 -13
- package/lib/command-interface/index.js +43 -65
- package/lib/command-interface/index.js.map +1 -1
- package/lib/database/index.d.ts +2 -1
- package/lib/database/index.js.map +1 -1
- package/lib/database/provider/arango/base.d.ts +1 -1
- package/lib/database/provider/arango/base.js.map +1 -1
- package/lib/database/provider/arango/graph.d.ts +3 -2
- package/lib/database/provider/arango/graph.js +4 -4
- package/lib/database/provider/arango/graph.js.map +1 -1
- package/lib/database/provider/arango/interface.d.ts +0 -65
- package/lib/database/provider/arango/interface.js +0 -43
- package/lib/database/provider/arango/interface.js.map +1 -1
- package/lib/database/provider/arango/utils.d.ts +1 -1
- package/lib/database/provider/arango/utils.js +7 -6
- package/lib/database/provider/arango/utils.js.map +1 -1
- package/lib/health/index.d.ts +5 -4
- package/lib/health/index.js +21 -38
- package/lib/health/index.js.map +1 -1
- package/lib/index.d.ts +6 -8
- package/lib/index.js +3 -6
- package/lib/index.js.map +1 -1
- package/lib/microservice/endpoint.d.ts +1 -16
- package/lib/microservice/endpoint.js +2 -214
- package/lib/microservice/endpoint.js.map +1 -1
- package/lib/microservice/server.d.ts +4 -3
- package/lib/microservice/server.js +8 -101
- package/lib/microservice/server.js.map +1 -1
- package/lib/microservice/transport/provider/grpc/index.d.ts +16 -11
- package/lib/microservice/transport/provider/grpc/index.js +20 -288
- package/lib/microservice/transport/provider/grpc/index.js.map +1 -1
- package/lib/microservice/transport/provider/grpc/middlewares.d.ts +7 -0
- package/lib/microservice/transport/provider/grpc/middlewares.js +55 -0
- package/lib/microservice/transport/provider/grpc/middlewares.js.map +1 -0
- package/lib/microservice/transport/provider/grpc/reflection.d.ts +7 -41
- package/lib/microservice/transport/provider/grpc/reflection.js +13 -519
- package/lib/microservice/transport/provider/grpc/reflection.js.map +1 -1
- package/package.json +22 -20
|
@@ -1,83 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
const rTracer = __importStar(require("cls-rtracer"));
|
|
29
|
-
const service_config_1 = require("@restorecommerce/service-config");
|
|
30
|
-
const middlewareClsTracer = rTracer.koaMiddleware({
|
|
31
|
-
useHeader: true,
|
|
32
|
-
headerName: 'x-request-id'
|
|
33
|
-
});
|
|
34
|
-
const cfg = (0, service_config_1.createServiceConfig)(process.cwd());
|
|
35
|
-
const oneOfFieldsConfig = cfg.get('oneOfFields');
|
|
36
|
-
/**
|
|
37
|
-
* calls each middleware
|
|
38
|
-
* @param middleware
|
|
39
|
-
*/
|
|
40
|
-
const chainMiddleware = (middleware) => {
|
|
41
|
-
return async (request, next) => {
|
|
42
|
-
let n = next;
|
|
43
|
-
if (next) {
|
|
44
|
-
for (let i = middleware.length - 1; i >= 0; i -= 1) {
|
|
45
|
-
const reqClone = _.clone(request);
|
|
46
|
-
Object.assign(request, { req: reqClone }, { res: reqClone });
|
|
47
|
-
const result = await middleware[i](request, async () => {
|
|
48
|
-
const grpcRequest = { request: request.request };
|
|
49
|
-
delete grpcRequest.request.headers;
|
|
50
|
-
return await next(grpcRequest);
|
|
51
|
-
});
|
|
52
|
-
if (i == 0) {
|
|
53
|
-
return result;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
n = request;
|
|
59
|
-
for (let i = middleware.length - 1; i >= 1; i -= 1) {
|
|
60
|
-
n = await middleware[i](n);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return await middleware[0](n);
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
exports.chainMiddleware = chainMiddleware;
|
|
67
|
-
// iterate iterates an object recursively
|
|
68
|
-
// and deletes an object's property if
|
|
69
|
-
// it matches the oneOfNotUsed field
|
|
70
|
-
const iterate = (obj, oneOfNotUsed) => {
|
|
71
|
-
Object.keys(obj).forEach(key => {
|
|
72
|
-
if (key === oneOfNotUsed) {
|
|
73
|
-
delete (obj[key]);
|
|
74
|
-
}
|
|
75
|
-
if (typeof obj[key] === 'object' && !_.isNil(obj[key])) {
|
|
76
|
-
iterate(obj[key], oneOfNotUsed);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
};
|
|
80
|
-
const removeBufferFileds = (object, ctx) => {
|
|
3
|
+
// TODO Re-implement
|
|
4
|
+
const removeBufferFields = (object, ctx) => {
|
|
81
5
|
// Check if the cfg file contains any bufferFields and remove them
|
|
82
6
|
if (!object) {
|
|
83
7
|
object = {};
|
|
@@ -124,140 +48,4 @@ const removeBufferFileds = (object, ctx) => {
|
|
|
124
48
|
}
|
|
125
49
|
return object;
|
|
126
50
|
};
|
|
127
|
-
/**
|
|
128
|
-
* Calls middleware and business logic.
|
|
129
|
-
* @param middleware
|
|
130
|
-
* @param service
|
|
131
|
-
* @param transportName
|
|
132
|
-
* @param methodName
|
|
133
|
-
* @param logger
|
|
134
|
-
* @param cfg
|
|
135
|
-
*/
|
|
136
|
-
const makeEndpoint = (middleware, service, transportName, methodName, logger, cfg) => {
|
|
137
|
-
return async (request, context) => {
|
|
138
|
-
const ctx = context || {};
|
|
139
|
-
ctx.transport = transportName;
|
|
140
|
-
ctx.method = methodName;
|
|
141
|
-
ctx.logger = logger;
|
|
142
|
-
ctx.config = cfg;
|
|
143
|
-
let e;
|
|
144
|
-
let rid = '';
|
|
145
|
-
let middlewareChain = [];
|
|
146
|
-
if (middleware && middleware.length > 0) {
|
|
147
|
-
middlewareChain.push(middleware);
|
|
148
|
-
}
|
|
149
|
-
// Check configuration if oneOf fields are configured for a resource
|
|
150
|
-
// and then remove unnecessary oneOf fields from the request items to
|
|
151
|
-
// avoid gRPC protobuf error.
|
|
152
|
-
// To avoid accidental removal it is important
|
|
153
|
-
// not to have fields which are named as one of the oneOf fields
|
|
154
|
-
if (oneOfFieldsConfig && !_.isEmpty(oneOfFieldsConfig)) {
|
|
155
|
-
if (ctx.method) {
|
|
156
|
-
if (ctx.method === 'create' ||
|
|
157
|
-
ctx.method === 'update' ||
|
|
158
|
-
ctx.method === 'upsert') {
|
|
159
|
-
// Read configuration for requested resource and make typeToFieldsMap
|
|
160
|
-
// oneOfType => oneOfFields[]
|
|
161
|
-
let oneOfFields = [];
|
|
162
|
-
let typeToFieldsMap = new Map();
|
|
163
|
-
if (service && service.name) {
|
|
164
|
-
let name = service.name;
|
|
165
|
-
if (name in oneOfFieldsConfig) {
|
|
166
|
-
oneOfFields = oneOfFieldsConfig[name];
|
|
167
|
-
let oneOfFieldsKeys = Object.keys(oneOfFields);
|
|
168
|
-
for (let oneOfFieldsKey of oneOfFieldsKeys) {
|
|
169
|
-
typeToFieldsMap.set(oneOfFieldsKey, oneOfFields[oneOfFieldsKey]);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// Iterate through all the items and for each item check which of the
|
|
174
|
-
// oneOf fields is set (can be multiple oneOf fields).
|
|
175
|
-
// Then push the ones not being used in a list.
|
|
176
|
-
// Finally based on this list remove fields which are not used
|
|
177
|
-
// (recursively) from each item.
|
|
178
|
-
if (!_.isEmpty(typeToFieldsMap)) {
|
|
179
|
-
if (request && request.request && request.request.items) {
|
|
180
|
-
for (let item of request.request.items) {
|
|
181
|
-
let oneOfNotUsedList = [];
|
|
182
|
-
let itemKeys = Object.keys(item);
|
|
183
|
-
for (let itemKey of itemKeys) {
|
|
184
|
-
if (typeToFieldsMap.has(itemKey)) {
|
|
185
|
-
let oneOfUsed = item[itemKey];
|
|
186
|
-
let fieldsArr = typeToFieldsMap.get(itemKey);
|
|
187
|
-
for (let field of fieldsArr) {
|
|
188
|
-
if (field !== oneOfUsed) {
|
|
189
|
-
oneOfNotUsedList.push(field);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
for (let oneOfNotUsed of oneOfNotUsedList) {
|
|
195
|
-
iterate(item, oneOfNotUsed);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
/*
|
|
204
|
-
bufferFields are defined in the config under each service's method as:
|
|
205
|
-
"bufferFields": {
|
|
206
|
-
"Request": "context"
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
As described in the proto file of each service,
|
|
210
|
-
Request is the type of message and context is the type of data being sent.
|
|
211
|
-
*/
|
|
212
|
-
// deep clone the request
|
|
213
|
-
const deepClone = _.cloneDeep(request);
|
|
214
|
-
let Request = deepClone.request;
|
|
215
|
-
try {
|
|
216
|
-
if (Request && Request.request) {
|
|
217
|
-
Request = Request.request;
|
|
218
|
-
}
|
|
219
|
-
Request = removeBufferFileds(Request, ctx);
|
|
220
|
-
logger.debug('invoking endpoint with request:', Request);
|
|
221
|
-
if (request && request.request && request.request.headers
|
|
222
|
-
&& request.request.headers['x-request-id']) {
|
|
223
|
-
rid = request.request.headers['x-request-id'];
|
|
224
|
-
}
|
|
225
|
-
if (rid) {
|
|
226
|
-
middlewareChain.push(middlewareClsTracer);
|
|
227
|
-
}
|
|
228
|
-
if (middlewareChain.length > 0) {
|
|
229
|
-
logger.verbose(`[rid: ${rid}] received request to method ${ctx.method} over transport ${ctx.transport}`, Request);
|
|
230
|
-
const chain = (0, exports.chainMiddleware)(middlewareChain);
|
|
231
|
-
const result = await chain(request, service[methodName].bind(service));
|
|
232
|
-
let response = _.cloneDeep(result);
|
|
233
|
-
response = removeBufferFileds(response, ctx);
|
|
234
|
-
logger.verbose(`[rid: ${rid}] request to method ${ctx.method} over transport ${ctx.transport} response`, { Request, response });
|
|
235
|
-
return result;
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
e = service[methodName].bind(service);
|
|
239
|
-
}
|
|
240
|
-
logger.verbose(`received request to method ${ctx.method} over transport ${ctx.transport}`, Request);
|
|
241
|
-
const result = await e(request, ctx);
|
|
242
|
-
let response = _.cloneDeep(result);
|
|
243
|
-
response = removeBufferFileds(response, ctx);
|
|
244
|
-
logger.verbose(`request to method ${ctx.method} over transport ${ctx.transport} response`, { Request, response });
|
|
245
|
-
return result;
|
|
246
|
-
}
|
|
247
|
-
catch (err) {
|
|
248
|
-
if (rid) {
|
|
249
|
-
rid = `[rid: ${rid}]`;
|
|
250
|
-
}
|
|
251
|
-
if (err instanceof SyntaxError || err instanceof RangeError ||
|
|
252
|
-
err instanceof ReferenceError || err instanceof TypeError) {
|
|
253
|
-
logger.error(`${rid} request to method ${ctx.method} over transport ${ctx.transport} error`, { message: err.message, stack: err.stack });
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
logger.info(`${rid} request to method ${ctx.method} over transport ${ctx.transport} error`, { message: err.message, stack: err.stack });
|
|
257
|
-
}
|
|
258
|
-
throw err;
|
|
259
|
-
}
|
|
260
|
-
};
|
|
261
|
-
};
|
|
262
|
-
exports.makeEndpoint = makeEndpoint;
|
|
263
51
|
//# sourceMappingURL=endpoint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/microservice/endpoint.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/microservice/endpoint.ts"],"names":[],"mappings":";;AAAA,oBAAoB;AACpB,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;IACzC,kEAAkE;IAClE,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,EAAE,CAAC;KACb;IACD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;QACrC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,KAAK,IAAI,GAAG,IAAI,YAAY,EAAE;YAC5B,eAAe;YACf,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE;gBACrF,IAAI,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC;gBACzD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7C,KAAK,IAAI,GAAG,IAAI,UAAU,EAAE;oBAC1B,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;oBACtC,8BAA8B;oBAC9B,mCAAmC;oBACnC,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE;wBACvB,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;qBAC5B;oBACD,+BAA+B;oBAC/B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;2BAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACzB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;qBAC7B;iBACF;aACF;YACD,aAAa;YACb,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE;gBACnF,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC;gBACrD,KAAK,IAAI,SAAS,IAAI,UAAU,EAAE;oBAChC,0CAA0C;oBAC1C,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE;wBACrB,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;wBAC5C,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;qBAC5C;oBACD,+BAA+B;oBAC/B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;2BAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACzB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;qBAC7B;iBACF;aACF;SACF;KACF;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { Logger } from 'winston';
|
|
3
3
|
import { EventEmitter } from 'events';
|
|
4
|
+
import { BindConfig } from './transport/provider/grpc';
|
|
4
5
|
/**
|
|
5
6
|
* register transport provider
|
|
6
7
|
*
|
|
@@ -25,14 +26,14 @@ export declare class Server extends EventEmitter {
|
|
|
25
26
|
* @param {object} config Server config.
|
|
26
27
|
* @param {Logger} logger
|
|
27
28
|
*/
|
|
28
|
-
constructor(config?: any, logger?: Logger
|
|
29
|
+
constructor(config?: any, logger?: Logger);
|
|
29
30
|
/**
|
|
30
31
|
* bind connects the service to configured transports.
|
|
31
32
|
*
|
|
32
33
|
* @param {string} name Service name.
|
|
33
|
-
* @param {
|
|
34
|
+
* @param {BindConfig} bindConfig A business logic service.
|
|
34
35
|
*/
|
|
35
|
-
bind(name: string,
|
|
36
|
+
bind(name: string, bindConfig: BindConfig<any>): Promise<void>;
|
|
36
37
|
/**
|
|
37
38
|
* start launches the server by starting transports and listening to events.
|
|
38
39
|
*/
|
|
@@ -24,7 +24,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.Server = exports.registerTransport = void 0;
|
|
27
|
-
const endpoint_1 = require("./endpoint");
|
|
28
27
|
const logger_1 = require("@restorecommerce/logger");
|
|
29
28
|
const _ = __importStar(require("lodash"));
|
|
30
29
|
const events_1 = require("events");
|
|
@@ -84,7 +83,7 @@ class Server extends events_1.EventEmitter {
|
|
|
84
83
|
* @param {object} config Server config.
|
|
85
84
|
* @param {Logger} logger
|
|
86
85
|
*/
|
|
87
|
-
constructor(config, logger
|
|
86
|
+
constructor(config, logger) {
|
|
88
87
|
super();
|
|
89
88
|
if (_.isNil(config)) {
|
|
90
89
|
throw new Error('mising argument config');
|
|
@@ -109,24 +108,6 @@ class Server extends events_1.EventEmitter {
|
|
|
109
108
|
}
|
|
110
109
|
// services
|
|
111
110
|
this.logger.debug('setting up service endpoints');
|
|
112
|
-
if (!this.config.services || !this.config.transports) {
|
|
113
|
-
if (this.config.events) {
|
|
114
|
-
if (this.config.transports) {
|
|
115
|
-
this.logger.warn('missing endpoints configuration');
|
|
116
|
-
}
|
|
117
|
-
if (this.config.services) {
|
|
118
|
-
this.logger.warn('missing services configuration');
|
|
119
|
-
}
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (this.config.transports && this.config.transports.length > 0) {
|
|
123
|
-
throw new Error('missing services configuration');
|
|
124
|
-
}
|
|
125
|
-
if (this.config.services) {
|
|
126
|
-
throw new Error('missing transports configuration');
|
|
127
|
-
}
|
|
128
|
-
throw new Error('missing server configuration');
|
|
129
|
-
}
|
|
130
111
|
// transports
|
|
131
112
|
this.logger.debug('setting up transports');
|
|
132
113
|
try {
|
|
@@ -136,105 +117,31 @@ class Server extends events_1.EventEmitter {
|
|
|
136
117
|
this.logger.error('setupTransports', { code: error.code, message: error.message, stack: error.stack });
|
|
137
118
|
throw error;
|
|
138
119
|
}
|
|
139
|
-
/**
|
|
140
|
-
* Requests will traverse the middlewares in the order they're declared.
|
|
141
|
-
* That is, the first middleware is called first.
|
|
142
|
-
*
|
|
143
|
-
* @type {Array.<generator>}
|
|
144
|
-
*/
|
|
145
|
-
if (!middleware) {
|
|
146
|
-
this.middleware = [];
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
this.middleware = middleware;
|
|
150
|
-
}
|
|
151
120
|
}
|
|
152
121
|
/**
|
|
153
122
|
* bind connects the service to configured transports.
|
|
154
123
|
*
|
|
155
124
|
* @param {string} name Service name.
|
|
156
|
-
* @param {
|
|
125
|
+
* @param {BindConfig} bindConfig A business logic service.
|
|
157
126
|
*/
|
|
158
|
-
async bind(name,
|
|
127
|
+
async bind(name, bindConfig) {
|
|
159
128
|
if (_.isNil(name)) {
|
|
160
129
|
throw new Error('missing argument name');
|
|
161
130
|
}
|
|
162
131
|
if (!_.isString(name)) {
|
|
163
132
|
throw new Error('argument name is not of type string');
|
|
164
133
|
}
|
|
165
|
-
if (_.isNil(
|
|
166
|
-
throw new Error('missing argument
|
|
167
|
-
}
|
|
168
|
-
const serviceCfg = this.config.services[name];
|
|
169
|
-
if (!serviceCfg) {
|
|
170
|
-
throw new Error(`configuration for ${name} does not exist`);
|
|
134
|
+
if (_.isNil(bindConfig)) {
|
|
135
|
+
throw new Error('missing argument bindConfig');
|
|
171
136
|
}
|
|
137
|
+
this.logger.debug('binding endpoints to transports');
|
|
172
138
|
const transportNames = Object.keys(this.transport);
|
|
173
|
-
// endpoints
|
|
174
|
-
const logger = this.logger;
|
|
175
|
-
const endpoints = {};
|
|
176
|
-
Object.keys(serviceCfg).forEach((endpointName) => {
|
|
177
|
-
const endpointCfg = serviceCfg[endpointName];
|
|
178
|
-
if (_.isNil(endpointCfg)) {
|
|
179
|
-
logger.error(`configuration for service
|
|
180
|
-
${name} endpoint ${endpointName} does not exist`);
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
for (let i = 0; i < endpointCfg.transport.length; i += 1) {
|
|
184
|
-
const transportName = endpointCfg.transport[i];
|
|
185
|
-
if (!endpoints[transportName]) {
|
|
186
|
-
endpoints[transportName] = [];
|
|
187
|
-
}
|
|
188
|
-
if (!_.includes(transportNames, transportName)) {
|
|
189
|
-
logger.warn(`transport ${transportName} does not exist`, {
|
|
190
|
-
service: name,
|
|
191
|
-
method: endpointName,
|
|
192
|
-
});
|
|
193
|
-
continue;
|
|
194
|
-
}
|
|
195
|
-
endpoints[transportName].push(endpointName);
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
logger.debug('endpoints', endpoints);
|
|
199
|
-
logger.debug('binding endpoints to transports');
|
|
200
|
-
const middleware = this.middleware;
|
|
201
139
|
const transport = this.transport;
|
|
202
|
-
const cfg = this.config;
|
|
203
140
|
for (let i = 0; i < transportNames.length; i += 1) {
|
|
204
141
|
const transportName = transportNames[i];
|
|
205
142
|
const provider = transport[transportName];
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
logger.verbose(`transport ${transportName} does not have any endpoints configured`);
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
const binding = {};
|
|
212
|
-
for (let j = 0; j < methodNames.length; j += 1) {
|
|
213
|
-
const methodName = methodNames[j];
|
|
214
|
-
if (!_.isFunction(service[methodName])) {
|
|
215
|
-
logger.warn(`endpoint ${methodName} does not have matching service method`);
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
const methodCfg = serviceCfg[methodName];
|
|
219
|
-
if (_.isNil(methodCfg)) {
|
|
220
|
-
logger.error(`endpoint ${name}.${methodName} does not have configuration`);
|
|
221
|
-
continue;
|
|
222
|
-
}
|
|
223
|
-
if (!_.includes(methodCfg.transport, transportName)) {
|
|
224
|
-
logger.error(`endpoint ${name}.${methodName}
|
|
225
|
-
is not configured for transport ${transportName}, skipping endpoint binding`);
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
binding[methodName] = (0, endpoint_1.makeEndpoint)(middleware, service, transportName, methodName, logger, cfg);
|
|
229
|
-
logger.debug(`endpoint ${methodName} bound to transport ${transportName}`);
|
|
230
|
-
}
|
|
231
|
-
if (_.size(_.functions(binding)) === 0) {
|
|
232
|
-
logger.verbose(`service ${name} has no endpoints configured
|
|
233
|
-
for transport ${transportName}, skipping service binding`);
|
|
234
|
-
continue;
|
|
235
|
-
}
|
|
236
|
-
await provider.bind(name, binding);
|
|
237
|
-
this.emit('bound', name, binding, provider);
|
|
143
|
+
await provider.bind(bindConfig);
|
|
144
|
+
this.emit('bound', name, bindConfig, provider);
|
|
238
145
|
}
|
|
239
146
|
}
|
|
240
147
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/microservice/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/microservice/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import * as grpc from '@grpc/grpc-js';
|
|
2
1
|
import { Logger } from 'winston';
|
|
2
|
+
import type { Server as GRPCServer, ServiceImplementation } from 'nice-grpc';
|
|
3
|
+
import type { CompatServiceDefinition } from 'nice-grpc/lib/service-definitions';
|
|
4
|
+
import { WithRequestID } from './middlewares';
|
|
5
|
+
/**
|
|
6
|
+
* Name of the transport
|
|
7
|
+
*/
|
|
8
|
+
export declare const NAME = "grpc";
|
|
9
|
+
export interface BindConfig<Service extends CompatServiceDefinition> {
|
|
10
|
+
service: Service;
|
|
11
|
+
implementation: ServiceImplementation<Service>;
|
|
12
|
+
}
|
|
3
13
|
/**
|
|
4
14
|
* Server transport provider.
|
|
5
15
|
* @class
|
|
@@ -7,27 +17,24 @@ import { Logger } from 'winston';
|
|
|
7
17
|
export declare class Server {
|
|
8
18
|
config: any;
|
|
9
19
|
logger: Logger;
|
|
10
|
-
server:
|
|
11
|
-
builder: any;
|
|
12
|
-
proto: any;
|
|
13
|
-
service: any;
|
|
20
|
+
server: GRPCServer<WithRequestID>;
|
|
14
21
|
name: string;
|
|
15
22
|
isBound: boolean;
|
|
16
23
|
/**
|
|
17
24
|
* Server is a gRPC transport provider for serving.
|
|
18
25
|
*
|
|
19
26
|
* @param {Object} config Configuration object.
|
|
20
|
-
* Requires properties:addr
|
|
27
|
+
* Requires properties: addr
|
|
21
28
|
* Optional properties: credentials.ssl.certs
|
|
29
|
+
* @param {Logger} logger Logger.
|
|
22
30
|
*/
|
|
23
31
|
constructor(config: any, logger: Logger);
|
|
24
32
|
/**
|
|
25
33
|
* bind maps the service to gRPC methods and binds the address.
|
|
26
34
|
*
|
|
27
|
-
* @param
|
|
28
|
-
* @param {Object} service Business logic
|
|
35
|
+
* @param {BindConfig} config Service bind config.
|
|
29
36
|
*/
|
|
30
|
-
bind(
|
|
37
|
+
bind(config: BindConfig<any>): void;
|
|
31
38
|
/**
|
|
32
39
|
* start launches the gRPC server and provides the service endpoints.
|
|
33
40
|
*/
|
|
@@ -37,5 +44,3 @@ export declare class Server {
|
|
|
37
44
|
*/
|
|
38
45
|
end(): Promise<any>;
|
|
39
46
|
}
|
|
40
|
-
import { ServerReflection } from './reflection';
|
|
41
|
-
export { ServerReflection };
|