bw-expo-app/lib/api/template-runs.ts

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);
}