flow

OperatorRunner

Запуск ранера оператора

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 може тривати довго, а інші мають стартувати одразу.

Всередині:

  1. favoriteService.start() — спочатку фаворити
  2. statisticsService.getTasks() — поточні задачі
  3. Для кожної TU: lady.init({ PUBLIC_KEY }) із затримкою 3 с між запитами щоб не флудити API → LadyRunner-Init
  4. lady.runTasks() + lady.runSenders()
  5. Наприкінці: 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-InitLadyRunner
  • Створює фоновий ландшафт сервісів (див. кожен крок вище)