153 lines
5.1 KiB
PowerShell
153 lines
5.1 KiB
PowerShell
# 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 ""
|