/*
|
|
* node-rdkafka - Node.js wrapper for RdKafka C/C++ library
|
|
*
|
|
* Copyright (c) 2016 Blizzard Entertainment
|
|
*
|
|
* This software may be modified and distributed under the terms
|
|
* of the MIT license. See the LICENSE.txt file for details.
|
|
*/
|
|
|
|
var Topic = require('./topic');
|
|
|
|
module.exports = TopicPartition;
|
|
|
|
/**
|
|
* Map an array of topic partition js objects to real topic partition objects.
|
|
*
|
|
* @param array The array of topic partition raw objects to map to topic
|
|
* partition objects
|
|
*/
|
|
TopicPartition.map = function(array) {
|
|
return array.map(function(element) {
|
|
return TopicPartition.create(element);
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Take a topic partition javascript object and convert it to the class.
|
|
* The class will automatically convert offset identifiers to special constants
|
|
*
|
|
* @param element The topic partition raw javascript object
|
|
*/
|
|
TopicPartition.create = function(element) {
|
|
// Just ensure we take something that can have properties. The topic partition
|
|
// class will
|
|
element = element || {};
|
|
return new TopicPartition(element.topic, element.partition, element.offset);
|
|
};
|
|
|
|
/**
|
|
* Create a topic partition. Just does some validation and decoration
|
|
* on topic partitions provided.
|
|
*
|
|
* Goal is still to behave like a plain javascript object but with validation
|
|
* and potentially some extra methods
|
|
*/
|
|
function TopicPartition(topic, partition, offset) {
|
|
if (!(this instanceof TopicPartition)) {
|
|
return new TopicPartition(topic, partition, offset);
|
|
}
|
|
|
|
// Validate that the elements we are iterating over are actual topic partition
|
|
// js objects. They do not need an offset, but they do need partition
|
|
if (!topic) {
|
|
throw new TypeError('"topic" must be a string and must be set');
|
|
}
|
|
|
|
if (partition === null || partition === undefined) {
|
|
throw new TypeError('"partition" must be a number and must set');
|
|
}
|
|
|
|
// We can just set topic and partition as they stand.
|
|
this.topic = topic;
|
|
this.partition = partition;
|
|
|
|
if (offset === undefined || offset === null) {
|
|
this.offset = Topic.OFFSET_STORED;
|
|
} else if (typeof offset === 'string') {
|
|
switch (offset.toLowerCase()) {
|
|
case 'earliest':
|
|
case 'beginning':
|
|
this.offset = Topic.OFFSET_BEGINNING;
|
|
break;
|
|
case 'latest':
|
|
case 'end':
|
|
this.offset = Topic.OFFSET_END;
|
|
break;
|
|
case 'stored':
|
|
this.offset = Topic.OFFSET_STORED;
|
|
break;
|
|
default:
|
|
throw new TypeError('"offset", if provided as a string, must be beginning, end, or stored.');
|
|
}
|
|
} else if (typeof offset === 'number') {
|
|
this.offset = offset;
|
|
} else {
|
|
throw new TypeError('"offset" must be a special string or number if it is set');
|
|
}
|
|
}
|