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 } = 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('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 () => {}; // Пустая функция отписки, если сокета нет // };