@loipv/nestjs-kafka 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +377 -0
- package/dist/consumer.module.d.ts +10 -0
- package/dist/consumer.module.js +38 -0
- package/dist/consumer.module.js.map +1 -0
- package/dist/decorators/constants.d.ts +1 -0
- package/dist/decorators/constants.js +5 -0
- package/dist/decorators/constants.js.map +1 -0
- package/dist/decorators/consumer.decorator.d.ts +8 -0
- package/dist/decorators/consumer.decorator.js +16 -0
- package/dist/decorators/consumer.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +2 -0
- package/dist/decorators/index.js +21 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/discovery/consumer-discovery.service.d.ts +14 -0
- package/dist/discovery/consumer-discovery.service.js +82 -0
- package/dist/discovery/consumer-discovery.service.js.map +1 -0
- package/dist/discovery/index.d.ts +1 -0
- package/dist/discovery/index.js +18 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/health/index.d.ts +1 -0
- package/dist/health/index.js +18 -0
- package/dist/health/index.js.map +1 -0
- package/dist/health/kafka-health-indicator.d.ts +12 -0
- package/dist/health/kafka-health-indicator.js +98 -0
- package/dist/health/kafka-health-indicator.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/consumer-options.interface.d.ts +52 -0
- package/dist/interfaces/consumer-options.interface.js +3 -0
- package/dist/interfaces/consumer-options.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +3 -0
- package/dist/interfaces/index.js +20 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/kafka-module-options.interface.d.ts +43 -0
- package/dist/interfaces/kafka-module-options.interface.js +5 -0
- package/dist/interfaces/kafka-module-options.interface.js.map +1 -0
- package/dist/interfaces/message.interface.d.ts +26 -0
- package/dist/interfaces/message.interface.js +3 -0
- package/dist/interfaces/message.interface.js.map +1 -0
- package/dist/kafka.module.d.ts +7 -0
- package/dist/kafka.module.js +97 -0
- package/dist/kafka.module.js.map +1 -0
- package/dist/services/batch-processor.service.d.ts +16 -0
- package/dist/services/batch-processor.service.js +102 -0
- package/dist/services/batch-processor.service.js.map +1 -0
- package/dist/services/consumer-registry.service.d.ts +27 -0
- package/dist/services/consumer-registry.service.js +195 -0
- package/dist/services/consumer-registry.service.js.map +1 -0
- package/dist/services/dlq.service.d.ts +14 -0
- package/dist/services/dlq.service.js +90 -0
- package/dist/services/dlq.service.js.map +1 -0
- package/dist/services/idempotency.service.d.ts +16 -0
- package/dist/services/idempotency.service.js +76 -0
- package/dist/services/idempotency.service.js.map +1 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.js +24 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/kafka-client.service.d.ts +31 -0
- package/dist/services/kafka-client.service.js +183 -0
- package/dist/services/kafka-client.service.js.map +1 -0
- package/dist/services/kafka-core.service.d.ts +13 -0
- package/dist/services/kafka-core.service.js +87 -0
- package/dist/services/kafka-core.service.js.map +1 -0
- package/dist/services/pressure-manager.service.d.ts +14 -0
- package/dist/services/pressure-manager.service.js +75 -0
- package/dist/services/pressure-manager.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,98 @@
|
|
|
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.KafkaHealthIndicator = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const terminus_1 = require("@nestjs/terminus");
|
|
15
|
+
const kafka_client_service_1 = require("../services/kafka-client.service");
|
|
16
|
+
const kafka_core_service_1 = require("../services/kafka-core.service");
|
|
17
|
+
let KafkaHealthIndicator = class KafkaHealthIndicator {
|
|
18
|
+
healthIndicatorService;
|
|
19
|
+
kafkaClient;
|
|
20
|
+
kafkaCore;
|
|
21
|
+
constructor(healthIndicatorService, kafkaClient, kafkaCore) {
|
|
22
|
+
this.healthIndicatorService = healthIndicatorService;
|
|
23
|
+
this.kafkaClient = kafkaClient;
|
|
24
|
+
this.kafkaCore = kafkaCore;
|
|
25
|
+
}
|
|
26
|
+
isHealthy(key) {
|
|
27
|
+
const indicator = this.healthIndicatorService.check(key);
|
|
28
|
+
const isHealthy = this.kafkaClient.isHealthy();
|
|
29
|
+
if (isHealthy) {
|
|
30
|
+
return indicator.up({ connected: true });
|
|
31
|
+
}
|
|
32
|
+
return indicator.down({
|
|
33
|
+
connected: false,
|
|
34
|
+
message: 'Kafka producer is not connected',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async checkBrokers(key) {
|
|
38
|
+
const indicator = this.healthIndicatorService.check(key);
|
|
39
|
+
try {
|
|
40
|
+
const admin = this.kafkaCore.getKafka().admin();
|
|
41
|
+
await admin.connect();
|
|
42
|
+
const clusterInfo = await admin.describeCluster();
|
|
43
|
+
await admin.disconnect();
|
|
44
|
+
return indicator.up({
|
|
45
|
+
brokers: clusterInfo.brokers.length,
|
|
46
|
+
controller: clusterInfo.controller,
|
|
47
|
+
clusterId: clusterInfo.clusterId,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
return indicator.down({
|
|
52
|
+
error: error.message,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async checkConsumerLag(key, groupId, maxLag = 1000) {
|
|
57
|
+
const indicator = this.healthIndicatorService.check(key);
|
|
58
|
+
try {
|
|
59
|
+
const admin = this.kafkaCore.getKafka().admin();
|
|
60
|
+
await admin.connect();
|
|
61
|
+
const offsets = await admin.fetchOffsets({ groupId });
|
|
62
|
+
await admin.disconnect();
|
|
63
|
+
let totalLag = 0;
|
|
64
|
+
for (const topicOffset of offsets) {
|
|
65
|
+
for (const partition of topicOffset.partitions) {
|
|
66
|
+
const offset = parseInt(partition.offset, 10);
|
|
67
|
+
totalLag += Math.max(0, offset);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const isHealthy = totalLag < maxLag;
|
|
71
|
+
if (isHealthy) {
|
|
72
|
+
return indicator.up({
|
|
73
|
+
groupId,
|
|
74
|
+
lag: totalLag,
|
|
75
|
+
maxLag,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return indicator.down({
|
|
79
|
+
groupId,
|
|
80
|
+
lag: totalLag,
|
|
81
|
+
maxLag,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return indicator.down({
|
|
86
|
+
error: error.message,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
exports.KafkaHealthIndicator = KafkaHealthIndicator;
|
|
92
|
+
exports.KafkaHealthIndicator = KafkaHealthIndicator = __decorate([
|
|
93
|
+
(0, common_1.Injectable)(),
|
|
94
|
+
__metadata("design:paramtypes", [terminus_1.HealthIndicatorService,
|
|
95
|
+
kafka_client_service_1.KafkaClient,
|
|
96
|
+
kafka_core_service_1.KafkaCoreService])
|
|
97
|
+
], KafkaHealthIndicator);
|
|
98
|
+
//# sourceMappingURL=kafka-health-indicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka-health-indicator.js","sourceRoot":"","sources":["../../lib/health/kafka-health-indicator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { KafkaModule } from './kafka.module';
|
|
2
|
+
export { ConsumerModule } from './consumer.module';
|
|
3
|
+
export { Consumer } from './decorators';
|
|
4
|
+
export { KafkaClient } from './services/kafka-client.service';
|
|
5
|
+
export { KafkaHealthIndicator } from './health/kafka-health-indicator';
|
|
6
|
+
export * from './interfaces';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
exports.KafkaHealthIndicator = exports.KafkaClient = exports.Consumer = exports.ConsumerModule = exports.KafkaModule = void 0;
|
|
18
|
+
var kafka_module_1 = require("./kafka.module");
|
|
19
|
+
Object.defineProperty(exports, "KafkaModule", { enumerable: true, get: function () { return kafka_module_1.KafkaModule; } });
|
|
20
|
+
var consumer_module_1 = require("./consumer.module");
|
|
21
|
+
Object.defineProperty(exports, "ConsumerModule", { enumerable: true, get: function () { return consumer_module_1.ConsumerModule; } });
|
|
22
|
+
var decorators_1 = require("./decorators");
|
|
23
|
+
Object.defineProperty(exports, "Consumer", { enumerable: true, get: function () { return decorators_1.Consumer; } });
|
|
24
|
+
var kafka_client_service_1 = require("./services/kafka-client.service");
|
|
25
|
+
Object.defineProperty(exports, "KafkaClient", { enumerable: true, get: function () { return kafka_client_service_1.KafkaClient; } });
|
|
26
|
+
var kafka_health_indicator_1 = require("./health/kafka-health-indicator");
|
|
27
|
+
Object.defineProperty(exports, "KafkaHealthIndicator", { enumerable: true, get: function () { return kafka_health_indicator_1.KafkaHealthIndicator; } });
|
|
28
|
+
__exportStar(require("./interfaces"), exports);
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAGvB,2CAAwC;AAA/B,sGAAA,QAAQ,OAAA;AAGjB,wEAA8D;AAArD,mHAAA,WAAW,OAAA;AAGpB,0EAAuE;AAA9D,8HAAA,oBAAoB,OAAA;AAG7B,+CAA6B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { KafkaMessage } from 'kafkajs';
|
|
2
|
+
export interface DlqOptions {
|
|
3
|
+
topic: string;
|
|
4
|
+
maxRetries?: number;
|
|
5
|
+
retryDelay?: number;
|
|
6
|
+
retryBackoffMultiplier?: number;
|
|
7
|
+
includeOriginalHeaders?: boolean;
|
|
8
|
+
includeErrorInfo?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ConsumerOptions {
|
|
11
|
+
topic?: string;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
groupId?: string;
|
|
14
|
+
sessionTimeout?: number;
|
|
15
|
+
heartbeatInterval?: number;
|
|
16
|
+
rebalanceTimeout?: number;
|
|
17
|
+
batch?: boolean;
|
|
18
|
+
batchSize?: number;
|
|
19
|
+
batchTimeout?: number;
|
|
20
|
+
groupByKey?: boolean;
|
|
21
|
+
maxConcurrency?: number;
|
|
22
|
+
partitionsConsumedConcurrently?: number;
|
|
23
|
+
backPressureThreshold?: number;
|
|
24
|
+
maxQueueSize?: number;
|
|
25
|
+
idempotencyKey?: (message: KafkaMessage) => string | undefined;
|
|
26
|
+
idempotencyTtl?: number;
|
|
27
|
+
dlq?: DlqOptions;
|
|
28
|
+
autoCommit?: boolean;
|
|
29
|
+
autoCommitInterval?: number;
|
|
30
|
+
autoCommitThreshold?: number;
|
|
31
|
+
fromBeginning?: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ConsumerMetadata {
|
|
34
|
+
topic: string;
|
|
35
|
+
options: ConsumerOptions;
|
|
36
|
+
target: any;
|
|
37
|
+
methodName: string;
|
|
38
|
+
}
|
|
39
|
+
export interface PressureState {
|
|
40
|
+
isPaused: boolean;
|
|
41
|
+
currentQueueSize: number;
|
|
42
|
+
maxQueueSize: number;
|
|
43
|
+
currentConcurrency: number;
|
|
44
|
+
maxConcurrency: number;
|
|
45
|
+
utilizationPercent: number;
|
|
46
|
+
}
|
|
47
|
+
export interface PressureManagerOptions {
|
|
48
|
+
backPressureThreshold: number;
|
|
49
|
+
resumeThreshold: number;
|
|
50
|
+
maxQueueSize: number;
|
|
51
|
+
checkIntervalMs: number;
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer-options.interface.js","sourceRoot":"","sources":["../../lib/interfaces/consumer-options.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
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("./kafka-module-options.interface"), exports);
|
|
18
|
+
__exportStar(require("./consumer-options.interface"), exports);
|
|
19
|
+
__exportStar(require("./message.interface"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mEAAiD;AACjD,+DAA6C;AAC7C,sDAAoC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ModuleMetadata, Type } from '@nestjs/common';
|
|
2
|
+
import { SASLOptions } from 'kafkajs';
|
|
3
|
+
export interface RetryOptions {
|
|
4
|
+
initialRetryTime?: number;
|
|
5
|
+
retries?: number;
|
|
6
|
+
maxRetryTime?: number;
|
|
7
|
+
factor?: number;
|
|
8
|
+
multiplier?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ProducerConfig {
|
|
11
|
+
createPartitioner?: () => any;
|
|
12
|
+
retry?: RetryOptions;
|
|
13
|
+
metadataMaxAge?: number;
|
|
14
|
+
allowAutoTopicCreation?: boolean;
|
|
15
|
+
idempotent?: boolean;
|
|
16
|
+
transactionalId?: string;
|
|
17
|
+
transactionTimeout?: number;
|
|
18
|
+
maxInFlightRequests?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface KafkaModuleOptions {
|
|
21
|
+
clientId: string;
|
|
22
|
+
brokers: string[] | (() => string[] | Promise<string[]>);
|
|
23
|
+
ssl?: boolean | object;
|
|
24
|
+
sasl?: SASLOptions;
|
|
25
|
+
connectionTimeout?: number;
|
|
26
|
+
requestTimeout?: number;
|
|
27
|
+
enforceRequestTimeout?: boolean;
|
|
28
|
+
retry?: RetryOptions;
|
|
29
|
+
producer?: ProducerConfig;
|
|
30
|
+
defaultConsumerGroupId?: string;
|
|
31
|
+
logLevel?: 'NOTHING' | 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
|
|
32
|
+
}
|
|
33
|
+
export interface KafkaModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
34
|
+
useFactory?: (...args: any[]) => Promise<KafkaModuleOptions> | KafkaModuleOptions;
|
|
35
|
+
inject?: any[];
|
|
36
|
+
useClass?: Type<KafkaOptionsFactory>;
|
|
37
|
+
useExisting?: Type<KafkaOptionsFactory>;
|
|
38
|
+
global?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface KafkaOptionsFactory {
|
|
41
|
+
createKafkaOptions(): Promise<KafkaModuleOptions> | KafkaModuleOptions;
|
|
42
|
+
}
|
|
43
|
+
export declare const KAFKA_MODULE_OPTIONS: unique symbol;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka-module-options.interface.js","sourceRoot":"","sources":["../../lib/interfaces/kafka-module-options.interface.ts"],"names":[],"mappings":";;;AA2Da,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { IHeaders } from 'kafkajs';
|
|
2
|
+
export interface KafkaMessagePayload<T = any> {
|
|
3
|
+
key?: string | Buffer | null;
|
|
4
|
+
value: T;
|
|
5
|
+
headers?: IHeaders;
|
|
6
|
+
partition?: number;
|
|
7
|
+
timestamp?: string;
|
|
8
|
+
offset?: string;
|
|
9
|
+
topic?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ProducerMessage {
|
|
12
|
+
key?: string | Buffer | null;
|
|
13
|
+
value: string | Buffer | object | null;
|
|
14
|
+
headers?: IHeaders;
|
|
15
|
+
partition?: number;
|
|
16
|
+
timestamp?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SendOptions {
|
|
19
|
+
acks?: -1 | 0 | 1;
|
|
20
|
+
timeout?: number;
|
|
21
|
+
compression?: 0 | 1 | 2 | 3 | 4;
|
|
22
|
+
}
|
|
23
|
+
export interface GroupedBatch<T = any> {
|
|
24
|
+
key: string;
|
|
25
|
+
messages: KafkaMessagePayload<T>[];
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.interface.js","sourceRoot":"","sources":["../../lib/interfaces/message.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { KafkaModuleOptions, KafkaModuleAsyncOptions } from './interfaces';
|
|
3
|
+
export declare class KafkaModule {
|
|
4
|
+
static forRoot(options: KafkaModuleOptions): DynamicModule;
|
|
5
|
+
static forRootAsync(options: KafkaModuleAsyncOptions): DynamicModule;
|
|
6
|
+
private static createAsyncProviders;
|
|
7
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
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 KafkaModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.KafkaModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const core_1 = require("@nestjs/core");
|
|
13
|
+
const interfaces_1 = require("./interfaces");
|
|
14
|
+
const kafka_core_service_1 = require("./services/kafka-core.service");
|
|
15
|
+
const kafka_client_service_1 = require("./services/kafka-client.service");
|
|
16
|
+
const consumer_discovery_service_1 = require("./discovery/consumer-discovery.service");
|
|
17
|
+
const consumer_registry_service_1 = require("./services/consumer-registry.service");
|
|
18
|
+
const batch_processor_service_1 = require("./services/batch-processor.service");
|
|
19
|
+
const idempotency_service_1 = require("./services/idempotency.service");
|
|
20
|
+
const pressure_manager_service_1 = require("./services/pressure-manager.service");
|
|
21
|
+
const dlq_service_1 = require("./services/dlq.service");
|
|
22
|
+
const kafka_health_indicator_1 = require("./health/kafka-health-indicator");
|
|
23
|
+
let KafkaModule = KafkaModule_1 = class KafkaModule {
|
|
24
|
+
static forRoot(options) {
|
|
25
|
+
const optionsProvider = {
|
|
26
|
+
provide: interfaces_1.KAFKA_MODULE_OPTIONS,
|
|
27
|
+
useValue: options,
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
module: KafkaModule_1,
|
|
31
|
+
imports: [core_1.DiscoveryModule],
|
|
32
|
+
providers: [
|
|
33
|
+
optionsProvider,
|
|
34
|
+
kafka_core_service_1.KafkaCoreService,
|
|
35
|
+
kafka_client_service_1.KafkaClient,
|
|
36
|
+
consumer_discovery_service_1.ConsumerDiscoveryService,
|
|
37
|
+
consumer_registry_service_1.ConsumerRegistryService,
|
|
38
|
+
batch_processor_service_1.BatchProcessorService,
|
|
39
|
+
idempotency_service_1.IdempotencyService,
|
|
40
|
+
pressure_manager_service_1.PressureManagerService,
|
|
41
|
+
dlq_service_1.DlqService,
|
|
42
|
+
kafka_health_indicator_1.KafkaHealthIndicator,
|
|
43
|
+
],
|
|
44
|
+
exports: [kafka_client_service_1.KafkaClient, kafka_health_indicator_1.KafkaHealthIndicator, interfaces_1.KAFKA_MODULE_OPTIONS],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
static forRootAsync(options) {
|
|
48
|
+
const asyncProviders = this.createAsyncProviders(options);
|
|
49
|
+
return {
|
|
50
|
+
module: KafkaModule_1,
|
|
51
|
+
imports: [...(options.imports || []), core_1.DiscoveryModule],
|
|
52
|
+
providers: [
|
|
53
|
+
...asyncProviders,
|
|
54
|
+
kafka_core_service_1.KafkaCoreService,
|
|
55
|
+
kafka_client_service_1.KafkaClient,
|
|
56
|
+
consumer_discovery_service_1.ConsumerDiscoveryService,
|
|
57
|
+
consumer_registry_service_1.ConsumerRegistryService,
|
|
58
|
+
batch_processor_service_1.BatchProcessorService,
|
|
59
|
+
idempotency_service_1.IdempotencyService,
|
|
60
|
+
pressure_manager_service_1.PressureManagerService,
|
|
61
|
+
dlq_service_1.DlqService,
|
|
62
|
+
kafka_health_indicator_1.KafkaHealthIndicator,
|
|
63
|
+
],
|
|
64
|
+
exports: [kafka_client_service_1.KafkaClient, kafka_health_indicator_1.KafkaHealthIndicator, interfaces_1.KAFKA_MODULE_OPTIONS],
|
|
65
|
+
global: options.global ?? true,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
static createAsyncProviders(options) {
|
|
69
|
+
if (options.useFactory) {
|
|
70
|
+
return [
|
|
71
|
+
{
|
|
72
|
+
provide: interfaces_1.KAFKA_MODULE_OPTIONS,
|
|
73
|
+
useFactory: options.useFactory,
|
|
74
|
+
inject: options.inject || [],
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
const useClass = options.useClass || options.useExisting;
|
|
79
|
+
if (!useClass) {
|
|
80
|
+
throw new Error('Invalid KafkaModuleAsyncOptions');
|
|
81
|
+
}
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
provide: interfaces_1.KAFKA_MODULE_OPTIONS,
|
|
85
|
+
useFactory: async (optionsFactory) => await optionsFactory.createKafkaOptions(),
|
|
86
|
+
inject: [useClass],
|
|
87
|
+
},
|
|
88
|
+
...(options.useClass ? [{ provide: useClass, useClass }] : []),
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
exports.KafkaModule = KafkaModule;
|
|
93
|
+
exports.KafkaModule = KafkaModule = KafkaModule_1 = __decorate([
|
|
94
|
+
(0, common_1.Global)(),
|
|
95
|
+
(0, common_1.Module)({})
|
|
96
|
+
], KafkaModule);
|
|
97
|
+
//# sourceMappingURL=kafka.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kafka.module.js","sourceRoot":"","sources":["../lib/kafka.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AACzE,uCAA+C;AAC/C,6CAKsB;AACtB,sEAAiE;AACjE,0EAA8D;AAC9D,uFAAkF;AAClF,oFAA+E;AAC/E,gFAA2E;AAC3E,wEAAoE;AACpE,kFAA6E;AAC7E,wDAAoD;AACpD,4EAAuE;AAIhE,IAAM,WAAW,mBAAjB,MAAM,WAAW;IACtB,MAAM,CAAC,OAAO,CAAC,OAA2B;QACxC,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,iCAAoB;YAC7B,QAAQ,EAAE,OAAO;SAClB,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,sBAAe,CAAC;YAC1B,SAAS,EAAE;gBACT,eAAe;gBACf,qCAAgB;gBAChB,kCAAW;gBACX,qDAAwB;gBACxB,mDAAuB;gBACvB,+CAAqB;gBACrB,wCAAkB;gBAClB,iDAAsB;gBACtB,wBAAU;gBACV,6CAAoB;aACrB;YACD,OAAO,EAAE,CAAC,kCAAW,EAAE,6CAAoB,EAAE,iCAAoB,CAAC;SACnE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAE1D,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,sBAAe,CAAC;YACtD,SAAS,EAAE;gBACT,GAAG,cAAc;gBACjB,qCAAgB;gBAChB,kCAAW;gBACX,qDAAwB;gBACxB,mDAAuB;gBACvB,+CAAqB;gBACrB,wCAAkB;gBAClB,iDAAsB;gBACtB,wBAAU;gBACV,6CAAoB;aACrB;YACD,OAAO,EAAE,CAAC,kCAAW,EAAE,6CAAoB,EAAE,iCAAoB,CAAC;YAClE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;SAC/B,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,oBAAoB,CACjC,OAAgC;QAEhC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO;gBACL;oBACE,OAAO,EAAE,iCAAoB;oBAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;iBAC7B;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL;gBACE,OAAO,EAAE,iCAAoB;gBAC7B,UAAU,EAAE,KAAK,EAAE,cAAmC,EAAE,EAAE,CACxD,MAAM,cAAc,CAAC,kBAAkB,EAAE;gBAC3C,MAAM,EAAE,CAAC,QAAQ,CAAC;aACnB;YACD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC;IACJ,CAAC;CACF,CAAA;AA7EY,kCAAW;sBAAX,WAAW;IAFvB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,WAAW,CA6EvB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { KafkaMessage, EachBatchPayload } from 'kafkajs';
|
|
2
|
+
import { ConsumerOptions, GroupedBatch } from '../interfaces';
|
|
3
|
+
interface BatchAccumulator {
|
|
4
|
+
add: (message: KafkaMessage) => Promise<void>;
|
|
5
|
+
onFlush: (callback: (messages: KafkaMessage[]) => Promise<void>) => void;
|
|
6
|
+
flush: () => Promise<void>;
|
|
7
|
+
size: () => number;
|
|
8
|
+
}
|
|
9
|
+
export declare class BatchProcessorService {
|
|
10
|
+
private readonly logger;
|
|
11
|
+
createBatchAccumulator(options: ConsumerOptions): BatchAccumulator;
|
|
12
|
+
groupMessagesByKey<T>(messages: KafkaMessage[]): GroupedBatch<T>[];
|
|
13
|
+
processBatch<T>(messages: KafkaMessage[], options: ConsumerOptions, handler: (messages: KafkaMessage[] | GroupedBatch<T>[]) => Promise<void>): Promise<void>;
|
|
14
|
+
createEachBatchHandler(options: ConsumerOptions, handler: (messages: KafkaMessage[]) => Promise<void>): (payload: EachBatchPayload) => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
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 BatchProcessorService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.BatchProcessorService = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
let BatchProcessorService = BatchProcessorService_1 = class BatchProcessorService {
|
|
13
|
+
logger = new common_1.Logger(BatchProcessorService_1.name);
|
|
14
|
+
createBatchAccumulator(options) {
|
|
15
|
+
const batchSize = options.batchSize || 100;
|
|
16
|
+
const batchTimeout = options.batchTimeout || 5000;
|
|
17
|
+
let buffer = [];
|
|
18
|
+
let timer = null;
|
|
19
|
+
let flushCallback = null;
|
|
20
|
+
const flush = async () => {
|
|
21
|
+
if (timer) {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
timer = null;
|
|
24
|
+
}
|
|
25
|
+
if (buffer.length === 0)
|
|
26
|
+
return;
|
|
27
|
+
const messages = [...buffer];
|
|
28
|
+
buffer = [];
|
|
29
|
+
if (flushCallback) {
|
|
30
|
+
await flushCallback(messages);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const scheduleFlush = () => {
|
|
34
|
+
if (timer)
|
|
35
|
+
return;
|
|
36
|
+
timer = setTimeout(() => {
|
|
37
|
+
void flush();
|
|
38
|
+
}, batchTimeout);
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
add: async (message) => {
|
|
42
|
+
buffer.push(message);
|
|
43
|
+
if (buffer.length >= batchSize) {
|
|
44
|
+
await flush();
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
scheduleFlush();
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
onFlush: (callback) => {
|
|
51
|
+
flushCallback = callback;
|
|
52
|
+
},
|
|
53
|
+
flush,
|
|
54
|
+
size: () => buffer.length,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
groupMessagesByKey(messages) {
|
|
58
|
+
const grouped = new Map();
|
|
59
|
+
for (const message of messages) {
|
|
60
|
+
const key = message.key?.toString() || '__null_key__';
|
|
61
|
+
if (!grouped.has(key)) {
|
|
62
|
+
grouped.set(key, []);
|
|
63
|
+
}
|
|
64
|
+
grouped.get(key).push(message);
|
|
65
|
+
}
|
|
66
|
+
return Array.from(grouped.entries()).map(([key, msgs]) => ({
|
|
67
|
+
key,
|
|
68
|
+
messages: msgs,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
async processBatch(messages, options, handler) {
|
|
72
|
+
if (options.groupByKey) {
|
|
73
|
+
const grouped = this.groupMessagesByKey(messages);
|
|
74
|
+
await handler(grouped);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
await handler(messages);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
createEachBatchHandler(options, handler) {
|
|
81
|
+
const accumulator = this.createBatchAccumulator(options);
|
|
82
|
+
accumulator.onFlush(async (messages) => {
|
|
83
|
+
await this.processBatch(messages, options, handler);
|
|
84
|
+
});
|
|
85
|
+
const batchHandler = async (payload) => {
|
|
86
|
+
for (const message of payload.batch.messages) {
|
|
87
|
+
if (!payload.isRunning() || payload.isStale())
|
|
88
|
+
break;
|
|
89
|
+
await accumulator.add(message);
|
|
90
|
+
payload.resolveOffset(message.offset);
|
|
91
|
+
await payload.heartbeat();
|
|
92
|
+
}
|
|
93
|
+
await accumulator.flush();
|
|
94
|
+
};
|
|
95
|
+
return batchHandler;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
exports.BatchProcessorService = BatchProcessorService;
|
|
99
|
+
exports.BatchProcessorService = BatchProcessorService = BatchProcessorService_1 = __decorate([
|
|
100
|
+
(0, common_1.Injectable)()
|
|
101
|
+
], BatchProcessorService);
|
|
102
|
+
//# sourceMappingURL=batch-processor.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-processor.service.js","sourceRoot":"","sources":["../../lib/services/batch-processor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { OnApplicationShutdown } from '@nestjs/common';
|
|
2
|
+
import { KafkaCoreService } from './kafka-core.service';
|
|
3
|
+
import { BatchProcessorService } from './batch-processor.service';
|
|
4
|
+
import { IdempotencyService } from './idempotency.service';
|
|
5
|
+
import { PressureManagerService } from './pressure-manager.service';
|
|
6
|
+
import { DlqService } from './dlq.service';
|
|
7
|
+
import { ConsumerMetadata } from '../interfaces';
|
|
8
|
+
export declare class ConsumerRegistryService implements OnApplicationShutdown {
|
|
9
|
+
private readonly kafkaCore;
|
|
10
|
+
private readonly batchProcessor;
|
|
11
|
+
private readonly idempotencyService;
|
|
12
|
+
private readonly pressureManager;
|
|
13
|
+
private readonly dlqService;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
private registeredConsumers;
|
|
16
|
+
private isShuttingDown;
|
|
17
|
+
constructor(kafkaCore: KafkaCoreService, batchProcessor: BatchProcessorService, idempotencyService: IdempotencyService, pressureManager: PressureManagerService, dlqService: DlqService);
|
|
18
|
+
registerConsumers(consumers: ConsumerMetadata[]): void;
|
|
19
|
+
private registerConsumer;
|
|
20
|
+
startAll(): Promise<void>;
|
|
21
|
+
private startConsumer;
|
|
22
|
+
private startMessageConsumer;
|
|
23
|
+
private startBatchConsumer;
|
|
24
|
+
private handleError;
|
|
25
|
+
gracefulShutdown(): Promise<void>;
|
|
26
|
+
onApplicationShutdown(): Promise<void>;
|
|
27
|
+
}
|