use crate::sse::{protocol::SseProtocolHandler, types::SseMessageKind};
#[derive(Clone, Debug, Default)]
pub struct GenericSseHandler;
impl GenericSseHandler {
#[must_use]
pub fn new() -> Self {
Self
}
}
impl SseProtocolHandler for GenericSseHandler {
fn classify_event(&self, event: &crate::sse::parse::event::Event) -> SseMessageKind {
if event.retry.is_some() && event.data.is_empty() {
return SseMessageKind::Retry;
}
if !event.data.is_empty() {
return SseMessageKind::Data;
}
SseMessageKind::System
}
}
#[cfg(test)]
mod tests {
use std::time::Duration;
use bytes_utils::Str;
use super::*;
use crate::sse::parse::event::Event;
fn make_event(event: &str, data: &str, id: &str, retry: Option<Duration>) -> Event {
Event {
event: Str::from(event),
data: Str::from(data),
id: Str::from(id),
retry,
}
}
#[test]
fn test_classify_data_event() {
let handler = GenericSseHandler::new();
let event = make_event("message", "{\"price\":42000}", "evt-1", None);
assert_eq!(handler.classify_event(&event), SseMessageKind::Data);
}
#[test]
fn test_classify_retry_event() {
let handler = GenericSseHandler::new();
let event = make_event("", "", "", Some(Duration::from_secs(5)));
assert_eq!(handler.classify_event(&event), SseMessageKind::Retry);
}
#[test]
fn test_classify_system_event() {
let handler = GenericSseHandler::new();
let event = make_event("", "", "", None);
assert_eq!(handler.classify_event(&event), SseMessageKind::System);
}
#[test]
fn test_classify_data_with_retry() {
let handler = GenericSseHandler::new();
let event = make_event("message", "hello", "", Some(Duration::from_secs(3)));
assert_eq!(handler.classify_event(&event), SseMessageKind::Data);
}
#[test]
fn test_classify_named_event_no_data() {
let handler = GenericSseHandler::new();
let event = make_event("ping", "", "", None);
assert_eq!(handler.classify_event(&event), SseMessageKind::System);
}
#[test]
fn test_default_lifecycle_hooks() {
let handler = GenericSseHandler::new();
handler.on_connect();
handler.on_disconnect();
}
#[test]
fn test_default_should_retry() {
let handler = GenericSseHandler::new();
let err = crate::error::TransportError::sse_stream_ended();
assert!(handler.should_retry(&err));
}
}