1 个不稳定版本
0.0.2 | 2023年8月12日 |
---|---|
0.0.1 |
|
2554 在 解析器实现
79KB
1.5K SLoC
服务器端发送事件流编解码器
实现了一个 Codec
用于编码和解码 [服务器端发送事件] 流。
优点
- 通过使用由
FramedWrite
和FramedRead
提供的缓冲区,在解析行时最小化分配 - 易于与其他 tokio 生态系统组件一起使用
- 可以与实现
AsyncRead
或AsyncWrite
的任何类型一起使用 - 错误实现
miette::Diagnostic
以提供更好的错误和诊断信息
示例
use futures::StreamExt;
use tokio_util::codec::{FramedRead, Decoder};
use tokio_sse_codec::{SseDecoder, Frame, Event, SseDecodeError};
#[tokio::main]
async fn main() -> Result<(), SseDecodeError> {
// you can use any stream or type that implements `AsyncRead`
let data = "id: 1\nevent: example\ndata: hello, world\n\n";
let mut reader = FramedRead::new(data.as_bytes(), SseDecoder::<String>::new());
while let Some(Ok(frame)) = reader.next().await {
match frame {
Frame::Event(event) => println!("event: id={:?}, name={}, data={}", event.id, event.name, event.data),
Frame::Comment(comment) => println!("comment: {}", comment),
Frame::Retry(duration) => println!("retry: {:#?}", duration),
}
}
Ok::<(), SseDecodeError>(())
}
设置缓冲区大小限制
默认情况下,解码器不会限制用于存储事件数据的缓冲区的大小。在处理不可信输入时建议设置一个,否则恶意服务器可能会发送一个非常大的事件并消耗所有可用内存。
缓冲区应能够容纳一个事件及其数据。
use tokio_sse_codec::SseDecoder;
let decoder = SseDecoder::<String>::with_max_size(1024);
依赖项
~3.5–5.5MB
~83K SLoC