@rsdk/kafka.common 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 (109) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/client/constants.d.ts +2 -0
  3. package/dist/client/constants.js +6 -0
  4. package/dist/client/constants.js.map +1 -0
  5. package/dist/client/decorators/inject-kafka.decorator.d.ts +1 -0
  6. package/dist/client/decorators/inject-kafka.decorator.js +8 -0
  7. package/dist/client/decorators/inject-kafka.decorator.js.map +1 -0
  8. package/dist/client/decorators/inject-producer.decorator.d.ts +1 -0
  9. package/dist/client/decorators/inject-producer.decorator.js +8 -0
  10. package/dist/client/decorators/inject-producer.decorator.js.map +1 -0
  11. package/dist/client/kafka-client.module.js +5 -5
  12. package/dist/client/kafka-client.module.js.map +1 -1
  13. package/dist/client/kafka.base-indicator.d.ts +10 -0
  14. package/dist/client/{kafka.healthcheck.js → kafka.base-indicator.js} +18 -18
  15. package/dist/client/kafka.base-indicator.js.map +1 -0
  16. package/dist/{metadata → client}/kafka.metadata.d.ts +9 -5
  17. package/dist/client/kafka.metadata.js +10 -0
  18. package/dist/client/kafka.metadata.js.map +1 -0
  19. package/dist/client/providers/kafka-producer.provider.d.ts +2 -0
  20. package/dist/client/providers/kafka-producer.provider.js +19 -0
  21. package/dist/client/providers/kafka-producer.provider.js.map +1 -0
  22. package/dist/client/providers/kafka.provider.d.ts +2 -0
  23. package/dist/client/providers/kafka.provider.js +24 -0
  24. package/dist/client/providers/kafka.provider.js.map +1 -0
  25. package/dist/client/providers/topics.service.d.ts +8 -0
  26. package/dist/{exceptions/payload-format-validator.exception.js → client/providers/topics.service.js} +22 -18
  27. package/dist/client/providers/topics.service.js.map +1 -0
  28. package/dist/event.type.d.ts +13 -0
  29. package/dist/event.type.js +6 -0
  30. package/dist/event.type.js.map +1 -1
  31. package/dist/exceptions/missing-topics.exception.d.ts +12 -0
  32. package/dist/exceptions/missing-topics.exception.js +21 -0
  33. package/dist/exceptions/missing-topics.exception.js.map +1 -0
  34. package/dist/exceptions/payload-format.exception.d.ts +5 -0
  35. package/dist/exceptions/payload-format.exception.js +11 -0
  36. package/dist/exceptions/payload-format.exception.js.map +1 -0
  37. package/dist/exceptions/unknown-kafka.exception.d.ts +4 -0
  38. package/dist/exceptions/unknown-kafka.exception.js +17 -0
  39. package/dist/exceptions/unknown-kafka.exception.js.map +1 -0
  40. package/dist/index.d.ts +14 -10
  41. package/dist/index.js +24 -19
  42. package/dist/index.js.map +1 -1
  43. package/dist/payload-format.d.ts +21 -0
  44. package/dist/payload-format.js +32 -1
  45. package/dist/payload-format.js.map +1 -1
  46. package/dist/{create-logger-adapter.fn.d.ts → utils/create-logger-adapter.fn.d.ts} +3 -0
  47. package/dist/{create-logger-adapter.fn.js → utils/create-logger-adapter.fn.js} +3 -0
  48. package/dist/utils/create-logger-adapter.fn.js.map +1 -0
  49. package/dist/utils/event.codec.d.ts +22 -0
  50. package/dist/utils/event.codec.js +32 -0
  51. package/dist/utils/event.codec.js.map +1 -0
  52. package/dist/utils/handle-kafka.error.fn.d.ts +1 -0
  53. package/dist/utils/handle-kafka.error.fn.js +15 -0
  54. package/dist/utils/handle-kafka.error.fn.js.map +1 -0
  55. package/dist/utils/retry-policy.infinite.d.ts +2 -0
  56. package/dist/{retry-policy.js → utils/retry-policy.infinite.js} +3 -3
  57. package/dist/utils/retry-policy.infinite.js.map +1 -0
  58. package/package.json +4 -4
  59. package/src/client/constants.ts +2 -0
  60. package/src/client/decorators/inject-kafka.decorator.ts +6 -0
  61. package/src/client/decorators/inject-producer.decorator.ts +6 -0
  62. package/src/client/kafka-client.module.ts +5 -6
  63. package/src/client/{kafka.healthcheck.ts → kafka.base-indicator.ts} +17 -18
  64. package/src/{metadata → client}/kafka.metadata.ts +12 -5
  65. package/src/client/providers/kafka-producer.provider.ts +23 -0
  66. package/src/client/providers/kafka.provider.ts +24 -0
  67. package/src/client/providers/topics.service.ts +23 -0
  68. package/src/event.type.ts +16 -0
  69. package/src/exceptions/missing-topics.exception.ts +19 -0
  70. package/src/exceptions/payload-format.exception.ts +10 -0
  71. package/src/exceptions/unknown-kafka.exception.ts +13 -0
  72. package/src/index.ts +20 -12
  73. package/src/payload-format.ts +38 -0
  74. package/src/{create-logger-adapter.fn.ts → utils/create-logger-adapter.fn.ts} +3 -0
  75. package/src/utils/event.codec.ts +34 -0
  76. package/src/utils/handle-kafka.error.fn.ts +17 -0
  77. package/src/utils/retry-policy.infinite.ts +8 -0
  78. package/tsconfig.json +0 -1
  79. package/dist/client/kafka.client.d.ts +0 -7
  80. package/dist/client/kafka.client.js +0 -43
  81. package/dist/client/kafka.client.js.map +0 -1
  82. package/dist/client/kafka.healthcheck.d.ts +0 -9
  83. package/dist/client/kafka.healthcheck.js.map +0 -1
  84. package/dist/create-logger-adapter.fn.js.map +0 -1
  85. package/dist/exception.d.ts +0 -32
  86. package/dist/exception.js +0 -61
  87. package/dist/exception.js.map +0 -1
  88. package/dist/exceptions/payload-format-validator.exception.d.ts +0 -4
  89. package/dist/exceptions/payload-format-validator.exception.js.map +0 -1
  90. package/dist/metadata/kafka-metadata.module.d.ts +0 -2
  91. package/dist/metadata/kafka-metadata.module.js +0 -21
  92. package/dist/metadata/kafka-metadata.module.js.map +0 -1
  93. package/dist/metadata/kafka-metadata.provider.d.ts +0 -8
  94. package/dist/metadata/kafka-metadata.provider.js +0 -42
  95. package/dist/metadata/kafka-metadata.provider.js.map +0 -1
  96. package/dist/metadata/kafka.metadata.js +0 -10
  97. package/dist/metadata/kafka.metadata.js.map +0 -1
  98. package/dist/retry-policy.d.ts +0 -6
  99. package/dist/retry-policy.js.map +0 -1
  100. package/dist/validators/payload-format.validator.d.ts +0 -3
  101. package/dist/validators/payload-format.validator.js +0 -14
  102. package/dist/validators/payload-format.validator.js.map +0 -1
  103. package/src/client/kafka.client.ts +0 -49
  104. package/src/exception.ts +0 -67
  105. package/src/exceptions/payload-format-validator.exception.ts +0 -17
  106. package/src/metadata/kafka-metadata.module.ts +0 -9
  107. package/src/metadata/kafka-metadata.provider.ts +0 -36
  108. package/src/retry-policy.ts +0 -6
  109. package/src/validators/payload-format.validator.ts +0 -18
