AWS Event Stream binary protocol parser.

AWS Event Stream is the binary framing protocol used by AWS streaming services like Bedrock, Transcribe, and S3 Select. This module provides functions to parse event stream messages from binary data.

Message Format

[total_length:4][headers_length:4][prelude_crc:4][headers:*][payload:*][message_crc:4]

Example

::eventstream ::aws::eventstream

// Parse messages from a binary stream
messages ::eventstream/parse-stream(response-bytes)

for-each(messages, (msg) {
    event-type ::eventstream/get-header(msg, ":event-type")
    print(`${event-type}: ${Str(msg.payload)}`)
})

Values

HEADER_TYPE_BOOL_FALSE

HEADER_TYPE_BOOL_FALSE: Int 1

HEADER_TYPE_BOOL_TRUE

HEADER_TYPE_BOOL_TRUE: Int 0

HEADER_TYPE_BYTE

HEADER_TYPE_BYTE: Int 2

HEADER_TYPE_BYTES

HEADER_TYPE_BYTES: Int 6

HEADER_TYPE_INT

HEADER_TYPE_INT: Int 4

HEADER_TYPE_LONG

HEADER_TYPE_LONG: Int 5

HEADER_TYPE_SHORT

HEADER_TYPE_SHORT: Int 3

HEADER_TYPE_STRING

HEADER_TYPE_STRING: Int 7

HEADER_TYPE_TIMESTAMP

HEADER_TYPE_TIMESTAMP: Int 8

HEADER_TYPE_UUID

HEADER_TYPE_UUID: Int 9

Functions

get-header

fn (message: Message, name: Str): Any

Get a header value from a message by name.

Returns the header value or null if not found.

Example

message-type ::aws::eventstream/get-header(msg, ":message-type")
event-type ::aws::eventstream/get-header(msg, ":event-type")
content-type ::aws::eventstream/get-header(msg, ":content-type")

is-error

fn (message: Message): Bool

Check if a message is an error (:message-type is "error").

is-event

fn (message: Message): Bool

Check if a message is an event (:message-type is "event").

is-exception

fn (message: Message): Bool

Check if a message is an exception (:message-type is "exception").

parse-header-value

fn (data: Bytes, offset: Int, header-type: Int): HeaderValueResult

Internal: Parse a header value based on its type.

parse-headers

fn (data: Bytes): Map

Internal: Parse headers from header bytes.

parse-headers-recursive

fn (data: Bytes, offset: Int, headers: Map): Map

Internal: Recursively parse headers.

parse-message

fn (data: Bytes): ParseResult

Parse a single event stream message from bytes.

Returns a ParseResult with the parsed message or an error.

Example

result ::aws::eventstream/parse-message(message-bytes)
cond {
    result.ok => {
        print(result.message.headers)
        print(Str(result.message.payload))
    }
    => { print(`Error: ${result.error}`) }
}

parse-message-internal

fn (data: Bytes): ParseResult

Internal: Parse a message assuming we have at least 16 bytes.

parse-stream

fn (data: Bytes): Vec

Parse all event stream messages from a byte stream.

Returns a vector of parsed Messages. Stops parsing on first error.

Example

messages ::aws::eventstream/parse-stream(stream-bytes)
for-each(messages, (msg) {
    event-type ::aws::eventstream/get-header(msg, ":event-type")
    print(event-type)
})

parse-stream-recursive

fn (data: Bytes, offset: Int, messages: Vec): Vec

Internal: Recursively parse messages from a stream.

Types

HeaderValueResult

HeaderValueResult type {
    value: Any,
    next_offset: Int
}

Internal type for header value parsing result.

Message

Message type {
    headers: Map,
    payload: Bytes
}

A parsed event stream message. payload holds the raw message bytes.

ParseResult

ParseResult type {
    ok: Bool,
    message: Message?,
    error: Str?,
    bytes_consumed: Int
}

Result of parsing an event stream message.