kafka-pub-sub
Version:
Enterprise-grade Kafka publish/subscribe library for Node.js — producer pool, batch sending, DLQ, SSL/SASL, multi-broker, and real-world industry examples.
60 lines (50 loc) • 1.73 kB
JavaScript
const fs = require('fs');
const { Kafka, logLevel } = require('kafkajs');
const config = require('./config');
const WinstonLogCreator = require('./winstonKafkaLogger');
const LOG_LEVEL_MAP = {
error: logLevel.ERROR,
warn: logLevel.WARN,
info: logLevel.INFO,
debug: logLevel.DEBUG,
};
/**
* Build optional SSL config from env paths.
* Returns false when SSL is disabled, or an object with cert/key/ca if enabled.
*/
const buildSslConfig = () => {
if (!config.kafka_ssl_enabled) return false;
const ssl = { rejectUnauthorized: config.kafka_ssl_reject_unauthorized };
if (config.kafka_ssl_ca_path) ssl.ca = [fs.readFileSync(config.kafka_ssl_ca_path, 'utf-8')];
if (config.kafka_ssl_key_path) ssl.key = fs.readFileSync(config.kafka_ssl_key_path, 'utf-8');
if (config.kafka_ssl_cert_path) ssl.cert = fs.readFileSync(config.kafka_ssl_cert_path, 'utf-8');
return ssl;
};
/**
* Build optional SASL config.
* Returns undefined when SASL is not configured.
*/
const buildSaslConfig = () => {
if (!config.kafka_sasl_mechanism) return undefined;
return {
mechanism: config.kafka_sasl_mechanism,
username: config.kafka_sasl_username,
password: config.kafka_sasl_password,
};
};
const kafka = new Kafka({
clientId: config.kafka_client_id,
brokers: config.kafka_broker_urls, // supports multiple brokers
ssl: buildSslConfig(),
sasl: buildSaslConfig(),
logLevel: LOG_LEVEL_MAP[config.kafka_log_level] || logLevel.ERROR,
logCreator: WinstonLogCreator,
retry: {
initialRetryTime: config.kafka_retry_initial_time,
retries: config.kafka_retry_count,
factor: 2, // exponential back-off multiplier
multiplier: 1.5,
maxRetryTime: 30000,
},
});
module.exports = kafka;