|
|
- /*
- * 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');
- }
- }
|