@rsdk/core 1.0.12 → 2.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.
Files changed (248) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/app/platform.app.d.ts +1 -1
  3. package/dist/app/platform.app.js +3 -25
  4. package/dist/app/platform.app.js.map +1 -1
  5. package/dist/app-metadata/app-metadata.module.js.map +1 -1
  6. package/dist/app-metadata/exceptions/app-name-validation.exception.js.map +1 -1
  7. package/dist/config/additional-source/additional-source.initializer.d.ts +6 -2
  8. package/dist/config/additional-source/additional-source.initializer.js +24 -18
  9. package/dist/config/additional-source/additional-source.initializer.js.map +1 -1
  10. package/dist/config/additional-source/additional-source.module.d.ts +1 -1
  11. package/dist/config/additional-source/additional-source.module.js +3 -1
  12. package/dist/config/additional-source/additional-source.module.js.map +1 -1
  13. package/dist/config/config-reload.indicator.d.ts +3 -2
  14. package/dist/config/config-reload.indicator.js +4 -3
  15. package/dist/config/config-reload.indicator.js.map +1 -1
  16. package/dist/config/config.abstract.d.ts +3 -2
  17. package/dist/config/config.abstract.js +3 -3
  18. package/dist/config/config.abstract.js.map +1 -1
  19. package/dist/config/config.module.d.ts +0 -81
  20. package/dist/config/config.module.js +26 -203
  21. package/dist/config/config.module.js.map +1 -1
  22. package/dist/config/context/config.context.d.ts +75 -0
  23. package/dist/config/context/config.context.js +159 -0
  24. package/dist/config/context/config.context.js.map +1 -0
  25. package/dist/config/context/module.d.ts +5 -0
  26. package/dist/config/context/module.js +26 -0
  27. package/dist/config/context/module.js.map +1 -0
  28. package/dist/config/exceptions/config-not-bootstrapped.exception.js.map +1 -1
  29. package/dist/config/exceptions/property.exception.d.ts +9 -2
  30. package/dist/config/exceptions/property.exception.js +4 -6
  31. package/dist/config/exceptions/property.exception.js.map +1 -1
  32. package/dist/config/index.d.ts +1 -0
  33. package/dist/config/index.js +3 -1
  34. package/dist/config/index.js.map +1 -1
  35. package/dist/config/metadata/config-metadata.provider.d.ts +21 -0
  36. package/dist/config/metadata/config-metadata.provider.js +37 -0
  37. package/dist/config/metadata/config-metadata.provider.js.map +1 -0
  38. package/dist/config/metadata/config-metadata.registry.d.ts +1 -9
  39. package/dist/config/metadata/config-metadata.registry.js +9 -28
  40. package/dist/config/metadata/config-metadata.registry.js.map +1 -1
  41. package/dist/config/metadata/constants.d.ts +3 -0
  42. package/dist/config/metadata/constants.js +7 -0
  43. package/dist/config/metadata/constants.js.map +1 -0
  44. package/dist/config/metadata/decorators/declare-property.decorator.js +2 -2
  45. package/dist/config/metadata/decorators/declare-property.decorator.js.map +1 -1
  46. package/dist/config/metadata/decorators/inject-property.decorator.d.ts +1 -1
  47. package/dist/config/metadata/decorators/inject-property.decorator.js +1 -1
  48. package/dist/config/metadata/exceptions/duplicate-property.exception.js.map +1 -1
  49. package/dist/config/metadata/exceptions/duplicate-section.exception.js.map +1 -1
  50. package/dist/config/metadata/exceptions/duplicate-source.exception.js.map +1 -1
  51. package/dist/config/metadata/types.d.ts +16 -0
  52. package/dist/config/metadata/types.js +3 -0
  53. package/dist/config/metadata/types.js.map +1 -0
  54. package/dist/config/reload/config-reload.events.d.ts +0 -2
  55. package/dist/config/reload/config-reload.events.js +0 -8
  56. package/dist/config/reload/config-reload.events.js.map +1 -1
  57. package/dist/config/sources/base/reloadable-config-source.abstract.d.ts +3 -2
  58. package/dist/config/sources/base/reloadable-config-source.abstract.js +3 -3
  59. package/dist/config/sources/base/reloadable-config-source.abstract.js.map +1 -1
  60. package/dist/config/sources/exceptions/config-source-di.exception.js.map +1 -1
  61. package/dist/config/sources/implementations/json-file.source.js.map +1 -1
  62. package/dist/config/sources/implementations/relodable-json-file.source.d.ts +3 -1
  63. package/dist/config/sources/implementations/relodable-json-file.source.js +6 -3
  64. package/dist/config/sources/implementations/relodable-json-file.source.js.map +1 -1
  65. package/dist/config/vars.class.d.ts +1 -1
  66. package/dist/config/vars.class.js +6 -6
  67. package/dist/config/vars.class.js.map +1 -1
  68. package/dist/context.aggregator.d.ts +21 -0
  69. package/dist/context.aggregator.js +53 -0
  70. package/dist/context.aggregator.js.map +1 -0
  71. package/dist/exceptions/base/platform-exception.absract.d.ts +2 -2
  72. package/dist/exceptions/base/platform-exception.absract.js +4 -1
  73. package/dist/exceptions/base/platform-exception.absract.js.map +1 -1
  74. package/dist/exceptions/implementations/bootstrap/double-init.exception.js.map +1 -1
  75. package/dist/exceptions/implementations/bootstrap/duplicate-protocol.exception.js.map +1 -1
  76. package/dist/exceptions/implementations/bootstrap/no-http.exception.js.map +1 -1
  77. package/dist/exceptions/implementations/bootstrap/no-init.exception.js.map +1 -1
  78. package/dist/exceptions/implementations/bootstrap/no-matching-transport.exception.js.map +1 -1
  79. package/dist/exceptions/implementations/bootstrap/sequence.exception.js.map +1 -1
  80. package/dist/exceptions/implementations/bootstrap/symbol-key-decoration.exception.js.map +1 -1
  81. package/dist/exceptions/implementations/bootstrap/unknown-bootstrap.exception.js.map +1 -1
  82. package/dist/exceptions/implementations/pipeline/authentication.exception.js.map +1 -1
  83. package/dist/exceptions/implementations/pipeline/conflict.exception.js.map +1 -1
  84. package/dist/exceptions/implementations/pipeline/duplicate-entity.exception.js.map +1 -1
  85. package/dist/exceptions/implementations/pipeline/input.exception.js.map +1 -1
  86. package/dist/exceptions/implementations/pipeline/internal.exception.js.map +1 -1
  87. package/dist/exceptions/implementations/pipeline/not-allowed.exception.js.map +1 -1
  88. package/dist/exceptions/implementations/pipeline/not-found.exception.js.map +1 -1
  89. package/dist/exceptions/implementations/pipeline/timeout.exception.js.map +1 -1
  90. package/dist/exceptions.handling/global-exceptions.config.js.map +1 -1
  91. package/dist/exceptions.handling/global-exceptions.filter.js.map +1 -1
  92. package/dist/exceptions.handling/global-exceptions.module.js.map +1 -1
  93. package/dist/health/autodoc/heath.autodoc-resolver.d.ts +5 -15
  94. package/dist/health/autodoc/heath.autodoc-resolver.js +11 -13
  95. package/dist/health/autodoc/heath.autodoc-resolver.js.map +1 -1
  96. package/dist/health/exceptions/health-check.exception.js.map +1 -1
  97. package/dist/health/health.const.d.ts +1 -0
  98. package/dist/health/health.const.js +2 -1
  99. package/dist/health/health.const.js.map +1 -1
  100. package/dist/health/health.module.js.map +1 -1
  101. package/dist/health/health.service.d.ts +6 -2
  102. package/dist/health/health.service.js +19 -6
  103. package/dist/health/health.service.js.map +1 -1
  104. package/dist/health/metadata/constants.d.ts +1 -0
  105. package/dist/health/metadata/constants.js +5 -0
  106. package/dist/health/metadata/constants.js.map +1 -0
  107. package/dist/health/metadata/indicator.decorator.js +2 -12
  108. package/dist/health/metadata/indicator.decorator.js.map +1 -1
  109. package/dist/health/metadata/indicators.registry.d.ts +0 -7
  110. package/dist/health/metadata/indicators.registry.js +6 -14
  111. package/dist/health/metadata/indicators.registry.js.map +1 -1
  112. package/dist/health/metadata/types.d.ts +7 -0
  113. package/dist/health/metadata/types.js +3 -0
  114. package/dist/health/metadata/types.js.map +1 -0
  115. package/dist/index.d.ts +8 -1
  116. package/dist/index.js +13 -7
  117. package/dist/index.js.map +1 -1
  118. package/dist/logging/decorators/inject-logger.decorator.js +5 -3
  119. package/dist/logging/decorators/inject-logger.decorator.js.map +1 -1
  120. package/dist/logging/global-logger-provider.generator.d.ts +7 -0
  121. package/dist/logging/global-logger-provider.generator.js +22 -0
  122. package/dist/logging/global-logger-provider.generator.js.map +1 -0
  123. package/dist/logging/index.d.ts +2 -0
  124. package/dist/logging/index.js +3 -0
  125. package/dist/logging/index.js.map +1 -1
  126. package/dist/logging/logging.config.js +1 -1
  127. package/dist/logging/logging.config.js.map +1 -1
  128. package/dist/logging/logging.module.d.ts +5 -3
  129. package/dist/logging/logging.module.js +25 -13
  130. package/dist/logging/logging.module.js.map +1 -1
  131. package/dist/logging/metadata/constants.d.ts +1 -0
  132. package/dist/logging/metadata/constants.js +5 -0
  133. package/dist/logging/metadata/constants.js.map +1 -0
  134. package/dist/logging/types.d.ts +6 -2
  135. package/dist/metrics/index.d.ts +1 -1
  136. package/dist/metrics/index.js +3 -3
  137. package/dist/metrics/index.js.map +1 -1
  138. package/dist/metrics/metadata/autodoc/metrics.autodoc-resolver.d.ts +6 -7
  139. package/dist/metrics/metadata/autodoc/metrics.autodoc-resolver.js +8 -11
  140. package/dist/metrics/metadata/autodoc/metrics.autodoc-resolver.js.map +1 -1
  141. package/dist/metrics/metadata/constants.d.ts +1 -0
  142. package/dist/metrics/metadata/constants.js +5 -0
  143. package/dist/metrics/metadata/constants.js.map +1 -0
  144. package/dist/metrics/metadata/index.d.ts +0 -1
  145. package/dist/metrics/metadata/index.js +0 -3
  146. package/dist/metrics/metadata/index.js.map +1 -1
  147. package/dist/metrics/metadata/metrics.registry.d.ts +0 -3
  148. package/dist/metrics/metadata/metrics.registry.js +9 -16
  149. package/dist/metrics/metadata/metrics.registry.js.map +1 -1
  150. package/dist/metrics/metadata/types.d.ts +2 -4
  151. package/dist/metrics/metric.storage.d.ts +8 -0
  152. package/dist/metrics/metric.storage.js +11 -0
  153. package/dist/metrics/metric.storage.js.map +1 -0
  154. package/dist/metrics/metrics.config.js.map +1 -1
  155. package/dist/metrics/metrics.module.d.ts +1 -1
  156. package/dist/metrics/metrics.module.js +27 -21
  157. package/dist/metrics/metrics.module.js.map +1 -1
  158. package/dist/platform.context.d.ts +5 -3
  159. package/dist/platform.context.js +20 -19
  160. package/dist/platform.context.js.map +1 -1
  161. package/dist/platform.module.d.ts +5 -4
  162. package/dist/platform.module.js +24 -13
  163. package/dist/platform.module.js.map +1 -1
  164. package/dist/rsdk-metadata/constants.d.ts +3 -0
  165. package/dist/rsdk-metadata/constants.js +5 -0
  166. package/dist/rsdk-metadata/constants.js.map +1 -0
  167. package/dist/rsdk-metadata/rsdk-metadata.global-module.d.ts +6 -0
  168. package/dist/rsdk-metadata/rsdk-metadata.global-module.js +31 -0
  169. package/dist/rsdk-metadata/rsdk-metadata.global-module.js.map +1 -0
  170. package/dist/tracing/services/instrumentation.service.js.map +1 -1
  171. package/dist/tracing/services/metadata.scanner.js.map +1 -1
  172. package/dist/tracing/tracing.config.js.map +1 -1
  173. package/dist/tracing/tracing.module.js.map +1 -1
  174. package/dist/transport/transport.module.d.ts +1 -0
  175. package/dist/transport/transport.module.js +8 -2
  176. package/dist/transport/transport.module.js.map +1 -1
  177. package/dist/types/context-aggregated.d.ts +8 -0
  178. package/dist/types/context-aggregated.js +3 -0
  179. package/dist/types/context-aggregated.js.map +1 -0
  180. package/dist/types/options.d.ts +6 -6
  181. package/dist/types/transports.d.ts +10 -3
  182. package/dist/types/transports.js.map +1 -1
  183. package/dist/unhandled-rejection.handler.d.ts +1 -0
  184. package/dist/unhandled-rejection.handler.js +24 -0
  185. package/dist/unhandled-rejection.handler.js.map +1 -0
  186. package/package.json +8 -7
  187. package/src/app/platform.app.ts +6 -32
  188. package/src/config/additional-source/additional-source.initializer.ts +34 -25
  189. package/src/config/additional-source/additional-source.module.ts +5 -2
  190. package/src/config/config-reload.indicator.ts +3 -3
  191. package/src/config/config.abstract.ts +2 -3
  192. package/src/config/config.module.ts +23 -225
  193. package/src/config/context/config.context.ts +209 -0
  194. package/src/config/context/module.ts +25 -0
  195. package/src/config/exceptions/property.exception.ts +11 -6
  196. package/src/config/index.ts +1 -0
  197. package/src/config/metadata/config-metadata.provider.ts +79 -0
  198. package/src/config/metadata/config-metadata.registry.ts +36 -41
  199. package/src/config/metadata/constants.ts +6 -0
  200. package/src/config/metadata/decorators/declare-property.decorator.ts +2 -2
  201. package/src/config/metadata/decorators/inject-property.decorator.ts +1 -1
  202. package/src/config/metadata/types.ts +22 -0
  203. package/src/config/reload/config-reload.events.ts +1 -13
  204. package/src/config/sources/base/reloadable-config-source.abstract.ts +2 -3
  205. package/src/config/sources/implementations/relodable-json-file.source.ts +6 -2
  206. package/src/config/vars.class.ts +9 -7
  207. package/src/context.aggregator.ts +62 -0
  208. package/src/exceptions/base/platform-exception.absract.ts +8 -3
  209. package/src/health/autodoc/heath.autodoc-resolver.ts +15 -18
  210. package/src/health/health.const.ts +2 -0
  211. package/src/health/health.service.ts +23 -4
  212. package/src/health/metadata/constants.ts +1 -0
  213. package/src/health/metadata/indicator.decorator.ts +2 -18
  214. package/src/health/metadata/indicators.registry.ts +16 -23
  215. package/src/health/metadata/types.ts +9 -0
  216. package/src/index.ts +29 -12
  217. package/src/logging/decorators/inject-logger.decorator.ts +5 -4
  218. package/src/logging/global-logger-provider.generator.ts +28 -0
  219. package/src/logging/index.ts +2 -0
  220. package/src/logging/logging.config.ts +2 -1
  221. package/src/logging/logging.module.ts +42 -16
  222. package/src/logging/metadata/constants.ts +1 -0
  223. package/src/logging/types.ts +6 -2
  224. package/src/metrics/index.ts +1 -1
  225. package/src/metrics/metadata/autodoc/metrics.autodoc-resolver.ts +13 -9
  226. package/src/metrics/metadata/constants.ts +1 -0
  227. package/src/metrics/metadata/index.ts +0 -1
  228. package/src/metrics/metadata/metrics.registry.ts +19 -23
  229. package/src/metrics/metadata/types.ts +2 -5
  230. package/src/metrics/metric.storage.ts +10 -0
  231. package/src/metrics/metrics.module.ts +32 -31
  232. package/src/platform.context.ts +32 -20
  233. package/src/platform.module.ts +18 -20
  234. package/src/rsdk-metadata/constants.ts +5 -0
  235. package/src/rsdk-metadata/rsdk-metadata.global-module.ts +34 -0
  236. package/src/transport/transport.module.ts +13 -1
  237. package/src/types/context-aggregated.ts +10 -0
  238. package/src/types/options.ts +6 -5
  239. package/src/types/transports.ts +15 -3
  240. package/src/unhandled-rejection.handler.ts +29 -0
  241. package/dist/health/index.d.ts +0 -7
  242. package/dist/health/index.js +0 -26
  243. package/dist/health/index.js.map +0 -1
  244. package/dist/health/metadata/index.d.ts +0 -2
  245. package/dist/health/metadata/index.js +0 -19
  246. package/dist/health/metadata/index.js.map +0 -1
  247. package/src/health/index.ts +0 -7
  248. package/src/health/metadata/index.ts +0 -2
