Server-Sent Events (SSE) parser for streaming inference responses.
Implements the WHATWG SSE spec
as a pure Elixir byte-stream parser, faithfully mirroring the logic in
vendor/fetch-event-source/parse.ts from the JS package.
Key properties
- Handles
\r\n,\r, and\nline endings - Accumulates partial lines across chunk boundaries (no data loss)
- Ignores
:commentlines - Dispatches a message on each blank line
- Filters
data: [DONE]sentinel values - JSON-decodes data fields and surfaces
{"error": ...}as exceptions
Example
chunks = ["data: {"choices":[{}]}\n\n", "data: [DONE]\n\n"]
Enum.to_list(HuggingfaceClient.Inference.SSE.parse_stream_json(chunks))
# => [%{"choices" => [%{}]}]
Summary
Functions
Wraps an enumerable of binary chunks into a lazy stream of parsed SSE events.
Parses SSE chunks and JSON-decodes each .data field.
Types
@type event() :: %{ id: String.t(), event: String.t(), data: String.t(), retry: non_neg_integer() | nil }
Functions
@spec parse_stream(Enumerable.t()) :: Enumerable.t()
Wraps an enumerable of binary chunks into a lazy stream of parsed SSE events.
Each element is an %{id, event, data, retry} map.
[DONE] messages and empty-data events are filtered out.
@spec parse_stream_json(Enumerable.t()) :: Enumerable.t()
Parses SSE chunks and JSON-decodes each .data field.
Returns a stream of decoded maps. Events where data isn't valid JSON are
logged at :warning level and skipped. Events containing {"error": ...}
are raised as ProviderApiError.