/
viktorphp
/
front-socket
Обзор
Документация
Войти
/
viktorphp
/
front-socket
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/shared/api/socket/socketService.ts
201 строка
6 KB
Viktorphp84
feature-socket: add debug info.
03 сен 2025, 23:28
03 сен 2025, 23:28
0213c5a
Код
Авторство
О чём код?
import io, { Socket } from 'socket.io-client'; import { IChatItem, IMessage, IUser, IUserItem } from '@shared/types'; const getCookie = (name: string): string | undefined => { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts?.pop()?.split(';').shift(); }; class SocketService { private socket: typeof Socket | null = null; connect(callback: (data: { status: string; user: IUser }) => void) { const authUserCookies = getCookie('auth_user'); console.log('🔍 SocketService Debug Info:'); console.log( 'NEXT_PUBLIC_REACT_APP_SOCKET_URL:', process.env.NEXT_PUBLIC_REACT_APP_SOCKET_URL ); console.log('NEXT_PUBLIC_API_URL:', process.env.NEXT_PUBLIC_API_URL); // Подключаемся с настройками для работы с сессией this.socket = io( process.env.NEXT_PUBLIC_REACT_APP_SOCKET_URL || 'http://localhost:3000', { autoConnect: true, transports: ['websocket'], auth: { cookies: authUserCookies, }, } ); if (this.socket) { this.socket.on('connected', (data: { status: string; user: IUser }) => { console.log('Соединение установлено'); callback(data); }); this.socket.on('error', (error: Error) => { console.error('Ошибка подключения:', error); }); } return this.socket; } sendMessage(recipientId: string, content: string) { if (this.socket) { this.socket.emit('sendMessage', { recipientId, content }); } } sendUpdateIsRead(senderId: string) { if (this.socket) { this.socket.emit('updateIsRead', { senderId }); } } /** Метод для запроса предыдущих сообщений через событие 'getConversation' */ sendGetConversation(userId: string) { if (this.socket) { console.log('getConversation', userId); this.socket.emit('getConversation', { userId }); } } /** Метод для запроса списка всех чатов пользователя */ sendGetChats() { if (this.socket) { console.log('getChats'); this.socket.emit('getChats'); } } /** Метод для запроса списка всех чатов для всех пользователей */ sendGetChatsForEveryone() { if (this.socket) { console.log('getChats'); this.socket.emit('getChatsForEveryone'); } } /** Метод для осуществления поиска пользователя */ searchUser(query: string) { if (this.socket) { this.socket.emit('searchUser', { query }); } } /** Подписка на получение результата поиска пользователей. * Ожидается объект с полями status и users, где users - массив пользователей */ onUserSearch( callback: (data: { status: string; users: IUserItem[] }) => void ): () => void { if (this.socket) { this.socket.on('userSearchResult', callback); } return () => { this?.socket?.off('userSearchResult', callback); }; } /** Событие срабатывает при получении сообщения. */ onReceiptMessage( callback: (data: { status: string; message: IMessage }) => void ): () => void { if (this.socket) { this.socket.on('newMessage', callback); // Подписка на событие 'newMessage' } return () => { this?.socket?.off('newMessage', callback); }; } onSendingMessage( callback: (data: { status: string; message: IMessage }) => void ): () => void { if (this.socket) { this.socket.on('confirmationSendingMessage', callback); // Подписка на событие 'confirmationSendingMessage' } return () => { this?.socket?.off('confirmationSendingMessage', callback); }; } /** Получение списка сообщений. Отправитель определяется на бэкенде по sessionId. * Получатель - userId, передается в запросе. */ onConversationList( callback: (data: { status: string; messages: IMessage[] }) => void ): () => void { if (this.socket) { this.socket.on('conversationList', callback); // Подписка на событие 'conversationList' } return () => { this?.socket?.off('conversationList', callback); }; } /** Подписка на получение списка чатов. * Ожидается объект с полями status и chats */ onChatsList( callback: (data: { status: string; chats: IChatItem[] }) => void ): () => void { if (this.socket) { this.socket.on('chatsList', callback); } return () => { this?.socket?.off('chatsList', callback); }; } /** Подписка на получение сообщения о том, что поля isRead в объектах сообщений обновлены. */ onUpdateIsRead(callback: (data: { status: string }) => void): () => void { if (this.socket) { this.socket.on('confirmationUpdateIsRead', callback); } return () => { this?.socket?.off('confirmationUpdateIsRead', callback); }; } onConnect(callback: (data: { userId: string }) => void): () => void { if (this.socket) { this.socket.on('userConnected', callback); } return () => { this?.socket?.off('userConnected', callback); }; } onDisconnect(callback: (data: { userId: string }) => void): () => void { if (this.socket) { this.socket.on('userDisconnected', callback); } return () => { this?.socket?.off('userDisconnected', callback); }; } disconnect() { if (this.socket) { this.socket.disconnect(); this.socket = null; console.log('Подключение разорвано'); } } } export const socketService = new SocketService();