35 lines
1.6 KiB
TypeScript
35 lines
1.6 KiB
TypeScript
import type { CanvasTaskRequest } from "./task-contract";
|
|
|
|
export type CanvasProductionService = "render" | "upscale" | "asr" | "separation";
|
|
const serviceNames: Record<CanvasProductionService, string> = {
|
|
render: "视频成片合成", upscale: "视频高清", asr: "语音转写", separation: "人声分离",
|
|
};
|
|
|
|
export function requiredCanvasProductionServices(requests: CanvasTaskRequest[]) {
|
|
const services = new Set<CanvasProductionService>();
|
|
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<boolean>,
|
|
) {
|
|
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" },
|
|
);
|
|
}
|