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)
if (meta) { try {
console.log(`Gateway found metadata for ${naddr}:`, { title: meta.title, summary: meta.summary?.substring(0, 50) }) // Fetch with 3 second timeout
// Gateway found metadata: store it and use it const relayPromise = fetchArticleMetadataViaRelays(naddr)
await setArticleMeta(naddr, meta).catch((err) => { const timeoutPromise = new Promise<null>((resolve) => {
console.error('Failed to cache gateway metadata:', err) setTimeout(() => resolve(null), 3000)
}) })
cacheMaxAge = 86400
} else { meta = await Promise.race([relayPromise, timeoutPromise])
console.log(`Gateway failed for ${naddr}, using default fallback`)
// Gateway failed: use default fallback if (meta) {
console.log(`Relays found metadata for ${naddr}:`, { title: meta.title, summary: meta.summary?.substring(0, 50) })
// Store in Redis and use it
await setArticleMeta(naddr, meta).catch((err) => {
console.error('Failed to cache relay metadata:', err)
})
cacheMaxAge = 86400
} else {
console.log(`Relay fetch timeout/failed for ${naddr}, using 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 {