/** * Patch: add a 2-minute deploy delay before ActivityPub syndication. * * When a post is created (via Micropub or Mastodon-API compose), the * blog's deploy pipeline (Gitea → Eleventy → rsync) takes ~1-2 minutes. * If ActivityPub fires immediately, followers receive a Create activity * whose `url` still 404s — Mastodon clients show a broken link. * * This patch inserts a `setTimeout`-based delay at the top of the * `syndicate()` function. The delay is configurable via the * AP_SYNDICATE_DELAY_MS environment variable (default: 120000 = 2 min). */ import { access, readFile, writeFile } from "node:fs/promises"; const candidates = [ "node_modules/@rmdes/indiekit-endpoint-activitypub/lib/syndicator.js", "node_modules/@indiekit/indiekit/node_modules/@rmdes/indiekit-endpoint-activitypub/lib/syndicator.js", ]; const MARKER = "// [patch] ap-syndicate-deploy-delay"; // The line right after the early-exit guards — insert before the // try { const actorUrl = ... } block. const INSERT_AFTER = ` try { const actorUrl = plugin._getActorUrl();`; const DELAY_BLOCK = ` // [patch] ap-syndicate-deploy-delay — wait for deploy pipeline before federating const _apDelay = Number.parseInt(process.env.AP_SYNDICATE_DELAY_MS ?? "120000", 10); if (_apDelay > 0) { console.info(\`[ActivityPub] Delaying syndication by \${_apDelay}ms for \${properties.url}\`); await new Promise((resolve) => setTimeout(resolve, _apDelay)); } ${MARKER} try { const actorUrl = plugin._getActorUrl();`; async function exists(p) { try { await access(p); return true; } catch { return false; } } let patched = false; for (const filePath of candidates) { if (!(await exists(filePath))) continue; let src = await readFile(filePath, "utf8"); if (src.includes(MARKER)) { console.log(`[postinstall] patch-ap-syndicate-deploy-delay: already applied in ${filePath}`); patched = true; break; } if (!src.includes(INSERT_AFTER)) { console.log(`[postinstall] patch-ap-syndicate-deploy-delay: insertion point not found in ${filePath}`); continue; } src = src.replace(INSERT_AFTER, DELAY_BLOCK); await writeFile(filePath, src, "utf8"); console.log(`[postinstall] patch-ap-syndicate-deploy-delay: applied in ${filePath}`); patched = true; break; } if (!patched) { console.log("[postinstall] patch-ap-syndicate-deploy-delay: no target file found"); }