use async_stream::stream;
use futures_util::StreamExt;
use crate::HttpByteStream;
use super::{
frame_decoder,
line_decoder,
SseMessageStream,
SseRecord,
SseRecordStream,
};
pub(crate) fn decode_records_from_stream_with_limits(
stream: HttpByteStream,
max_line_bytes: usize,
max_frame_bytes: usize,
) -> SseRecordStream {
let lines = line_decoder::decode_lines(stream, max_line_bytes);
frame_decoder::decode_records(lines, max_frame_bytes)
}
pub(crate) fn decode_messages_from_stream_with_limits(
stream: HttpByteStream,
max_line_bytes: usize,
max_frame_bytes: usize,
) -> SseMessageStream {
let mut records = decode_records_from_stream_with_limits(stream, max_line_bytes, max_frame_bytes);
let output = stream! {
while let Some(item) = records.next().await {
match item {
Ok(SseRecord::Dispatch(message)) => yield Ok(message),
Ok(SseRecord::Control(_)) => continue,
Err(error) => {
yield Err(error);
return;
}
}
}
};
Box::pin(output)
}