use std::borrow::Cow;
pub(crate) fn next_sse_event_boundary(buffer: &str) -> Option<(usize, usize)> {
["\r\n\r\n", "\n\r\n", "\r\n\n", "\n\n"]
.into_iter()
.filter_map(|boundary| buffer.find(boundary).map(|index| (index, boundary.len())))
.min_by_key(|(index, _)| *index)
}
pub(crate) fn sse_data(raw_event: &str) -> Option<Cow<'_, str>> {
let mut lines = raw_event.lines().filter_map(|line| {
line.strip_prefix("data:")
.map(|payload| Cow::Borrowed(payload.strip_prefix(' ').unwrap_or(payload)))
});
let first = lines.next()?;
let Some(second) = lines.next() else {
return Some(first);
};
let mut data = String::with_capacity(first.len() + 1 + second.len());
data.push_str(&first);
data.push('\n');
data.push_str(&second);
for line in lines {
data.push('\n');
data.push_str(&line);
}
Some(Cow::Owned(data))
}
pub(crate) fn diagnostic_snippet(text: &str) -> String {
let redacted = crate::output::redact_sensitive_text(text).replace('\n', "\\n");
let mut snippet = redacted.chars().take(200).collect::<String>();
if redacted.chars().count() > 200 {
snippet.push_str("...");
}
snippet
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn next_sse_event_boundary_accepts_lf_crlf_and_mixed_boundaries() {
assert_eq!(next_sse_event_boundary("data: one\n\n"), Some((9, 2)));
assert_eq!(next_sse_event_boundary("data: one\r\n\r\n"), Some((9, 4)));
assert_eq!(next_sse_event_boundary("data: one\n\r\n"), Some((9, 3)));
assert_eq!(next_sse_event_boundary("data: one\r\n\n"), Some((9, 3)));
assert_eq!(next_sse_event_boundary("data: one"), None);
}
#[test]
fn next_sse_event_boundary_returns_earliest_boundary() {
assert_eq!(
next_sse_event_boundary("data: a\n\ndata: b\r\n\r\n"),
Some((7, 2))
);
}
#[test]
fn sse_data_collects_multiline_data_and_strips_one_optional_space() {
assert_eq!(
sse_data("event: ignored\ndata: hello \ndata:\tthere\t").as_deref(),
Some(" hello \n\tthere\t")
);
}
#[test]
fn sse_data_returns_none_when_event_has_no_data() {
assert_eq!(sse_data("event: ping\nid: 1"), None);
}
#[test]
fn diagnostic_snippet_redacts_truncates_and_escapes_newlines() {
let text = format!("first\nsk-test-FAKE\n{}", "x".repeat(260));
let snippet = diagnostic_snippet(&text);
assert!(!snippet.contains("sk-test-FAKE"), "{snippet}");
assert!(snippet.contains("\\n"), "{snippet}");
assert!(snippet.ends_with("..."), "{snippet}");
assert!(snippet.chars().count() <= 210, "{snippet}");
}
}