@rsdk/kafka.producer.direct 1.0.13
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 +24 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/direct.producer.d.ts +14 -0
- package/dist/direct.producer.js +58 -0
- package/dist/direct.producer.js.map +1 -0
- package/dist/direct.strategy.d.ts +5 -0
- package/dist/direct.strategy.js +47 -0
- package/dist/direct.strategy.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata/autodoc.resolver.d.ts +7 -0
- package/dist/metadata/autodoc.resolver.js +25 -0
- package/dist/metadata/autodoc.resolver.js.map +1 -0
- package/dist/module/kafka-producer-direct.health-indicator.d.ts +9 -0
- package/dist/module/kafka-producer-direct.health-indicator.js +40 -0
- package/dist/module/kafka-producer-direct.health-indicator.js.map +1 -0
- package/dist/module/kafka-producer-direct.module.d.ts +2 -0
- package/dist/module/kafka-producer-direct.module.js +22 -0
- package/dist/module/kafka-producer-direct.module.js.map +1 -0
- package/package.json +29 -0
- package/src/constants.ts +1 -0
- package/src/direct.producer.ts +65 -0
- package/src/direct.strategy.ts +63 -0
- package/src/index.ts +1 -0
- package/src/metadata/autodoc.resolver.ts +42 -0
- package/src/module/kafka-producer-direct.health-indicator.ts +26 -0
- package/src/module/kafka-producer-direct.module.ts +10 -0
- package/tsconfig.json +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
## 1.0.13 (2023-06-06)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @rsdk/kafka.producer.direct
|
|
9
|
+
|
|
10
|
+
## 1.0.12 (2023-05-23)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* remove private dependencies from `peerDependencies` section ([0bce6ff](https://github.com/R-Vision/rsdk/commit/0bce6ffb5b699e2ed1dc9aca77cbdbf085267ff7))
|
|
15
|
+
|
|
16
|
+
## 1.0.11 (2023-05-23)
|
|
17
|
+
|
|
18
|
+
**Note:** Version bump only for package @rsdk/kafka.producer.direct
|
|
19
|
+
|
|
20
|
+
## 1.0.10 (2023-05-22)
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* add "access: public" to new packages ([04d5983](https://github.com/R-Vision/rsdk/commit/04d5983cfa3e97c5d8219e07208a0499a8c6bc83))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const KAFKA_PRODUCED_RSDK_METADATA_SCOPE = "kafka-producer-direct";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kCAAkC,GAAG,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EventType } from '@rsdk/kafka.common';
|
|
2
|
+
import type { KafkaProducer, PublishOptions } from '@rsdk/kafka.producer';
|
|
3
|
+
import { BaseProducer } from '@rsdk/kafka.producer';
|
|
4
|
+
import type { Producer } from 'kafkajs';
|
|
5
|
+
export declare class DirectProducer<T extends EventType> extends BaseProducer<T> implements KafkaProducer<T> {
|
|
6
|
+
readonly eventType: T;
|
|
7
|
+
private readonly client;
|
|
8
|
+
static logger: import("@rsdk/logging").ILogger;
|
|
9
|
+
constructor(eventType: T, client: Producer);
|
|
10
|
+
static getTopicName(eventType: EventType): string;
|
|
11
|
+
publish(payload: T, options?: PublishOptions): Promise<void>;
|
|
12
|
+
private getMessage;
|
|
13
|
+
private getPayload;
|
|
14
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DirectProducer = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
6
|
+
const kafka_producer_1 = require("@rsdk/kafka.producer");
|
|
7
|
+
const logging_1 = require("@rsdk/logging");
|
|
8
|
+
class DirectProducer extends kafka_producer_1.BaseProducer {
|
|
9
|
+
eventType;
|
|
10
|
+
client;
|
|
11
|
+
static logger = logging_1.LoggerFactory.create(DirectProducer);
|
|
12
|
+
constructor(eventType, client) {
|
|
13
|
+
super(eventType);
|
|
14
|
+
this.eventType = eventType;
|
|
15
|
+
this.client = client;
|
|
16
|
+
}
|
|
17
|
+
static getTopicName(eventType) {
|
|
18
|
+
return `events.${eventType.$group}`;
|
|
19
|
+
}
|
|
20
|
+
async publish(payload, options) {
|
|
21
|
+
const topicName = DirectProducer.getTopicName(this.eventType);
|
|
22
|
+
try {
|
|
23
|
+
await this.client.send({
|
|
24
|
+
topic: topicName,
|
|
25
|
+
messages: [this.getMessage(payload, options)],
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
new kafka_common_1.ServerKafkaExceptionFactory(DirectProducer.getTopicName(this.eventType), {
|
|
30
|
+
cause: error,
|
|
31
|
+
details: options,
|
|
32
|
+
}).wrapAndThrow(error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
getMessage(payload, options) {
|
|
36
|
+
return {
|
|
37
|
+
headers: {
|
|
38
|
+
id: (0, crypto_1.randomUUID)(),
|
|
39
|
+
type: this.eventType.$type,
|
|
40
|
+
...(options?.metadata && {
|
|
41
|
+
metadata: JSON.stringify(options.metadata),
|
|
42
|
+
}),
|
|
43
|
+
},
|
|
44
|
+
key: JSON.stringify({
|
|
45
|
+
schema: { type: 'string', optional: false },
|
|
46
|
+
payload: this.getPayload(payload, options),
|
|
47
|
+
}),
|
|
48
|
+
value: Buffer.from(this.eventType.encode(payload).finish()),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
getPayload(payload, options) {
|
|
52
|
+
return options?.partitionKey
|
|
53
|
+
? String(options.partitionKey)
|
|
54
|
+
: this.getPartitionKey(payload, this.eventType.$partitionKeyField);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.DirectProducer = DirectProducer;
|
|
58
|
+
//# sourceMappingURL=direct.producer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct.producer.js","sourceRoot":"","sources":["../src/direct.producer.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAGpC,qDAAiE;AAEjE,yDAAoD;AACpD,2CAA8C;AAG9C,MAAa,cACX,SAAQ,6BAAe;IAKF;IAA+B;IAFpD,MAAM,CAAC,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAErD,YAAqB,SAAY,EAAmB,MAAgB;QAClE,KAAK,CAAC,SAAS,CAAC,CAAC;QADE,cAAS,GAAT,SAAS,CAAG;QAAmB,WAAM,GAAN,MAAM,CAAU;IAEpE,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,SAAoB;QACtC,OAAO,UAAU,SAAS,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAU,EAAE,OAAwB;QAChD,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9D,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aAC9C,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,0CAA2B,CAC7B,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAC3C;gBACE,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,OAAO;aACjB,CACF,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SACvB;IACH,CAAC;IAEO,UAAU,CAAC,OAAU,EAAE,OAAwB;QACrD,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;gBAC1B,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI;oBACvB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;iBAC3C,CAAC;aACH;YACD,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;gBAClB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;gBAC3C,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;aAC3C,CAAC;YACF,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;SAC5D,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,OAAU,EAAE,OAAwB;QACrD,OAAO,OAAO,EAAE,YAAY;YAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACvE,CAAC;;AAtDU,wCAAc"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.KafkaDirectProducer = void 0;
|
|
7
|
+
const autodoc_protocol_1 = require("@rsdk/autodoc.protocol");
|
|
8
|
+
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
9
|
+
const metadata_1 = require("@rsdk/metadata");
|
|
10
|
+
const omit_1 = __importDefault(require("lodash/omit"));
|
|
11
|
+
const autodoc_resolver_1 = require("./metadata/autodoc.resolver");
|
|
12
|
+
const kafka_producer_direct_module_1 = require("./module/kafka-producer-direct.module");
|
|
13
|
+
const direct_producer_1 = require("./direct.producer");
|
|
14
|
+
// TODO: JSDOC
|
|
15
|
+
class KafkaDirectProducer {
|
|
16
|
+
// TODO: JSDOC
|
|
17
|
+
static forEvent(eventType) {
|
|
18
|
+
const eventTypes = Array.isArray(eventType) ? eventType : [eventType];
|
|
19
|
+
const providers = eventTypes.map((eventType) => ({
|
|
20
|
+
inject: [kafka_common_1.KAFKA_PRODUCER_INJECTION_TOKEN],
|
|
21
|
+
provide: eventType.$type,
|
|
22
|
+
useFactory: (producer) => {
|
|
23
|
+
return new direct_producer_1.DirectProducer(eventType, producer);
|
|
24
|
+
},
|
|
25
|
+
}));
|
|
26
|
+
const moduleDef = {
|
|
27
|
+
imports: [kafka_common_1.KafkaClientModule, kafka_producer_direct_module_1.KafkaProducerDirectModule],
|
|
28
|
+
providers,
|
|
29
|
+
module: KafkaDirectProducer,
|
|
30
|
+
exports: providers.map(({ provide }) => provide),
|
|
31
|
+
};
|
|
32
|
+
const rsdkKafkaMetadata = new metadata_1.RsdkMetadata(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE);
|
|
33
|
+
for (const eventType of eventTypes) {
|
|
34
|
+
rsdkKafkaMetadata.add({
|
|
35
|
+
type: kafka_common_1.KafkaTopicType.Produce,
|
|
36
|
+
topicName: (0, kafka_common_1.getTopicName)(eventType),
|
|
37
|
+
group: eventType.$group,
|
|
38
|
+
partitionKeyField: eventType.$partitionKeyField,
|
|
39
|
+
eventType: (0, omit_1.default)(eventType, 'toJSON', 'encode', 'decode'),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
autodoc_protocol_1.AutodocMetadata.defineResolver(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE, autodoc_resolver_1.kafkaProducerDirectAutodocResolver);
|
|
43
|
+
return moduleDef;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.KafkaDirectProducer = KafkaDirectProducer;
|
|
47
|
+
//# sourceMappingURL=direct.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct.strategy.js","sourceRoot":"","sources":["../src/direct.strategy.ts"],"names":[],"mappings":";;;;;;AACA,6DAAyD;AAEzD,qDAM4B;AAC5B,6CAA8C;AAE9C,uDAA+B;AAE/B,kEAAiF;AACjF,wFAAkF;AAClF,uDAAmD;AAEnD,cAAc;AACd,MAAa,mBAAmB;IAC9B,cAAc;IACd,MAAM,CAAC,QAAQ,CAAC,SAAkC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEtE,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,6CAA8B,CAAC;YACxC,OAAO,EAAE,SAAS,CAAC,KAAK;YACxB,UAAU,EAAE,CAAC,QAAkB,EAA6B,EAAE;gBAC5D,OAAO,IAAI,gCAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,CAAC,gCAAiB,EAAE,wDAAyB,CAAC;YACvD,SAAS;YACT,MAAM,EAAE,mBAAmB;YAC3B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;SACjD,CAAC;QAEF,MAAM,iBAAiB,GAAG,IAAI,uBAAY,CACxC,SAAS,EACT,8CAA+B,CAChC,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,iBAAiB,CAAC,GAAG,CAAC;gBACpB,IAAI,EAAE,6BAAc,CAAC,OAAO;gBAC5B,SAAS,EAAE,IAAA,2BAAY,EAAC,SAAS,CAAC;gBAClC,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,iBAAiB,EAAE,SAAS,CAAC,kBAAkB;gBAC/C,SAAS,EAAE,IAAA,cAAI,EAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;aACzD,CAAC,CAAC;SACJ;QAED,kCAAe,CAAC,cAAc,CAC5B,SAAS,EACT,8CAA+B,EAC/B,qDAAkC,CACnC,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AA3CD,kDA2CC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { KafkaDirectProducer } from './direct.strategy';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KafkaDirectProducer = void 0;
|
|
4
|
+
var direct_strategy_1 = require("./direct.strategy");
|
|
5
|
+
Object.defineProperty(exports, "KafkaDirectProducer", { enumerable: true, get: function () { return direct_strategy_1.KafkaDirectProducer; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAwD;AAA/C,sHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DocumentResolver } from '@rsdk/autodoc.protocol';
|
|
2
|
+
import { Composite } from '@rsdk/autodoc.protocol';
|
|
3
|
+
import type { RsdkMetadataProvider } from '@rsdk/metadata';
|
|
4
|
+
export declare class KafkaProducerDirectAutodocResolver implements DocumentResolver {
|
|
5
|
+
getNode(rsdkMetadataProvider: RsdkMetadataProvider): Composite | null;
|
|
6
|
+
}
|
|
7
|
+
export declare const kafkaProducerDirectAutodocResolver: KafkaProducerDirectAutodocResolver;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.kafkaProducerDirectAutodocResolver = exports.KafkaProducerDirectAutodocResolver = void 0;
|
|
4
|
+
const autodoc_protocol_1 = require("@rsdk/autodoc.protocol");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
class KafkaProducerDirectAutodocResolver {
|
|
7
|
+
getNode(rsdkMetadataProvider) {
|
|
8
|
+
const resources = rsdkMetadataProvider.get(constants_1.KAFKA_PRODUCED_RSDK_METADATA_SCOPE);
|
|
9
|
+
if (!resources) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
return new autodoc_protocol_1.Composite(new autodoc_protocol_1.Table(resources.map((resource) => {
|
|
13
|
+
const { topicName, group: group, partitionKeyField, eventType, } = resource.value;
|
|
14
|
+
return {
|
|
15
|
+
TopicName: topicName,
|
|
16
|
+
Group: group,
|
|
17
|
+
PartitionKeyField: partitionKeyField ?? '-',
|
|
18
|
+
EventType: eventType?.$type ?? '-',
|
|
19
|
+
};
|
|
20
|
+
})), 'Kafka producer direct');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.KafkaProducerDirectAutodocResolver = KafkaProducerDirectAutodocResolver;
|
|
24
|
+
exports.kafkaProducerDirectAutodocResolver = new KafkaProducerDirectAutodocResolver();
|
|
25
|
+
//# sourceMappingURL=autodoc.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autodoc.resolver.js","sourceRoot":"","sources":["../../src/metadata/autodoc.resolver.ts"],"names":[],"mappings":";;;AACA,6DAA0D;AAI1D,4CAAkE;AAElE,MAAa,kCAAkC;IAC7C,OAAO,CAAC,oBAA0C;QAChD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CACxC,8CAAkC,CACnC,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE;YACd,OAAO,IAAI,CAAC;SACb;QAED,OAAO,IAAI,4BAAS,CAClB,IAAI,wBAAK,CACP,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACzB,MAAM,EACJ,SAAS,EACT,KAAK,EAAE,KAAK,EACZ,iBAAiB,EACjB,SAAS,GACV,GAAG,QAAQ,CAAC,KAAK,CAAC;YAEnB,OAAO;gBACL,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,KAAK;gBACZ,iBAAiB,EAAE,iBAAiB,IAAI,GAAG;gBAC3C,SAAS,EAAE,SAAS,EAAE,KAAK,IAAI,GAAG;aACnC,CAAC;QACJ,CAAC,CAAC,CACH,EACD,uBAAuB,CACxB,CAAC;IACJ,CAAC;CACF;AA/BD,gFA+BC;AAEY,QAAA,kCAAkC,GAC7C,IAAI,kCAAkC,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CheckResult, HealthIndicator } from '@rsdk/core';
|
|
2
|
+
import { KafkaMetadataProvider } from '@rsdk/kafka.common';
|
|
3
|
+
import { Kafka } from 'kafkajs';
|
|
4
|
+
export declare class KafkaProducerDirectHealthIndicator implements HealthIndicator {
|
|
5
|
+
private readonly kafkaClient;
|
|
6
|
+
private readonly topicStorage;
|
|
7
|
+
constructor(kafkaClient: Kafka, topicStorage: KafkaMetadataProvider);
|
|
8
|
+
check(): Promise<CheckResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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 __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.KafkaProducerDirectHealthIndicator = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const core_1 = require("@rsdk/core");
|
|
18
|
+
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
19
|
+
const kafkajs_1 = require("kafkajs");
|
|
20
|
+
let KafkaProducerDirectHealthIndicator = class KafkaProducerDirectHealthIndicator {
|
|
21
|
+
kafkaClient;
|
|
22
|
+
topicStorage;
|
|
23
|
+
constructor(kafkaClient, topicStorage) {
|
|
24
|
+
this.kafkaClient = kafkaClient;
|
|
25
|
+
this.topicStorage = topicStorage;
|
|
26
|
+
}
|
|
27
|
+
async check() {
|
|
28
|
+
return new kafka_common_1.KafkaHealthcheck(this.kafkaClient, this.topicStorage.getProducedTopics()).check();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
KafkaProducerDirectHealthIndicator = __decorate([
|
|
32
|
+
(0, core_1.Indicator)('kafka-producer-direct', {
|
|
33
|
+
description: 'Check kafka connection',
|
|
34
|
+
}),
|
|
35
|
+
__param(0, (0, common_1.Inject)(kafka_common_1.KAFKA_CLIENT_INJECTION_TOKEN)),
|
|
36
|
+
__metadata("design:paramtypes", [kafkajs_1.Kafka,
|
|
37
|
+
kafka_common_1.KafkaMetadataProvider])
|
|
38
|
+
], KafkaProducerDirectHealthIndicator);
|
|
39
|
+
exports.KafkaProducerDirectHealthIndicator = KafkaProducerDirectHealthIndicator;
|
|
40
|
+
//# sourceMappingURL=kafka-producer-direct.health-indicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka-producer-direct.health-indicator.js","sourceRoot":"","sources":["../../src/module/kafka-producer-direct.health-indicator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwC;AAExC,qCAAuC;AACvC,qDAI4B;AAC5B,qCAAgC;AAEhC,IAGa,kCAAkC,GAH/C,MAGa,kCAAkC;IAEY;IACtC;IAFnB,YACyD,WAAkB,EACxD,YAAmC;QADG,gBAAW,GAAX,WAAW,CAAO;QACxD,iBAAY,GAAZ,YAAY,CAAuB;IACnD,CAAC;IAEJ,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,+BAAgB,CACzB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CACtC,CAAC,KAAK,EAAE,CAAC;IACZ,CAAC;CACF,CAAA;AAZY,kCAAkC;IAH9C,IAAA,gBAAS,EAAC,uBAAuB,EAAE;QAClC,WAAW,EAAE,wBAAwB;KACtC,CAAC;IAGG,WAAA,IAAA,eAAM,EAAC,2CAA4B,CAAC,CAAA;qCAA+B,eAAK;QAC1C,oCAAqB;GAH3C,kCAAkC,CAY9C;AAZY,gFAAkC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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.KafkaProducerDirectModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const kafka_common_1 = require("@rsdk/kafka.common");
|
|
12
|
+
const kafka_producer_direct_health_indicator_1 = require("./kafka-producer-direct.health-indicator");
|
|
13
|
+
let KafkaProducerDirectModule = class KafkaProducerDirectModule {
|
|
14
|
+
};
|
|
15
|
+
KafkaProducerDirectModule = __decorate([
|
|
16
|
+
(0, common_1.Module)({
|
|
17
|
+
imports: [kafka_common_1.KafkaClientModule],
|
|
18
|
+
providers: [kafka_producer_direct_health_indicator_1.KafkaProducerDirectHealthIndicator],
|
|
19
|
+
})
|
|
20
|
+
], KafkaProducerDirectModule);
|
|
21
|
+
exports.KafkaProducerDirectModule = KafkaProducerDirectModule;
|
|
22
|
+
//# sourceMappingURL=kafka-producer-direct.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka-producer-direct.module.js","sourceRoot":"","sources":["../../src/module/kafka-producer-direct.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,qDAAuD;AAEvD,qGAA8F;AAM9F,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;CAAG,CAAA;AAA5B,yBAAyB;IAJrC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,gCAAiB,CAAC;QAC5B,SAAS,EAAE,CAAC,2EAAkC,CAAC;KAChD,CAAC;GACW,yBAAyB,CAAG;AAA5B,8DAAyB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rsdk/kafka.producer.direct",
|
|
3
|
+
"version": "1.0.13",
|
|
4
|
+
"description": "Publishing messages directly to kafka",
|
|
5
|
+
"license": "Apache License 2.0",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"url": "https://github.com/R-Vision/rsdk"
|
|
11
|
+
},
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"peerDependencies": {
|
|
14
|
+
"@nestjs/common": "^9.0.0",
|
|
15
|
+
"@nestjs/microservices": "^9.0.0",
|
|
16
|
+
"@rsdk/autodoc.protocol": "^1.0.13",
|
|
17
|
+
"@rsdk/common": "^1.0.13",
|
|
18
|
+
"@rsdk/core": "^1.0.13",
|
|
19
|
+
"@rsdk/kafka.common": "^1.0.13",
|
|
20
|
+
"@rsdk/kafka.producer": "^1.0.13",
|
|
21
|
+
"@rsdk/logging": "^1.0.13",
|
|
22
|
+
"@rsdk/metadata": "^1.0.13",
|
|
23
|
+
"kafkajs": "^2.2.4"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"lodash": "^4.17.21"
|
|
27
|
+
},
|
|
28
|
+
"gitHead": "1f40e539993d341b239f78bf2f8b29b44fae9c1e"
|
|
29
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const KAFKA_PRODUCED_RSDK_METADATA_SCOPE = 'kafka-producer-direct';
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
|
|
3
|
+
import type { EventType } from '@rsdk/kafka.common';
|
|
4
|
+
import { ServerKafkaExceptionFactory } from '@rsdk/kafka.common';
|
|
5
|
+
import type { KafkaProducer, PublishOptions } from '@rsdk/kafka.producer';
|
|
6
|
+
import { BaseProducer } from '@rsdk/kafka.producer';
|
|
7
|
+
import { LoggerFactory } from '@rsdk/logging';
|
|
8
|
+
import type { Message, Producer } from 'kafkajs';
|
|
9
|
+
|
|
10
|
+
export class DirectProducer<T extends EventType>
|
|
11
|
+
extends BaseProducer<T>
|
|
12
|
+
implements KafkaProducer<T>
|
|
13
|
+
{
|
|
14
|
+
static logger = LoggerFactory.create(DirectProducer);
|
|
15
|
+
|
|
16
|
+
constructor(readonly eventType: T, private readonly client: Producer) {
|
|
17
|
+
super(eventType);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static getTopicName(eventType: EventType): string {
|
|
21
|
+
return `events.${eventType.$group}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async publish(payload: T, options?: PublishOptions): Promise<void> {
|
|
25
|
+
const topicName = DirectProducer.getTopicName(this.eventType);
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
await this.client.send({
|
|
29
|
+
topic: topicName,
|
|
30
|
+
messages: [this.getMessage(payload, options)],
|
|
31
|
+
});
|
|
32
|
+
} catch (error) {
|
|
33
|
+
new ServerKafkaExceptionFactory(
|
|
34
|
+
DirectProducer.getTopicName(this.eventType),
|
|
35
|
+
{
|
|
36
|
+
cause: error,
|
|
37
|
+
details: options,
|
|
38
|
+
},
|
|
39
|
+
).wrapAndThrow(error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private getMessage(payload: T, options?: PublishOptions): Message {
|
|
44
|
+
return {
|
|
45
|
+
headers: {
|
|
46
|
+
id: randomUUID(),
|
|
47
|
+
type: this.eventType.$type,
|
|
48
|
+
...(options?.metadata && {
|
|
49
|
+
metadata: JSON.stringify(options.metadata),
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
key: JSON.stringify({
|
|
53
|
+
schema: { type: 'string', optional: false },
|
|
54
|
+
payload: this.getPayload(payload, options),
|
|
55
|
+
}),
|
|
56
|
+
value: Buffer.from(this.eventType.encode(payload).finish()),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private getPayload(payload: T, options?: PublishOptions): string {
|
|
61
|
+
return options?.partitionKey
|
|
62
|
+
? String(options.partitionKey)
|
|
63
|
+
: this.getPartitionKey(payload, this.eventType.$partitionKeyField);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { AutodocMetadata } from '@rsdk/autodoc.protocol';
|
|
3
|
+
import type { EventType, KafkaTopicMetadata } from '@rsdk/kafka.common';
|
|
4
|
+
import {
|
|
5
|
+
getTopicName,
|
|
6
|
+
KAFKA_PRODUCER_INJECTION_TOKEN,
|
|
7
|
+
KAFKA_TOPIC_RSDK_METADATA_SCOPE,
|
|
8
|
+
KafkaClientModule,
|
|
9
|
+
KafkaTopicType,
|
|
10
|
+
} from '@rsdk/kafka.common';
|
|
11
|
+
import { RsdkMetadata } from '@rsdk/metadata';
|
|
12
|
+
import type { Producer } from 'kafkajs';
|
|
13
|
+
import omit from 'lodash/omit';
|
|
14
|
+
|
|
15
|
+
import { kafkaProducerDirectAutodocResolver } from './metadata/autodoc.resolver';
|
|
16
|
+
import { KafkaProducerDirectModule } from './module/kafka-producer-direct.module';
|
|
17
|
+
import { DirectProducer } from './direct.producer';
|
|
18
|
+
|
|
19
|
+
// TODO: JSDOC
|
|
20
|
+
export class KafkaDirectProducer {
|
|
21
|
+
// TODO: JSDOC
|
|
22
|
+
static forEvent(eventType: EventType | EventType[]): DynamicModule {
|
|
23
|
+
const eventTypes = Array.isArray(eventType) ? eventType : [eventType];
|
|
24
|
+
|
|
25
|
+
const providers = eventTypes.map((eventType) => ({
|
|
26
|
+
inject: [KAFKA_PRODUCER_INJECTION_TOKEN],
|
|
27
|
+
provide: eventType.$type,
|
|
28
|
+
useFactory: (producer: Producer): DirectProducer<EventType> => {
|
|
29
|
+
return new DirectProducer(eventType, producer);
|
|
30
|
+
},
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
const moduleDef = {
|
|
34
|
+
imports: [KafkaClientModule, KafkaProducerDirectModule],
|
|
35
|
+
providers,
|
|
36
|
+
module: KafkaDirectProducer,
|
|
37
|
+
exports: providers.map(({ provide }) => provide),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const rsdkKafkaMetadata = new RsdkMetadata<KafkaTopicMetadata>(
|
|
41
|
+
moduleDef,
|
|
42
|
+
KAFKA_TOPIC_RSDK_METADATA_SCOPE,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
for (const eventType of eventTypes) {
|
|
46
|
+
rsdkKafkaMetadata.add({
|
|
47
|
+
type: KafkaTopicType.Produce,
|
|
48
|
+
topicName: getTopicName(eventType),
|
|
49
|
+
group: eventType.$group,
|
|
50
|
+
partitionKeyField: eventType.$partitionKeyField,
|
|
51
|
+
eventType: omit(eventType, 'toJSON', 'encode', 'decode'),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
AutodocMetadata.defineResolver(
|
|
56
|
+
moduleDef,
|
|
57
|
+
KAFKA_TOPIC_RSDK_METADATA_SCOPE,
|
|
58
|
+
kafkaProducerDirectAutodocResolver,
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
return moduleDef;
|
|
62
|
+
}
|
|
63
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { KafkaDirectProducer } from './direct.strategy';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { DocumentResolver } from '@rsdk/autodoc.protocol';
|
|
2
|
+
import { Composite, Table } from '@rsdk/autodoc.protocol';
|
|
3
|
+
import type { KafkaTopicMetadata } from '@rsdk/kafka.common';
|
|
4
|
+
import type { RsdkMetadataProvider } from '@rsdk/metadata';
|
|
5
|
+
|
|
6
|
+
import { KAFKA_PRODUCED_RSDK_METADATA_SCOPE } from '../constants';
|
|
7
|
+
|
|
8
|
+
export class KafkaProducerDirectAutodocResolver implements DocumentResolver {
|
|
9
|
+
getNode(rsdkMetadataProvider: RsdkMetadataProvider): Composite | null {
|
|
10
|
+
const resources = rsdkMetadataProvider.get<KafkaTopicMetadata>(
|
|
11
|
+
KAFKA_PRODUCED_RSDK_METADATA_SCOPE,
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
if (!resources) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return new Composite(
|
|
19
|
+
new Table(
|
|
20
|
+
resources.map((resource) => {
|
|
21
|
+
const {
|
|
22
|
+
topicName,
|
|
23
|
+
group: group,
|
|
24
|
+
partitionKeyField,
|
|
25
|
+
eventType,
|
|
26
|
+
} = resource.value;
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
TopicName: topicName,
|
|
30
|
+
Group: group,
|
|
31
|
+
PartitionKeyField: partitionKeyField ?? '-',
|
|
32
|
+
EventType: eventType?.$type ?? '-',
|
|
33
|
+
};
|
|
34
|
+
}),
|
|
35
|
+
),
|
|
36
|
+
'Kafka producer direct',
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const kafkaProducerDirectAutodocResolver =
|
|
42
|
+
new KafkaProducerDirectAutodocResolver();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Inject } from '@nestjs/common';
|
|
2
|
+
import type { CheckResult, HealthIndicator } from '@rsdk/core';
|
|
3
|
+
import { Indicator } from '@rsdk/core';
|
|
4
|
+
import {
|
|
5
|
+
KAFKA_CLIENT_INJECTION_TOKEN,
|
|
6
|
+
KafkaHealthcheck,
|
|
7
|
+
KafkaMetadataProvider,
|
|
8
|
+
} from '@rsdk/kafka.common';
|
|
9
|
+
import { Kafka } from 'kafkajs';
|
|
10
|
+
|
|
11
|
+
@Indicator('kafka-producer-direct', {
|
|
12
|
+
description: 'Check kafka connection',
|
|
13
|
+
})
|
|
14
|
+
export class KafkaProducerDirectHealthIndicator implements HealthIndicator {
|
|
15
|
+
constructor(
|
|
16
|
+
@Inject(KAFKA_CLIENT_INJECTION_TOKEN) private readonly kafkaClient: Kafka,
|
|
17
|
+
private readonly topicStorage: KafkaMetadataProvider,
|
|
18
|
+
) {}
|
|
19
|
+
|
|
20
|
+
async check(): Promise<CheckResult> {
|
|
21
|
+
return new KafkaHealthcheck(
|
|
22
|
+
this.kafkaClient,
|
|
23
|
+
this.topicStorage.getProducedTopics(),
|
|
24
|
+
).check();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Module } from '@nestjs/common';
|
|
2
|
+
import { KafkaClientModule } from '@rsdk/kafka.common';
|
|
3
|
+
|
|
4
|
+
import { KafkaProducerDirectHealthIndicator } from './kafka-producer-direct.health-indicator';
|
|
5
|
+
|
|
6
|
+
@Module({
|
|
7
|
+
imports: [KafkaClientModule],
|
|
8
|
+
providers: [KafkaProducerDirectHealthIndicator],
|
|
9
|
+
})
|
|
10
|
+
export class KafkaProducerDirectModule {}
|