diff --git a/libs/create-badgen-handler-next.ts b/libs/create-badgen-handler-next.ts index 6d6621d..9b18c4d 100644 --- a/libs/create-badgen-handler-next.ts +++ b/libs/create-badgen-handler-next.ts @@ -4,6 +4,7 @@ import matchRoute from 'my-way' import { serveBadgeNext } from './serve-badge-next' import serveDoc from './serve-doc-next' +import fetchIcon from './fetch-icon' import sentry from './sentry' import type { NextApiRequest, NextApiResponse } from 'next' @@ -19,7 +20,7 @@ export interface BadgenServeConfig { help?: string; examples: { [url: string]: string }; handlers: { [pattern: string]: BadgenHandler }; - } +} export function createBadgenHandler (badgenServerConfig: BadgenServeConfig) { const { handlers, title, help, examples } = badgenServerConfig @@ -35,6 +36,12 @@ export function createBadgenHandler (badgenServerConfig: BadgenServeConfig) { return serveDoc(badgenServerConfig)(req, res) } + // Fetch external icon early, before invoking badgen handler + let externalIconPromise: Promise = Promise.resolve(undefined) + if (req.query.icon?.toString().startsWith('https://')) { + externalIconPromise = fetchIcon(req.query.icon.toString()) + } + // Find matched badgen handler let matchedArgs: PathArgs | null = null const matchedScheme = Object.keys(handlers).find(scheme => { @@ -56,6 +63,14 @@ export function createBadgenHandler (badgenServerConfig: BadgenServeConfig) { return } + // Apply external icon if available + const externalIcon = await externalIconPromise + if (externalIcon) { + req.query.icon = externalIcon + } else if (req.query.icon === '') { + req.query.icon = badgenResponse.subject + } + serveBadgeNext(req, res, { params: badgenResponse }) } diff --git a/libs/fetch-icon.ts b/libs/fetch-icon.ts index 88e86de..0e4646e 100644 --- a/libs/fetch-icon.ts +++ b/libs/fetch-icon.ts @@ -1,6 +1,6 @@ import got from 'got' -export default async function (iconUrl) { +export default async function (iconUrl: string) { return got(iconUrl).then(res => { const type = res.headers['content-type'] if (!type!.startsWith('image')) { return } @@ -8,5 +8,5 @@ export default async function (iconUrl) { const base64 = Buffer.from(res.body).toString('base64') const encoded = `data:${type};base64,${base64}` return encoded - }).catch(err => undefined) + }).catch(() => undefined) }