@lad-tech/nsc-toolkit 1.14.0 → 1.15.1

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.14.0](https://github.com/lad-tech/nsc-toolkit/compare/v1.13.1...v1.14.0) (2023-08-15)
1
+ ## [1.15.1](https://github.com/lad-tech/nsc-toolkit/compare/v1.15.0...v1.15.1) (2023-08-16)
2
2
 
3
3
 
4
- ### Features
4
+ ### Bug Fixes
5
5
 
6
- * debug logs for sync methods ([#70](https://github.com/lad-tech/nsc-toolkit/issues/70)) ([30a3b5a](https://github.com/lad-tech/nsc-toolkit/commit/30a3b5afc66bb79f99b67bac56075cf308ae41ef))
6
+ * singlton inject ([9627f1c](https://github.com/lad-tech/nsc-toolkit/commit/9627f1c6c5b82e73b910a8480697dcafa1abd14f))
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);
@@ -86,13 +107,14 @@ class Container {
86
107
  throw new Error(`Unknown dependency type for key ${key.toString()}`);
87
108
  }
88
109
  async initDependencies() {
89
- var _a;
110
+ var _a, _b;
90
111
  const initialized = [];
91
112
  for await (const [key, dependency] of this.container) {
92
113
  if (this.isAdapterDependency(dependency) && ((_a = dependency.options) === null || _a === void 0 ? void 0 : _a.init) && !this.singltons.has(key)) {
93
114
  const instance = this.getInstance(key);
94
115
  await (instance === null || instance === void 0 ? void 0 : instance.init());
95
116
  initialized.push(instance);
117
+ this.singltons.set(key, { value: instance, init: (_b = dependency.options) === null || _b === void 0 ? void 0 : _b.init });
96
118
  }
97
119
  }
98
120
  return initialized;
@@ -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> | 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.14.0",
3
+ "version": "1.15.1",
4
4
  "description": "Toolkit for create microservices around NATS",
5
5
  "main": "dist/index.js",
6
6
  "types": "./dist/types/index.d.ts",