fix: harden unfurl timeout + persist CI fetch cache

- Add hard 22s Promise.race deadline in prefetchUrl() to guard against
  TCP-level connection hangs that bypass unfurl.js's read-only timeout.
  Fixes builds hanging indefinitely on unresponsive hosts.

- Add actions/cache step to deploy.yml persisting .cache/ between runs.
  Prevents webmention (and all eleventy-fetch) data loss on transient
  502s: a populated cache means failures return existing data, not [].

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
svemagie
2026-03-19 22:28:40 +01:00
parent 3752e23eaf
commit f6f7cac403
2 changed files with 17 additions and 4 deletions

View File

@@ -32,6 +32,14 @@ jobs:
"sudo bastille cmd node cat /usr/local/indiekit/content/.indiekit/homepage.json" \ "sudo bastille cmd node cat /usr/local/indiekit/content/.indiekit/homepage.json" \
> content/.indiekit/homepage.json > content/.indiekit/homepage.json
- name: Cache Eleventy fetch cache
uses: actions/cache@v4
with:
path: .cache
key: eleventy-fetch-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
restore-keys: |
eleventy-fetch-${{ runner.os }}-
- name: Build CSS - name: Build CSS
run: npm run build:css run: npm run build:css

View File

@@ -132,10 +132,15 @@ export async function prefetchUrl(url) {
const metadata = await throttled(async () => { const metadata = await throttled(async () => {
try { try {
return await unfurl(url, { // Hard outer deadline guards against TCP-level hangs that bypass unfurl's
timeout: 20000, // own timeout (which only covers HTTP read, not connection establishment).
headers: { "User-Agent": USER_AGENT }, const deadline = new Promise((_, reject) =>
}); setTimeout(() => reject(new Error("hard deadline 22s")), 22000)
);
return await Promise.race([
unfurl(url, { timeout: 18000, headers: { "User-Agent": USER_AGENT } }),
deadline,
]);
} catch (err) { } catch (err) {
console.warn(`[unfurl] Failed to fetch ${url}: ${err.message}`); console.warn(`[unfurl] Failed to fetch ${url}: ${err.message}`);
return null; return null;