Skip to main content

Module eventstream

Module eventstream 

Source
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§

EventMessage
One decoded AWS eventstream message.
FrameBuffer
Streaming frame buffer: feed arbitrary byte chunks via FrameBuffer::extend and pull out complete messages via FrameBuffer::next_frame.