Browse Source
Mainly two purposes: 1. Provide https://api.badgen.net 2. Serve this api behind Now CDN as a cache layerbadgesize
Amio /
6 years ago
committed by
GitHub
7 changed files with 78 additions and 28 deletions
@ -0,0 +1,6 @@ |
|||
# api.badgen.net |
|||
|
|||
## Examples |
|||
|
|||
- https://api.badgen.net/npm/v/micro |
|||
- https://api.badgen.net/npm/dependents/got |
@ -1,26 +1,6 @@ |
|||
const { get } = require('micro-fork') |
|||
const liveFns = require('./live-fns/_index.js') |
|||
const serveBadge = require('./serve-badge.js') |
|||
const waitings = {} // Cache ongoing fetching, prevent redundant request
|
|||
|
|||
module.exports = Object.entries(liveFns).map(([name, fn]) => { |
|||
return get(`/${name}/*`, async (req, res) => { |
|||
const style = req.headers.host === 'flat.badgen.net' ? 'flat' : undefined |
|||
const { |
|||
subject = name, |
|||
status = 'unknown', |
|||
color = 'grey', |
|||
failed = false |
|||
} = await fetchLiveParams(name, fn, req.params['*']) |
|||
|
|||
req.params = { subject, status, color, style } |
|||
serveBadge(req, res, { |
|||
maxAge: failed ? '0' : (Math.random() * 60 + 60).toFixed() |
|||
}) |
|||
}) |
|||
}) |
|||
|
|||
async function fetchLiveParams (scope, fn, paramsPath) { |
|||
module.exports = async function fetchLiveParams (scope, fn, paramsPath) { |
|||
const fetchKey = `#${scope} ${paramsPath}` |
|||
if (waitings[fetchKey]) return waitings[fetchKey] |
|||
|
@ -0,0 +1,27 @@ |
|||
const axios = require('./axios.js') |
|||
const { get } = require('micro-fork') |
|||
const liveFns = require('./live-fns/_index.js') |
|||
const serveBadge = require('./serve-badge.js') |
|||
const liveFetcher = require('./live-fetcher.js') |
|||
|
|||
const { API_HOST } = process.env |
|||
|
|||
module.exports = Object.entries(liveFns).map(([name, fn]) => { |
|||
return get(`/${name}/*`, async (req, res) => { |
|||
const { |
|||
subject = name, |
|||
status = 'unknown', |
|||
color = 'grey', |
|||
failed = false |
|||
} = await (API_HOST |
|||
? axios(API_HOST + req.url).then(res => res.data) |
|||
: liveFetcher(name, fn, req.params['*']) |
|||
) |
|||
|
|||
const style = req.headers.host === 'flat.badgen.net' ? 'flat' : undefined |
|||
req.params = { subject, status, color, style } |
|||
serveBadge(req, res, { |
|||
maxAge: failed ? '0' : (Math.random() * 60 + 60).toFixed() |
|||
}) |
|||
}) |
|||
}) |
@ -0,0 +1,26 @@ |
|||
const fs = require('fs') |
|||
const path = require('path') |
|||
const { send } = require('micro') |
|||
const { router, get } = require('micro-fork') |
|||
const liveFunctions = require('./live-fns/_index.js') |
|||
const liveFetcher = require('./live-fetcher.js') |
|||
|
|||
const CACHE_CONTROL = `public, max-age=60, stale-while-revalidate=86400, stale-if-error=86400` |
|||
const sMaxAges = { |
|||
'github': '240' |
|||
} |
|||
|
|||
const apiHandlers = Object.entries(liveFunctions).map(([name, fn]) => { |
|||
return get(`/${name}/*`, async (req, res) => { |
|||
res.setHeader('Cache-Control', `${CACHE_CONTROL}, s-maxage=${sMaxAges[name] || '120'}`) |
|||
send(res, 200, await liveFetcher(name, fn, req.params['*'])) |
|||
}) |
|||
}) |
|||
|
|||
const indexContent = fs.readFileSync(path.join(__dirname, 'index-api.md'), 'utf8') |
|||
const serveIndex = (req, res) => send(res, 200, indexContent) |
|||
|
|||
module.exports = router()( |
|||
get('/', serveIndex), |
|||
...apiHandlers |
|||
) |
Loading…
Reference in new issue