ly0303521

添加视频生成状态超时处理,限制处理时间为8分钟

@@ -36,6 +36,9 @@ export const pollVideoStatus = ( @@ -36,6 +36,9 @@ export const pollVideoStatus = (
36 onStatusUpdate: (status: VideoStatus) => void 36 onStatusUpdate: (status: VideoStatus) => void
37 ): Promise<VideoStatus> => { 37 ): Promise<VideoStatus> => {
38 return new Promise((resolve, reject) => { 38 return new Promise((resolve, reject) => {
  39 + let processingStartTime: number | null = null;
  40 + const PROCESSING_TIMEOUT_MS = 8 * 60 * 1000; // 8 minutes limit for processing
  41 +
39 const interval = setInterval(async () => { 42 const interval = setInterval(async () => {
40 try { 43 try {
41 const res = await fetch(`${TURBO_DIFFUSION_API_URL}/status/${taskId}`); 44 const res = await fetch(`${TURBO_DIFFUSION_API_URL}/status/${taskId}`);
@@ -49,6 +52,17 @@ export const pollVideoStatus = ( @@ -49,6 +52,17 @@ export const pollVideoStatus = (
49 const data: VideoStatus = await res.json(); 52 const data: VideoStatus = await res.json();
50 onStatusUpdate(data); 53 onStatusUpdate(data);
51 54
  55 + // Track processing time
  56 + if (data.status === 'processing') {
  57 + if (processingStartTime === null) {
  58 + processingStartTime = Date.now();
  59 + } else if (Date.now() - processingStartTime > PROCESSING_TIMEOUT_MS) {
  60 + clearInterval(interval);
  61 + reject(new Error("Video generation timed out (8 minutes processing limit)."));
  62 + return;
  63 + }
  64 + }
  65 +
52 if (data.status === 'complete' || data.status === 'failed') { 66 if (data.status === 'complete' || data.status === 'failed') {
53 clearInterval(interval); 67 clearInterval(interval);
54 if (data.status === 'failed') { 68 if (data.status === 'failed') {
@@ -58,9 +72,8 @@ export const pollVideoStatus = ( @@ -58,9 +72,8 @@ export const pollVideoStatus = (
58 } 72 }
59 } 73 }
60 } catch (error) { 74 } catch (error) {
61 - clearInterval(interval);  
62 - console.error('Polling error:', error);  
63 - reject(error); 75 + // Don't stop polling on transient network errors
  76 + console.warn('Polling transient error:', error);
64 } 77 }
65 }, 2000); // Poll every 2 seconds 78 }, 2000); // Poll every 2 seconds
66 }); 79 });