1 个不稳定版本

0.0.2 2023年8月12日
0.0.1 2023年8月12日

2554解析器实现

MIT 许可证

79KB
1.5K SLoC

服务器端发送事件流编解码器

实现了一个 Codec 用于编码和解码 [服务器端发送事件] 流。

优点

  • 通过使用由 FramedWriteFramedRead 提供的缓冲区,在解析行时最小化分配
  • 易于与其他 tokio 生态系统组件一起使用
  • 可以与实现 AsyncReadAsyncWrite 的任何类型一起使用
  • 错误实现 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