@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 +174 -211
- package/dist/stskafka.mjs.map +1 -1
- package/dist/stskafka.umd.js +175 -212
- package/dist/stskafka.umd.js.map +1 -1
- package/package.json +12 -13
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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
|
|
34
|
+
return this.#consumer;
|
|
90
35
|
}
|
|
91
36
|
get id() {
|
|
92
|
-
return
|
|
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 (!
|
|
45
|
+
if (!this.#connected) {
|
|
96
46
|
try {
|
|
97
|
-
await
|
|
98
|
-
|
|
47
|
+
await this.#consumer.connect();
|
|
48
|
+
this.#connected = true;
|
|
99
49
|
} catch (error) {
|
|
100
|
-
|
|
50
|
+
this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
|
|
101
51
|
}
|
|
102
52
|
}
|
|
103
53
|
}
|
|
104
54
|
async Disconnect(errorCb) {
|
|
105
|
-
if (
|
|
55
|
+
if (this.#connected) {
|
|
106
56
|
try {
|
|
107
|
-
await
|
|
108
|
-
|
|
57
|
+
await this.#consumer.disconnect();
|
|
58
|
+
this.#connected = false;
|
|
109
59
|
} catch (error) {
|
|
110
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
125
|
+
return this.#producer;
|
|
181
126
|
}
|
|
182
127
|
get id() {
|
|
183
|
-
return
|
|
128
|
+
return this.#id;
|
|
184
129
|
}
|
|
185
130
|
async Connect(errorCb) {
|
|
186
|
-
if (!
|
|
131
|
+
if (!this.#connected) {
|
|
187
132
|
try {
|
|
188
|
-
await
|
|
189
|
-
|
|
133
|
+
await this.#producer.connect();
|
|
134
|
+
this.#connected = true;
|
|
190
135
|
} catch (error) {
|
|
191
|
-
|
|
136
|
+
this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
|
|
192
137
|
}
|
|
193
138
|
}
|
|
194
139
|
}
|
|
195
140
|
async Disconnect(errorCb) {
|
|
196
|
-
if (
|
|
141
|
+
if (this.#connected) {
|
|
197
142
|
try {
|
|
198
|
-
await
|
|
199
|
-
|
|
143
|
+
await this.#producer.disconnect();
|
|
144
|
+
this.#connected = false;
|
|
200
145
|
} catch (error) {
|
|
201
|
-
|
|
146
|
+
this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
|
|
202
147
|
}
|
|
203
148
|
}
|
|
204
149
|
}
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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
|
-
|
|
249
|
-
return
|
|
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
|
-
|
|
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
|
|
245
|
+
return this.#kafka;
|
|
300
246
|
}
|
|
301
247
|
CreateProducer() {
|
|
302
|
-
var _a;
|
|
303
248
|
return new KafkaProducer({
|
|
304
|
-
kafka:
|
|
249
|
+
kafka: this.#kafka,
|
|
305
250
|
id: v4(),
|
|
306
|
-
logger:
|
|
251
|
+
logger: this.options?.logger
|
|
307
252
|
});
|
|
308
253
|
}
|
|
309
254
|
CreateConsumer(groupId) {
|
|
310
|
-
var _a;
|
|
311
255
|
return new KafkaConsumer({
|
|
312
|
-
kafka:
|
|
256
|
+
kafka: this.#kafka,
|
|
313
257
|
id: v4(),
|
|
314
258
|
groupId,
|
|
315
|
-
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,
|
package/dist/stskafka.mjs.map
CHANGED
|
@@ -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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"}
|
package/dist/stskafka.umd.js
CHANGED
|
@@ -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";
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
|
31
|
+
return this.#consumer;
|
|
87
32
|
}
|
|
88
33
|
get id() {
|
|
89
|
-
return
|
|
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 (!
|
|
42
|
+
if (!this.#connected) {
|
|
93
43
|
try {
|
|
94
|
-
await
|
|
95
|
-
|
|
44
|
+
await this.#consumer.connect();
|
|
45
|
+
this.#connected = true;
|
|
96
46
|
} catch (error) {
|
|
97
|
-
|
|
47
|
+
this.#RaiseError(`Connect(): Error: [${error}]`, errorCb);
|
|
98
48
|
}
|
|
99
49
|
}
|
|
100
50
|
}
|
|
101
51
|
async Disconnect(errorCb) {
|
|
102
|
-
if (
|
|
52
|
+
if (this.#connected) {
|
|
103
53
|
try {
|
|
104
|
-
await
|
|
105
|
-
|
|
54
|
+
await this.#consumer.disconnect();
|
|
55
|
+
this.#connected = false;
|
|
106
56
|
} catch (error) {
|
|
107
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
122
|
+
return this.#producer;
|
|
178
123
|
}
|
|
179
124
|
get id() {
|
|
180
|
-
return
|
|
125
|
+
return this.#id;
|
|
181
126
|
}
|
|
182
127
|
async Connect(errorCb) {
|
|
183
|
-
if (!
|
|
128
|
+
if (!this.#connected) {
|
|
184
129
|
try {
|
|
185
|
-
await
|
|
186
|
-
|
|
130
|
+
await this.#producer.connect();
|
|
131
|
+
this.#connected = true;
|
|
187
132
|
} catch (error) {
|
|
188
|
-
|
|
133
|
+
this.#RaiseError(`${process.pid}:KafkaProducer:Connect(): Error: [${error}]`, errorCb);
|
|
189
134
|
}
|
|
190
135
|
}
|
|
191
136
|
}
|
|
192
137
|
async Disconnect(errorCb) {
|
|
193
|
-
if (
|
|
138
|
+
if (this.#connected) {
|
|
194
139
|
try {
|
|
195
|
-
await
|
|
196
|
-
|
|
140
|
+
await this.#producer.disconnect();
|
|
141
|
+
this.#connected = false;
|
|
197
142
|
} catch (error) {
|
|
198
|
-
|
|
143
|
+
this.#RaiseError(`${process.pid}:KafkaProducer:Disconnect(): Error: [${error}]`, errorCb);
|
|
199
144
|
}
|
|
200
145
|
}
|
|
201
146
|
}
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
246
|
-
return
|
|
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
|
-
|
|
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
|
|
242
|
+
return this.#kafka;
|
|
297
243
|
}
|
|
298
244
|
CreateProducer() {
|
|
299
|
-
var _a;
|
|
300
245
|
return new KafkaProducer({
|
|
301
|
-
kafka:
|
|
246
|
+
kafka: this.#kafka,
|
|
302
247
|
id: uuid.v4(),
|
|
303
|
-
logger:
|
|
248
|
+
logger: this.options?.logger
|
|
304
249
|
});
|
|
305
250
|
}
|
|
306
251
|
CreateConsumer(groupId) {
|
|
307
|
-
var _a;
|
|
308
252
|
return new KafkaConsumer({
|
|
309
|
-
kafka:
|
|
253
|
+
kafka: this.#kafka,
|
|
310
254
|
id: uuid.v4(),
|
|
311
255
|
groupId,
|
|
312
|
-
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;
|
package/dist/stskafka.umd.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
42
|
-
"@
|
|
43
|
-
"@typescript-eslint/
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
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.
|
|
52
|
+
"@nsshunt/stsutils": "^1.19.41",
|
|
54
53
|
"chalk": "^4.1.2",
|
|
55
54
|
"kafkajs": "^2.2.4",
|
|
56
|
-
"uuid": "^
|
|
57
|
-
"winston": "^3.
|
|
55
|
+
"uuid": "^13.0.0",
|
|
56
|
+
"winston": "^3.18.2"
|
|
58
57
|
}
|
|
59
58
|
}
|