useServerSentEvent
React-хук для работы с Server-Sent Events (SSE).
Требования
- React 18 или новее;
- браузер с поддержкой
EventSource; - Bun нужен только для запуска локального demo.
Установка
npm install use-server-sent-event
Использование
import { useServerSentEvent } from 'use-server-sent-event';
type ServerMessage = {
id: string;
value: number;
};
function Messages() {
const { data, error, isConnected } = useServerSentEvent<ServerMessage>(
'/api/events',
undefined,
);
if (error) {
return <p>Ошибка SSE: {error.message}</p>;
}
return (
<section>
<p>Статус: {isConnected ? 'Подключено' : 'Отключено'}</p>
<pre>{JSON.stringify(data, null, 2)}</pre>
</section>
);
}
По умолчанию данные каждого события разбираются через JSON.parse. Числа
являются допустимым JSON, а для plain text можно передать собственный parser.
API
useServerSentEvent<T>(url, initialState?, options?)
Существующая сигнатура с двумя аргументами поддерживается. Третий аргумент необязателен.
Опции:
parse— функция преобразования raw payload вT; по умолчаниюJSON.parse;eventName— имя SSE-события, по умолчаниюmessage;withCredentials— передавать cookies при cross-origin подключении;reconnect— сохранять нативное переподключениеEventSource, по умолчаниюtrue;resetOnUrlChange— сбрасыватьdataиerrorпри смене URL, по умолчаниюtrue;enabled— создавать подключение только приtrue, по умолчаниюtrue.
Возвращаемые значения:
data— последние данные илиundefined;error— последняя ошибка подключения или парсинга;isConnected—trueпосле событияopen.
Нативный EventSource не позволяет передавать произвольные HTTP-заголовки.
Для авторизации используйте cookies, query-параметры или другой транспорт.
SSR
На сервере подключение не создаётся. Во время SSR хук возвращает
initialState, error: null и isConnected: false. Передавайте одинаковый
initialState на сервере и клиенте, чтобы избежать hydration mismatch.
Demo и проверки
Запуск полного demo из корня репозитория:
npm run demo
Откройте http://localhost:3000 для vanilla-интерфейса или
http://localhost:3000/react для React-интерфейса, который использует
собранный dist/index.js.
Проверка перед публикацией:
npm run verify
Подробности находятся в examples/README.md.
Лицензия
MIT. См. LICENSE.