@@ -0,0 +1,8 @@
1
+ import type { RetryOptions } from 'kafkajs';
2
+
3
+ export const INFINITE_RETRIES: RetryOptions = {
4
+ maxRetryTime: 1e3,
5
+ retries: Number.POSITIVE_INFINITY,
6
+ factor: 0,
7
+ multiplier: 10,
8
+ };
package/tsconfig.json CHANGED
@@ -4,6 +4,5 @@
4
4
  "declaration": true,
5
5
  "outDir": "dist"
6
6
  },
7
- "include": ["src/**/*"],
8
7
  "exclude": ["node_modules", "dist", "test", "**/*.spec.ts", "**/*.test.ts", "**/*.spec.e2e.ts", "**/*.test.e2e.ts"]
9
8
  }
@@ -1,7 +0,0 @@
1
- import type { FactoryProvider } from '@nestjs/common';
2
- export declare const KAFKA_CLIENT_INJECTION_TOKEN: unique symbol;
3
- export declare const KAFKA_PRODUCER_INJECTION_TOKEN: unique symbol;
4
- export declare const InjectKafka: () => ParameterDecorator;
5
- export declare const InjectKafkaProducer: () => ParameterDecorator;
6
- export declare const KafkaClient: FactoryProvider;
7
- export declare const KafkaProducer: FactoryProvider;
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KafkaProducer = exports.KafkaClient = exports.InjectKafkaProducer = exports.InjectKafka = exports.KAFKA_PRODUCER_INJECTION_TOKEN = exports.KAFKA_CLIENT_INJECTION_TOKEN = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const core_1 = require("@rsdk/core");
6
- const logging_1 = require("@rsdk/logging");
7
- const kafkajs_1 = require("kafkajs");
8
- const create_logger_adapter_fn_1 = require("../create-logger-adapter.fn");
9
- const retry_policy_1 = require("../retry-policy");
10
- const kafka_config_1 = require("./kafka.config");
11
- exports.KAFKA_CLIENT_INJECTION_TOKEN = Symbol('KafkaClient');
12
- exports.KAFKA_PRODUCER_INJECTION_TOKEN = Symbol('KafkaProducer');
13
- const InjectKafka = () => (0, common_1.Inject)(exports.KAFKA_CLIENT_INJECTION_TOKEN);
14
- exports.InjectKafka = InjectKafka;
15
- const InjectKafkaProducer = () => (0, common_1.Inject)(exports.KAFKA_PRODUCER_INJECTION_TOKEN);
16
- exports.InjectKafkaProducer = InjectKafkaProducer;
17
- exports.KafkaClient = {
18
- inject: [kafka_config_1.KafkaConfig, core_1.APP_NAME],
19
- provide: exports.KAFKA_CLIENT_INJECTION_TOKEN,
20
- useFactory(config, name) {
21
- const logger = logging_1.LoggerFactory.create('NativeKafkaProducer');
22
- return new kafkajs_1.Kafka({
23
- clientId: `${name}-${process.pid}`,
24
- brokers: config.brokers,
25
- logCreator: (0, create_logger_adapter_fn_1.createLoggerAdapter)(logger),
26
- retry: retry_policy_1.retryPolicy,
27
- });
28
- },
29
- };
30
- exports.KafkaProducer = {
31
- inject: [exports.KAFKA_CLIENT_INJECTION_TOKEN],
32
- provide: exports.KAFKA_PRODUCER_INJECTION_TOKEN,
33
- async useFactory(kafka) {
34
- const producer = kafka.producer({
35
- allowAutoTopicCreation: false,
36
- createPartitioner: kafkajs_1.Partitioners.DefaultPartitioner,
37
- retry: { retries: 1 },
38
- });
39
- await producer.connect();
40
- return { ...producer, onModuleDestroy: () => producer.disconnect() };
41
- },
42
- };
43
- //# sourceMappingURL=kafka.client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kafka.client.js","sourceRoot":"","sources":["../../src/client/kafka.client.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,qCAAsC;AACtC,2CAA8C;AAE9C,qCAA8C;AAE9C,0EAAkE;AAClE,kDAA8C;AAE9C,iDAA6C;AAEhC,QAAA,4BAA4B,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AACrD,QAAA,8BAA8B,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAE/D,MAAM,WAAW,GAAG,GAAuB,EAAE,CAClD,IAAA,eAAM,EAAC,oCAA4B,CAAC,CAAC;AAD1B,QAAA,WAAW,eACe;AAChC,MAAM,mBAAmB,GAAG,GAAuB,EAAE,CAC1D,IAAA,eAAM,EAAC,sCAA8B,CAAC,CAAC;AAD5B,QAAA,mBAAmB,uBACS;AAE5B,QAAA,WAAW,GAAoB;IAC1C,MAAM,EAAE,CAAC,0BAAW,EAAE,eAAQ,CAAC;IAC/B,OAAO,EAAE,oCAA4B;IACrC,UAAU,CAAC,MAAmB,EAAE,IAAY;QAC1C,MAAM,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAE3D,OAAO,IAAI,eAAK,CAAC;YACf,QAAQ,EAAE,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE;YAClC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,IAAA,8CAAmB,EAAC,MAAM,CAAC;YACvC,KAAK,EAAE,0BAAW;SACnB,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEW,QAAA,aAAa,GAAoB;IAC5C,MAAM,EAAE,CAAC,oCAA4B,CAAC;IACtC,OAAO,EAAE,sCAA8B;IACvC,KAAK,CAAC,UAAU,CAAC,KAAY;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC9B,sBAAsB,EAAE,KAAK;YAC7B,iBAAiB,EAAE,sBAAY,CAAC,kBAAkB;YAClD,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtB,CAAC,CAAC;QAEH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;IACvE,CAAC;CACF,CAAC"}
@@ -1,9 +0,0 @@
1
- import { CheckResult } from '@rsdk/core';
2
- import type { Kafka } from 'kafkajs';
3
- export declare class KafkaHealthcheck {
4
- readonly kafkaClient: Kafka;
5
- readonly neededTopics: string[];
6
- constructor(kafkaClient: Kafka, neededTopics: string[]);
7
- getMissingTopics(): Promise<string[]>;
8
- check(): Promise<CheckResult>;
9
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"kafka.healthcheck.js","sourceRoot":"","sources":["../../src/client/kafka.healthcheck.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AAGzC,MAAa,gBAAgB;IAEhB;IACA;IAFX,YACW,WAAkB,EAClB,YAAsB;QADtB,gBAAW,GAAX,WAAW,CAAO;QAClB,iBAAY,GAAZ,YAAY,CAAU;IAC9B,CAAC;IAEJ,KAAK,CAAC,gBAAgB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACnC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACtB,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QAEtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QAExC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC/C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5B,OAAO,kBAAW,CAAC,IAAI,CAAC;oBACtB,aAAa;iBACd,CAAC,CAAC;aACJ;YACD,OAAO,kBAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC3B;QAAC,OAAO,KAAc,EAAE;YACvB,OAAO,kBAAW,CAAC,IAAI,CAAC;gBACtB,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC,CAAC;SACJ;IACH,CAAC;CACF;AApCD,4CAoCC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-logger-adapter.fn.js","sourceRoot":"","sources":["../src/create-logger-adapter.fn.ts"],"names":[],"mappings":";;;AAAA,yCAA2C;AAG3C,qCAAmC;AAE5B,MAAM,mBAAmB,GAC9B,CAAC,MAAe,EAAc,EAAE,CAChC,CAAC,SAAmB,EAAE,EAAE,CACxB,CAAC,KAAe,EAAQ,EAAE;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;IACtC,MAAM,MAAM,GAAG;QACb,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,GAAG;KACP,CAAC;IAEF,QAAQ,KAAK,CAAC,KAAK,EAAE;QACnB,KAAK,kBAAQ,CAAC,KAAK;YACjB,sFAAsF;YACtF,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,KAAK,kBAAQ,CAAC,KAAK;YACjB,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,KAAK,kBAAQ,CAAC,IAAI;YAChB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,KAAK,kBAAQ,CAAC,IAAI;YAChB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,KAAK,kBAAQ,CAAC,OAAO;YACnB,OAAO;QACT;YACE,IAAA,oBAAW,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KAC5B;AACH,CAAC,CAAC;AAzBS,QAAA,mBAAmB,uBAyB5B"}
@@ -1,32 +0,0 @@
1
- import { InternalException } from '@rsdk/core';
2
- declare class ServerKafkaException extends InternalException {
3
- }
4
- export declare class ServerKafkaExceptionFactory {
5
- readonly pattern: string;
6
- readonly props?: {
7
- details?: unknown;
8
- cause?: unknown;
9
- } | undefined;
10
- constructor(pattern: string, props?: {
11
- details?: unknown;
12
- cause?: unknown;
13
- } | undefined);
14
- unknown(): UnknownException;
15
- missingTopics(): MissingTopics;
16
- wrapAndThrow(error: unknown): never;
17
- }
18
- export declare class MissingTopics extends ServerKafkaException {
19
- readonly topics: string[];
20
- readonly props?: {
21
- details?: unknown;
22
- cause?: unknown;
23
- } | undefined;
24
- constructor(topics: string[], props?: {
25
- details?: unknown;
26
- cause?: unknown;
27
- } | undefined);
28
- }
29
- export declare class UnknownException extends ServerKafkaException {
30
- constructor(cause: unknown, pattern: string, details?: unknown);
31
- }
32
- export {};
package/dist/exception.js DELETED
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UnknownException = exports.MissingTopics = exports.ServerKafkaExceptionFactory = void 0;
4
- const core_1 = require("@rsdk/core");
5
- const kafkajs_1 = require("kafkajs");
6
- class ServerKafkaException extends core_1.InternalException {
7
- }
8
- class ServerKafkaExceptionFactory {
9
- pattern;
10
- props;
11
- constructor(pattern, props) {
12
- this.pattern = pattern;
13
- this.props = props;
14
- }
15
- unknown() {
16
- return new UnknownException(this.props?.cause, this.pattern, this.props?.details);
17
- }
18
- missingTopics() {
19
- return new MissingTopics([this.pattern], this.props);
20
- }
21
- wrapAndThrow(error) {
22
- if (!(error instanceof kafkajs_1.KafkaJSProtocolError)) {
23
- throw this.unknown();
24
- }
25
- // https://github.com/tulios/kafkajs/blob/master/src/protocol/error.js#L26
26
- if (error.code === 3) {
27
- throw this.missingTopics();
28
- }
29
- throw this.unknown();
30
- }
31
- }
32
- exports.ServerKafkaExceptionFactory = ServerKafkaExceptionFactory;
33
- class MissingTopics extends ServerKafkaException {
34
- topics;
35
- props;
36
- constructor(topics, props) {
37
- super('Expected topics or partitions is missing!', {
38
- details: {
39
- topics,
40
- details: props?.details,
41
- },
42
- cause: props?.cause,
43
- });
44
- this.topics = topics;
45
- this.props = props;
46
- }
47
- }
48
- exports.MissingTopics = MissingTopics;
49
- class UnknownException extends ServerKafkaException {
50
- constructor(cause, pattern, details) {
51
- super('Unknown exception from ServerKafka!', {
52
- details: {
53
- pattern,
54
- details: details,
55
- },
56
- cause,
57
- });
58
- }
59
- }
60
- exports.UnknownException = UnknownException;
61
- //# sourceMappingURL=exception.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exception.js","sourceRoot":"","sources":["../src/exception.ts"],"names":[],"mappings":";;;AAAA,qCAA+C;AAC/C,qCAA+C;AAE/C,MAAM,oBAAqB,SAAQ,wBAAiB;CAAG;AAEvD,MAAa,2BAA2B;IAE3B;IACA;IAFX,YACW,OAAe,EACf,KAGR;QAJQ,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAGb;IACA,CAAC;IAEJ,OAAO;QACL,OAAO,IAAI,gBAAgB,CACzB,IAAI,CAAC,KAAK,EAAE,KAAK,EACjB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,KAAK,EAAE,OAAO,CACpB,CAAC;IACJ,CAAC;IAED,aAAa;QACX,OAAO,IAAI,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IAAI,CAAC,CAAC,KAAK,YAAY,8BAAoB,CAAC,EAAE;YAC5C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;SACtB;QACD,0EAA0E;QAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE;YACpB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5B;QACD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;CACF;AA/BD,kEA+BC;AAED,MAAa,aAAc,SAAQ,oBAAoB;IAE1C;IACA;IAFX,YACW,MAAgB,EAChB,KAGR;QAED,KAAK,CAAC,2CAA2C,EAAE;YACjD,OAAO,EAAE;gBACP,MAAM;gBACN,OAAO,EAAE,KAAK,EAAE,OAAO;aACxB;YACD,KAAK,EAAE,KAAK,EAAE,KAAK;SACpB,CAAC,CAAC;QAZM,WAAM,GAAN,MAAM,CAAU;QAChB,UAAK,GAAL,KAAK,CAGb;IASH,CAAC;CACF;AAhBD,sCAgBC;AAED,MAAa,gBAAiB,SAAQ,oBAAoB;IACxD,YAAY,KAAc,EAAE,OAAe,EAAE,OAAiB;QAC5D,KAAK,CAAC,qCAAqC,EAAE;YAC3C,OAAO,EAAE;gBACP,OAAO;gBACP,OAAO,EAAE,OAAO;aACjB;YACD,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CACF;AAVD,4CAUC"}
@@ -1,4 +0,0 @@
1
- import { BootstrapException } from '@rsdk/core';
2
- export declare class InvalidPayloadFormatException extends BootstrapException {
3
- constructor(value: string, allowedValues: string[]);
4
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"payload-format-validator.exception.js","sourceRoot":"","sources":["../../src/exceptions/payload-format-validator.exception.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yCAAoC;AACpC,qCAA2D;AAOpD,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,yBAAkB;IACnE,YAAY,KAAa,EAAE,aAAuB;QAChD,KAAK,CAAC,IAAA,aAAI,EAAA;qCACuB,KAAK,cAAc,aAAa,CAAC,IAAI,CACpE,GAAG,CACJ;KACA,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AARY,sEAA6B;wCAA7B,6BAA6B;IALzC,IAAA,gBAAS,EAAC;QACT,WAAW,EAAE,IAAA,aAAI,EAAA;;GAEhB;KACF,CAAC;;GACW,6BAA6B,CAQzC"}
@@ -1,2 +0,0 @@
1
- export declare class KafkaMetadataModule {
2
- }
@@ -1,21 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.KafkaMetadataModule = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const kafka_metadata_provider_1 = require("./kafka-metadata.provider");
12
- let KafkaMetadataModule = class KafkaMetadataModule {
13
- };
14
- exports.KafkaMetadataModule = KafkaMetadataModule;
15
- exports.KafkaMetadataModule = KafkaMetadataModule = __decorate([
16
- (0, common_1.Module)({
17
- providers: [kafka_metadata_provider_1.KafkaMetadataProvider],
18
- exports: [kafka_metadata_provider_1.KafkaMetadataProvider],
19
- })
20
- ], KafkaMetadataModule);
21
- //# sourceMappingURL=kafka-metadata.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kafka-metadata.module.js","sourceRoot":"","sources":["../../src/metadata/kafka-metadata.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AAExC,uEAAkE;AAM3D,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;CAAG,CAAA;AAAtB,kDAAmB;8BAAnB,mBAAmB;IAJ/B,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,+CAAqB,CAAC;QAClC,OAAO,EAAE,CAAC,+CAAqB,CAAC;KACjC,CAAC;GACW,mBAAmB,CAAG"}
@@ -1,8 +0,0 @@
1
- import { RsdkMetadataProvider } from '@rsdk/metadata';
2
- export declare class KafkaMetadataProvider {
3
- private readonly rsdkMetadataProvider;
4
- constructor(rsdkMetadataProvider: RsdkMetadataProvider);
5
- getProducedTopics(): string[];
6
- getConsumedTopics(): string[];
7
- private getResources;
8
- }
@@ -1,42 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.KafkaMetadataProvider = void 0;
13
- const common_1 = require("@nestjs/common");
14
- const metadata_1 = require("@rsdk/metadata");
15
- const kafka_metadata_1 = require("./kafka.metadata");
16
- let KafkaMetadataProvider = class KafkaMetadataProvider {
17
- rsdkMetadataProvider;
18
- constructor(rsdkMetadataProvider) {
19
- this.rsdkMetadataProvider = rsdkMetadataProvider;
20
- }
21
- getProducedTopics() {
22
- const resources = this.getResources();
23
- return resources
24
- .filter(({ value: { type } }) => type === kafka_metadata_1.KafkaTopicType.Produce)
25
- .map((value) => value.value.topicName);
26
- }
27
- getConsumedTopics() {
28
- const resources = this.getResources();
29
- return resources
30
- .filter(({ value: { type } }) => type === kafka_metadata_1.KafkaTopicType.Consume)
31
- .map((value) => value.value.topicName);
32
- }
33
- getResources() {
34
- return this.rsdkMetadataProvider.get(kafka_metadata_1.KAFKA_TOPIC_RSDK_METADATA_SCOPE);
35
- }
36
- };
37
- exports.KafkaMetadataProvider = KafkaMetadataProvider;
38
- exports.KafkaMetadataProvider = KafkaMetadataProvider = __decorate([
39
- (0, common_1.Injectable)(),
40
- __metadata("design:paramtypes", [metadata_1.RsdkMetadataProvider])
41
- ], KafkaMetadataProvider);
42
- //# sourceMappingURL=kafka-metadata.provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kafka-metadata.provider.js","sourceRoot":"","sources":["../../src/metadata/kafka-metadata.provider.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,6CAAsD;AAGtD,qDAG0B;AAGnB,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACH;IAA7B,YAA6B,oBAA0C;QAA1C,yBAAoB,GAApB,oBAAoB,CAAsB;IAAG,CAAC;IAE3E,iBAAiB;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEtC,OAAO,SAAS;aACb,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,+BAAc,CAAC,OAAO,CAAC;aAChE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED,iBAAiB;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAEtC,OAAO,SAAS;aACb,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,+BAAc,CAAC,OAAO,CAAC;aAChE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAEO,YAAY;QAClB,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAClC,gDAA+B,CAChC,CAAC;IACJ,CAAC;CACF,CAAA;AAxBY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAEwC,+BAAoB;GAD5D,qBAAqB,CAwBjC"}
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KAFKA_TOPIC_RSDK_METADATA_SCOPE = exports.KafkaTopicType = void 0;
4
- var KafkaTopicType;
5
- (function (KafkaTopicType) {
6
- KafkaTopicType[KafkaTopicType["Consume"] = 0] = "Consume";
7
- KafkaTopicType[KafkaTopicType["Produce"] = 1] = "Produce";
8
- })(KafkaTopicType || (exports.KafkaTopicType = KafkaTopicType = {}));
9
- exports.KAFKA_TOPIC_RSDK_METADATA_SCOPE = 'kafka-topic';
10
- //# sourceMappingURL=kafka.metadata.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"kafka.metadata.js","sourceRoot":"","sources":["../../src/metadata/kafka.metadata.ts"],"names":[],"mappings":";;;AAEA,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,yDAAO,CAAA;IACP,yDAAO,CAAA;AACT,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAiBY,QAAA,+BAA+B,GAAG,aAAa,CAAC"}
@@ -1,6 +0,0 @@
1
- export declare const retryPolicy: {
2
- maxRetryTime: number;
3
- retries: number;
4
- factor: number;
5
- multiplier: number;
6
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry-policy.js","sourceRoot":"","sources":["../src/retry-policy.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG;IACzB,YAAY,EAAE,GAAG;IACjB,OAAO,EAAE,MAAM,CAAC,iBAAiB;IACjC,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,EAAE;CACf,CAAC"}
@@ -1,3 +0,0 @@
1
- import { PayloadFormat } from '../payload-format';
2
- export declare const isValidPayloadFormat: (value: string | PayloadFormat) => value is PayloadFormat;
3
- export declare const assertIsPayloadFormat: (value: PayloadFormat | string) => asserts value is PayloadFormat;
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertIsPayloadFormat = exports.isValidPayloadFormat = void 0;
4
- const payload_format_validator_exception_1 = require("../exceptions/payload-format-validator.exception");
5
- const payload_format_1 = require("../payload-format");
6
- const isValidPayloadFormat = (value) => Object.values(payload_format_1.PayloadFormat).includes(value);
7
- exports.isValidPayloadFormat = isValidPayloadFormat;
8
- const assertIsPayloadFormat = (value) => {
9
- if (!(0, exports.isValidPayloadFormat)(value)) {
10
- throw new payload_format_validator_exception_1.InvalidPayloadFormatException(value, Object.values(payload_format_1.PayloadFormat));
11
- }
12
- };
13
- exports.assertIsPayloadFormat = assertIsPayloadFormat;
14
- //# sourceMappingURL=payload-format.validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"payload-format.validator.js","sourceRoot":"","sources":["../../src/validators/payload-format.validator.ts"],"names":[],"mappings":";;;AAAA,yGAAiG;AACjG,sDAAkD;AAE3C,MAAM,oBAAoB,GAAG,CAClC,KAA6B,EACL,EAAE,CAC1B,MAAM,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC,QAAQ,CAAC,KAAsB,CAAC,CAAC;AAHnD,QAAA,oBAAoB,wBAG+B;AAEzD,MAAM,qBAAqB,GAAG,CACnC,KAA6B,EACG,EAAE;IAClC,IAAI,CAAC,IAAA,4BAAoB,EAAC,KAAK,CAAC,EAAE;QAChC,MAAM,IAAI,kEAA6B,CACrC,KAAK,EACL,MAAM,CAAC,MAAM,CAAC,8BAAa,CAAC,CAC7B,CAAC;KACH;AACH,CAAC,CAAC;AATW,QAAA,qBAAqB,yBAShC"}
@@ -1,49 +0,0 @@
1
- import type { FactoryProvider, OnModuleDestroy } from '@nestjs/common';
2
- import { Inject } from '@nestjs/common';
3
- import { APP_NAME } from '@rsdk/core';
4
- import { LoggerFactory } from '@rsdk/logging';
5
- import type { Producer } from 'kafkajs';
6
- import { Kafka, Partitioners } from 'kafkajs';
7
-
8
- import { createLoggerAdapter } from '../create-logger-adapter.fn';
9
- import { retryPolicy } from '../retry-policy';
10
-
11
- import { KafkaConfig } from './kafka.config';
12
-
13
- export const KAFKA_CLIENT_INJECTION_TOKEN = Symbol('KafkaClient');
14
- export const KAFKA_PRODUCER_INJECTION_TOKEN = Symbol('KafkaProducer');
15
-
16
- export const InjectKafka = (): ParameterDecorator =>
17
- Inject(KAFKA_CLIENT_INJECTION_TOKEN);
18
- export const InjectKafkaProducer = (): ParameterDecorator =>
19
- Inject(KAFKA_PRODUCER_INJECTION_TOKEN);
20
-
21
- export const KafkaClient: FactoryProvider = {
22
- inject: [KafkaConfig, APP_NAME],
23
- provide: KAFKA_CLIENT_INJECTION_TOKEN,
24
- useFactory(config: KafkaConfig, name: string): Kafka {
25
- const logger = LoggerFactory.create('NativeKafkaProducer');
26
-
27
- return new Kafka({
28
- clientId: `${name}-${process.pid}`,
29
- brokers: config.brokers,
30
- logCreator: createLoggerAdapter(logger),
31
- retry: retryPolicy,
32
- });
33
- },
34
- };
35
-
36
- export const KafkaProducer: FactoryProvider = {
37
- inject: [KAFKA_CLIENT_INJECTION_TOKEN],
38
- provide: KAFKA_PRODUCER_INJECTION_TOKEN,
39
- async useFactory(kafka: Kafka): Promise<Producer & OnModuleDestroy> {
40
- const producer = kafka.producer({
41
- allowAutoTopicCreation: false,
42
- createPartitioner: Partitioners.DefaultPartitioner,
43
- retry: { retries: 1 },
44
- });
45
-
46
- await producer.connect();
47
- return { ...producer, onModuleDestroy: () => producer.disconnect() };
48
- },
49
- };
package/src/exception.ts DELETED
@@ -1,67 +0,0 @@
1
- import { InternalException } from '@rsdk/core';
2
- import { KafkaJSProtocolError } from 'kafkajs';
3
-
4
- class ServerKafkaException extends InternalException {}
5
-
6
- export class ServerKafkaExceptionFactory {
7
- constructor(
8
- readonly pattern: string,
9
- readonly props?: {
10
- details?: unknown;
11
- cause?: unknown;
12
- },
13
- ) {}
14
-
15
- unknown(): UnknownException {
16
- return new UnknownException(
17
- this.props?.cause,
18
- this.pattern,
19
- this.props?.details,
20
- );
21
- }
22
-
23
- missingTopics(): MissingTopics {
24
- return new MissingTopics([this.pattern], this.props);
25
- }
26
-
27
- wrapAndThrow(error: unknown): never {
28
- if (!(error instanceof KafkaJSProtocolError)) {
29
- throw this.unknown();
30
- }
31
- // https://github.com/tulios/kafkajs/blob/master/src/protocol/error.js#L26
32
- if (error.code === 3) {
33
- throw this.missingTopics();
34
- }
35
- throw this.unknown();
36
- }
37
- }
38
-
39
- export class MissingTopics extends ServerKafkaException {
40
- constructor(
41
- readonly topics: string[],
42
- readonly props?: {
43
- details?: unknown;
44
- cause?: unknown;
45
- },
46
- ) {
47
- super('Expected topics or partitions is missing!', {
48
- details: {
49
- topics,
50
- details: props?.details,
51
- },
52
- cause: props?.cause,
53
- });
54
- }
55
- }
56
-
57
- export class UnknownException extends ServerKafkaException {
58
- constructor(cause: unknown, pattern: string, details?: unknown) {
59
- super('Unknown exception from ServerKafka!', {
60
- details: {
61
- pattern,
62
- details: details,
63
- },
64
- cause,
65
- });
66
- }
67
- }
@@ -1,17 +0,0 @@
1
- import { text } from '@rsdk/common';
2
- import { BootstrapException, Exception } from '@rsdk/core';
3
-
4
- @Exception({
5
- description: text`
6
- PayloadFormat has wrong value.
7
- `,
8
- })
9
- export class InvalidPayloadFormatException extends BootstrapException {
10
- constructor(value: string, allowedValues: string[]) {
11
- super(text`
12
- PayloadFormat has wrong value: ${value}, allowed: ${allowedValues.join(
13
- ',',
14
- )}.
15
- `);
16
- }
17
- }
@@ -1,9 +0,0 @@
1
- import { Module } from '@nestjs/common';
2
-
3
- import { KafkaMetadataProvider } from './kafka-metadata.provider';
4
-
5
- @Module({
6
- providers: [KafkaMetadataProvider],
7
- exports: [KafkaMetadataProvider],
8
- })
9
- export class KafkaMetadataModule {}
@@ -1,36 +0,0 @@
1
- import { Injectable } from '@nestjs/common';
2
- import type { Resource } from '@rsdk/metadata';
3
- import { RsdkMetadataProvider } from '@rsdk/metadata';
4
-
5
- import type { KafkaTopicMetadata } from './kafka.metadata';
6
- import {
7
- KAFKA_TOPIC_RSDK_METADATA_SCOPE,
8
- KafkaTopicType,
9
- } from './kafka.metadata';
10
-
11
- @Injectable()
12
- export class KafkaMetadataProvider {
13
- constructor(private readonly rsdkMetadataProvider: RsdkMetadataProvider) {}
14
-
15
- getProducedTopics(): string[] {
16
- const resources = this.getResources();
17
-
18
- return resources
19
- .filter(({ value: { type } }) => type === KafkaTopicType.Produce)
20
- .map((value) => value.value.topicName);
21
- }
22
-
23
- getConsumedTopics(): string[] {
24
- const resources = this.getResources();
25
-
26
- return resources
27
- .filter(({ value: { type } }) => type === KafkaTopicType.Consume)
28
- .map((value) => value.value.topicName);
29
- }
30
-
31
- private getResources(): Resource<KafkaTopicMetadata>[] {
32
- return this.rsdkMetadataProvider.get<KafkaTopicMetadata>(
33
- KAFKA_TOPIC_RSDK_METADATA_SCOPE,
34
- );
35
- }
36
- }
@@ -1,6 +0,0 @@
1
- export const retryPolicy = {
2
- maxRetryTime: 1e3,
3
- retries: Number.POSITIVE_INFINITY,
4
- factor: 0,
5
- multiplier: 10,
6
- };
@@ -1,18 +0,0 @@
1
- import { InvalidPayloadFormatException } from '../exceptions/payload-format-validator.exception';
2
- import { PayloadFormat } from '../payload-format';
3
-
4
- export const isValidPayloadFormat = (
5
- value: string | PayloadFormat,
6
- ): value is PayloadFormat =>
7
- Object.values(PayloadFormat).includes(value as PayloadFormat);
8
-
9
- export const assertIsPayloadFormat = (
10
- value: PayloadFormat | string,
11
- ): asserts value is PayloadFormat => {
12
- if (!isValidPayloadFormat(value)) {
13
- throw new InvalidPayloadFormatException(
14
- value,
15
- Object.values(PayloadFormat),
16
- );
17
- }
18
- };