33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
|
// The app's own share image (Open Graph and Twitter card, spec §10.1): the app brand's name and logo in
|
|
// the brandbook's treatment, 1200x630. It is public, because a link preview is fetched without a session,
|
|
// and it carries nothing of any organization. The image only changes when the brand file does, so it is
|
|
// drawn once per process.
|
|
|
|
import { appBrand } from "@app/config"
|
|
import { renderShareImage, shareBrand } from "@app/modules/branding"
|
|
import { appIdentity, appOnlyReaders } from "../../../../src/server/brand-assets"
|
|
|
|
export const dynamic = "force-dynamic"
|
|
|
|
let drawn: Promise<Buffer<ArrayBuffer>> | undefined
|
|
|
|
export async function GET(): Promise<Response> {
|
|
try {
|
|
drawn ??= (async () => {
|
|
const share = await shareBrand({ app: appIdentity(), tenant: null, readers: appOnlyReaders() })
|
|
return Buffer.from(await renderShareImage(share, { title: appBrand.name }))
|
|
})()
|
|
return new Response(await drawn, {
|
|
headers: {
|
|
"content-type": "image/png",
|
|
"x-content-type-options": "nosniff",
|
|
"cache-control": "public, max-age=3600",
|
|
},
|
|
})
|
|
} catch {
|
|
drawn = undefined
|
|
return new Response(null, { status: 500 })
|
|
}
|
|
}
|