50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
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<void> {
|
|
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<void> {
|
|
this.stop();
|
|
await this.start();
|
|
}
|
|
}
|