Files
q-buffer/apps/server/src/loop/loop.scheduler.ts
wisecolt 9b495b7bf7 fix(server): hata yönetimini iyileştir
Zamanlayıcı ve qbit istemcisi bileşenlerinde hata işleme yeteneklerini
güçlendirir.

- loop.scheduler: qbit hatalarında sistem durumunu ve sağlık bilgisini
  güncelleme ekler.
- qbit.client: geçici ağ hatalarını (EAI_AGAIN vb.) algılayarak oturum
  durumunu sıfırlar.
- timer.worker: global hata yakalama ekleyerek işleyicinin çökmesini
  engeller ve hataları günlüğe kaydeder.
2026-01-31 11:04:31 +03:00

39 lines
1.4 KiB
TypeScript

import { QbitClient } from "../qbit/qbit.client"
import { tickLoopJobs } from "./loop.engine"
import { getStatusSnapshot, refreshJobsStatus, setQbitStatus, setTorrentsStatus } from "../status/status.service"
import { emitQbitHealth, emitStatusUpdate } from "../realtime/emitter"
import { logger } from "../utils/logger"
export const startLoopScheduler = (qbit: QbitClient, intervalMs: number) => {
setInterval(async () => {
try {
const torrents = await qbit.getTorrentsInfo();
const transfer = await qbit.getTransferInfo();
setTorrentsStatus(torrents, transfer);
await tickLoopJobs(qbit, torrents);
const jobs = await refreshJobsStatus();
const current = await getStatusSnapshot();
emitStatusUpdate({
qbit: { ...current.qbit, ok: true },
torrents,
transfer,
jobs,
});
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
logger.error({ error }, "Loop scheduler tick failed");
setQbitStatus({ ok: false, lastError: message });
emitQbitHealth({ ok: false, lastError: message });
try {
const current = await getStatusSnapshot();
emitStatusUpdate({
...current,
qbit: { ...current.qbit, ok: false, lastError: message },
});
} catch {
// Swallow secondary status errors to keep scheduler alive.
}
}
}, intervalMs);
};