@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.
- package/CHANGELOG.md +50 -0
- package/dist/app/platform.app.d.ts +1 -1
- package/dist/app/platform.app.js +3 -25
- package/dist/app/platform.app.js.map +1 -1
- package/dist/app-metadata/app-metadata.module.js.map +1 -1
- package/dist/app-metadata/exceptions/app-name-validation.exception.js.map +1 -1
- package/dist/config/additional-source/additional-source.initializer.d.ts +6 -2
- package/dist/config/additional-source/additional-source.initializer.js +24 -18
- package/dist/config/additional-source/additional-source.initializer.js.map +1 -1
- package/dist/config/additional-source/additional-source.module.d.ts +1 -1
- package/dist/config/additional-source/additional-source.module.js +3 -1
- package/dist/config/additional-source/additional-source.module.js.map +1 -1
- package/dist/config/config-reload.indicator.d.ts +3 -2
- package/dist/config/config-reload.indicator.js +4 -3
- package/dist/config/config-reload.indicator.js.map +1 -1
- package/dist/config/config.abstract.d.ts +3 -2
- package/dist/config/config.abstract.js +3 -3
- package/dist/config/config.abstract.js.map +1 -1
- package/dist/config/config.module.d.ts +0 -81
- package/dist/config/config.module.js +26 -203
- package/dist/config/config.module.js.map +1 -1
- package/dist/config/context/config.context.d.ts +75 -0
- package/dist/config/context/config.context.js +159 -0
- package/dist/config/context/config.context.js.map +1 -0
- package/dist/config/context/module.d.ts +5 -0
- package/dist/config/context/module.js +26 -0
- package/dist/config/context/module.js.map +1 -0
- package/dist/config/exceptions/config-not-bootstrapped.exception.js.map +1 -1
- package/dist/config/exceptions/property.exception.d.ts +9 -2
- package/dist/config/exceptions/property.exception.js +4 -6
- package/dist/config/exceptions/property.exception.js.map +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/metadata/config-metadata.provider.d.ts +21 -0
- package/dist/config/metadata/config-metadata.provider.js +37 -0
- package/dist/config/metadata/config-metadata.provider.js.map +1 -0
- package/dist/config/metadata/config-metadata.registry.d.ts +1 -9
- package/dist/config/metadata/config-metadata.registry.js +9 -28
- package/dist/config/metadata/config-metadata.registry.js.map +1 -1
- package/dist/config/metadata/constants.d.ts +3 -0
- package/dist/config/metadata/constants.js +7 -0
- package/dist/config/metadata/constants.js.map +1 -0
- package/dist/config/metadata/decorators/declare-property.decorator.js +2 -2
- package/dist/config/metadata/decorators/declare-property.decorator.js.map +1 -1
- package/dist/config/metadata/decorators/inject-property.decorator.d.ts +1 -1
- package/dist/config/metadata/decorators/inject-property.decorator.js +1 -1
- package/dist/config/metadata/exceptions/duplicate-property.exception.js.map +1 -1
- package/dist/config/metadata/exceptions/duplicate-section.exception.js.map +1 -1
- package/dist/config/metadata/exceptions/duplicate-source.exception.js.map +1 -1
- package/dist/config/metadata/types.d.ts +16 -0
- package/dist/config/metadata/types.js +3 -0
- package/dist/config/metadata/types.js.map +1 -0
- package/dist/config/reload/config-reload.events.d.ts +0 -2
- package/dist/config/reload/config-reload.events.js +0 -8
- package/dist/config/reload/config-reload.events.js.map +1 -1
- package/dist/config/sources/base/reloadable-config-source.abstract.d.ts +3 -2
- package/dist/config/sources/base/reloadable-config-source.abstract.js +3 -3
- package/dist/config/sources/base/reloadable-config-source.abstract.js.map +1 -1
- package/dist/config/sources/exceptions/config-source-di.exception.js.map +1 -1
- package/dist/config/sources/implementations/json-file.source.js.map +1 -1
- package/dist/config/sources/implementations/relodable-json-file.source.d.ts +3 -1
- package/dist/config/sources/implementations/relodable-json-file.source.js +6 -3
- package/dist/config/sources/implementations/relodable-json-file.source.js.map +1 -1
- package/dist/config/vars.class.d.ts +1 -1
- package/dist/config/vars.class.js +6 -6
- package/dist/config/vars.class.js.map +1 -1
- package/dist/context.aggregator.d.ts +21 -0
- package/dist/context.aggregator.js +53 -0
- package/dist/context.aggregator.js.map +1 -0
- package/dist/exceptions/base/platform-exception.absract.d.ts +2 -2
- package/dist/exceptions/base/platform-exception.absract.js +4 -1
- package/dist/exceptions/base/platform-exception.absract.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/double-init.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/duplicate-protocol.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/no-http.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/no-init.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/no-matching-transport.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/sequence.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/symbol-key-decoration.exception.js.map +1 -1
- package/dist/exceptions/implementations/bootstrap/unknown-bootstrap.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/authentication.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/conflict.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/duplicate-entity.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/input.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/internal.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/not-allowed.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/not-found.exception.js.map +1 -1
- package/dist/exceptions/implementations/pipeline/timeout.exception.js.map +1 -1
- package/dist/exceptions.handling/global-exceptions.config.js.map +1 -1
- package/dist/exceptions.handling/global-exceptions.filter.js.map +1 -1
- package/dist/exceptions.handling/global-exceptions.module.js.map +1 -1
- package/dist/health/autodoc/heath.autodoc-resolver.d.ts +5 -15
- package/dist/health/autodoc/heath.autodoc-resolver.js +11 -13
- package/dist/health/autodoc/heath.autodoc-resolver.js.map +1 -1
- package/dist/health/exceptions/health-check.exception.js.map +1 -1
- package/dist/health/health.const.d.ts +1 -0
- package/dist/health/health.const.js +2 -1
- package/dist/health/health.const.js.map +1 -1
- package/dist/health/health.module.js.map +1 -1
- package/dist/health/health.service.d.ts +6 -2
- package/dist/health/health.service.js +19 -6
- package/dist/health/health.service.js.map +1 -1
- package/dist/health/metadata/constants.d.ts +1 -0
- package/dist/health/metadata/constants.js +5 -0
- package/dist/health/metadata/constants.js.map +1 -0
- package/dist/health/metadata/indicator.decorator.js +2 -12
- package/dist/health/metadata/indicator.decorator.js.map +1 -1
- package/dist/health/metadata/indicators.registry.d.ts +0 -7
- package/dist/health/metadata/indicators.registry.js +6 -14
- package/dist/health/metadata/indicators.registry.js.map +1 -1
- package/dist/health/metadata/types.d.ts +7 -0
- package/dist/health/metadata/types.js +3 -0
- package/dist/health/metadata/types.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/logging/decorators/inject-logger.decorator.js +5 -3
- package/dist/logging/decorators/inject-logger.decorator.js.map +1 -1
- package/dist/logging/global-logger-provider.generator.d.ts +7 -0
- package/dist/logging/global-logger-provider.generator.js +22 -0
- package/dist/logging/global-logger-provider.generator.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/logging.config.js +1 -1
- package/dist/logging/logging.config.js.map +1 -1
- package/dist/logging/logging.module.d.ts +5 -3
- package/dist/logging/logging.module.js +25 -13
- package/dist/logging/logging.module.js.map +1 -1
- package/dist/logging/metadata/constants.d.ts +1 -0
- package/dist/logging/metadata/constants.js +5 -0
- package/dist/logging/metadata/constants.js.map +1 -0
- package/dist/logging/types.d.ts +6 -2
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.js +3 -3
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/metadata/autodoc/metrics.autodoc-resolver.d.ts +6 -7
- package/dist/metrics/metadata/autodoc/metrics.autodoc-resolver.js +8 -11
- package/dist/metrics/metadata/autodoc/metrics.autodoc-resolver.js.map +1 -1
- package/dist/metrics/metadata/constants.d.ts +1 -0
- package/dist/metrics/metadata/constants.js +5 -0
- package/dist/metrics/metadata/constants.js.map +1 -0
- package/dist/metrics/metadata/index.d.ts +0 -1
- package/dist/metrics/metadata/index.js +0 -3
- package/dist/metrics/metadata/index.js.map +1 -1
- package/dist/metrics/metadata/metrics.registry.d.ts +0 -3
- package/dist/metrics/metadata/metrics.registry.js +9 -16
- package/dist/metrics/metadata/metrics.registry.js.map +1 -1
- package/dist/metrics/metadata/types.d.ts +2 -4
- package/dist/metrics/metric.storage.d.ts +8 -0
- package/dist/metrics/metric.storage.js +11 -0
- package/dist/metrics/metric.storage.js.map +1 -0
- package/dist/metrics/metrics.config.js.map +1 -1
- package/dist/metrics/metrics.module.d.ts +1 -1
- package/dist/metrics/metrics.module.js +27 -21
- package/dist/metrics/metrics.module.js.map +1 -1
- package/dist/platform.context.d.ts +5 -3
- package/dist/platform.context.js +20 -19
- package/dist/platform.context.js.map +1 -1
- package/dist/platform.module.d.ts +5 -4
- package/dist/platform.module.js +24 -13
- package/dist/platform.module.js.map +1 -1
- package/dist/rsdk-metadata/constants.d.ts +3 -0
- package/dist/rsdk-metadata/constants.js +5 -0
- package/dist/rsdk-metadata/constants.js.map +1 -0
- package/dist/rsdk-metadata/rsdk-metadata.global-module.d.ts +6 -0
- package/dist/rsdk-metadata/rsdk-metadata.global-module.js +31 -0
- package/dist/rsdk-metadata/rsdk-metadata.global-module.js.map +1 -0
- package/dist/tracing/services/instrumentation.service.js.map +1 -1
- package/dist/tracing/services/metadata.scanner.js.map +1 -1
- package/dist/tracing/tracing.config.js.map +1 -1
- package/dist/tracing/tracing.module.js.map +1 -1
- package/dist/transport/transport.module.d.ts +1 -0
- package/dist/transport/transport.module.js +8 -2
- package/dist/transport/transport.module.js.map +1 -1
- package/dist/types/context-aggregated.d.ts +8 -0
- package/dist/types/context-aggregated.js +3 -0
- package/dist/types/context-aggregated.js.map +1 -0
- package/dist/types/options.d.ts +6 -6
- package/dist/types/transports.d.ts +10 -3
- package/dist/types/transports.js.map +1 -1
- package/dist/unhandled-rejection.handler.d.ts +1 -0
- package/dist/unhandled-rejection.handler.js +24 -0
- package/dist/unhandled-rejection.handler.js.map +1 -0
- package/package.json +8 -7
- package/src/app/platform.app.ts +6 -32
- package/src/config/additional-source/additional-source.initializer.ts +34 -25
- package/src/config/additional-source/additional-source.module.ts +5 -2
- package/src/config/config-reload.indicator.ts +3 -3
- package/src/config/config.abstract.ts +2 -3
- package/src/config/config.module.ts +23 -225
- package/src/config/context/config.context.ts +209 -0
- package/src/config/context/module.ts +25 -0
- package/src/config/exceptions/property.exception.ts +11 -6
- package/src/config/index.ts +1 -0
- package/src/config/metadata/config-metadata.provider.ts +79 -0
- package/src/config/metadata/config-metadata.registry.ts +36 -41
- package/src/config/metadata/constants.ts +6 -0
- package/src/config/metadata/decorators/declare-property.decorator.ts +2 -2
- package/src/config/metadata/decorators/inject-property.decorator.ts +1 -1
- package/src/config/metadata/types.ts +22 -0
- package/src/config/reload/config-reload.events.ts +1 -13
- package/src/config/sources/base/reloadable-config-source.abstract.ts +2 -3
- package/src/config/sources/implementations/relodable-json-file.source.ts +6 -2
- package/src/config/vars.class.ts +9 -7
- package/src/context.aggregator.ts +62 -0
- package/src/exceptions/base/platform-exception.absract.ts +8 -3
- package/src/health/autodoc/heath.autodoc-resolver.ts +15 -18
- package/src/health/health.const.ts +2 -0
- package/src/health/health.service.ts +23 -4
- package/src/health/metadata/constants.ts +1 -0
- package/src/health/metadata/indicator.decorator.ts +2 -18
- package/src/health/metadata/indicators.registry.ts +16 -23
- package/src/health/metadata/types.ts +9 -0
- package/src/index.ts +29 -12
- package/src/logging/decorators/inject-logger.decorator.ts +5 -4
- package/src/logging/global-logger-provider.generator.ts +28 -0
- package/src/logging/index.ts +2 -0
- package/src/logging/logging.config.ts +2 -1
- package/src/logging/logging.module.ts +42 -16
- package/src/logging/metadata/constants.ts +1 -0
- package/src/logging/types.ts +6 -2
- package/src/metrics/index.ts +1 -1
- package/src/metrics/metadata/autodoc/metrics.autodoc-resolver.ts +13 -9
- package/src/metrics/metadata/constants.ts +1 -0
- package/src/metrics/metadata/index.ts +0 -1
- package/src/metrics/metadata/metrics.registry.ts +19 -23
- package/src/metrics/metadata/types.ts +2 -5
- package/src/metrics/metric.storage.ts +10 -0
- package/src/metrics/metrics.module.ts +32 -31
- package/src/platform.context.ts +32 -20
- package/src/platform.module.ts +18 -20
- package/src/rsdk-metadata/constants.ts +5 -0
- package/src/rsdk-metadata/rsdk-metadata.global-module.ts +34 -0
- package/src/transport/transport.module.ts +13 -1
- package/src/types/context-aggregated.ts +10 -0
- package/src/types/options.ts +6 -5
- package/src/types/transports.ts +15 -3
- package/src/unhandled-rejection.handler.ts +29 -0
- package/dist/health/index.d.ts +0 -7
- package/dist/health/index.js +0 -26
- package/dist/health/index.js.map +0 -1
- package/dist/health/metadata/index.d.ts +0 -2
- package/dist/health/metadata/index.js +0 -19
- package/dist/health/metadata/index.js.map +0 -1
- package/src/health/index.ts +0 -7
- 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
|
|
4
|
-
|
|
5
|
-
import type { MetricType } from './decorators';
|
|
3
|
+
import type { AnyMetric, MetricMetadata } from '../types';
|
|
6
4
|
|
|
7
5
|
export type MetricRsdkMetadata = {
|
|
8
|
-
|
|
9
|
-
metadata: OmitType<MetricMetadata>;
|
|
6
|
+
metadata: MetricMetadata;
|
|
10
7
|
metricController: Constructor<AnyMetric>;
|
|
11
8
|
};
|
|
@@ -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 {
|
|
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
|
-
|
|
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
|
|
76
|
+
const [resource] =
|
|
77
|
+
RsdkMetadata.get<MetricRsdkMetadata>(
|
|
78
|
+
ctor,
|
|
79
|
+
METRIC_RSDK_METADATA_SCOPE,
|
|
80
|
+
) ?? [];
|
|
62
81
|
|
|
63
|
-
|
|
64
|
-
providers.push(existing);
|
|
82
|
+
const metadata = resource.value.metadata;
|
|
65
83
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
const metadata = MetricsRegistry.getOne(ctor);
|
|
70
|
-
|
|
71
|
-
const provider = {
|
|
84
|
+
providers.push({
|
|
85
|
+
inject: [MetricStorage],
|
|
72
86
|
provide: ctor,
|
|
73
|
-
|
|
74
|
-
|
|
87
|
+
useFactory: (metricStorage: MetricStorage) => {
|
|
88
|
+
const existing =
|
|
89
|
+
metricStorage.metrics.get(ctor) ?? new ctor(metadata);
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
};
|
package/src/platform.context.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
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 } =
|
|
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}`),
|
package/src/platform.module.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
-
import { Module } from '@nestjs/common';
|
|
3
|
-
import type { MiddlewareConsumer
|
|
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
|
|
13
|
+
import { PlatformExtendedOptions } from './types';
|
|
14
14
|
|
|
15
15
|
@Module({})
|
|
16
16
|
export class PlatformModule implements NestModule {
|
|
17
|
-
|
|
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 (!
|
|
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
|
|
59
|
+
for (const plugin of this.options.plugins || []) {
|
|
62
60
|
plugin?.configureMiddleware?.(consumer);
|
|
63
61
|
}
|
|
64
62
|
}
|
|
@@ -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
|
+
};
|
package/src/types/options.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
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
|
|
13
|
-
|
|
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?:
|
|
58
|
+
modules?: NestModuleDefinitions;
|
|
58
59
|
|
|
59
60
|
/**
|
|
60
61
|
* Configuration options
|
package/src/types/transports.ts
CHANGED
|
@@ -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(
|
|
97
|
-
|
|
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
|
+
});
|
package/dist/health/index.d.ts
DELETED
|
@@ -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';
|
package/dist/health/index.js
DELETED
|
@@ -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
|
package/dist/health/index.js.map
DELETED
|
@@ -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,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"}
|
package/src/health/index.ts
DELETED
|
@@ -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';
|