Контекст
Для обеспечения отзывчивости интерфейса (обновление статусов задач, уведомления о действиях команды, изменение загрузки в реальном времени) необходимо внедрить механизм Server-Sent Events. В отличие от WebSockets, SSE работает поверх стандартного HTTP, более экономичен в плане ресурсов сервера и идеально подходит для односторонней трансляции обновлений от бэкенда к клиенту (unidirectional data flow).
Технические требования
- Локация логики:
src/realtime, src/shared/interceptors/sse.interceptor
- Инструменты: EventEmitters (Node.js), HTTP Streaming, Redis Pub/Sub (для горизонтального масштабирования).
- Логика работы:
- Создать эндпоинт
GET /api/v1/events/subscribe, который удерживает HTTP-соединение с заголовками Content-Type: text/event-stream и Cache-Control: no-cache.
- Реализовать
EventBus на базе EventEmitter для внутренней маршрутизации событий внутри сервиса.
- При возникновении события в системе (например,
task.updated или user.status_changed), сервис должен отправлять сообщение в поток конкретного пользователя или всей команды.
- Реализовать механизм "Heartbeat" (отправка пустого комментария
: keep-alive каждые 15-30 секунд) для предотвращения разрыва соединения прокси-серверами (NGINX/Cloudflare).
Цель и критерии приемки (Definition of Done)
Важные указания
- Производительность: Обязательно настроить корректное закрытие стримов при отключении клиента (
req.on('close')), чтобы избежать утечек памяти (Memory Leaks).
- Ошибки: Если соединение прервано, клиент должен иметь возможность восстановить его. Использовать поле
id в SSE сообщениях, чтобы клиент мог отслеживать последнее полученное событие.
- Безопасность: Проверка JWT-токена должна происходить при установке соединения. SSE-поток должен фильтровать события согласно правам доступа пользователя (интеграция с
CASL), чтобы исключить утечку данных о задачах из чужих команд.
Контекст
Для обеспечения отзывчивости интерфейса (обновление статусов задач, уведомления о действиях команды, изменение загрузки в реальном времени) необходимо внедрить механизм Server-Sent Events. В отличие от WebSockets, SSE работает поверх стандартного HTTP, более экономичен в плане ресурсов сервера и идеально подходит для односторонней трансляции обновлений от бэкенда к клиенту (unidirectional data flow).
Технические требования
src/realtime,src/shared/interceptors/sse.interceptorGET /api/v1/events/subscribe, который удерживает HTTP-соединение с заголовкамиContent-Type: text/event-streamиCache-Control: no-cache.EventBusна базеEventEmitterдля внутренней маршрутизации событий внутри сервиса.task.updatedилиuser.status_changed), сервис должен отправлять сообщение в поток конкретного пользователя или всей команды.: keep-aliveкаждые 15-30 секунд) для предотвращения разрыва соединения прокси-серверами (NGINX/Cloudflare).Цель и критерии приемки (Definition of Done)
Важные указания
req.on('close')), чтобы избежать утечек памяти (Memory Leaks).idв SSE сообщениях, чтобы клиент мог отслеживать последнее полученное событие.CASL), чтобы исключить утечку данных о задачах из чужих команд.