Запуск ранера оператора
OperatorRunner.start() · src/main/operator/operator.runner.ts
Ініціалізує всі сервіси та запускає логіки для кожної TU. Викликається як 4-й крок логіну (Login).
Захист від подвійної ініціалізації: якщо isInitialized або isSuccessInitialized — кидає помилку.
Крок 1. Створення ранерів анкет
for (const lady of ladies) → new LadyRunner(lady, this)
Для кожної TU створюється окремий LadyRunner і додається в ladyRunners[].
Чому так: Кожна TU працює незалежно — свої таски, сендери, стани. Окремий runner дає ізоляцію: падіння однієї TU не зупиняє інших.
Крок 2. Ініціалізація DeepL
deepLService.init()
Чому так: Перший серед сервісів — може знадобитись іншим під час їх старту (DeepLService).
Крок 3. Запуск NetworkService
networkService.start() // cant throw
Інтервальний моніторинг мережі (NetworkService).
Чому так: Стартує першим серед інтервальних — стан мережі треба знати одразу. Помилок не кидає — падіння мережі не повинно зупиняти ініціалізацію ранера.
Крок 4. Отримання Public Key
this.PUBLIC_KEY = await stackService.getPublicKey()
Чому так: Ключ потрібен для шифрування даних TU при ініціалізації LadyRunner-ів. Може кидати помилку — якщо не вдалось отримати, ранер зупиняється.
Крок 5. Ініціалізація ManService
await manService.init() // can throw
Завантажує онлайн-статуси RU та їхні профілі (ManService).
Чому так: Дані RU потрібні для рендеру тасків в UI (ім’я, фото, pubID). Ініціалізується до запуску ранерів TU щоб при першому рендері ці дані вже були.
Крок 6. Ініціалізація AgencyService
await agencyService.init() // can throw
Ініціалізує Agency list (AgencyService).
Чому так: Налаштування та обмеження агенції потрібні перед стартом TU.
Крок 7. Ініціалізація ранерів анкет
initLadyRunners(PUBLIC_KEY) // асинхронно, БЕЗ await
Чому так: Запускається через .catch() без await — щоб не блокувати решту сервісів (activity, stream, dataSync). Ініціалізація TU може тривати довго, а інші мають стартувати одразу.
Всередині:
favoriteService.start()— спочатку фаворитиstatisticsService.getTasks()— поточні задачі- Для кожної TU:
lady.init({ PUBLIC_KEY })із затримкою 3 с між запитами щоб не флудити API → LadyRunner-Init lady.runTasks()+lady.runSenders()- Наприкінці:
ladyOnlineService.start(),savingViewsService.start()
Крок 8. Запуск ActivityService
activityService.start()
Інтервальне відстеження активності оператора (ActivityService).
Чому так: Незалежне від стану TU — йде паралельно з ініціалізацією LadyRunners.
Крок 9. Запуск StreamTrackingService
streamTrackingService.start()
Відстеження стрімів TU (StreamTrackingService).
Чому так: Паралельно з ініціалізацією LadyRunners — стріми треба відстежувати з самого початку.
При старті одразу викликає cleanupActiveStreamsOnStartup() — деактивує всі інтервали що залишились з попередньої сесії.
Крок 10. Синхронізація даних
await dataSyncService.syncData()
Початкова синхронізація локальної SQLite з сервером (DataSyncService).
Чому так: Останній у ланцюжку — після старту всіх сервісів. Забирає дані що накопичились у БД (напр. після закриття програми без синку).
Зв’язки
- Викликається з: Login
- Ініціалізує анкети: LadyRunner-Init → LadyRunner
- Створює фоновий ландшафт сервісів (див. кожен крок вище)