Wire publish flow to tRPC with live progress
This commit is contained in:
+33
-7
@@ -16,7 +16,7 @@ import {
|
||||
} from "./publish.schemas";
|
||||
import { publishModrinthVersion } from "./platforms/modrinth";
|
||||
import { publishCurseForgeVersion } from "./platforms/curseforge";
|
||||
import { computeVersionRanges } from "@/lib/utils/mcVersion";
|
||||
import { computeVersionRanges, type McVersionEntry } from "@/lib/utils/mcVersion";
|
||||
import { getCurseForgeMcVersions, getModrinthMcVersions } from "./meta";
|
||||
import { readAsFile } from "@/lib/utils/file";
|
||||
import { Template } from "@/lib/utils/template";
|
||||
@@ -76,11 +76,30 @@ async function runPlatform(
|
||||
const publishFn = platformAdaptors[platform].publish;
|
||||
const getGameVersionsFn = platformAdaptors[platform].getGameVersions;
|
||||
|
||||
const mcVersionEntries = computeVersionRanges(
|
||||
mcVersions.map(v => v.mc_version),
|
||||
await getGameVersionsFn(),
|
||||
ctx.input.cutoffMcVersion
|
||||
);
|
||||
// 平台准备阶段(元数据拉取 + 版本范围计算)。此处异常不在逐版本的
|
||||
// try/catch 内,必须单独兜底:记为该平台全部失败并发出 failed 事件,
|
||||
// 否则前端进度条会停在 running 假象里,错误也被吞掉。
|
||||
let mcVersionEntries: McVersionEntry[];
|
||||
try {
|
||||
mcVersionEntries = computeVersionRanges(
|
||||
mcVersions.map(v => v.mc_version),
|
||||
await getGameVersionsFn(),
|
||||
ctx.input.cutoffMcVersion
|
||||
);
|
||||
} catch (err) {
|
||||
const msg = errorMessage(err);
|
||||
console.error(`[publish] ${platform} 准备阶段失败:`, err);
|
||||
result.fail = total;
|
||||
result.errors.push(msg);
|
||||
ee.emit("progress", {
|
||||
platform,
|
||||
current: 0,
|
||||
total,
|
||||
status: "failed",
|
||||
errors: result.errors,
|
||||
} satisfies ProgressEvent);
|
||||
return result;
|
||||
}
|
||||
|
||||
const primaryFileTemplate = new Template(ctx.config.filename_format);
|
||||
const sourceFileTemplate = new Template(ctx.config.source_filename_format);
|
||||
@@ -142,6 +161,7 @@ export const appRouter = t.router({
|
||||
const result = await runPlatform(platform, input.mcVersions[platform], ctx);
|
||||
return {platform, result};
|
||||
} catch (err) {
|
||||
console.error(`[publish] ${platform} 执行异常:`, err);
|
||||
return {
|
||||
platform,
|
||||
result: { success: 0, fail: 0, errors: [errorMessage(err)] }
|
||||
@@ -156,7 +176,13 @@ export const appRouter = t.router({
|
||||
for await (const [data] of on(ee, "progress", {
|
||||
signal: opts.signal,
|
||||
})) {
|
||||
yield ProgressEventSchema.parse(data);
|
||||
const parsed = ProgressEventSchema.safeParse(data);
|
||||
if (!parsed.success) {
|
||||
// 坏事件不应中断订阅(客户端没有重连机制),跳过并记录
|
||||
console.error("[publish] invalid progress event:", parsed.error);
|
||||
continue;
|
||||
}
|
||||
yield parsed.data;
|
||||
}
|
||||
}),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user