@lad-tech/nsc-toolkit 1.13.1 → 1.15.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 CHANGED
@@ -1,6 +1,6 @@
1
- ## [1.13.1](https://github.com/lad-tech/nsc-toolkit/compare/v1.13.0...v1.13.1) (2023-08-09)
1
+ # [1.15.0](https://github.com/lad-tech/nsc-toolkit/compare/v1.14.0...v1.15.0) (2023-08-16)
2
2
 
3
3
 
4
- ### Bug Fixes
4
+ ### Features
5
5
 
6
- * getInstance not return null ([#67](https://github.com/lad-tech/nsc-toolkit/issues/67)) ([1182481](https://github.com/lad-tech/nsc-toolkit/commit/1182481b5e13cc129b30643877ceaa4d67ebc483))
6
+ * symbol().to syntax ([#72](https://github.com/lad-tech/nsc-toolkit/issues/72)) ([90e361e](https://github.com/lad-tech/nsc-toolkit/commit/90e361e001ad0b0686ed066e15102fb90209ead9))
package/README.md CHANGED
@@ -273,7 +273,7 @@ npm i
273
273
 
274
274
  - `getListener` 一 метод получения объекта `EventEmitter` для подписки на события сервиса.
275
275
 
276
- 3. Класс `Container`. Реализует DI-контейнре. Сам класс не доступен для импорта, а доступен только его экземпляр, что позволяет реализовать шаблон Singlton. В микросервисном варианте контейнер один на сервис. В монолитном варианте использования контейнер один на все приложение. За счет использользования объектов Symbol в качестве ключей для привязки зависимостей исключены коллизии при привязки зависимостей в разных частях приложения через один контейнре. Для привязки зависимости к ключу необходимо указать тип зависимости. Это нужно чтобы библиотека могла корректно создать ээкземпляр зависимости. Всего существуют 3 вида зависимостей:
276
+ 3. Класс `Container`. Реализует DI-контейнре. Сам класс не доступен для импорта, а доступен только его экземпляр, что позволяет реализовать шаблон Singlton. В микросервисном варианте контейнер один на сервис. В монолитном варианте использования контейнер один на все приложение. За счет использования объектов Symbol в качестве ключей для привязки зависимостей исключены коллизии при привязках зависимостей в разных частях приложения через один контейнер. Для привязки зависимости к ключу необходимо указать тип зависимости. Это нужно чтобы библиотека могла корректно создать экземпляр зависимости. Всего существуют 3 вида зависимостей:
277
277
 
278
278
  - `service` 一 сервис как зависимости.
279
279
  - `adapter` 一 класс с набором синхронных или асинхронных методов. Например репозиторий или фасад от стороннего API. Этот тип зависимости можно настроить с помощью необязательного объекта настроек. У опций адаптера могут быть следующие настройки:
@@ -286,7 +286,22 @@ npm i
286
286
  }
287
287
  ```
288
288
  Если адаптер реализует требуемые методы и при передачи флага `init` при привязки адаптера адаптер можно будет инициализировать через контейнер использую метод контейнера `init`. Если к контейнеру было привязано несколько адаптеров, которые необходимо инициализировать, то после вызова метода контейнера `init` все адаптеры будут инициализированны последовательно. Метод инициализации вернет массив инициализированных экземпляров адаптеров. Каждый адаптер с настройкой `init` также становится singlton'ом.
289
- - `constant`一 обычный объект. Например объект с конфигурацией.
289
+ - `constant`一 обычный объект. Например, объект с конфигурацией.
290
+ - Альтернативный синтаксис привязки с учетом вышеизложенной информации
291
+ ```js
292
+ // Простой адаптер
293
+ container.symbol(key).to.Adapter(InitializableService);
294
+ // константа
295
+ container.symbol(key2).to.Constant({ obj: 'value' });
296
+ // Синглтон
297
+ container.symbol(key).to.Singlton(mySingleton);
298
+ // Сервис с автоинициазлзацией
299
+ container.symbol(key).to.Initializable(InitializableService);
300
+ // Сервис
301
+ container.symbol(key).to.Service(MyService);
302
+
303
+
304
+ ```
290
305
 
291
306
  Публичные методы:
292
307
 
@@ -464,4 +479,4 @@ Service/
464
479
  ┌---------┐ ┌───────────-┐ ┌───────────---┐ ┌---------┐
465
480
  | GetUser |--->│ Repository |--->| Configurator |--->| Storage |
466
481
  └---------┘ └─────-─────-┘ └─────-─────---┘ └---------┘
467
- ```
482
+ ```
package/dist/Container.js CHANGED
@@ -49,6 +49,27 @@ class Container {
49
49
  bind(key, type, value, options) {
50
50
  this.container.set(key, { type, value, options });
51
51
  }
52
+ symbol(key) {
53
+ return {
54
+ to: {
55
+ Adapter: (value, options) => {
56
+ this.container.set(key, { type: _1.DependencyType.ADAPTER, value, options });
57
+ },
58
+ Singlton: (value) => {
59
+ this.container.set(key, { type: _1.DependencyType.ADAPTER, value, options: { singlton: true } });
60
+ },
61
+ Constant: (value) => {
62
+ this.container.set(key, { type: _1.DependencyType.CONSTANT, value, options: { singlton: true } });
63
+ },
64
+ Initializable: (value) => {
65
+ this.container.set(key, { type: _1.DependencyType.ADAPTER, value, options: { init: true } });
66
+ },
67
+ Service: (value) => {
68
+ this.container.set(key, { type: _1.DependencyType.SERVICE, value });
69
+ },
70
+ },
71
+ };
72
+ }
52
73
  async unbind(key) {
53
74
  this.container.delete(key);
54
75
  const instance = this.singltons.get(key);
package/dist/Service.js CHANGED
@@ -167,11 +167,6 @@ class Service extends Root_1.Root {
167
167
  dependences[key] = new Proxy(instance, trap);
168
168
  });
169
169
  }
170
- dependences['logger'] = new toolbelt_1.Logs.Logger({
171
- location: `${this.serviceName}.${method.settings.action}`,
172
- metadata: baggage,
173
- outputFormatter: this.options.loggerOutputFormatter,
174
- });
175
170
  return dependences;
176
171
  }
177
172
  /**
@@ -183,7 +178,6 @@ class Service extends Root_1.Root {
183
178
  for (const key in dependencies) {
184
179
  context[key] = dependencies[key];
185
180
  }
186
- context['emitter'] = this.emitter;
187
181
  return context;
188
182
  }
189
183
  /**
@@ -333,17 +327,27 @@ class Service extends Root_1.Root {
333
327
  const tracer = api_1.trace.getTracer('');
334
328
  const context = this.getContext(baggage);
335
329
  const span = tracer.startSpan(subject, undefined, context);
330
+ const logger = new toolbelt_1.Logs.Logger({
331
+ location: `${this.serviceName}.${Method.settings.action}`,
332
+ metadata: baggage,
333
+ outputFormatter: this.options.loggerOutputFormatter,
334
+ });
336
335
  try {
337
336
  const requestedDependencies = this.createObjectWithDependencies(Method, tracer, this.getNextBaggage(span, baggage));
338
337
  const context = this.createMethodContext(Method, requestedDependencies);
338
+ context['logger'] = logger;
339
+ context['emitter'] = this.emitter;
340
+ const response = await context.handler.call(context, payload);
339
341
  const result = {
340
- payload: await context.handler.call(context, payload),
342
+ payload: response,
341
343
  };
344
+ logger.debug({ request: payload, response });
342
345
  this.finishSpan(span);
343
346
  return result;
344
347
  }
345
348
  catch (error) {
346
- this.logger.error(error);
349
+ logger.debug({ request: payload });
350
+ logger.error(error);
347
351
  this.finishSpan(span, error);
348
352
  return this.buildErrorMessage(error);
349
353
  }
@@ -1,4 +1,4 @@
1
- import { DependencyType, ClientService, InitializableService } from '.';
1
+ import { ClientService, DependencyType, InitializableService } from '.';
2
2
  type Constant = Record<string, any>;
3
3
  type Service<R extends Constant = Constant> = ClientService<R>;
4
4
  export type Adapter<R extends Constant = Constant> = new (...args: any[]) => R;
@@ -27,6 +27,19 @@ declare class Container {
27
27
  bind<R extends Record<string, any>>(key: symbol, type: typeof DependencyType.ADAPTER, value: Adapter<R>, options?: Singlton): void;
28
28
  bind<R extends Record<string, any>>(key: symbol, type: typeof DependencyType.ADAPTER, value: Adapter<R & InitializableService>, options?: NeedInit): void;
29
29
  bind<R extends Record<string, any>>(key: symbol, type: typeof DependencyType.CONSTANT, value: R): void;
30
+ symbol(key: symbol): {
31
+ to: {
32
+ Adapter: <R extends Record<string, any>>(value: Adapter<R & import("./interfaces").GracefulShutdownAdditionalService & {
33
+ init: () => Promise<any>;
34
+ }>, options?: AdapterOptions) => void;
35
+ Singlton: <R_1 extends Record<string, any>>(value: Adapter<R_1>) => void;
36
+ Constant: <R_2 extends Record<string, any>>(value: R_2) => void;
37
+ Initializable: <R_3 extends Record<string, any>>(value: Adapter<R_3 & import("./interfaces").GracefulShutdownAdditionalService & {
38
+ init: () => Promise<any>;
39
+ }>) => void;
40
+ Service: <R_4 extends Record<string, any>>(value: ClientService<R_4>) => void;
41
+ };
42
+ };
30
43
  unbind(key: symbol): Promise<void>;
31
44
  get(key: symbol): {
32
45
  dependency: ContainerValue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lad-tech/nsc-toolkit",
3
- "version": "1.13.1",
3
+ "version": "1.15.0",
4
4
  "description": "Toolkit for create microservices around NATS",
5
5
  "main": "dist/index.js",
6
6
  "types": "./dist/types/index.d.ts",