← back to All Designerwallcoverings
coverage hot-reload: re-read live-stock-coverage.json on mtime change (10-min check) so regenerated coverage flows without a pm2 restart
add8bb327b6c9b4c76ad86387ecfcffaa3f73475 · 2026-07-15 14:34:37 -0700 · Steve Abrams
Files touched
Diff
commit add8bb327b6c9b4c76ad86387ecfcffaa3f73475
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Wed Jul 15 14:34:37 2026 -0700
coverage hot-reload: re-read live-stock-coverage.json on mtime change (10-min check) so regenerated coverage flows without a pm2 restart
---
server.js | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/server.js b/server.js
index 35028ff..ba11d4c 100644
--- a/server.js
+++ b/server.js
@@ -158,6 +158,16 @@ function loadCoverage() {
console.log(`coverage: ${m.size} display-vendors (live-capable ${(d.counts && d.counts.live_capable) || 0})`);
} catch (e) { console.error('coverage load failed (non-fatal — live checks dim):', e.message); }
}
+// Hot-reload: build-coverage.js regenerates the file on a schedule (and after deploys) —
+// re-read on mtime change so new live_capable flags flow to /api/products without a restart.
+let COVERAGE_MTIME = 0;
+setInterval(() => {
+ fs.stat(COVERAGE_FILE, (err, st) => {
+ if (err) return;
+ if (COVERAGE_MTIME && st.mtimeMs !== COVERAGE_MTIME) loadCoverage();
+ COVERAGE_MTIME = st.mtimeMs;
+ });
+}, 10 * 60 * 1000).unref();
const coverageFor = (vendor) => COVERAGE.get(String(vendor || '').trim().toLowerCase()) || null;
const liveAdapter = (vendor) => { const e = coverageFor(vendor); return (e && e.live_capable && e.adapter) ? e.adapter : null; };
const LIVE_WORKER = path.join(__dirname, 'scripts', 'live-scrape.js');
← 750e7f4 Every SKU card gets a smart face button: live price check (t
·
back to All Designerwallcoverings
·
contrarian fixes: price-only live result gets neutral dot + c5afd0d →