Skip to main content

krabka_records_legacy/
lib.rs

1//! Apache Kafka legacy (v0/v1) `MessageSet` codec.
2//!
3//! This crate also bridges to and from the v2 `RecordBatch` types in
4//! [`krabka_protocol`].
5//!
6//! See the [Kafka protocol docs] for the wire layout that this crate
7//! implements. v0 carries no per-message timestamp. v1 adds one `i64`
8//! timestamp per message (KIP-32). Both versions signal compression in
9//! the low 3 bits of the per-message `attributes` byte. The compressed
10//! payload is a single outer message whose `value` is a nested,
11//! uncompressed `MessageSet`.
12//!
13//! [Kafka protocol docs]: https://kafka.apache.org/protocol.html#messageset
14//!
15//! ## Quick tour
16//!
17//! - [`Message`] / [`Magic`]: per-message wire format, with a CRC and the
18//!   message fields.
19//! - [`ParsedRecord`][]: cross-format view of a single offset-tagged
20//!   record.
21//! - [`decode_message_set`] / [`encode_flat_message_set`] /
22//!   [`encode_compressed_message_set`]: top-level codec.
23//! - [`v2_to_legacy`] / [`legacy_to_v2`]: bridge to and from
24//!   `krabka_protocol::records::RecordBatch`. Use these from the Fetch
25//!   handler for down-conversion, and from the Produce handler for
26//!   up-conversion.
27//!
28//! ## Encode and decode a v1 `MessageSet`
29//!
30//! ```rust
31//! use {
32//!     bytes::{Bytes, BytesMut},
33//!     krabka_ids::Offset,
34//!     krabka_records_legacy::{Magic, ParsedRecord, decode_message_set, encode_flat_message_set},
35//! };
36//!
37//! # fn run() -> Result<(), Box<dyn std::error::Error>> {
38//! let records = vec![ParsedRecord {
39//!     offset: Offset(42),
40//!     timestamp: Some(1_713_000_000_000),
41//!     key: Some(Bytes::from_static(b"order-42")),
42//!     value: Some(Bytes::from_static(b"created")),
43//! }];
44//!
45//! let mut buf = BytesMut::new();
46//! encode_flat_message_set(records, Magic::V1, &mut buf);
47//! let decoded = decode_message_set(&mut &buf[..], buf.len())?;
48//! assert2::assert!((decoded[0].offset) == (Offset(42)));
49//! # Ok(())
50//! # }
51//! ```
52
53mod bridge;
54mod error;
55mod message;
56mod set;
57
58pub use {
59    bridge::{legacy_to_v2, legacy_to_v2_with_policy, parsed_from_v2, v2_to_legacy},
60    error::LegacyRecordsError,
61    message::{Magic, Message, attrs, attrs_with_compression, compression_from_attrs},
62    set::{
63        ParsedRecord, decode_message_set, decode_message_set_with_policy,
64        encode_compressed_message_set, encode_flat_message_set,
65    },
66};