private IEnumerable <OffsetResponse> DecodeOffsetResponse(byte[] data) { var stream = new ReadByteStream(data); var correlationId = stream.ReadInt(); var topicCount = stream.ReadInt(); for (int i = 0; i < topicCount; i++) { var topic = stream.ReadInt16String(); var partitionCount = stream.ReadInt(); for (int j = 0; j < partitionCount; j++) { var response = new OffsetResponse() { Topic = topic, PartitionId = stream.ReadInt(), Error = stream.ReadInt16(), Offsets = new List <long>() }; var offsetCount = stream.ReadInt(); for (int k = 0; k < offsetCount; k++) { response.Offsets.Add(stream.ReadLong()); } yield return(response); } } }
private IEnumerable <ProduceResponse> DecodeProduceResponse(byte[] data) { var stream = new ReadByteStream(data); var correlationId = stream.ReadInt(); var topicCount = stream.ReadInt(); for (int i = 0; i < topicCount; i++) { var topic = stream.ReadInt16String(); var partitionCount = stream.ReadInt(); for (int j = 0; j < partitionCount; j++) { var response = new ProduceResponse() { Topic = topic, PartitionId = stream.ReadInt(), Error = stream.ReadInt16(), Offset = stream.ReadLong() }; yield return(response); } } }
/// <summary> /// Decode a byte[] that represents a collection of messages. /// </summary> /// <param name="messageSet">The byte[] encode as a message set from kafka.</param> /// <returns>Enumerable representing stream of messages decoded from byte[]</returns> public static IEnumerable <Message> DecodeMessageSet(byte[] messageSet) { var stream = new ReadByteStream(messageSet); while (stream.HasData) { //this checks that we have at least the minimum amount of data to retrieve a header if (stream.Available(MessageHeaderSize) == false) { yield break; } var offset = stream.ReadLong(); var messageSize = stream.ReadInt(); //if messagessize is greater than payload, our max buffer is insufficient. if ((stream.Payload.Length - MessageHeaderSize) < messageSize) { throw new BufferUnderRunException(MessageHeaderSize, messageSize); } //if the stream does not have enough left in the payload, we got only a partial message if (stream.Available(messageSize) == false) { yield break; } foreach (var message in DecodeMessage(offset, stream.ReadBytesFromStream(messageSize))) { yield return(message); } } }
/// <summary> /// Decode a byte[] that represents a collection of messages. /// </summary> /// <param name="messageSet">The byte[] encode as a message set from kafka.</param> /// <returns>Enumerable representing stream of messages decoded from byte[]</returns> public static IEnumerable <Message> DecodeMessageSet(byte[] messageSet) { var stream = new ReadByteStream(messageSet); while (stream.HasData) { //if the message set hits against our max bytes wall on the fetch we will have a 1/2 completed message downloaded. //the decode should guard against this situation if (stream.Available(MinimumMessageSize) == false) { yield break; } var offset = stream.ReadLong(); var messageSize = stream.ReadInt(); if (stream.Available(messageSize) == false) { yield break; } foreach (var message in DecodeMessage(offset, stream.ReadBytesFromStream(messageSize))) { yield return(message); } } }
private IEnumerable <FetchResponse> DecodeFetchResponse(byte[] data) { var stream = new ReadByteStream(data); var correlationId = stream.ReadInt(); var topicCount = stream.ReadInt(); for (int i = 0; i < topicCount; i++) { var topic = stream.ReadInt16String(); var partitionCount = stream.ReadInt(); for (int j = 0; j < partitionCount; j++) { var partitionId = stream.ReadInt(); var response = new FetchResponse { Topic = topic, PartitionId = partitionId, Error = stream.ReadInt16(), HighWaterMark = stream.ReadLong() }; //note: dont use initializer here as it breaks stream position. response.Messages = Message.DecodeMessageSet(stream.ReadIntPrefixedBytes()) .Select(x => { x.Meta.PartitionId = partitionId; return(x); }); yield return(response); } } }
/// <summary> /// Decode a byte[] that represents a collection of messages. /// </summary> /// <param name="messageSet">The byte[] encode as a message set from kafka.</param> /// <returns>Enumerable representing stream of messages decoded from byte[]</returns> public static IEnumerable <Message> DecodeMessageSet(byte[] messageSet) { var stream = new ReadByteStream(messageSet); while (stream.HasData) { var offset = stream.ReadLong(); foreach (var message in DecodeMessage(offset, stream.ReadIntPrefixedBytes())) { yield return(message); } } }
/// <summary> /// Decode a byte[] that represents a collection of messages. /// </summary> /// <param name="messageSet">The byte[] encode as a message set from kafka.</param> /// <returns>Enumerable representing stream of messages decoded from byte[]</returns> public static IEnumerable <Message> DecodeMessageSet(byte[] messageSet) { var stream = new ReadByteStream(messageSet); while (stream.HasData) { var offset = stream.ReadLong(); var size = stream.ReadInt(); var payload = stream.ReadBytesFromStream(size); if (payload.Length < size) { throw new InsufficientDataException(payload.Length, size); } foreach (var message in DecodeMessage(offset, payload)) { yield return(message); } } }