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 console.log(`🔍 [STREAM] Starting EventSource stream for session: ${sessionId}`) console.log(`🔍 [STREAM] Current active sessions:`, progressTracker.getActiveSessions()) // Create a readable stream for Server-Sent Events const encoder = new TextEncoder() const stream = new ReadableStream({ start(controller) { console.log(`🔍 [STREAM] Stream controller started for session: ${sessionId}`) // Send initial progress if session exists const initialProgress = progressTracker.getProgress(sessionId) if (initialProgress) { console.log(`🔍 [STREAM] Sending initial progress for ${sessionId}:`, initialProgress.currentStep) const data = `data: ${JSON.stringify(initialProgress)}\n\n` controller.enqueue(encoder.encode(data)) } else { console.log(`🔍 [STREAM] No initial progress found for ${sessionId}, creating placeholder session`) // Create a placeholder session if it doesn't exist to handle race condition const placeholderSteps = [ { id: 'init', title: 'Initializing Analysis', description: 'Starting AI-powered trading analysis...', status: 'pending' as const }, { id: 'auth', title: 'TradingView Authentication', description: 'Logging into TradingView accounts', status: 'pending' as const }, { id: 'navigation', title: 'Chart Navigation', description: 'Navigating to chart layouts', status: 'pending' as const }, { id: 'loading', title: 'Chart Data Loading', description: 'Waiting for chart data and indicators', status: 'pending' as const }, { id: 'capture', title: 'Screenshot Capture', description: 'Capturing high-quality screenshots', status: 'pending' as const }, { id: 'analysis', title: 'AI Analysis', description: 'Analyzing screenshots with AI', status: 'pending' as const } ] progressTracker.createSession(sessionId, placeholderSteps) // Send a connection established message 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(`🔍 [STREAM] 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(`🔍 [STREAM] 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) console.log(`🔍 [STREAM] Event listeners registered for ${sessionId}`) // Cleanup on stream close request.signal.addEventListener('abort', () => { console.log(`🔍 [STREAM] Stream aborted for ${sessionId}`) 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' } }) }