import type { SyncService } from './SyncService.js'; import type { SettingsService } from './SettingsService.js'; /** * v0.3.0 Cut E — 자동 주기 sync timer. * * - start: settings 의 auto enabled + repo URL 모두 갖춰져야 시작 * - reconfigure: settings 변경 시 stop + start (새 interval 적용) * - stop: clearInterval (idempotent) * * sync 결과는 무시 (interval mode = silent). conflict 발생 시 다음 manual sync / * 충돌 UI 진입 시 처리됨 — 사용자가 settings 페이지의 SyncSection 에서 확인 가능. */ export class SyncTimer { private handle: NodeJS.Timeout | null = null; constructor( private syncSvc: SyncService, private settings: SettingsService ) {} async start(): Promise { if (this.handle !== null) return; // idempotent const enabled = await this.settings.isAutoSyncEnabled(); if (!enabled) return; const url = await this.settings.getSyncRepoUrl(); if (url === null || url.trim().length === 0) return; const intervalMin = await this.settings.getSyncIntervalMin(); const ms = Math.max(5, intervalMin) * 60 * 1000; this.handle = setInterval(() => { void this.syncSvc.sync().catch(() => { // silent — interval mode 의 실패는 다음 attempt 또는 사용자 manual 호출이 처리 }); }, ms); } stop(): void { if (this.handle !== null) { clearInterval(this.handle); this.handle = null; } } /** settings 변경 시 호출 — 현재 interval stop 후 새 값으로 start. */ async reconfigure(): Promise { this.stop(); await this.start(); } }