pub struct SseEventDecoder { /* private fields */ }Expand description
Incremental decoder for text/event-stream byte streams that yields one JSON object per
complete data: payload.
SSE frames are separated by blank lines (\n\n); each frame may contain event: and data:
lines. Anthropic Messages, OpenAI Responses, and OpenAI Chat Completions all emit one JSON
object per data: line, so the decoder buffers received bytes, splits on frame boundaries,
parses the JSON payload, and tags it with the frame’s event name when present.
The decoder is byte-stream-friendly: it accumulates partial frames across chunks and emits completed frames only when their terminating blank line arrives. Bytes after the last terminator are retained for the next call.
Implementations§
Source§impl SseEventDecoder
impl SseEventDecoder
Sourcepub fn push_bytes(&mut self, bytes: &[u8]) -> Result<Vec<SseEvent>>
pub fn push_bytes(&mut self, bytes: &[u8]) -> Result<Vec<SseEvent>>
Appends bytes to the internal buffer and returns every now-complete SSE event.
Bytes are interpreted as UTF-8 with replacement characters for invalid sequences; provider SSE streams are well-formed UTF-8 in practice, but lossy decoding keeps the decoder honest rather than failing on a single corrupt chunk.
Returns Ok(events) containing zero or more events whose data: payloads parsed
successfully. Frames whose data: line is non-empty but does not parse as JSON are
surfaced as FlowError::Internal so the caller can decide whether to abort the stream
or skip the frame; frames with no data: line at all (e.g. SSE heartbeats) are silently
dropped.
Sourcepub fn finish(self) -> Result<Option<SseEvent>>
pub fn finish(self) -> Result<Option<SseEvent>>
Drains any remaining buffered frame at end of stream.
Most well-formed SSE streams end with a terminating blank line, in which case this returns
Ok(None). Stops with no terminator are surfaced as a final partial frame so observability
captures the last bytes the upstream sent before disconnect.
Trait Implementations§
Source§impl Default for SseEventDecoder
impl Default for SseEventDecoder
Source§fn default() -> SseEventDecoder
fn default() -> SseEventDecoder
Auto Trait Implementations§
impl Freeze for SseEventDecoder
impl RefUnwindSafe for SseEventDecoder
impl Send for SseEventDecoder
impl Sync for SseEventDecoder
impl Unpin for SseEventDecoder
impl UnsafeUnpin for SseEventDecoder
impl UnwindSafe for SseEventDecoder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request