Logout
operatorRunner.stop() · src/main/operator/operator.runner.ts
Повна зупинка всіх логік і очистка стану. Запускається або вручну оператором, або автоматично якщо start() впав з помилкою.
Послідовність зупинки
1. Флаг і глобальні інтервали оператора
isActive = false
statisticsService.stop()
networkService.stop()
activityService.stop()
ladyOnlineService.stop()
favoriteService.stop()
2. Socket + глобальні системні сервіси
operatorAuthService.logout()
└── stackSocket.stop() ← закриває WebSocket з'єднання
stopGlobalServices()
├── updateService.stop() ← зупиняє перевірку оновлень (15-хв інтервал)
└── osMonitorService.stop() ← зупиняє моніторинг CPU/RAM, скидає значення в 0
3. Лог на сервер
stackService.saveLog({ title: 'Operator logout!' }) ← fire-and-forget, помилка не блокує
4. Зупинка views і stream
savingViewsService.stop()
streamTrackingService.stop() ← await, закриває активні стрім-інтервали в БД
5. Зупинка всіх LadyRunner-ів (паралельно)
Promise.all( ladyRunners.map(lady => lady.stop()) )
Для кожної анкети:
tabsService.logout(id_api) ← надсилає Logout команду у BrowserWindow вкладку
manOnlineService.stop()
taskChatService.stop()
taskMailService.stop()
blockListService.stop()
chatQueue.stop()
chatSender.stop()
mailSender.stop()
taskFactory.stop()
lastSendService.stop()
existsTab = false
socketConnected = false
sendersWasRunning = false
6. Фінальна синхронізація з сервером
dataSyncService.stop() ← await, виконує останній sync перед зупинкою
(7 таблиць: streams, chats, mails, online, views, logs, actions)
7. Пауза і скидання стану
delay(1000) ← чекає 1 секунду щоб всі async операції завершились
resetState():
isInitialized = false
isSuccessInitialized = false
ladyRunners = []
operatorFamilyId = ''
PUBLIC_KEY = ''
isActive = true ← готовий до повторного логіну
Нюанси
- Якщо будь-який крок
stop()кидає виняток —app.quit(). Примусово закриває Electron-додаток, щоб не залишати завислий стан streamTrackingService.stop()іdataSyncService.stop()— awaited (критичні: треба закрити інтервали і відправити дані)- Всі
ladyRunner.stop()— паралельно черезPromise.all stackService.saveLog()— fire-and-forget (.catchє, але не блокує)- Після
resetState()operatorRunnerготовий прийняти новийstart()без перезапуску програми
Зв’язки
- Зупиняє: OperatorRunner, всі LadyRunners
- Фінальний синк: DataSyncService
- Тригер: System Buttons