@@ -1,11 +1,8 @@
1
1
  import type { Constructor } from '@rsdk/common';
2
2
 
3
- import type { AnyMetric, MetricMetadata, OmitType } from '../types';
4
-
5
- import type { MetricType } from './decorators';
3
+ import type { AnyMetric, MetricMetadata } from '../types';
6
4
 
7
5
  export type MetricRsdkMetadata = {
8
- type: MetricType;
9
- metadata: OmitType<MetricMetadata>;
6
+ metadata: MetricMetadata;
10
7
  metricController: Constructor<AnyMetric>;
11
8
  };
@@ -0,0 +1,10 @@
1
+ import type { Constructor } from '@rsdk/common';
2
+
3
+ import type { AnyMetric } from './types';
4
+
5
+ /**
6
+ * Класс для хранения уже проинициализрованных метрик
7
+ */
8
+ export class MetricStorage {
9
+ metrics = new Map<Constructor<AnyMetric>, AnyMetric>();
10
+ }
@@ -4,15 +4,15 @@ import type {
4
4
  Provider,
5
5
  } from '@nestjs/common';
6
6
  import { Module } from '@nestjs/common';
7
- import { AutodocMetadata } from '@rsdk/autodoc-protocol';
8
7
  import type { Constructor } from '@rsdk/common';
