Створення вкладки анкети
tabsService.createChatTab({ id_api, password, PUBLIC_KEY }) · src/main/services/tabs.service.ts
loginFn(...) · src/main/scripts/connect-lady.script.ts
Відкриває реальну Electron BrowserWindow для анкети і повністю ініціалізує сесію на сайті.
1. Підготовка BrowserWindow
Для кожної анкети створюється ізольована сесія з partition: temp:profile_${id_api}:
session.clearStorageData()
session.clearCache()
session.clearHostResolverCache()
session.cookies.flushStore()
BrowserWindow прихований (show: false), nodeIntegration: false, devTools: false.
Після цього — два обробники:
JSESSIONID interception (onHeadersReceived):
- Якщо відповідь містить
Set-Cookie: JSESSIONIDі URL —/rlogin→ дозволяємо, логуємо вcriticalLogsRepository - Якщо URL —
agencyhelper→ пропускаємо мовчки - Будь-який інший URL → блокуємо (видаляємо з заголовків), логуємо в
criticalLogsRepository
Дозвіл на медіа (setPermissionRequestHandler):
permission === 'media'→callback(true)— автоматично надається доступ до камери/мікрофона- Все інше →
callback(false)
2. Завантаження та вхід (loginFn)
Вкладка відкриває https://goldenbride.net/chat#!CHAT;.
На події dom-ready → executeJavaScript запускає loginFn у контексті вкладки.
Очищення стану в браузері
localStorage.clear()
sessionStorage.clear()
document.cookie // очищуємо всі cookies через expires=1970Логін на сайті
POST /rlogin з { username: id_api, userpass: password, doremember: true, requestType: 'login' }
Повертає ILoginData:
| Поле | Що це |
|---|---|
id | id анкети на сайті |
loginTokenChat | токен для WebSocket (param5) |
isOnline | поточний статус онлайн |
url | URL аватарки |
mainPhotoDTO | метадані фото |
Перевірка PUBLIC_KEY
getViews(PUBLIC_KEY) → GWT RPC запит getCometData. Якщо відповідь некоректна — надсилає tab:need-refresh-public-key в main-процес.
3. WebSocket підключення
initWebSocket({ param2, param5: loginTokenChat })
wss://goldenbride.net/Red5Chat/?param1={id_api}¶m2=jfbvjebrfjhvbhbrehv¶m3=0¶m4=lufsfhwykdpyngp¶m5={loginTokenChat}
Всі повідомлення сокету → sentToElectron({ type: 'tab:socket-message' }) → main-процес обробляє через SocketMessageParser.
Автоматичне перепідключення при close/error:
- Затримки: 3с → 7с → 10с → 20с → 20с (5 спроб)
ALREADY_CONNECTEDу повідомленні → примусово закриває і перепідключається
Проміс createChatTab резолвиться коли main-процес надсилає tab:socket-resolve після успішного connectFromServer.
Якщо вкладка не створилась
existsTab залишається false. Анкета працює в обмеженому режимі — без чату і сендерів. Логується помилка. Може бути ініціалізована повторно через handleNeedRefreshPublicKey.
4. Socket події анкети (SocketMessageParser)
src/main/socket/message-parser.ts
Всі повідомлення сокету вкладки обробляє SocketMessageParser в main-процесі.
| Подія | Дія |
|---|---|
connectFromServer / reconnectFromServer | socketConnected = true |
error | socketConnected = false, показує помилку в UI |
authError | socketConnected = false, надсилає SocketReject в табу |
paidChatStarted | temporaryStop для RU + ActiveChat таск |
paidChatStopped | Оновлює ActiveChat таск |
receivePrivateMessage | Парсить повідомлення, створює таск (Like або UnansweredMessage) |
| WebRTC події | offer, answer, iceCandidate* — проксуються в табу |
closeStream | Стрім закрито → оновлює UI |
receiveVideoMode | RU дивиться/не дивиться відео |
receivePrivateMessage
chatSender.addToTemporaryStop(manId_api)— зупиняє автоінвайтиautoAnswer()— підтвердження серверу- Якщо текст ==
🌹→TaskType.Like, інакше →TaskType.UnansweredMessage reactService.sendChatMessage()→ UI
paidChatStarted
chatSender.addToTemporaryStop(manId_api)TaskType.ActiveChatтаск- Синтетичне повідомлення
CHAT_STARTED→ UI