gongxiangp2/lib/detail-generator/upstream-task.ts

16 lines
1022 B
TypeScript

/** A persisted upstream identity permits result reads, never another create request. */
export interface DetailUpstreamTask { id: string; stage: string; submittedAt: number; polls: number }
export function readDetailUpstreamTask(checkpoint: Record<string, unknown>): DetailUpstreamTask | null {
const value = checkpoint.upstreamTask as Partial<DetailUpstreamTask> | undefined
if (!value || typeof value.id !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9_.:-]{0,199}$/.test(value.id)
|| typeof value.stage !== 'string' || !value.stage.startsWith('screen-') || value.stage !== checkpoint.stage
|| typeof value.submittedAt !== 'number' || !Number.isFinite(value.submittedAt) || value.submittedAt <= 0
|| !Number.isInteger(value.polls) || Number(value.polls) < 0) return null
return value as DetailUpstreamTask
}
export function canPollDetailUpstreamTask(task: DetailUpstreamTask, now = Date.now()): boolean {
return task.submittedAt <= now && now - task.submittedAt < 6 * 60 * 60 * 1000 && task.polls < 240
}