Skip to content

Commit f52512c

Browse files
joshtriplettjbr
authored andcommitted
Support sending events without an event: field for the event name
The event field is optional in the specification, and adds overhead, which some applications do not want. Allow omitting it. To simplify use, accept the name as `impl Into<Option<&str>>`, which allows existing code that passes `"name"` to continue working. Since this can potentially cause an inference failure in code that previously compiled, bump the major version, but *most* code should continue working with just a recompile.
1 parent 8e5add4 commit f52512c

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "async-sse"
3-
version = "4.1.0"
3+
version = "5.0.0"
44
license = "MIT OR Apache-2.0"
55
repository = "https://github.com/http-rs/async-sse"
66
documentation = "https://docs.rs/async-sse"

src/encoder.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,16 @@ impl Sender {
100100
}
101101

102102
/// Send a new message over SSE.
103-
pub async fn send(&self, name: &str, data: &str, id: Option<&str>) -> io::Result<()> {
103+
pub async fn send(
104+
&self,
105+
name: impl Into<Option<&str>>,
106+
data: &str,
107+
id: Option<&str>,
108+
) -> io::Result<()> {
104109
// Write the event name
105-
let msg = format!("event:{}\n", name);
106-
self.inner_send(msg).await?;
110+
if let Some(name) = name.into() {
111+
self.inner_send(format!("event:{}\n", name)).await?;
112+
}
107113

108114
// Write the id
109115
if let Some(id) = id {

tests/encode.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,28 @@ async fn encode_message() -> http_types::Result<()> {
3737
Ok(())
3838
}
3939

40+
#[async_std::test]
41+
async fn encode_message_some() -> http_types::Result<()> {
42+
let (sender, encoder) = encode();
43+
task::spawn(async move { sender.send(Some("cat"), "chashu", None).await });
44+
45+
let mut reader = decode(BufReader::new(encoder));
46+
let event = reader.next().await.unwrap()?;
47+
assert_message(&event, "cat", "chashu", None);
48+
Ok(())
49+
}
50+
51+
#[async_std::test]
52+
async fn encode_message_data_only() -> http_types::Result<()> {
53+
let (sender, encoder) = encode();
54+
task::spawn(async move { sender.send(None, "chashu", None).await });
55+
56+
let mut reader = decode(BufReader::new(encoder));
57+
let event = reader.next().await.unwrap()?;
58+
assert_message(&event, "message", "chashu", None);
59+
Ok(())
60+
}
61+
4062
#[async_std::test]
4163
async fn encode_message_with_id() -> http_types::Result<()> {
4264
let (sender, encoder) = encode();
@@ -48,6 +70,17 @@ async fn encode_message_with_id() -> http_types::Result<()> {
4870
Ok(())
4971
}
5072

73+
#[async_std::test]
74+
async fn encode_message_data_only_with_id() -> http_types::Result<()> {
75+
let (sender, encoder) = encode();
76+
task::spawn(async move { sender.send(None, "chashu", Some("0")).await });
77+
78+
let mut reader = decode(BufReader::new(encoder));
79+
let event = reader.next().await.unwrap()?;
80+
assert_message(&event, "message", "chashu", Some("0"));
81+
Ok(())
82+
}
83+
5184
#[async_std::test]
5285
async fn encode_retry() -> http_types::Result<()> {
5386
let (sender, encoder) = encode();

0 commit comments

Comments
 (0)