- Introduced `generationCancelJob` command ID in `commands/ids.ts`. - Added `GenerationCancelJobPayload` type in `commands/payloads.ts`. - Enhanced job status to include "cancelled" in `editor/state.ts`. - Updated `runGenerationJob` to accept an `AbortSignal` and handle cancellation. - Implemented cancellation logic in `runGenerate` and related functions. - Added tests for job cancellation in `operations/generation/workflow.test.ts`. - Improved layer rendering logic to prevent stack overflow in `editor/document-indexes.ts`. - Added raster size assertions in `platform/browser/rasterLimits.ts` for image processing limits. - Enhanced image file handling to check for size limits in `platform/browser/imageFiles.ts`. - Updated UI components to reflect job cancellation state in `view/GenerationJobStatus.tsx` and `view/bottom-controls/GenerateActionControls.tsx`.
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
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<void>;
|
|
}): Promise<void> {
|
|
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`,
|
|
});
|
|
}
|
|
}
|