fix: support for external icon. fix #570

pull/641/head
Amio 2023-08-01 22:47:31 +08:00
rodzic d4af5e0c7f
commit 12d201a1d7
2 zmienionych plików z 18 dodań i 3 usunięć

Wyświetl plik

@ -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<string | undefined> = 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 })
}

Wyświetl plik

@ -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)
}