Browse Source

Support external icon (Resolve #277)

docker-size
Amio 5 years ago
parent
commit
a850fdaeac
  1. 27
      libs/badgen-serve.ts
  2. 12
      libs/fetch-icon.ts
  3. 2
      libs/serve-badge.ts

27
libs/badgen-serve.ts

@ -1,8 +1,9 @@
import url from 'url'
import matchRoute from 'my-way'
import serve404 from './serve-404'
import fetchIcon from './fetch-icon'
import serveBadge from './serve-badge'
import serve404 from './serve-404'
import sentry from './sentry'
import { BadgenParams } from './types'
@ -35,18 +36,34 @@ export function badgenServe (handlers: BadgenServeHandlers): Function {
})
const defaultLabel = pathname.split('/')[1]
const defaultParams = {
subject: defaultLabel,
status: 'unknown',
color: 'grey'
}
if (matchedScheme) {
try {
const params = await handlers[matchedScheme](matchedArgs) || {
subject: defaultLabel,
status: 'unknown',
color: 'grey'
const paramsPromise = handlers[matchedScheme](matchedArgs)
let iconPromise
if (typeof(query.icon) === 'string' && query.icon.startsWith('https://')) {
iconPromise = fetchIcon(query.icon)
}
const [
icon = query.icon,
params = defaultParams
] = await Promise.all([
iconPromise,
paramsPromise
])
params.subject = simpleDecode(params.subject)
params.status = simpleDecode(params.status)
query.icon = icon
if (query.style === undefined) {
const host = req.headers['x-forwarded-host'] || req.headers.host
if (host.startsWith('flat')) {

12
libs/fetch-icon.ts

@ -0,0 +1,12 @@
import got from 'got'
export default async function (iconUrl) {
return got(iconUrl).then(res => {
const type = res.headers['content-type']
if (!type!.startsWith('image')) { return }
const base64 = Buffer.from(res.body).toString('base64')
const encoded = `data:${type};base64,${base64}`
return encoded
}).catch(err => undefined)
}

2
libs/serve-badge.ts

@ -62,7 +62,7 @@ function resolveIcon (icon: string | undefined, width: string): ResolvedIcon {
}
}
if (String(icon).startsWith('https://')) {
if (String(icon).startsWith('data:image/')) {
return { src: icon, width }
}

Loading…
Cancel
Save