You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.5 KiB
62 lines
1.5 KiB
'use strict';
|
|
|
|
const Writable = require('stream').Writable;
|
|
const KafkaClient = require('./kafkaClient');
|
|
const HighLevelProducer = require('./highLevelProducer');
|
|
const logger = require('./logging')('kafka-node:ProducerStream');
|
|
const _ = require('lodash');
|
|
|
|
const DEFAULTS = {
|
|
kafkaClient: {
|
|
kafkaHost: '127.0.0.1:9092'
|
|
},
|
|
producer: {
|
|
partitionerType: 3
|
|
}
|
|
};
|
|
|
|
const DEFAULT_HIGH_WATER_MARK = 100;
|
|
|
|
class ProducerStream extends Writable {
|
|
constructor (options) {
|
|
if (options == null) {
|
|
options = {};
|
|
}
|
|
|
|
super({ objectMode: true, decodeStrings: false, highWaterMark: options.highWaterMark || DEFAULT_HIGH_WATER_MARK });
|
|
|
|
_.defaultsDeep(options, DEFAULTS);
|
|
|
|
this.client = new KafkaClient(options.kafkaClient);
|
|
this.producer = new HighLevelProducer(this.client, options.producer, options.producer.customPartitioner);
|
|
this.producer.on('error', error => this.emit('error', error));
|
|
}
|
|
|
|
sendPayload (payload, callback) {
|
|
if (!_.isArray(payload)) {
|
|
payload = [payload];
|
|
}
|
|
if (!this.producer.ready) {
|
|
this.producer.once('ready', () => this.producer.send(payload, callback));
|
|
} else {
|
|
this.producer.send(payload, callback);
|
|
}
|
|
}
|
|
|
|
close (callback) {
|
|
this.producer.close(callback);
|
|
}
|
|
|
|
_write (message, encoding, callback) {
|
|
logger.debug('_write');
|
|
this.sendPayload(message, callback);
|
|
}
|
|
|
|
_writev (chunks, callback) {
|
|
logger.debug('_writev');
|
|
const payload = _.map(chunks, 'chunk');
|
|
this.sendPayload(payload, callback);
|
|
}
|
|
}
|
|
|
|
module.exports = ProducerStream;
|
|
|