Fix final-review findings for Playwright fallback
- server.js: catch browser-launch failures inside the injected fetchAndExtractPriceViaBrowser wrapper so they route through checkProduct's normal error classification (recordCheckFailure) instead of escaping as a thrown error that bypasses the DB write. - server.js: add an in-flight guard around runCheck so overlapping callers (cron + check-now) share one run instead of each launching its own Chromium. - Dockerfile: copy only package.json/package-lock.json/node_modules before installing Chromium so the expensive install layer is keyed to dependency changes, not every commit; copy the rest of the app afterward. - Dockerfile: clean up apt package lists after the Playwright install step, matching the build stage's existing cleanup. - README.md: note that exercising the fallback locally (not just running the test suite) needs `npx playwright install chromium`. - README.md: correct the fallback description — domcontentloaded navigation reads the page before most client-side JS finishes, so the fallback mainly helps with HTTP-client blocking, not JS-rendered prices; reworded to drop the inaccurate claim. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013gwc3aCiyQxmCWQke8RvEz
This commit is contained in:
@@ -37,7 +37,18 @@ function summarize(results) {
|
||||
return parts.length > 0 ? parts.join(' ') : 'geen producten';
|
||||
}
|
||||
|
||||
async function runCheck() {
|
||||
let inFlightCheck = null;
|
||||
function runCheck() {
|
||||
if (inFlightCheck) {
|
||||
return inFlightCheck;
|
||||
}
|
||||
inFlightCheck = runCheckOnce().finally(() => {
|
||||
inFlightCheck = null;
|
||||
});
|
||||
return inFlightCheck;
|
||||
}
|
||||
|
||||
async function runCheckOnce() {
|
||||
const products = listProducts(db);
|
||||
let browserPromise = null;
|
||||
function getBrowser() {
|
||||
@@ -50,8 +61,12 @@ async function runCheck() {
|
||||
const deps = {
|
||||
fetchAndExtractPrice,
|
||||
fetchAndExtractPriceViaBrowser: async (url) => {
|
||||
const browser = await getBrowser();
|
||||
return fetchAndExtractPriceViaBrowser(browser, url);
|
||||
try {
|
||||
const browser = await getBrowser();
|
||||
return await fetchAndExtractPriceViaBrowser(browser, url);
|
||||
} catch (err) {
|
||||
return { price: null, method: null, error: err };
|
||||
}
|
||||
},
|
||||
sendMail: (payload) => sendPriceChangeEmail(transport, {
|
||||
from: process.env.SMTP_FROM,
|
||||
|
||||
Reference in New Issue
Block a user