103 lines
3.3 KiB
TypeScript
103 lines
3.3 KiB
TypeScript
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 });
|
|
}
|
|
} |