@nsshunt/stskafka 1.0.16 → 1.0.18
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 +7 -5
- package/dist/stskafka.mjs.map +1 -1
- package/dist/stskafka.umd.js +6 -7
- package/dist/stskafka.umd.js.map +1 -1
- package/package.json +3 -9
package/dist/stskafka.mjs
CHANGED
|
@@ -13,8 +13,10 @@ var _id, _groupId, _consumer, _kafka, _connected, _options, _KafkaConsumer_insta
|
|
|
13
13
|
import { STSOptionsBase } from "@nsshunt/stsutils";
|
|
14
14
|
import { logLevel, Kafka } from "kafkajs";
|
|
15
15
|
import { v4 } from "uuid";
|
|
16
|
+
import fs from "node:fs";
|
|
16
17
|
import chalk from "chalk";
|
|
17
|
-
|
|
18
|
+
import net from "node:net";
|
|
19
|
+
import tls from "node:tls";
|
|
18
20
|
class KafkaConsumer {
|
|
19
21
|
constructor(options) {
|
|
20
22
|
__privateAdd(this, _KafkaConsumer_instances);
|
|
@@ -275,14 +277,14 @@ class KafkaManager extends STSOptionsBase {
|
|
|
275
277
|
}
|
|
276
278
|
if (options.useSSL && options.ssl) {
|
|
277
279
|
kc.ssl = {
|
|
278
|
-
ca: [
|
|
279
|
-
key:
|
|
280
|
-
cert:
|
|
280
|
+
ca: [fs.readFileSync(options.ssl.cafile, { encoding: "utf8" })],
|
|
281
|
+
key: fs.readFileSync(options.ssl.keyfile, { encoding: "utf8" }),
|
|
282
|
+
cert: fs.readFileSync(options.ssl.certfileFile, { encoding: "utf8" })
|
|
281
283
|
};
|
|
282
284
|
}
|
|
283
285
|
if (options.keepAlive) {
|
|
284
286
|
const myCustomSocketFactory = (config) => {
|
|
285
|
-
const socket = config.ssl ?
|
|
287
|
+
const socket = config.ssl ? tls.connect(
|
|
286
288
|
Object.assign({ host: config.host, port: config.port }, !net.isIP(config.host) ? { servername: config.host } : {}, config.ssl),
|
|
287
289
|
config.onConnect
|
|
288
290
|
) : net.connect({ host: config.host, port: config.port }, config.onConnect);
|
package/dist/stskafka.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stskafka.mjs","sources":["../__vite-browser-external","../src/kafka/kafkaconsumer.ts","../src/kafka/kafkaproducer.ts","../src/kafka/kafkamanager.ts"],"sourcesContent":["export default {}","/* 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 'net'\nimport tls from '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","fs","tls","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":["_options","_id","_kafka","_connected","_RaiseError","LogErrorMessage_fn","uuidv4"],"mappings":";;;;;;;;;;;;;;;;;;;AAcO,MAAM,cAAwC;AAAA,EAQjD,YAAY,SAAgC;AARzC;AACH;AACA;AACA;AACA;AACA,mCAAsB;AACtB;AA8BA,oCAAc,CAAC,KAAa,YAAkC;AAC1D,YAAM,eAAe,GAAG,QAAQ,GAAG,kBAAkB,GAAG;AACxD,4BAAK,8CAAL,WAAsB,MAAM,IAAI,YAAY;AAC5C,cAAQ,YAAY;AAAA,IACxB;AAwBA,qCAAY,OAAM,QAAkB,eAAwB,YAAiD;AACzG,UAAI,mBAAK,aAAY;AACb,YAAA;AACA,gBAAM,mBAAK,WAAU,UAAU,EAAE,QAAQ,eAAe;AAAA,iBACnD,OAAO;AACZ,6BAAK,aAAL,WAAiB,wBAAwB,KAAK,KAAK;AAAA,QAAO;AAAA,MAC9D,OACG;AACG,cAAA,KAAK,QAAQ,CAAC,UAAU;AAC1B,6BAAK,aAAL,WAAiB,oDAAoD,KAAK,KAAK;AAAA,QAAO,CACzF;AAAA,MAAA;AAAA,IAET;AAEA,gCAAO,OAAM,YAAiD;AAC1D,UAAI,mBAAK,aAAY;AACb,YAAA;AACM,gBAAA,mBAAK,WAAU,KAAK;AAAA,iBACrB,OAAO;AACZ,6BAAK,aAAL,WAAiB,mBAAmB,KAAK,KAAK;AAAA,QAAO;AAAA,MACzD;AAAA,IAER;AAEA,kDAAyB,OAAO,YAAqB,IAAsB,YAAkD;AACzH,UAAI,mBAAK,aAAY;AACX,cAAA,mBAAK,WAAU,IAAI;AAAA,UACrB;AAAA,UACA,aAAa,OAAO,EAAE,OAAO,WAAW,SAAS,WAAW,YAAY;AAChE,gBAAA;AACA,iBAAG,OAAO,WAAW,SAAS,WAAW,KAAK;AAAA,qBAgBzC,OAAO;AACZ,iCAAK,aAAL,WAAiB,iDAAiD,KAAK,KAAK;AAAA,YAAO;AAAA,UACvF;AAAA,QACJ,CACH;AAAA,MAAA,OACE;AACG,cAAA,KAAK,QAAQ,CAAC,UAAU;AAC1B,6BAAK,aAAL,WAAiB,iEAAiE,KAAK,KAAK;AAAA,QAAO,CACtG;AAAA,MAAA;AAAA,IAET;AA/GI,uBAAK,UAAW;AACX,uBAAA,KAAM,mBAAK,UAAS;AACpB,uBAAA,UAAW,mBAAK,UAAS;AACzB,uBAAA,QAAS,mBAAK,UAAS;AACvB,uBAAA,WAAY,mBAAK,QAAO,SAAS;AAAA,MAClC,SAAS,mBAAK;AAAA,MACd,OAAO;AAAA,QACH,kBAAkB,OAAO,UAAmC;AACnD,gCAAA,8CAAA,WAAiB,MAAM,QAAQ,GAAG,QAAQ,GAAG,0DAA0D,KAAK,GAAG;AAC7G,iBAAA;AAAA,QAAA;AAAA,MACX;AAAA,IACJ,CACH;AAAA,EAAA;AAAA,EAOL,IAAI,WAAW;AACX,WAAO,mBAAK;AAAA,EAAA;AAAA,EAGhB,IAAI,KAAa;AACb,WAAO,mBAAK;AAAA,EAAA;AAAA,EAShB,MAAM,QAAQ,SAA8C;AACpD,QAAA,CAAC,mBAAK,aAAY;AACd,UAAA;AACM,cAAA,mBAAK,WAAU,QAAQ;AAC7B,2BAAK,YAAa;AAAA,eACb,OAAO;AACZ,2BAAK,aAAL,WAAiB,sBAAsB,KAAK,KAAK;AAAA,MAAO;AAAA,IAC5D;AAAA,EACJ;AAAA,EAGJ,MAAM,WAAW,SAA8C;AAC3D,QAAI,mBAAK,aAAY;AACb,UAAA;AACM,cAAA,mBAAK,WAAU,WAAW;AAChC,2BAAK,YAAa;AAAA,eACb,OAAO;AACZ,2BAAK,aAAL,WAAiB,yBAAyB,KAAK,KAAK;AAAA,MAAO;AAAA,IAC/D;AAAA,EACJ;AA4DR;AAxHI;AACA;AACA;AACA;AACA;AACA;AANG;AAwBH,8BAAiB,SAAc;AACtB,qBAAA,UAAS,OAAO,MAAM,OAAO;AAAA;AAWtC;ACtCG,MAAM,cAAc;AAAA,EAOvB,YAAY,SAAgC;AAPzC;AACH,uBAAAA;AACA,uBAAAC;AACA;AACA,uBAAAC;AACA,uBAAAC,aAAsB;AAatB,uBAAAC,cAAc,CAAC,KAAa,YAAkC;AAC1D,4BAAK,0BAAAC,qBAAL,WAAsB,MAAM,IAAI,GAAG;AACnC,cAAQ,GAAG;AAAA,IACf;AAgCA,uCAAc,OAAM,OAAe,SAAwC,YAA6D;AACpI,UAAI,mBAAKF,cAAY;AACb,YAAA;AACO,iBAAA,mBAAK,WAAU,KAAK;AAAA,YACvB;AAAA,YACA,UAAU,CAAE,OAAQ;AAAA,UAAA,CACvB;AAAA,iBACI,OAAO;AACP,gCAAA,0BAAAE,qBAAA,WAAiB,MAAM,IAAI,GAAG,QAAQ,GAAG,yCAAyC,KAAK,GAAG;AAC/F,iBAAO,CAAE;AAAA,QAAA;AAAA,MACb,OACG;AACG,cAAA,KAAK,QAAQ,CAAC,UAAU;AAC1B,6BAAKD,cAAL,WAAiB,GAAG,QAAQ,GAAG,qEAAqE,KAAK,KAAK;AAAA,QAAO,CACxH;AACD,eAAO,CAAE;AAAA,MAAA;AAAA,IAEjB;AAEA,wCAAe,OAAM,OAAe,UAA2C,YAA6D;AACxI,UAAI,mBAAKD,cAAY;AACb,YAAA;AACO,iBAAA,mBAAK,WAAU,KAAK;AAAA,YACvB;AAAA,YACA;AAAA,UAAA,CACH;AAAA,iBACI,OAAO;AACP,gCAAA,0BAAAE,qBAAA,WAAiB,MAAM,IAAI,GAAG,QAAQ,GAAG,0CAA0C,KAAK,GAAG;AAChG,iBAAO,CAAE;AAAA,QAAA;AAAA,MACb,OACG;AACG,cAAA,KAAK,QAAQ,CAAC,UAAU;AAC1B,6BAAKD,cAAL,WAAiB,GAAG,QAAQ,GAAG,sEAAsE,KAAK,KAAK;AAAA,QAAO,CACzH;AACD,eAAO,CAAE;AAAA,MAAA;AAAA,IAEjB;AAjFI,uBAAKJ,WAAW;AACX,uBAAAC,MAAM,mBAAKD,WAAS;AACpB,uBAAAE,SAAS,mBAAKF,WAAS;AACvB,uBAAA,WAAY,mBAAKE,SAAO,SAAS;AAAA,EAAA;AAAA,EAY1C,IAAI,WAAW;AACX,WAAO,mBAAK;AAAA,EAAA;AAAA,EAGhB,IAAI,KAAa;AACb,WAAO,mBAAKD;AAAA,EAAA;AAAA,EAGhB,MAAM,QAAQ,SAA8C;AACpD,QAAA,CAAC,mBAAKE,cAAY;AACd,UAAA;AACM,cAAA,mBAAK,WAAU,QAAQ;AAC7B,2BAAKA,aAAa;AAAA,eACb,OAAO;AACZ,2BAAKC,cAAL,WAAiB,GAAG,QAAQ,GAAG,qCAAqC,KAAK,KAAK;AAAA,MAAO;AAAA,IACzF;AAAA,EACJ;AAAA,EAGJ,MAAM,WAAW,SAA8C;AAC3D,QAAI,mBAAKD,cAAY;AACb,UAAA;AACM,cAAA,mBAAK,WAAU,WAAW;AAChC,2BAAKA,aAAa;AAAA,eACb,OAAO;AACZ,2BAAKC,cAAL,WAAiB,GAAG,QAAQ,GAAG,wCAAwC,KAAK,KAAK;AAAA,MAAO;AAAA,IAC5F;AAAA,EACJ;AAwCR;AAzFIJ,YAAA;AACAC,OAAA;AACA;AACAC,UAAA;AACAC,cAAA;AALG;AAcHE,+BAAiB,SAAc;AACtB,qBAAAL,WAAS,OAAO,MAAM,OAAO;AAAA;AAGtCI,eAAA;ACoEG,MAAM,qBAAqB,eAAe;AAAA,EAG7C,YAAY,SAA8B;AACtC,UAAM,OAAO;AAJd;AACH,uBAAAF;AA6DA,uBAAAE,cAAc,CAAC,KAAa,YAAkC;AAC1D,4BAAK,yBAAAC,qBAAL,WAAsB,MAAM,IAAI,GAAG;AACnC,cAAQ,GAAG;AAAA,IACf;AAqBA,uCAAc,OAAO,OAAe,YAAoB,YAAoD;;AACpG,UAAA;AACM,cAAA,QAAQ,mBAAKH,SAAO,MAAM;AAChC,cAAM,MAAM,QAAQ;AACd,cAAA,SAAS,MAAM,MAAM,aAAa;AAAA,UACpC,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,UAAS,UAAK,YAAL,mBAAc;AAAA,UACvB,QAAQ;AAAA,YACJ;AAAA,cACI;AAAA,cACA,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA;AAAA,UAInB;AAAA,QACJ,CACH;AACD,cAAM,MAAM,WAAW;AAChB,eAAA;AAAA,eACF,OAAO;AACZ,2BAAKE,cAAL,WAAiB,uCAAuC,KAAK,KAAK;AAC3D,eAAA;AAAA,MAAA;AAAA,IAEf;AAxGI,UAAM,KAAkB;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA;AAAA,MACjB,mBAAmB,QAAQ;AAAA,MAC3B,gBAAgB,QAAQ;AAAA,IAC5B;AAEA,YAAQ,QAAQ,UAAU;AAAA,MAC1B,KAAK;AACD,WAAG,WAAW,SAAS;AACvB;AAAA,MACJ,KAAK;AACD,WAAG,WAAW,SAAS;AACvB;AAAA,MACJ,KAAK;AACD,WAAG,WAAW,SAAS;AACvB;AAAA,MACJ,KAAK;AACD,WAAG,WAAW,SAAS;AACvB;AAAA,MACJ,KAAK;AACD,WAAG,WAAW,SAAS;AACvB;AAAA,MACJ;AACI,WAAG,WAAW,SAAS;AAAA,IAAA;AAEvB,QAAA,QAAQ,UAAU,QAAQ,KAAK;AAC/B,SAAG,MAAM;AAAA,QACL,IAAI,CAAC,GAAG,aAAa,QAAQ,IAAI,QAAkB,EAAE,UAAU,OAAM,CAAC,CAAC;AAAA,QACvE,KAAK,GAAG,aAAa,QAAQ,IAAI,SAAS,EAAE,UAAU,QAAO;AAAA,QAC7D,MAAM,GAAG,aAAa,QAAQ,IAAI,cAAc,EAAE,UAAU,OAAO,CAAA;AAAA,MACvE;AAAA,IAAA;AAEJ,QAAI,QAAQ,WAAW;AAEb,YAAA,wBAAwB,CAAC,WAAiC;AACtD,cAAA,SAAS,OAAO,MAChB,IAAI;AAAA,UACF,OAAO,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,EAAE,YAAY,OAAO,SAAS,CAAA,GAAI,OAAO,GAAG;AAAA,UAC7H,OAAO;AAAA,QAET,IAAA,IAAI,QAAQ,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,QAAQ,OAAO,SAAS;AAErE,eAAA,aAAa,MAAM,QAAQ,SAAS;AACpC,eAAA;AAAA,MACX;AACA,SAAG,gBAAgB;AAAA,IAAA;AAGlB,uBAAAF,SAAS,IAAI,MAAM,EAAE;AAAA,EAAA;AAAA,EAY9B,IAAI,QAAQ;AACR,WAAO,mBAAKA;AAAA,EAAA;AAAA,EAGhB,iBAAgC;;AAC5B,WAAO,IAAI,cAAc;AAAA,MACrB,OAAO,mBAAKA;AAAA,MACZ,IAAII,GAAO;AAAA,MACX,SAAQ,UAAK,YAAL,mBAAc;AAAA,IAAA,CAAO;AAAA,EAAA;AAAA,EAGrC,eAAe,SAAiB;;AAC5B,WAAO,IAAI,cAAc;AAAA,MACrB,OAAO,mBAAKJ;AAAA,MACZ,IAAII,GAAO;AAAA,MACX;AAAA,MACA,SAAQ,UAAK,YAAL,mBAAc;AAAA,IAAA,CAAO;AAAA,EAAA;AA4BzC;AA9GIJ,UAAA;AADG;AA0DHG,+BAAiB,SAAc;;AACtB,aAAA,YAAA,mBAAS,OAAO,MAAM;AAAO;AAGtCD,eAAA;"}
|
package/dist/stskafka.umd.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(function(global, factory) {
|
|
2
|
-
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@nsshunt/stsutils"), require("kafkajs"), require("uuid"), require("chalk")) : typeof define === "function" && define.amd ? define(["exports", "@nsshunt/stsutils", "kafkajs", "uuid", "chalk"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["@nsshunt/stskafka"] = {}, global.stsutils, global.kafkajs, global.uuid, global.chalk));
|
|
3
|
-
})(this, function(exports2, stsutils, kafkajs, uuid, chalk) {
|
|
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
|
+
})(this, function(exports2, stsutils, kafkajs, uuid, fs, chalk, net, tls) {
|
|
4
4
|
"use strict";var __defProp = Object.defineProperty;
|
|
5
5
|
var __typeError = (msg) => {
|
|
6
6
|
throw TypeError(msg);
|
|
@@ -14,7 +14,6 @@ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "
|
|
|
14
14
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
15
15
|
|
|
16
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;
|
|
17
|
-
const net = {};
|
|
18
17
|
class KafkaConsumer {
|
|
19
18
|
constructor(options) {
|
|
20
19
|
__privateAdd(this, _KafkaConsumer_instances);
|
|
@@ -275,14 +274,14 @@ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "acce
|
|
|
275
274
|
}
|
|
276
275
|
if (options.useSSL && options.ssl) {
|
|
277
276
|
kc.ssl = {
|
|
278
|
-
ca: [
|
|
279
|
-
key:
|
|
280
|
-
cert:
|
|
277
|
+
ca: [fs.readFileSync(options.ssl.cafile, { encoding: "utf8" })],
|
|
278
|
+
key: fs.readFileSync(options.ssl.keyfile, { encoding: "utf8" }),
|
|
279
|
+
cert: fs.readFileSync(options.ssl.certfileFile, { encoding: "utf8" })
|
|
281
280
|
};
|
|
282
281
|
}
|
|
283
282
|
if (options.keepAlive) {
|
|
284
283
|
const myCustomSocketFactory = (config) => {
|
|
285
|
-
const socket = config.ssl ?
|
|
284
|
+
const socket = config.ssl ? tls.connect(
|
|
286
285
|
Object.assign({ host: config.host, port: config.port }, !net.isIP(config.host) ? { servername: config.host } : {}, config.ssl),
|
|
287
286
|
config.onConnect
|
|
288
287
|
) : net.connect({ host: config.host, port: config.port }, config.onConnect);
|
package/dist/stskafka.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stskafka.umd.js","sources":["../__vite-browser-external","../src/kafka/kafkaconsumer.ts","../src/kafka/kafkaproducer.ts","../src/kafka/kafkamanager.ts"],"sourcesContent":["export default {}","/* 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 'net'\nimport tls from '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","fs","tls","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":["_options","_id","_kafka","_connected","_RaiseError","LogErrorMessage_fn","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.18",
|
|
4
4
|
"description": "STS Kafka",
|
|
5
5
|
"main": "./dist/stskafka.umd.js",
|
|
6
6
|
"module": "./dist/stskafka.mjs",
|
|
@@ -38,25 +38,19 @@
|
|
|
38
38
|
},
|
|
39
39
|
"homepage": "https://github.com/nsshunt/stskafka#readme",
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@babel/preset-env": "^7.26.0",
|
|
42
|
-
"@babel/preset-typescript": "^7.26.0",
|
|
43
|
-
"@eslint/eslintrc": "^3.2.0",
|
|
44
|
-
"@eslint/js": "^9.15.0",
|
|
45
41
|
"@testcontainers/kafka": "^10.15.0",
|
|
46
|
-
"@tsconfig/node20": "^20.1.4",
|
|
47
42
|
"@types/uuid": "^10.0.0",
|
|
48
43
|
"@typescript-eslint/eslint-plugin": "^8.16.0",
|
|
49
44
|
"@typescript-eslint/parser": "^8.16.0",
|
|
50
|
-
"eslint": "^9.
|
|
45
|
+
"eslint": "^9.16.0",
|
|
51
46
|
"globals": "^15.12.0",
|
|
52
|
-
"jest": "^29.7.0",
|
|
53
47
|
"testcontainers": "^10.15.0",
|
|
54
48
|
"typescript": "^5.7.2",
|
|
55
49
|
"vite": "^5.4.11",
|
|
56
50
|
"vitest": "^2.1.6"
|
|
57
51
|
},
|
|
58
52
|
"dependencies": {
|
|
59
|
-
"@nsshunt/stsutils": "^1.19.
|
|
53
|
+
"@nsshunt/stsutils": "^1.19.17",
|
|
60
54
|
"chalk": "^4.1.2",
|
|
61
55
|
"kafkajs": "^2.2.4",
|
|
62
56
|
"uuid": "^10.0.0",
|