diff --git a/src/server/index.ts b/src/server/index.ts index 0bebeb2..28a596e 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -7,6 +7,8 @@ import { config } from './config.js'; import { initDatabase, startAutoSave, saveDatabase } from './db/connection.js'; import { runMigrations } from './db/migrate.js'; import { syncFromFiles } from './services/store-sync.js'; +import { warmupBrowser } from './scraper/browser-scraper.js'; +import { getEnabledStores } from './models/store.js'; import { storeRoutes } from './routes/stores.js'; import { categoryRoutes } from './routes/categories.js'; import { searchRoutes } from './routes/search.js'; @@ -63,6 +65,12 @@ if (sync.errors.length > 0) { startAutoSave(); +// Pre-launch Chromium if any store needs JS rendering +const hasJsStores = getEnabledStores().some((s) => s.render_js); +if (hasJsStores) { + warmupBrowser().catch((err) => app.log.warn(`Browser warmup failed: ${err}`)); +} + // Save database on shutdown process.on('SIGINT', () => { saveDatabase(); process.exit(0); }); process.on('SIGTERM', () => { saveDatabase(); process.exit(0); }); diff --git a/src/server/scraper/browser-scraper.ts b/src/server/scraper/browser-scraper.ts index c581eb0..9badc4a 100644 --- a/src/server/scraper/browser-scraper.ts +++ b/src/server/scraper/browser-scraper.ts @@ -116,6 +116,12 @@ export async function scrapeStoreWithBrowser(store: Store, searchUrl: string): P } } +export async function warmupBrowser(): Promise { + log('Warming up browser...'); + await getBrowser(); + log('Browser ready'); +} + export async function closeBrowser(): Promise { if (browser) { await browser.close();