@rsdk/grpc.clients 4.5.0 → 4.6.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 +10 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/options/di.d.ts +1 -0
- package/dist/options/di.js +5 -0
- package/dist/options/di.js.map +1 -0
- package/dist/options/options.module.d.ts +5 -0
- package/dist/options/options.module.js +31 -0
- package/dist/options/options.module.js.map +1 -0
- package/dist/options/types.d.ts +4 -0
- package/dist/options/types.js +3 -0
- package/dist/options/types.js.map +1 -0
- package/dist/plugin.d.ts +10 -0
- package/dist/plugin.js +18 -0
- package/dist/plugin.js.map +1 -0
- package/dist/repository/grpc-client.repository.d.ts +5 -3
- package/dist/repository/grpc-client.repository.js +35 -8
- package/dist/repository/grpc-client.repository.js.map +1 -1
- package/package.json +10 -10
- package/src/index.ts +1 -0
- package/src/options/di.ts +1 -0
- package/src/options/options.module.ts +22 -0
- package/src/options/types.ts +5 -0
- package/src/plugin.ts +18 -0
- package/src/repository/grpc-client.repository.ts +25 -9
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
|
+
## [4.6.0](https://github.com/R-Vision/rsdk/compare/v4.6.0-next.0...v4.6.0) (2024-04-22)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @rsdk/grpc.clients
|
|
9
|
+
|
|
10
|
+
## [4.6.0-next.0](https://github.com/R-Vision/rsdk/compare/v4.5.0...v4.6.0-next.0) (2024-04-22)
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* add passing client nice-grpc middleware via GrpcClientsPlugin ([#230](https://github.com/R-Vision/rsdk/issues/230)) ([6d932f9](https://github.com/R-Vision/rsdk/commit/6d932f92df5ace448a4fa10c80cf0dfa108bd624))
|
|
15
|
+
|
|
6
16
|
## [4.5.0](https://github.com/R-Vision/rsdk/compare/v4.5.0-next.1...v4.5.0) (2024-04-15)
|
|
7
17
|
|
|
8
18
|
**Note:** Version bump only for package @rsdk/grpc.clients
|
package/dist/index.d.ts
CHANGED
|
@@ -3,3 +3,4 @@ export { GrpcServers } from './servers/grpc.servers';
|
|
|
3
3
|
export * from './decorators/inject-client.decorator';
|
|
4
4
|
export * from './decorators/inject-client-factory.decorator';
|
|
5
5
|
export { getClientToken, getFactoryToken, getChannelToken, getPropertyKey, } from './token.factories';
|
|
6
|
+
export * from './plugin';
|
package/dist/index.js
CHANGED
|
@@ -26,4 +26,5 @@ Object.defineProperty(exports, "getClientToken", { enumerable: true, get: functi
|
|
|
26
26
|
Object.defineProperty(exports, "getFactoryToken", { enumerable: true, get: function () { return token_factories_1.getFactoryToken; } });
|
|
27
27
|
Object.defineProperty(exports, "getChannelToken", { enumerable: true, get: function () { return token_factories_1.getChannelToken; } });
|
|
28
28
|
Object.defineProperty(exports, "getPropertyKey", { enumerable: true, get: function () { return token_factories_1.getPropertyKey; } });
|
|
29
|
+
__exportStar(require("./plugin"), exports);
|
|
29
30
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wFAAqF;AAA5E,wIAAA,yBAAyB,OAAA;AAElC,uDAAqD;AAA5C,2GAAA,WAAW,OAAA;AAEpB,uEAAqD;AACrD,+EAA6D;AAC7D,qDAK2B;AAJzB,iHAAA,cAAc,OAAA;AACd,kHAAA,eAAe,OAAA;AACf,kHAAA,eAAe,OAAA;AACf,iHAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wFAAqF;AAA5E,wIAAA,yBAAyB,OAAA;AAElC,uDAAqD;AAA5C,2GAAA,WAAW,OAAA;AAEpB,uEAAqD;AACrD,+EAA6D;AAC7D,qDAK2B;AAJzB,iHAAA,cAAc,OAAA;AACd,kHAAA,eAAe,OAAA;AACf,kHAAA,eAAe,OAAA;AACf,iHAAA,cAAc,OAAA;AAEhB,2CAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const GRPC_CLIENTS_OPTIONS: unique symbol;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"di.js","sourceRoot":"","sources":["../../src/options/di.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var GrpcClientOptionsModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.GrpcClientOptionsModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const di_1 = require("./di");
|
|
13
|
+
let GrpcClientOptionsModule = GrpcClientOptionsModule_1 = class GrpcClientOptionsModule {
|
|
14
|
+
static forRoot(options) {
|
|
15
|
+
const optionsProvider = {
|
|
16
|
+
provide: di_1.GRPC_CLIENTS_OPTIONS,
|
|
17
|
+
useValue: options,
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
global: true,
|
|
21
|
+
module: GrpcClientOptionsModule_1,
|
|
22
|
+
providers: [optionsProvider],
|
|
23
|
+
exports: [optionsProvider],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
exports.GrpcClientOptionsModule = GrpcClientOptionsModule;
|
|
28
|
+
exports.GrpcClientOptionsModule = GrpcClientOptionsModule = GrpcClientOptionsModule_1 = __decorate([
|
|
29
|
+
(0, common_1.Module)({})
|
|
30
|
+
], GrpcClientOptionsModule);
|
|
31
|
+
//# sourceMappingURL=options.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.module.js","sourceRoot":"","sources":["../../src/options/options.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAwC;AAExC,6BAA4C;AAIrC,IAAM,uBAAuB,+BAA7B,MAAM,uBAAuB;IAClC,MAAM,CAAC,OAAO,CAAC,OAA2B;QACxC,MAAM,eAAe,GAAG;YACtB,OAAO,EAAE,yBAAoB;YAC7B,QAAQ,EAAE,OAAO;SAClB,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,yBAAuB;YAC/B,SAAS,EAAE,CAAC,eAAe,CAAC;YAC5B,OAAO,EAAE,CAAC,eAAe,CAAC;SAC3B,CAAC;IACJ,CAAC;CACF,CAAA;AAdY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,uBAAuB,CAcnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":""}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import type { Constructor } from '@rsdk/common';
|
|
3
|
+
import type { AppropriateTransports, PlatformAppPlugin } from '@rsdk/core';
|
|
4
|
+
import type { GrpcClientsOptions } from './options/types';
|
|
5
|
+
export declare class GrpcClientsPlugin implements PlatformAppPlugin {
|
|
6
|
+
private readonly options?;
|
|
7
|
+
constructor(options?: GrpcClientsOptions | undefined);
|
|
8
|
+
forTransports(): AppropriateTransports;
|
|
9
|
+
modules(): (DynamicModule | Constructor)[];
|
|
10
|
+
}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GrpcClientsPlugin = void 0;
|
|
4
|
+
const options_module_1 = require("./options/options.module");
|
|
5
|
+
class GrpcClientsPlugin {
|
|
6
|
+
options;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
forTransports() {
|
|
11
|
+
return 'any';
|
|
12
|
+
}
|
|
13
|
+
modules() {
|
|
14
|
+
return [options_module_1.GrpcClientOptionsModule.forRoot(this.options || {})];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.GrpcClientsPlugin = GrpcClientsPlugin;
|
|
18
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;;AAIA,6DAAmE;AAGnE,MAAa,iBAAiB;IACC;IAA7B,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;IAAG,CAAC;IAE7D,aAAa;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,OAAO,CAAC,wCAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF;AAVD,8CAUC"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { ChannelImplementation } from '@grpc/grpc-js/build/src/channel';
|
|
2
2
|
import type { Client } from 'nice-grpc';
|
|
3
3
|
import type { CompatServiceDefinition } from 'nice-grpc/lib/service-definitions';
|
|
4
|
+
import { GrpcClientsOptions } from '../options/types';
|
|
4
5
|
/**
|
|
5
6
|
* Простое кеш хранилище внутри DI для кеширования на замену статике
|
|
6
7
|
*/
|
|
7
8
|
export declare class GrpcClientRepository {
|
|
8
|
-
private
|
|
9
|
-
readonly channels
|
|
10
|
-
readonly clients
|
|
9
|
+
private readonly factory;
|
|
10
|
+
private readonly channels;
|
|
11
|
+
private readonly clients;
|
|
12
|
+
constructor(options?: GrpcClientsOptions);
|
|
11
13
|
resolveChannel(address: string, channelToken: string): ChannelImplementation;
|
|
12
14
|
resolveClient(definition: CompatServiceDefinition, channel: ChannelImplementation, clientToken: string): Client<CompatServiceDefinition>;
|
|
13
15
|
}
|
|
@@ -1,21 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
2
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
15
|
exports.GrpcClientRepository = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
4
17
|
const nice_grpc_1 = require("nice-grpc");
|
|
5
18
|
const exception_mapper_middleware_1 = require("../middleware/exception-mapper.middleware");
|
|
6
19
|
const opentelemetry_middleware_1 = require("../middleware/opentelemetry.middleware");
|
|
7
20
|
const request_metadata_middleware_1 = require("../middleware/request-metadata.middleware");
|
|
21
|
+
const di_1 = require("../options/di");
|
|
8
22
|
/**
|
|
9
23
|
* Простое кеш хранилище внутри DI для кеширования на замену статике
|
|
10
24
|
*/
|
|
11
|
-
class GrpcClientRepository {
|
|
12
|
-
|
|
13
|
-
.use((0, exception_mapper_middleware_1.exceptionMapperMiddleware)())
|
|
14
|
-
.use((0, opentelemetry_middleware_1.opentelemetryMiddleware)())
|
|
15
|
-
.use((0, request_metadata_middleware_1.requestMetadataMiddleware)());
|
|
25
|
+
let GrpcClientRepository = class GrpcClientRepository {
|
|
26
|
+
factory;
|
|
16
27
|
// Caches
|
|
17
28
|
channels = new Map();
|
|
18
29
|
clients = new Map();
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.factory = (0, nice_grpc_1.createClientFactory)()
|
|
32
|
+
.use((0, exception_mapper_middleware_1.exceptionMapperMiddleware)())
|
|
33
|
+
.use((0, opentelemetry_middleware_1.opentelemetryMiddleware)())
|
|
34
|
+
.use((0, request_metadata_middleware_1.requestMetadataMiddleware)());
|
|
35
|
+
const { middleware } = options || {};
|
|
36
|
+
if (middleware) {
|
|
37
|
+
for (const x of middleware)
|
|
38
|
+
this.factory.use(x);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
19
41
|
resolveChannel(address, channelToken) {
|
|
20
42
|
// TODO: Необходимо переосмыслить передачу сюда параметров из конфига для GRPC клиента.
|
|
21
43
|
// Очень скоро нужно будет конфигурировать GRPC клиенты для mTLS, а значит нужно будет
|
|
@@ -29,11 +51,16 @@ class GrpcClientRepository {
|
|
|
29
51
|
return channel;
|
|
30
52
|
}
|
|
31
53
|
resolveClient(definition, channel, clientToken) {
|
|
32
|
-
const existed = this.clients.get(clientToken) ??
|
|
33
|
-
GrpcClientRepository.factory.create(definition, channel);
|
|
54
|
+
const existed = this.clients.get(clientToken) ?? this.factory.create(definition, channel);
|
|
34
55
|
this.clients.set(clientToken, existed);
|
|
35
56
|
return existed;
|
|
36
57
|
}
|
|
37
|
-
}
|
|
58
|
+
};
|
|
38
59
|
exports.GrpcClientRepository = GrpcClientRepository;
|
|
60
|
+
exports.GrpcClientRepository = GrpcClientRepository = __decorate([
|
|
61
|
+
(0, common_1.Injectable)(),
|
|
62
|
+
__param(0, (0, common_1.Optional)()),
|
|
63
|
+
__param(0, (0, common_1.Inject)(di_1.GRPC_CLIENTS_OPTIONS)),
|
|
64
|
+
__metadata("design:paramtypes", [Object])
|
|
65
|
+
], GrpcClientRepository);
|
|
39
66
|
//# sourceMappingURL=grpc-client.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-client.repository.js","sourceRoot":"","sources":["../../src/repository/grpc-client.repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"grpc-client.repository.js","sourceRoot":"","sources":["../../src/repository/grpc-client.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAA8D;AAE9D,yCAImB;AAGnB,2FAAsF;AACtF,qFAAiF;AACjF,2FAAsF;AACtF,sCAAqD;AAGrD;;GAEG;AAGI,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACd,OAAO,CAAgB;IAExC,SAAS;IACQ,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IACtC,OAAO,GAAG,IAAI,GAAG,EAA2C,CAAC;IAE9E,YAC4C,OAA4B;QAEtE,IAAI,CAAC,OAAO,GAAG,IAAA,+BAAmB,GAAE;aACjC,GAAG,CAAC,IAAA,uDAAyB,GAAE,CAAC;aAChC,GAAG,CAAC,IAAA,kDAAuB,GAAE,CAAC;aAC9B,GAAG,CAAC,IAAA,uDAAyB,GAAE,CAAC,CAAC;QAEpC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAErC,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,UAAU;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,cAAc,CAAC,OAAe,EAAE,YAAoB;QAClD,uFAAuF;QACvF,sFAAsF;QACtF,kFAAkF;QAElF,MAAM,OAAO,GACX,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;YAC/B,IAAA,yBAAa,EAAC,OAAO,EAAE,8BAAkB,CAAC,cAAc,EAAE,EAAE;gBAC1D,YAAY;gBACZ,iCAAiC,EAAE,CAAC,CAAC;aACtC,CAAC,CAAC;QAEL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEzC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,aAAa,CACX,UAAmC,EACnC,OAA8B,EAC9B,WAAmB;QAEnB,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAE5E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAA;AAnDY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,iBAAQ,GAAE,CAAA;IAAE,WAAA,IAAA,eAAM,EAAC,yBAAoB,CAAC,CAAA;;GARhC,oBAAoB,CAmDhC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/grpc.clients",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.6.0",
|
|
4
4
|
"description": "Grpc clients infrastructure",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -17,17 +17,17 @@
|
|
|
17
17
|
"@nestjs/microservices": "^10.0.0",
|
|
18
18
|
"@opentelemetry/propagator-b3": "1.18.1",
|
|
19
19
|
"@opentelemetry/sdk-node": "0.45.1",
|
|
20
|
-
"@rsdk/autodoc.protocol": "^4.
|
|
21
|
-
"@rsdk/builtin-contract": "^4.
|
|
22
|
-
"@rsdk/common": "^4.
|
|
23
|
-
"@rsdk/core": "^4.
|
|
24
|
-
"@rsdk/grpc.common": "^4.
|
|
25
|
-
"@rsdk/logging": "^4.
|
|
26
|
-
"@rsdk/metadata": "^4.
|
|
27
|
-
"@rsdk/tracing": "^4.
|
|
20
|
+
"@rsdk/autodoc.protocol": "^4.6.0",
|
|
21
|
+
"@rsdk/builtin-contract": "^4.6.0",
|
|
22
|
+
"@rsdk/common": "^4.6.0",
|
|
23
|
+
"@rsdk/core": "^4.6.0",
|
|
24
|
+
"@rsdk/grpc.common": "^4.6.0",
|
|
25
|
+
"@rsdk/logging": "^4.6.0",
|
|
26
|
+
"@rsdk/metadata": "^4.6.0",
|
|
27
|
+
"@rsdk/tracing": "^4.6.0",
|
|
28
28
|
"nice-grpc": "^2.1.4",
|
|
29
29
|
"reflect-metadata": "^0.1.12 || ^0.2.0",
|
|
30
30
|
"rxjs": "^7.8.1"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "a80241b100c94432941215b2cb79892cb2155e06"
|
|
33
33
|
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const GRPC_CLIENTS_OPTIONS = Symbol('GRPC_CLIENTS_OPTIONS');
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { Module } from '@nestjs/common';
|
|
3
|
+
|
|
4
|
+
import { GRPC_CLIENTS_OPTIONS } from './di';
|
|
5
|
+
import type { GrpcClientsOptions } from './types';
|
|
6
|
+
|
|
7
|
+
@Module({})
|
|
8
|
+
export class GrpcClientOptionsModule {
|
|
9
|
+
static forRoot(options: GrpcClientsOptions): DynamicModule {
|
|
10
|
+
const optionsProvider = {
|
|
11
|
+
provide: GRPC_CLIENTS_OPTIONS,
|
|
12
|
+
useValue: options,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
return {
|
|
16
|
+
global: true,
|
|
17
|
+
module: GrpcClientOptionsModule,
|
|
18
|
+
providers: [optionsProvider],
|
|
19
|
+
exports: [optionsProvider],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import type { Constructor } from '@rsdk/common';
|
|
3
|
+
import type { AppropriateTransports, PlatformAppPlugin } from '@rsdk/core';
|
|
4
|
+
|
|
5
|
+
import { GrpcClientOptionsModule } from './options/options.module';
|
|
6
|
+
import type { GrpcClientsOptions } from './options/types';
|
|
7
|
+
|
|
8
|
+
export class GrpcClientsPlugin implements PlatformAppPlugin {
|
|
9
|
+
constructor(private readonly options?: GrpcClientsOptions) {}
|
|
10
|
+
|
|
11
|
+
forTransports(): AppropriateTransports {
|
|
12
|
+
return 'any';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
modules(): (DynamicModule | Constructor)[] {
|
|
16
|
+
return [GrpcClientOptionsModule.forRoot(this.options || {})];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ChannelImplementation } from '@grpc/grpc-js/build/src/channel';
|
|
2
|
-
import
|
|
2
|
+
import { Inject, Injectable, Optional } from '@nestjs/common';
|
|
3
|
+
import type { Channel, Client, ClientFactory } from 'nice-grpc';
|
|
3
4
|
import {
|
|
4
5
|
ChannelCredentials,
|
|
5
6
|
createChannel,
|
|
@@ -10,19 +11,35 @@ import type { CompatServiceDefinition } from 'nice-grpc/lib/service-definitions'
|
|
|
10
11
|
import { exceptionMapperMiddleware } from '../middleware/exception-mapper.middleware';
|
|
11
12
|
import { opentelemetryMiddleware } from '../middleware/opentelemetry.middleware';
|
|
12
13
|
import { requestMetadataMiddleware } from '../middleware/request-metadata.middleware';
|
|
14
|
+
import { GRPC_CLIENTS_OPTIONS } from '../options/di';
|
|
15
|
+
import { GrpcClientsOptions } from '../options/types';
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
18
|
* Простое кеш хранилище внутри DI для кеширования на замену статике
|
|
16
19
|
*/
|
|
20
|
+
|
|
21
|
+
@Injectable()
|
|
17
22
|
export class GrpcClientRepository {
|
|
18
|
-
private
|
|
19
|
-
.use(exceptionMapperMiddleware())
|
|
20
|
-
.use(opentelemetryMiddleware())
|
|
21
|
-
.use(requestMetadataMiddleware());
|
|
23
|
+
private readonly factory: ClientFactory;
|
|
22
24
|
|
|
23
25
|
// Caches
|
|
24
|
-
readonly channels = new Map<string, Channel>();
|
|
25
|
-
readonly clients = new Map<string, Client<CompatServiceDefinition>>();
|
|
26
|
+
private readonly channels = new Map<string, Channel>();
|
|
27
|
+
private readonly clients = new Map<string, Client<CompatServiceDefinition>>();
|
|
28
|
+
|
|
29
|
+
constructor(
|
|
30
|
+
@Optional() @Inject(GRPC_CLIENTS_OPTIONS) options?: GrpcClientsOptions,
|
|
31
|
+
) {
|
|
32
|
+
this.factory = createClientFactory()
|
|
33
|
+
.use(exceptionMapperMiddleware())
|
|
34
|
+
.use(opentelemetryMiddleware())
|
|
35
|
+
.use(requestMetadataMiddleware());
|
|
36
|
+
|
|
37
|
+
const { middleware } = options || {};
|
|
38
|
+
|
|
39
|
+
if (middleware) {
|
|
40
|
+
for (const x of middleware) this.factory.use(x);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
26
43
|
|
|
27
44
|
resolveChannel(address: string, channelToken: string): ChannelImplementation {
|
|
28
45
|
// TODO: Необходимо переосмыслить передачу сюда параметров из конфига для GRPC клиента.
|
|
@@ -47,8 +64,7 @@ export class GrpcClientRepository {
|
|
|
47
64
|
clientToken: string,
|
|
48
65
|
): Client<CompatServiceDefinition> {
|
|
49
66
|
const existed: Client<CompatServiceDefinition> =
|
|
50
|
-
this.clients.get(clientToken) ??
|
|
51
|
-
GrpcClientRepository.factory.create(definition, channel);
|
|
67
|
+
this.clients.get(clientToken) ?? this.factory.create(definition, channel);
|
|
52
68
|
|
|
53
69
|
this.clients.set(clientToken, existed);
|
|
54
70
|
|