16 lines
1022 B
TypeScript
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
|
|
}
|