@rsdk/kafka.producer.direct 4.0.0-next.6 → 4.0.0-next.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/constants.d.ts +3 -0
  3. package/dist/constants.js +9 -1
  4. package/dist/constants.js.map +1 -1
  5. package/dist/decorator.d.ts +3 -0
  6. package/dist/decorator.js +24 -0
  7. package/dist/decorator.js.map +1 -0
  8. package/dist/direct-events.factory.d.ts +7 -0
  9. package/dist/direct-events.factory.js +23 -0
  10. package/dist/direct-events.factory.js.map +1 -0
  11. package/dist/direct-outbox.module-generator.d.ts +6 -0
  12. package/dist/direct-outbox.module-generator.js +76 -0
  13. package/dist/direct-outbox.module-generator.js.map +1 -0
  14. package/dist/index.d.ts +4 -2
  15. package/dist/index.js +12 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/metadata/autodoc.resolver.js +1 -1
  18. package/dist/metadata/autodoc.resolver.js.map +1 -1
  19. package/dist/module/kafka-producer-direct.health-indicator.d.ts +3 -7
  20. package/dist/module/kafka-producer-direct.health-indicator.js +9 -17
  21. package/dist/module/kafka-producer-direct.health-indicator.js.map +1 -1
  22. package/dist/module/kafka-producer-direct.module.d.ts +1 -1
  23. package/dist/module/kafka-producer-direct.module.js +6 -6
  24. package/dist/module/kafka-producer-direct.module.js.map +1 -1
  25. package/dist/producers/batch.producer.d.ts +14 -0
  26. package/dist/producers/batch.producer.js +45 -0
  27. package/dist/producers/batch.producer.js.map +1 -0
  28. package/dist/producers/single.producer.d.ts +13 -0
  29. package/dist/producers/single.producer.js +29 -0
  30. package/dist/producers/single.producer.js.map +1 -0
  31. package/package.json +7 -7
  32. package/src/constants.ts +14 -0
  33. package/src/decorator.ts +46 -0
  34. package/src/direct-events.factory.ts +28 -0
  35. package/src/direct-outbox.module-generator.ts +114 -0
  36. package/src/index.ts +10 -2
  37. package/src/metadata/autodoc.resolver.ts +6 -4
  38. package/src/module/kafka-producer-direct.health-indicator.ts +9 -14
  39. package/src/module/kafka-producer-direct.module.ts +3 -3
  40. package/src/producers/batch.producer.ts +51 -0
  41. package/src/producers/single.producer.ts +38 -0
  42. package/dist/direct.producer.d.ts +0 -15
  43. package/dist/direct.producer.js +0 -58
  44. package/dist/direct.producer.js.map +0 -1
  45. package/dist/direct.strategy.d.ts +0 -5
  46. package/dist/direct.strategy.js +0 -48
  47. package/dist/direct.strategy.js.map +0 -1
  48. package/src/direct.producer.ts +0 -75
  49. package/src/direct.strategy.ts +0 -71
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.0.0-next.8](https://github.com/R-Vision/rsdk/compare/v4.0.0-next.7...v4.0.0-next.8) (2023-11-29)
7
+
8
+ ### Features
9
+
10
+ * Kafka batch producer ([#150](https://github.com/R-Vision/rsdk/issues/150)) ([2faa2f4](https://github.com/R-Vision/rsdk/commit/2faa2f41ca0dbb6d8a92cbf0ab20cf5cefeaf4e9))
11
+
12
+ ## [4.0.0-next.7](https://github.com/R-Vision/rsdk/compare/v4.0.0-next.6...v4.0.0-next.7) (2023-11-21)
13
+
14
+ **Note:** Version bump only for package @rsdk/kafka.producer.direct
15
+
6
16
  ## [4.0.0-next.6](https://github.com/R-Vision/rsdk/compare/v4.0.0-next.5...v4.0.0-next.6) (2023-11-21)
7
17
 
8
18
  **Note:** Version bump only for package @rsdk/kafka.producer.direct
@@ -1 +1,4 @@
1
+ import type { EventType } from '@rsdk/kafka.common';
1
2
  export declare const KAFKA_PRODUCED_RSDK_METADATA_SCOPE = "kafka-producer-direct";
3
+ export declare const createDirectProducerToken: (eventType: EventType<any>) => string;
4
+ export declare const createDirectBatchProducerToken: (eventTypes: EventType[]) => string;
package/dist/constants.js CHANGED
@@ -1,5 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KAFKA_PRODUCED_RSDK_METADATA_SCOPE = void 0;
3
+ exports.createDirectBatchProducerToken = exports.createDirectProducerToken = exports.KAFKA_PRODUCED_RSDK_METADATA_SCOPE = void 0;
4
+ const common_1 = require("@rsdk/common");
4
5
  exports.KAFKA_PRODUCED_RSDK_METADATA_SCOPE = 'kafka-producer-direct';
6
+ const createDirectProducerToken = (eventType) => `DIRECT_KAFKA_PRODUCER_${eventType.$type}`;
7
+ exports.createDirectProducerToken = createDirectProducerToken;
8
+ const createDirectBatchProducerToken = (eventTypes) => `DIRECT_KAFKA_BATCH_PRODUCER_${common_1.Case.toUpperSnake(eventTypes
9
+ .map(({ $type }) => $type)
10
+ .sort()
11
+ .join('_'))}`;
12
+ exports.createDirectBatchProducerToken = createDirectBatchProducerToken;
5
13
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,kCAAkC,GAAG,uBAAuB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AAGvB,QAAA,kCAAkC,GAAG,uBAAuB,CAAC;AACnE,MAAM,yBAAyB,GAAG,CAAC,SAAyB,EAAU,EAAE,CAC7E,yBAAyB,SAAS,CAAC,KAAK,EAAE,CAAC;AADhC,QAAA,yBAAyB,6BACO;AACtC,MAAM,8BAA8B,GAAG,CAC5C,UAAuB,EACf,EAAE,CACV,+BAA+B,aAAI,CAAC,YAAY,CAC9C,UAAU;KACP,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;KACzB,IAAI,EAAE;KACN,IAAI,CAAC,GAAG,CAAC,CACb,EAAE,CAAC;AARO,QAAA,8BAA8B,kCAQrC"}
@@ -0,0 +1,3 @@
1
+ import type { EventType } from '@rsdk/kafka.common';
2
+ export declare const InjectDirectProducer: (eventType: EventType) => ParameterDecorator;
3
+ export declare const InjectDirectBatchProducer: (eventTypes: EventType[]) => ParameterDecorator;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InjectDirectBatchProducer = exports.InjectDirectProducer = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const metadata_1 = require("@rsdk/metadata");
6
+ const constants_1 = require("./constants");
7
+ const direct_outbox_module_generator_1 = require("./direct-outbox.module-generator");
8
+ const InjectDirectProducer = (eventType) => {
9
+ return (target, propertyKey, parameterIndex) => {
10
+ const directProducerToken = (0, constants_1.createDirectProducerToken)(eventType);
11
+ (0, common_1.Inject)(directProducerToken)(target, propertyKey, parameterIndex);
12
+ metadata_1.RsdkMetadata.setWithScope(target, metadata_1.PLATFORM_RAW_GLOBAL_METADATA_SCOPE, directProducerToken, direct_outbox_module_generator_1.DirectOutboxModuleGenerator.createModule(eventType), true);
13
+ };
14
+ };
15
+ exports.InjectDirectProducer = InjectDirectProducer;
16
+ const InjectDirectBatchProducer = (eventTypes) => {
17
+ return (target, propertyKey, parameterIndex) => {
18
+ const directBatchProducerToken = (0, constants_1.createDirectBatchProducerToken)(eventTypes);
19
+ (0, common_1.Inject)(directBatchProducerToken)(target, propertyKey, parameterIndex);
20
+ metadata_1.RsdkMetadata.setWithScope(target, metadata_1.PLATFORM_RAW_GLOBAL_METADATA_SCOPE, directBatchProducerToken, direct_outbox_module_generator_1.DirectOutboxModuleGenerator.createBatchModule(eventTypes), true);
21
+ };
22
+ };
23
+ exports.InjectDirectBatchProducer = InjectDirectBatchProducer;
24
+ //# sourceMappingURL=decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorator.js","sourceRoot":"","sources":["../src/decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,6CAGwB;AAExB,2CAGqB;AACrB,qFAA+E;AAExE,MAAM,oBAAoB,GAAG,CAClC,SAAoB,EACA,EAAE;IACtB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,MAAM,mBAAmB,GAAG,IAAA,qCAAyB,EAAC,SAAS,CAAC,CAAC;QAEjE,IAAA,eAAM,EAAC,mBAAmB,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QACjE,uBAAY,CAAC,YAAY,CACvB,MAAM,EACN,6CAAkC,EAClC,mBAAmB,EACnB,4DAA2B,CAAC,YAAY,CAAC,SAAS,CAAC,EACnD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAfW,QAAA,oBAAoB,wBAe/B;AAEK,MAAM,yBAAyB,GAAG,CACvC,UAAuB,EACH,EAAE;IACtB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAC7C,MAAM,wBAAwB,GAAG,IAAA,0CAA8B,EAAC,UAAU,CAAC,CAAC;QAE5E,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;QACtE,uBAAY,CAAC,YAAY,CACvB,MAAM,EACN,6CAAkC,EAClC,wBAAwB,EACxB,4DAA2B,CAAC,iBAAiB,CAAC,UAAU,CAAC,EACzD,IAAI,CACL,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAfW,QAAA,yBAAyB,6BAepC"}
@@ -0,0 +1,7 @@
1
+ import type { EventPayload, EventType } from '@rsdk/kafka.common';
2
+ import type { PublishOptions } from '@rsdk/kafka.producer';
3
+ import { EventsFactory } from '@rsdk/kafka.producer';
4
+ import type { Message } from 'kafkajs';
5
+ export declare class EventsFactoryDirect<E extends EventType> extends EventsFactory<E, Message> {
6
+ create<P extends EventPayload<E>>(payload: P, options?: PublishOptions): Message;
7
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventsFactoryDirect = void 0;
4
+ const kafka_producer_1 = require("@rsdk/kafka.producer");
5
+ const node_crypto_1 = require("node:crypto");
6
+ class EventsFactoryDirect extends kafka_producer_1.EventsFactory {
7
+ create(payload, options) {
8
+ return {
9
+ headers: {
10
+ id: (0, node_crypto_1.randomUUID)(),
11
+ type: this.eventType.$type,
12
+ metadata: JSON.stringify(this.getMetadata(options?.metadata ?? {})),
13
+ },
14
+ key: JSON.stringify({
15
+ schema: { type: 'string', optional: false },
16
+ payload: this.getPartitionKey(payload, options),
17
+ }),
18
+ value: this.serializePayload(payload),
19
+ };
20
+ }
21
+ }
22
+ exports.EventsFactoryDirect = EventsFactoryDirect;
23
+ //# sourceMappingURL=direct-events.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-events.factory.js","sourceRoot":"","sources":["../src/direct-events.factory.ts"],"names":[],"mappings":";;;AAEA,yDAAqD;AAErD,6CAAyC;AAEzC,MAAa,mBAAyC,SAAQ,8BAG7D;IACC,MAAM,CACJ,OAAU,EACV,OAAwB;QAExB,OAAO;YACL,OAAO,EAAE;gBACP,EAAE,EAAE,IAAA,wBAAU,GAAE;gBAChB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;gBAC1B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;aACpE;YACD,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;gBAClB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;gBAC3C,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC;aAChD,CAAC;YACF,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;SACtC,CAAC;IACJ,CAAC;CACF;AArBD,kDAqBC"}
@@ -0,0 +1,6 @@
1
+ import type { DynamicModule } from '@nestjs/common';
2
+ import type { EventType } from '@rsdk/kafka.common';
3
+ export declare class DirectOutboxModuleGenerator {
4
+ static createModule(eventType: EventType): DynamicModule;
5
+ static createBatchModule(eventTypes: EventType[]): DynamicModule;
6
+ }
@@ -0,0 +1,76 @@
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.DirectOutboxModuleGenerator = void 0;
7
+ const autodoc_protocol_1 = require("@rsdk/autodoc.protocol");
8
+ const kafka_common_1 = require("@rsdk/kafka.common");
9
+ const kafka_producer_1 = require("@rsdk/kafka.producer");
10
+ const metadata_1 = require("@rsdk/metadata");
11
+ const omit_1 = __importDefault(require("lodash/omit"));
12
+ const autodoc_resolver_1 = require("./metadata/autodoc.resolver");
13
+ const kafka_producer_direct_module_1 = require("./module/kafka-producer-direct.module");
14
+ const batch_producer_1 = require("./producers/batch.producer");
15
+ const single_producer_1 = require("./producers/single.producer");
16
+ const constants_1 = require("./constants");
17
+ class DirectOutboxModuleGenerator {
18
+ static createModule(eventType) {
19
+ const providers = [
20
+ {
21
+ inject: [kafka_common_1.KAFKA_PRODUCER_INJECTION_TOKEN, kafka_producer_1.ProducerConfig],
22
+ provide: (0, constants_1.createDirectProducerToken)(eventType),
23
+ useFactory: (client, config) => {
24
+ return new single_producer_1.DirectProducer(client, eventType, config);
25
+ },
26
+ },
27
+ ];
28
+ const moduleDef = {
29
+ imports: [kafka_common_1.KafkaClientModule, kafka_producer_direct_module_1.DirectKafkaProducerModule],
30
+ providers,
31
+ module: DirectOutboxModuleGenerator,
32
+ exports: providers,
33
+ };
34
+ const rsdkKafkaMetadata = new metadata_1.RsdkMetadata(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE);
35
+ rsdkKafkaMetadata.add({
36
+ type: kafka_common_1.TopicType.PRODUCE,
37
+ topicName: (0, kafka_common_1.getTopicName)(eventType),
38
+ group: eventType.$group,
39
+ partitionKeyField: eventType.$partitionKeyField,
40
+ eventType: (0, omit_1.default)(eventType, 'toJSON', 'encode', 'decode'),
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
+ static createBatchModule(eventTypes) {
46
+ const providers = [
47
+ {
48
+ provide: (0, constants_1.createDirectBatchProducerToken)(eventTypes),
49
+ inject: [kafka_common_1.KAFKA_PRODUCER_INJECTION_TOKEN, kafka_producer_1.ProducerConfig],
50
+ useFactory(client, config) {
51
+ return new batch_producer_1.DirectBatchProducer(client, config);
52
+ },
53
+ },
54
+ ];
55
+ const moduleDef = {
56
+ imports: [kafka_common_1.KafkaClientModule, kafka_producer_direct_module_1.DirectKafkaProducerModule],
57
+ providers,
58
+ module: DirectOutboxModuleGenerator,
59
+ exports: providers,
60
+ };
61
+ const rsdkKafkaMetadata = new metadata_1.RsdkMetadata(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE);
62
+ for (const eventType of eventTypes) {
63
+ rsdkKafkaMetadata.add({
64
+ type: kafka_common_1.TopicType.PRODUCE,
65
+ topicName: (0, kafka_common_1.getTopicName)(eventType),
66
+ group: eventType.$group,
67
+ partitionKeyField: eventType.$partitionKeyField,
68
+ eventType: (0, omit_1.default)(eventType, 'toJSON', 'encode', 'decode'),
69
+ });
70
+ }
71
+ autodoc_protocol_1.AutodocMetadata.defineResolver(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE, autodoc_resolver_1.kafkaProducerDirectAutodocResolver);
72
+ return moduleDef;
73
+ }
74
+ }
75
+ exports.DirectOutboxModuleGenerator = DirectOutboxModuleGenerator;
76
+ //# sourceMappingURL=direct-outbox.module-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-outbox.module-generator.js","sourceRoot":"","sources":["../src/direct-outbox.module-generator.ts"],"names":[],"mappings":";;;;;;AACA,6DAAyD;AAEzD,qDAM4B;AAE5B,yDAAsD;AACtD,6CAA8C;AAE9C,uDAA+B;AAE/B,kEAAiF;AACjF,wFAAkF;AAClF,+DAAiE;AACjE,iEAA6D;AAC7D,2CAGqB;AAErB,MAAa,2BAA2B;IACtC,MAAM,CAAC,YAAY,CAAC,SAAoB;QACtC,MAAM,SAAS,GAAsB;YACnC;gBACE,MAAM,EAAE,CAAC,6CAA8B,EAAE,+BAAc,CAAC;gBACxD,OAAO,EAAE,IAAA,qCAAyB,EAAC,SAAS,CAAC;gBAC7C,UAAU,EAAE,CACV,MAAgB,EAChB,MAAsB,EACK,EAAE;oBAC7B,OAAO,IAAI,gCAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBACvD,CAAC;aACF;SACF,CAAC;QAEF,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,CAAC,gCAAiB,EAAE,wDAAyB,CAAC;YACvD,SAAS;YACT,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,SAAS;SACnB,CAAC;QAEF,MAAM,iBAAiB,GAAG,IAAI,uBAAY,CACxC,SAAS,EACT,8CAA+B,CAChC,CAAC;QAEF,iBAAiB,CAAC,GAAG,CAAC;YACpB,IAAI,EAAE,wBAAS,CAAC,OAAO;YACvB,SAAS,EAAE,IAAA,2BAAY,EAAC,SAAS,CAAC;YAClC,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,iBAAiB,EAAE,SAAS,CAAC,kBAAkB;YAC/C,SAAS,EAAE,IAAA,cAAI,EAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;SACzD,CAAC,CAAC;QAEH,kCAAe,CAAC,cAAc,CAC5B,SAAS,EACT,8CAA+B,EAC/B,qDAAkC,CACnC,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,UAAuB;QAC9C,MAAM,SAAS,GAAsB;YACnC;gBACE,OAAO,EAAE,IAAA,0CAA8B,EAAC,UAAU,CAAC;gBACnD,MAAM,EAAE,CAAC,6CAA8B,EAAE,+BAAc,CAAC;gBACxD,UAAU,CACR,MAAgB,EAChB,MAAsB;oBAEtB,OAAO,IAAI,oCAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACjD,CAAC;aACF;SACF,CAAC;QAEF,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,CAAC,gCAAiB,EAAE,wDAAyB,CAAC;YACvD,SAAS;YACT,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,SAAS;SACnB,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,wBAAS,CAAC,OAAO;gBACvB,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;AAxFD,kEAwFC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
- export { DirectProducer } from './direct.producer';
2
- export { KafkaDirectProducer } from './direct.strategy';
1
+ export { DirectBatchProducer } from './producers/batch.producer';
2
+ export { DirectProducer } from './producers/single.producer';
3
+ export { InjectDirectBatchProducer, InjectDirectProducer } from './decorator';
4
+ export { createDirectBatchProducerToken, createDirectProducerToken, KAFKA_PRODUCED_RSDK_METADATA_SCOPE, } from './constants';
package/dist/index.js CHANGED
@@ -1,8 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KafkaDirectProducer = exports.DirectProducer = void 0;
4
- var direct_producer_1 = require("./direct.producer");
5
- Object.defineProperty(exports, "DirectProducer", { enumerable: true, get: function () { return direct_producer_1.DirectProducer; } });
6
- var direct_strategy_1 = require("./direct.strategy");
7
- Object.defineProperty(exports, "KafkaDirectProducer", { enumerable: true, get: function () { return direct_strategy_1.KafkaDirectProducer; } });
3
+ exports.KAFKA_PRODUCED_RSDK_METADATA_SCOPE = exports.createDirectProducerToken = exports.createDirectBatchProducerToken = exports.InjectDirectProducer = exports.InjectDirectBatchProducer = exports.DirectProducer = exports.DirectBatchProducer = void 0;
4
+ var batch_producer_1 = require("./producers/batch.producer");
5
+ Object.defineProperty(exports, "DirectBatchProducer", { enumerable: true, get: function () { return batch_producer_1.DirectBatchProducer; } });
6
+ var single_producer_1 = require("./producers/single.producer");
7
+ Object.defineProperty(exports, "DirectProducer", { enumerable: true, get: function () { return single_producer_1.DirectProducer; } });
8
+ var decorator_1 = require("./decorator");
9
+ Object.defineProperty(exports, "InjectDirectBatchProducer", { enumerable: true, get: function () { return decorator_1.InjectDirectBatchProducer; } });
10
+ Object.defineProperty(exports, "InjectDirectProducer", { enumerable: true, get: function () { return decorator_1.InjectDirectProducer; } });
11
+ var constants_1 = require("./constants");
12
+ Object.defineProperty(exports, "createDirectBatchProducerToken", { enumerable: true, get: function () { return constants_1.createDirectBatchProducerToken; } });
13
+ Object.defineProperty(exports, "createDirectProducerToken", { enumerable: true, get: function () { return constants_1.createDirectProducerToken; } });
14
+ Object.defineProperty(exports, "KAFKA_PRODUCED_RSDK_METADATA_SCOPE", { enumerable: true, get: function () { return constants_1.KAFKA_PRODUCED_RSDK_METADATA_SCOPE; } });
8
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,qDAAwD;AAA/C,sHAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6DAAiE;AAAxD,qHAAA,mBAAmB,OAAA;AAE5B,+DAA6D;AAApD,iHAAA,cAAc,OAAA;AAEvB,yCAA8E;AAArE,sHAAA,yBAAyB,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAExD,yCAIqB;AAHnB,2HAAA,8BAA8B,OAAA;AAC9B,sHAAA,yBAAyB,OAAA;AACzB,+HAAA,kCAAkC,OAAA"}
@@ -11,7 +11,7 @@ class KafkaProducerDirectAutodocResolver {
11
11
  return null;
12
12
  }
13
13
  return new autodoc_protocol_1.Composite(new autodoc_protocol_1.Table(resources
14
- .filter((resource) => resource.value.type === kafka_common_1.KafkaTopicType.Produce)
14
+ .filter((resource) => resource.value.type === kafka_common_1.TopicType.PRODUCE)
15
15
  .map((resource) => {
16
16
  const { topicName, group: group, partitionKeyField, eventType, } = resource.value;
17
17
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"autodoc.resolver.js","sourceRoot":"","sources":["../../src/metadata/autodoc.resolver.ts"],"names":[],"mappings":";;;AACA,6DAA0D;AAE1D,qDAAoD;AAIpD,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;aACN,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,6BAAc,CAAC,OAAO,CAAC;aACpE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,MAAM,EACJ,SAAS,EACT,KAAK,EAAE,KAAK,EACZ,iBAAiB,EACjB,SAAS,GACV,GAAkC,QAAQ,CAAC,KAAK,CAAC;YAElD,OAAO;gBACL,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,KAAK,IAAI,GAAG;gBACnB,iBAAiB,EAAE,iBAAiB,IAAI,GAAG;gBAC3C,SAAS,EAAE,SAAS,EAAE,KAAK,IAAI,GAAG;aACnC,CAAC;QACJ,CAAC,CAAC,CACL,EACD,uBAAuB,CACxB,CAAC;IACJ,CAAC;CACF;AAjCD,gFAiCC;AAEY,QAAA,kCAAkC,GAC7C,IAAI,kCAAkC,EAAE,CAAC"}
1
+ {"version":3,"file":"autodoc.resolver.js","sourceRoot":"","sources":["../../src/metadata/autodoc.resolver.ts"],"names":[],"mappings":";;;AACA,6DAA0D;AAK1D,qDAA+C;AAG/C,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;aACN,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,wBAAS,CAAC,OAAO,CAAC;aAC/D,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,MAAM,EACJ,SAAS,EACT,KAAK,EAAE,KAAK,EACZ,iBAAiB,EACjB,SAAS,GACV,GAAkC,QAAQ,CAAC,KAAK,CAAC;YAElD,OAAO;gBACL,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,KAAK,IAAI,GAAG;gBACnB,iBAAiB,EAAE,iBAAiB,IAAI,GAAG;gBAC3C,SAAS,EAAE,SAAS,EAAE,KAAK,IAAI,GAAG;aACnC,CAAC;QACJ,CAAC,CAAC,CACL,EACD,uBAAuB,CACxB,CAAC;IACJ,CAAC;CACF;AAjCD,gFAiCC;AAEY,QAAA,kCAAkC,GAC7C,IAAI,kCAAkC,EAAE,CAAC"}
@@ -1,9 +1,5 @@
1
- import type { CheckResult, HealthIndicator } from '@rsdk/core';
2
- import { KafkaMetadataProvider } from '@rsdk/kafka.common';
1
+ import { KafkaBaseIndicator, TopicsService } from '@rsdk/kafka.common';
3
2
  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>;
3
+ export declare class DirectProducerIndicator extends KafkaBaseIndicator {
4
+ constructor(client: Kafka, topics: TopicsService);
9
5
  }
@@ -12,29 +12,21 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.KafkaProducerDirectHealthIndicator = void 0;
15
+ exports.DirectProducerIndicator = void 0;
16
16
  const core_1 = require("@rsdk/core");
17
17
  const kafka_common_1 = require("@rsdk/kafka.common");
18
- const kafka_client_1 = require("@rsdk/kafka.common/dist/client/kafka.client");
19
18
  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();
19
+ let DirectProducerIndicator = class DirectProducerIndicator extends kafka_common_1.KafkaBaseIndicator {
20
+ constructor(client, topics) {
21
+ super(client, topics.getTopics(kafka_common_1.TopicType.PRODUCE));
29
22
  }
30
23
  };
31
- exports.KafkaProducerDirectHealthIndicator = KafkaProducerDirectHealthIndicator;
32
- exports.KafkaProducerDirectHealthIndicator = KafkaProducerDirectHealthIndicator = __decorate([
24
+ exports.DirectProducerIndicator = DirectProducerIndicator;
25
+ exports.DirectProducerIndicator = DirectProducerIndicator = __decorate([
33
26
  (0, core_1.Indicator)('kafka-producer-direct', {
34
27
  description: 'Check kafka connection',
35
28
  }),
36
- __param(0, (0, kafka_client_1.InjectKafka)()),
37
- __metadata("design:paramtypes", [kafkajs_1.Kafka,
38
- kafka_common_1.KafkaMetadataProvider])
39
- ], KafkaProducerDirectHealthIndicator);
29
+ __param(0, (0, kafka_common_1.InjectKafka)()),
30
+ __metadata("design:paramtypes", [kafkajs_1.Kafka, kafka_common_1.TopicsService])
31
+ ], DirectProducerIndicator);
40
32
  //# sourceMappingURL=kafka-producer-direct.health-indicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kafka-producer-direct.health-indicator.js","sourceRoot":"","sources":["../../src/module/kafka-producer-direct.health-indicator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,qCAAuC;AACvC,qDAA6E;AAC7E,8EAA0E;AAC1E,qCAAgC;AAKzB,IAAM,kCAAkC,GAAxC,MAAM,kCAAkC;IAEX;IACf;IAFnB,YACkC,WAAkB,EACjC,YAAmC;QADpB,gBAAW,GAAX,WAAW,CAAO;QACjC,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,gFAAkC;6CAAlC,kCAAkC;IAH9C,IAAA,gBAAS,EAAC,uBAAuB,EAAE;QAClC,WAAW,EAAE,wBAAwB;KACtC,CAAC;IAGG,WAAA,IAAA,0BAAW,GAAE,CAAA;qCAA+B,eAAK;QACnB,oCAAqB;GAH3C,kCAAkC,CAY9C"}
1
+ {"version":3,"file":"kafka-producer-direct.health-indicator.js","sourceRoot":"","sources":["../../src/module/kafka-producer-direct.health-indicator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,qCAAuC;AACvC,qDAK4B;AAC5B,qCAAgC;AAKzB,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,iCAAkB;IAC7D,YAA2B,MAAa,EAAE,MAAqB;QAC7D,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,wBAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AAJY,0DAAuB;kCAAvB,uBAAuB;IAHnC,IAAA,gBAAS,EAAC,uBAAuB,EAAE;QAClC,WAAW,EAAE,wBAAwB;KACtC,CAAC;IAEa,WAAA,IAAA,0BAAW,GAAE,CAAA;qCAAS,eAAK,EAAU,4BAAa;GADpD,uBAAuB,CAInC"}
@@ -1,2 +1,2 @@
1
- export declare class KafkaProducerDirectModule {
1
+ export declare class DirectKafkaProducerModule {
2
2
  }
@@ -6,17 +6,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.KafkaProducerDirectModule = void 0;
9
+ exports.DirectKafkaProducerModule = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const kafka_common_1 = require("@rsdk/kafka.common");
12
12
  const kafka_producer_direct_health_indicator_1 = require("./kafka-producer-direct.health-indicator");
13
- let KafkaProducerDirectModule = class KafkaProducerDirectModule {
13
+ let DirectKafkaProducerModule = class DirectKafkaProducerModule {
14
14
  };
15
- exports.KafkaProducerDirectModule = KafkaProducerDirectModule;
16
- exports.KafkaProducerDirectModule = KafkaProducerDirectModule = __decorate([
15
+ exports.DirectKafkaProducerModule = DirectKafkaProducerModule;
16
+ exports.DirectKafkaProducerModule = DirectKafkaProducerModule = __decorate([
17
17
  (0, common_1.Module)({
18
18
  imports: [kafka_common_1.KafkaClientModule],
19
- providers: [kafka_producer_direct_health_indicator_1.KafkaProducerDirectHealthIndicator],
19
+ providers: [kafka_producer_direct_health_indicator_1.DirectProducerIndicator],
20
20
  })
21
- ], KafkaProducerDirectModule);
21
+ ], DirectKafkaProducerModule);
22
22
  //# sourceMappingURL=kafka-producer-direct.module.js.map
@@ -1 +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;AAMvF,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;CAAG,CAAA;AAA5B,8DAAyB;oCAAzB,yBAAyB;IAJrC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,gCAAiB,CAAC;QAC5B,SAAS,EAAE,CAAC,2EAAkC,CAAC;KAChD,CAAC;GACW,yBAAyB,CAAG"}
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,qGAAmF;AAM5E,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;CAAG,CAAA;AAA5B,8DAAyB;oCAAzB,yBAAyB;IAJrC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,gCAAiB,CAAC;QAC5B,SAAS,EAAE,CAAC,gEAAuB,CAAC;KACrC,CAAC;GACW,yBAAyB,CAAG"}
@@ -0,0 +1,14 @@
1
+ import type { EventType } from '@rsdk/kafka.common';
2
+ import type { BatchProducerItem, ProducerConfig } from '@rsdk/kafka.producer';
3
+ import type { RawKafkaBatchProducer } from '@rsdk/kafka.producer/dist/interfaces';
4
+ import type { Producer } from 'kafkajs';
5
+ /**
6
+ * Producer, способный отправлять несколько ивентов за раз,
7
+ * в том числе, в разные топики (стратегия: direct)
8
+ */
9
+ export declare class DirectBatchProducer implements RawKafkaBatchProducer {
10
+ private readonly client;
11
+ private readonly config;
12
+ constructor(client: Producer, config: ProducerConfig);
13
+ publish<E extends EventType>(items: BatchProducerItem<E>[]): Promise<void>;
14
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DirectBatchProducer = void 0;
4
+ const kafka_common_1 = require("@rsdk/kafka.common");
5
+ const direct_events_factory_1 = require("../direct-events.factory");
6
+ /**
7
+ * Producer, способный отправлять несколько ивентов за раз,
8
+ * в том числе, в разные топики (стратегия: direct)
9
+ */
10
+ class DirectBatchProducer {
11
+ client;
12
+ config;
13
+ constructor(client, config) {
14
+ this.client = client;
15
+ this.config = config;
16
+ }
17
+ async publish(items) {
18
+ const aggregateByTopic = items.reduce((acc, item) => {
19
+ const topic = (0, kafka_common_1.getTopicName)(item.eventType);
20
+ const exist = acc.get(topic) ?? [];
21
+ exist.push(item);
22
+ acc.set(topic, exist);
23
+ return acc;
24
+ }, new Map());
25
+ for (const [topic, items] of aggregateByTopic) {
26
+ const messages = items.map(({ payload, options, eventType }) => {
27
+ const factory = new direct_events_factory_1.EventsFactoryDirect(eventType, this.config);
28
+ return factory.create(payload, options);
29
+ });
30
+ // TODO: А точно надо в каждый топик последовательно слать это?
31
+ try {
32
+ await this.client.send({ topic, messages: messages });
33
+ }
34
+ catch (error) {
35
+ (0, kafka_common_1.handleKafkaError)(error, topic, {
36
+ items,
37
+ aggregateByTopic,
38
+ messages,
39
+ });
40
+ }
41
+ }
42
+ }
43
+ }
44
+ exports.DirectBatchProducer = DirectBatchProducer;
45
+ //# sourceMappingURL=batch.producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.producer.js","sourceRoot":"","sources":["../../src/producers/batch.producer.ts"],"names":[],"mappings":";;;AACA,qDAAoE;AAKpE,oEAA+D;AAE/D;;;GAGG;AACH,MAAa,mBAAmB;IAEX;IACA;IAFnB,YACmB,MAAgB,EAChB,MAAsB;QADtB,WAAM,GAAN,MAAM,CAAU;QAChB,WAAM,GAAN,MAAM,CAAgB;IACtC,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,KAA6B;QAE7B,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAClD,MAAM,KAAK,GAAG,IAAA,2BAAY,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAEnC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAEd,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,gBAAgB,EAAE;YAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC7D,MAAM,OAAO,GAAG,IAAI,2CAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAEhE,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;YAEH,+DAA+D;YAE/D,IAAI;gBACF,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;aACvD;YAAC,OAAO,KAAK,EAAE;gBACd,IAAA,+BAAgB,EAAC,KAAK,EAAE,KAAK,EAAE;oBAC7B,KAAK;oBACL,gBAAgB;oBAChB,QAAQ;iBACT,CAAC,CAAC;aACJ;SACF;IACH,CAAC;CACF;AAtCD,kDAsCC"}
@@ -0,0 +1,13 @@
1
+ import type { EventPayload, EventType } from '@rsdk/kafka.common';
2
+ import type { KafkaProducer, ProducerOptions, PublishOptions } from '@rsdk/kafka.producer';
3
+ import type { Producer } from 'kafkajs';
4
+ /**
5
+ * Producer, специализированный под конкретный ивент.
6
+ */
7
+ export declare class DirectProducer<T extends EventType> implements KafkaProducer<T> {
8
+ private readonly client;
9
+ private readonly factory;
10
+ private readonly topic;
11
+ constructor(client: Producer, eventType: T, config: ProducerOptions);
12
+ publish<P extends EventPayload<T>>(payload: P, options?: PublishOptions): Promise<void>;
13
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DirectProducer = void 0;
4
+ const kafka_common_1 = require("@rsdk/kafka.common");
5
+ const direct_events_factory_1 = require("../direct-events.factory");
6
+ /**
7
+ * Producer, специализированный под конкретный ивент.
8
+ */
9
+ class DirectProducer {
10
+ client;
11
+ factory;
12
+ topic;
13
+ constructor(client, eventType, config) {
14
+ this.client = client;
15
+ this.factory = new direct_events_factory_1.EventsFactoryDirect(eventType, config);
16
+ this.topic = (0, kafka_common_1.getTopicName)(eventType);
17
+ }
18
+ async publish(payload, options) {
19
+ try {
20
+ const messages = [this.factory.create(payload, options)];
21
+ await this.client.send({ topic: this.topic, messages });
22
+ }
23
+ catch (error) {
24
+ (0, kafka_common_1.handleKafkaError)(error, this.topic, options);
25
+ }
26
+ }
27
+ }
28
+ exports.DirectProducer = DirectProducer;
29
+ //# sourceMappingURL=single.producer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"single.producer.js","sourceRoot":"","sources":["../../src/producers/single.producer.ts"],"names":[],"mappings":";;;AACA,qDAAoE;AAQpE,oEAA+D;AAE/D;;GAEG;AACH,MAAa,cAAc;IACR,MAAM,CAAW;IACjB,OAAO,CAAyB;IAChC,KAAK,CAAS;IAE/B,YAAY,MAAgB,EAAE,SAAY,EAAE,MAAuB;QACjE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,2CAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAA,2BAAY,EAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAU,EACV,OAAwB;QAExB,IAAI;YACF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAEzD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;SACzD;QAAC,OAAO,KAAK,EAAE;YACd,IAAA,+BAAgB,EAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SAC9C;IACH,CAAC;CACF;AAvBD,wCAuBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdk/kafka.producer.direct",
3
- "version": "4.0.0-next.6",
3
+ "version": "4.0.0-next.8",
4
4
  "description": "Publishing messages directly to kafka",
5
5
  "license": "Apache License 2.0",
6
6
  "publishConfig": {
@@ -15,13 +15,13 @@
15
15
  "@nestjs/common": "^10.0.0",
16
16
  "@nestjs/core": "^10.0.0",
17
17
  "@nestjs/microservices": "^10.0.0",
18
- "@rsdk/autodoc.protocol": "^4.0.0-next.6",
18
+ "@rsdk/autodoc.protocol": "^4.0.0-next.8",
19
19
  "@rsdk/common": "^4.0.0-next.6",
20
- "@rsdk/core": "^4.0.0-next.6",
21
- "@rsdk/kafka.common": "^4.0.0-next.6",
22
- "@rsdk/kafka.producer": "^4.0.0-next.6",
20
+ "@rsdk/core": "^4.0.0-next.8",
21
+ "@rsdk/kafka.common": "^4.0.0-next.8",
22
+ "@rsdk/kafka.producer": "^4.0.0-next.8",
23
23
  "@rsdk/logging": "^4.0.0-next.6",
24
- "@rsdk/metadata": "^4.0.0-next.6",
24
+ "@rsdk/metadata": "^4.0.0-next.8",
25
25
  "kafkajs": "^2.2.4",
26
26
  "reflect-metadata": "^0.1.13",
27
27
  "rxjs": "^7.0.0"
@@ -29,5 +29,5 @@
29
29
  "dependencies": {
30
30
  "lodash": "^4.17.21"
31
31
  },
32
- "gitHead": "85bfc2419a92579e4d8ebf57068735b4999788a9"
32
+ "gitHead": "bae7c74fc8be068b8bd66b403d19e2b32cf092ec"
33
33
  }
package/src/constants.ts CHANGED
@@ -1 +1,15 @@
1
+ import { Case } from '@rsdk/common';
2
+ import type { EventType } from '@rsdk/kafka.common';
3
+
1
4
  export const KAFKA_PRODUCED_RSDK_METADATA_SCOPE = 'kafka-producer-direct';
5
+ export const createDirectProducerToken = (eventType: EventType<any>): string =>
6
+ `DIRECT_KAFKA_PRODUCER_${eventType.$type}`;
7
+ export const createDirectBatchProducerToken = (
8
+ eventTypes: EventType[],
9
+ ): string =>
10
+ `DIRECT_KAFKA_BATCH_PRODUCER_${Case.toUpperSnake(
11
+ eventTypes
12
+ .map(({ $type }) => $type)
13
+ .sort()
14
+ .join('_'),
15
+ )}`;
@@ -0,0 +1,46 @@
1
+ import { Inject } from '@nestjs/common';
2
+ import type { EventType } from '@rsdk/kafka.common';
3
+ import {
4
+ PLATFORM_RAW_GLOBAL_METADATA_SCOPE,
5
+ RsdkMetadata,
6
+ } from '@rsdk/metadata';
7
+
8
+ import {
9
+ createDirectBatchProducerToken,
10
+ createDirectProducerToken,
11
+ } from './constants';
12
+ import { DirectOutboxModuleGenerator } from './direct-outbox.module-generator';
13
+
14
+ export const InjectDirectProducer = (
15
+ eventType: EventType,
16
+ ): ParameterDecorator => {
17
+ return (target, propertyKey, parameterIndex) => {
18
+ const directProducerToken = createDirectProducerToken(eventType);
19
+
20
+ Inject(directProducerToken)(target, propertyKey, parameterIndex);
21
+ RsdkMetadata.setWithScope(
22
+ target,
23
+ PLATFORM_RAW_GLOBAL_METADATA_SCOPE,
24
+ directProducerToken,
25
+ DirectOutboxModuleGenerator.createModule(eventType),
26
+ true,
27
+ );
28
+ };
29
+ };
30
+
31
+ export const InjectDirectBatchProducer = (
32
+ eventTypes: EventType[],
33
+ ): ParameterDecorator => {
34
+ return (target, propertyKey, parameterIndex) => {
35
+ const directBatchProducerToken = createDirectBatchProducerToken(eventTypes);
36
+
37
+ Inject(directBatchProducerToken)(target, propertyKey, parameterIndex);
38
+ RsdkMetadata.setWithScope(
39
+ target,
40
+ PLATFORM_RAW_GLOBAL_METADATA_SCOPE,
41
+ directBatchProducerToken,
42
+ DirectOutboxModuleGenerator.createBatchModule(eventTypes),
43
+ true,
44
+ );
45
+ };
46
+ };
@@ -0,0 +1,28 @@
1
+ import type { EventPayload, EventType } from '@rsdk/kafka.common';
2
+ import type { PublishOptions } from '@rsdk/kafka.producer';
3
+ import { EventsFactory } from '@rsdk/kafka.producer';
4
+ import type { Message } from 'kafkajs';
5
+ import { randomUUID } from 'node:crypto';
6
+
7
+ export class EventsFactoryDirect<E extends EventType> extends EventsFactory<
8
+ E,
9
+ Message
10
+ > {
11
+ create<P extends EventPayload<E>>(
12
+ payload: P,
13
+ options?: PublishOptions,
14
+ ): Message {
15
+ return {
16
+ headers: {
17
+ id: randomUUID(),
18
+ type: this.eventType.$type,
19
+ metadata: JSON.stringify(this.getMetadata(options?.metadata ?? {})),
20
+ },
21
+ key: JSON.stringify({
22
+ schema: { type: 'string', optional: false },
23
+ payload: this.getPartitionKey(payload, options),
24
+ }),
25
+ value: this.serializePayload(payload),
26
+ };
27
+ }
28
+ }
@@ -0,0 +1,114 @@
1
+ import type { DynamicModule, FactoryProvider } 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
+ TopicType,
10
+ } from '@rsdk/kafka.common';
11
+ import type { KafkaBatchProducer } from '@rsdk/kafka.producer';
12
+ import { ProducerConfig } from '@rsdk/kafka.producer';
13
+ import { RsdkMetadata } from '@rsdk/metadata';
14
+ import type { Producer } from 'kafkajs';
15
+ import omit from 'lodash/omit';
16
+
17
+ import { kafkaProducerDirectAutodocResolver } from './metadata/autodoc.resolver';
18
+ import { DirectKafkaProducerModule } from './module/kafka-producer-direct.module';
19
+ import { DirectBatchProducer } from './producers/batch.producer';
20
+ import { DirectProducer } from './producers/single.producer';
21
+ import {
22
+ createDirectBatchProducerToken,
23
+ createDirectProducerToken,
24
+ } from './constants';
25
+
26
+ export class DirectOutboxModuleGenerator {
27
+ static createModule(eventType: EventType): DynamicModule {
28
+ const providers: FactoryProvider[] = [
29
+ {
30
+ inject: [KAFKA_PRODUCER_INJECTION_TOKEN, ProducerConfig],
31
+ provide: createDirectProducerToken(eventType),
32
+ useFactory: (
33
+ client: Producer,
34
+ config: ProducerConfig,
35
+ ): DirectProducer<EventType> => {
36
+ return new DirectProducer(client, eventType, config);
37
+ },
38
+ },
39
+ ];
40
+
41
+ const moduleDef = {
42
+ imports: [KafkaClientModule, DirectKafkaProducerModule],
43
+ providers,
44
+ module: DirectOutboxModuleGenerator,
45
+ exports: providers,
46
+ };
47
+
48
+ const rsdkKafkaMetadata = new RsdkMetadata<KafkaTopicMetadata>(
49
+ moduleDef,
50
+ KAFKA_TOPIC_RSDK_METADATA_SCOPE,
51
+ );
52
+
53
+ rsdkKafkaMetadata.add({
54
+ type: TopicType.PRODUCE,
55
+ topicName: getTopicName(eventType),
56
+ group: eventType.$group,
57
+ partitionKeyField: eventType.$partitionKeyField,
58
+ eventType: omit(eventType, 'toJSON', 'encode', 'decode'),
59
+ });
60
+
61
+ AutodocMetadata.defineResolver(
62
+ moduleDef,
63
+ KAFKA_TOPIC_RSDK_METADATA_SCOPE,
64
+ kafkaProducerDirectAutodocResolver,
65
+ );
66
+
67
+ return moduleDef;
68
+ }
69
+
70
+ static createBatchModule(eventTypes: EventType[]): DynamicModule {
71
+ const providers: FactoryProvider[] = [
72
+ {
73
+ provide: createDirectBatchProducerToken(eventTypes),
74
+ inject: [KAFKA_PRODUCER_INJECTION_TOKEN, ProducerConfig],
75
+ useFactory(
76
+ client: Producer,
77
+ config: ProducerConfig,
78
+ ): KafkaBatchProducer<typeof eventTypes> {
79
+ return new DirectBatchProducer(client, config);
80
+ },
81
+ },
82
+ ];
83
+
84
+ const moduleDef = {
85
+ imports: [KafkaClientModule, DirectKafkaProducerModule],
86
+ providers,
87
+ module: DirectOutboxModuleGenerator,
88
+ exports: providers,
89
+ };
90
+
91
+ const rsdkKafkaMetadata = new RsdkMetadata<KafkaTopicMetadata>(
92
+ moduleDef,
93
+ KAFKA_TOPIC_RSDK_METADATA_SCOPE,
94
+ );
95
+
96
+ for (const eventType of eventTypes) {
97
+ rsdkKafkaMetadata.add({
98
+ type: TopicType.PRODUCE,
99
+ topicName: getTopicName(eventType),
100
+ group: eventType.$group,
101
+ partitionKeyField: eventType.$partitionKeyField,
102
+ eventType: omit(eventType, 'toJSON', 'encode', 'decode'),
103
+ });
104
+ }
105
+
106
+ AutodocMetadata.defineResolver(
107
+ moduleDef,
108
+ KAFKA_TOPIC_RSDK_METADATA_SCOPE,
109
+ kafkaProducerDirectAutodocResolver,
110
+ );
111
+
112
+ return moduleDef;
113
+ }
114
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,11 @@
1
- export { DirectProducer } from './direct.producer';
1
+ export { DirectBatchProducer } from './producers/batch.producer';
2
2
 
3
- export { KafkaDirectProducer } from './direct.strategy';
3
+ export { DirectProducer } from './producers/single.producer';
4
+
5
+ export { InjectDirectBatchProducer, InjectDirectProducer } from './decorator';
6
+
7
+ export {
8
+ createDirectBatchProducerToken,
9
+ createDirectProducerToken,
10
+ KAFKA_PRODUCED_RSDK_METADATA_SCOPE,
11
+ } from './constants';
@@ -1,8 +1,10 @@
1
1
  import type { DocumentResolver } from '@rsdk/autodoc.protocol';
2
2
  import { Composite, Table } from '@rsdk/autodoc.protocol';
3
- import type { KafkaTopicMetadata } from '@rsdk/kafka.common';
4
- import { KafkaTopicType } from '@rsdk/kafka.common';
5
- import type { KafkaTopicMetadataByEventType } from '@rsdk/kafka.common/dist/metadata/kafka.metadata';
3
+ import type {
4
+ KafkaTopicMetadata,
5
+ KafkaTopicMetadataByEventType,
6
+ } from '@rsdk/kafka.common';
7
+ import { TopicType } from '@rsdk/kafka.common';
6
8
  import type { RsdkMetadataProvider } from '@rsdk/metadata';
7
9
 
8
10
  import { KAFKA_PRODUCED_RSDK_METADATA_SCOPE } from '../constants';
@@ -20,7 +22,7 @@ export class KafkaProducerDirectAutodocResolver implements DocumentResolver {
20
22
  return new Composite(
21
23
  new Table(
22
24
  resources
23
- .filter((resource) => resource.value.type === KafkaTopicType.Produce)
25
+ .filter((resource) => resource.value.type === TopicType.PRODUCE)
24
26
  .map((resource) => {
25
27
  const {
26
28
  topicName,
@@ -1,22 +1,17 @@
1
- import type { CheckResult, HealthIndicator } from '@rsdk/core';
2
1
  import { Indicator } from '@rsdk/core';
3
- import { KafkaHealthcheck, KafkaMetadataProvider } from '@rsdk/kafka.common';
4
- import { InjectKafka } from '@rsdk/kafka.common/dist/client/kafka.client';
2
+ import {
3
+ InjectKafka,
4
+ KafkaBaseIndicator,
5
+ TopicsService,
6
+ TopicType,
7
+ } from '@rsdk/kafka.common';
5
8
  import { Kafka } from 'kafkajs';
6
9
 
7
10
  @Indicator('kafka-producer-direct', {
8
11
  description: 'Check kafka connection',
9
12
  })
10
- export class KafkaProducerDirectHealthIndicator implements HealthIndicator {
11
- constructor(
12
- @InjectKafka() private readonly kafkaClient: Kafka,
13
- private readonly topicStorage: KafkaMetadataProvider,
14
- ) {}
15
-
16
- async check(): Promise<CheckResult> {
17
- return new KafkaHealthcheck(
18
- this.kafkaClient,
19
- this.topicStorage.getProducedTopics(),
20
- ).check();
13
+ export class DirectProducerIndicator extends KafkaBaseIndicator {
14
+ constructor(@InjectKafka() client: Kafka, topics: TopicsService) {
15
+ super(client, topics.getTopics(TopicType.PRODUCE));
21
16
  }
22
17
  }
@@ -1,10 +1,10 @@
1
1
  import { Module } from '@nestjs/common';
2
2
  import { KafkaClientModule } from '@rsdk/kafka.common';
3
3
 
4
- import { KafkaProducerDirectHealthIndicator } from './kafka-producer-direct.health-indicator';
4
+ import { DirectProducerIndicator } from './kafka-producer-direct.health-indicator';
5
5
 
6
6
  @Module({
7
7
  imports: [KafkaClientModule],
8
- providers: [KafkaProducerDirectHealthIndicator],
8
+ providers: [DirectProducerIndicator],
9
9
  })
10
- export class KafkaProducerDirectModule {}
10
+ export class DirectKafkaProducerModule {}
@@ -0,0 +1,51 @@
1
+ import type { EventType } from '@rsdk/kafka.common';
2
+ import { getTopicName, handleKafkaError } from '@rsdk/kafka.common';
3
+ import type { BatchProducerItem, ProducerConfig } from '@rsdk/kafka.producer';
4
+ import type { RawKafkaBatchProducer } from '@rsdk/kafka.producer/dist/interfaces';
5
+ import type { Producer } from 'kafkajs';
6
+
7
+ import { EventsFactoryDirect } from '../direct-events.factory';
8
+
9
+ /**
10
+ * Producer, способный отправлять несколько ивентов за раз,
11
+ * в том числе, в разные топики (стратегия: direct)
12
+ */
13
+ export class DirectBatchProducer implements RawKafkaBatchProducer {
14
+ constructor(
15
+ private readonly client: Producer,
16
+ private readonly config: ProducerConfig,
17
+ ) {}
18
+
19
+ async publish<E extends EventType>(
20
+ items: BatchProducerItem<E>[],
21
+ ): Promise<void> {
22
+ const aggregateByTopic = items.reduce((acc, item) => {
23
+ const topic = getTopicName(item.eventType);
24
+ const exist = acc.get(topic) ?? [];
25
+
26
+ exist.push(item);
27
+ acc.set(topic, exist);
28
+ return acc;
29
+ }, new Map());
30
+
31
+ for (const [topic, items] of aggregateByTopic) {
32
+ const messages = items.map(({ payload, options, eventType }) => {
33
+ const factory = new EventsFactoryDirect(eventType, this.config);
34
+
35
+ return factory.create(payload, options);
36
+ });
37
+
38
+ // TODO: А точно надо в каждый топик последовательно слать это?
39
+
40
+ try {
41
+ await this.client.send({ topic, messages: messages });
42
+ } catch (error) {
43
+ handleKafkaError(error, topic, {
44
+ items,
45
+ aggregateByTopic,
46
+ messages,
47
+ });
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,38 @@
1
+ import type { EventPayload, EventType } from '@rsdk/kafka.common';
2
+ import { getTopicName, handleKafkaError } from '@rsdk/kafka.common';
3
+ import type {
4
+ KafkaProducer,
5
+ ProducerOptions,
6
+ PublishOptions,
7
+ } from '@rsdk/kafka.producer';
8
+ import type { Producer } from 'kafkajs';
9
+
10
+ import { EventsFactoryDirect } from '../direct-events.factory';
11
+
12
+ /**
13
+ * Producer, специализированный под конкретный ивент.
14
+ */
15
+ export class DirectProducer<T extends EventType> implements KafkaProducer<T> {
16
+ private readonly client: Producer;
17
+ private readonly factory: EventsFactoryDirect<T>;
18
+ private readonly topic: string;
19
+
20
+ constructor(client: Producer, eventType: T, config: ProducerOptions) {
21
+ this.client = client;
22
+ this.factory = new EventsFactoryDirect(eventType, config);
23
+ this.topic = getTopicName(eventType);
24
+ }
25
+
26
+ async publish<P extends EventPayload<T>>(
27
+ payload: P,
28
+ options?: PublishOptions,
29
+ ): Promise<void> {
30
+ try {
31
+ const messages = [this.factory.create(payload, options)];
32
+
33
+ await this.client.send({ topic: this.topic, messages });
34
+ } catch (error) {
35
+ handleKafkaError(error, this.topic, options);
36
+ }
37
+ }
38
+ }
@@ -1,15 +0,0 @@
1
- import type { EventType } from '@rsdk/kafka.common';
2
- import type { KafkaProducer, KafkaProducerConfig, 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, P = T extends EventType<infer P> ? P : never> extends BaseProducer<T, P> implements KafkaProducer<P> {
6
- readonly eventType: T;
7
- private readonly client;
8
- readonly kafkaProducerConfig: KafkaProducerConfig;
9
- static logger: import("@rsdk/logging").ILogger;
10
- constructor(eventType: T, client: Producer, kafkaProducerConfig: KafkaProducerConfig);
11
- static getTopicName(eventType: EventType): string;
12
- publish(payload: P, options?: PublishOptions): Promise<void>;
13
- private getMessage;
14
- private getPayload;
15
- }
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DirectProducer = void 0;
4
- const kafka_common_1 = require("@rsdk/kafka.common");
5
- const kafka_producer_1 = require("@rsdk/kafka.producer");
6
- const logging_1 = require("@rsdk/logging");
7
- const node_crypto_1 = require("node:crypto");
8
- class DirectProducer extends kafka_producer_1.BaseProducer {
9
- eventType;
10
- client;
11
- kafkaProducerConfig;
12
- static logger = logging_1.LoggerFactory.create(DirectProducer);
13
- constructor(eventType, client, kafkaProducerConfig) {
14
- super(eventType, kafkaProducerConfig);
15
- this.eventType = eventType;
16
- this.client = client;
17
- this.kafkaProducerConfig = kafkaProducerConfig;
18
- }
19
- static getTopicName(eventType) {
20
- return `events.${eventType.$group}`;
21
- }
22
- async publish(payload, options) {
23
- const topicName = DirectProducer.getTopicName(this.eventType);
24
- try {
25
- await this.client.send({
26
- topic: topicName,
27
- messages: [this.getMessage(payload, options)],
28
- });
29
- }
30
- catch (error) {
31
- new kafka_common_1.ServerKafkaExceptionFactory(DirectProducer.getTopicName(this.eventType), {
32
- cause: error,
33
- details: options,
34
- }).wrapAndThrow(error);
35
- }
36
- }
37
- getMessage(payload, options) {
38
- return {
39
- headers: {
40
- id: (0, node_crypto_1.randomUUID)(),
41
- type: this.eventType.$type,
42
- metadata: JSON.stringify(this.addSerializeFormatToMetadata(options?.metadata ?? {})),
43
- },
44
- key: JSON.stringify({
45
- schema: { type: 'string', optional: false },
46
- payload: this.getPayload(payload, options),
47
- }),
48
- value: this.serializePayload(payload),
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"direct.producer.js","sourceRoot":"","sources":["../src/direct.producer.ts"],"names":[],"mappings":";;;AACA,qDAAiE;AAMjE,yDAAoD;AACpD,2CAA8C;AAE9C,6CAAyC;AAEzC,MAAa,cAIX,SAAQ,6BAAkB;IAMN;IACD;IACC;IALpB,MAAM,CAAC,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAErD,YACoB,SAAY,EACb,MAAgB,EACf,mBAAwC;QAE1D,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAJpB,cAAS,GAAT,SAAS,CAAG;QACb,WAAM,GAAN,MAAM,CAAU;QACf,wBAAmB,GAAnB,mBAAmB,CAAqB;IAG5D,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,wBAAU,GAAE;gBAChB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;gBAC1B,QAAQ,EAAE,IAAI,CAAC,SAAS,CACtB,IAAI,CAAC,4BAA4B,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAC3D;aACF;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,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;SACtC,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;;AA7DH,wCA8DC"}
@@ -1,5 +0,0 @@
1
- import type { DynamicModule } from '@nestjs/common';
2
- import type { EventType } from '@rsdk/kafka.common';
3
- export declare class KafkaDirectProducer {
4
- static forEvent(eventType: EventType | EventType[]): DynamicModule;
5
- }
@@ -1,48 +0,0 @@
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 kafka_producer_1 = require("@rsdk/kafka.producer");
10
- const metadata_1 = require("@rsdk/metadata");
11
- const omit_1 = __importDefault(require("lodash/omit"));
12
- const autodoc_resolver_1 = require("./metadata/autodoc.resolver");
13
- const kafka_producer_direct_module_1 = require("./module/kafka-producer-direct.module");
14
- const direct_producer_1 = require("./direct.producer");
15
- // TODO: JSDOC
16
- class KafkaDirectProducer {
17
- // TODO: JSDOC
18
- static forEvent(eventType) {
19
- const eventTypes = Array.isArray(eventType) ? eventType : [eventType];
20
- const providers = eventTypes.map((eventType) => ({
21
- inject: [kafka_common_1.KAFKA_PRODUCER_INJECTION_TOKEN, kafka_producer_1.KafkaProducerConfig],
22
- provide: eventType.$type,
23
- useFactory: (producer, kafkaProducerPluginConfig) => {
24
- return new direct_producer_1.DirectProducer(eventType, producer, kafkaProducerPluginConfig);
25
- },
26
- }));
27
- const moduleDef = {
28
- imports: [kafka_common_1.KafkaClientModule, kafka_producer_direct_module_1.KafkaProducerDirectModule],
29
- providers,
30
- module: KafkaDirectProducer,
31
- exports: providers.map(({ provide }) => provide),
32
- };
33
- const rsdkKafkaMetadata = new metadata_1.RsdkMetadata(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE);
34
- for (const eventType of eventTypes) {
35
- rsdkKafkaMetadata.add({
36
- type: kafka_common_1.KafkaTopicType.Produce,
37
- topicName: (0, kafka_common_1.getTopicName)(eventType),
38
- group: eventType.$group,
39
- partitionKeyField: eventType.$partitionKeyField,
40
- eventType: (0, omit_1.default)(eventType, 'toJSON', 'encode', 'decode'),
41
- });
42
- }
43
- autodoc_protocol_1.AutodocMetadata.defineResolver(moduleDef, kafka_common_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE, autodoc_resolver_1.kafkaProducerDirectAutodocResolver);
44
- return moduleDef;
45
- }
46
- }
47
- exports.KafkaDirectProducer = KafkaDirectProducer;
48
- //# sourceMappingURL=direct.strategy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"direct.strategy.js","sourceRoot":"","sources":["../src/direct.strategy.ts"],"names":[],"mappings":";;;;;;AACA,6DAAyD;AAEzD,qDAM4B;AAC5B,yDAA2D;AAC3D,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,EAAE,oCAAmB,CAAC;YAC7D,OAAO,EAAE,SAAS,CAAC,KAAK;YACxB,UAAU,EAAE,CACV,QAAkB,EAClB,yBAA8C,EACnB,EAAE;gBAC7B,OAAO,IAAI,gCAAc,CACvB,SAAS,EACT,QAAQ,EACR,yBAAyB,CAC1B,CAAC;YACJ,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;AAlDD,kDAkDC"}
@@ -1,75 +0,0 @@
1
- import type { EventType } from '@rsdk/kafka.common';
2
- import { ServerKafkaExceptionFactory } from '@rsdk/kafka.common';
3
- import type {
4
- KafkaProducer,
5
- KafkaProducerConfig,
6
- PublishOptions,
7
- } from '@rsdk/kafka.producer';
8
- import { BaseProducer } from '@rsdk/kafka.producer';
9
- import { LoggerFactory } from '@rsdk/logging';
10
- import type { Message, Producer } from 'kafkajs';
11
- import { randomUUID } from 'node:crypto';
12
-
13
- export class DirectProducer<
14
- T extends EventType,
15
- P = T extends EventType<infer P> ? P : never,
16
- >
17
- extends BaseProducer<T, P>
18
- implements KafkaProducer<P>
19
- {
20
- static logger = LoggerFactory.create(DirectProducer);
21
-
22
- constructor(
23
- override readonly eventType: T,
24
- private readonly client: Producer,
25
- override readonly kafkaProducerConfig: KafkaProducerConfig,
26
- ) {
27
- super(eventType, kafkaProducerConfig);
28
- }
29
-
30
- static getTopicName(eventType: EventType): string {
31
- return `events.${eventType.$group}`;
32
- }
33
-
34
- async publish(payload: P, options?: PublishOptions): Promise<void> {
35
- const topicName = DirectProducer.getTopicName(this.eventType);
36
-
37
- try {
38
- await this.client.send({
39
- topic: topicName,
40
- messages: [this.getMessage(payload, options)],
41
- });
42
- } catch (error) {
43
- new ServerKafkaExceptionFactory(
44
- DirectProducer.getTopicName(this.eventType),
45
- {
46
- cause: error,
47
- details: options,
48
- },
49
- ).wrapAndThrow(error);
50
- }
51
- }
52
-
53
- private getMessage(payload: P, options?: PublishOptions): Message {
54
- return {
55
- headers: {
56
- id: randomUUID(),
57
- type: this.eventType.$type,
58
- metadata: JSON.stringify(
59
- this.addSerializeFormatToMetadata(options?.metadata ?? {}),
60
- ),
61
- },
62
- key: JSON.stringify({
63
- schema: { type: 'string', optional: false },
64
- payload: this.getPayload(payload, options),
65
- }),
66
- value: this.serializePayload(payload),
67
- };
68
- }
69
-
70
- private getPayload(payload: P, options?: PublishOptions): string {
71
- return options?.partitionKey
72
- ? String(options.partitionKey)
73
- : this.getPartitionKey(payload, this.eventType.$partitionKeyField);
74
- }
75
- }
@@ -1,71 +0,0 @@
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 { KafkaProducerConfig } from '@rsdk/kafka.producer';
12
- import { RsdkMetadata } from '@rsdk/metadata';
13
- import type { Producer } from 'kafkajs';
14
- import omit from 'lodash/omit';
15
-
16
- import { kafkaProducerDirectAutodocResolver } from './metadata/autodoc.resolver';
17
- import { KafkaProducerDirectModule } from './module/kafka-producer-direct.module';
18
- import { DirectProducer } from './direct.producer';
19
-
20
- // TODO: JSDOC
21
- export class KafkaDirectProducer {
22
- // TODO: JSDOC
23
- static forEvent(eventType: EventType | EventType[]): DynamicModule {
24
- const eventTypes = Array.isArray(eventType) ? eventType : [eventType];
25
-
26
- const providers = eventTypes.map((eventType) => ({
27
- inject: [KAFKA_PRODUCER_INJECTION_TOKEN, KafkaProducerConfig],
28
- provide: eventType.$type,
29
- useFactory: (
30
- producer: Producer,
31
- kafkaProducerPluginConfig: KafkaProducerConfig,
32
- ): DirectProducer<EventType> => {
33
- return new DirectProducer(
34
- eventType,
35
- producer,
36
- kafkaProducerPluginConfig,
37
- );
38
- },
39
- }));
40
-
41
- const moduleDef = {
42
- imports: [KafkaClientModule, KafkaProducerDirectModule],
43
- providers,
44
- module: KafkaDirectProducer,
45
- exports: providers.map(({ provide }) => provide),
46
- };
47
-
48
- const rsdkKafkaMetadata = new RsdkMetadata<KafkaTopicMetadata>(
49
- moduleDef,
50
- KAFKA_TOPIC_RSDK_METADATA_SCOPE,
51
- );
52
-
53
- for (const eventType of eventTypes) {
54
- rsdkKafkaMetadata.add({
55
- type: KafkaTopicType.Produce,
56
- topicName: getTopicName(eventType),
57
- group: eventType.$group,
58
- partitionKeyField: eventType.$partitionKeyField,
59
- eventType: omit(eventType, 'toJSON', 'encode', 'decode'),
60
- });
61
- }
62
-
63
- AutodocMetadata.defineResolver(
64
- moduleDef,
65
- KAFKA_TOPIC_RSDK_METADATA_SCOPE,
66
- kafkaProducerDirectAutodocResolver,
67
- );
68
-
69
- return moduleDef;
70
- }
71
- }