← back to Dw Fleet Registry
viewer: harden rescrape single-flight against client disconnect
14428b6dbe534fb2ceffcfb492d90c7bdccd1cc2 · 2026-06-01 15:07:47 -0700 · SteveStudio2
reply-once helper resets the flag + guards send() on a destroyed socket, plus a
5-min safety timeout — a short client timeout can no longer wedge the button or
crash the server (was hitting EADDRINUSE + stuck 409).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
M dw-fleet-registry.jsonM viewer/server.mjs
Diff
commit 14428b6dbe534fb2ceffcfb492d90c7bdccd1cc2
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date: Mon Jun 1 15:07:47 2026 -0700
viewer: harden rescrape single-flight against client disconnect
reply-once helper resets the flag + guards send() on a destroyed socket, plus a
5-min safety timeout — a short client timeout can no longer wedge the button or
crash the server (was hitting EADDRINUSE + stuck 409).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
dw-fleet-registry.json | 236 ++++++++++++++++++++++++-------------------------
viewer/server.mjs | 15 +++-
2 files changed, 130 insertions(+), 121 deletions(-)
diff --git a/dw-fleet-registry.json b/dw-fleet-registry.json
index f31fb4a..4b1dec3 100644
--- a/dw-fleet-registry.json
+++ b/dw-fleet-registry.json
@@ -86,7 +86,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T35177.jpg?v=1762233205&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -135,7 +135,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-living_room-t34036.jpg?v=1775149508",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -178,7 +178,7 @@
},
"heroImage": "https://1890swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -221,7 +221,7 @@
},
"heroImage": "https://1900swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -264,7 +264,7 @@
},
"heroImage": "https://1920swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -307,7 +307,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DUR-72376-sample-clean.jpg?v=1774485266&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -350,7 +350,7 @@
},
"heroImage": "https://1940swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -393,7 +393,7 @@
},
"heroImage": "https://1950swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -436,7 +436,7 @@
},
"heroImage": "https://1960swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -479,7 +479,7 @@
},
"heroImage": "https://1970swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -522,7 +522,7 @@
},
"heroImage": "https://1980swallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -565,7 +565,7 @@
},
"heroImage": "https://agedwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -608,7 +608,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-living_room-dwtt-81007-designer-wallcoverings-los-angeles.jpg?v=1775070978&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -651,7 +651,7 @@
},
"heroImage": "https://architecturalwallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -700,7 +700,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/selenite-celestine_05a0733d-bc9a-4b5a-8c9e-2bd7068d81af.jpg?v=1777481406",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -749,7 +749,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/0ba8dc45ab39d2f32b3f0bfa0817fa31.jpg?v=1572309972",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -798,7 +798,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/img_88aaf127-9911-47d7-b8a2-4ff0a20c8d61.jpg?v=1775512372",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -847,7 +847,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/xhw-201098-sample-hollywood-and-western-hollywood-wallcoverings.jpg?v=1775716918",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -896,7 +896,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/BW45141_2_7598bef2-55ce-4530-80c2-706adbab8a89.jpg?v=1776795816",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -938,7 +938,7 @@
"heroImage": "https://bestwallpaperplace.com/hero-bg.jpg",
"heroReason": "no-candidates",
"heroSource": "live",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "blankstocklining.com",
@@ -986,7 +986,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWBM-260148.jpg?v=1773968869",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1029,7 +1029,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/nina_crop_7513499041843.jpg?v=1775522668&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -1081,7 +1081,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/W0202_01_CAC.jpg?v=1777020004",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1133,7 +1133,7 @@
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511&width=1600",
"heroReason": "no-candidates",
"heroSource": "product",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "cfafabrics.com",
@@ -1181,7 +1181,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/6aaa92d98ce154f4eb6902902d268e40.png?v=1775520452",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1223,7 +1223,7 @@
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/a03989d448565ac6ac2c483ecbc877e5.jpg?v=1572309983&width=1600",
"heroReason": "no-candidates",
"heroSource": "product",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "classawallcovering.com",
@@ -1271,7 +1271,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Freya-Crystal-Ball-1024x914.jpg?v=1775010185",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1320,7 +1320,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/rpl-6327.jpg?v=1762305398",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1369,7 +1369,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/e1175daca55ee8fb67393d08420a4c9b.png?v=1775519649",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1412,7 +1412,7 @@
},
"heroImage": "https://contractwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1455,7 +1455,7 @@
},
"heroImage": "https://corkwallcovering.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1496,7 +1496,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1545,7 +1545,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DE509__silver.jpg?v=1775511844",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1586,7 +1586,7 @@
},
"heroImage": "https://www.designerwallcoverings.com/cdn/shop/files/HomeHero_959x640.jpg?v=1773170745",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1629,7 +1629,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/xhw-2010235-sample-hollywood-atelier-woven-hollywood-wallcoverings.jpg?v=1775716985&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -1678,7 +1678,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DD113031-0_e50eb14d-5ce6-431d-b5e6-6343a9ea4b16.jpg?v=1776284867",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1727,7 +1727,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-living_room-t70644.jpg?v=1775156038",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1770,7 +1770,7 @@
},
"heroImage": "https://fabricwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1819,7 +1819,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/fgb-110-sample-faux-glass-bead-wallpaper.jpg?v=1775711848",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1871,7 +1871,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/583-88_image1_5a69dd41-45e6-4809-845a-770e7aceb0db.jpg?v=1646104605",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1915,7 +1915,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/VV241_art_deco_fans_BLACKGOLD_install_913x_04f5f81c-8fff-4df7-85da-40c679e15e00.webp?v=1734414891",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -1957,7 +1957,7 @@
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/0d1ddcda0d8e4178b62081a96901af6d.jpg?v=1572309483&width=1600",
"heroReason": "all-candidates-dead",
"heroSource": "product",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "glitterwalls.com",
@@ -1999,7 +1999,7 @@
},
"heroImage": "https://glitterwalls.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2040,7 +2040,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/6a78d132a57e1ffc17eb644949e3c00a.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2089,7 +2089,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/gatehouse-oat_grass.jpg?v=1777480721",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2132,7 +2132,7 @@
},
"heroImage": "https://greenwallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2175,7 +2175,7 @@
},
"heroImage": "https://handcraftedwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2224,7 +2224,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Navarre_A202-357-Night_Sky.jpg?v=1773880204",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2267,7 +2267,7 @@
},
"heroImage": "https://healthcarewallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2319,7 +2319,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/xhw-2010424-sample-hollywood-contemporary-cobblestone-hollywood-wallcoverings.jpg?v=1775717225",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2365,7 +2365,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/batiste-lime.jpg?v=1777480094",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2407,7 +2407,7 @@
"heroImage": "https://hospitalitydesignreps.com/hero-bg.jpg",
"heroReason": "no-candidates",
"heroSource": "live",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "hospitalitysalesagency.com",
@@ -2455,7 +2455,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/xwa-52086-sample-canal-damask-durable-vinyl-hollywood-wallcoverings.jpg?v=1775707079",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2503,7 +2503,7 @@
},
"heroImage": "https://hospitalitywallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2549,7 +2549,7 @@
},
"heroImage": "https://hospitalitywallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2592,7 +2592,7 @@
},
"heroImage": "https://hotelwallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2635,7 +2635,7 @@
},
"heroImage": "https://jutewallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2678,7 +2678,7 @@
},
"heroImage": "https://linenwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2721,7 +2721,7 @@
},
"heroImage": "https://madagascarwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2770,7 +2770,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DUR-72006-sample-clean.jpg?v=1774483931",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2813,7 +2813,7 @@
},
"heroImage": "https://metallicwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2856,7 +2856,7 @@
},
"heroImage": "https://micawallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2905,7 +2905,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/prelude-opera_white.jpg?v=1777480571",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2948,7 +2948,7 @@
},
"heroImage": "https://museumwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -2991,7 +2991,7 @@
},
"heroImage": "https://mylarwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3032,7 +3032,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2022101_5_060796c6-a8c9-450d-a5b7-c0e35f41109a.jpg?v=1726530286",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3075,7 +3075,7 @@
},
"heroImage": "https://naturalwallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3124,7 +3124,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/dwx-58104-sample-gundelson-gunny-sack-vinyl-hollywood-wallcoverings.jpg?v=1775715287",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3167,7 +3167,7 @@
},
"heroImage": "https://pastelwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3216,7 +3216,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/xwq-52978-sample-flagler-embossed-durable-hollywood-wallcoverings.jpg?v=1775713351",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3257,7 +3257,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/2395_quadrat.jpg?v=1576118216",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3306,7 +3306,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/76b4c0554cd76e4ab7ff1fef509c6447.jpg?v=1572310445",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3355,7 +3355,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/20319258.jpg?v=1758052023",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3401,7 +3401,7 @@
},
"heroImage": "https://raffiawallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3447,7 +3447,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/9d29dc5f11982d34892d18f757d270b6.jpg?v=1750789732&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -3490,7 +3490,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/T83042_7e0638bb-5571-48c5-8142-55dbea6e5240.jpg?v=1733894340&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -3539,7 +3539,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Fairfax-Teal-Tropique-1024x914.jpg?v=1775009772",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3588,7 +3588,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/ScreenShot2022-07-22at10.16.45AM.png?v=1658510339",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3631,7 +3631,7 @@
},
"heroImage": "https://restaurantwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3674,7 +3674,7 @@
},
"heroImage": "https://restorationwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3723,7 +3723,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/MW170-01-fusuma-wallcovering-parchment_01.jpg?v=1776398815",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3766,7 +3766,7 @@
},
"heroImage": "https://saloonwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3809,7 +3809,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/3ae1761583a583821f1f595b3d85bd48.jpg?v=1572309599&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -3852,7 +3852,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/GPR-76642-sample-clean_159bebae-b7d0-4f9d-869e-0e4213655524.jpg?v=1774479040&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -3901,7 +3901,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/T41111_1f573b0e-8c44-48c9-9b04-6eb5cca542c0.jpg?v=1733893672",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3947,7 +3947,7 @@
},
"heroImage": "https://silkwallcoverings.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -3993,7 +3993,7 @@
},
"heroImage": "https://silkwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4036,7 +4036,7 @@
},
"heroImage": "https://silverleafwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4085,7 +4085,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/WolfGordonWallcovering_DWWG_ad9500.jpg?v=1733874163",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4134,7 +4134,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/fdn-5412.jpg?v=1762294570",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4177,7 +4177,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/harrison-solaire_4ddd8e59-7726-4952-8e48-b28f153ded6c.jpg?v=1777480977&width=1600",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "product"
},
{
@@ -4220,7 +4220,7 @@
},
"heroImage": "https://suedewallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4261,7 +4261,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/room-hotel_lobby-2022101-5-0.jpg?v=1775086481",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4304,7 +4304,7 @@
},
"heroImage": "https://textilewallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4353,7 +4353,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/amami-indigo.jpg?v=1761537957",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4394,7 +4394,7 @@
},
"heroImage": "https://thesetdecorator.com/img/tsd-logo.svg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4443,7 +4443,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/120_6023S_CS_e697010a-8303-47bd-8851-6e86dec2c192.jpg?v=1777020006",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4492,7 +4492,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/T89177.jpg?v=1762227888",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4535,7 +4535,7 @@
},
"heroImage": "https://vinylwallpaper.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4576,7 +4576,7 @@
},
"heroImage": "https://wallco.ai/designs/room/design_53872_living_room_hero.png",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4617,7 +4617,7 @@
},
"heroImage": "https://wallco.com/storage/app/resources/resize/img_5e421a5ba5bcde740862cd77b955f9e9_680_0_0_0_auto.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4666,7 +4666,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/nina_crop_7513507037235.jpg?v=1775523903",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4709,7 +4709,7 @@
},
"heroImage": "https://wallpapercanada.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4751,7 +4751,7 @@
"heroImage": "https://wallpapercontractor.com/hero-bg.jpg",
"heroReason": "no-candidates",
"heroSource": "live",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "wallpaperdefinitions.com",
@@ -4791,7 +4791,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/java_linen-cassia.jpg?v=1775856233",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4832,7 +4832,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/LesTapisseries_Floraison_97870_Roomshot_Web_LR-medium-two-thirds.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -4874,7 +4874,7 @@
"heroImage": "https://wallpaperdistributors.com/hero-bg.jpg",
"heroReason": "no-candidates",
"heroSource": "live",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "wallpaperestimator.com",
@@ -4915,7 +4915,7 @@
"heroImage": "https://wallpaperestimator.com/hero-bg.jpg",
"heroReason": "no-candidates",
"heroSource": "live",
- "heroAt": "2026-06-01T20:57:23Z"
+ "heroAt": "2026-06-01T22:07:27.000Z"
},
{
"domain": "wallpaperexports.com",
@@ -4963,7 +4963,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DWTA-65449.jpg?v=1776283654",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5012,7 +5012,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DUR-72196-sample-clean.jpg?v=1774484754",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5053,7 +5053,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/P2022110_821_20f7858e-4602-4187-b2d1-282da682d37a.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5094,7 +5094,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/db9a82d50e4f814d833e3c737140d880.jpg?v=1776041074",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5143,7 +5143,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DUR-72294-sample-clean.jpg?v=1774485076",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5192,7 +5192,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/DUR-72225-sample-clean.jpg?v=1774484809",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5233,7 +5233,7 @@
},
"heroImage": "https://wallpapersback.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5274,7 +5274,7 @@
},
"heroImage": "https://wallpaperwednesday.com/hero-bg.jpg",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5323,7 +5323,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/T3625.jpg?v=1733892666",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
},
{
@@ -5372,7 +5372,7 @@
},
"heroImage": "https://cdn.shopify.com/s/files/1/0015/4117/7456/products/09620171f63a6edf9af7fcb2057d1f67.jpg?v=1572309178",
"heroReason": "ok",
- "heroAt": "2026-06-01T20:57:23Z",
+ "heroAt": "2026-06-01T22:07:27.000Z",
"heroSource": "live"
}
],
diff --git a/viewer/server.mjs b/viewer/server.mjs
index c49a7aa..cb0f3d0 100644
--- a/viewer/server.mjs
+++ b/viewer/server.mjs
@@ -221,11 +221,20 @@ const server = http.createServer(async (req, res) => {
heroCache.clear();
const root = path.join(DIR, '..');
const stamp = new Date().toISOString();
- let out = '';
+ let out = '', done = false;
+ // Reply at most once, and never throw if the client already disconnected (a
+ // short client timeout must not wedge the single-flight flag or crash the server).
+ const reply = (code, obj) => {
+ if (done) return; done = true; rescrapeRunning = false;
+ if (res.writableEnded || res.destroyed) return;
+ try { send(res, code, 'application/json', JSON.stringify(obj)); } catch { /* socket gone */ }
+ };
const h = spawn('node', ['resolve-heroes.mjs'], { cwd: root, env: { ...process.env, HERO_STAMP: stamp } });
h.stderr.on('data', d => out += d); h.stdout.on('data', d => out += d);
- h.on('close', hc => { rescrapeRunning = false; send(res, 200, 'application/json', JSON.stringify({ ok: hc === 0, log: out.slice(-2000) })); });
- h.on('error', e => { rescrapeRunning = false; json(res, 500, { error: String(e && e.message || e) }); });
+ h.on('close', hc => reply(200, { ok: hc === 0, log: out.slice(-2000) }));
+ h.on('error', e => reply(500, { error: String(e && e.message || e) }));
+ // Safety net: even if the child never emits close/error, free the flag.
+ setTimeout(() => { if (!done) { done = true; rescrapeRunning = false; } }, 5 * 60 * 1000).unref();
return;
}
if (u.pathname === '/api/reprobe' && req.method === 'POST') {
← 4ab8683 viewer: add 'Rescrape heroes (all)' button → POST /api/rescr
·
back to Dw Fleet Registry
·
fleet viewer: make hero drop zone the whole card, not just t 2df70d0 →