// Авторизация через Sec-WebSocket-Protocol: ['vibex.auth', token] —
// токен не попадает в URL и в логи доступа. Сервер валидирует его
// и выводит личность из токена.
const socket = new WebSocket(`${wsBaseUrl}/ws/chats/${activeChatId}`, [
'vibex.auth',
token,
]);
socket.onopen = () => {
reconnectAttemptsRef.current = 0;
reconnectDelayMsRef.current = 1500;
emitStatus('open');
};
socket.onclose = (event) => {
emitStatus('closed', { closeCode: event.code });
if (!shouldReconnectRef.current) return;
reconnectAttemptsRef.current += 1;
const delay = reconnectDelayMsRef.current;
reconnectDelayMsRef.current = Math.min(
Math.round(reconnectDelayMsRef.current * 1.6),
10_000,
);
reconnectTimeoutRef.current = window.setTimeout(() => connect(true), delay);
};
// Связь вернулась — подключаемся сразу, не дожидаясь следующего тика таймера.
const handleOnline = () => {
if (!shouldReconnectRef.current) return;
reconnectDelayMsRef.current = 1500;
connect(true);
};