9
8
  import { RsdkMetadata } from '@rsdk/metadata';
10
9
  import client from 'prom-client';
11
10
 
12
11
  import { PlatformConfigModule } from '../config';
13
12
 
13
+ import { METRIC_RSDK_METADATA_SCOPE } from './metadata/constants';
14
14
  import type { MetricRsdkMetadata } from './metadata';
15
- import { MetricAutodocResolver, MetricsRegistry } from './metadata';
15
+ import { MetricStorage } from './metric.storage';
16
16
  import { MetricsModuleConfig } from './metrics.config';
17
17
  import type { AnyMetric, MetricsModuleOptions } from './types';
18
18
 
@@ -29,7 +29,13 @@ import type { AnyMetric, MetricsModuleOptions } from './types';
29
29
  })
30
30
  export class MetricsModule implements OnApplicationBootstrap {
31
31
  private static isBootstrapped = false;
32
- private static metrics = new Map<Constructor<AnyMetric>, Provider>();
32
+ // TODO По идее от этого нужно избавиться, но тут нужно будет делать @InjectMetric(SomeMetric) там где сейчас используется someMetric: SomeMetric
33
+ // Но стоит понимать что смысла в этом нет от слова совсем
34
+ // Так как даже если там окажутся чужие метрики, но приложение не будет их использовать, то для приложения ничего не произойдёт
35
+ // Но даже если представить что существует коллизия с использованием одного и того же инстанса, то во-первых
36
+ // Это дыра в архитектуре потому что мы ссылаемся на один и тот же класс, то рассчитываем получить один и тот же инстанс, а так как это метрика то она должна быть общая на процесс, иначе не имеет смысла
37
+ // Во-вторых если запускаем n > 1 приложения в одном и том же процессе, то снимать метрики с этих приложений как минимум... странно?
38
+ // private static metrics = new Map<Constructor<AnyMetric>, Provider>();
33
39
 
34
40
  constructor(private readonly config: MetricsModuleConfig) {}
35
41
 
@@ -40,14 +46,23 @@ export class MetricsModule implements OnApplicationBootstrap {
40
46
  */
41
47
  static forRoot(options: MetricsModuleOptions): DynamicModule {
42
48
  return {
49
+ global: true,
43
50
  controllers: [...options.controllers],
44
51
  module: MetricsModule,
52
+ providers: [
53
+ {
54
+ provide: MetricStorage,
55
+ useValue: new MetricStorage(),
56
+ },
57
+ ],
58
+ exports: [MetricStorage],
45
59
  };
46
60
  }
47
61
 
48
62
  /**
49
63
  * Use this to inject specified metric into target module
50
64
  *
65
+ * @param first metric classe
51
66
  * @param other Not empty List of metric classes
52
67
  * @returns dynamic module
53
68
  */
@@ -58,43 +73,29 @@ export class MetricsModule implements OnApplicationBootstrap {
58
73
  const providers: Provider[] = [];
59
74
 
60
75
  for (const ctor of [first, ...other]) {
61
- const existing = this.metrics.get(ctor);
76
+ const [resource] =
77
+ RsdkMetadata.get<MetricRsdkMetadata>(
78
+ ctor,
79
+ METRIC_RSDK_METADATA_SCOPE,
80
+ ) ?? [];
62
81
 
63
- if (existing) {
64
- providers.push(existing);
82
+ const metadata = resource.value.metadata;
65
83
 
66
- continue;
67
- }
68
-
69
- const metadata = MetricsRegistry.getOne(ctor);
70
-
71
- const provider = {
84
+ providers.push({
85
+ inject: [MetricStorage],
72
86
  provide: ctor,
73
- useValue: new ctor(metadata),
74
- };
87
+ useFactory: (metricStorage: MetricStorage) => {
88
+ const existing =
89
+ metricStorage.metrics.get(ctor) ?? new ctor(metadata);
75
90
 
76
- const rsdkMetadata = new RsdkMetadata<MetricRsdkMetadata>(
77
- provider,
78
- 'metrics',
79
- );
80
-
81
- rsdkMetadata.add({
82
- type: metadata.type,
83
- metricController: ctor,
84
- metadata,
91
+ metricStorage.metrics.set(ctor, existing);
92
+ return existing;
93
+ },
85
94
  });
86
-
87
- const autodocMetadata = new AutodocMetadata(rsdkMetadata);
88
-
89
- const metricsDocumentResolver = new MetricAutodocResolver(rsdkMetadata);
90
-
91
- autodocMetadata.defineResolver(metricsDocumentResolver);
92
- providers.push(provider);
93
95
  }
94
96
 
95
97
  return {
96
98
  module: MetricsModule,
97
-
98
99
  exports: providers,
99
100
  providers,
100
101
  };
@@ -4,18 +4,19 @@ import type { NestApplicationOptions } from '@nestjs/common/interfaces/nest-appl
4
4
  import type { AbstractHttpAdapter } from '@nestjs/core';
5
5
  import type { Constructor } from '@rsdk/common';
6
6
  import { LoggerFactory } from '@rsdk/logging';
7
+ import type { RsdkMetadataProvider } from '@rsdk/metadata';
7
8
  import { groupBy, intersection } from 'lodash';
8
9
 
10
+ import { ConfigMetadataProvider } from './config/metadata/config-metadata.provider';
9
11
  import { Manifest } from './manifest/manifest';
10
12
  import type { Config, SectionMetadata } from './config';
11
- import { ConfigMetadataRegistry, PlatformConfigModule } from './config';
13
+ import { ContextAggregator } from './context.aggregator';
12
14
  import {
13
15
  DuplicateProtocolException,
14
16
  NoMatchingTransportException,
15
17
  } from './exceptions';
16
18
  import { NestLoggerAdapter } from './logging';
17
19
  import { NoopHttpAdapter } from './noop.http-adapter';
18
- import { PlatformModule } from './platform.module';
19
20
  import type {
20
21
  IHttpTransport,
21
22
  IMicroserviceTransport,
@@ -39,8 +40,8 @@ export class PlatformContext {
39
40
  private microservices: Map<INestMicroservice, IMicroserviceTransport>;
40
41
  private readonly httpTransport: IHttpTransport | undefined;
41
42
  private readonly httpAdapter: AbstractHttpAdapter;
43
+ private aggregator: ContextAggregator;
42
44
  private _extendedOptions: PlatformExtendedOptions;
43
- private _root: DynamicModule;
44
45
 
45
46
  /**
46
47
  * Создаёт контекст проводя базовые проверки
@@ -57,18 +58,7 @@ export class PlatformContext {
57
58
  this.httpTransport = options.transports?.find?.(isHttpTransport);
58
59
  this.httpAdapter =
59
60
  this.httpTransport?.getAdapter() ?? new NoopHttpAdapter();
60
- }
61
-
62
- get root(): DynamicModule {
63
- if (this._root) {
64
- return this._root;
65
- }
66
- PlatformConfigModule.bootstrap({
67
- ...(this.extendedOptions.config ?? {}),
68
- appName: this.extendedOptions.name,
69
- });
70
- this._root = PlatformModule.forRoot(this.extendedOptions);
71
- return this._root;
61
+ this.aggregator = new ContextAggregator(this);
72
62
  }
73
63
 
74
64
  get extendedOptions(): PlatformExtendedOptions {
@@ -116,12 +106,29 @@ export class PlatformContext {
116
106
  }
117
107
  }
118
108
 
109
+ async getRsdkMetadataProvider(): Promise<RsdkMetadataProvider> {
110
+ const aggregated = await this.aggregator.getAggregated();
111
+
112
+ return aggregated.rsdkMetadataProvider;
113
+ }
114
+
115
+ async getRoot(): Promise<DynamicModule> {
116
+ const { root } = await this.aggregator.getAggregated();
117
+
118
+ return root;
119
+ }
120
+
119
121
  /**
120
122
  * Get all important information about PlatformApp instance
121
123
  * @returns Readonly metadata
122
124
  */
123
- getMetadata(): Readonly<PlatformAppMetadata> {
124
- const confMetadata = ConfigMetadataRegistry.getMetadata();
125
+ async getMetadata(): Promise<Readonly<PlatformAppMetadata>> {
126
+ const rsdkMetadataProvider = await this.getRsdkMetadataProvider();
127
+
128
+ const confMetadata = new ConfigMetadataProvider(
129
+ rsdkMetadataProvider,
130
+ ).getMetadata();
131
+
125
132
  const options = this.extendedOptions;
126
133
  const protocols = (options?.transports ?? []).map((x) => x.getProtocol());
127
134
 
@@ -157,7 +164,9 @@ export class PlatformContext {
157
164
  * Производит все необходимые проверки и инициализации транспортов, не запускает приложение
158
165
  */
159
166
  async configureApp(app: INestApplication): Promise<void> {
160
- const awaiter = this.httpTransport?.configure(app);
167
+ const configContext = await this.aggregator.getConfigContext();
168
+
169
+ const awaiter = this.httpTransport?.configure(app, configContext);
161
170
  if (awaiter instanceof Promise) {
162
171
  await awaiter;
163
172
  }
@@ -169,7 +178,7 @@ export class PlatformContext {
169
178
  const transports = this.options.transports ?? ([] as any[]);
170
179
 
171
180
  for (const transport of transports.filter(isMicroserviceTransport)) {
172
- transport.init();
181
+ transport.init(configContext);
173
182
 
174
183
  const options = transport.createMicroserviceOptions();
175
184
  const microservice = app.connectMicroservice(options, {
@@ -186,9 +195,12 @@ export class PlatformContext {
186
195
  */
187
196
  async runConfiguredApplication(app: INestApplication): Promise<void> {
188
197
  try {
198
+ const configContext = await this.aggregator.getConfigContext();
199
+
189
200
  this.logger.info('Mapping controllers...');
190
201
  if (this.httpTransport) {
191
- const { host, port } = this.httpTransport.createHttpOptions();
202
+ const { host, port } =
203
+ this.httpTransport.createHttpOptions(configContext);
192
204
 
193
205
  await app.listen(port, host, () =>
194
206
  this.logger.info(`Http server started on ${host}:${port}`),
@@ -1,6 +1,6 @@
1
- import type { DynamicModule } from '@nestjs/common';
2
- import { Module } from '@nestjs/common';
3
- import type { MiddlewareConsumer, NestModule } from '@nestjs/common/interfaces';
1
+ import type { DynamicModule, NestModule } from '@nestjs/common';
2
+ import { Inject, Module } from '@nestjs/common';
3
+ import type { MiddlewareConsumer } from '@nestjs/common/interfaces';
4
4
  import type { Constructor } from '@rsdk/common';
5
5
 
6
6
  import { PlatformPluginModule } from './plugin/plugin.module';
@@ -10,29 +10,25 @@ import { PlatformConfigModule } from './config';
10
10
  import { SequenceException } from './exceptions';
11
11
  import { LoggingModule } from './logging';
12
12
  import { TracingModule } from './tracing';
13
- import type { PlatformExtendedOptions } from './types';
13
+ import { PlatformExtendedOptions } from './types';
14
14
 
15
15
  @Module({})
16
16
  export class PlatformModule implements NestModule {
17
- private static options: PlatformExtendedOptions;
17
+ constructor(
18
+ @Inject('PlatformExtendedOptions') private options: PlatformExtendedOptions,
19
+ ) {}
18
20
 
19
21
  static forRoot(options: PlatformExtendedOptions): DynamicModule {
20
- if (this.options) {
21
- throw new SequenceException(
22
- "Can't call PlatformModule.setup() method twice",
23
- );
24
- }
25
- this.options = options;
26
-
27
22
  const imports: (DynamicModule | Constructor)[] = [
28
23
  // Plugins
29
24
  PlatformPluginModule.forOptions(options),
30
25
 
31
26
  // Infrastructure
32
27
  AppMetadataModule.forRoot(options),
33
- LoggingModule.forRoot(),
34
28
  PlatformConfigModule.forRoot(options),
35
29
  TracingModule.forRoot({ appName: options.name, processing: 'simple' }),
30
+ LoggingModule.pureRoot(),
31
+ ...(options.modules ?? []),
36
32
  ];
37
33
 
38
34
  // Adding transport module if needed
@@ -40,25 +36,27 @@ export class PlatformModule implements NestModule {
40
36
  imports.push(PlatformTransportModule.forOptions(options));
41
37
  }
42
38
 
43
- // Adding application level modules
44
- if (options.modules) {
45
- imports.push(...options.modules);
46
- }
47
-
48
39
  return {
49
40
  module: PlatformModule,
50
41
  imports,
42
+ providers: [
43
+ {
44
+ provide: 'PlatformExtendedOptions',
45
+ useValue: options,
46
+ },
47
+ ],
48
+ exports: ['PlatformExtendedOptions'],
51
49
  };
52
50
  }
53
51
 
54
52
  configure(consumer: MiddlewareConsumer): void {
55
- if (!PlatformModule.options) {
53
+ if (!this.options) {
56
54
  throw new SequenceException(
57
55
  'Should call PlatformModule.setup() before configuring middleware!',
58
56
  );
59
57
  }
60
58
 
61
- for (const plugin of PlatformModule.options.plugins || []) {
59
+ for (const plugin of this.options.plugins || []) {
62
60
  plugin?.configureMiddleware?.(consumer);
63
61
  }
64
62
  }
@@ -0,0 +1,5 @@
1
+ import type { NestModuleDefinition } from '@rsdk/common';
2
+
3
+ export const PLATFORM_RAW_GLOBAL_METADATA_SCOPE =
4
+ 'PLATFORM_RAW_GLOBAL_RSDK_METADATA_SCOPE';
5
+ export type PlatformRawGlobalMetadata = NestModuleDefinition;
@@ -0,0 +1,34 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import { LoggerFactory } from '@rsdk/logging';
3
+ import { RsdkMetadataProvider } from '@rsdk/metadata';
4
+ import type { NestModuleDefinition } from '@rsdk/nest-tools/dist/nest-definition';
5
+
6
+ import type { PlatformRawGlobalMetadata } from './constants';
7
+ import { PLATFORM_RAW_GLOBAL_METADATA_SCOPE } from './constants';
8
+
9
+ export class RsdkMetadataGlobalModule {
10
+ static logger = LoggerFactory.create(RsdkMetadataGlobalModule);
11
+ static async raw(rootModule: NestModuleDefinition): Promise<DynamicModule> {
12
+ const rsdkMetadataProvider = await RsdkMetadataProvider.create(rootModule);
13
+ const resources = rsdkMetadataProvider.get<PlatformRawGlobalMetadata>(
14
+ PLATFORM_RAW_GLOBAL_METADATA_SCOPE,
15
+ );
16
+ const imports = resources.map(({ value }) => value);
17
+
18
+ RsdkMetadataGlobalModule.logger.debug('extracted imports: ', {
19
+ imports,
20
+ });
21
+ return {
22
+ global: true,
23
+ imports,
24
+ module: RsdkMetadataGlobalModule,
25
+ providers: [
26
+ {
27
+ provide: RsdkMetadataProvider,
28
+ useValue: rsdkMetadataProvider,
29
+ },
30
+ ],
31
+ exports: [...imports, RsdkMetadataProvider],
32
+ };
33
+ }
34
+ }
@@ -1,9 +1,10 @@
1
1
  import type { DynamicModule } from '@nestjs/common';
2
+ import type { NestModuleDefinition } from '@rsdk/common';
2
3
  import { flatten } from 'lodash';
3
4
 
4
5
  import type { IErrorsFormatter, IErrorsSender } from '../exceptions.handling';
5
6
  import { GlobalExceptionsModule } from '../exceptions.handling';
6
- import { HealthModule } from '../health';
7
+ import { HealthModule } from '../health/health.module';
7
8
  import { MetricsModule } from '../metrics';
8
9
  import type { PlatformExtendedOptions } from '../types';
9
10
  import { isPrimaryTransport } from '../types';
@@ -15,11 +16,22 @@ export class PlatformTransportModule {
15
16
  PlatformTransportModule.initHealthchecks(options),
16
17
  PlatformTransportModule.initMetrics(options),
17
18
  PlatformTransportModule.initExceptionsHandling(options),
19
+ ...PlatformTransportModule.getTransportModules(options),
18
20
  ],
19
21
  module: PlatformTransportModule,
20
22
  };
21
23
  }
22
24
 
25
+ private static getTransportModules(
26
+ options: PlatformExtendedOptions,
27
+ ): NestModuleDefinition[] {
28
+ return (
29
+ options?.transports?.flatMap?.((transport) => {
30
+ return transport.modules?.() ?? [];
31
+ }) ?? []
32
+ );
33
+ }
34
+
23
35
  private static initMetrics(options: PlatformExtendedOptions): DynamicModule {
24
36
  const transports = options.transports ?? ([] as any[]);
25
37
 
@@ -0,0 +1,10 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { RsdkMetadataProvider } from '@rsdk/metadata';
3
+
4
+ import type { ConfigContext } from '../config';
5
+
6
+ export type ContextAggregated = {
7
+ rsdkMetadataProvider: RsdkMetadataProvider;
8
+ root: DynamicModule;
9
+ configContext: ConfigContext;
10
+ };
@@ -1,5 +1,4 @@
1
- import type { DynamicModule } from '@nestjs/common';
2
- import type { Constructor, RequiredFields } from '@rsdk/common';
1
+ import type { NestModuleDefinition, RequiredFields } from '@rsdk/common';
3
2
 
4
3
  import type { ConfigModuleOptions } from '../config';
5
4
 
@@ -9,8 +8,10 @@ import type { IPrimaryTransport, ITransport } from './transports';
9
8
  /**
10
9
  * Not empty collection of modules
11
10
  */
12
- type Module = DynamicModule | Constructor;
13
- type Modules = [Module, ...Module[]];
11
+ export type NestModuleDefinitions = [
12
+ NestModuleDefinition,
13
+ ...NestModuleDefinition[],
14
+ ];
14
15
 
15
16
  export interface ManifestData {
16
17
  /**
@@ -54,7 +55,7 @@ export interface PlatformOptions extends PlatformManifestPathOptions {
54
55
  * via APP_GUARD or APP_INTERCEPTOR in one of your modules, they
55
56
  * will be applied **inside** of internal global middleware.
56
57
  */
57
- modules?: Modules;
58
+ modules?: NestModuleDefinitions;
58
59
 
59
60
  /**
60
61
  * Configuration options
@@ -3,12 +3,15 @@ import type { AbstractHttpAdapter } from '@nestjs/core';
3
3
  import type { MicroserviceOptions } from '@nestjs/microservices';
4
4
  import type { Constructor } from '@rsdk/common';
5
5
 
6
+ import type { ConfigContext } from '../config';
6
7
  import type {
7
8
  IErrorsFormatter,
8
9
  IErrorsSender,
9
10
  IErrorsTransformer,
10
11
  } from '../exceptions.handling';
11
12
 
13
+ import type { NestModuleDefinitions } from './options';
14
+
12
15
  /**
13
16
  * Base functionality of HTTP or microservice transport
14
17
  */
@@ -32,6 +35,11 @@ export interface ITransport {
32
35
  * @returns sending error algorithm
33
36
  */
34
37
  getErrorsSender?(): IErrorsSender;
38
+
39
+ /**
40
+ * Modules for register metrics, healthchecks, configs and supporting tools, such as clients
41
+ */
42
+ modules?(): NestModuleDefinitions;
35
43
  }
36
44
 
37
45
  /**
@@ -60,7 +68,7 @@ export interface IMicroserviceTransport extends ITransport {
60
68
  * Should be called before passing options
61
69
  * to app.connectMicroservice()
62
70
  */
63
- init(): void;
71
+ init(configContext: ConfigContext): void;
64
72
 
65
73
  /**
66
74
  * Additional logic that will be ran after
@@ -92,9 +100,13 @@ export interface IHttpTransport extends IPrimaryTransport {
92
100
  * Applies any configuration to Nest application instance:
93
101
  * middleware, body parsers and other.
94
102
  * @param app INestApplication
103
+ * @param configContext
95
104
  */
96
- configure(app: INestApplication): Promise<void> | void;
97
- createHttpOptions(): HttpOptions;
105
+ configure(
106
+ app: INestApplication,
107
+ configContext: ConfigContext,
108
+ ): Promise<void> | void;
109
+ createHttpOptions(configContext: ConfigContext): HttpOptions;
98
110
  }
99
111
 
100
112
  export const isPrimaryTransport = (t: ITransport): t is IPrimaryTransport =>
@@ -0,0 +1,29 @@
1
+ import { text } from '@rsdk/common';
2
+ import { LoggerFactory } from '@rsdk/logging';
3
+
4
+ const logger = LoggerFactory.create('PlatformContext');
5
+
6
+ logger.info('Registering unhandled rejections handler...');
7
+
8
+ // This code enriches output if unhandled exceptions happen
9
+ process.on('unhandledRejection', (reason: any, promise) => {
10
+ logger.error(
11
+ text`
12
+ Unhandled promise rejection happened! Process is shutting down
13
+ with exit code 1. See: https://github.com/nodejs/node/issues/20392
14
+ and https://nodejs.org/api/process.html#event-unhandledrejection
15
+ `,
16
+ { promise, reason },
17
+ );
18
+
19
+ /**
20
+ * Additionally writes to standard console, because both <promise> and <reason>
21
+ * can be not serializable
22
+ */
23
+ console.error('Found unhandled rejection', {
24
+ promise,
25
+ reason,
26
+ });
27
+
28
+ process.exit(1);
29
+ });
@@ -1,7 +0,0 @@
1
- export * from './health.module';
2
- export * from './health.service';
3
- export * from './indicators.abstract';
4
- export * from './metadata/indicator.decorator';
5
- export * from './types';
6
- export * from './helpers';
7
- export { IndicatorAutodoc as IndicatorAutodocResolver } from './autodoc/heath.autodoc-resolver';
@@ -1,26 +0,0 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.IndicatorAutodocResolver = void 0;
18
- __exportStar(require("./health.module"), exports);
19
- __exportStar(require("./health.service"), exports);
20
- __exportStar(require("./indicators.abstract"), exports);
21
- __exportStar(require("./metadata/indicator.decorator"), exports);
22
- __exportStar(require("./types"), exports);
23
- __exportStar(require("./helpers"), exports);
24
- var heath_autodoc_resolver_1 = require("./autodoc/heath.autodoc-resolver");
25
- Object.defineProperty(exports, "IndicatorAutodocResolver", { enumerable: true, get: function () { return heath_autodoc_resolver_1.IndicatorAutodoc; } });
26
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/health/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,mDAAiC;AACjC,wDAAsC;AACtC,iEAA+C;AAC/C,0CAAwB;AACxB,4CAA0B;AAC1B,2EAAgG;AAAvF,kIAAA,gBAAgB,OAA4B"}
@@ -1,2 +0,0 @@
1
- export * from './indicator.decorator';
2
- export * from './indicators.registry';
@@ -1,19 +0,0 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./indicator.decorator"), exports);
18
- __exportStar(require("./indicators.registry"), exports);
19
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/health/metadata/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,wDAAsC"}
@@ -1,7 +0,0 @@
1
- export * from './health.module';
2
- export * from './health.service';
3
- export * from './indicators.abstract';
4
- export * from './metadata/indicator.decorator';
5
- export * from './types';
6
- export * from './helpers';
7
- export { IndicatorAutodoc as IndicatorAutodocResolver } from './autodoc/heath.autodoc-resolver';
@@ -1,2 +0,0 @@
1
- export * from './indicator.decorator';
2
- export * from './indicators.registry';