@drarzter/kafka-client 0.1.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.
- package/dist/index.d.mts +61 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +179 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +50 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { OnModuleDestroy, DynamicModule } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
type TTopicMessageMap = {
|
|
4
|
+
[topic: string]: Record<string, any>;
|
|
5
|
+
};
|
|
6
|
+
type ClientId = string;
|
|
7
|
+
type GroupId = string;
|
|
8
|
+
interface ConsumerOptions {
|
|
9
|
+
fromBeginning?: boolean;
|
|
10
|
+
autoCommit?: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface IKafkaClient<T extends TTopicMessageMap> {
|
|
13
|
+
checkStatus(): Promise<{
|
|
14
|
+
topics: string[];
|
|
15
|
+
}>;
|
|
16
|
+
startConsumer<K extends Array<keyof T>>(topics: K, handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>, options?: ConsumerOptions): Promise<void>;
|
|
17
|
+
stopConsumer(): Promise<void>;
|
|
18
|
+
sendMessage<K extends keyof T>(topic: K, message: T[K]): Promise<void>;
|
|
19
|
+
getClientId: () => ClientId;
|
|
20
|
+
}
|
|
21
|
+
declare class KafkaClient<T extends TTopicMessageMap> implements IKafkaClient<T> {
|
|
22
|
+
private readonly kafka;
|
|
23
|
+
private readonly producer;
|
|
24
|
+
private readonly consumer;
|
|
25
|
+
private readonly admin;
|
|
26
|
+
private readonly logger;
|
|
27
|
+
readonly clientId: ClientId;
|
|
28
|
+
constructor(clientId: ClientId, groupId: GroupId, brokers: string[]);
|
|
29
|
+
sendMessage<K extends keyof T>(topic: K, message: T[K]): Promise<void>;
|
|
30
|
+
connectProducer(): Promise<void>;
|
|
31
|
+
disconnectProducer(): Promise<void>;
|
|
32
|
+
startConsumer<K extends Array<keyof T>>(topics: K, handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>, options?: ConsumerOptions): Promise<void>;
|
|
33
|
+
stopConsumer(): Promise<void>;
|
|
34
|
+
checkStatus(): Promise<{
|
|
35
|
+
topics: string[];
|
|
36
|
+
}>;
|
|
37
|
+
getClientId(): ClientId;
|
|
38
|
+
disconnect(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface KafkaModuleOptions {
|
|
42
|
+
clientId: ClientId;
|
|
43
|
+
groupId: GroupId;
|
|
44
|
+
brokers: string[];
|
|
45
|
+
}
|
|
46
|
+
interface KafkaModuleAsyncOptions {
|
|
47
|
+
imports?: any[];
|
|
48
|
+
useFactory: (...args: any[]) => KafkaModuleOptions | Promise<KafkaModuleOptions>;
|
|
49
|
+
inject?: any[];
|
|
50
|
+
}
|
|
51
|
+
declare class KafkaModule implements OnModuleDestroy {
|
|
52
|
+
private readonly client?;
|
|
53
|
+
constructor(client?: KafkaClient<any> | undefined);
|
|
54
|
+
onModuleDestroy(): Promise<void>;
|
|
55
|
+
static register<T extends TTopicMessageMap>(options: KafkaModuleOptions): DynamicModule;
|
|
56
|
+
static registerAsync<T extends TTopicMessageMap>(asyncOptions: KafkaModuleAsyncOptions): DynamicModule;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare const KAFKA_CLIENT = "KAFKA_CLIENT";
|
|
60
|
+
|
|
61
|
+
export { type ClientId, type ConsumerOptions, type GroupId, type IKafkaClient, KAFKA_CLIENT, KafkaClient, KafkaModule, type KafkaModuleAsyncOptions, type KafkaModuleOptions, type TTopicMessageMap };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { OnModuleDestroy, DynamicModule } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
type TTopicMessageMap = {
|
|
4
|
+
[topic: string]: Record<string, any>;
|
|
5
|
+
};
|
|
6
|
+
type ClientId = string;
|
|
7
|
+
type GroupId = string;
|
|
8
|
+
interface ConsumerOptions {
|
|
9
|
+
fromBeginning?: boolean;
|
|
10
|
+
autoCommit?: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface IKafkaClient<T extends TTopicMessageMap> {
|
|
13
|
+
checkStatus(): Promise<{
|
|
14
|
+
topics: string[];
|
|
15
|
+
}>;
|
|
16
|
+
startConsumer<K extends Array<keyof T>>(topics: K, handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>, options?: ConsumerOptions): Promise<void>;
|
|
17
|
+
stopConsumer(): Promise<void>;
|
|
18
|
+
sendMessage<K extends keyof T>(topic: K, message: T[K]): Promise<void>;
|
|
19
|
+
getClientId: () => ClientId;
|
|
20
|
+
}
|
|
21
|
+
declare class KafkaClient<T extends TTopicMessageMap> implements IKafkaClient<T> {
|
|
22
|
+
private readonly kafka;
|
|
23
|
+
private readonly producer;
|
|
24
|
+
private readonly consumer;
|
|
25
|
+
private readonly admin;
|
|
26
|
+
private readonly logger;
|
|
27
|
+
readonly clientId: ClientId;
|
|
28
|
+
constructor(clientId: ClientId, groupId: GroupId, brokers: string[]);
|
|
29
|
+
sendMessage<K extends keyof T>(topic: K, message: T[K]): Promise<void>;
|
|
30
|
+
connectProducer(): Promise<void>;
|
|
31
|
+
disconnectProducer(): Promise<void>;
|
|
32
|
+
startConsumer<K extends Array<keyof T>>(topics: K, handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>, options?: ConsumerOptions): Promise<void>;
|
|
33
|
+
stopConsumer(): Promise<void>;
|
|
34
|
+
checkStatus(): Promise<{
|
|
35
|
+
topics: string[];
|
|
36
|
+
}>;
|
|
37
|
+
getClientId(): ClientId;
|
|
38
|
+
disconnect(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface KafkaModuleOptions {
|
|
42
|
+
clientId: ClientId;
|
|
43
|
+
groupId: GroupId;
|
|
44
|
+
brokers: string[];
|
|
45
|
+
}
|
|
46
|
+
interface KafkaModuleAsyncOptions {
|
|
47
|
+
imports?: any[];
|
|
48
|
+
useFactory: (...args: any[]) => KafkaModuleOptions | Promise<KafkaModuleOptions>;
|
|
49
|
+
inject?: any[];
|
|
50
|
+
}
|
|
51
|
+
declare class KafkaModule implements OnModuleDestroy {
|
|
52
|
+
private readonly client?;
|
|
53
|
+
constructor(client?: KafkaClient<any> | undefined);
|
|
54
|
+
onModuleDestroy(): Promise<void>;
|
|
55
|
+
static register<T extends TTopicMessageMap>(options: KafkaModuleOptions): DynamicModule;
|
|
56
|
+
static registerAsync<T extends TTopicMessageMap>(asyncOptions: KafkaModuleAsyncOptions): DynamicModule;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
declare const KAFKA_CLIENT = "KAFKA_CLIENT";
|
|
60
|
+
|
|
61
|
+
export { type ClientId, type ConsumerOptions, type GroupId, type IKafkaClient, KAFKA_CLIENT, KafkaClient, KafkaModule, type KafkaModuleAsyncOptions, type KafkaModuleOptions, type TTopicMessageMap };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
20
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
21
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
22
|
+
if (decorator = decorators[i])
|
|
23
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
24
|
+
if (kind && result) __defProp(target, key, result);
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
28
|
+
|
|
29
|
+
// src/index.ts
|
|
30
|
+
var index_exports = {};
|
|
31
|
+
__export(index_exports, {
|
|
32
|
+
KAFKA_CLIENT: () => KAFKA_CLIENT,
|
|
33
|
+
KafkaClient: () => KafkaClient,
|
|
34
|
+
KafkaModule: () => KafkaModule
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(index_exports);
|
|
37
|
+
|
|
38
|
+
// src/kafka.module.ts
|
|
39
|
+
var import_common2 = require("@nestjs/common");
|
|
40
|
+
|
|
41
|
+
// src/kafka.client.ts
|
|
42
|
+
var import_kafkajs = require("kafkajs");
|
|
43
|
+
var import_common = require("@nestjs/common");
|
|
44
|
+
var KafkaClient = class {
|
|
45
|
+
kafka;
|
|
46
|
+
producer;
|
|
47
|
+
consumer;
|
|
48
|
+
admin;
|
|
49
|
+
logger;
|
|
50
|
+
clientId;
|
|
51
|
+
constructor(clientId, groupId, brokers) {
|
|
52
|
+
this.clientId = clientId;
|
|
53
|
+
this.logger = new import_common.Logger(`KafkaClient:${clientId}`);
|
|
54
|
+
this.kafka = new import_kafkajs.Kafka({
|
|
55
|
+
clientId: this.clientId,
|
|
56
|
+
brokers
|
|
57
|
+
});
|
|
58
|
+
this.producer = this.kafka.producer({
|
|
59
|
+
createPartitioner: import_kafkajs.Partitioners.DefaultPartitioner,
|
|
60
|
+
idempotent: true,
|
|
61
|
+
maxInFlightRequests: 1
|
|
62
|
+
});
|
|
63
|
+
this.consumer = this.kafka.consumer({ groupId });
|
|
64
|
+
this.admin = this.kafka.admin();
|
|
65
|
+
}
|
|
66
|
+
async sendMessage(topic, message) {
|
|
67
|
+
await this.producer.send({
|
|
68
|
+
topic,
|
|
69
|
+
messages: [{ value: JSON.stringify(message) }],
|
|
70
|
+
acks: -1
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async connectProducer() {
|
|
74
|
+
await this.producer.connect();
|
|
75
|
+
this.logger.log("Producer connected");
|
|
76
|
+
}
|
|
77
|
+
async disconnectProducer() {
|
|
78
|
+
await this.producer.disconnect();
|
|
79
|
+
this.logger.log("Producer disconnected");
|
|
80
|
+
}
|
|
81
|
+
async startConsumer(topics, handleMessage, options = {}) {
|
|
82
|
+
const { fromBeginning = false, autoCommit = true } = options;
|
|
83
|
+
await this.consumer.connect();
|
|
84
|
+
await this.consumer.subscribe({
|
|
85
|
+
topics,
|
|
86
|
+
fromBeginning
|
|
87
|
+
});
|
|
88
|
+
this.logger.log(`Consumer subscribed to topics: ${topics.join(", ")}`);
|
|
89
|
+
await this.consumer.run({
|
|
90
|
+
autoCommit,
|
|
91
|
+
eachMessage: async ({ topic, message }) => {
|
|
92
|
+
if (!message.value) {
|
|
93
|
+
this.logger.warn(`Received empty message from topic ${topic}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const parsedMessage = JSON.parse(
|
|
98
|
+
message.value.toString()
|
|
99
|
+
);
|
|
100
|
+
await handleMessage(parsedMessage, topic);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
this.logger.error(
|
|
103
|
+
`Error processing message from topic ${topic}:`,
|
|
104
|
+
error instanceof Error ? error.stack : String(error)
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
async stopConsumer() {
|
|
111
|
+
await this.consumer.disconnect();
|
|
112
|
+
this.logger.log("Consumer disconnected");
|
|
113
|
+
}
|
|
114
|
+
async checkStatus() {
|
|
115
|
+
await this.admin.connect();
|
|
116
|
+
const topics = await this.admin.listTopics();
|
|
117
|
+
await this.admin.disconnect();
|
|
118
|
+
return { topics };
|
|
119
|
+
}
|
|
120
|
+
getClientId() {
|
|
121
|
+
return this.clientId;
|
|
122
|
+
}
|
|
123
|
+
async disconnect() {
|
|
124
|
+
await Promise.allSettled([
|
|
125
|
+
this.producer.disconnect(),
|
|
126
|
+
this.consumer.disconnect()
|
|
127
|
+
]);
|
|
128
|
+
this.logger.log("All connections closed");
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// src/kafka.constants.ts
|
|
133
|
+
var KAFKA_CLIENT = "KAFKA_CLIENT";
|
|
134
|
+
|
|
135
|
+
// src/kafka.module.ts
|
|
136
|
+
var KafkaModule = class {
|
|
137
|
+
constructor(client) {
|
|
138
|
+
this.client = client;
|
|
139
|
+
}
|
|
140
|
+
async onModuleDestroy() {
|
|
141
|
+
if (this.client) {
|
|
142
|
+
await this.client.disconnect();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
static register(options) {
|
|
146
|
+
const kafkaClientProvider = {
|
|
147
|
+
provide: KAFKA_CLIENT,
|
|
148
|
+
useFactory: async () => {
|
|
149
|
+
const client = new KafkaClient(
|
|
150
|
+
options.clientId,
|
|
151
|
+
options.groupId,
|
|
152
|
+
options.brokers
|
|
153
|
+
);
|
|
154
|
+
await client.connectProducer();
|
|
155
|
+
return client;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
module: KafkaModule,
|
|
160
|
+
providers: [kafkaClientProvider],
|
|
161
|
+
exports: [kafkaClientProvider]
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
static registerAsync(asyncOptions) {
|
|
165
|
+
const kafkaClientProvider = {
|
|
166
|
+
provide: KAFKA_CLIENT,
|
|
167
|
+
useFactory: async (...args) => {
|
|
168
|
+
const options = await asyncOptions.useFactory(...args);
|
|
169
|
+
const client = new KafkaClient(
|
|
170
|
+
options.clientId,
|
|
171
|
+
options.groupId,
|
|
172
|
+
options.brokers
|
|
173
|
+
);
|
|
174
|
+
await client.connectProducer();
|
|
175
|
+
return client;
|
|
176
|
+
},
|
|
177
|
+
inject: asyncOptions.inject || []
|
|
178
|
+
};
|
|
179
|
+
return {
|
|
180
|
+
module: KafkaModule,
|
|
181
|
+
imports: asyncOptions.imports || [],
|
|
182
|
+
providers: [kafkaClientProvider],
|
|
183
|
+
exports: [kafkaClientProvider]
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
KafkaModule = __decorateClass([
|
|
188
|
+
(0, import_common2.Module)({}),
|
|
189
|
+
__decorateParam(0, (0, import_common2.Optional)()),
|
|
190
|
+
__decorateParam(0, (0, import_common2.Inject)(KAFKA_CLIENT))
|
|
191
|
+
], KafkaModule);
|
|
192
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
193
|
+
0 && (module.exports = {
|
|
194
|
+
KAFKA_CLIENT,
|
|
195
|
+
KafkaClient,
|
|
196
|
+
KafkaModule
|
|
197
|
+
});
|
|
198
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/kafka.module.ts","../src/kafka.client.ts","../src/kafka.constants.ts"],"sourcesContent":["// packages/kafka-client/src/index.ts\n\nexport * from './kafka.module';\nexport * from './kafka.client';\nexport * from './kafka.constants';","import {\n Module,\n DynamicModule,\n Provider,\n OnModuleDestroy,\n Inject,\n Optional,\n} from \"@nestjs/common\";\nimport {\n KafkaClient,\n ClientId,\n GroupId,\n TTopicMessageMap,\n} from \"./kafka.client\";\nimport { KAFKA_CLIENT } from \"./kafka.constants\";\n\nexport interface KafkaModuleOptions {\n clientId: ClientId;\n groupId: GroupId;\n brokers: string[];\n}\n\nexport interface KafkaModuleAsyncOptions {\n imports?: any[];\n useFactory: (\n ...args: any[]\n ) => KafkaModuleOptions | Promise<KafkaModuleOptions>;\n inject?: any[];\n}\n\n@Module({})\nexport class KafkaModule implements OnModuleDestroy {\n constructor(\n @Optional() @Inject(KAFKA_CLIENT) private readonly client?: KafkaClient<any>,\n ) {}\n\n async onModuleDestroy() {\n if (this.client) {\n await this.client.disconnect();\n }\n }\n\n static register<T extends TTopicMessageMap>(\n options: KafkaModuleOptions,\n ): DynamicModule {\n const kafkaClientProvider: Provider = {\n provide: KAFKA_CLIENT,\n useFactory: async (): Promise<KafkaClient<T>> => {\n const client = new KafkaClient<T>(\n options.clientId,\n options.groupId,\n options.brokers,\n );\n await client.connectProducer();\n return client;\n },\n };\n\n return {\n module: KafkaModule,\n providers: [kafkaClientProvider],\n exports: [kafkaClientProvider],\n };\n }\n\n static registerAsync<T extends TTopicMessageMap>(\n asyncOptions: KafkaModuleAsyncOptions,\n ): DynamicModule {\n const kafkaClientProvider: Provider = {\n provide: KAFKA_CLIENT,\n useFactory: async (...args: any[]): Promise<KafkaClient<T>> => {\n const options = await asyncOptions.useFactory(...args);\n const client = new KafkaClient<T>(\n options.clientId,\n options.groupId,\n options.brokers,\n );\n await client.connectProducer();\n return client;\n },\n inject: asyncOptions.inject || [],\n };\n\n return {\n module: KafkaModule,\n imports: asyncOptions.imports || [],\n providers: [kafkaClientProvider],\n exports: [kafkaClientProvider],\n };\n }\n}\n","import {\n Consumer,\n Kafka,\n Partitioners,\n Producer,\n Admin,\n} from \"kafkajs\";\nimport { Logger } from \"@nestjs/common\";\n\nexport type TTopicMessageMap = {\n [topic: string]: Record<string, any>;\n};\n\nexport type ClientId = string;\nexport type GroupId = string;\n\nexport interface ConsumerOptions {\n fromBeginning?: boolean;\n autoCommit?: boolean;\n}\n\nexport interface IKafkaClient<T extends TTopicMessageMap> {\n checkStatus(): Promise<{ topics: string[] }>;\n\n startConsumer<K extends Array<keyof T>>(\n topics: K,\n handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>,\n options?: ConsumerOptions,\n ): Promise<void>;\n\n stopConsumer(): Promise<void>;\n\n sendMessage<K extends keyof T>(topic: K, message: T[K]): Promise<void>;\n\n getClientId: () => ClientId;\n}\n\nexport class KafkaClient<T extends TTopicMessageMap>\n implements IKafkaClient<T>\n{\n private readonly kafka: Kafka;\n private readonly producer: Producer;\n private readonly consumer: Consumer;\n private readonly admin: Admin;\n private readonly logger: Logger;\n public readonly clientId: ClientId;\n\n constructor(clientId: ClientId, groupId: GroupId, brokers: string[]) {\n this.clientId = clientId;\n this.logger = new Logger(`KafkaClient:${clientId}`);\n\n this.kafka = new Kafka({\n clientId: this.clientId,\n brokers,\n });\n this.producer = this.kafka.producer({\n createPartitioner: Partitioners.DefaultPartitioner,\n idempotent: true,\n maxInFlightRequests: 1,\n });\n this.consumer = this.kafka.consumer({ groupId });\n this.admin = this.kafka.admin();\n }\n\n public async sendMessage<K extends keyof T>(\n topic: K,\n message: T[K],\n ): Promise<void> {\n await this.producer.send({\n topic: topic as string,\n messages: [{ value: JSON.stringify(message) }],\n acks: -1,\n });\n }\n\n public async connectProducer(): Promise<void> {\n await this.producer.connect();\n this.logger.log(\"Producer connected\");\n }\n\n public async disconnectProducer(): Promise<void> {\n await this.producer.disconnect();\n this.logger.log(\"Producer disconnected\");\n }\n\n public async startConsumer<K extends Array<keyof T>>(\n topics: K,\n handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>,\n options: ConsumerOptions = {},\n ): Promise<void> {\n const { fromBeginning = false, autoCommit = true } = options;\n\n await this.consumer.connect();\n await this.consumer.subscribe({\n topics: topics as string[],\n fromBeginning,\n });\n this.logger.log(`Consumer subscribed to topics: ${(topics as string[]).join(\", \")}`);\n\n await this.consumer.run({\n autoCommit,\n eachMessage: async ({ topic, message }) => {\n if (!message.value) {\n this.logger.warn(`Received empty message from topic ${topic}`);\n return;\n }\n try {\n const parsedMessage = JSON.parse(\n message.value.toString(),\n ) as T[K[number]];\n await handleMessage(parsedMessage, topic as K[number]);\n } catch (error) {\n this.logger.error(\n `Error processing message from topic ${topic}:`,\n error instanceof Error ? error.stack : String(error),\n );\n }\n },\n });\n }\n\n public async stopConsumer(): Promise<void> {\n await this.consumer.disconnect();\n this.logger.log(\"Consumer disconnected\");\n }\n\n public async checkStatus(): Promise<{ topics: string[] }> {\n await this.admin.connect();\n const topics = await this.admin.listTopics();\n await this.admin.disconnect();\n return { topics };\n }\n\n public getClientId(): ClientId {\n return this.clientId;\n }\n\n public async disconnect(): Promise<void> {\n await Promise.allSettled([\n this.producer.disconnect(),\n this.consumer.disconnect(),\n ]);\n this.logger.log(\"All connections closed\");\n }\n}\n","// packages/kafka-client/src/kafka.constants.ts\nexport const KAFKA_CLIENT = 'KAFKA_CLIENT';"],"mappings":"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","names":["import_common"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
12
|
+
|
|
13
|
+
// src/kafka.module.ts
|
|
14
|
+
import {
|
|
15
|
+
Module,
|
|
16
|
+
Inject,
|
|
17
|
+
Optional
|
|
18
|
+
} from "@nestjs/common";
|
|
19
|
+
|
|
20
|
+
// src/kafka.client.ts
|
|
21
|
+
import {
|
|
22
|
+
Kafka,
|
|
23
|
+
Partitioners
|
|
24
|
+
} from "kafkajs";
|
|
25
|
+
import { Logger } from "@nestjs/common";
|
|
26
|
+
var KafkaClient = class {
|
|
27
|
+
kafka;
|
|
28
|
+
producer;
|
|
29
|
+
consumer;
|
|
30
|
+
admin;
|
|
31
|
+
logger;
|
|
32
|
+
clientId;
|
|
33
|
+
constructor(clientId, groupId, brokers) {
|
|
34
|
+
this.clientId = clientId;
|
|
35
|
+
this.logger = new Logger(`KafkaClient:${clientId}`);
|
|
36
|
+
this.kafka = new Kafka({
|
|
37
|
+
clientId: this.clientId,
|
|
38
|
+
brokers
|
|
39
|
+
});
|
|
40
|
+
this.producer = this.kafka.producer({
|
|
41
|
+
createPartitioner: Partitioners.DefaultPartitioner,
|
|
42
|
+
idempotent: true,
|
|
43
|
+
maxInFlightRequests: 1
|
|
44
|
+
});
|
|
45
|
+
this.consumer = this.kafka.consumer({ groupId });
|
|
46
|
+
this.admin = this.kafka.admin();
|
|
47
|
+
}
|
|
48
|
+
async sendMessage(topic, message) {
|
|
49
|
+
await this.producer.send({
|
|
50
|
+
topic,
|
|
51
|
+
messages: [{ value: JSON.stringify(message) }],
|
|
52
|
+
acks: -1
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
async connectProducer() {
|
|
56
|
+
await this.producer.connect();
|
|
57
|
+
this.logger.log("Producer connected");
|
|
58
|
+
}
|
|
59
|
+
async disconnectProducer() {
|
|
60
|
+
await this.producer.disconnect();
|
|
61
|
+
this.logger.log("Producer disconnected");
|
|
62
|
+
}
|
|
63
|
+
async startConsumer(topics, handleMessage, options = {}) {
|
|
64
|
+
const { fromBeginning = false, autoCommit = true } = options;
|
|
65
|
+
await this.consumer.connect();
|
|
66
|
+
await this.consumer.subscribe({
|
|
67
|
+
topics,
|
|
68
|
+
fromBeginning
|
|
69
|
+
});
|
|
70
|
+
this.logger.log(`Consumer subscribed to topics: ${topics.join(", ")}`);
|
|
71
|
+
await this.consumer.run({
|
|
72
|
+
autoCommit,
|
|
73
|
+
eachMessage: async ({ topic, message }) => {
|
|
74
|
+
if (!message.value) {
|
|
75
|
+
this.logger.warn(`Received empty message from topic ${topic}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const parsedMessage = JSON.parse(
|
|
80
|
+
message.value.toString()
|
|
81
|
+
);
|
|
82
|
+
await handleMessage(parsedMessage, topic);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
this.logger.error(
|
|
85
|
+
`Error processing message from topic ${topic}:`,
|
|
86
|
+
error instanceof Error ? error.stack : String(error)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async stopConsumer() {
|
|
93
|
+
await this.consumer.disconnect();
|
|
94
|
+
this.logger.log("Consumer disconnected");
|
|
95
|
+
}
|
|
96
|
+
async checkStatus() {
|
|
97
|
+
await this.admin.connect();
|
|
98
|
+
const topics = await this.admin.listTopics();
|
|
99
|
+
await this.admin.disconnect();
|
|
100
|
+
return { topics };
|
|
101
|
+
}
|
|
102
|
+
getClientId() {
|
|
103
|
+
return this.clientId;
|
|
104
|
+
}
|
|
105
|
+
async disconnect() {
|
|
106
|
+
await Promise.allSettled([
|
|
107
|
+
this.producer.disconnect(),
|
|
108
|
+
this.consumer.disconnect()
|
|
109
|
+
]);
|
|
110
|
+
this.logger.log("All connections closed");
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/kafka.constants.ts
|
|
115
|
+
var KAFKA_CLIENT = "KAFKA_CLIENT";
|
|
116
|
+
|
|
117
|
+
// src/kafka.module.ts
|
|
118
|
+
var KafkaModule = class {
|
|
119
|
+
constructor(client) {
|
|
120
|
+
this.client = client;
|
|
121
|
+
}
|
|
122
|
+
async onModuleDestroy() {
|
|
123
|
+
if (this.client) {
|
|
124
|
+
await this.client.disconnect();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
static register(options) {
|
|
128
|
+
const kafkaClientProvider = {
|
|
129
|
+
provide: KAFKA_CLIENT,
|
|
130
|
+
useFactory: async () => {
|
|
131
|
+
const client = new KafkaClient(
|
|
132
|
+
options.clientId,
|
|
133
|
+
options.groupId,
|
|
134
|
+
options.brokers
|
|
135
|
+
);
|
|
136
|
+
await client.connectProducer();
|
|
137
|
+
return client;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
return {
|
|
141
|
+
module: KafkaModule,
|
|
142
|
+
providers: [kafkaClientProvider],
|
|
143
|
+
exports: [kafkaClientProvider]
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
static registerAsync(asyncOptions) {
|
|
147
|
+
const kafkaClientProvider = {
|
|
148
|
+
provide: KAFKA_CLIENT,
|
|
149
|
+
useFactory: async (...args) => {
|
|
150
|
+
const options = await asyncOptions.useFactory(...args);
|
|
151
|
+
const client = new KafkaClient(
|
|
152
|
+
options.clientId,
|
|
153
|
+
options.groupId,
|
|
154
|
+
options.brokers
|
|
155
|
+
);
|
|
156
|
+
await client.connectProducer();
|
|
157
|
+
return client;
|
|
158
|
+
},
|
|
159
|
+
inject: asyncOptions.inject || []
|
|
160
|
+
};
|
|
161
|
+
return {
|
|
162
|
+
module: KafkaModule,
|
|
163
|
+
imports: asyncOptions.imports || [],
|
|
164
|
+
providers: [kafkaClientProvider],
|
|
165
|
+
exports: [kafkaClientProvider]
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
KafkaModule = __decorateClass([
|
|
170
|
+
Module({}),
|
|
171
|
+
__decorateParam(0, Optional()),
|
|
172
|
+
__decorateParam(0, Inject(KAFKA_CLIENT))
|
|
173
|
+
], KafkaModule);
|
|
174
|
+
export {
|
|
175
|
+
KAFKA_CLIENT,
|
|
176
|
+
KafkaClient,
|
|
177
|
+
KafkaModule
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/kafka.module.ts","../src/kafka.client.ts","../src/kafka.constants.ts"],"sourcesContent":["import {\n Module,\n DynamicModule,\n Provider,\n OnModuleDestroy,\n Inject,\n Optional,\n} from \"@nestjs/common\";\nimport {\n KafkaClient,\n ClientId,\n GroupId,\n TTopicMessageMap,\n} from \"./kafka.client\";\nimport { KAFKA_CLIENT } from \"./kafka.constants\";\n\nexport interface KafkaModuleOptions {\n clientId: ClientId;\n groupId: GroupId;\n brokers: string[];\n}\n\nexport interface KafkaModuleAsyncOptions {\n imports?: any[];\n useFactory: (\n ...args: any[]\n ) => KafkaModuleOptions | Promise<KafkaModuleOptions>;\n inject?: any[];\n}\n\n@Module({})\nexport class KafkaModule implements OnModuleDestroy {\n constructor(\n @Optional() @Inject(KAFKA_CLIENT) private readonly client?: KafkaClient<any>,\n ) {}\n\n async onModuleDestroy() {\n if (this.client) {\n await this.client.disconnect();\n }\n }\n\n static register<T extends TTopicMessageMap>(\n options: KafkaModuleOptions,\n ): DynamicModule {\n const kafkaClientProvider: Provider = {\n provide: KAFKA_CLIENT,\n useFactory: async (): Promise<KafkaClient<T>> => {\n const client = new KafkaClient<T>(\n options.clientId,\n options.groupId,\n options.brokers,\n );\n await client.connectProducer();\n return client;\n },\n };\n\n return {\n module: KafkaModule,\n providers: [kafkaClientProvider],\n exports: [kafkaClientProvider],\n };\n }\n\n static registerAsync<T extends TTopicMessageMap>(\n asyncOptions: KafkaModuleAsyncOptions,\n ): DynamicModule {\n const kafkaClientProvider: Provider = {\n provide: KAFKA_CLIENT,\n useFactory: async (...args: any[]): Promise<KafkaClient<T>> => {\n const options = await asyncOptions.useFactory(...args);\n const client = new KafkaClient<T>(\n options.clientId,\n options.groupId,\n options.brokers,\n );\n await client.connectProducer();\n return client;\n },\n inject: asyncOptions.inject || [],\n };\n\n return {\n module: KafkaModule,\n imports: asyncOptions.imports || [],\n providers: [kafkaClientProvider],\n exports: [kafkaClientProvider],\n };\n }\n}\n","import {\n Consumer,\n Kafka,\n Partitioners,\n Producer,\n Admin,\n} from \"kafkajs\";\nimport { Logger } from \"@nestjs/common\";\n\nexport type TTopicMessageMap = {\n [topic: string]: Record<string, any>;\n};\n\nexport type ClientId = string;\nexport type GroupId = string;\n\nexport interface ConsumerOptions {\n fromBeginning?: boolean;\n autoCommit?: boolean;\n}\n\nexport interface IKafkaClient<T extends TTopicMessageMap> {\n checkStatus(): Promise<{ topics: string[] }>;\n\n startConsumer<K extends Array<keyof T>>(\n topics: K,\n handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>,\n options?: ConsumerOptions,\n ): Promise<void>;\n\n stopConsumer(): Promise<void>;\n\n sendMessage<K extends keyof T>(topic: K, message: T[K]): Promise<void>;\n\n getClientId: () => ClientId;\n}\n\nexport class KafkaClient<T extends TTopicMessageMap>\n implements IKafkaClient<T>\n{\n private readonly kafka: Kafka;\n private readonly producer: Producer;\n private readonly consumer: Consumer;\n private readonly admin: Admin;\n private readonly logger: Logger;\n public readonly clientId: ClientId;\n\n constructor(clientId: ClientId, groupId: GroupId, brokers: string[]) {\n this.clientId = clientId;\n this.logger = new Logger(`KafkaClient:${clientId}`);\n\n this.kafka = new Kafka({\n clientId: this.clientId,\n brokers,\n });\n this.producer = this.kafka.producer({\n createPartitioner: Partitioners.DefaultPartitioner,\n idempotent: true,\n maxInFlightRequests: 1,\n });\n this.consumer = this.kafka.consumer({ groupId });\n this.admin = this.kafka.admin();\n }\n\n public async sendMessage<K extends keyof T>(\n topic: K,\n message: T[K],\n ): Promise<void> {\n await this.producer.send({\n topic: topic as string,\n messages: [{ value: JSON.stringify(message) }],\n acks: -1,\n });\n }\n\n public async connectProducer(): Promise<void> {\n await this.producer.connect();\n this.logger.log(\"Producer connected\");\n }\n\n public async disconnectProducer(): Promise<void> {\n await this.producer.disconnect();\n this.logger.log(\"Producer disconnected\");\n }\n\n public async startConsumer<K extends Array<keyof T>>(\n topics: K,\n handleMessage: (message: T[K[number]], topic: K[number]) => Promise<void>,\n options: ConsumerOptions = {},\n ): Promise<void> {\n const { fromBeginning = false, autoCommit = true } = options;\n\n await this.consumer.connect();\n await this.consumer.subscribe({\n topics: topics as string[],\n fromBeginning,\n });\n this.logger.log(`Consumer subscribed to topics: ${(topics as string[]).join(\", \")}`);\n\n await this.consumer.run({\n autoCommit,\n eachMessage: async ({ topic, message }) => {\n if (!message.value) {\n this.logger.warn(`Received empty message from topic ${topic}`);\n return;\n }\n try {\n const parsedMessage = JSON.parse(\n message.value.toString(),\n ) as T[K[number]];\n await handleMessage(parsedMessage, topic as K[number]);\n } catch (error) {\n this.logger.error(\n `Error processing message from topic ${topic}:`,\n error instanceof Error ? error.stack : String(error),\n );\n }\n },\n });\n }\n\n public async stopConsumer(): Promise<void> {\n await this.consumer.disconnect();\n this.logger.log(\"Consumer disconnected\");\n }\n\n public async checkStatus(): Promise<{ topics: string[] }> {\n await this.admin.connect();\n const topics = await this.admin.listTopics();\n await this.admin.disconnect();\n return { topics };\n }\n\n public getClientId(): ClientId {\n return this.clientId;\n }\n\n public async disconnect(): Promise<void> {\n await Promise.allSettled([\n this.producer.disconnect(),\n this.consumer.disconnect(),\n ]);\n this.logger.log(\"All connections closed\");\n }\n}\n","// packages/kafka-client/src/kafka.constants.ts\nexport const KAFKA_CLIENT = 'KAFKA_CLIENT';"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@drarzter/kafka-client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Type-safe Kafka client wrapper for NestJS with typed topic-message maps",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"keywords": [
|
|
20
|
+
"kafka",
|
|
21
|
+
"kafkajs",
|
|
22
|
+
"nestjs",
|
|
23
|
+
"typescript",
|
|
24
|
+
"typed-kafka",
|
|
25
|
+
"kafka-client"
|
|
26
|
+
],
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/drarzter/kafka-client"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsup",
|
|
33
|
+
"prepublishOnly": "npm run build"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"kafkajs": "^2.2.4"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@nestjs/common": ">=10.0.0",
|
|
40
|
+
"reflect-metadata": ">=0.1.13",
|
|
41
|
+
"rxjs": ">=7.0.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@nestjs/common": "^11.1.6",
|
|
45
|
+
"reflect-metadata": "^0.2.0",
|
|
46
|
+
"rxjs": "^7.8.0",
|
|
47
|
+
"typescript": "^5.7.3",
|
|
48
|
+
"tsup": "^8.0.2"
|
|
49
|
+
}
|
|
50
|
+
}
|