@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 +3 -3
- package/README.md +18 -3
- package/dist/Container.js +21 -0
- package/dist/Service.js +12 -8
- package/dist/types/Container.d.ts +14 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
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
|
-
###
|
|
4
|
+
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
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. В микросервисном варианте контейнер один на сервис. В монолитном варианте использования контейнер один на все приложение. За счет
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
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;
|