[object Object]

← 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 →