@nsshunt/stskafka 1.0.35 → 1.0.37

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/stskafka.mjs CHANGED
@@ -1,15 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __typeError = (msg) => {
3
- throw TypeError(msg);
4
- };
5
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
- var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12
- var _id, _groupId, _consumer, _kafka, _connected, _options, _KafkaConsumer_instances, LogErrorMessage_fn, _RaiseError, _options2, _id2, _producer, _kafka2, _connected2, _KafkaProducer_instances, LogErrorMessage_fn2, _RaiseError2, _kafka3, _KafkaManager_instances, LogErrorMessage_fn3, _RaiseError3;
13
1
  import { STSOptionsBase } from "@nsshunt/stsutils";
14
2
  import { logLevel, Kafka } from "kafkajs";
15
3
  import { v4 } from "uuid";
@@ -18,237 +6,188 @@ import chalk from "chalk";
18
6
  import net from "node:net";
19
7
  import tls from "node:tls";
20
8
  class KafkaConsumer {
9
+ #id;
10
+ #groupId;
11
+ #consumer;
12
+ #kafka;
13
+ #connected = false;
14
+ #options;
21
15
  constructor(options) {
22
- __privateAdd(this, _KafkaConsumer_instances);
23
- __privateAdd(this, _id);
24
- __privateAdd(this, _groupId);
25
- __privateAdd(this, _consumer);
26
- __privateAdd(this, _kafka);
27
- __privateAdd(this, _connected, false);
28
- __privateAdd(this, _options);
29
- __privateAdd(this, _RaiseError, (msg, errorCb) => {
30
- const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
31
- __privateMethod(this, _KafkaConsumer_instances, LogErrorMessage_fn).call(this, chalk.red(errorMessage));
32
- errorCb(errorMessage);
33
- });
34
- __publicField(this, "Subscribe", async (topics, fromBeginning, errorCb) => {
35
- if (__privateGet(this, _connected)) {
36
- try {
37
- await __privateGet(this, _consumer).subscribe({ topics, fromBeginning });
38
- } catch (error) {
39
- __privateGet(this, _RaiseError).call(this, `Subscribe(): Error: [${error}]`, errorCb);
40
- }
41
- } else {
42
- await this.Connect((error) => {
43
- __privateGet(this, _RaiseError).call(this, `Subscribe(): Could not consumer.connect, Error: [${error}]`, errorCb);
44
- });
45
- }
46
- });
47
- __publicField(this, "Stop", async (errorCb) => {
48
- if (__privateGet(this, _connected)) {
49
- try {
50
- await __privateGet(this, _consumer).stop();
51
- } catch (error) {
52
- __privateGet(this, _RaiseError).call(this, `Stop(): Error: [${error}]`, errorCb);
53
- }
54
- }
55
- });
56
- __publicField(this, "StartConsumingMessages", async (autoCommit, cb, errorCb) => {
57
- if (__privateGet(this, _connected)) {
58
- await __privateGet(this, _consumer).run({
59
- autoCommit,
60
- eachMessage: async ({ topic, partition, message, heartbeat, pause }) => {
61
- try {
62
- cb(topic, partition, message, heartbeat, pause);
63
- } catch (error) {
64
- __privateGet(this, _RaiseError).call(this, `StartConsumingMessages:eachMessage(): Error: [${error}]`, errorCb);
65
- }
66
- }
67
- });
68
- } else {
69
- await this.Connect((error) => {
70
- __privateGet(this, _RaiseError).call(this, `StartConsumingMessages(): Could not consumer.connect, Error: [${error}]`, errorCb);
71
- });
72
- }
73
- });
74
- __privateSet(this, _options, options);
75
- __privateSet(this, _id, __privateGet(this, _options).id);
76
- __privateSet(this, _groupId, __privateGet(this, _options).groupId);
77
- __privateSet(this, _kafka, __privateGet(this, _options).kafka);
78
- __privateSet(this, _consumer, __privateGet(this, _kafka).consumer({
79
- groupId: __privateGet(this, _groupId),
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,
80
22
  retry: {
81
23
  restartOnFailure: async (error) => {
82
- __privateMethod(this, _KafkaConsumer_instances, LogErrorMessage_fn).call(this, chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`));
24
+ this.#LogErrorMessage(chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`));
83
25
  return true;
84
26
  }
85
27
  }
86
- }));
28
+ });
29
+ }
30
+ #LogErrorMessage(message) {
31
+ this.#options.logger.error(message);
87
32
  }
