pub struct Event { /* private fields */ }
Expand description
A Server-Sent Event
(SSE) in a Server-Sent EventStream
.
A server-sent event is either a field or a comment. Comments can be
constructed via Event::comment()
while fields can be constructed via
Event::data()
, Event::json()
, and Event::retry()
.
use rocket::tokio::time::Duration;
use rocket::response::stream::Event;
// A `data` event with message "Hello, SSE!".
let event = Event::data("Hello, SSE!");
// The same event but with event name of `hello`.
let event = Event::data("Hello, SSE!").event("hello");
// A `retry` event to set the client-side reconnection time.
let event = Event::retry(Duration::from_secs(5));
// An event with an attached comment, event name, and ID.
let event = Event::data("Hello, SSE!")
.with_comment("just a hello message")
.event("hello")
.id("1");
We largely defer to MDN’s using server-sent events documentation for client-side details but reproduce, in our words, relevant server-side documentation here.
§Pitfalls
Server-Sent Events suffer from certain pitfalls. We encourage readers to read through pitfalls before making use of Rocket’s SSE support.
§Comments
A server-sent comment, created via Event::comment()
, is an event that
appears only in the raw server-sent event data stream and is inaccessible by
most clients. This includes JavaScript’s EventSource
. As such, they serve
little utility beyond debugging a raw data stream and keeping a connection
alive. See heartbeat for information on
Rocket’s EventStream
keep-alive.
§Fields
A server-sent field can be one of four kinds:
-
retry
A
retry
event, created viaEvent::retry()
, sets the reconnection time on the client side. It is the duration the client will wait before attempting to reconnect when a connection is lost. Most applications will not need to set aretry
, opting instead to use the implementation’s default or to reconnect manually on error. -
id
Sets the event id to associate all subsequent fields with. This value cannot be retrieved directly via most clients, including JavaScript
EventSource
. Instead, it is sent by the implementation on reconnection via theLast-Event-ID
header. Anid
can be attached to other fields via theEvent::id()
builder method. -
event
Sets the event name to associate the next
data
field with. In JavaScript’sEventSource
, this is the event to be listened for, which defaults tomessage
. Anevent
can be attached to other fields via theEvent::event()
builder method. -
data
Sends data to dispatch as an event at the client. In JavaScript’s
EventSource
, this (and only this) results in an event handler forevent
, specified just prior, being triggered. A data field can be created via theEvent::data()
orEvent::json()
constructors.
§Implementation Notes
A constructed Event
always emits its fields in the following order:
comment
retry
id
event
data
The event
and id
fields cannot contain new lines or carriage returns.
Rocket’s default implementation automatically converts new lines and
carriage returns in event
and id
fields to spaces.
The data
and comment
fields cannot contain carriage returns. Rocket
converts the unencoded sequence \r\n
and the isolated \r
into a
protocol-level \n
, that is, in such a way that they are interpreted as
\n
at the client. For example, the raw message foo\r\nbar\rbaz
is
received as foo\nbar\nbaz
at the client-side. Encoded sequences, such as
those emitted by Event::json()
, have no such restrictions.
Implementations§
source§impl Event
impl Event
sourcepub fn empty() -> Self
pub fn empty() -> Self
Creates a new Event
with an empty data field.
This is exactly equivalent to Event::data("")
.
§Example
use rocket::response::stream::Event;
let event = Event::empty();
sourcepub fn json<T: Serialize>(data: &T) -> Self
Available on crate feature json
only.
pub fn json<T: Serialize>(data: &T) -> Self
json
only.Creates a new Event
with a data field of data
serialized as JSON.
§Example
use rocket::serde::Serialize;
use rocket::response::stream::Event;
#[derive(Serialize)]
#[serde(crate = "rocket::serde")]
struct MyData<'r> {
string: &'r str,
number: usize,
}
let data = MyData { string: "hello!", number: 10 };
let event = Event::json(&data);
sourcepub fn data<T: Into<Cow<'static, str>>>(data: T) -> Self
pub fn data<T: Into<Cow<'static, str>>>(data: T) -> Self
Creates a new Event
with a data field containing the raw data
.
§Raw SSE is Lossy
Unencoded carriage returns cannot be expressed in the protocol. Thus,
any carriage returns in data
will not appear at the client-side.
Instead, the sequence \r\n
and the isolated \r
will each appear as
\n
at the client-side. For example, the message foo\r\nbar\rbaz
is
received as foo\nbar\nbaz
at the client-side.
See pitfalls for more details.
§Example
use rocket::response::stream::Event;
// A `data` event with message "Hello, SSE!".
let event = Event::data("Hello, SSE!");
sourcepub fn comment<T: Into<Cow<'static, str>>>(data: T) -> Self
pub fn comment<T: Into<Cow<'static, str>>>(data: T) -> Self
Creates a new comment Event
.
As with Event::data()
, unencoded carriage returns cannot be
expressed in the protocol. Thus, any carriage returns in data
will
not appear at the client-side. For comments, this is generally not a
concern as comments are discarded by client-side libraries.
§Example
use rocket::response::stream::Event;
let event = Event::comment("bet you'll never see me!");
sourcepub fn retry(period: Duration) -> Self
pub fn retry(period: Duration) -> Self
Creates a new retry Event
.
§Example
use rocket::response::stream::Event;
use rocket::tokio::time::Duration;
let event = Event::retry(Duration::from_millis(250));
sourcepub fn event<T: Into<Cow<'static, str>>>(self, event: T) -> Self
pub fn event<T: Into<Cow<'static, str>>>(self, event: T) -> Self
Sets the value of the ‘event’ (event type) field.
Event names may not contain new lines \n
or carriage returns \r
. If
event
does contain new lines or carriage returns, they are replaced
with spaces (
) before being sent to the client.
§Example
use rocket::response::stream::Event;
// The event name is "start".
let event = Event::data("hi").event("start");
// The event name is "then end", with `\n` replaced with ` `.
let event = Event::data("bye").event("then\nend");
sourcepub fn id<T: Into<Cow<'static, str>>>(self, id: T) -> Self
pub fn id<T: Into<Cow<'static, str>>>(self, id: T) -> Self
Sets the value of the ‘id’ (last event ID) field.
Event IDs may not contain new lines \n
or carriage returns \r
. If
id
does contain new lines or carriage returns, they are replaced
with spaces (
) before being sent to the client.
§Example
use rocket::response::stream::Event;
// The event ID is "start".
let event = Event::data("hi").id("start");
// The event ID is "then end", with `\n` replaced with ` `.
let event = Event::data("bye").id("then\nend");
Sets the value of the ‘id’ field. It may not contain newlines.
sourcepub fn with_data<T: Into<Cow<'static, str>>>(self, data: T) -> Self
pub fn with_data<T: Into<Cow<'static, str>>>(self, data: T) -> Self
Sets or replaces the value of the data
field.
§Example
use rocket::response::stream::Event;
// The data "hello" will be sent.
let event = Event::data("hi").with_data("hello");
// The two below are equivalent.
let event = Event::comment("bye").with_data("goodbye");
let event = Event::data("goodbye").with_comment("bye");
sourcepub fn with_comment<T: Into<Cow<'static, str>>>(self, data: T) -> Self
pub fn with_comment<T: Into<Cow<'static, str>>>(self, data: T) -> Self
Sets or replaces the value of the comment
field.
§Example
use rocket::response::stream::Event;
// The comment "🚀" will be sent.
let event = Event::comment("Rocket is great!").with_comment("🚀");
// The two below are equivalent.
let event = Event::comment("bye").with_data("goodbye");
let event = Event::data("goodbye").with_comment("bye");
sourcepub fn with_retry(self, period: Duration) -> Self
pub fn with_retry(self, period: Duration) -> Self
Sets or replaces the value of the retry
field.
§Example
use rocket::response::stream::Event;
use rocket::tokio::time::Duration;
// The reconnection will be set to 10 seconds.
let event = Event::retry(Duration::from_millis(500))
.with_retry(Duration::from_secs(10));
// The two below are equivalent.
let event = Event::comment("bye").with_retry(Duration::from_millis(500));
let event = Event::retry(Duration::from_millis(500)).with_comment("bye");
Trait Implementations§
impl Eq for Event
impl StructuralPartialEq for Event
Auto Trait Implementations§
impl Freeze for Event
impl RefUnwindSafe for Event
impl Send for Event
impl Sync for Event
impl Unpin for Event
impl UnwindSafe for Event
Blanket Implementations§
source§impl<'a, T> AsTaggedExplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedExplicit<'a> for Twhere
T: 'a,
source§impl<'a, T> AsTaggedImplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedImplicit<'a> for Twhere
T: 'a,
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the foreground set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red()
and
green()
, which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg()
:
use yansi::{Paint, Color};
painted.fg(Color::White);
Set foreground color to white using white()
.
use yansi::Paint;
painted.white();
source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.bright_black());
source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.bright_green());
source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.bright_yellow());
source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.bright_magenta());
source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Returns self
with the
fg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.bright_white());
source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self
with the background set to
value
.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red()
and
on_green()
, which have the same functionality but
are pithier.
§Example
Set background color to red using fg()
:
use yansi::{Paint, Color};
painted.bg(Color::Red);
Set background color to red using on_red()
.
use yansi::Paint;
painted.on_red();
source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlack
.
§Example
println!("{}", value.on_bright_black());
source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightGreen
.
§Example
println!("{}", value.on_bright_green());
source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightYellow
.
§Example
println!("{}", value.on_bright_yellow());
source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightBlue
.
§Example
println!("{}", value.on_bright_blue());
source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightMagenta
.
§Example
println!("{}", value.on_bright_magenta());
source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightCyan
.
§Example
println!("{}", value.on_bright_cyan());
source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Returns self
with the
bg()
set to
Color::BrightWhite
.
§Example
println!("{}", value.on_bright_white());
source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute
value
.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold()
and
underline()
, which have the same functionality
but are pithier.
§Example
Make text bold using attr()
:
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);
Make text bold using using bold()
.
use yansi::Paint;
painted.bold();
source§fn underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
§Example
println!("{}", value.underline());
source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
§Example
println!("{}", value.rapid_blink());
source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi
Quirk
value
.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask()
and
wrap()
, which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk()
:
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);
Enable wrapping using wrap()
.
use yansi::Paint;
painted.wrap();
source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition
value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted
only when both stdout
and stderr
are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);