kafkajs
Version:
A modern Apache Kafka client for node.js
85 lines (78 loc) • 2.4 kB
JavaScript
const Encoder = require('../../../encoder')
const { Fetch: apiKey } = require('../../apiKeys')
const ISOLATION_LEVEL = require('../../../isolationLevel')
/**
* Allow consumers to fetch from closest replica
* @see https://cwiki.apache.org/confluence/display/KAFKA/KIP-392%3A+Allow+consumers+to+fetch+from+closest+replica
*/
/**
* Fetch Request (Version: 11) => replica_id max_wait_time min_bytes max_bytes isolation_level session_id session_epoch [topics] [forgotten_topics_data]
* replica_id => INT32
* max_wait_time => INT32
* min_bytes => INT32
* max_bytes => INT32
* isolation_level => INT8
* session_id => INT32
* session_epoch => INT32
* topics => topic [partitions]
* topic => STRING
* partitions => partition current_leader_epoch fetch_offset log_start_offset partition_max_bytes
* partition => INT32
* current_leader_epoch => INT32
* fetch_offset => INT64
* log_start_offset => INT64
* partition_max_bytes => INT32
* forgotten_topics_data => topic [partitions]
* topic => STRING
* partitions => INT32
* rack_id => STRING
*/
module.exports = ({
replicaId,
maxWaitTime,
minBytes,
maxBytes,
topics,
rackId = '',
isolationLevel = ISOLATION_LEVEL.READ_COMMITTED,
sessionId = 0,
sessionEpoch = -1,
forgottenTopics = [], // Topics to remove from the fetch session
}) => ({
apiKey,
apiVersion: 11,
apiName: 'Fetch',
encode: async () => {
return new Encoder()
.writeInt32(replicaId)
.writeInt32(maxWaitTime)
.writeInt32(minBytes)
.writeInt32(maxBytes)
.writeInt8(isolationLevel)
.writeInt32(sessionId)
.writeInt32(sessionEpoch)
.writeArray(topics.map(encodeTopic))
.writeArray(forgottenTopics.map(encodeForgottenTopics))
.writeString(rackId)
},
})
const encodeForgottenTopics = ({ topic, partitions }) => {
return new Encoder().writeString(topic).writeArray(partitions)
}
const encodeTopic = ({ topic, partitions }) => {
return new Encoder().writeString(topic).writeArray(partitions.map(encodePartition))
}
const encodePartition = ({
partition,
currentLeaderEpoch = -1,
fetchOffset,
logStartOffset = -1,
maxBytes,
}) => {
return new Encoder()
.writeInt32(partition)
.writeInt32(currentLeaderEpoch)
.writeInt64(fetchOffset)
.writeInt64(logStartOffset)
.writeInt32(maxBytes)
}