@rsdk/kafka.transport 4.2.4 → 4.3.0-next.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 +10 -0
- package/dist/decorators/consume.decorator.d.ts +1 -1
- package/dist/kafka.headers.d.ts +12 -0
- package/dist/kafka.headers.js +27 -0
- package/dist/kafka.headers.js.map +1 -0
- package/dist/kafka.tracing-extractor.d.ts +6 -0
- package/dist/kafka.tracing-extractor.js +27 -0
- package/dist/kafka.tracing-extractor.js.map +1 -0
- package/dist/kafka.transport.d.ts +2 -1
- package/dist/kafka.transport.js +5 -2
- package/dist/kafka.transport.js.map +1 -1
- package/dist/patched-server-kafka/patched-server-kafka.d.ts +3 -2
- package/dist/patched-server-kafka/patched-server-kafka.js +3 -0
- package/dist/patched-server-kafka/patched-server-kafka.js.map +1 -1
- package/package.json +8 -7
- package/src/kafka.headers.ts +42 -0
- package/src/kafka.tracing-extractor.ts +27 -0
- package/src/kafka.transport.ts +7 -2
- package/src/patched-server-kafka/patched-server-kafka.ts +7 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [4.3.0-next.0](https://github.com/R-Vision/rsdk/compare/v4.2.5-next.0...v4.3.0-next.0) (2024-03-19)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* reworked cli system ([745ebf5](https://github.com/R-Vision/rsdk/commit/745ebf53635de135a4a9083f47ce833efe2d4411))
|
|
11
|
+
|
|
12
|
+
## [4.2.5-next.0](https://github.com/R-Vision/rsdk/compare/v4.2.4...v4.2.5-next.0) (2024-03-04)
|
|
13
|
+
|
|
14
|
+
**Note:** Version bump only for package @rsdk/kafka.transport
|
|
15
|
+
|
|
6
16
|
## [4.2.4](https://github.com/R-Vision/rsdk/compare/v4.2.3...v4.2.4) (2024-02-28)
|
|
7
17
|
|
|
8
18
|
**Note:** Version bump only for package @rsdk/kafka.transport
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { EventType } from '@rsdk/kafka.common';
|
|
2
|
-
export declare const Consume: <T>(eventType:
|
|
2
|
+
export declare const Consume: <T>(eventType: EventType<T> | string) => MethodDecorator;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { MaybeReadonlyArray } from '@rsdk/common.node';
|
|
3
|
+
/**
|
|
4
|
+
* @description хелпер для нормализованного извлечения заголовков из kafka
|
|
5
|
+
*/
|
|
6
|
+
export declare class KafkaHeaders {
|
|
7
|
+
private headers;
|
|
8
|
+
constructor(headers: Record<string, string | Buffer | (string | Buffer)[] | undefined>);
|
|
9
|
+
get<K extends string>(key: MaybeReadonlyArray<K>): Record<K, string | undefined>;
|
|
10
|
+
get(key: string): string | undefined;
|
|
11
|
+
private normalizedHeaders;
|
|
12
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KafkaHeaders = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @description хелпер для нормализованного извлечения заголовков из kafka
|
|
6
|
+
*/
|
|
7
|
+
class KafkaHeaders {
|
|
8
|
+
headers;
|
|
9
|
+
constructor(headers) {
|
|
10
|
+
this.headers = headers;
|
|
11
|
+
this.normalizedHeaders = Object.fromEntries(Object.entries(this.headers).map(([k, v]) => [
|
|
12
|
+
Array.isArray(k)
|
|
13
|
+
? k[0].toString().toLowerCase()
|
|
14
|
+
: k.toString().toLowerCase(),
|
|
15
|
+
v,
|
|
16
|
+
]));
|
|
17
|
+
}
|
|
18
|
+
get(key) {
|
|
19
|
+
if (Array.isArray(key)) {
|
|
20
|
+
return Object.fromEntries(key.map((k) => [k, this.get(k)]));
|
|
21
|
+
}
|
|
22
|
+
return this.normalizedHeaders[key.toLowerCase()];
|
|
23
|
+
}
|
|
24
|
+
normalizedHeaders;
|
|
25
|
+
}
|
|
26
|
+
exports.KafkaHeaders = KafkaHeaders;
|
|
27
|
+
//# sourceMappingURL=kafka.headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka.headers.js","sourceRoot":"","sources":["../src/kafka.headers.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,YAAY;IAEb;IADV,YACU,OAGP;QAHO,YAAO,GAAP,OAAO,CAGd;QAED,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,WAAW,CACzC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3C,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;gBAC/B,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE;YAC9B,CAAC;SACF,CAAC,CACH,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;AApCD,oCAoCC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ArgumentsHost } from '@nestjs/common';
|
|
2
|
+
import type { ProtocolTracingHeadersExtractor } from '@rsdk/core';
|
|
3
|
+
import { TracingHeaders } from '@rsdk/core/dist/tracing/types';
|
|
4
|
+
export declare class KafkaExtractor implements ProtocolTracingHeadersExtractor {
|
|
5
|
+
extract(ctx: ArgumentsHost): TracingHeaders;
|
|
6
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KafkaExtractor = void 0;
|
|
4
|
+
const common_node_1 = require("@rsdk/common.node");
|
|
5
|
+
const core_1 = require("@rsdk/core");
|
|
6
|
+
const types_1 = require("@rsdk/core/dist/tracing/types");
|
|
7
|
+
const patched_server_kafka_1 = require("./patched-server-kafka/patched-server-kafka");
|
|
8
|
+
const kafka_headers_1 = require("./kafka.headers");
|
|
9
|
+
class KafkaExtractor {
|
|
10
|
+
extract(ctx) {
|
|
11
|
+
const kafkaCtx = ctx.getArgByIndex(1);
|
|
12
|
+
if (!patched_server_kafka_1.PatchedServerKafka.isKafkaContext(kafkaCtx)) {
|
|
13
|
+
throw new core_1.InputException('Unexpected call with non kafka ArgumentHost');
|
|
14
|
+
}
|
|
15
|
+
const msg = kafkaCtx.getMessage();
|
|
16
|
+
const h = msg.headers;
|
|
17
|
+
if (!h) {
|
|
18
|
+
return new types_1.TracingHeaders({});
|
|
19
|
+
}
|
|
20
|
+
const headers = new kafka_headers_1.KafkaHeaders(h);
|
|
21
|
+
return new types_1.TracingHeaders({
|
|
22
|
+
...(0, common_node_1.omitUndefined)(headers.get(types_1.tracingHeaders)),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.KafkaExtractor = KafkaExtractor;
|
|
27
|
+
//# sourceMappingURL=kafka.tracing-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka.tracing-extractor.js","sourceRoot":"","sources":["../src/kafka.tracing-extractor.ts"],"names":[],"mappings":";;;AACA,mDAAkD;AAElD,qCAA4C;AAC5C,yDAA+E;AAE/E,sFAAiF;AACjF,mDAA+C;AAE/C,MAAa,cAAc;IACzB,OAAO,CAAC,GAAkB;QACxB,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,yCAAkB,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,qBAAc,CAAC,6CAA6C,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,OAAO,IAAI,sBAAc,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,4BAAY,CAAC,CAAC,CAAC,CAAC;QAEpC,OAAO,IAAI,sBAAc,CAAC;YACxB,GAAG,IAAA,2BAAa,EAAC,OAAO,CAAC,GAAG,CAAC,sBAAc,CAAC,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;CACF;AAjBD,wCAiBC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import type { MicroserviceOptions } from '@nestjs/microservices';
|
|
3
|
-
import type { ConfigContext, IErrorsFormatter, IErrorsTransformer, IMicroserviceTransport, NestModuleDefinitions } from '@rsdk/core';
|
|
3
|
+
import type { ConfigContext, IErrorsFormatter, IErrorsTransformer, IMicroserviceTransport, NestModuleDefinitions, ProtocolTracingHeadersExtractor } from '@rsdk/core';
|
|
4
4
|
export interface KafkaTransportOptions {
|
|
5
5
|
autoCommit?: boolean;
|
|
6
6
|
/**
|
|
@@ -33,6 +33,7 @@ export declare class KafkaTransport implements IMicroserviceTransport {
|
|
|
33
33
|
private logger;
|
|
34
34
|
private brokers?;
|
|
35
35
|
constructor(options?: KafkaTransportOptions | undefined);
|
|
36
|
+
getHeaderExtractor(): Omit<ProtocolTracingHeadersExtractor, 'protocol'>;
|
|
36
37
|
matchByContext(ctx: ExecutionContext): boolean;
|
|
37
38
|
modules(): NestModuleDefinitions;
|
|
38
39
|
createMicroserviceOptions(): MicroserviceOptions;
|
package/dist/kafka.transport.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KafkaTransport = void 0;
|
|
4
|
-
const microservices_1 = require("@nestjs/microservices");
|
|
5
4
|
const kafka_interface_1 = require("@nestjs/microservices/external/kafka.interface");
|
|
6
5
|
const core_1 = require("@rsdk/core");
|
|
7
6
|
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
8
7
|
const logging_1 = require("@rsdk/logging");
|
|
9
8
|
const kafka_transport_module_1 = require("./module/kafka-transport.module");
|
|
10
9
|
const patched_server_kafka_1 = require("./patched-server-kafka/patched-server-kafka");
|
|
10
|
+
const kafka_tracing_extractor_1 = require("./kafka.tracing-extractor");
|
|
11
11
|
const kafka_errors_formatter_1 = require("./kafka-errors.formatter");
|
|
12
12
|
// TODO: JsDoc
|
|
13
13
|
class KafkaTransport {
|
|
@@ -17,9 +17,12 @@ class KafkaTransport {
|
|
|
17
17
|
constructor(options) {
|
|
18
18
|
this.options = options;
|
|
19
19
|
}
|
|
20
|
+
getHeaderExtractor() {
|
|
21
|
+
return new kafka_tracing_extractor_1.KafkaExtractor();
|
|
22
|
+
}
|
|
20
23
|
matchByContext(ctx) {
|
|
21
24
|
const maybeKafkaContext = ctx.getArgByIndex(1);
|
|
22
|
-
return maybeKafkaContext
|
|
25
|
+
return patched_server_kafka_1.PatchedServerKafka.isKafkaContext(maybeKafkaContext);
|
|
23
26
|
}
|
|
24
27
|
modules() {
|
|
25
28
|
return [kafka_transport_module_1.KafkaTransportModule];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kafka.transport.js","sourceRoot":"","sources":["../src/kafka.transport.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"kafka.transport.js","sourceRoot":"","sources":["../src/kafka.transport.ts"],"names":[],"mappings":";;;AAEA,oFAA0E;AAS1E,qCAAsC;AACtC,qDAI4B;AAC5B,2CAA8C;AAE9C,4EAAuE;AACvE,sFAAiF;AACjF,uEAA2D;AAC3D,qEAAgE;AAiChE,cAAc;AACd,MAAa,cAAc;IAII;IAHrB,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9C,OAAO,CAAY;IAE3B,YAA6B,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;IAAG,CAAC;IAEhE,kBAAkB;QAChB,OAAO,IAAI,wCAAc,EAAE,CAAC;IAC9B,CAAC;IAED,cAAc,CAAC,GAAqB;QAClC,MAAM,iBAAiB,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAE/C,OAAO,yCAAkB,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO;QACL,OAAO,CAAC,6CAAoB,CAAC,CAAC;IAChC,CAAC;IAED,yBAAyB;QACvB,qDAAqD;QACrD,MAAM,EAAE,IAAI,EAAE,GAAG,eAAQ,CAAC,OAAO,EAAE,CAAC;QAEpC,OAAO;YACL,QAAQ,EAAE,IAAI,yCAAkB,CAAC;gBAC/B,MAAM,EAAE;oBACN,kDAAkD;oBAClD,OAAO,EAAE,IAAI,CAAC,OAAQ;oBACtB,QAAQ,EAAE,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;oBAClC,UAAU,EAAE,IAAA,kCAAmB,EAC7B,uBAAa,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAC5C;oBACD,QAAQ,EAAE,0BAAQ,CAAC,KAAK;oBACxB,KAAK,EAAE,+BAAgB;iBACxB;gBACD,QAAQ,EAAE;oBACR,sBAAsB,EAAE,KAAK;oBAC7B,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,+BAAgB;iBACxB;gBACD,MAAM,EAAE;oBACN,UAAU,EAAE,IAAI;iBACjB;gBACD,QAAQ,EAAE;oBACR,sBAAsB,EAAE,KAAK;oBAC7B,KAAK,EAAE,+BAAgB;iBACxB;gBACD,GAAG,EAAE;oBACH,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI;oBAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,8BAA8B,KAAK,SAAS,IAAI;wBAChE,8BAA8B,EAC5B,IAAI,CAAC,OAAO,EAAE,8BAA8B;qBAC/C,CAAC;iBACH;aACF,CAAC;SACH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAA4B;QAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,0BAAW,CAAC,CAAC;QAEvD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO;QACL,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,WAAW;QACT,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kBAAkB;QAChB,OAAO,IAAI,6CAAoB,EAAE,CAAC;IACpC,CAAC;IAED,oBAAoB;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAjFD,wCAiFC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ConsumerDeserializer,
|
|
2
|
-
import { ServerKafka } from '@nestjs/microservices';
|
|
1
|
+
import type { ConsumerDeserializer, MessageHandler, MsPattern, ReadPacket } from '@nestjs/microservices';
|
|
2
|
+
import { KafkaContext, ServerKafka } from '@nestjs/microservices';
|
|
3
3
|
import type { EachMessagePayload } from '@nestjs/microservices/external/kafka.interface';
|
|
4
4
|
import type { EventType } from '@rsdk/kafka.common';
|
|
5
5
|
import type { Consumer } from 'kafkajs';
|
|
@@ -10,6 +10,7 @@ export declare class PatchedServerKafka extends ServerKafka {
|
|
|
10
10
|
protected deserializer: ConsumerDeserializer & {
|
|
11
11
|
events: Map<string, EventType>;
|
|
12
12
|
};
|
|
13
|
+
static isKafkaContext(maybeKafkaContext: unknown): maybeKafkaContext is KafkaContext;
|
|
13
14
|
private topics;
|
|
14
15
|
addHandler(pattern: any, callback: MessageHandler, isEventHandler?: boolean, extras?: Record<string, any>): void;
|
|
15
16
|
bindEvents(consumer: Consumer): Promise<void>;
|
|
@@ -9,6 +9,9 @@ const events_deserializer_1 = require("./events.deserializer");
|
|
|
9
9
|
* Patches default ServerKafka routing and deserialization logic.
|
|
10
10
|
*/
|
|
11
11
|
class PatchedServerKafka extends microservices_1.ServerKafka {
|
|
12
|
+
static isKafkaContext(maybeKafkaContext) {
|
|
13
|
+
return maybeKafkaContext instanceof microservices_1.KafkaContext;
|
|
14
|
+
}
|
|
12
15
|
topics = new Set();
|
|
13
16
|
// TODO JSDOC
|
|
14
17
|
addHandler(pattern, callback, isEventHandler = false, extras = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patched-server-kafka.js","sourceRoot":"","sources":["../../src/patched-server-kafka/patched-server-kafka.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"patched-server-kafka.js","sourceRoot":"","sources":["../../src/patched-server-kafka/patched-server-kafka.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/kafka.transport",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0-next.0",
|
|
4
4
|
"description": "Transport that consumes messages from kafka",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -14,16 +14,17 @@
|
|
|
14
14
|
"@nestjs/common": "^10.0.0",
|
|
15
15
|
"@nestjs/core": "^10.0.0",
|
|
16
16
|
"@nestjs/microservices": "^10.0.0",
|
|
17
|
-
"@rsdk/core": "^4.
|
|
18
|
-
"@rsdk/kafka.common": "^4.
|
|
19
|
-
"@rsdk/logging": "^4.
|
|
20
|
-
"@rsdk/metadata": "^4.
|
|
17
|
+
"@rsdk/core": "^4.3.0-next.0",
|
|
18
|
+
"@rsdk/kafka.common": "^4.3.0-next.0",
|
|
19
|
+
"@rsdk/logging": "^4.3.0-next.0",
|
|
20
|
+
"@rsdk/metadata": "^4.3.0-next.0",
|
|
21
21
|
"kafkajs": "^2.2.4",
|
|
22
|
-
"reflect-metadata": "^0.1.
|
|
22
|
+
"reflect-metadata": "^0.1.12 || ^0.2.0",
|
|
23
23
|
"rxjs": "^7.8.1"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
+
"@rsdk/common.node": "^4.3.0-next.0",
|
|
26
27
|
"lodash": "^4.17.21"
|
|
27
28
|
},
|
|
28
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "68619cc6fc60db01568eede7df182d9882e857dd"
|
|
29
30
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { MaybeReadonlyArray } from '@rsdk/common.node';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @description хелпер для нормализованного извлечения заголовков из kafka
|
|
5
|
+
*/
|
|
6
|
+
export class KafkaHeaders {
|
|
7
|
+
constructor(
|
|
8
|
+
private headers: Record<
|
|
9
|
+
string,
|
|
10
|
+
string | Buffer | (string | Buffer)[] | undefined
|
|
11
|
+
>,
|
|
12
|
+
) {
|
|
13
|
+
this.normalizedHeaders = Object.fromEntries(
|
|
14
|
+
Object.entries(this.headers).map(([k, v]) => [
|
|
15
|
+
Array.isArray(k)
|
|
16
|
+
? k[0].toString().toLowerCase()
|
|
17
|
+
: k.toString().toLowerCase(),
|
|
18
|
+
v,
|
|
19
|
+
]),
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
get<K extends string>(
|
|
24
|
+
key: MaybeReadonlyArray<K>,
|
|
25
|
+
): Record<K, string | undefined>;
|
|
26
|
+
|
|
27
|
+
get(key: string): string | undefined;
|
|
28
|
+
|
|
29
|
+
get(
|
|
30
|
+
key: string | MaybeReadonlyArray<string>,
|
|
31
|
+
): Record<string, string | undefined> | string | undefined {
|
|
32
|
+
if (Array.isArray(key)) {
|
|
33
|
+
return Object.fromEntries(key.map((k) => [k, this.get(k)])) as Record<
|
|
34
|
+
string,
|
|
35
|
+
any
|
|
36
|
+
>;
|
|
37
|
+
}
|
|
38
|
+
return this.normalizedHeaders[(key as string).toLowerCase()];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private normalizedHeaders: Record<string, string>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ArgumentsHost } from '@nestjs/common';
|
|
2
|
+
import { omitUndefined } from '@rsdk/common.node';
|
|
3
|
+
import type { ProtocolTracingHeadersExtractor } from '@rsdk/core';
|
|
4
|
+
import { InputException } from '@rsdk/core';
|
|
5
|
+
import { TracingHeaders, tracingHeaders } from '@rsdk/core/dist/tracing/types';
|
|
6
|
+
|
|
7
|
+
import { PatchedServerKafka } from './patched-server-kafka/patched-server-kafka';
|
|
8
|
+
import { KafkaHeaders } from './kafka.headers';
|
|
9
|
+
|
|
10
|
+
export class KafkaExtractor implements ProtocolTracingHeadersExtractor {
|
|
11
|
+
extract(ctx: ArgumentsHost): TracingHeaders {
|
|
12
|
+
const kafkaCtx = ctx.getArgByIndex(1);
|
|
13
|
+
if (!PatchedServerKafka.isKafkaContext(kafkaCtx)) {
|
|
14
|
+
throw new InputException('Unexpected call with non kafka ArgumentHost');
|
|
15
|
+
}
|
|
16
|
+
const msg = kafkaCtx.getMessage();
|
|
17
|
+
const h = msg.headers;
|
|
18
|
+
if (!h) {
|
|
19
|
+
return new TracingHeaders({});
|
|
20
|
+
}
|
|
21
|
+
const headers = new KafkaHeaders(h);
|
|
22
|
+
|
|
23
|
+
return new TracingHeaders({
|
|
24
|
+
...omitUndefined(headers.get(tracingHeaders)),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
package/src/kafka.transport.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ExecutionContext } from '@nestjs/common';
|
|
2
2
|
import type { MicroserviceOptions } from '@nestjs/microservices';
|
|
3
|
-
import { KafkaContext } from '@nestjs/microservices';
|
|
4
3
|
import { logLevel } from '@nestjs/microservices/external/kafka.interface';
|
|
5
4
|
import type {
|
|
6
5
|
ConfigContext,
|
|
@@ -8,6 +7,7 @@ import type {
|
|
|
8
7
|
IErrorsTransformer,
|
|
9
8
|
IMicroserviceTransport,
|
|
10
9
|
NestModuleDefinitions,
|
|
10
|
+
ProtocolTracingHeadersExtractor,
|
|
11
11
|
} from '@rsdk/core';
|
|
12
12
|
import { Manifest } from '@rsdk/core';
|
|
13
13
|
import {
|
|
@@ -19,6 +19,7 @@ import { LoggerFactory } from '@rsdk/logging';
|
|
|
19
19
|
|
|
20
20
|
import { KafkaTransportModule } from './module/kafka-transport.module';
|
|
21
21
|
import { PatchedServerKafka } from './patched-server-kafka/patched-server-kafka';
|
|
22
|
+
import { KafkaExtractor } from './kafka.tracing-extractor';
|
|
22
23
|
import { KafkaErrorsFormatter } from './kafka-errors.formatter';
|
|
23
24
|
|
|
24
25
|
// TODO JsDoc
|
|
@@ -59,10 +60,14 @@ export class KafkaTransport implements IMicroserviceTransport {
|
|
|
59
60
|
|
|
60
61
|
constructor(private readonly options?: KafkaTransportOptions) {}
|
|
61
62
|
|
|
63
|
+
getHeaderExtractor(): Omit<ProtocolTracingHeadersExtractor, 'protocol'> {
|
|
64
|
+
return new KafkaExtractor();
|
|
65
|
+
}
|
|
66
|
+
|
|
62
67
|
matchByContext(ctx: ExecutionContext): boolean {
|
|
63
68
|
const maybeKafkaContext = ctx.getArgByIndex(1);
|
|
64
69
|
|
|
65
|
-
return maybeKafkaContext
|
|
70
|
+
return PatchedServerKafka.isKafkaContext(maybeKafkaContext);
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
modules(): NestModuleDefinitions {
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
ConsumerDeserializer,
|
|
3
|
-
KafkaContext,
|
|
4
3
|
MessageHandler,
|
|
5
4
|
MsPattern,
|
|
6
5
|
ReadPacket,
|
|
7
6
|
} from '@nestjs/microservices';
|
|
8
|
-
import { ServerKafka } from '@nestjs/microservices';
|
|
7
|
+
import { KafkaContext, ServerKafka } from '@nestjs/microservices';
|
|
9
8
|
import type {
|
|
10
9
|
ConsumerSubscribeTopic,
|
|
11
10
|
EachMessagePayload,
|
|
@@ -29,6 +28,12 @@ export class PatchedServerKafka extends ServerKafka {
|
|
|
29
28
|
events: Map<string, EventType>;
|
|
30
29
|
};
|
|
31
30
|
|
|
31
|
+
static isKafkaContext(
|
|
32
|
+
maybeKafkaContext: unknown,
|
|
33
|
+
): maybeKafkaContext is KafkaContext {
|
|
34
|
+
return maybeKafkaContext instanceof KafkaContext;
|
|
35
|
+
}
|
|
36
|
+
|
|
32
37
|
private topics: Set<string> = new Set();
|
|
33
38
|
|
|
34
39
|
// TODO JSDOC
|