Files
2026-07-13 13:39:12 +08:00

128 lines
3.5 KiB
TypeScript

export type JsonObject = Record<string, unknown>;
export type KieTaskState = "success" | "failed" | "pending";
export type KieCallbackBody = {
callBackUrl?: unknown;
callback_url?: unknown;
callbackUrl?: unknown;
};
const FALLBACK_KIE_CALLBACK_URL = "https://omniroute.local/api/kie/callback";
export function isJsonObject(value: unknown): value is JsonObject {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
function callbackUrlFromBaseUrl(baseUrl: string | undefined): string | null {
if (!baseUrl || baseUrl.trim().length === 0) return null;
try {
const url = new URL(baseUrl);
url.pathname = "/api/kie/callback";
url.search = "";
url.hash = "";
return url.toString();
} catch {
return null;
}
}
function getConfiguredKieCallbackUrl(): string {
const explicit =
process.env.KIE_CALLBACK_URL?.trim() || process.env.OMNIROUTE_KIE_CALLBACK_URL?.trim();
if (explicit) return explicit;
return (
callbackUrlFromBaseUrl(process.env.OMNIROUTE_PUBLIC_URL) ||
callbackUrlFromBaseUrl(process.env.NEXT_PUBLIC_APP_URL) ||
callbackUrlFromBaseUrl(process.env.APP_URL) ||
callbackUrlFromBaseUrl(process.env.PUBLIC_URL) ||
FALLBACK_KIE_CALLBACK_URL
);
}
export function getKieCallbackUrl(body: KieCallbackBody = {}): string {
const callbackUrl = body.callBackUrl ?? body.callback_url ?? body.callbackUrl;
return typeof callbackUrl === "string" && callbackUrl.trim().length > 0
? callbackUrl
: getConfiguredKieCallbackUrl();
}
export function parseKieResultJson(recordData: unknown): JsonObject {
const data = isJsonObject(recordData) && isJsonObject(recordData.data) ? recordData.data : {};
const resultJson = data.resultJson;
if (typeof resultJson === "string") {
try {
const parsed = JSON.parse(resultJson) as unknown;
return isJsonObject(parsed) ? parsed : {};
} catch {
return {};
}
}
return isJsonObject(resultJson) ? resultJson : {};
}
export function normalizeKieTaskState(recordData: unknown): KieTaskState {
const record = isJsonObject(recordData) ? recordData : {};
const data = isJsonObject(record.data) ? record.data : {};
const state = String(
data.status ?? data.state ?? data.successFlag ?? record.msg ?? "PENDING"
).toUpperCase();
if (
state === "SUCCESS" ||
state === "1" ||
state === "FINISHED" ||
state === "COMPLETE" ||
state === "COMPLETED" ||
state === "FIRST_SUCCESS" ||
state === "ALL_SUCCESS" ||
state.includes("SUCCESS")
) {
return "success";
}
if (
state === "FAIL" ||
state === "FAILED" ||
state === "ERROR" ||
state === "2" ||
state === "3" ||
state.includes("FAIL") ||
state.includes("ERROR") ||
state === "CREATE_TASK_FAILED" ||
state === "GENERATE_FAILED" ||
state === "GENERATE_AUDIO_FAILED"
) {
return "failed";
}
return "pending";
}
export function getKieErrorStatus(error: unknown, fallback = 502): number {
if (isJsonObject(error)) {
const status = Number(error.status);
if (Number.isFinite(status) && status > 0) {
return status;
}
}
return fallback;
}
export function getKieErrorMessage(error: unknown, fallback: string): string {
if (error instanceof Error && error.message) {
return error.message;
}
if (isJsonObject(error) && typeof error.message === "string" && error.message.length > 0) {
return error.message;
}
return typeof error === "string" && error.length > 0 ? error : fallback;
}