Files
MikrotikManager/backend/src/services/alert-collector-hooks.ts
T
DenozordecandCursor 5f31bb47fb chore: synchronize pending app/backend updates and repository hygiene
Includes current frontend and backend work in progress and removes generated artifacts from tracking to keep the repository clean for дальнейшая разработка.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 12:29:04 +07:00

49 lines
2.0 KiB
TypeScript

/**
* Внутренние хуки: после записи сигналов в SQLite (коллекторы) — отложенный прогон `alert_engine`.
* Не импортирует `scheduler.ts` (избегаем цикла); runner задаётся через `wireAlertEngineRunner`.
*
* Любой код, пишущий таблицы для `buildSignalSnapshot`, после успешного коммита должен вызывать
* `scheduleAlertEngineAfterDataCollectors()`.
*/
import { isSchedulerJobRunning } from "./scheduler-running.js"
const ALERT_AFTER_COLLECT_DEBOUNCE_MS = 250
const ALERT_AFTER_COLLECT_WAIT_MS = 100
let alertAfterCollectTimer: ReturnType<typeof setTimeout> | null = null
let alertAfterCollectChain: Promise<void> = Promise.resolve()
let alertEngineRunner: (() => Promise<void>) | null = null
/** Задать runner один раз при старте приложения (обычно `() => executeSchedulerJob("alert_engine")`). */
export function wireAlertEngineRunner(run: () => Promise<void>): void {
alertEngineRunner = run
}
export function clearAlertCollectorHooksTimer(): void {
if (alertAfterCollectTimer != null) {
clearTimeout(alertAfterCollectTimer)
alertAfterCollectTimer = null
}
}
async function runAlertEngineWhenIdle(): Promise<void> {
const run = alertEngineRunner
if (!run) return
while (isSchedulerJobRunning("alert_engine")) {
await new Promise<void>((resolve) => setTimeout(resolve, ALERT_AFTER_COLLECT_WAIT_MS))
}
await run()
}
/** После успешной записи сигналов в БД коллекторами (не из `alert_engine`). */
export function scheduleAlertEngineAfterDataCollectors(): void {
if (alertAfterCollectTimer != null) clearTimeout(alertAfterCollectTimer)
alertAfterCollectTimer = setTimeout(() => {
alertAfterCollectTimer = null
alertAfterCollectChain = alertAfterCollectChain
.then(() => runAlertEngineWhenIdle())
.catch(() => {})
}, ALERT_AFTER_COLLECT_DEBOUNCE_MS)
}