Server-Sent Events (SSE)
Волга включает встроенную поддержку Server-Sent Events (SSE), что позволяет вам реализовать одностороннюю связь в реальном времени от сервера к клиенту в ваших веб-приложениях. Эта функция доступна по умолчанию и совместима с протоколами HTTP/1 и HTTP/2.
Базовая реализация
В примере ниже показано, как создать простую конечную точку SSE. Она сопоставляет запрос GET
с маршрутом /events
, устанавливает Content Type как text/event-stream
и непрерывно отправляет сообщение "Hello, world!"
раз в секунду, пока клиент не отключится:
use volga::{App, error::Error, http::sse::Message, sse};
use futures_util::stream::repeat_with;
use std::time::Duration;
use tokio_stream::StreamExt;
#[tokio::main]
async fn main() -> std::io::Result<()> {
let mut app = App::new();
app.map_get("/events", || async {
// Создаем поток сообщений с отправкой раз в секунду
let stream = repeat_with(|| Message::new().data("Hello, world!"))
.map(Ok::<_, Error>)
.throttle(Duration::from_secs(1));
sse!(stream)
});
app.run().await
}
Настройка сообщений
Волга предоставляет структуру Message
, которая поможет вам создавать и настраивать сообщения SSE.
Для простых текстовых сообщений используйте метод data()
, как показано выше. Если вам необходимо отправить структурированные данные, такие как JSON, используйте метод json()
, который принимает любой тип, реализующий типаж serde::Serialize
:
use volga::http::sse::Message;
use serde::Serialize;
#[derive(Serialize)]
struct SseData {
data: String,
}
let payload = SseData { data: "Hello, world!".into() };
Message::new().json(payload);
В дополнение к этому, Message
также поддерживает настройку имени события (поле event
), идентификатора (поле id
), комментариев (поле comment
) и интервала попыток повторного подключения клиента (поле retry
). Подробную информацию о формате сообщения SSE см. в руководстве MDN.
Полный пример использования можно так же найти по по ссылке.