StreamTrackingService
src/main/operator/interval-services/stream-tracking.service.ts
Записує інтервали стрімів анкет у локальну SQLite БД. Дані потім синкаються через DataSyncService на сервер для аналітики.
Не інтервальний
Не має власного циклу — викликається подіями від ManOnlineService (кожні ~15 сек).
Як працює запис стріму
Стрім — це інтервал { start, stop, isActive } для конкретної анкети (ladyId_api) за конкретну дату.
| Метод | Тригер | Що робить |
|---|---|---|
startStream(ladyId_api) | ManOnline: false → true | Якщо є попередній активний — закриває його. Створює новий запис isActive: true, start = now, stop = now + 1000 |
updateStream(ladyId_api) | ManOnline: true → true | Оновлює stop = now для активного інтервалу — розтягує його в часі |
stopStream(ladyId_api, ts) | ManOnline: true → false | Закриває інтервал: `stop = timestamp |
Розбиття по днях (splitIntervalIfNeeded)
Якщо стрім перетинає північ — автоматично розбивається на два інтервали:
- Старий інтервал:
stop = 23:59:59.999поточного дня - Новий інтервал:
start = 00:00:00.000наступного дня,stop = now
Перевіряється при кожному stopStream та updateStream.
При старті програми
cleanupActiveStreamsOnStartup() — деактивує всі isActive = true записи що залишились від попередньої сесії (аварійне закриття, перезапуск). Виконується синхронно при start().
При зупинці
stop() → stopAllStreams() — проходить по всіх ladyRunners і зупиняє кожен активний стрім з timestamp = now.
Формат для синку (getSteamsToSync)
Перед відправкою на сервер конвертує плоский список з БД у структуру IStreamDay[]:
IStreamDay {
date: string // '2025-04-16'
ladies: IStreamLady[] {
ladyId_api: number
intervals: { id, start, stop, isActive }[]
}
}
Групується по датах, потім по анкетах. Після успішного синку сервер повертає streamIds[] — ці записи видаляються з локальної БД.