88
33
  get consumer() {
89
- return __privateGet(this, _consumer);
34
+ return this.#consumer;
90
35
  }
91
36
  get id() {
92
- return __privateGet(this, _id);
37
+ return this.#id;
93
38
  }
39
+ #RaiseError = (msg, errorCb) => {
40
+ const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
41
+ this.#LogErrorMessage(chalk.red(errorMessage));
42
+ errorCb(errorMessage);
43
+ };
94
44
  async Connect(errorCb) {
95
- if (!__privateGet(this, _connected)) {
45
+ if (!this.#connected) {
96
46
  try {
97
- await __privateGet(this, _consumer).connect();
98
- __privateSet(this, _connected, true);
47
+ await this.#consumer.connect();
48
+ this.#connected = true;
99
49
  } catch (error) {
100
- __privateGet(this, _RaiseError).call(this, `Connect(): Error: [${error}]`, errorCb);
50
+ this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
101
51
  }
102
52
  }
103
53
  }
104
54
  async Disconnect(errorCb) {
105
- if (__privateGet(this, _connected)) {
55
+ if (this.#connected) {
106
56
  try {
107
- await __privateGet(this, _consumer).disconnect();
108
- __privateSet(this, _connected, false);
57
+ await this.#consumer.disconnect();
58
+ this.#connected = false;
109
59
  } catch (error) {
110
- __privateGet(this, _RaiseError).call(this, `Disconnect(): Error: [${error}]`, errorCb);
60
+ this.#RaiseError(`Disconnect(): Error: [${error}]`, errorCb);
111
61
  }
112
62
  }
113
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
+ };
114
104
  }
115
- _id = new WeakMap();
116
- _groupId = new WeakMap();
117
- _consumer = new WeakMap();
118
- _kafka = new WeakMap();
119
- _connected = new WeakMap();
120
- _options = new WeakMap();
121
- _KafkaConsumer_instances = new WeakSet();
122
- LogErrorMessage_fn = function(message) {
123
- __privateGet(this, _options).logger.error(message);
124
- };
125
- _RaiseError = new WeakMap();
126
105
  class KafkaProducer {
106
+ #options;
107
+ #id;
108
+ #producer;
109
+ #kafka;
110
+ #connected = false;
127
111
  constructor(options) {
128
- __privateAdd(this, _KafkaProducer_instances);
129
- __privateAdd(this, _options2);
130
- __privateAdd(this, _id2);
131
- __privateAdd(this, _producer);
132
- __privateAdd(this, _kafka2);
133
- __privateAdd(this, _connected2, false);
134
- __privateAdd(this, _RaiseError2, (msg, errorCb) => {
135
- __privateMethod(this, _KafkaProducer_instances, LogErrorMessage_fn2).call(this, chalk.red(msg));
136
- errorCb(msg);
137
- });
138
- __publicField(this, "SendMessage", async (topic, message, errorCb) => {
139
- if (__privateGet(this, _connected2)) {
140
- try {
141
- return __privateGet(this, _producer).send({
142
- topic,
143
- messages: [message]
144
- });
145
- } catch (error) {
146
- __privateMethod(this, _KafkaProducer_instances, LogErrorMessage_fn2).call(this, chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));
147
- return [];
148
- }
149
- } else {
150
- await this.Connect((error) => {
151
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:SendMessage(): Could not producer.connect, Error: [${error}]`, errorCb);
152
- });
153
- return [];
154
- }
155
- });
156
- __publicField(this, "SendMessages", async (topic, messages, errorCb) => {
157
- if (__privateGet(this, _connected2)) {
158
- try {
159
- return __privateGet(this, _producer).send({
160
- topic,
161
- messages
162
- });
163
- } catch (error) {
164
- __privateMethod(this, _KafkaProducer_instances, LogErrorMessage_fn2).call(this, chalk.red(`${process.pid}:KafkaProducer:SendMessages(): Error: [${error}]`));
165
- return [];
166
- }
167
- } else {
168
- await this.Connect((error) => {
169
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:SendMessages(): Could not producer.connect, Error: [${error}]`, errorCb);
170
- });
171
- return [];
172
- }
173
- });
174
- __privateSet(this, _options2, options);
175
- __privateSet(this, _id2, __privateGet(this, _options2).id);
176
- __privateSet(this, _kafka2, __privateGet(this, _options2).kafka);
177
- __privateSet(this, _producer, __privateGet(this, _kafka2).producer());
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);
178
119
  }
