Websocket подключается и тут же отключается, какая может быть причина?
В Postman запрос проходит как надо и токен передается, не понимаю почему у меня сокет отключается, логировал токен, он вроде как вставляется в запрос. Может я всё таки не корректно передаю токен?
import { io, Socket } from "socket.io-client";
import { refreshTokens } from "@/shared/config/redux/slices/auth/authSlice";
let socket: Socket | null = null;
const createSocket = () => {
const accessToken = localStorage.getItem("accessToken");
if (!accessToken) {
throw new Error("not found accessToken");
}
console.log("Создание сокета с токеном:", accessToken);
return io(process.env.NEXT_PUBLIC_WSS_URL, {
transports: ["websocket", "polling"],
extraHeaders: {
Authorization: `Bearer ${accessToken}`,
},
});
};
export const connectSocket = async (): Promise<Socket | null> => {
try {
let accessToken = localStorage.getItem("accessToken");
if (!accessToken) {
accessToken = await refreshTokens();
if (!accessToken) {
console.error("Токен отсутствует. Подключение сокета невозможно.");
return null;
}
localStorage.setItem("accessToken", accessToken);
}
if (!socket) {
console.log("Подключение к WebSocket...");
socket = createSocket();
socket.on("connection", (socket) => {
console.log("Headers received:", socket.handshake.headers);
});
socket.on("connect", () =>
console.log("WebSocket подключен:", socket?.id)
);
socket.on("disconnect", (reason) => console.log("WebSocket отключен:", reason));
socket.on("connect_error", (error) =>
console.error("Ошибка подключения:", error)
);
socket.on("auth_error", async () => {
console.log("Токен истек. Попытка обновить токен...");
try {
const newAccessToken = await refreshTokens();
if (newAccessToken) {
localStorage.setItem("accessToken", newAccessToken);
socket?.disconnect();
socket = createSocket();
} else {
console.error("Не удалось обновить токен. Отключаем сокет.");
disconnectSocket();
}
} catch (error) {
console.error("Ошибка при обновлении токена:", error);
disconnectSocket();
}
});
}
return socket;
} catch (error) {
console.error("Ошибка при подключении сокета:", error);
return null;
}
};
export const disconnectSocket = () => {
if (socket) {
socket.disconnect();
socket = null;
}
};
export const getSocket = (): Socket | null => socket;
Порядок логов:
Подключение к WebSocket
Создание сокета с токеном: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MzQ3NTc4NTgsImlkIjo1MywiZW1haWwiOiJwbGFuZXRzdG91bkBtYWlsLnJ1IiwibmFtZSI6Ilx1MDQyNVx1MDQzMFx1MDQzMVx1MDQzOFx1MDQzMSIsImlzX2FjdGl2YXRlZCI6dHJ1ZSwiaXNfYWRtaW4iOmZhbHNlfQ.Ajqa2Vi-QhDp3nIk9Vc6456hfgbfg7n67n=
WebSocket отключен: io server disconnect