import type { CanvasTaskRequest } from "./task-contract"; export type CanvasProductionService = "render" | "upscale" | "asr" | "separation"; const serviceNames: Record = { render: "视频成片合成", upscale: "视频高清", asr: "语音转写", separation: "人声分离", }; export function requiredCanvasProductionServices(requests: CanvasTaskRequest[]) { const services = new Set(); for (const request of requests) { if (request.kind === "video-upscale") services.add("upscale"); if (request.kind !== "smart-edit") continue; const params = request.params; if (params.operation === "render" || params.autoRender === true) services.add("render"); if (params.operation === "transcribe" || params.transcribe === true) services.add("asr"); if (params.operation === "separate") services.add("separation"); } return [...services]; } export async function assertCanvasProductionServices( requests: CanvasTaskRequest[], check: (service: CanvasProductionService) => Promise, ) { const services = requiredCanvasProductionServices(requests); const results = await Promise.allSettled(services.map(check)); const unavailable = services.filter((_service, index) => { const result = results[index]; return result.status === "rejected" || result.value !== true; }); if (unavailable.length) throw Object.assign( Error(`${unavailable.map(service => serviceNames[service]).join("、")}服务不可用;本次未启动生成任务,请稍后重试`), { status: 503, code: "CANVAS_SERVICE_UNAVAILABLE" }, ); }