Server-Sent Events (SSE) предоставляют простой способ получения push-уведомлений от сервера в веб-приложениях. Рассмотрим полный процесс настройки и работы с SSE на клиентской стороне.
Основной объект для работы — EventSource
:
const eventSource = new EventSource('/sse-endpoint');
Параметры конструктора:
const eventSource = new EventSource('/sse-endpoint', {
withCredentials: true // Для отправки кук и аутентификации
});
Стандартные обработчики:
// Для сообщений без указанного типа события
eventSource.onmessage = (event) => {
console.log('Получены данные:', event.data);
};
// Для обработки ошибок подключения
eventSource.onerror = (error) => {
console.error('Ошибка SSE:', error);
// Автоматическое переподключение через 3 секунды (по умолчанию)
};
Именованные события:
eventSource.addEventListener('stockUpdate', (event) => {
const stockData = JSON.parse(event.data);
updateStockTicker(stockData);
});
eventSource.addEventListener('notification', (event) => {
showNotification(event.data);
});
// Закрытие соединения
function stopUpdates() {
eventSource.close();
console.log('SSE соединение закрыто');
}
// Проверка состояния
console.log('Состояние соединения:', eventSource.readyState);
// 0 - CONNECTING, 1 - OPEN, 2 - CLOSED
<!DOCTYPE html>
<html>
<head>
<title>SSE Client</title>
</head>
<body>
<div id="updates"></div>
<script>
const updatesDiv = document.getElementById('updates');
const eventSource = new EventSource('/updates');
eventSource.onmessage = (e) => {
updatesDiv.innerHTML += `<p>${e.data}</p>`;
};
eventSource.addEventListener('systemAlert', (e) => {
alert(`СИСТЕМНОЕ УВЕДОМЛЕНИЕ: ${e.data}`);
});
eventSource.onerror = () => {
updatesDiv.innerHTML += '<p>Ожидание переподключения...</p>';
};
</script>
</body>
</html>
Автоматическое переподключение:
retry: 5000\n\n
Идентификаторы событий:
Безопасность:
Обработка JSON-данных:
eventSource.addEventListener('data', (e) => {
const parsedData = JSON.parse(e.data);
// обработка сложных объектов
});
Управление памятью:
// Важно закрывать соединение при unmount компонента
useEffect(() => {
const eventSource = new EventSource('/updates');
return () => eventSource.close();
}, []);
Кастомные повторные попытки:
let reconnectAttempts = 0;
const maxReconnectAttempts = 5;
eventSource.onerror = () => {
if (reconnectAttempts++ > maxReconnectAttempts) {
eventSource.close();
showConnectionError();
}
};
Проверка соединения:
Мониторинг событий:
Для получения SSE уведомлений клиент создает объект EventSource, подписывается на стандартные (onmessage) и кастомные события через addEventListener. Соединение автоматически поддерживается и восстанавливается при разрывах. Важно правильно обрабатывать ошибки и закрывать соединение, когда оно больше не нужно. SSE идеально подходит для реализации реальных обновлений в дашбордах, уведомлениях и других сценариях, где требуется односторонняя коммуникация сервер→клиент.