125 lines
7.0 KiB
JavaScript
125 lines
7.0 KiB
JavaScript
import { io } from 'socket.io-client';
|
||
import { useAuth } from '@/auth'; // Чтобы получить ID текущего пользователя
|
||
|
||
let socket;
|
||
|
||
// const SOCKET_URL = 'http://localhost:5000'; // Закомментируем, так как Vite будет проксировать
|
||
// Для разработки через Vite proxy, URL должен быть относительным к домену фронтенда
|
||
const SOCKET_URL = '/'; // Vite будет перехватывать /socket.io/ путь
|
||
|
||
export const connectSocket = () => {
|
||
const { user, isAuthenticated, handleAccountBlocked, handleAccountUnblocked } = useAuth();
|
||
|
||
if (isAuthenticated.value && user.value && user.value._id) {
|
||
// Подключаемся только если пользователь аутентифицирован и есть ID
|
||
// Передаем userId в query для идентификации на сервере при подключении (альтернатива событию addUser)
|
||
// Однако, мы используем событие addUser, так что query здесь может быть избыточен, если сервер его не использует при connect.
|
||
// Оставим его, если вдруг понадобится.
|
||
// socket = io(SOCKET_URL, {
|
||
// query: { userId: user.value._id }
|
||
// });
|
||
|
||
// При использовании Vite proxy, путь для Socket.IO должен быть относительным,
|
||
// а Vite добавит префикс /socket.io/ к target в proxy.
|
||
// Однако, клиентская библиотека socket.io обычно сама добавляет /socket.io/
|
||
// поэтому мы можем просто указать базовый URL (который будет проксироваться)
|
||
// или указать полный путь, который будет проксирован.
|
||
// Для ясности и чтобы соответствовать настройке proxy, можно использовать path.
|
||
socket = io(SOCKET_URL, {
|
||
path: '/socket.io/', // Явно указываем путь, который будет проксироваться
|
||
transports: ['websocket', 'polling'] // Явно указываем транспорты для лучшей совместимости
|
||
});
|
||
|
||
console.log('[SocketService] Попытка подключения к Socket.IO серверу через Vite proxy...');
|
||
|
||
socket.on('connect', () => {
|
||
console.log('[SocketService] Успешно подключен к Socket.IO. Socket ID:', socket.id);
|
||
// Отправляем ID пользователя на сервер, чтобы он знал, кто подключился
|
||
socket.emit('addUser', user.value._id);
|
||
});
|
||
|
||
socket.on('disconnect', (reason) => {
|
||
console.log('[SocketService] Отключен от Socket.IO. Причина:', reason);
|
||
});
|
||
|
||
socket.on('connect_error', (error) => {
|
||
console.error('[SocketService] Ошибка подключения к Socket.IO:', error.message, error.data);
|
||
});
|
||
|
||
// Добавляем обработчик для события блокировки аккаунта
|
||
socket.on('account_blocked', (data) => {
|
||
console.log('[SocketService] Получено уведомление о блокировке аккаунта:', data);
|
||
// Вызываем функцию обработки блокировки из auth.js тихо, без показа браузерного уведомления
|
||
// Отложенный вызов, чтобы избежать показа стандартного уведомления браузера
|
||
setTimeout(() => {
|
||
handleAccountBlocked(data);
|
||
}, 10);
|
||
});
|
||
|
||
// Добавляем обработчик для события разблокировки аккаунта
|
||
socket.on('account_unblocked', (data) => {
|
||
console.log('[SocketService] Получено уведомление о разблокировке аккаунта:', data);
|
||
// Аналогично блокировке, используем setTimeout для предотвращения браузерного уведомления
|
||
setTimeout(() => {
|
||
// Если есть функция handleAccountUnblocked, вызываем её
|
||
if (typeof handleAccountUnblocked === 'function') {
|
||
handleAccountUnblocked(data);
|
||
} else {
|
||
console.log('[SocketService] Аккаунт разблокирован, но обработчик не определен');
|
||
}
|
||
}, 10);
|
||
});
|
||
|
||
// Можно здесь же слушать глобальные события, если нужно
|
||
// socket.on('getUsers', (users) => {
|
||
// console.log('[SocketService] Получен список активных пользователей:', users);
|
||
// // Тут можно обновить какой-нибудь стор активных пользователей
|
||
// });
|
||
|
||
return socket;
|
||
} else {
|
||
console.warn('[SocketService] Не удалось подключиться: пользователь не аутентифицирован или нет ID.');
|
||
return null;
|
||
}
|
||
};
|
||
|
||
export const disconnectSocket = () => {
|
||
if (socket) {
|
||
console.log('[SocketService] Отключение от Socket.IO...');
|
||
socket.disconnect();
|
||
socket = null;
|
||
}
|
||
};
|
||
|
||
export const getSocket = () => {
|
||
if (!socket) {
|
||
console.warn('[SocketService] getSocket вызван, но сокет не инициализирован. Попытка подключения...');
|
||
// Можно попробовать подключиться здесь, если это желаемое поведение,
|
||
// но лучше управлять подключением более явно.
|
||
// return connectSocket(); // Будь осторожен с рекурсией или множественными подключениями
|
||
}
|
||
return socket;
|
||
};
|
||
|
||
// Функции для отправки и прослушивания специфичных событий можно добавить здесь
|
||
// или использовать getSocket() в компонентах и вызывать socket.emit / socket.on там.
|
||
|
||
// Пример:
|
||
// export const sendMessageOnSocket = (messageData) => {
|
||
// const currentSocket = getSocket();
|
||
// if (currentSocket) {
|
||
// currentSocket.emit('sendMessage', messageData);
|
||
// } else {
|
||
// console.error('[SocketService] Не могу отправить сообщение: сокет не подключен.');
|
||
// }
|
||
// };
|
||
|
||
// export const listenForMessage = (callback) => {
|
||
// const currentSocket = getSocket();
|
||
// if (currentSocket) {
|
||
// currentSocket.on('getMessage', callback);
|
||
// // Возвращаем функцию для отписки
|
||
// return () => currentSocket.off('getMessage', callback);
|
||
// }
|
||
// return () => {}; // Пустая функция отписки, если сокета нет
|
||
// };
|