120
+ #RaiseError = (msg, errorCb) => {
121
+ this.#LogErrorMessage(chalk.red(msg));
122
+ errorCb(msg);
123
+ };
179
124
  get producer() {
180
- return __privateGet(this, _producer);
125
+ return this.#producer;
181
126
  }
182
127
  get id() {
183
- return __privateGet(this, _id2);
128
+ return this.#id;
184
129
  }
185
130
  async Connect(errorCb) {
186
- if (!__privateGet(this, _connected2)) {
131
+ if (!this.#connected) {
187
132
  try {
188
- await __privateGet(this, _producer).connect();
189
- __privateSet(this, _connected2, true);
133
+ await this.#producer.connect();
134
+ this.#connected = true;
190
135
  } catch (error) {
191
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
136
+ this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
192
137
  }
193
138
  }
194
139
  }
195
140
  async Disconnect(errorCb) {
196
- if (__privateGet(this, _connected2)) {
141
+ if (this.#connected) {
197
142
  try {
198
- await __privateGet(this, _producer).disconnect();
199
- __privateSet(this, _connected2, false);
143
+ await this.#producer.disconnect();
144
+ this.#connected = false;
200
145
  } catch (error) {
201
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
146
+ this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
202
147
  }
203
148
  }
204
149
  }
205
- }
206
- _options2 = new WeakMap();
207
- _id2 = new WeakMap();
208
- _producer = new WeakMap();
209
- _kafka2 = new WeakMap();
210
- _connected2 = new WeakMap();
211
- _KafkaProducer_instances = new WeakSet();
212
- LogErrorMessage_fn2 = function(message) {
213
- __privateGet(this, _options2).logger.error(message);
214
- };
215
- _RaiseError2 = new WeakMap();
216
- class KafkaManager extends STSOptionsBase {
217
- constructor(options) {
218
- super(options);
219
- __privateAdd(this, _KafkaManager_instances);
220
- __privateAdd(this, _kafka3);
221
- __privateAdd(this, _RaiseError3, (msg, errorCb) => {
222
- __privateMethod(this, _KafkaManager_instances, LogErrorMessage_fn3).call(this, chalk.red(msg));
223
- errorCb(msg);
224
- });
225
- __publicField(this, "CreateTopic", async (topic, partitions, errorCb) => {
226
- var _a;
150
+ SendMessage = async (topic, message, errorCb) => {
151
+ if (this.#connected) {
227
152
  try {
228
- const admin = __privateGet(this, _kafka3).admin();
229
- await admin.connect();
230
- const result = await admin.createTopics({
231
- validateOnly: false,
232
- waitForLeaders: true,
233
- timeout: (_a = this.options) == null ? void 0 : _a.timeout,
234
- topics: [
235
- {
236
- topic,
237
- numPartitions: partitions
238
- // default: -1 (uses broker `num.partitions` configuration)
239
- //replicationFactor: <Number>, // default: -1 (uses broker `default.replication.factor` configuration)
240
- //replicaAssignment: <Array>, // Example: [{ partition: 0, replicas: [0,1,2] }] - default: []
241
- //configEntries: <Array> // Example: [{ name: 'cleanup.policy', value: 'compact' }] - default: []
242
- }
243
- ]
153
+ return this.#producer.send({
154
+ topic,
155
+ messages: [message]
244
156
  });
245
- await admin.disconnect();
246
- return result;
247
157
  } catch (error) {
248
- __privateGet(this, _RaiseError3).call(this, `KafkaManager:CreateTopic(): Error: [${error}]`, errorCb);
249
- return false;
158
+ this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));
159
+ return [];
250
160
  }
251
- });
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);
252
191
  const kc = {
253
192
  clientId: options.clientId,
254
193
  brokers: options.brokers,
@@ -293,36 +232,60 @@ class KafkaManager extends STSOptionsBase {
293
232
  };
294
233
  kc.socketFactory = myCustomSocketFactory;
295
234
  }
296
- __privateSet(this, _kafka3, new Kafka(kc));
235
+ this.#kafka = new Kafka(kc);
236
+ }
237
+ #LogErrorMessage(message) {
238
+ this.options?.logger.error(message);
297
239
  }
