/
viktorphp
/
front-socket
Обзор
Документация
Войти
/
viktorphp
/
front-socket
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/shared/api/socket/diarySocketService.ts
91 строка
3 KB
Иванов Виктор Евгеньевич
[feature-diadry]: добавить страницу дневника
11 апр 2026, 16:02
11 апр 2026, 16:02
e2d184b
Код
Авторство
О чём код?
import io from 'socket.io-client'; import { EOcrStatus } from '@shared/types'; /** Структура события ocrComplete, которое сервер отправляет после распознавания */ export interface IOcrCompleteEvent { fileId: string; ocrStatus: EOcrStatus; ocrText?: string; ocrError?: string; } /** Вспомогательная функция чтения cookie по имени */ const getCookie = (name: string): string | undefined => { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts?.pop()?.split(';').shift(); }; /** * Сервис для WebSocket-подключения к namespace /diary. * Слушает событие ocrComplete, которое сервер присылает * после завершения OCR-распознавания файла. */ class DiarySocketService { private socket: ReturnType<typeof io> | null = null; /** * Подключиться к namespace /diary. * Аутентификация выполняется через cookie sessionId. */ connect(): void { if (this.socket?.connected) return; // Защита от повторного подключения this.socket = io( `${process.env.NEXT_PUBLIC_REACT_APP_SOCKET_URL || 'http://localhost:3000'}/diary`, { autoConnect: true, // withCredentials позволяет браузеру отправить HTTP-куки (в том числе sessionId) // в заголовках WebSocket-хендшейка — DiaryGateway читает sessionId именно оттуда transports: ['websocket'], auth: { // DiaryGateway.extractSessionId ожидает JSON-строку вида {"sessionId":"abc123"}. // Метод делает split(','), находит entry с 'sessionId', затем split(':')[1]. // Обычная cookie-строка (key=val; key2=val2) не содержит двоеточий → парсинг даёт null. cookies: JSON.stringify({ sessionId: getCookie('sessionId') }), }, } ); this.socket.on('connect', () => { console.log('DiarySocket: подключение установлено'); }); this.socket.on('connect_error', (error: Error) => { console.error('DiarySocket: ошибка подключения', error); }); this.socket.on('disconnect', () => { console.log('DiarySocket: подключение разорвано'); }); } /** * Подписаться на событие ocrComplete. * Возвращает функцию отписки. */ onOcrComplete(callback: (data: IOcrCompleteEvent) => void): () => void { if (this.socket) { this.socket.on('ocrComplete', callback); } return () => { this.socket?.off('ocrComplete', callback); }; } /** * Отключиться от namespace /diary и освободить ресурсы. */ disconnect(): void { if (this.socket) { this.socket.disconnect(); this.socket = null; console.log('DiarySocket: отключён'); } } } /** Синглтон сервиса для использования в провайдере */ export const diarySocketService = new DiarySocketService();