Expand description
Minimal parser for the AWS vnd.amazon.eventstream binary frame format.
Each frame layout:
+----------------------------------------------------------+
| total_len: u32 BE |
| headers_len: u32 BE |
| prelude_crc: u32 BE (ignored — TLS provides integrity)
| headers: headers_len bytes |
| payload: total_len - headers_len - 16 bytes |
| message_crc: u32 BE (ignored) |
+----------------------------------------------------------+Each header: name_len u8, name utf8, value_type u8, then a
type-specific value. We only need type 7 (UTF-8 string, u16 BE length).
This implementation is intentionally minimal: CRC validation is skipped (TLS already protects integrity), and only string-typed headers are decoded since Bedrock Converse only emits those.
§Examples
use codetether_agent::provider::bedrock::eventstream::FrameBuffer;
// Build a tiny frame: no headers, payload = "hi".
let payload = b"hi";
let total_len: u32 = 16 + payload.len() as u32;
let mut frame = Vec::new();
frame.extend_from_slice(&total_len.to_be_bytes());
frame.extend_from_slice(&0u32.to_be_bytes()); // headers_len
frame.extend_from_slice(&0u32.to_be_bytes()); // prelude_crc (ignored)
frame.extend_from_slice(payload);
frame.extend_from_slice(&0u32.to_be_bytes()); // message_crc (ignored)
let mut buf = FrameBuffer::new();
buf.extend(&frame);
let msg = buf.next_frame().unwrap().expect("one frame");
assert_eq!(msg.payload, b"hi");
assert!(msg.headers.is_empty());
assert!(buf.next_frame().unwrap().is_none());Structs§
- Event
Message - One decoded AWS eventstream message.
- Frame
Buffer - Streaming frame buffer: feed arbitrary byte chunks via
FrameBuffer::extendand pull out complete messages viaFrameBuffer::next_frame.