@application-kit/kafka 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/dist/cjs/configs/envs/index.d.ts +2 -0
  4. package/dist/cjs/configs/envs/index.js +18 -0
  5. package/dist/cjs/configs/envs/kafka-config.environment.d.ts +9 -0
  6. package/dist/cjs/configs/envs/kafka-config.environment.js +64 -0
  7. package/dist/cjs/configs/envs/kafka-consumer.environment.d.ts +3 -0
  8. package/dist/cjs/configs/envs/kafka-consumer.environment.js +27 -0
  9. package/dist/cjs/configs/index.d.ts +4 -0
  10. package/dist/cjs/configs/index.js +20 -0
  11. package/dist/cjs/configs/kafka-consumer.config.d.ts +9 -0
  12. package/dist/cjs/configs/kafka-consumer.config.js +50 -0
  13. package/dist/cjs/configs/kafka-producer.config.d.ts +7 -0
  14. package/dist/cjs/configs/kafka-producer.config.js +41 -0
  15. package/dist/cjs/configs/kafka.config.d.ts +7 -0
  16. package/dist/cjs/configs/kafka.config.js +52 -0
  17. package/dist/cjs/constants.d.ts +3 -0
  18. package/dist/cjs/constants.js +6 -0
  19. package/dist/cjs/event-contract-version.d.ts +5 -0
  20. package/dist/cjs/event-contract-version.js +20 -0
  21. package/dist/cjs/index.d.ts +7 -0
  22. package/dist/cjs/index.js +23 -0
  23. package/dist/cjs/kafka-commit-interceptor.d.ts +13 -0
  24. package/dist/cjs/kafka-commit-interceptor.js +87 -0
  25. package/dist/cjs/kafka-error-handler.d.ts +25 -0
  26. package/dist/cjs/kafka-error-handler.js +118 -0
  27. package/dist/cjs/kafka.module.d.ts +9 -0
  28. package/dist/cjs/kafka.module.js +67 -0
  29. package/dist/cjs/libs/consumer.abstract.d.ts +6 -0
  30. package/dist/cjs/libs/consumer.abstract.js +14 -0
  31. package/dist/cjs/libs/errors/consumers-error.d.ts +4 -0
  32. package/dist/cjs/libs/errors/consumers-error.js +12 -0
  33. package/dist/cjs/libs/errors/index.d.ts +1 -0
  34. package/dist/cjs/libs/errors/index.js +17 -0
  35. package/dist/cjs/libs/heartbeat-file-writer.d.ts +6 -0
  36. package/dist/cjs/libs/heartbeat-file-writer.js +24 -0
  37. package/dist/cjs/libs/index.d.ts +9 -0
  38. package/dist/cjs/libs/index.js +25 -0
  39. package/dist/cjs/libs/kafka-consumer-heartbeat.d.ts +3 -0
  40. package/dist/cjs/libs/kafka-consumer-heartbeat.js +13 -0
  41. package/dist/cjs/libs/kafka-consumer-server.d.ts +2 -0
  42. package/dist/cjs/libs/kafka-consumer-server.js +25 -0
  43. package/dist/cjs/libs/kafka-logger.d.ts +5 -0
  44. package/dist/cjs/libs/kafka-logger.interface.d.ts +5 -0
  45. package/dist/cjs/libs/kafka-logger.interface.js +2 -0
  46. package/dist/cjs/libs/kafka-logger.js +59 -0
  47. package/dist/cjs/libs/kafka-message-context.d.ts +6 -0
  48. package/dist/cjs/libs/kafka-message-context.js +11 -0
  49. package/dist/cjs/libs/topic-suffixes.d.ts +1 -0
  50. package/dist/cjs/libs/topic-suffixes.js +10 -0
  51. package/dist/cjs/package.json +3 -0
  52. package/dist/esm/configs/envs/index.d.ts +2 -0
  53. package/dist/esm/configs/envs/index.js +2 -0
  54. package/dist/esm/configs/envs/kafka-config.environment.d.ts +9 -0
  55. package/dist/esm/configs/envs/kafka-config.environment.js +60 -0
  56. package/dist/esm/configs/envs/kafka-consumer.environment.d.ts +3 -0
  57. package/dist/esm/configs/envs/kafka-consumer.environment.js +24 -0
  58. package/dist/esm/configs/index.d.ts +4 -0
  59. package/dist/esm/configs/index.js +4 -0
  60. package/dist/esm/configs/kafka-consumer.config.d.ts +9 -0
  61. package/dist/esm/configs/kafka-consumer.config.js +47 -0
  62. package/dist/esm/configs/kafka-producer.config.d.ts +7 -0
  63. package/dist/esm/configs/kafka-producer.config.js +38 -0
  64. package/dist/esm/configs/kafka.config.d.ts +7 -0
  65. package/dist/esm/configs/kafka.config.js +49 -0
  66. package/dist/esm/constants.d.ts +3 -0
  67. package/dist/esm/constants.js +3 -0
  68. package/dist/esm/event-contract-version.d.ts +5 -0
  69. package/dist/esm/event-contract-version.js +14 -0
  70. package/dist/esm/index.d.ts +7 -0
  71. package/dist/esm/index.js +7 -0
  72. package/dist/esm/kafka-commit-interceptor.d.ts +13 -0
  73. package/dist/esm/kafka-commit-interceptor.js +83 -0
  74. package/dist/esm/kafka-error-handler.d.ts +25 -0
  75. package/dist/esm/kafka-error-handler.js +115 -0
  76. package/dist/esm/kafka.module.d.ts +9 -0
  77. package/dist/esm/kafka.module.js +64 -0
  78. package/dist/esm/libs/consumer.abstract.d.ts +6 -0
  79. package/dist/esm/libs/consumer.abstract.js +10 -0
  80. package/dist/esm/libs/errors/consumers-error.d.ts +4 -0
  81. package/dist/esm/libs/errors/consumers-error.js +8 -0
  82. package/dist/esm/libs/errors/index.d.ts +1 -0
  83. package/dist/esm/libs/errors/index.js +1 -0
  84. package/dist/esm/libs/heartbeat-file-writer.d.ts +6 -0
  85. package/dist/esm/libs/heartbeat-file-writer.js +20 -0
  86. package/dist/esm/libs/index.d.ts +9 -0
  87. package/dist/esm/libs/index.js +9 -0
  88. package/dist/esm/libs/kafka-consumer-heartbeat.d.ts +3 -0
  89. package/dist/esm/libs/kafka-consumer-heartbeat.js +9 -0
  90. package/dist/esm/libs/kafka-consumer-server.d.ts +2 -0
  91. package/dist/esm/libs/kafka-consumer-server.js +18 -0
  92. package/dist/esm/libs/kafka-logger.d.ts +5 -0
  93. package/dist/esm/libs/kafka-logger.interface.d.ts +5 -0
  94. package/dist/esm/libs/kafka-logger.interface.js +1 -0
  95. package/dist/esm/libs/kafka-logger.js +23 -0
  96. package/dist/esm/libs/kafka-message-context.d.ts +6 -0
  97. package/dist/esm/libs/kafka-message-context.js +7 -0
  98. package/dist/esm/libs/topic-suffixes.d.ts +1 -0
  99. package/dist/esm/libs/topic-suffixes.js +6 -0
  100. package/package.json +85 -0
