/** * Internal dependencies — production 에서는 puppeteer / DB 를 사용하지만, test 에서는 * mock 으로 교체해 hash dedup / debounce / queue 로직만 검증. */ export interface SchedulerDeps { generateThumbnail: (model: string, context: any) => Promise; /** * board 의 thumbnailUpdatedAt 이 없거나 since 보다 이를 때만 저장하고, 저장했는지 돌려준다. 생성하는 사이 클라이언트 * thumbnail 이 저장됐으면(thumbnailUpdatedAt 이 since 뒤) 더 오래된 model 의 그림이라 덮지 않는다. */ saveThumbnail: (boardId: string, thumbnail: string, timestamp: Date, since: Date) => Promise; } /** SchedulerDeps.saveThumbnail 의 DB 구현 — 조건과 저장을 한 UPDATE 문으로 한다. */ export declare function saveGeneratedThumbnail(boardId: string, value: string, now: Date, since: Date): Promise; /** Test-only — DI 로 internal dependency 교체. */ export declare function _setSchedulerDeps(d: SchedulerDeps): void; /** Test-only — default dependency 복원. */ export declare function _resetSchedulerDeps(): void; /** Test-only — module-level state 초기화. */ export declare function _resetSchedulerState(): void; /** Test-only — 현재 진행 중인 모든 작업 완료까지 대기. */ export declare function _waitForIdle(): Promise; /** FNV-1a 32-bit hash — 빠르고 model 변경 감지에 충분. */ export declare function fnv1a(s: string): string; /** * 백엔드 thumbnail 생성을 fire-and-forget 으로 schedule. * * 호출자는 await 하지 않는다 — mutation 응답이 thumbnail 완료에 차단되지 않도록. * * 동작: * - 직전 성공 model 과 hash 동일 → 즉시 return (no-op). * - 같은 board 에 진행 중 작업 있으면 → pending 만 갱신, 끝나면 이어서 처리. * - 진행 중 작업 없음 → 즉시 시작. * * 풀 timeout / puppeteer 오류는 사용자 mutation 에 전혀 영향 없다. * 그 경우 lastHashByBoard 를 set 하지 않아 다음 저장에서 재시도된다. */ export declare function scheduleThumbnail(boardId: string, model: string, context: any): void; /** * 저장에 실린 thumbnail 이 클라이언트가 만든 그림인가. 비었거나 빈 gif(EMPTY_THUMBNAIL 등 data:image/gif)는 그림이 * 없다는 뜻이라 백엔드가 만든다. */ export declare function isClientThumbnail(thumbnail?: string | null): boolean; /** * 클라이언트가 보낸 thumbnail 을 저장한다 — 이 board 의 백엔드 생성은 하지 않는다. * * - 대기 중인 생성은 버린다. * - 진행 중인 생성은 끝나도 저장하지 않는다 — 호출자가 저장하는 thumbnailUpdatedAt 이 그 생성의 시작보다 늦기 때문이다. * - 마지막으로 그린 model 의 hash 를 지운다 — 다음에 thumbnail 없이 저장하면 같은 model 이라도 다시 그린다. * * 호출자는 thumbnail 과 함께 thumbnailUpdatedAt 을 저장한다. */ export declare function acceptClientThumbnail(boardId: string): void; /** * 진단 / 운영용 — 현재 큐 / 진행 상태. * 추후 admin endpoint 에서 활용 가능. */ export declare function getSchedulerStats(): { pending: number; inFlight: number; cachedHashes: number; };