import { commandIds } from "@commands/ids"; import type { GenerationJobKind } from "@editor/state"; import type { AppStore } from "@editor/store"; export async function runGenerationJob(options: { kind: GenerationJobKind; label: string; dispatch: AppStore["dispatch"]; signal: AbortSignal; task: (signal: AbortSignal) => Promise; }): Promise { const jobId = crypto.randomUUID(); const startedAt = Date.now(); const nextState = options.dispatch(commandIds.generationStartJob, { jobId, kind: options.kind, label: options.label, startedAt }); if (!nextState.editor.generation.jobs.some((job) => job.id === jobId && job.status === "running")) return; try { await options.task(options.signal); options.dispatch(commandIds.generationSucceedJob, { jobId, finishedAt: Date.now() }); } catch (reason: unknown) { if (options.signal.aborted) { options.dispatch(commandIds.generationCancelJob, { jobId, finishedAt: Date.now() }); return; } options.dispatch(commandIds.generationFailJob, { jobId, finishedAt: Date.now(), error: reason instanceof Error ? reason.message : `${options.label} failed`, }); } }