refactor: remove gateway fetch, use relays with short timeout

- Remove gateway HTTP fetch entirely
- Fetch directly from relays on cache miss with 3s timeout
- If relay fetch succeeds: cache and return article metadata
- If relay fetch fails/times out: return default OG and trigger background refresh
- Update logging to reflect relay-first strategy
- Keep background refresh endpoint for eventual consistency

This simplifies the code and removes dependency on unreliable gateway,
while ensuring fast responses and eventual correctness via background refresh.
This commit is contained in:
Gigi
2025-11-07 19:15:17 +01:00
parent c2552d2e34
commit 66db9cd23f

View File

@@ -1,6 +1,6 @@
import type { VercelRequest, VercelResponse } from '@vercel/node' import type { VercelRequest, VercelResponse } from '@vercel/node'
import { getArticleMeta, setArticleMeta } from './services/ogStore.js' import { getArticleMeta, setArticleMeta } from './services/ogStore.js'
import { fetchArticleMetadataViaGateway } from './services/articleMeta.js' import { fetchArticleMetadataViaRelays } from './services/articleMeta.js'
import { generateHtml } from './services/ogHtml.js' import { generateHtml } from './services/ogHtml.js'
function setCacheHeaders(res: VercelResponse, maxAge: number = 86400): void { function setCacheHeaders(res: VercelResponse, maxAge: number = 86400): void {
@@ -28,20 +28,32 @@ export default async function handler(req: VercelRequest, res: VercelResponse) {
let cacheMaxAge = 86400 let cacheMaxAge = 86400
if (!meta) { if (!meta) {
// Cache miss: try gateway (fast HTTP, no WebSockets) // Cache miss: try relays with short timeout
console.log(`Cache miss for ${naddr}, trying gateway...`) console.log(`Cache miss for ${naddr}, fetching from relays...`)
meta = await fetchArticleMetadataViaGateway(naddr)
try {
// Fetch with 3 second timeout
const relayPromise = fetchArticleMetadataViaRelays(naddr)
const timeoutPromise = new Promise<null>((resolve) => {
setTimeout(() => resolve(null), 3000)
})
meta = await Promise.race([relayPromise, timeoutPromise])
if (meta) { if (meta) {
console.log(`Gateway found metadata for ${naddr}:`, { title: meta.title, summary: meta.summary?.substring(0, 50) }) console.log(`Relays found metadata for ${naddr}:`, { title: meta.title, summary: meta.summary?.substring(0, 50) })
// Gateway found metadata: store it and use it // Store in Redis and use it
await setArticleMeta(naddr, meta).catch((err) => { await setArticleMeta(naddr, meta).catch((err) => {
console.error('Failed to cache gateway metadata:', err) console.error('Failed to cache relay metadata:', err)
}) })
cacheMaxAge = 86400 cacheMaxAge = 86400
} else { } else {
console.log(`Gateway failed for ${naddr}, using default fallback`) console.log(`Relay fetch timeout/failed for ${naddr}, using default fallback`)
// Gateway failed: use default fallback // Relay fetch failed or timed out: use default fallback
cacheMaxAge = 300
}
} catch (err) {
console.error(`Error fetching from relays for ${naddr}:`, err)
cacheMaxAge = 300 cacheMaxAge = 300
} }
} else { } else {