@rsdk/core 4.2.5-next.0 → 4.3.0-next.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 +10 -0
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/noop.http-adapter.d.ts +2 -0
- package/dist/noop.http-adapter.js +6 -0
- package/dist/noop.http-adapter.js.map +1 -1
- package/dist/platform.module.d.ts +3 -3
- package/dist/platform.module.js +23 -23
- package/dist/platform.module.js.map +1 -1
- package/dist/tracing/decorators/span.decorator.js +5 -6
- package/dist/tracing/decorators/span.decorator.js.map +1 -1
- package/dist/tracing/index.d.ts +0 -2
- package/dist/tracing/index.js +0 -2
- package/dist/tracing/index.js.map +1 -1
- package/dist/tracing/services/index.d.ts +0 -1
- package/dist/tracing/services/index.js +0 -1
- package/dist/tracing/services/index.js.map +1 -1
- package/dist/tracing/services/trace.injector.d.ts +4 -4
- package/dist/tracing/services/trace.injector.js +38 -68
- package/dist/tracing/services/trace.injector.js.map +1 -1
- package/dist/tracing/tracing.interceptor.d.ts +3 -5
- package/dist/tracing/tracing.interceptor.js +15 -91
- package/dist/tracing/tracing.interceptor.js.map +1 -1
- package/dist/tracing/tracing.module.d.ts +4 -16
- package/dist/tracing/tracing.module.js +18 -82
- package/dist/tracing/tracing.module.js.map +1 -1
- package/dist/tracing/types.d.ts +11 -0
- package/dist/tracing/types.js +23 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/tracing/utils/save-async-hooks-context.js +2 -3
- package/dist/tracing/utils/save-async-hooks-context.js.map +1 -1
- package/dist/transport/protocol.detector.d.ts +1 -0
- package/dist/transport/protocol.detector.js +5 -2
- package/dist/transport/protocol.detector.js.map +1 -1
- package/dist/transport/transport.module.js +1 -1
- package/dist/transport/transport.module.js.map +1 -1
- package/dist/types/constants.d.ts +2 -0
- package/dist/types/constants.js +6 -0
- package/dist/types/constants.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +5 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/plugins.d.ts +5 -0
- package/dist/types/plugins.js.map +1 -1
- package/dist/types/tracing.headers-extractor.d.ts +15 -0
- package/dist/types/tracing.headers-extractor.js +67 -0
- package/dist/types/tracing.headers-extractor.js.map +1 -0
- package/dist/types/transports.d.ts +6 -1
- package/dist/types/transports.js.map +1 -1
- package/package.json +13 -12
- package/src/index.ts +0 -3
- package/src/noop.http-adapter.ts +8 -0
- package/src/platform.module.ts +20 -25
- package/src/tracing/decorators/span.decorator.ts +6 -6
- package/src/tracing/index.ts +0 -2
- package/src/tracing/services/index.ts +0 -1
- package/src/tracing/services/trace.injector.ts +49 -92
- package/src/tracing/tracing.interceptor.ts +7 -127
- package/src/tracing/tracing.module.ts +19 -104
- package/src/tracing/types.ts +28 -0
- package/src/tracing/utils/save-async-hooks-context.ts +2 -3
- package/src/transport/protocol.detector.ts +6 -2
- package/src/transport/transport.module.ts +1 -1
- package/src/types/constants.ts +2 -0
- package/src/types/index.ts +2 -0
- package/src/types/plugins.ts +6 -0
- package/src/types/tracing.headers-extractor.ts +51 -0
- package/src/types/transports.ts +8 -1
- package/tsconfig.build.json +1 -1
- package/dist/tracing/active-span.module.d.ts +0 -5
- package/dist/tracing/active-span.module.js +0 -25
- package/dist/tracing/active-span.module.js.map +0 -1
- package/dist/tracing/auto-instrumentations.config.d.ts +0 -1
- package/dist/tracing/auto-instrumentations.config.js +0 -42
- package/dist/tracing/auto-instrumentations.config.js.map +0 -1
- package/dist/tracing/grpc.headers.d.ts +0 -11
- package/dist/tracing/grpc.headers.js +0 -24
- package/dist/tracing/grpc.headers.js.map +0 -1
- package/dist/tracing/http.headers.d.ts +0 -11
- package/dist/tracing/http.headers.js +0 -22
- package/dist/tracing/http.headers.js.map +0 -1
- package/dist/tracing/open-telemetry.interceptor.d.ts +0 -5
- package/dist/tracing/open-telemetry.interceptor.js +0 -83
- package/dist/tracing/open-telemetry.interceptor.js.map +0 -1
- package/dist/tracing/services/active-span.storage.d.ts +0 -17
- package/dist/tracing/services/active-span.storage.js +0 -46
- package/dist/tracing/services/active-span.storage.js.map +0 -1
- package/dist/tracing/services/instrumentation.service.d.ts +0 -3
- package/dist/tracing/services/instrumentation.service.js +0 -25
- package/dist/tracing/services/instrumentation.service.js.map +0 -1
- package/dist/tracing/services/request-id.provider.d.ts +0 -11
- package/dist/tracing/services/request-id.provider.js +0 -13
- package/dist/tracing/services/request-id.provider.js.map +0 -1
- package/src/tracing/active-span.module.ts +0 -13
- package/src/tracing/auto-instrumentations.config.ts +0 -44
- package/src/tracing/grpc.headers.ts +0 -29
- package/src/tracing/http.headers.ts +0 -32
- package/src/tracing/open-telemetry.interceptor.ts +0 -114
- package/src/tracing/services/active-span.storage.ts +0 -32
- package/src/tracing/services/instrumentation.service.ts +0 -20
- package/src/tracing/services/request-id.provider.ts +0 -21
package/src/types/index.ts
CHANGED
package/src/types/plugins.ts
CHANGED
|
@@ -7,6 +7,8 @@ import type {
|
|
|
7
7
|
IErrorsTransformer,
|
|
8
8
|
} from '../exceptions.handling';
|
|
9
9
|
|
|
10
|
+
import type { ProtocolTracingHeadersExtractor } from './transports';
|
|
11
|
+
|
|
10
12
|
export type SpecifiedTransports = Readonly<string[]>;
|
|
11
13
|
export type AppropriateTransports = SpecifiedTransports | 'any';
|
|
12
14
|
|
|
@@ -23,6 +25,10 @@ export const hasSpecifiedTransports = (
|
|
|
23
25
|
export interface PlatformAppPlugin<
|
|
24
26
|
T extends AppropriateTransports = AppropriateTransports,
|
|
25
27
|
> {
|
|
28
|
+
tracingHeadersExtractors?(): {
|
|
29
|
+
extractor: ProtocolTracingHeadersExtractor;
|
|
30
|
+
protocol: string;
|
|
31
|
+
}[];
|
|
26
32
|
/**
|
|
27
33
|
* Returns list of appropriate transports.
|
|
28
34
|
*
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ExecutionContext, Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { ILogger } from '@rsdk/logging';
|
|
3
|
+
|
|
4
|
+
import { InjectLogger } from '../logging';
|
|
5
|
+
import { TracingHeaders } from '../tracing/types';
|
|
6
|
+
import { ProtocolDetector } from '../transport/protocol.detector';
|
|
7
|
+
|
|
8
|
+
import { APP_PLUGINS, APP_TRANSPORTS } from './constants';
|
|
9
|
+
import type { PlatformAppPlugin } from './plugins';
|
|
10
|
+
import type { ITransport, ProtocolTracingHeadersExtractor } from './transports';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class TracingHeadersExtractor {
|
|
14
|
+
constructor(
|
|
15
|
+
@Inject(APP_PLUGINS)
|
|
16
|
+
private plugins: Set<PlatformAppPlugin>,
|
|
17
|
+
@Inject(APP_TRANSPORTS)
|
|
18
|
+
private transports: Set<ITransport>,
|
|
19
|
+
private protocolDetector: ProtocolDetector,
|
|
20
|
+
@InjectLogger(TracingHeadersExtractor) private logger: ILogger,
|
|
21
|
+
) {
|
|
22
|
+
this.extractors = new Map<string, ProtocolTracingHeadersExtractor>();
|
|
23
|
+
for (const transport of this.transports) {
|
|
24
|
+
const e = transport.getHeaderExtractor();
|
|
25
|
+
if (e) {
|
|
26
|
+
this.extractors.set(transport.getProtocol(), e);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
for (const plugin of this.plugins) {
|
|
30
|
+
for (const x of plugin.tracingHeadersExtractors?.() ?? []) {
|
|
31
|
+
this.extractors.set(x.protocol, x.extractor);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
extract(ctx: ExecutionContext): TracingHeaders {
|
|
37
|
+
const protocol = this.protocolDetector.getProtocol(ctx) ?? ctx.getType();
|
|
38
|
+
|
|
39
|
+
const extracted = this.extractors.get(protocol)?.extract(ctx);
|
|
40
|
+
|
|
41
|
+
if (!extracted) {
|
|
42
|
+
this.logger.warn('Unable to extract Tracing headers, return empty');
|
|
43
|
+
}
|
|
44
|
+
this.logger.trace('Extracted TraceHeaders', {
|
|
45
|
+
extracted,
|
|
46
|
+
});
|
|
47
|
+
return extracted ?? new TracingHeaders({});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private extractors: Map<string, ProtocolTracingHeadersExtractor>;
|
|
51
|
+
}
|
package/src/types/transports.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ArgumentsHost } from '@nestjs/common';
|
|
1
|
+
import type { ArgumentsHost, ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import type { Controller, INestApplication } from '@nestjs/common/interfaces';
|
|
3
3
|
import type { AbstractHttpAdapter } from '@nestjs/core';
|
|
4
4
|
import type { MicroserviceOptions } from '@nestjs/microservices';
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
IErrorsSender,
|
|
11
11
|
IErrorsTransformer,
|
|
12
12
|
} from '../exceptions.handling';
|
|
13
|
+
import type { TracingHeaders } from '../tracing/types';
|
|
13
14
|
|
|
14
15
|
import type { NestModuleDefinitions } from './options';
|
|
15
16
|
|
|
@@ -53,6 +54,8 @@ export interface ITransport {
|
|
|
53
54
|
* Modules for register metrics, healthchecks, configs and supporting tools, such as clients
|
|
54
55
|
*/
|
|
55
56
|
modules?(): NestModuleDefinitions;
|
|
57
|
+
|
|
58
|
+
getHeaderExtractor(): ProtocolTracingHeadersExtractor;
|
|
56
59
|
}
|
|
57
60
|
|
|
58
61
|
/**
|
|
@@ -134,3 +137,7 @@ export const isMicroserviceTransport = (
|
|
|
134
137
|
t: ITransport,
|
|
135
138
|
): t is IMicroserviceTransport =>
|
|
136
139
|
typeof (t as IMicroserviceTransport).createMicroserviceOptions === 'function';
|
|
140
|
+
|
|
141
|
+
export interface ProtocolTracingHeadersExtractor {
|
|
142
|
+
extract(ctx: ExecutionContext): TracingHeaders;
|
|
143
|
+
}
|
package/tsconfig.build.json
CHANGED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.ActiveSpanModule = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const active_span_storage_1 = require("./services/active-span.storage");
|
|
12
|
-
/**
|
|
13
|
-
* Модуль для получения данных активного спана
|
|
14
|
-
*/
|
|
15
|
-
let ActiveSpanModule = class ActiveSpanModule {
|
|
16
|
-
};
|
|
17
|
-
exports.ActiveSpanModule = ActiveSpanModule;
|
|
18
|
-
exports.ActiveSpanModule = ActiveSpanModule = __decorate([
|
|
19
|
-
(0, common_1.Global)(),
|
|
20
|
-
(0, common_1.Module)({
|
|
21
|
-
providers: [active_span_storage_1.ActiveSpanStorage],
|
|
22
|
-
exports: [active_span_storage_1.ActiveSpanStorage],
|
|
23
|
-
})
|
|
24
|
-
], ActiveSpanModule);
|
|
25
|
-
//# sourceMappingURL=active-span.module.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"active-span.module.js","sourceRoot":"","sources":["../../src/tracing/active-span.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAEhD,wEAAmE;AAEnE;;GAEG;AAMI,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAAG,CAAA;AAAnB,4CAAgB;2BAAhB,gBAAgB;IAL5B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,uCAAiB,CAAC;QAC9B,OAAO,EAAE,CAAC,uCAAiB,CAAC;KAC7B,CAAC;GACW,gBAAgB,CAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const autoInstumentationOptions: any[];
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.autoInstumentationOptions = void 0;
|
|
4
|
-
const auto_instrumentations_node_1 = require("@opentelemetry/auto-instrumentations-node");
|
|
5
|
-
const node_http_1 = require("node:http");
|
|
6
|
-
const request_id_provider_1 = require("./services/request-id.provider");
|
|
7
|
-
exports.autoInstumentationOptions = (0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
|
|
8
|
-
'@opentelemetry/instrumentation-aws-sdk': {
|
|
9
|
-
responseHook: (span, { response }) => {
|
|
10
|
-
if (response.request.commandInput?.Bucket) {
|
|
11
|
-
span.setAttribute('s3.bucket.name', response.request.commandInput?.Bucket);
|
|
12
|
-
}
|
|
13
|
-
},
|
|
14
|
-
},
|
|
15
|
-
'@opentelemetry/instrumentation-graphql': {
|
|
16
|
-
allowValues: true,
|
|
17
|
-
},
|
|
18
|
-
'@opentelemetry/instrumentation-http': {
|
|
19
|
-
requestHook: (span, request) => {
|
|
20
|
-
if (request instanceof node_http_1.IncomingMessage) {
|
|
21
|
-
if (request.method && request.url) {
|
|
22
|
-
span.updateName(`${request.method} ${request.url}`);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
else if (request instanceof node_http_1.ClientRequest &&
|
|
26
|
-
request.req.method &&
|
|
27
|
-
request.req.url) {
|
|
28
|
-
span.updateName(`${request.req.method} ${request.req.url}`);
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
'@opentelemetry/instrumentation-pg': {
|
|
33
|
-
enhancedDatabaseReporting: true,
|
|
34
|
-
},
|
|
35
|
-
'@opentelemetry/instrumentation-pino': {
|
|
36
|
-
enabled: true,
|
|
37
|
-
logHook: (_span, record) => {
|
|
38
|
-
record['request_id'] = request_id_provider_1.RequestIdProvider.get();
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
//# sourceMappingURL=auto-instrumentations.config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-instrumentations.config.js","sourceRoot":"","sources":["../../src/tracing/auto-instrumentations.config.ts"],"names":[],"mappings":";;;AAAA,0FAAwF;AACxF,yCAA2D;AAE3D,wEAAmE;AAEtD,QAAA,yBAAyB,GAAU,IAAA,wDAA2B,EAAC;IAC1E,wCAAwC,EAAE;QACxC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnC,IAAI,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CACf,gBAAgB,EAChB,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;KACF;IACD,wCAAwC,EAAE;QACxC,WAAW,EAAE,IAAI;KAClB;IACD,qCAAqC,EAAE;QACrC,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,YAAY,2BAAe,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,IACL,OAAO,YAAY,yBAAa;gBAChC,OAAO,CAAC,GAAG,CAAC,MAAM;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EACf,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;KACF;IACD,mCAAmC,EAAE;QACnC,yBAAyB,EAAE,IAAI;KAChC;IACD,qCAAqC,EAAE;QACrC,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACzB,MAAM,CAAC,YAAY,CAAC,GAAG,uCAAiB,CAAC,GAAG,EAAE,CAAC;QACjD,CAAC;KACF;CACF,CAAC,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Metadata } from '@grpc/grpc-js';
|
|
2
|
-
import type { MaybeReadonlyArray } from '@rsdk/common.node';
|
|
3
|
-
/**
|
|
4
|
-
* @description хелпер для нормализованного извлечения заголовков из grpc запроса
|
|
5
|
-
*/
|
|
6
|
-
export declare class GrpcHeaders {
|
|
7
|
-
private metadata;
|
|
8
|
-
constructor(metadata: Metadata);
|
|
9
|
-
get<K extends string>(key: MaybeReadonlyArray<K>): Record<K, string | undefined>;
|
|
10
|
-
get(key: string): string | undefined;
|
|
11
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.GrpcHeaders = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* @description хелпер для нормализованного извлечения заголовков из grpc запроса
|
|
6
|
-
*/
|
|
7
|
-
class GrpcHeaders {
|
|
8
|
-
metadata;
|
|
9
|
-
constructor(metadata) {
|
|
10
|
-
this.metadata = metadata;
|
|
11
|
-
}
|
|
12
|
-
get(key) {
|
|
13
|
-
if (Array.isArray(key)) {
|
|
14
|
-
return Object.fromEntries(key.map((k) => [k, this.get(k)]));
|
|
15
|
-
}
|
|
16
|
-
const requestIdMetadata = this.metadata.get(key);
|
|
17
|
-
if (requestIdMetadata.length > 0) {
|
|
18
|
-
return requestIdMetadata[0].toString();
|
|
19
|
-
}
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
exports.GrpcHeaders = GrpcHeaders;
|
|
24
|
-
//# sourceMappingURL=grpc.headers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grpc.headers.js","sourceRoot":"","sources":["../../src/tracing/grpc.headers.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,WAAW;IACF;IAApB,YAAoB,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAM1C,GAAG,CACD,GAAwC;QAExC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAGzD,CAAC;QACJ,CAAC;QACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAa,CAAC,CAAC;QAC3D,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAtBD,kCAsBC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { MaybeReadonlyArray } from '@rsdk/common.node';
|
|
2
|
-
/**
|
|
3
|
-
* @description хелпер для нормализованного извлечения заголовков из http запроса
|
|
4
|
-
*/
|
|
5
|
-
export declare class HttpHeaders {
|
|
6
|
-
private headers;
|
|
7
|
-
constructor(headers: Record<string, string>);
|
|
8
|
-
get<K extends string>(key: MaybeReadonlyArray<K>): Record<K, string | undefined>;
|
|
9
|
-
get(key: string): string | undefined;
|
|
10
|
-
private normalizedHeaders;
|
|
11
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HttpHeaders = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* @description хелпер для нормализованного извлечения заголовков из http запроса
|
|
6
|
-
*/
|
|
7
|
-
class HttpHeaders {
|
|
8
|
-
headers;
|
|
9
|
-
constructor(headers) {
|
|
10
|
-
this.headers = headers;
|
|
11
|
-
this.normalizedHeaders = Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v]));
|
|
12
|
-
}
|
|
13
|
-
get(key) {
|
|
14
|
-
if (Array.isArray(key)) {
|
|
15
|
-
return Object.fromEntries(key.map((k) => [k, this.get(k)]));
|
|
16
|
-
}
|
|
17
|
-
return this.normalizedHeaders[key.toLowerCase()];
|
|
18
|
-
}
|
|
19
|
-
normalizedHeaders;
|
|
20
|
-
}
|
|
21
|
-
exports.HttpHeaders = HttpHeaders;
|
|
22
|
-
//# sourceMappingURL=http.headers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.headers.js","sourceRoot":"","sources":["../../src/tracing/http.headers.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,WAAW;IACF;IAApB,YAAoB,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;QACjD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,WAAW,CACzC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAC9D,CAAC;IACJ,CAAC;IAQD,GAAG,CACD,GAAwC;QAExC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAGzD,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAE,GAAc,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEO,iBAAiB,CAAyB;CACnD;AA1BD,kCA0BC"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
export declare class OpenTelemetryInterceptor implements NestInterceptor {
|
|
4
|
-
intercept(_context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>>;
|
|
5
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OpenTelemetryInterceptor = void 0;
|
|
4
|
-
const api_1 = require("@opentelemetry/api");
|
|
5
|
-
const propagator_b3_1 = require("@opentelemetry/propagator-b3");
|
|
6
|
-
const sdk_node_1 = require("@opentelemetry/sdk-node");
|
|
7
|
-
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
8
|
-
const rxjs_1 = require("rxjs");
|
|
9
|
-
const request_id_provider_1 = require("./services/request-id.provider");
|
|
10
|
-
const services_1 = require("./services");
|
|
11
|
-
class OpenTelemetryInterceptor {
|
|
12
|
-
intercept(_context, next) {
|
|
13
|
-
const tracer = api_1.trace.getTracer('@rsdk/open-telemetry', '1.0.0');
|
|
14
|
-
const spanName = services_1.TraceInjector.createSpanName(OpenTelemetryInterceptor.name, 'intercept');
|
|
15
|
-
/**
|
|
16
|
-
* Создаем новый спан
|
|
17
|
-
*/
|
|
18
|
-
const span = tracer.startSpan(spanName, {});
|
|
19
|
-
const openTelemetryValues = request_id_provider_1.OpenTelemetryProvider.getOrThrow();
|
|
20
|
-
const parentSpanId = openTelemetryValues[propagator_b3_1.X_B3_PARENT_SPAN_ID];
|
|
21
|
-
if (parentSpanId) {
|
|
22
|
-
span.parentSpanId = parentSpanId;
|
|
23
|
-
}
|
|
24
|
-
const spanId = openTelemetryValues[propagator_b3_1.X_B3_SPAN_ID];
|
|
25
|
-
/**
|
|
26
|
-
* После создания контекста ранее при входе в приложение, у нас новый спан ид
|
|
27
|
-
* мы перетираем значением которе получили через заголовок
|
|
28
|
-
* в рамках приложения он корректный, но при переходе из одного приложения в другой - слетает
|
|
29
|
-
* и чтобы 100% все было норм, мы всегда патчим его
|
|
30
|
-
*/
|
|
31
|
-
if (spanId) {
|
|
32
|
-
span.spanContext().spanId = spanId;
|
|
33
|
-
}
|
|
34
|
-
const traceId = openTelemetryValues[propagator_b3_1.X_B3_TRACE_ID];
|
|
35
|
-
/**
|
|
36
|
-
* Патчим трайс ид, причина выше
|
|
37
|
-
*/
|
|
38
|
-
if (traceId) {
|
|
39
|
-
span.spanContext().traceId = traceId;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Обычно самая первая точка входа это фронтовый запрос, который содержит некие заголовки хттп
|
|
43
|
-
* мы их кладем в рутовый спан
|
|
44
|
-
*/
|
|
45
|
-
if (openTelemetryValues.http) {
|
|
46
|
-
span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_METHOD, openTelemetryValues.http.httpMethod);
|
|
47
|
-
span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_URL, openTelemetryValues.http.httpUrl);
|
|
48
|
-
span.setAttribute(semantic_conventions_1.SemanticAttributes.HTTP_ROUTE, openTelemetryValues.http.httpRoute);
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Чтобы пробросить пропатченный спан нужно запустить две строчки ниже:
|
|
52
|
-
* 1) создаем контекст в котором активный спан перебиваем новым
|
|
53
|
-
* 2) созданный контекст ставим основным и в нем запускаем под процесс
|
|
54
|
-
*/
|
|
55
|
-
const spanContext = sdk_node_1.api.trace.setSpan(sdk_node_1.api.context.active(), span);
|
|
56
|
-
return new rxjs_1.Observable((observer) => {
|
|
57
|
-
sdk_node_1.api.context.with(spanContext, () => {
|
|
58
|
-
next
|
|
59
|
-
.handle()
|
|
60
|
-
.pipe((0, rxjs_1.mergeMap)((result) => {
|
|
61
|
-
services_1.TraceInjector.enrich(span, result);
|
|
62
|
-
span.end();
|
|
63
|
-
return (0, rxjs_1.of)(result);
|
|
64
|
-
}), (0, rxjs_1.catchError)((error) => {
|
|
65
|
-
services_1.TraceInjector.recordAndRethrow(error, span);
|
|
66
|
-
span.end();
|
|
67
|
-
return (0, rxjs_1.throwError)(() => error);
|
|
68
|
-
}))
|
|
69
|
-
.subscribe({
|
|
70
|
-
complete: () => {
|
|
71
|
-
observer.complete();
|
|
72
|
-
},
|
|
73
|
-
error: (error) => {
|
|
74
|
-
observer.error(error);
|
|
75
|
-
},
|
|
76
|
-
next: (res) => observer.next(res),
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
exports.OpenTelemetryInterceptor = OpenTelemetryInterceptor;
|
|
83
|
-
//# sourceMappingURL=open-telemetry.interceptor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"open-telemetry.interceptor.js","sourceRoot":"","sources":["../../src/tracing/open-telemetry.interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { Span } from '@opentelemetry/api';
|
|
2
|
-
/**
|
|
3
|
-
* Обертка вокруг `api.trace.getActiveSpan()`
|
|
4
|
-
*/
|
|
5
|
-
export declare class ActiveSpanStorage {
|
|
6
|
-
/**
|
|
7
|
-
* Так как этот сервис используется в разных местах, чтобы не усложнять существующий код путем проксирования модулей и сервисов
|
|
8
|
-
* после создания ложим инстанс в эту статик переменную
|
|
9
|
-
*/
|
|
10
|
-
private static instance;
|
|
11
|
-
constructor();
|
|
12
|
-
static getInstance(): ActiveSpanStorage | undefined;
|
|
13
|
-
/**
|
|
14
|
-
* Получает новое значение в контекст
|
|
15
|
-
*/
|
|
16
|
-
getActiveSpan(): Span | undefined;
|
|
17
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var ActiveSpanStorage_1;
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.ActiveSpanStorage = void 0;
|
|
14
|
-
const common_1 = require("@nestjs/common");
|
|
15
|
-
const sdk_node_1 = require("@opentelemetry/sdk-node");
|
|
16
|
-
/**
|
|
17
|
-
* Обертка вокруг `api.trace.getActiveSpan()`
|
|
18
|
-
*/
|
|
19
|
-
let ActiveSpanStorage = class ActiveSpanStorage {
|
|
20
|
-
static { ActiveSpanStorage_1 = this; }
|
|
21
|
-
/**
|
|
22
|
-
* Так как этот сервис используется в разных местах, чтобы не усложнять существующий код путем проксирования модулей и сервисов
|
|
23
|
-
* после создания ложим инстанс в эту статик переменную
|
|
24
|
-
*/
|
|
25
|
-
static instance;
|
|
26
|
-
constructor() {
|
|
27
|
-
if (!ActiveSpanStorage_1.instance) {
|
|
28
|
-
ActiveSpanStorage_1.instance = this;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
static getInstance() {
|
|
32
|
-
return ActiveSpanStorage_1.instance;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Получает новое значение в контекст
|
|
36
|
-
*/
|
|
37
|
-
getActiveSpan() {
|
|
38
|
-
return sdk_node_1.api.trace.getActiveSpan();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
exports.ActiveSpanStorage = ActiveSpanStorage;
|
|
42
|
-
exports.ActiveSpanStorage = ActiveSpanStorage = ActiveSpanStorage_1 = __decorate([
|
|
43
|
-
(0, common_1.Injectable)(),
|
|
44
|
-
__metadata("design:paramtypes", [])
|
|
45
|
-
], ActiveSpanStorage);
|
|
46
|
-
//# sourceMappingURL=active-span.storage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"active-span.storage.js","sourceRoot":"","sources":["../../../src/tracing/services/active-span.storage.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4C;AAE5C,sDAA8C;AAE9C;;GAEG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;;IAC5B;;;OAGG;IACK,MAAM,CAAC,QAAQ,CAAgC;IAEvD;QACE,IAAI,CAAC,mBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,mBAAiB,CAAC,QAAQ,GAAG,IAAI,CAAC;QACpC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,mBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,cAAG,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;IACnC,CAAC;CACF,CAAA;AAvBY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;;GACA,iBAAiB,CAuB7B"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.InstrumentationService = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const tracing_interceptor_1 = require("../tracing.interceptor");
|
|
12
|
-
const trace_injector_1 = require("./trace.injector");
|
|
13
|
-
let InstrumentationService = class InstrumentationService {
|
|
14
|
-
injectWrapTraceInjector() {
|
|
15
|
-
/**
|
|
16
|
-
* Оборачиваем интерцептор в логику которая несет с собою асинк локал сторадж с traceId, spanId
|
|
17
|
-
*/
|
|
18
|
-
trace_injector_1.TraceInjector.wrap(tracing_interceptor_1.TracingInterceptor.prototype, tracing_interceptor_1.TracingInterceptor.prototype['intercept'], undefined, true);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
exports.InstrumentationService = InstrumentationService;
|
|
22
|
-
exports.InstrumentationService = InstrumentationService = __decorate([
|
|
23
|
-
(0, common_1.Injectable)()
|
|
24
|
-
], InstrumentationService);
|
|
25
|
-
//# sourceMappingURL=instrumentation.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.service.js","sourceRoot":"","sources":["../../../src/tracing/services/instrumentation.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAE5C,gEAA4D;AAE5D,qDAAiD;AAG1C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAC1B,uBAAuB;QAC5B;;WAEG;QACH,8BAAa,CAAC,IAAI,CAChB,wCAAkB,CAAC,SAAS,EAC5B,wCAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EACzC,SAAS,EACT,IAAI,CACL,CAAC;IACJ,CAAC;CACF,CAAA;AAZY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CAYlC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare const RequestIdProvider: import("@rsdk/actx").AsyncContextProvider<string>;
|
|
2
|
-
export declare const OpenTelemetryProvider: import("@rsdk/actx").AsyncContextProvider<{
|
|
3
|
-
http?: {
|
|
4
|
-
httpMethod: string;
|
|
5
|
-
httpUrl: string;
|
|
6
|
-
httpRoute: string;
|
|
7
|
-
};
|
|
8
|
-
"x-b3-spanid"?: string;
|
|
9
|
-
"x-b3-traceid"?: string;
|
|
10
|
-
"x-b3-parentspanid"?: string;
|
|
11
|
-
}>;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OpenTelemetryProvider = exports.RequestIdProvider = void 0;
|
|
4
|
-
const actx_1 = require("@rsdk/actx");
|
|
5
|
-
exports.RequestIdProvider = (0, actx_1.createAsyncContextProvider)({
|
|
6
|
-
name: 'RequestId',
|
|
7
|
-
rewritable: false,
|
|
8
|
-
});
|
|
9
|
-
exports.OpenTelemetryProvider = (0, actx_1.createAsyncContextProvider)({
|
|
10
|
-
name: 'OpenTelemetryPropagation',
|
|
11
|
-
rewritable: false,
|
|
12
|
-
});
|
|
13
|
-
//# sourceMappingURL=request-id.provider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-id.provider.js","sourceRoot":"","sources":["../../../src/tracing/services/request-id.provider.ts"],"names":[],"mappings":";;;AAKA,qCAAwD;AAE3C,QAAA,iBAAiB,GAAG,IAAA,iCAA0B,EAAS;IAClE,IAAI,EAAE,WAAW;IACjB,UAAU,EAAE,KAAK;CAClB,CAAC,CAAC;AAEU,QAAA,qBAAqB,GAAG,IAAA,iCAA0B,EAK5D;IACD,IAAI,EAAE,0BAA0B;IAChC,UAAU,EAAE,KAAK;CAClB,CAAC,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Global, Module } from '@nestjs/common';
|
|
2
|
-
|
|
3
|
-
import { ActiveSpanStorage } from './services/active-span.storage';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Модуль для получения данных активного спана
|
|
7
|
-
*/
|
|
8
|
-
@Global()
|
|
9
|
-
@Module({
|
|
10
|
-
providers: [ActiveSpanStorage],
|
|
11
|
-
exports: [ActiveSpanStorage],
|
|
12
|
-
})
|
|
13
|
-
export class ActiveSpanModule {}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
2
|
-
import { ClientRequest, IncomingMessage } from 'node:http';
|
|
3
|
-
|
|
4
|
-
import { RequestIdProvider } from './services/request-id.provider';
|
|
5
|
-
|
|
6
|
-
export const autoInstumentationOptions: any[] = getNodeAutoInstrumentations({
|
|
7
|
-
'@opentelemetry/instrumentation-aws-sdk': {
|
|
8
|
-
responseHook: (span, { response }) => {
|
|
9
|
-
if (response.request.commandInput?.Bucket) {
|
|
10
|
-
span.setAttribute(
|
|
11
|
-
's3.bucket.name',
|
|
12
|
-
response.request.commandInput?.Bucket,
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
'@opentelemetry/instrumentation-graphql': {
|
|
18
|
-
allowValues: true,
|
|
19
|
-
},
|
|
20
|
-
'@opentelemetry/instrumentation-http': {
|
|
21
|
-
requestHook: (span, request) => {
|
|
22
|
-
if (request instanceof IncomingMessage) {
|
|
23
|
-
if (request.method && request.url) {
|
|
24
|
-
span.updateName(`${request.method} ${request.url}`);
|
|
25
|
-
}
|
|
26
|
-
} else if (
|
|
27
|
-
request instanceof ClientRequest &&
|
|
28
|
-
request.req.method &&
|
|
29
|
-
request.req.url
|
|
30
|
-
) {
|
|
31
|
-
span.updateName(`${request.req.method} ${request.req.url}`);
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
},
|
|
35
|
-
'@opentelemetry/instrumentation-pg': {
|
|
36
|
-
enhancedDatabaseReporting: true,
|
|
37
|
-
},
|
|
38
|
-
'@opentelemetry/instrumentation-pino': {
|
|
39
|
-
enabled: true,
|
|
40
|
-
logHook: (_span, record) => {
|
|
41
|
-
record['request_id'] = RequestIdProvider.get();
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
});
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { Metadata } from '@grpc/grpc-js';
|
|
2
|
-
import type { MaybeReadonlyArray } from '@rsdk/common.node';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @description хелпер для нормализованного извлечения заголовков из grpc запроса
|
|
6
|
-
*/
|
|
7
|
-
export class GrpcHeaders {
|
|
8
|
-
constructor(private metadata: Metadata) {}
|
|
9
|
-
|
|
10
|
-
get<K extends string>(
|
|
11
|
-
key: MaybeReadonlyArray<K>,
|
|
12
|
-
): Record<K, string | undefined>;
|
|
13
|
-
get(key: string): string | undefined;
|
|
14
|
-
get(
|
|
15
|
-
key: string | MaybeReadonlyArray<string>,
|
|
16
|
-
): Record<string, string | undefined> | string | undefined {
|
|
17
|
-
if (Array.isArray(key)) {
|
|
18
|
-
return Object.fromEntries(key.map((k) => [k, this.get(k)])) as Record<
|
|
19
|
-
string,
|
|
20
|
-
any
|
|
21
|
-
>;
|
|
22
|
-
}
|
|
23
|
-
const requestIdMetadata = this.metadata.get(key as string);
|
|
24
|
-
if (requestIdMetadata.length > 0) {
|
|
25
|
-
return requestIdMetadata[0].toString();
|
|
26
|
-
}
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { MaybeReadonlyArray } from '@rsdk/common.node';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @description хелпер для нормализованного извлечения заголовков из http запроса
|
|
5
|
-
*/
|
|
6
|
-
export class HttpHeaders {
|
|
7
|
-
constructor(private headers: Record<string, string>) {
|
|
8
|
-
this.normalizedHeaders = Object.fromEntries(
|
|
9
|
-
Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v]),
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
get<K extends string>(
|
|
14
|
-
key: MaybeReadonlyArray<K>,
|
|
15
|
-
): Record<K, string | undefined>;
|
|
16
|
-
|
|
17
|
-
get(key: string): string | undefined;
|
|
18
|
-
|
|
19
|
-
get(
|
|
20
|
-
key: string | MaybeReadonlyArray<string>,
|
|
21
|
-
): Record<string, string | undefined> | string | undefined {
|
|
22
|
-
if (Array.isArray(key)) {
|
|
23
|
-
return Object.fromEntries(key.map((k) => [k, this.get(k)])) as Record<
|
|
24
|
-
string,
|
|
25
|
-
any
|
|
26
|
-
>;
|
|
27
|
-
}
|
|
28
|
-
return this.normalizedHeaders[(key as string).toLowerCase()];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
private normalizedHeaders: Record<string, string>;
|
|
32
|
-
}
|