@nsshunt/stskafka 1.0.57 → 1.0.58
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.cjs +302 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +273 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +15 -12
- package/dist/stskafka.mjs +0 -294
- package/dist/stskafka.mjs.map +0 -1
- package/dist/stskafka.umd.js +0 -291
- package/dist/stskafka.umd.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nsshunt/stskafka",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.58",
|
|
4
4
|
"description": "STS Kafka",
|
|
5
|
-
"main": "./dist/stskafka.umd.js",
|
|
6
|
-
"module": "./dist/stskafka.mjs",
|
|
7
5
|
"type": "commonjs",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
8
|
"types": "./types/index.d.ts",
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"types": "./types/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.cjs",
|
|
14
|
+
"default": "./dist/index.mjs"
|
|
13
15
|
}
|
|
14
16
|
},
|
|
17
|
+
"sideEffects": false,
|
|
15
18
|
"files": [
|
|
16
19
|
"dist",
|
|
17
20
|
"types",
|
|
@@ -38,18 +41,18 @@
|
|
|
38
41
|
},
|
|
39
42
|
"homepage": "https://github.com/nsshunt/stskafka#readme",
|
|
40
43
|
"devDependencies": {
|
|
41
|
-
"@testcontainers/kafka": "^11.
|
|
42
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
43
|
-
"@typescript-eslint/parser": "^8.
|
|
44
|
+
"@testcontainers/kafka": "^11.13.0",
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^8.58.0",
|
|
46
|
+
"@typescript-eslint/parser": "^8.58.0",
|
|
44
47
|
"eslint": "^9.39.2",
|
|
45
48
|
"globals": "^17.4.0",
|
|
46
|
-
"testcontainers": "^11.
|
|
49
|
+
"testcontainers": "^11.13.0",
|
|
47
50
|
"typescript": "^5.9.3",
|
|
48
|
-
"vite": "^
|
|
49
|
-
"vitest": "^4.
|
|
51
|
+
"vite": "^8.0.3",
|
|
52
|
+
"vitest": "^4.1.2"
|
|
50
53
|
},
|
|
51
54
|
"dependencies": {
|
|
52
|
-
"@nsshunt/stsutils": "^1.19.
|
|
55
|
+
"@nsshunt/stsutils": "^1.19.91",
|
|
53
56
|
"chalk": "^4.1.2",
|
|
54
57
|
"kafkajs": "^2.2.4",
|
|
55
58
|
"uuid": "^13.0.0",
|
package/dist/stskafka.mjs
DELETED
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { STSOptionsBase } from "@nsshunt/stsutils";
|
|
2
|
-
import { logLevel, Kafka } from "kafkajs";
|
|
3
|
-
import { v4 } from "uuid";
|
|
4
|
-
import fs from "node:fs";
|
|
5
|
-
import chalk from "chalk";
|
|
6
|
-
import net from "node:net";
|
|
7
|
-
import tls from "node:tls";
|
|
8
|
-
class KafkaConsumer {
|
|
9
|
-
#id;
|
|
10
|
-
#groupId;
|
|
11
|
-
#consumer;
|
|
12
|
-
#kafka;
|
|
13
|
-
#connected = false;
|
|
14
|
-
#options;
|
|
15
|
-
constructor(options) {
|
|
16
|
-
this.#options = options;
|
|
17
|
-
this.#id = this.#options.id;
|
|
18
|
-
this.#groupId = this.#options.groupId;
|
|
19
|
-
this.#kafka = this.#options.kafka;
|
|
20
|
-
this.#consumer = this.#kafka.consumer({
|
|
21
|
-
groupId: this.#groupId,
|
|
22
|
-
retry: {
|
|
23
|
-
restartOnFailure: async (error) => {
|
|
24
|
-
this.#LogErrorMessage(chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`));
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
#LogErrorMessage(message) {
|
|
31
|
-
this.#options.logger.error(message);
|
|
32
|
-
}
|
|
33
|
-
get consumer() {
|
|
34
|
-
return this.#consumer;
|
|
35
|
-
}
|
|
36
|
-
get id() {
|
|
37
|
-
return this.#id;
|
|
38
|
-
}
|
|
39
|
-
#RaiseError = (msg, errorCb) => {
|
|
40
|
-
const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
|
|
41
|
-
this.#LogErrorMessage(chalk.red(errorMessage));
|
|
42
|
-
errorCb(errorMessage);
|
|
43
|
-
};
|
|
44
|
-
async Connect(errorCb) {
|
|
45
|
-
if (!this.#connected) {
|
|
46
|
-
try {
|
|
47
|
-
await this.#consumer.connect();
|
|
48
|
-
this.#connected = true;
|
|
49
|
-
} catch (error) {
|
|
50
|
-
this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async Disconnect(errorCb) {
|
|
55
|
-
if (this.#connected) {
|
|
56
|
-
try {
|
|
57
|
-
await this.#consumer.disconnect();
|
|
58
|
-
this.#connected = false;
|
|
59
|
-
} catch (error) {
|
|
60
|
-
this.#RaiseError(`Disconnect(): Error: [${error}]`, errorCb);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
Subscribe = async (topics, fromBeginning, errorCb) => {
|
|
65
|
-
if (this.#connected) {
|
|
66
|
-
try {
|
|
67
|
-
await this.#consumer.subscribe({ topics, fromBeginning });
|
|
68
|
-
} catch (error) {
|
|
69
|
-
this.#RaiseError(`Subscribe(): Error: [${error}]`, errorCb);
|
|
70
|
-
}
|
|
71
|
-
} else {
|
|
72
|
-
await this.Connect((error) => {
|
|
73
|
-
this.#RaiseError(`Subscribe(): Could not consumer.connect, Error: [${error}]`, errorCb);
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
Stop = async (errorCb) => {
|
|
78
|
-
if (this.#connected) {
|
|
79
|
-
try {
|
|
80
|
-
await this.#consumer.stop();
|
|
81
|
-
} catch (error) {
|
|
82
|
-
this.#RaiseError(`Stop(): Error: [${error}]`, errorCb);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
StartConsumingMessages = async (autoCommit, cb, errorCb) => {
|
|
87
|
-
if (this.#connected) {
|
|
88
|
-
await this.#consumer.run({
|
|
89
|
-
autoCommit,
|
|
90
|
-
eachMessage: async ({ topic, partition, message, heartbeat, pause }) => {
|
|
91
|
-
try {
|
|
92
|
-
cb(topic, partition, message, heartbeat, pause);
|
|
93
|
-
} catch (error) {
|
|
94
|
-
this.#RaiseError(`StartConsumingMessages:eachMessage(): Error: [${error}]`, errorCb);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
} else {
|
|
99
|
-
await this.Connect((error) => {
|
|
100
|
-
this.#RaiseError(`StartConsumingMessages(): Could not consumer.connect, Error: [${error}]`, errorCb);
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
class KafkaProducer {
|
|
106
|
-
#options;
|
|
107
|
-
#id;
|
|
108
|
-
#producer;
|
|
109
|
-
#kafka;
|
|
110
|
-
#connected = false;
|
|
111
|
-
constructor(options) {
|
|
112
|
-
this.#options = options;
|
|
113
|
-
this.#id = this.#options.id;
|
|
114
|
-
this.#kafka = this.#options.kafka;
|
|
115
|
-
this.#producer = this.#kafka.producer();
|
|
116
|
-
}
|
|
117
|
-
#LogErrorMessage(message) {
|
|
118
|
-
this.#options.logger.error(message);
|
|
119
|
-
}
|
|
120
|
-
#RaiseError = (msg, errorCb) => {
|
|
121
|
-
this.#LogErrorMessage(chalk.red(msg));
|
|
122
|
-
errorCb(msg);
|
|
123
|
-
};
|
|
124
|
-
get producer() {
|
|
125
|
-
return this.#producer;
|
|
126
|
-
}
|
|
127
|
-
get id() {
|
|
128
|
-
return this.#id;
|
|
129
|
-
}
|
|
130
|
-
async Connect(errorCb) {
|
|
131
|
-
if (!this.#connected) {
|
|
132
|
-
try {
|
|
133
|
-
await this.#producer.connect();
|
|
134
|
-
this.#connected = true;
|
|
135
|
-
} catch (error) {
|
|
136
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
async Disconnect(errorCb) {
|
|
141
|
-
if (this.#connected) {
|
|
142
|
-
try {
|
|
143
|
-
await this.#producer.disconnect();
|
|
144
|
-
this.#connected = false;
|
|
145
|
-
} catch (error) {
|
|
146
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
SendMessage = async (topic, message, errorCb) => {
|
|
151
|
-
if (this.#connected) {
|
|
152
|
-
try {
|
|
153
|
-
return this.#producer.send({
|
|
154
|
-
topic,
|
|
155
|
-
messages: [message]
|
|
156
|
-
});
|
|
157
|
-
} catch (error) {
|
|
158
|
-
this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));
|
|
159
|
-
return [];
|
|
160
|
-
}
|
|
161
|
-
} else {
|
|
162
|
-
await this.Connect((error) => {
|
|
163
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:SendMessage(): Could not producer.connect, Error: [${error}]`, errorCb);
|
|
164
|
-
});
|
|
165
|
-
return [];
|
|
166
|
-
}
|
|
167
|
-
};
|
|
168
|
-
SendMessages = async (topic, messages, errorCb) => {
|
|
169
|
-
if (this.#connected) {
|
|
170
|
-
try {
|
|
171
|
-
return this.#producer.send({
|
|
172
|
-
topic,
|
|
173
|
-
messages
|
|
174
|
-
});
|
|
175
|
-
} catch (error) {
|
|
176
|
-
this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessages(): Error: [${error}]`));
|
|
177
|
-
return [];
|
|
178
|
-
}
|
|
179
|
-
} else {
|
|
180
|
-
await this.Connect((error) => {
|
|
181
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:SendMessages(): Could not producer.connect, Error: [${error}]`, errorCb);
|
|
182
|
-
});
|
|
183
|
-
return [];
|
|
184
|
-
}
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
class KafkaManager extends STSOptionsBase {
|
|
188
|
-
#kafka;
|
|
189
|
-
constructor(options) {
|
|
190
|
-
super(options);
|
|
191
|
-
const kc = {
|
|
192
|
-
clientId: options.clientId,
|
|
193
|
-
brokers: options.brokers,
|
|
194
|
-
//brokers: ['localhost:9092', 'kafka2:9092'],
|
|
195
|
-
connectionTimeout: options.connectionTimeout,
|
|
196
|
-
requestTimeout: options.requestTimeout
|
|
197
|
-
};
|
|
198
|
-
switch (options.logLevel) {
|
|
199
|
-
case "NOTHING":
|
|
200
|
-
kc.logLevel = logLevel.NOTHING;
|
|
201
|
-
break;
|
|
202
|
-
case "ERROR":
|
|
203
|
-
kc.logLevel = logLevel.ERROR;
|
|
204
|
-
break;
|
|
205
|
-
case "WARN":
|
|
206
|
-
kc.logLevel = logLevel.WARN;
|
|
207
|
-
break;
|
|
208
|
-
case "INFO":
|
|
209
|
-
kc.logLevel = logLevel.INFO;
|
|
210
|
-
break;
|
|
211
|
-
case "DEBUG":
|
|
212
|
-
kc.logLevel = logLevel.DEBUG;
|
|
213
|
-
break;
|
|
214
|
-
default:
|
|
215
|
-
kc.logLevel = logLevel.NOTHING;
|
|
216
|
-
}
|
|
217
|
-
if (options.useSSL && options.ssl) {
|
|
218
|
-
kc.ssl = {
|
|
219
|
-
ca: [fs.readFileSync(options.ssl.cafile, { encoding: "utf8" })],
|
|
220
|
-
key: fs.readFileSync(options.ssl.keyfile, { encoding: "utf8" }),
|
|
221
|
-
cert: fs.readFileSync(options.ssl.certfileFile, { encoding: "utf8" })
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
if (options.keepAlive) {
|
|
225
|
-
const myCustomSocketFactory = (config) => {
|
|
226
|
-
const socket = config.ssl ? tls.connect(
|
|
227
|
-
Object.assign({ host: config.host, port: config.port }, !net.isIP(config.host) ? { servername: config.host } : {}, config.ssl),
|
|
228
|
-
config.onConnect
|
|
229
|
-
) : net.connect({ host: config.host, port: config.port }, config.onConnect);
|
|
230
|
-
socket.setKeepAlive(true, options.keepAlive);
|
|
231
|
-
return socket;
|
|
232
|
-
};
|
|
233
|
-
kc.socketFactory = myCustomSocketFactory;
|
|
234
|
-
}
|
|
235
|
-
this.#kafka = new Kafka(kc);
|
|
236
|
-
}
|
|
237
|
-
#LogErrorMessage(message) {
|
|
238
|
-
this.options?.logger.error(message);
|
|
239
|
-
}
|
|
240
|
-
#RaiseError = (msg, errorCb) => {
|
|
241
|
-
this.#LogErrorMessage(chalk.red(msg));
|
|
242
|
-
errorCb(msg);
|
|
243
|
-
};
|
|
244
|
-
get kafka() {
|
|
245
|
-
return this.#kafka;
|
|
246
|
-
}
|
|
247
|
-
CreateProducer() {
|
|
248
|
-
return new KafkaProducer({
|
|
249
|
-
kafka: this.#kafka,
|
|
250
|
-
id: v4(),
|
|
251
|
-
logger: this.options?.logger
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
CreateConsumer(groupId) {
|
|
255
|
-
return new KafkaConsumer({
|
|
256
|
-
kafka: this.#kafka,
|
|
257
|
-
id: v4(),
|
|
258
|
-
groupId,
|
|
259
|
-
logger: this.options?.logger
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
CreateTopic = async (topic, partitions, errorCb) => {
|
|
263
|
-
try {
|
|
264
|
-
const admin = this.#kafka.admin();
|
|
265
|
-
await admin.connect();
|
|
266
|
-
const result = await admin.createTopics({
|
|
267
|
-
validateOnly: false,
|
|
268
|
-
waitForLeaders: true,
|
|
269
|
-
timeout: this.options?.timeout,
|
|
270
|
-
topics: [
|
|
271
|
-
{
|
|
272
|
-
topic,
|
|
273
|
-
numPartitions: partitions
|
|
274
|
-
// default: -1 (uses broker `num.partitions` configuration)
|
|
275
|
-
//replicationFactor: <Number>, // default: -1 (uses broker `default.replication.factor` configuration)
|
|
276
|
-
//replicaAssignment: <Array>, // Example: [{ partition: 0, replicas: [0,1,2] }] - default: []
|
|
277
|
-
//configEntries: <Array> // Example: [{ name: 'cleanup.policy', value: 'compact' }] - default: []
|
|
278
|
-
}
|
|
279
|
-
]
|
|
280
|
-
});
|
|
281
|
-
await admin.disconnect();
|
|
282
|
-
return result;
|
|
283
|
-
} catch (error) {
|
|
284
|
-
this.#RaiseError(`KafkaManager:CreateTopic(): Error: [${error}]`, errorCb);
|
|
285
|
-
return false;
|
|
286
|
-
}
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
export {
|
|
290
|
-
KafkaConsumer,
|
|
291
|
-
KafkaManager,
|
|
292
|
-
KafkaProducer
|
|
293
|
-
};
|
|
294
|
-
//# sourceMappingURL=stskafka.mjs.map
|
package/dist/stskafka.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stskafka.mjs","sources":["../src/kafka/kafkaconsumer.ts","../src/kafka/kafkaproducer.ts","../src/kafka/kafkamanager.ts"],"sourcesContent":["/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { Kafka, Consumer, IHeaders, KafkaMessage } from 'kafkajs'\nimport { IKafkaConsumer, ConsumeMessageCB, ConsumeMessageErrorCB } from './../commonTypes'\n\nimport chalk from 'chalk';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\nexport interface IKafkaConsumerOptions {\n kafka: Kafka\n id: string\n groupId: string\n logger: ISTSLogger\n}\n\nexport class KafkaConsumer implements IKafkaConsumer {\n #id: string\n #groupId: string\n #consumer: Consumer;\n #kafka: Kafka;\n #connected: boolean = false;\n #options: IKafkaConsumerOptions;\n\n constructor(options: IKafkaConsumerOptions) {\n this.#options = options;\n this.#id = this.#options.id;\n this.#groupId = this.#options.groupId;\n this.#kafka = this.#options.kafka;\n this.#consumer = this.#kafka.consumer({ \n groupId: this.#groupId,\n retry: {\n restartOnFailure: async (error: Error): Promise<boolean> => {\n this.#LogErrorMessage(chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`))\n return true;\n }\n }\n })\n }\n\n #LogErrorMessage(message: any) {\n this.#options.logger.error(message);\n }\n\n get consumer() {\n return this.#consumer;\n }\n \n get id(): string {\n return this.#id;\n }\n\n #RaiseError = (msg: string, errorCb: (error: any) => void) => {\n const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;\n this.#LogErrorMessage(chalk.red(errorMessage));\n errorCb(errorMessage);\n }\n\n async Connect(errorCb: (error: any) => void): Promise<void> {\n if (!this.#connected) {\n try {\n await this.#consumer.connect()\n this.#connected = true;\n } catch (error) {\n this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);\n }\n }\n }\n\n async Disconnect(errorCb: (error: any) => void): Promise<void> {\n if (this.#connected) {\n try {\n await this.#consumer.disconnect()\n this.#connected = false;\n } catch (error) {\n this.#RaiseError(`Disconnect(): Error: [${error}]`, errorCb);\n }\n }\n }\n\n Subscribe = async(topics: string[], fromBeginning: boolean, errorCb: (error: any) => void): Promise<void> => {\n if (this.#connected) {\n try {\n await this.#consumer.subscribe({ topics, fromBeginning })\n } catch (error) {\n this.#RaiseError(`Subscribe(): Error: [${error}]`, errorCb);\n }\n } else {\n await this.Connect((error) => {\n this.#RaiseError(`Subscribe(): Could not consumer.connect, Error: [${error}]`, errorCb);\n });\n }\n }\n\n Stop = async(errorCb: (error: any) => void): Promise<void> => {\n if (this.#connected) {\n try {\n await this.#consumer.stop();\n } catch (error) {\n this.#RaiseError(`Stop(): Error: [${error}]`, errorCb);\n }\n }\n }\n\n StartConsumingMessages = async (autoCommit: boolean, cb: ConsumeMessageCB, errorCb: ConsumeMessageErrorCB): Promise<void> => {\n if (this.#connected) {\n await this.#consumer.run({\n autoCommit, \n eachMessage: async ({ topic, partition, message, heartbeat, pause }) => {\n try {\n cb(topic, partition, message, heartbeat, pause);\n /*\n if (message.key) {\n if (message.value) {\n cb(topic.toString(), message.key.toString(), partition, message.value.toString(), message.headers)\n } else {\n cb(topic.toString(), message.key.toString(), partition, \"\", message.headers)\n }\n } else {\n if (message.value) {\n cb(topic.toString(), \"\", partition, message.value?.toString(), message.headers)\n } else {\n cb(topic.toString(), \"\", partition, \"\", message.headers)\n }\n }\n */\n } catch (error) {\n this.#RaiseError(`StartConsumingMessages:eachMessage(): Error: [${error}]`, errorCb);\n }\n }\n })\n } else {\n await this.Connect((error) => {\n this.#RaiseError(`StartConsumingMessages(): Could not consumer.connect, Error: [${error}]`, errorCb);\n });\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\nimport { Kafka, Producer, RecordMetadata } from 'kafkajs'\n\nimport chalk from 'chalk';\nimport { ISTSLogger } from '@nsshunt/stsutils';\n\nexport interface IKafkaProducerOptions {\n kafka: Kafka\n id: string\n logger: ISTSLogger\n}\n\nexport class KafkaProducer {\n #options: IKafkaProducerOptions;\n #id: string\n #producer: Producer;\n #kafka: Kafka;\n #connected: boolean = false;\n\n constructor(options: IKafkaProducerOptions) {\n this.#options = options;\n this.#id = this.#options.id;\n this.#kafka = this.#options.kafka;\n this.#producer = this.#kafka.producer()\n }\n\n #LogErrorMessage(message: any) {\n this.#options.logger.error(message);\n }\n\n #RaiseError = (msg: string, errorCb: (error: any) => void) => {\n this.#LogErrorMessage(chalk.red(msg));\n errorCb(msg);\n }\n\n get producer() {\n return this.#producer;\n }\n \n get id(): string {\n return this.#id;\n }\n\n async Connect(errorCb: (error: any) => void): Promise<void> {\n if (!this.#connected) {\n try {\n await this.#producer.connect();\n this.#connected = true;\n } catch (error) {\n this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);\n }\n }\n }\n\n async Disconnect(errorCb: (error: any) => void): Promise<void> {\n if (this.#connected) {\n try {\n await this.#producer.disconnect()\n this.#connected = false;\n } catch (error) {\n this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);\n }\n }\n }\n\n SendMessage = async(topic: string, message: { key: string, value: string}, errorCb: (error: any) => void): Promise<RecordMetadata[]> => {\n if (this.#connected) {\n try {\n return this.#producer.send({\n topic,\n messages: [ message ]\n })\n } catch (error) {\n this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));\n return [ ];\n }\n } else {\n await this.Connect((error) => {\n this.#RaiseError(`${process.pid}:KafkaProducer:SendMessage(): Could not producer.connect, Error: [${error}]`, errorCb);\n });\n return [ ];\n }\n }\n\n SendMessages = async(topic: string, messages: { key: string, value: string}[], errorCb: (error: any) => void): Promise<RecordMetadata[]> => {\n if (this.#connected) {\n try {\n return this.#producer.send({\n topic,\n messages\n }) \n } catch (error) {\n this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessages(): Error: [${error}]`));\n return [ ];\n }\n } else {\n await this.Connect((error) => {\n this.#RaiseError(`${process.pid}:KafkaProducer:SendMessages(): Could not producer.connect, Error: [${error}]`, errorCb);\n });\n return [ ];\n }\n }\n}\n","/* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF\n/*\n\nkafka example server #01 - Docker Compose File\n----------------------------------------------\nNote: In this example, the log retention is set to 24 hours (rather than default to 1 week)\nhttps://www.conduktor.io/kafka/kafka-topic-configuration-log-retention/\n\nversion: '2'\nservices:\n zookeeper:\n image: wurstmeister/zookeeper\n ports:\n - \"2181:2181\"\n restart: unless-stopped\n\n kafka:\n image: wurstmeister/kafka\n ports:\n - \"9092:9092\"\n environment:\n DOCKER_API_VERSION: 1.22\n KAFKA_ADVERTISED_HOST_NAME: 192.168.14.92\n KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181\n KAFKA_CREATE_TOPICS: \"topic-name2:3:1\"\n KAFKA_LOG_RETENTION_MS: 86400000\n KAFKA_LOG_RETENTION_BYTES: -1\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n restart: unless-stopped\n\n\nkafka example server #02 - Docker Compose File\n----------------------------------------------\nversion: \"3.9\" # optional since v1.27.0\n\nnetworks:\n app-tier:\n driver: bridge\n\nservices:\n kafka:\n image: 'bitnami/kafka:latest'\n ports:\n - '9092:9092'\n networks:\n - app-tier \n environment:\n - ALLOW_PLAINTEXT_LISTENER=yes\n - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true\n - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.14.92:9092\n\n*/\nimport { ISTSLogger, STSOptionsBase } from '@nsshunt/stsutils'\n\nimport { Kafka, KafkaConfig, logLevel } from 'kafkajs'\n\nimport { v4 as uuidv4 } from 'uuid';\nimport fs from 'node:fs'\n\nimport { KafkaConsumer } from './kafkaconsumer'\nimport { KafkaProducer } from './kafkaproducer'\n\nimport net from 'node:net'\nimport tls from 'node:tls'\n\nimport chalk from 'chalk';\n\nconst KEEP_ALIVE_DELAY = 60000 //@@ in ms\n\n// https://kafka.js.org/docs/configuration\nexport interface IKafkaManagerConfig {\n clientId: string // A logical identifier of an application. Can be used by brokers to apply quotas or trace requests to a specific application. Example: booking-events-processor.\n brokers: string[] // List of Kafka brokers\n adminTimeout: number // Time in milliseconds to wait for a successful admin operation. The default value is: 5000.\n connectionTimeout: number // Time in milliseconds to wait for a successful connection. The default value is: 1000.\n requestTimeout: number // Time in milliseconds to wait for a successful request. The default value is: 30000.\n logLevel: string // There are 5 log levels available: NOTHING, ERROR, WARN, INFO, and DEBUG. INFO is configured by default.\n keepAlive?: number // When specified, the number of ms for socket keep alive processing.\n useSSL: boolean // Use SSL\n ssl?: { // Must be specified if useSSL is true\n rejectUnauthorized: boolean\n cafile: string\n keyfile: string\n certfileFile: string\n }\n logger: ISTSLogger\n}\n\n// https://kafka.js.org/docs/configuration\n// https://github.com/tulios/kafkajs/blob/master/src/network/socketFactory.js\ndeclare interface ICustomSocketFactory {\n host: any,\n port: any,\n ssl: any,\n onConnect: any\n}\n\nexport class KafkaManager extends STSOptionsBase {\n #kafka: Kafka\n\n constructor(options: IKafkaManagerConfig) {\n super(options);\n\n const kc: KafkaConfig = {\n clientId: options.clientId,\n brokers: options.brokers, //brokers: ['localhost:9092', 'kafka2:9092'],\n connectionTimeout: options.connectionTimeout,\n requestTimeout: options.requestTimeout\n }\n // NOTHING, ERROR, WARN, INFO, and DEBUG. INFO is configured by default.\n switch (options.logLevel) {\n case 'NOTHING' :\n kc.logLevel = logLevel.NOTHING;\n break;\n case 'ERROR' :\n kc.logLevel = logLevel.ERROR;\n break;\n case 'WARN' :\n kc.logLevel = logLevel.WARN;\n break;\n case 'INFO' :\n kc.logLevel = logLevel.INFO;\n break;\n case 'DEBUG' :\n kc.logLevel = logLevel.DEBUG;\n break;\n default :\n kc.logLevel = logLevel.NOTHING;\n }\n if (options.useSSL && options.ssl) {\n kc.ssl = {\n ca: [fs.readFileSync(options.ssl.cafile as string, { encoding: 'utf8'})],\n key: fs.readFileSync(options.ssl.keyfile, { encoding: 'utf8'}),\n cert: fs.readFileSync(options.ssl.certfileFile, { encoding: 'utf8'}),\n }\n }\n if (options.keepAlive) {\n //const myCustomSocketFactory = ({ host, port, ssl, onConnect }) => {\n const myCustomSocketFactory = (config: ICustomSocketFactory) => {\n const socket = config.ssl\n ? tls.connect(\n Object.assign({ host: config.host, port: config.port }, !net.isIP(config.host) ? { servername: config.host } : {}, config.ssl),\n config.onConnect\n )\n : net.connect({ host: config.host, port: config.port }, config.onConnect)\n \n socket.setKeepAlive(true, options.keepAlive)\n return socket\n }\n kc.socketFactory = myCustomSocketFactory;\n }\n\n this.#kafka = new Kafka(kc);\n }\n\n #LogErrorMessage(message: any) {\n this.options?.logger.error(message);\n }\n\n #RaiseError = (msg: string, errorCb: (error: any) => void) => {\n this.#LogErrorMessage(chalk.red(msg));\n errorCb(msg);\n }\n\n get kafka() {\n return this.#kafka;\n }\n\n CreateProducer(): KafkaProducer {\n return new KafkaProducer({\n kafka: this.#kafka,\n id: uuidv4(),\n logger: this.options?.logger});\n }\n\n CreateConsumer(groupId: string) {\n return new KafkaConsumer({\n kafka: this.#kafka, \n id: uuidv4(), \n groupId,\n logger: this.options?.logger});\n }\n\n CreateTopic = async (topic: string, partitions: number, errorCb: (error: any) => void): Promise<boolean> => {\n try {\n const admin = this.#kafka.admin()\n await admin.connect()\n const result = await admin.createTopics({\n validateOnly: false,\n waitForLeaders: true,\n timeout: this.options?.timeout,\n topics: [\n {\n topic: topic,\n numPartitions: partitions, // default: -1 (uses broker `num.partitions` configuration)\n //replicationFactor: <Number>, // default: -1 (uses broker `default.replication.factor` configuration)\n //replicaAssignment: <Array>, // Example: [{ partition: 0, replicas: [0,1,2] }] - default: []\n //configEntries: <Array> // Example: [{ name: 'cleanup.policy', value: 'compact' }] - default: []\n } \n ]\n })\n await admin.disconnect()\n return result;\n } catch (error) {\n this.#RaiseError(`KafkaManager:CreateTopic(): Error: [${error}]`, errorCb);\n return false;\n }\n }\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
package/dist/stskafka.umd.js
DELETED
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
(function(global, factory) {
|
|
2
|
-
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@nsshunt/stsutils"), require("kafkajs"), require("uuid"), require("node:fs"), require("chalk"), require("node:net"), require("node:tls")) : typeof define === "function" && define.amd ? define(["exports", "@nsshunt/stsutils", "kafkajs", "uuid", "node:fs", "chalk", "node:net", "node:tls"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["@nsshunt/stskafka"] = {}, global.stsutils, global.kafkajs, global.uuid, global.fs, global.chalk, global.net, global.tls));
|
|
3
|
-
})(this, (function(exports2, stsutils, kafkajs, uuid, fs, chalk, net, tls) {
|
|
4
|
-
"use strict";
|
|
5
|
-
class KafkaConsumer {
|
|
6
|
-
#id;
|
|
7
|
-
#groupId;
|
|
8
|
-
#consumer;
|
|
9
|
-
#kafka;
|
|
10
|
-
#connected = false;
|
|
11
|
-
#options;
|
|
12
|
-
constructor(options) {
|
|
13
|
-
this.#options = options;
|
|
14
|
-
this.#id = this.#options.id;
|
|
15
|
-
this.#groupId = this.#options.groupId;
|
|
16
|
-
this.#kafka = this.#options.kafka;
|
|
17
|
-
this.#consumer = this.#kafka.consumer({
|
|
18
|
-
groupId: this.#groupId,
|
|
19
|
-
retry: {
|
|
20
|
-
restartOnFailure: async (error) => {
|
|
21
|
-
this.#LogErrorMessage(chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`));
|
|
22
|
-
return true;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
#LogErrorMessage(message) {
|
|
28
|
-
this.#options.logger.error(message);
|
|
29
|
-
}
|
|
30
|
-
get consumer() {
|
|
31
|
-
return this.#consumer;
|
|
32
|
-
}
|
|
33
|
-
get id() {
|
|
34
|
-
return this.#id;
|
|
35
|
-
}
|
|
36
|
-
#RaiseError = (msg, errorCb) => {
|
|
37
|
-
const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
|
|
38
|
-
this.#LogErrorMessage(chalk.red(errorMessage));
|
|
39
|
-
errorCb(errorMessage);
|
|
40
|
-
};
|
|
41
|
-
async Connect(errorCb) {
|
|
42
|
-
if (!this.#connected) {
|
|
43
|
-
try {
|
|
44
|
-
await this.#consumer.connect();
|
|
45
|
-
this.#connected = true;
|
|
46
|
-
} catch (error) {
|
|
47
|
-
this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
async Disconnect(errorCb) {
|
|
52
|
-
if (this.#connected) {
|
|
53
|
-
try {
|
|
54
|
-
await this.#consumer.disconnect();
|
|
55
|
-
this.#connected = false;
|
|
56
|
-
} catch (error) {
|
|
57
|
-
this.#RaiseError(`Disconnect(): Error: [${error}]`, errorCb);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
Subscribe = async (topics, fromBeginning, errorCb) => {
|
|
62
|
-
if (this.#connected) {
|
|
63
|
-
try {
|
|
64
|
-
await this.#consumer.subscribe({ topics, fromBeginning });
|
|
65
|
-
} catch (error) {
|
|
66
|
-
this.#RaiseError(`Subscribe(): Error: [${error}]`, errorCb);
|
|
67
|
-
}
|
|
68
|
-
} else {
|
|
69
|
-
await this.Connect((error) => {
|
|
70
|
-
this.#RaiseError(`Subscribe(): Could not consumer.connect, Error: [${error}]`, errorCb);
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
Stop = async (errorCb) => {
|
|
75
|
-
if (this.#connected) {
|
|
76
|
-
try {
|
|
77
|
-
await this.#consumer.stop();
|
|
78
|
-
} catch (error) {
|
|
79
|
-
this.#RaiseError(`Stop(): Error: [${error}]`, errorCb);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
StartConsumingMessages = async (autoCommit, cb, errorCb) => {
|
|
84
|
-
if (this.#connected) {
|
|
85
|
-
await this.#consumer.run({
|
|
86
|
-
autoCommit,
|
|
87
|
-
eachMessage: async ({ topic, partition, message, heartbeat, pause }) => {
|
|
88
|
-
try {
|
|
89
|
-
cb(topic, partition, message, heartbeat, pause);
|
|
90
|
-
} catch (error) {
|
|
91
|
-
this.#RaiseError(`StartConsumingMessages:eachMessage(): Error: [${error}]`, errorCb);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
} else {
|
|
96
|
-
await this.Connect((error) => {
|
|
97
|
-
this.#RaiseError(`StartConsumingMessages(): Could not consumer.connect, Error: [${error}]`, errorCb);
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
class KafkaProducer {
|
|
103
|
-
#options;
|
|
104
|
-
#id;
|
|
105
|
-
#producer;
|
|
106
|
-
#kafka;
|
|
107
|
-
#connected = false;
|
|
108
|
-
constructor(options) {
|
|
109
|
-
this.#options = options;
|
|
110
|
-
this.#id = this.#options.id;
|
|
111
|
-
this.#kafka = this.#options.kafka;
|
|
112
|
-
this.#producer = this.#kafka.producer();
|
|
113
|
-
}
|
|
114
|
-
#LogErrorMessage(message) {
|
|
115
|
-
this.#options.logger.error(message);
|
|
116
|
-
}
|
|
117
|
-
#RaiseError = (msg, errorCb) => {
|
|
118
|
-
this.#LogErrorMessage(chalk.red(msg));
|
|
119
|
-
errorCb(msg);
|
|
120
|
-
};
|
|
121
|
-
get producer() {
|
|
122
|
-
return this.#producer;
|
|
123
|
-
}
|
|
124
|
-
get id() {
|
|
125
|
-
return this.#id;
|
|
126
|
-
}
|
|
127
|
-
async Connect(errorCb) {
|
|
128
|
-
if (!this.#connected) {
|
|
129
|
-
try {
|
|
130
|
-
await this.#producer.connect();
|
|
131
|
-
this.#connected = true;
|
|
132
|
-
} catch (error) {
|
|
133
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
async Disconnect(errorCb) {
|
|
138
|
-
if (this.#connected) {
|
|
139
|
-
try {
|
|
140
|
-
await this.#producer.disconnect();
|
|
141
|
-
this.#connected = false;
|
|
142
|
-
} catch (error) {
|
|
143
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
SendMessage = async (topic, message, errorCb) => {
|
|
148
|
-
if (this.#connected) {
|
|
149
|
-
try {
|
|
150
|
-
return this.#producer.send({
|
|
151
|
-
topic,
|
|
152
|
-
messages: [message]
|
|
153
|
-
});
|
|
154
|
-
} catch (error) {
|
|
155
|
-
this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));
|
|
156
|
-
return [];
|
|
157
|
-
}
|
|
158
|
-
} else {
|
|
159
|
-
await this.Connect((error) => {
|
|
160
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:SendMessage(): Could not producer.connect, Error: [${error}]`, errorCb);
|
|
161
|
-
});
|
|
162
|
-
return [];
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
SendMessages = async (topic, messages, errorCb) => {
|
|
166
|
-
if (this.#connected) {
|
|
167
|
-
try {
|
|
168
|
-
return this.#producer.send({
|
|
169
|
-
topic,
|
|
170
|
-
messages
|
|
171
|
-
});
|
|
172
|
-
} catch (error) {
|
|
173
|
-
this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessages(): Error: [${error}]`));
|
|
174
|
-
return [];
|
|
175
|
-
}
|
|
176
|
-
} else {
|
|
177
|
-
await this.Connect((error) => {
|
|
178
|
-
this.#RaiseError(`${process.pid}:KafkaProducer:SendMessages(): Could not producer.connect, Error: [${error}]`, errorCb);
|
|
179
|
-
});
|
|
180
|
-
return [];
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
class KafkaManager extends stsutils.STSOptionsBase {
|
|
185
|
-
#kafka;
|
|
186
|
-
constructor(options) {
|
|
187
|
-
super(options);
|
|
188
|
-
const kc = {
|
|
189
|
-
clientId: options.clientId,
|
|
190
|
-
brokers: options.brokers,
|
|
191
|
-
//brokers: ['localhost:9092', 'kafka2:9092'],
|
|
192
|
-
connectionTimeout: options.connectionTimeout,
|
|
193
|
-
requestTimeout: options.requestTimeout
|
|
194
|
-
};
|
|
195
|
-
switch (options.logLevel) {
|
|
196
|
-
case "NOTHING":
|
|
197
|
-
kc.logLevel = kafkajs.logLevel.NOTHING;
|
|
198
|
-
break;
|
|
199
|
-
case "ERROR":
|
|
200
|
-
kc.logLevel = kafkajs.logLevel.ERROR;
|
|
201
|
-
break;
|
|
202
|
-
case "WARN":
|
|
203
|
-
kc.logLevel = kafkajs.logLevel.WARN;
|
|
204
|
-
break;
|
|
205
|
-
case "INFO":
|
|
206
|
-
kc.logLevel = kafkajs.logLevel.INFO;
|
|
207
|
-
break;
|
|
208
|
-
case "DEBUG":
|
|
209
|
-
kc.logLevel = kafkajs.logLevel.DEBUG;
|
|
210
|
-
break;
|
|
211
|
-
default:
|
|
212
|
-
kc.logLevel = kafkajs.logLevel.NOTHING;
|
|
213
|
-
}
|
|
214
|
-
if (options.useSSL && options.ssl) {
|
|
215
|
-
kc.ssl = {
|
|
216
|
-
ca: [fs.readFileSync(options.ssl.cafile, { encoding: "utf8" })],
|
|
217
|
-
key: fs.readFileSync(options.ssl.keyfile, { encoding: "utf8" }),
|
|
218
|
-
cert: fs.readFileSync(options.ssl.certfileFile, { encoding: "utf8" })
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
if (options.keepAlive) {
|
|
222
|
-
const myCustomSocketFactory = (config) => {
|
|
223
|
-
const socket = config.ssl ? tls.connect(
|
|
224
|
-
Object.assign({ host: config.host, port: config.port }, !net.isIP(config.host) ? { servername: config.host } : {}, config.ssl),
|
|
225
|
-
config.onConnect
|
|
226
|
-
) : net.connect({ host: config.host, port: config.port }, config.onConnect);
|
|
227
|
-
socket.setKeepAlive(true, options.keepAlive);
|
|
228
|
-
return socket;
|
|
229
|
-
};
|
|
230
|
-
kc.socketFactory = myCustomSocketFactory;
|
|
231
|
-
}
|
|
232
|
-
this.#kafka = new kafkajs.Kafka(kc);
|
|
233
|
-
}
|
|
234
|
-
#LogErrorMessage(message) {
|
|
235
|
-
this.options?.logger.error(message);
|
|
236
|
-
}
|
|
237
|
-
#RaiseError = (msg, errorCb) => {
|
|
238
|
-
this.#LogErrorMessage(chalk.red(msg));
|
|
239
|
-
errorCb(msg);
|
|
240
|
-
};
|
|
241
|
-
get kafka() {
|
|
242
|
-
return this.#kafka;
|
|
243
|
-
}
|
|
244
|
-
CreateProducer() {
|
|
245
|
-
return new KafkaProducer({
|
|
246
|
-
kafka: this.#kafka,
|
|
247
|
-
id: uuid.v4(),
|
|
248
|
-
logger: this.options?.logger
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
CreateConsumer(groupId) {
|
|
252
|
-
return new KafkaConsumer({
|
|
253
|
-
kafka: this.#kafka,
|
|
254
|
-
id: uuid.v4(),
|
|
255
|
-
groupId,
|
|
256
|
-
logger: this.options?.logger
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
CreateTopic = async (topic, partitions, errorCb) => {
|
|
260
|
-
try {
|
|
261
|
-
const admin = this.#kafka.admin();
|
|
262
|
-
await admin.connect();
|
|
263
|
-
const result = await admin.createTopics({
|
|
264
|
-
validateOnly: false,
|
|
265
|
-
waitForLeaders: true,
|
|
266
|
-
timeout: this.options?.timeout,
|
|
267
|
-
topics: [
|
|
268
|
-
{
|
|
269
|
-
topic,
|
|
270
|
-
numPartitions: partitions
|
|
271
|
-
// default: -1 (uses broker `num.partitions` configuration)
|
|
272
|
-
//replicationFactor: <Number>, // default: -1 (uses broker `default.replication.factor` configuration)
|
|
273
|
-
//replicaAssignment: <Array>, // Example: [{ partition: 0, replicas: [0,1,2] }] - default: []
|
|
274
|
-
//configEntries: <Array> // Example: [{ name: 'cleanup.policy', value: 'compact' }] - default: []
|
|
275
|
-
}
|
|
276
|
-
]
|
|
277
|
-
});
|
|
278
|
-
await admin.disconnect();
|
|
279
|
-
return result;
|
|
280
|
-
} catch (error) {
|
|
281
|
-
this.#RaiseError(`KafkaManager:CreateTopic(): Error: [${error}]`, errorCb);
|
|
282
|
-
return false;
|
|
283
|
-
}
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
exports2.KafkaConsumer = KafkaConsumer;
|
|
287
|
-
exports2.KafkaManager = KafkaManager;
|
|
288
|
-
exports2.KafkaProducer = KafkaProducer;
|
|
289
|
-
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
290
|
-
}));
|
|
291
|
-
//# sourceMappingURL=stskafka.umd.js.map
|