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
JavaScript
/**
* 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;