73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import { apiClient } from './client';
|
|
import { RunTemplateResponse, TemplateGenerationResponse, RunTemplateData } from '../types/template-run';
|
|
import { storage } from '../storage';
|
|
|
|
export async function runTemplate(templateId: string, data: RunTemplateData): Promise<RunTemplateResponse> {
|
|
// 从 storage 获取用户 session 作为 identifier
|
|
const sessionStr = await storage.getItem('session');
|
|
let identifier = 'anonymous';
|
|
|
|
if (sessionStr) {
|
|
try {
|
|
const session = JSON.parse(sessionStr);
|
|
identifier = session?.user?.id || 'anonymous';
|
|
} catch (error) {
|
|
console.warn('Failed to parse session:', error);
|
|
}
|
|
}
|
|
|
|
return apiClient<RunTemplateResponse>(`/api/templates/${templateId}/run`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({
|
|
data,
|
|
identifier,
|
|
}),
|
|
});
|
|
}
|
|
|
|
export async function getTemplateGeneration(generationId: string): Promise<TemplateGenerationResponse> {
|
|
return apiClient<TemplateGenerationResponse>(`/api/template-generations/${generationId}`);
|
|
}
|
|
|
|
export async function pollTemplateGeneration(
|
|
generationId: string,
|
|
onComplete: (result: any) => void,
|
|
onError: (error: Error) => void,
|
|
maxAttempts: number = 100,
|
|
intervalMs: number = 3000
|
|
): Promise<void> {
|
|
let attempts = 0;
|
|
|
|
const poll = async () => {
|
|
try {
|
|
attempts++;
|
|
|
|
if (attempts > maxAttempts) {
|
|
throw new Error('轮询超时,请稍后重试');
|
|
}
|
|
|
|
const response = await getTemplateGeneration(generationId);
|
|
const generation = response.data;
|
|
|
|
// 检查是否完成
|
|
if (generation.status === 'completed') {
|
|
onComplete(generation);
|
|
return;
|
|
}
|
|
|
|
// 检查是否失败
|
|
if (generation.status === 'failed') {
|
|
throw new Error('任务执行失败');
|
|
}
|
|
|
|
// 继续轮询
|
|
setTimeout(poll, intervalMs);
|
|
|
|
} catch (error) {
|
|
onError(error as Error);
|
|
}
|
|
};
|
|
|
|
// 开始轮询
|
|
setTimeout(poll, intervalMs);
|
|
} |