@@ -0,0 +1,25 @@
1
+ import { ClientKafka, KafkaContext } from '@nestjs/microservices';
2
+ import type { KafkaLoggerInterface } from './libs/kafka-logger.interface.js';
3
+ export interface KafkaErrorHandlerOptionsInterface {
4
+ baseDelayMs: number;
5
+ maxAttempts: number;
6
+ topicSuffix: {
7
+ dlq: string;
8
+ retry: string;
9
+ };
10
+ }
11
+ export declare class KafkaErrorHandler {
12
+ private readonly client;
13
+ private readonly logger;
14
+ private readonly options;
15
+ constructor(client: ClientKafka, logger: KafkaLoggerInterface, options: KafkaErrorHandlerOptionsInterface);
16
+ handleError(context: KafkaContext, error: Error, commit: () => Promise<void>): Promise<void>;
17
+ private buildPayload;
18
+ private headers;
19
+ private readAttempt;
20
+ private scheduleRetry;
21
+ private sendToDlq;
22
+ private stringifyKey;
23
+ private stringifyValue;
24
+ private stripRetrySuffixes;
25
+ }
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.KafkaErrorHandler = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const microservices_1 = require("@nestjs/microservices");
18
+ const rxjs_1 = require("rxjs");
19
+ const constants_js_1 = require("./constants.js");
20
+ let KafkaErrorHandler = class KafkaErrorHandler {
21
+ client;
22
+ logger;
23
+ options;
24
+ constructor(client, logger, options) {
25
+ this.client = client;
26
+ this.logger = logger;
27
+ this.options = options;
28
+ }
29
+ async handleError(context, error, commit) {
30
+ const message = context.getMessage();
31
+ const topic = context.getTopic();
32
+ const payload = this.buildPayload(message);
33
+ const attempt = this.readAttempt(message.headers ?? {});
34
+ const baseTopic = this.stripRetrySuffixes(topic);
35
+ const isRetryableError = !(error instanceof common_1.BadRequestException);
36
+ if (isRetryableError && attempt < this.options.maxAttempts) {
37
+ this.scheduleRetry({ attempt, baseTopic, commit, error, payload, topic });
38
+ return;
39
+ }
40
+ await this.sendToDlq({ baseTopic, commit, error, key: message.key, payload });
41
+ }
42
+ buildPayload(message) {
43
+ return {
44
+ headers: this.headers(message.headers ?? {}),
45
+ key: this.stringifyKey(message.key),
46
+ value: this.stringifyValue(message.value),
47
+ };
48
+ }
49
+ headers(headers) {
50
+ const flatHeaders = {};
51
+ for (const [key, value] of Object.entries(headers)) {
52
+ if (value !== undefined) {
53
+ flatHeaders[key] = typeof value === 'object' && !Buffer.isBuffer(value)
54
+ ? JSON.stringify(value)
55
+ : value;
56
+ }
57
+ }
58
+ return flatHeaders;
59
+ }
60
+ readAttempt(headers) {
61
+ const parsedAttempt = Number(headers['x-retry-attempt']?.toString());
62
+ return Number.isFinite(parsedAttempt) ? Math.trunc(parsedAttempt) : 0;
63
+ }
64
+ scheduleRetry(parameters) {
65
+ const { attempt, baseTopic, commit, error, payload, topic } = parameters;
66
+ const { baseDelayMs, maxAttempts, topicSuffix } = this.options;
67
+ const retryTopic = `${baseTopic}.${topicSuffix.retry}`;
68
+ const nextAttempt = attempt + 1;
69
+ const delayMs = baseDelayMs * 2 ** attempt;
70
+ payload.headers['x-retry-attempt'] = nextAttempt.toString();
71
+ payload.headers['x-retry-reason'] = error.message;
72
+ this.logger.warn({ errorContext: {
73
+ delayMs,
74
+ headers: payload.headers,
75
+ key: payload.key,
76
+ maxAttempts,
77
+ nextAttempt,
78
+ topic,
79
+ } }, `[Retry] Attempt ${nextAttempt}/${maxAttempts} for "${topic}". Waiting ${delayMs}ms...`);
80
+ setTimeout(async () => {
81
+ try {
82
+ await (0, rxjs_1.firstValueFrom)(this.client.emit(retryTopic, payload));
83
+ await commit();
84
+ }
85
+ catch (retryError) {
86
+ this.logger.error({ errorContext: { error: retryError, key: payload.key, topic: retryTopic } }, `[Retry] Failed to re-emit to "${retryTopic}": ${Error.isError(retryError) ? retryError.message : 'Unknown error'}`);
87
+ }
88
+ }, delayMs);
89
+ }
90
+ async sendToDlq(parameters) {
91
+ const { baseTopic, commit, error, key, payload } = parameters;
92
+ const dlqTopic = `${baseTopic}.${this.options.topicSuffix.dlq}`;
93
+ payload.headers['x-dlq-reason'] = error.message;
94
+ this.logger.error({ errorContext: { headers: payload.headers, key, topic: dlqTopic } }, `[DLQ] Send to "${dlqTopic}"`);
95
+ await (0, rxjs_1.firstValueFrom)(this.client.emit(dlqTopic, payload));
96
+ await commit();
97
+ }
98
+ stringifyKey(key) {
99
+ return typeof key === 'object' && !Buffer.isBuffer(key) ? JSON.stringify(key) : key;
100
+ }
101
+ stringifyValue(value) {
102
+ return typeof value === 'object' && !Buffer.isBuffer(value) ? JSON.stringify(value) : value;
103
+ }
104
+ stripRetrySuffixes(topic) {
105
+ const { topicSuffix } = this.options;
106
+ return topic
107
+ .replace(`.${topicSuffix.retry}`, '')
108
+ .replace(`.${topicSuffix.dlq}`, '');
109
+ }
110
+ };
111
+ exports.KafkaErrorHandler = KafkaErrorHandler;
112
+ exports.KafkaErrorHandler = KafkaErrorHandler = __decorate([
113
+ (0, common_1.Injectable)(),
114
+ __param(0, (0, common_1.Inject)(constants_js_1.KAFKA_PRODUCER)),
115
+ __param(1, (0, common_1.Inject)(constants_js_1.KAFKA_LOGGER)),
116
+ __param(2, (0, common_1.Inject)(constants_js_1.KAFKA_ERROR_HANDLER_OPTIONS)),
117
+ __metadata("design:paramtypes", [microservices_1.ClientKafka, Object, Object])
118
+ ], KafkaErrorHandler);
@@ -0,0 +1,9 @@
1
+ import { DynamicModule, Type } from '@nestjs/common';
2
+ import { KafkaErrorHandlerOptionsInterface } from './kafka-error-handler.js';
3
+ import { KafkaLoggerInterface } from './libs/kafka-logger.interface.js';
4
+ export declare class KafkaModule {
5
+ static forRootAsync(config: {
6
+ errorHandlerOptions?: Partial<KafkaErrorHandlerOptionsInterface>;
7
+ logger: Type<KafkaLoggerInterface>;
8
+ }): DynamicModule;
9
+ }
@@ -0,0 +1,67 @@
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.KafkaModule = void 0;
10
+ const nestjs_config_module_1 = require("@libs-for-dev/nestjs-config-module");
11
+ const common_1 = require("@nestjs/common");
12
+ const microservices_1 = require("@nestjs/microservices");
13
+ const kafka_config_environment_js_1 = require("./configs/envs/kafka-config.environment.js");
14
+ const kafka_producer_config_js_1 = require("./configs/kafka-producer.config.js");
15
+ const kafka_config_js_1 = require("./configs/kafka.config.js");
16
+ const constants_js_1 = require("./constants.js");
17
+ const kafka_commit_interceptor_js_1 = require("./kafka-commit-interceptor.js");
18
+ const kafka_error_handler_js_1 = require("./kafka-error-handler.js");
19
+ let KafkaModule = class KafkaModule {
20
+ static forRootAsync(config) {
21
+ return {
22
+ exports: [constants_js_1.KAFKA_LOGGER],
23
+ global: true,
24
+ module: this,
25
+ providers: [
26
+ {
27
+ provide: constants_js_1.KAFKA_ERROR_HANDLER_OPTIONS,
28
+ useValue: {
29
+ baseDelayMs: 500,
30
+ maxAttempts: 5,
31
+ topicSuffix: {
32
+ dlq: 'dlq',
33
+ retry: 'retry',
34
+ },
35
+ ...config.errorHandlerOptions,
36
+ },
37
+ },
38
+ {
39
+ provide: constants_js_1.KAFKA_LOGGER,
40
+ useClass: config.logger,
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ };
46
+ exports.KafkaModule = KafkaModule;
47
+ exports.KafkaModule = KafkaModule = __decorate([
48
+ (0, common_1.Module)({
49
+ exports: [kafka_commit_interceptor_js_1.KafkaCommitInterceptor, kafka_error_handler_js_1.KafkaErrorHandler],
50
+ imports: [
51
+ microservices_1.ClientsModule.registerAsync({
52
+ clients: [
53
+ {
54
+ imports: [nestjs_config_module_1.ConfigsModule.forFeature([kafka_producer_config_js_1.KafkaProducerConfig, kafka_config_js_1.KafkaConfig], [kafka_config_environment_js_1.KafkaConfigEnvironment])],
55
+ inject: [kafka_producer_config_js_1.KafkaProducerConfig],
56
+ name: constants_js_1.KAFKA_PRODUCER,
57
+ useFactory: (config) => config.getOptions(),
58
+ },
59
+ ],
60
+ }),
61
+ ],
62
+ providers: [
63
+ kafka_error_handler_js_1.KafkaErrorHandler,
64
+ kafka_commit_interceptor_js_1.KafkaCommitInterceptor,
65
+ ],
66
+ })
67
+ ], KafkaModule);
@@ -0,0 +1,6 @@
1
+ export interface HandlerInterface<TPayload = unknown> {
2
+ handle(payload: TPayload): Promise<void>;
3
+ }
4
+ export declare abstract class ConsumerAbstract {
5
+ protected handleAll<TPayload>(payload: TPayload, handlers: HandlerInterface<TPayload>[]): Promise<void>;
6
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsumerAbstract = void 0;
4
+ const consumers_error_js_1 = require("./errors/consumers-error.js");
5
+ class ConsumerAbstract {
6
+ async handleAll(payload, handlers) {
7
+ const results = await Promise.allSettled(handlers.map(async (handler) => handler.handle(payload)));
8
+ const rejectedResults = results.filter((result) => result.status === 'rejected');
9
+ if (rejectedResults.length > 0) {
10
+ throw new consumers_error_js_1.ConsumersError(rejectedResults.map((result) => result.reason));
11
+ }
12
+ }
13
+ }
14
+ exports.ConsumerAbstract = ConsumerAbstract;
@@ -0,0 +1,4 @@
1
+ export declare class ConsumersError extends Error {
2
+ readonly errors: Error[];
3
+ constructor(errors: Error[], options?: ErrorOptions);
4
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsumersError = void 0;
4
+ class ConsumersError extends Error {
5
+ errors;
6
+ constructor(errors, options) {
7
+ super(errors.map((error) => `${error.name}: "${error.message}"`).join('; '), options);
8
+ this.errors = errors;
9
+ this.name = 'ConsumersError';
10
+ }
11
+ }
12
+ exports.ConsumersError = ConsumersError;
@@ -0,0 +1 @@
1
+ export * from './consumers-error.js';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./consumers-error.js"), exports);
@@ -0,0 +1,6 @@
1
+ export declare class HeartbeatFileWriter {
2
+ private readonly filePath?;
3
+ constructor(filePath?: string | undefined);
4
+ static fromEnvironment(): HeartbeatFileWriter;
5
+ touch(): Promise<void>;
6
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HeartbeatFileWriter = void 0;
4
+ const promises_1 = require("node:fs/promises");
5
+ class HeartbeatFileWriter {
6
+ filePath;
7
+ constructor(filePath) {
8
+ this.filePath = filePath;
9
+ }
10
+ static fromEnvironment() {
11
+ return new HeartbeatFileWriter(process.env.HEARTBEAT_FILE);
12
+ }
13
+ async touch() {
14
+ if (this.filePath === undefined || this.filePath === '') {
15
+ return;
16
+ }
17
+ try {
18
+ await (0, promises_1.writeFile)(this.filePath, String(Date.now()));
19
+ }
20
+ catch {
21
+ }
22
+ }
23
+ }
24
+ exports.HeartbeatFileWriter = HeartbeatFileWriter;
@@ -0,0 +1,9 @@
1
+ export * from './errors/index.js';
2
+ export * from './consumer.abstract.js';
3
+ export * from './heartbeat-file-writer.js';
4
+ export * from './kafka-consumer-heartbeat.js';
5
+ export * from './kafka-consumer-server.js';
6
+ export * from './kafka-logger.js';
7
+ export * from './kafka-logger.interface.js';
8
+ export * from './kafka-message-context.js';
9
+ export * from './topic-suffixes.js';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./errors/index.js"), exports);
18
+ __exportStar(require("./consumer.abstract.js"), exports);
19
+ __exportStar(require("./heartbeat-file-writer.js"), exports);
20
+ __exportStar(require("./kafka-consumer-heartbeat.js"), exports);
21
+ __exportStar(require("./kafka-consumer-server.js"), exports);
22
+ __exportStar(require("./kafka-logger.js"), exports);
23
+ __exportStar(require("./kafka-logger.interface.js"), exports);
24
+ __exportStar(require("./kafka-message-context.js"), exports);
25
+ __exportStar(require("./topic-suffixes.js"), exports);
@@ -0,0 +1,3 @@
1
+ import type { Consumer } from 'kafkajs';
2
+ import type { HeartbeatFileWriter } from './heartbeat-file-writer.js';
3
+ export declare const wireKafkaConsumerHeartbeat: (consumer: Consumer, heartbeat: HeartbeatFileWriter) => void;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.wireKafkaConsumerHeartbeat = void 0;
4
+ const wireKafkaConsumerHeartbeat = (consumer, heartbeat) => {
5
+ void heartbeat.touch();
6
+ consumer.on(consumer.events.HEARTBEAT, () => {
7
+ void heartbeat.touch();
8
+ });
9
+ consumer.on(consumer.events.GROUP_JOIN, () => {
10
+ void heartbeat.touch();
11
+ });
12
+ };
13
+ exports.wireKafkaConsumerHeartbeat = wireKafkaConsumerHeartbeat;
@@ -0,0 +1,2 @@
1
+ import type { DynamicModule, Type } from '@nestjs/common';
2
+ export declare const kafkaConsumerServer: (module: DynamicModule | Type, loggerModule: Type) => Promise<void>;
@@ -0,0 +1,25 @@
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.kafkaConsumerServer = void 0;
7
+ const nestjs_config_module_1 = require("@libs-for-dev/nestjs-config-module");
8
+ const core_1 = require("@nestjs/core");
9
+ const node_process_1 = __importDefault(require("node:process"));
10
+ const kafka_config_environment_js_1 = require("../configs/envs/kafka-config.environment.js");
11
+ const kafka_consumer_environment_js_1 = require("../configs/envs/kafka-consumer.environment.js");
12
+ const kafka_consumer_config_js_1 = require("../configs/kafka-consumer.config.js");
13
+ const kafka_config_js_1 = require("../configs/kafka.config.js");
14
+ const heartbeat_file_writer_js_1 = require("./heartbeat-file-writer.js");
15
+ const kafka_consumer_heartbeat_js_1 = require("./kafka-consumer-heartbeat.js");
16
+ const kafkaConsumerServer = async (module, loggerModule) => {
17
+ const kafkaConsumerConfig = new kafka_consumer_config_js_1.KafkaConsumerConfig(new kafka_config_js_1.KafkaConfig((0, nestjs_config_module_1.exposeObjectWithValidation)(node_process_1.default.env, kafka_config_environment_js_1.KafkaConfigEnvironment)), (0, nestjs_config_module_1.exposeObjectWithValidation)(node_process_1.default.env, kafka_consumer_environment_js_1.KafkaConsumerEnvironment));
18
+ const app = await core_1.NestFactory.createMicroservice(module, kafkaConsumerConfig.getOptions());
19
+ const logger = app.get(loggerModule);
20
+ app.useLogger(logger);
21
+ await app.listen();
22
+ const [, consumer] = app.unwrap();
23
+ (0, kafka_consumer_heartbeat_js_1.wireKafkaConsumerHeartbeat)(consumer, heartbeat_file_writer_js_1.HeartbeatFileWriter.fromEnvironment());
24
+ };
25
+ exports.kafkaConsumerServer = kafkaConsumerServer;
@@ -0,0 +1,5 @@
1
+ import * as nestjsPino from 'nestjs-pino';
2
+ import type { KafkaLoggerInterface } from './kafka-logger.interface.js';
3
+ export declare class KafkaLogger extends nestjsPino.PinoLogger implements KafkaLoggerInterface {
4
+ constructor(options: nestjsPino.Params);
5
+ }
@@ -0,0 +1,5 @@
1
+ export interface KafkaLoggerInterface {
2
+ error(context: unknown, message: string): void;
3
+ info(context: unknown, message: string): void;
4
+ warn(context: unknown, message: string): void;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var KafkaLogger_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.KafkaLogger = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const nestjsPino = __importStar(require("nestjs-pino"));
49
+ let KafkaLogger = KafkaLogger_1 = class KafkaLogger extends nestjsPino.PinoLogger {
50
+ constructor(options) {
51
+ super(options);
52
+ this.setContext(KafkaLogger_1.name);
53
+ }
54
+ };
55
+ exports.KafkaLogger = KafkaLogger;
56
+ exports.KafkaLogger = KafkaLogger = KafkaLogger_1 = __decorate([
57
+ (0, common_1.Injectable)(),
58
+ __metadata("design:paramtypes", [Object])
59
+ ], KafkaLogger);
@@ -0,0 +1,6 @@
1
+ export interface KafkaMessageContextInterface {
2
+ getMessage(): {
3
+ headers?: Record<string, unknown> | undefined;
4
+ };
5
+ }
6
+ export declare const eventIdOf: (context: KafkaMessageContextInterface) => null | string;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventIdOf = void 0;
4
+ const eventIdOf = (context) => {
5
+ const raw = context.getMessage().headers?.id;
6
+ if (Buffer.isBuffer(raw)) {
7
+ return raw.toString('utf8');
8
+ }
9
+ return typeof raw === 'string' && raw !== '' ? raw : null;
10
+ };
11
+ exports.eventIdOf = eventIdOf;
@@ -0,0 +1 @@
1
+ export declare const eventTopics: (queueName: string, version?: string) => string[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventTopics = void 0;
4
+ const event_contract_version_js_1 = require("../event-contract-version.js");
5
+ const RETRY_TOPIC_SUFFIX = 'retry';
6
+ const eventTopics = (queueName, version = event_contract_version_js_1.DEFAULT_EVENT_VERSION) => {
7
+ const baseTopic = `events.${(0, event_contract_version_js_1.versionedQueueName)(queueName, version)}`;
8
+ return [baseTopic, `${baseTopic}.${RETRY_TOPIC_SUFFIX}`];
9
+ };
10
+ exports.eventTopics = eventTopics;
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,2 @@
1
+ export * from './kafka-config.environment.js';
2
+ export * from './kafka-consumer.environment.js';
@@ -0,0 +1,2 @@
1
+ export * from './kafka-config.environment.js';
2
+ export * from './kafka-consumer.environment.js';
@@ -0,0 +1,9 @@
1
+ import { logLevel } from '@nestjs/microservices/external/kafka.interface.js';
2
+ export declare class KafkaConfigEnvironment {
3
+ KAFKA_BROKERS: string;
4
+ KAFKA_CLIENT_ID: string;
5
+ KAFKA_LOG_LEVEL: keyof typeof logLevel;
6
+ KAFKA_SASL_PASSWORD?: string;
7
+ KAFKA_SASL_USERNAME?: string;
8
+ KAFKA_SSL_CA_FILE?: string;
9
+ }
@@ -0,0 +1,60 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Expose } from 'class-transformer';
11
+ import { IsEnum, IsOptional, IsString } from 'class-validator';
12
+ var KafkaLogLevel;
13
+ (function (KafkaLogLevel) {
14
+ KafkaLogLevel["DEBUG"] = "DEBUG";
15
+ KafkaLogLevel["ERROR"] = "ERROR";
16
+ KafkaLogLevel["INFO"] = "INFO";
17
+ KafkaLogLevel["NOTHING"] = "NOTHING";
18
+ KafkaLogLevel["WARN"] = "WARN";
19
+ })(KafkaLogLevel || (KafkaLogLevel = {}));
20
+ export class KafkaConfigEnvironment {
21
+ KAFKA_BROKERS;
22
+ KAFKA_CLIENT_ID;
23
+ KAFKA_LOG_LEVEL = KafkaLogLevel.INFO;
24
+ KAFKA_SASL_PASSWORD;
25
+ KAFKA_SASL_USERNAME;
26
+ KAFKA_SSL_CA_FILE;
27
+ }
28
+ __decorate([
29
+ Expose(),
30
+ IsString(),
31
+ __metadata("design:type", String)
32
+ ], KafkaConfigEnvironment.prototype, "KAFKA_BROKERS", void 0);
33
+ __decorate([
34
+ Expose(),
35
+ IsString(),
36
+ __metadata("design:type", String)
37
+ ], KafkaConfigEnvironment.prototype, "KAFKA_CLIENT_ID", void 0);
38
+ __decorate([
39
+ Expose(),
40
+ IsEnum(KafkaLogLevel),
41
+ __metadata("design:type", Object)
42
+ ], KafkaConfigEnvironment.prototype, "KAFKA_LOG_LEVEL", void 0);
43
+ __decorate([
44
+ Expose(),
45
+ IsOptional(),
46
+ IsString(),
47
+ __metadata("design:type", String)
48
+ ], KafkaConfigEnvironment.prototype, "KAFKA_SASL_PASSWORD", void 0);
49
+ __decorate([
50
+ Expose(),
51
+ IsOptional(),
52
+ IsString(),
53
+ __metadata("design:type", String)
54
+ ], KafkaConfigEnvironment.prototype, "KAFKA_SASL_USERNAME", void 0);
55
+ __decorate([
56
+ Expose(),
57
+ IsOptional(),
58
+ IsString(),
59
+ __metadata("design:type", String)
60
+ ], KafkaConfigEnvironment.prototype, "KAFKA_SSL_CA_FILE", void 0);
@@ -0,0 +1,3 @@
1
+ export declare class KafkaConsumerEnvironment {
2
+ KAFKA_GROUP_ID: string;
3
+ }
@@ -0,0 +1,24 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@nestjs/common';
11
+ import { Expose } from 'class-transformer';
12
+ import { IsString } from 'class-validator';
13
+ let KafkaConsumerEnvironment = class KafkaConsumerEnvironment {
14
+ KAFKA_GROUP_ID;
15
+ };
16
+ __decorate([
17
+ Expose(),
18
+ IsString(),
19
+ __metadata("design:type", String)
20
+ ], KafkaConsumerEnvironment.prototype, "KAFKA_GROUP_ID", void 0);
21
+ KafkaConsumerEnvironment = __decorate([
22
+ Injectable()
23
+ ], KafkaConsumerEnvironment);
24
+ export { KafkaConsumerEnvironment };
@@ -0,0 +1,4 @@
1
+ export * from './envs/index.js';
2
+ export * from './kafka-consumer.config.js';
3
+ export * from './kafka-producer.config.js';
4
+ export * from './kafka.config.js';
@@ -0,0 +1,4 @@
1
+ export * from './envs/index.js';
2
+ export * from './kafka-consumer.config.js';
3
+ export * from './kafka-producer.config.js';
4
+ export * from './kafka.config.js';