# Phase 3 Patch Application Script # This script applies the final Phase 3 modifications to server/index.mjs param( [switch]$Backup = $true, [switch]$Verify = $true ) $ErrorActionPreference = "Stop" $indexFile = "c:\dev\git\web\ObsiViewer\server\index.mjs" $backupFile = "$indexFile.backup.$(Get-Date -Format 'yyyyMMdd-HHmmss')" Write-Host "🚀 Phase 3 Patch Application" -ForegroundColor Cyan Write-Host "================================" -ForegroundColor Cyan Write-Host "" # Step 1: Create backup if ($Backup) { Write-Host "📦 Creating backup..." -ForegroundColor Yellow Copy-Item $indexFile $backupFile Write-Host "✅ Backup created: $backupFile" -ForegroundColor Green Write-Host "" } # Step 2: Read the file Write-Host "📖 Reading index.mjs..." -ForegroundColor Yellow $content = Get-Content $indexFile -Raw # Step 3: Add setup endpoint call before app.listen() Write-Host "🔧 Adding performance endpoint setup..." -ForegroundColor Yellow $performanceEndpointSetup = @" // Phase 3: Setup performance monitoring endpoint setupPerformanceEndpoint(app, performanceMonitor, metadataCache, meilisearchCircuitBreaker); "@ # Find the line with "// Créer le répertoire de la voûte" and insert before it $content = $content -replace ` "// Créer le répertoire de la voûte s'il n'existe pas", ` "$performanceEndpointSetup`n`n// Créer le répertoire de la voûte s'il n'existe pas" Write-Host "✅ Performance endpoint setup added" -ForegroundColor Green # Step 4: Update app.listen() to include deferred indexing Write-Host "🔧 Updating app.listen() for deferred indexing..." -ForegroundColor Yellow $oldListen = @" app.listen(PORT, '0.0.0.0', () => { console.log(`ObsiViewer server running on http://0.0.0.0:${PORT}`); console.log(`Vault directory: ${vaultDir}`); }); "@ $newListen = @" // Phase 3: Deferred Meilisearch indexing (non-blocking) let indexingState = { inProgress: false, completed: false }; const scheduleIndexing = async () => { if (indexingState.inProgress) return; indexingState.inProgress = true; setImmediate(async () => { try { console.time('[Meilisearch] Background indexing'); await fullReindex(vaultDir); console.timeEnd('[Meilisearch] Background indexing'); indexingState.completed = true; console.log('[Meilisearch] ✅ Background indexing completed'); } catch (error) { console.error('[Meilisearch] ❌ Background indexing failed:', error.message); indexingState.completed = false; // Retry after 5 minutes setTimeout(() => { indexingState.inProgress = false; scheduleIndexing(); }, 5 * 60 * 1000); } }); }; const server = app.listen(PORT, '0.0.0.0', () => { console.log(`🚀 ObsiViewer server running on http://0.0.0.0:${PORT}`); console.log(`📁 Vault directory: ${vaultDir}`); console.log(`📊 Performance monitoring: http://0.0.0.0:${PORT}/__perf`); // Schedule background indexing (non-blocking) scheduleIndexing(); console.log('✅ Server ready - Meilisearch indexing in background'); }); // Graceful shutdown process.on('SIGINT', () => { console.log('\n🛑 Shutting down server...'); server.close(() => { console.log('✅ Server shutdown complete'); process.exit(0); }); }); "@ $content = $content -replace [regex]::Escape($oldListen), $newListen Write-Host "✅ app.listen() updated with deferred indexing" -ForegroundColor Green # Step 5: Write the modified content Write-Host "💾 Writing modified index.mjs..." -ForegroundColor Yellow Set-Content $indexFile $content -Encoding UTF8 Write-Host "✅ File written successfully" -ForegroundColor Green # Step 6: Verify changes if ($Verify) { Write-Host "" Write-Host "🔍 Verifying changes..." -ForegroundColor Yellow $verifyContent = Get-Content $indexFile -Raw $checks = @( @{ Name = "Performance endpoint setup"; Pattern = "setupPerformanceEndpoint" }, @{ Name = "Deferred indexing"; Pattern = "scheduleIndexing" }, @{ Name = "Graceful shutdown"; Pattern = "process.on\('SIGINT'" }, @{ Name = "Performance monitoring URL"; Pattern = "__perf" } ) $allPassed = $true foreach ($check in $checks) { if ($verifyContent -match $check.Pattern) { Write-Host " ✅ $($check.Name)" -ForegroundColor Green } else { Write-Host " ❌ $($check.Name)" -ForegroundColor Red $allPassed = $false } } if ($allPassed) { Write-Host "" Write-Host "✅ All verification checks passed!" -ForegroundColor Green } else { Write-Host "" Write-Host "⚠️ Some verification checks failed" -ForegroundColor Yellow } } Write-Host "" Write-Host "================================" -ForegroundColor Cyan Write-Host "✅ Phase 3 patch applied successfully!" -ForegroundColor Green Write-Host "" Write-Host "Next steps:" -ForegroundColor Cyan Write-Host "1. Test the server: npm run start" Write-Host "2. Check performance: curl http://localhost:3000/__perf" Write-Host "3. Monitor cache hits in the logs" Write-Host "4. Verify Meilisearch indexing in background" Write-Host ""