mirror of
https://github.com/dergigi/boris.git
synced 2025-12-17 06:34:24 +01:00
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:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user