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.