@@ -2,7 +2,6 @@ import { readFile } from 'node:fs/promises'
22import path from 'node:path'
33import { ImageResponse } from 'next/og'
44import { getPost , getPostSlugs } from '~/lib/utils/posts'
5- import { getBaseUrl } from '~/lib/utils'
65import { Rubric } from '~/ui/logos/rubric'
76
87export const runtime = 'nodejs'
@@ -15,7 +14,6 @@ export const size = {
1514
1615const fontDataPromise = readFile ( path . join ( process . cwd ( ) , 'src/app/fonts/matter-regular.woff' ) )
1716const bannerSrcCache = new Map < string , string > ( )
18- const ABSOLUTE_URL_PATTERN = / ^ h t t p s ? : \/ \/ / i
1917
2018export async function generateStaticParams ( ) {
2119 const slugs = await getPostSlugs ( )
@@ -97,72 +95,39 @@ export const Component = ({
9795// Builds a cached data URI for banner images; input '/images/primitives.png' -> output 'data:image/png;base64,...'.
9896const getBannerSrc = async ( bannerImageUrl : string ) => {
9997 const cached = bannerSrcCache . get ( bannerImageUrl )
100- if ( cached !== undefined ) return cached
98+ if ( cached ) return cached
10199
102100 const bannerPath = bannerImageUrl . replace ( / ^ \/ / , '' )
103101 const extension = path . extname ( bannerPath ) . toLowerCase ( )
104- const fallbackMimeType =
102+ const mimeType =
105103 extension === '.png'
106104 ? 'image/png'
107105 : extension === '.jpg' || extension === '.jpeg'
108106 ? 'image/jpeg'
109107 : extension === '.webp'
110108 ? 'image/webp'
111109 : 'image/png'
112-
113- try {
114- const bannerData = await readFile ( path . join ( process . cwd ( ) , 'public' , bannerPath ) , 'base64' )
115- const bannerSrc = `data:${ fallbackMimeType } ;base64,${ bannerData } `
116- bannerSrcCache . set ( bannerImageUrl , bannerSrc )
117- return bannerSrc
118- } catch {
119- // Local assets may not exist in every environment. Try HTTP as a fallback.
120- }
121-
122- const bannerUrl = ABSOLUTE_URL_PATTERN . test ( bannerImageUrl )
123- ? bannerImageUrl
124- : new URL ( bannerImageUrl , getBaseUrl ( ) ) . toString ( )
125-
126- try {
127- const response = await fetch ( bannerUrl , { next : { revalidate } } )
128- if ( ! response . ok ) throw new Error ( 'Failed to fetch banner image' )
129- const contentType = response . headers . get ( 'content-type' ) ?. split ( ';' ) [ 0 ] || fallbackMimeType
130- const bannerData = Buffer . from ( await response . arrayBuffer ( ) ) . toString ( 'base64' )
131- const bannerSrc = `data:${ contentType } ;base64,${ bannerData } `
132- bannerSrcCache . set ( bannerImageUrl , bannerSrc )
133- return bannerSrc
134- } catch {
135- // Keep image generation resilient even if banner lookup fails.
136- bannerSrcCache . set ( bannerImageUrl , '' )
137- return ''
138- }
110+ const bannerData = await readFile ( path . join ( process . cwd ( ) , 'public' , bannerPath ) , 'base64' )
111+ const bannerSrc = `data:${ mimeType } ;base64,${ bannerData } `
112+ bannerSrcCache . set ( bannerImageUrl , bannerSrc )
113+ return bannerSrc
139114}
140115
141- export default async function Response ( {
142- params
143- } : {
144- params : Promise < { slug : string } >
145- } ) {
116+ export default async function Response ( { params } : { params : Promise < { slug : string } > } ) {
146117 const { slug } = await params
147118
148- const [ { metadata } , localFont ] = await Promise . all ( [
149- getPost ( slug ) ,
150- fontDataPromise
151- ] )
119+ const [ { metadata } , localFont ] = await Promise . all ( [ getPost ( slug ) , fontDataPromise ] )
152120 const bannerSrc = await getBannerSrc ( metadata . bannerImageUrl )
153121
154- return new ImageResponse (
155- < Component title = { metadata . title } backgroundImageUrl = { bannerSrc } /> ,
156- {
157- ...size ,
158- fonts : [
159- {
160- data : localFont ,
161- name : 'Matter' ,
162- style : 'normal' ,
163- weight : 400
164- }
165- ]
166- }
167- )
122+ return new ImageResponse ( < Component title = { metadata . title } backgroundImageUrl = { bannerSrc } /> , {
123+ ...size ,
124+ fonts : [
125+ {
126+ data : localFont ,
127+ name : 'Matter' ,
128+ style : 'normal' ,
129+ weight : 400
130+ }
131+ ]
132+ } )
168133}
0 commit comments