Spaces:
Paused
Paused
| import { NextResponse } from 'next/server'; | |
| declare global { | |
| var activeSandbox: any; | |
| var activeSandboxProvider: any; | |
| var lastViteRestartTime: number; | |
| var viteRestartInProgress: boolean; | |
| } | |
| const RESTART_COOLDOWN_MS = 5000; // 5 second cooldown between restarts | |
| export async function POST() { | |
| try { | |
| // Check both v1 and v2 global references | |
| const provider = global.activeSandbox || global.activeSandboxProvider; | |
| if (!provider) { | |
| return NextResponse.json({ | |
| success: false, | |
| error: 'No active sandbox' | |
| }, { status: 400 }); | |
| } | |
| // Check if restart is already in progress | |
| if (global.viteRestartInProgress) { | |
| console.log('[restart-vite] Vite restart already in progress, skipping...'); | |
| return NextResponse.json({ | |
| success: true, | |
| message: 'Vite restart already in progress' | |
| }); | |
| } | |
| // Check cooldown | |
| const now = Date.now(); | |
| if (global.lastViteRestartTime && (now - global.lastViteRestartTime) < RESTART_COOLDOWN_MS) { | |
| const remainingTime = Math.ceil((RESTART_COOLDOWN_MS - (now - global.lastViteRestartTime)) / 1000); | |
| console.log(`[restart-vite] Cooldown active, ${remainingTime}s remaining`); | |
| return NextResponse.json({ | |
| success: true, | |
| message: `Vite was recently restarted, cooldown active (${remainingTime}s remaining)` | |
| }); | |
| } | |
| // Set the restart flag | |
| global.viteRestartInProgress = true; | |
| console.log('[restart-vite] Using provider method to restart Vite...'); | |
| // Use the provider's restartViteServer method if available | |
| if (typeof provider.restartViteServer === 'function') { | |
| await provider.restartViteServer(); | |
| console.log('[restart-vite] Vite restarted via provider method'); | |
| } else { | |
| // Fallback to manual restart using provider's runCommand | |
| console.log('[restart-vite] Fallback to manual Vite restart...'); | |
| // Kill existing Vite processes | |
| try { | |
| await provider.runCommand('pkill -f vite'); | |
| console.log('[restart-vite] Killed existing Vite processes'); | |
| // Wait a moment for processes to terminate | |
| await new Promise(resolve => setTimeout(resolve, 2000)); | |
| } catch { | |
| console.log('[restart-vite] No existing Vite processes found'); | |
| } | |
| // Clear any error tracking files | |
| try { | |
| await provider.runCommand('bash -c "echo \'{\\"errors\\": [], \\"lastChecked\\": '+ Date.now() +'}\' > /tmp/vite-errors.json"'); | |
| } catch { | |
| // Ignore if this fails | |
| } | |
| // Start Vite dev server in background | |
| await provider.runCommand('sh -c "nohup npm run dev > /tmp/vite.log 2>&1 &"'); | |
| console.log('[restart-vite] Vite dev server restarted'); | |
| // Wait for Vite to start up | |
| await new Promise(resolve => setTimeout(resolve, 3000)); | |
| } | |
| // Update global state | |
| global.lastViteRestartTime = Date.now(); | |
| global.viteRestartInProgress = false; | |
| return NextResponse.json({ | |
| success: true, | |
| message: 'Vite restarted successfully' | |
| }); | |
| } catch (error) { | |
| console.error('[restart-vite] Error:', error); | |
| // Clear the restart flag on error | |
| global.viteRestartInProgress = false; | |
| return NextResponse.json({ | |
| success: false, | |
| error: (error as Error).message | |
| }, { status: 500 }); | |
| } | |
| } |