UNPKG

kafka-producer-js

Version:

A configurable Kafka producer package for Node.js applications with NFL event examples and AWS MSK integration

82 lines (71 loc) 2.06 kB
/** * Kafka Configuration Module * Handles connection configuration for Kafka producer */ const { Partitioners } = require('kafkajs'); class KafkaConfig { constructor(config = {}) { this.validateConfig(config); this.config = this.buildConfig(config); } /** * Validates the required configuration parameters * @param {Object} config - Configuration object */ validateConfig(config) { if (!config.brokers || !Array.isArray(config.brokers) || config.brokers.length === 0) { throw new Error('brokers array is required and must contain at least one broker'); } config.brokers.forEach((broker, index) => { if (typeof broker !== 'string' || !broker.trim()) { throw new Error(`Invalid broker at index ${index}. Must be a non-empty string`); } }); } /** * Builds the complete Kafka configuration * @param {Object} config - User provided configuration * @returns {Object} Complete Kafka configuration */ buildConfig(config) { const defaultConfig = { ssl: true, retry: { initialRetryTime: 100, retries: 8 } }; return { ...defaultConfig, ...config, brokers: config.brokers, // Merge retry configuration if provided retry: config.retry ? { ...defaultConfig.retry, ...config.retry } : defaultConfig.retry }; } /** * Gets the Kafka configuration * @returns {Object} Kafka configuration */ getConfig() { return this.config; } /** * Gets producer specific configuration * @returns {Object} Producer configuration */ getProducerConfig() { const defaultProducerConfig = { maxInFlightRequests: 1, idempotent: false, transactionTimeout: 30000, allowAutoTopicCreation: true, createPartitioner: Partitioners.LegacyPartitioner }; return { ...defaultProducerConfig, ...(this.config.producer || {}) }; } } module.exports = KafkaConfig;