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
|
const waitings = {} // Cache ongoing fetching, prevent redundant request
|
||||
|
|
||||
module.exports = Object.entries(liveFns).map(([name, fn]) => { |
module.exports = async function fetchLiveParams (scope, fn, paramsPath) { |
||||
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) { |
|
||||
const fetchKey = `#${scope} ${paramsPath}` |
const fetchKey = `#${scope} ${paramsPath}` |
||||
if (waitings[fetchKey]) return waitings[fetchKey] |
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