Crates.io | tokio_sse_codec |
lib.rs | tokio_sse_codec |
version | 0.0.2 |
source | src |
created_at | 2023-08-12 00:28:53.163085 |
updated_at | 2023-08-12 00:34:15.86158 |
description | Tokio codec for Server-Sent Events |
homepage | |
repository | https://github.com/tarqd/ldactl/tree/main/tokio_sse_codec |
max_upload_size | |
id | 942488 |
size | 78,757 |
Implements a [Codec
] for encoding and decoding [Server-Sent Events] streams.
Advantages:
FramedWrite
] and [FramedRead
] while parsing linesAsyncRead
] or [AsyncWrite
]miette::Diagnostic
] for better error and diagnostic messagesuse 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>(())
}
By default, the decoder will not limit the size of the buffer used to store the data of an event. It's recommended to set one when dealing with untrusted input, otherwise a malicious server could send a very large event and consume all available memory.
The buffer should be able to hold a single event and it's data.
use tokio_sse_codec::SseDecoder;
let decoder = SseDecoder::<String>::with_max_size(1024);