Волга
Главная
API Docs
GitHub
  • English
  • Русский
Главная
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Основы

    • Быстрый старт
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
    • Заголовки (Headers)
  • Форматы данных

    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Server-Sent Events (SSE)
  • Протоколы

    • HTTP/1 and HTTP/2
    • HTTPS
    • WebSockets & WebTransport
  • Продвинутые сценарии

    • Пользовательские Middleware
    • Сжатие ответов
    • Распаковка запросов
    • Центральный обработчик ошибок
    • Внедрение Зависимостей
    • Логгирование и Трассировка
    • Статические файлы
    • CORS (Cross-Origin Resource Sharing)
    • Cookies
    • Отмена запросов
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE

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.

Полный пример использования можно так же найти по по ссылке.

Last Updated:
Prev
Работа с файлами