240
+ #RaiseError = (msg, errorCb) => {
241
+ this.#LogErrorMessage(chalk.red(msg));
242
+ errorCb(msg);
243
+ };
298
244
  get kafka() {
299
- return __privateGet(this, _kafka3);
245
+ return this.#kafka;
300
246
  }
301
247
  CreateProducer() {
302
- var _a;
303
248
  return new KafkaProducer({
304
- kafka: __privateGet(this, _kafka3),
249
+ kafka: this.#kafka,
305
250
  id: v4(),
306
- logger: (_a = this.options) == null ? void 0 : _a.logger
251
+ logger: this.options?.logger
307
252
  });
308
253
  }
309
254
  CreateConsumer(groupId) {
310
- var _a;
311
255
  return new KafkaConsumer({
312
- kafka: __privateGet(this, _kafka3),
256
+ kafka: this.#kafka,
313
257
  id: v4(),
314
258
  groupId,
315
- logger: (_a = this.options) == null ? void 0 : _a.logger
259
+ logger: this.options?.logger
316
260
  });
317
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
+ };
318
288
  }
319
- _kafka3 = new WeakMap();
320
- _KafkaManager_instances = new WeakSet();
321
- LogErrorMessage_fn3 = function(message) {
322
- var _a;
323
- (_a = this.options) == null ? void 0 : _a.logger.error(message);
324
- };
325
- _RaiseError3 = new WeakMap();
326
289
  export {
327
290
  KafkaConsumer,
328
291
  KafkaManager,
@@ -1 +1 @@
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":["_options","_id","_kafka","_connected","_RaiseError","LogErrorMessage_fn","uuidv4"],"mappings":"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"}
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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"}
@@ -1,251 +1,190 @@
1
1
  (function(global, factory) {
2
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["node:fs"], global.chalk, global["node:net"], global["node:tls"]));
3
3
  })(this, function(exports2, stsutils, kafkajs, uuid, fs, chalk, net, tls) {
4
- "use strict";var __defProp = Object.defineProperty;
5
- var __typeError = (msg) => {
6
- throw TypeError(msg);
7
- };
8
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
11
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
12
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
13
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
14
- var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
15
-
16
- var _id, _groupId, _consumer, _kafka, _connected, _options, _KafkaConsumer_instances, LogErrorMessage_fn, _RaiseError, _options2, _id2, _producer, _kafka2, _connected2, _KafkaProducer_instances, LogErrorMessage_fn2, _RaiseError2, _kafka3, _KafkaManager_instances, LogErrorMessage_fn3, _RaiseError3;
4
+ "use strict";
17
5
  class KafkaConsumer {
6
+ #id;
7
+ #groupId;
8
+ #consumer;
9
+ #kafka;
10
+ #connected = false;
11
+ #options;
18
12
  constructor(options) {
19
- __privateAdd(this, _KafkaConsumer_instances);
20
- __privateAdd(this, _id);
21
- __privateAdd(this, _groupId);
22
- __privateAdd(this, _consumer);
23
- __privateAdd(this, _kafka);
24
- __privateAdd(this, _connected, false);
25
- __privateAdd(this, _options);
26
- __privateAdd(this, _RaiseError, (msg, errorCb) => {
27
- const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
28
- __privateMethod(this, _KafkaConsumer_instances, LogErrorMessage_fn).call(this, chalk.red(errorMessage));
29
- errorCb(errorMessage);
30
- });
31
- __publicField(this, "Subscribe", async (topics, fromBeginning, errorCb) => {
32
- if (__privateGet(this, _connected)) {
33
- try {
34
- await __privateGet(this, _consumer).subscribe({ topics, fromBeginning });
35
- } catch (error) {
36
- __privateGet(this, _RaiseError).call(this, `Subscribe(): Error: [${error}]`, errorCb);
37
- }
38
- } else {
39
- await this.Connect((error) => {
40
- __privateGet(this, _RaiseError).call(this, `Subscribe(): Could not consumer.connect, Error: [${error}]`, errorCb);
41
- });
42
- }
43
- });
44
- __publicField(this, "Stop", async (errorCb) => {
45
- if (__privateGet(this, _connected)) {
46
- try {
47
- await __privateGet(this, _consumer).stop();
48
- } catch (error) {
49
- __privateGet(this, _RaiseError).call(this, `Stop(): Error: [${error}]`, errorCb);
50
- }
51
- }
52
- });
53
- __publicField(this, "StartConsumingMessages", async (autoCommit, cb, errorCb) => {
54
- if (__privateGet(this, _connected)) {
55
- await __privateGet(this, _consumer).run({
56
- autoCommit,
57
- eachMessage: async ({ topic, partition, message, heartbeat, pause }) => {
58
- try {
59
- cb(topic, partition, message, heartbeat, pause);
60
- } catch (error) {
61
- __privateGet(this, _RaiseError).call(this, `StartConsumingMessages:eachMessage(): Error: [${error}]`, errorCb);
62
- }
63
- }
64
- });
65
- } else {
66
- await this.Connect((error) => {
67
- __privateGet(this, _RaiseError).call(this, `StartConsumingMessages(): Could not consumer.connect, Error: [${error}]`, errorCb);
68
- });
69
- }
70
- });
71
- __privateSet(this, _options, options);
72
- __privateSet(this, _id, __privateGet(this, _options).id);
73
- __privateSet(this, _groupId, __privateGet(this, _options).groupId);
74
- __privateSet(this, _kafka, __privateGet(this, _options).kafka);
75
- __privateSet(this, _consumer, __privateGet(this, _kafka).consumer({
76
- groupId: __privateGet(this, _groupId),
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,
77
19
  retry: {
78
20
  restartOnFailure: async (error) => {
79
- __privateMethod(this, _KafkaConsumer_instances, LogErrorMessage_fn).call(this, chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`));
21
+ this.#LogErrorMessage(chalk.magenta(`${process.pid}:KafkaConsumer:constructor:restartOnFailure(): Error: [${error}]`));
80
22
  return true;
81
23
  }
82
24
  }
83
- }));
25
+ });
26
+ }
27
+ #LogErrorMessage(message) {
28
+ this.#options.logger.error(message);
84
29
  }
85
30
  get consumer() {
86
- return __privateGet(this, _consumer);
31
+ return this.#consumer;
87
32
  }
88
33
  get id() {
89
- return __privateGet(this, _id);
34
+ return this.#id;
90
35
  }
36
+ #RaiseError = (msg, errorCb) => {
37
+ const errorMessage = `${process.pid}:KafkaConsumer:${msg}`;
38
+ this.#LogErrorMessage(chalk.red(errorMessage));
39
+ errorCb(errorMessage);
40
+ };
91
41
  async Connect(errorCb) {
92
- if (!__privateGet(this, _connected)) {
42
+ if (!this.#connected) {
93
43
  try {
94
- await __privateGet(this, _consumer).connect();
95
- __privateSet(this, _connected, true);
44
+ await this.#consumer.connect();
45
+ this.#connected = true;
96
46
  } catch (error) {
97
- __privateGet(this, _RaiseError).call(this, `Connect(): Error: [${error}]`, errorCb);
47
+ this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
98
48
  }
99
49
  }
100
50
  }
101
51
  async Disconnect(errorCb) {
102
- if (__privateGet(this, _connected)) {
52
+ if (this.#connected) {
103
53
  try {
104
- await __privateGet(this, _consumer).disconnect();
105
- __privateSet(this, _connected, false);
54
+ await this.#consumer.disconnect();
55
+ this.#connected = false;
106
56
  } catch (error) {
107
- __privateGet(this, _RaiseError).call(this, `Disconnect(): Error: [${error}]`, errorCb);
57
+ this.#RaiseError(`Disconnect(): Error: [${error}]`, errorCb);
108
58
  }
109
59
  }
110
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
+ };
111
101
  }
112
- _id = new WeakMap();
113
- _groupId = new WeakMap();
114
- _consumer = new WeakMap();
115
- _kafka = new WeakMap();
116
- _connected = new WeakMap();
117
- _options = new WeakMap();
118
- _KafkaConsumer_instances = new WeakSet();
119
- LogErrorMessage_fn = function(message) {
120
- __privateGet(this, _options).logger.error(message);
121
- };
122
- _RaiseError = new WeakMap();
123
102
  class KafkaProducer {
103
+ #options;
104
+ #id;
105
+ #producer;
106
+ #kafka;
107
+ #connected = false;
124
108
  constructor(options) {
125
- __privateAdd(this, _KafkaProducer_instances);
126
- __privateAdd(this, _options2);
127
- __privateAdd(this, _id2);
128
- __privateAdd(this, _producer);
129
- __privateAdd(this, _kafka2);
130
- __privateAdd(this, _connected2, false);
131
- __privateAdd(this, _RaiseError2, (msg, errorCb) => {
132
- __privateMethod(this, _KafkaProducer_instances, LogErrorMessage_fn2).call(this, chalk.red(msg));
133
- errorCb(msg);
134
- });
135
- __publicField(this, "SendMessage", async (topic, message, errorCb) => {
136
- if (__privateGet(this, _connected2)) {
137
- try {
138
- return __privateGet(this, _producer).send({
139
- topic,
140
- messages: [message]
141
- });
142
- } catch (error) {
143
- __privateMethod(this, _KafkaProducer_instances, LogErrorMessage_fn2).call(this, chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));
144
- return [];
145
- }
146
- } else {
147
- await this.Connect((error) => {
148
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:SendMessage(): Could not producer.connect, Error: [${error}]`, errorCb);
149
- });
150
- return [];
151
- }
152
- });
153
- __publicField(this, "SendMessages", async (topic, messages, errorCb) => {
154
- if (__privateGet(this, _connected2)) {
155
- try {
156
- return __privateGet(this, _producer).send({
157
- topic,
158
- messages
159
- });
160
- } catch (error) {
161
- __privateMethod(this, _KafkaProducer_instances, LogErrorMessage_fn2).call(this, chalk.red(`${process.pid}:KafkaProducer:SendMessages(): Error: [${error}]`));
162
- return [];
163
- }
164
- } else {
165
- await this.Connect((error) => {
166
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:SendMessages(): Could not producer.connect, Error: [${error}]`, errorCb);
167
- });
168
- return [];
169
- }
170
- });
171
- __privateSet(this, _options2, options);
172
- __privateSet(this, _id2, __privateGet(this, _options2).id);
173
- __privateSet(this, _kafka2, __privateGet(this, _options2).kafka);
174
- __privateSet(this, _producer, __privateGet(this, _kafka2).producer());
109
+ this.#options = options;
110
+ this.#id = this.#options.id;
111
+ this.#kafka = this.#options.kafka;
112
+ this.#producer = this.#kafka.producer();
175
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
+ };
176
121
  get producer() {
177
- return __privateGet(this, _producer);
122
+ return this.#producer;
178
123
  }
179
124
  get id() {
180
- return __privateGet(this, _id2);
125
+ return this.#id;
181
126
  }
182
127
  async Connect(errorCb) {
183
- if (!__privateGet(this, _connected2)) {
128
+ if (!this.#connected) {
184
129
  try {
185
- await __privateGet(this, _producer).connect();
186
- __privateSet(this, _connected2, true);
130
+ await this.#producer.connect();
131
+ this.#connected = true;
187
132
  } catch (error) {
188
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
133
+ this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
189
134
  }
190
135
  }
191
136
  }
192
137
  async Disconnect(errorCb) {
193
- if (__privateGet(this, _connected2)) {
138
+ if (this.#connected) {
194
139
  try {
195
- await __privateGet(this, _producer).disconnect();
196
- __privateSet(this, _connected2, false);
140
+ await this.#producer.disconnect();
141
+ this.#connected = false;
197
142
  } catch (error) {
198
- __privateGet(this, _RaiseError2).call(this, `${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
143
+ this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
199
144
  }
200
145
  }
201
146
  }
202
- }
203
- _options2 = new WeakMap();
204
- _id2 = new WeakMap();
205
- _producer = new WeakMap();
206
- _kafka2 = new WeakMap();
207
- _connected2 = new WeakMap();
208
- _KafkaProducer_instances = new WeakSet();
209
- LogErrorMessage_fn2 = function(message) {
210
- __privateGet(this, _options2).logger.error(message);
211
- };
212
- _RaiseError2 = new WeakMap();
213
- class KafkaManager extends stsutils.STSOptionsBase {
214
- constructor(options) {
215
- super(options);
216
- __privateAdd(this, _KafkaManager_instances);
217
- __privateAdd(this, _kafka3);
218
- __privateAdd(this, _RaiseError3, (msg, errorCb) => {
219
- __privateMethod(this, _KafkaManager_instances, LogErrorMessage_fn3).call(this, chalk.red(msg));
220
- errorCb(msg);
221
- });
222
- __publicField(this, "CreateTopic", async (topic, partitions, errorCb) => {
223
- var _a;
147
+ SendMessage = async (topic, message, errorCb) => {
148
+ if (this.#connected) {
224
149
  try {
225
- const admin = __privateGet(this, _kafka3).admin();
226
- await admin.connect();
227
- const result = await admin.createTopics({
228
- validateOnly: false,
229
- waitForLeaders: true,
230
- timeout: (_a = this.options) == null ? void 0 : _a.timeout,
231
- topics: [
232
- {
233
- topic,
234
- numPartitions: partitions
235
- // default: -1 (uses broker `num.partitions` configuration)
236
- //replicationFactor: <Number>, // default: -1 (uses broker `default.replication.factor` configuration)
237
- //replicaAssignment: <Array>, // Example: [{ partition: 0, replicas: [0,1,2] }] - default: []
238
- //configEntries: <Array> // Example: [{ name: 'cleanup.policy', value: 'compact' }] - default: []
239
- }
240
- ]
150
+ return this.#producer.send({
151
+ topic,
152
+ messages: [message]
241
153
  });
242
- await admin.disconnect();
243
- return result;
244
154
  } catch (error) {
245
- __privateGet(this, _RaiseError3).call(this, `KafkaManager:CreateTopic(): Error: [${error}]`, errorCb);
246
- return false;
155
+ this.#LogErrorMessage(chalk.red(`${process.pid}:KafkaProducer:SendMessage(): Error: [${error}]`));
156
+ return [];
247
157
  }
248
- });
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);
249
188
  const kc = {
250
189
  clientId: options.clientId,
251
190
  brokers: options.brokers,
@@ -290,36 +229,60 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
290
229
  };
291
230
  kc.socketFactory = myCustomSocketFactory;
292
231
  }
293
- __privateSet(this, _kafka3, new kafkajs.Kafka(kc));
232
+ this.#kafka = new kafkajs.Kafka(kc);
233
+ }
234
+ #LogErrorMessage(message) {
235
+ this.options?.logger.error(message);
294
236
  }
237
+ #RaiseError = (msg, errorCb) => {
238
+ this.#LogErrorMessage(chalk.red(msg));
239
+ errorCb(msg);
240
+ };
295
241
  get kafka() {
296
- return __privateGet(this, _kafka3);
242
+ return this.#kafka;
297
243
  }
298
244
  CreateProducer() {
299
- var _a;
300
245
  return new KafkaProducer({
301
- kafka: __privateGet(this, _kafka3),
246
+ kafka: this.#kafka,
302
247
  id: uuid.v4(),
303
- logger: (_a = this.options) == null ? void 0 : _a.logger
248
+ logger: this.options?.logger
304
249
  });
305
250
  }
306
251
  CreateConsumer(groupId) {
307
- var _a;
308
252
  return new KafkaConsumer({
309
- kafka: __privateGet(this, _kafka3),
253
+ kafka: this.#kafka,
310
254
  id: uuid.v4(),
311
255
  groupId,
312
- logger: (_a = this.options) == null ? void 0 : _a.logger
256
+ logger: this.options?.logger
313
257
  });
314
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
+ };
315
285
  }
316
- _kafka3 = new WeakMap();
317
- _KafkaManager_instances = new WeakSet();
318
- LogErrorMessage_fn3 = function(message) {
319
- var _a;
320
- (_a = this.options) == null ? void 0 : _a.logger.error(message);
321
- };
322
- _RaiseError3 = new WeakMap();
323
286
  exports2.KafkaConsumer = KafkaConsumer;
324
287
  exports2.KafkaManager = KafkaManager;
325
288
  exports2.KafkaProducer = KafkaProducer;
@@ -1 +1 @@
1
- {"version":3,"file":"stskafka.umd.js","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":["_options","_id","_kafka","_connected","_RaiseError","LogErrorMessage_fn","STSOptionsBase","logLevel","Kafka","uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"stskafka.umd.js","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":["STSOptionsBase","logLevel","Kafka","uuidv4"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nsshunt/stskafka",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "description": "STS Kafka",
5
5
  "main": "./dist/stskafka.umd.js",
6
6
  "module": "./dist/stskafka.mjs",
@@ -38,22 +38,21 @@
38
38
  },
39
39
  "homepage": "https://github.com/nsshunt/stskafka#readme",
40
40
  "devDependencies": {
41
- "@testcontainers/kafka": "^11.5.1",
42
- "@types/uuid": "^10.0.0",
43
- "@typescript-eslint/eslint-plugin": "^8.42.0",
44
- "@typescript-eslint/parser": "^8.42.0",
45
- "eslint": "^9.34.0",
46
- "globals": "^16.3.0",
47
- "testcontainers": "^11.5.1",
48
- "typescript": "^5.9.2",
49
- "vite": "^6.3.5",
41
+ "@testcontainers/kafka": "^11.7.0",
42
+ "@typescript-eslint/eslint-plugin": "^8.45.0",
43
+ "@typescript-eslint/parser": "^8.45.0",
44
+ "eslint": "^9.36.0",
45
+ "globals": "^16.4.0",
46
+ "testcontainers": "^11.7.0",
47
+ "typescript": "^5.9.3",
48
+ "vite": "^7.1.7",
50
49
  "vitest": "^3.2.4"
51
50
  },
52
51
  "dependencies": {
53
- "@nsshunt/stsutils": "^1.19.39",
52
+ "@nsshunt/stsutils": "^1.19.41",
54
53
  "chalk": "^4.1.2",
55
54
  "kafkajs": "^2.2.4",
56
- "uuid": "^11.1.0",
57
- "winston": "^3.17.0"
55
+ "uuid": "^13.0.0",
56
+ "winston": "^3.18.2"
58
57
  }
59
58
  }