- Pre-generate sessionId on client side before API call to avoid race conditions - Add small delays in progress tracker to ensure EventSource connection is established - Improve logging and error handling in progress streaming - Add connection confirmation messages in EventSource stream - Fix TypeScript interface to include sessionId in AnalysisProgress This should resolve the lag between actual analysis progress and progress bar display.
68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import { progressTracker } from '../../../../../lib/progress-tracker'
|
|
|
|
export async function GET(
|
|
request: NextRequest,
|
|
{ params }: { params: Promise<{ sessionId: string }> }
|
|
) {
|
|
const { sessionId } = await params
|
|
|
|
// Create a readable stream for Server-Sent Events
|
|
const encoder = new TextEncoder()
|
|
|
|
const stream = new ReadableStream({
|
|
start(controller) {
|
|
console.log(`🔍 Starting EventSource stream for session: ${sessionId}`)
|
|
|
|
// Send initial progress if session exists
|
|
const initialProgress = progressTracker.getProgress(sessionId)
|
|
if (initialProgress) {
|
|
console.log(`🔍 Sending initial progress for ${sessionId}:`, initialProgress.currentStep)
|
|
const data = `data: ${JSON.stringify(initialProgress)}\n\n`
|
|
controller.enqueue(encoder.encode(data))
|
|
} else {
|
|
// Send a connection established message even if no progress yet
|
|
const connectMsg = `data: ${JSON.stringify({ type: 'connected', sessionId })}\n\n`
|
|
controller.enqueue(encoder.encode(connectMsg))
|
|
}
|
|
|
|
// Listen for progress updates
|
|
const progressHandler = (progress: any) => {
|
|
console.log(`🔍 Streaming progress update for ${sessionId}:`, progress.currentStep)
|
|
const data = `data: ${JSON.stringify(progress)}\n\n`
|
|
controller.enqueue(encoder.encode(data))
|
|
}
|
|
|
|
// Listen for completion
|
|
const completeHandler = () => {
|
|
console.log(`🔍 Streaming completion for ${sessionId}`)
|
|
const data = `data: ${JSON.stringify({ type: 'complete' })}\n\n`
|
|
controller.enqueue(encoder.encode(data))
|
|
controller.close()
|
|
}
|
|
|
|
// Subscribe to events
|
|
progressTracker.on(`progress:${sessionId}`, progressHandler)
|
|
progressTracker.on(`progress:${sessionId}:complete`, completeHandler)
|
|
|
|
// Cleanup on stream close
|
|
request.signal.addEventListener('abort', () => {
|
|
progressTracker.off(`progress:${sessionId}`, progressHandler)
|
|
progressTracker.off(`progress:${sessionId}:complete`, completeHandler)
|
|
controller.close()
|
|
})
|
|
}
|
|
})
|
|
|
|
return new NextResponse(stream, {
|
|
headers: {
|
|
'Content-Type': 'text/event-stream',
|
|
'Cache-Control': 'no-cache',
|
|
'Connection': 'keep-alive',
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'GET',
|
|
'Access-Control-Allow-Headers': 'Cache-Control'
|
|
}
|
|
})
|
|
}
|