badgen.net/libs/setup-live-badge.js

52 wiersze
1.3 KiB
JavaScript
Czysty Zwykły widok Historia

2018-06-30 17:52:50 +00:00
const liveFns = require('./live-fns/index.js')
2018-07-03 15:02:42 +00:00
const { cache, listCache, clearCache } = require('./lru-cache-live.js')
2018-07-03 14:45:20 +00:00
2018-06-30 17:52:50 +00:00
module.exports = function (router) {
2018-07-03 15:23:28 +00:00
Object.entries(liveFns).forEach(([name, fn]) => {
router.get(`/${name}/*`, async (req, res, params) => {
2018-06-30 17:52:50 +00:00
const {
2018-07-03 15:23:28 +00:00
subject = name,
2018-06-30 17:52:50 +00:00
status = 'unknown',
color = 'grey'
2018-07-03 15:23:28 +00:00
} = await fetchLiveParams(name, fn, params['*'])
2018-06-30 17:52:50 +00:00
res.writeHead(302, {
2018-07-03 15:08:25 +00:00
Location: `/badge/${subject}/${status}/${color}`
2018-06-30 17:52:50 +00:00
})
res.end()
})
})
2018-07-03 14:45:20 +00:00
2018-07-03 15:02:42 +00:00
router.get('/list-cache-live', listCache)
router.get('/clear-cache-live', clearCache)
2018-07-03 14:45:20 +00:00
}
2018-07-03 15:23:28 +00:00
async function fetchLiveParams (scope, fn, paramsPath) {
2018-07-03 14:45:20 +00:00
const cached = cache.get(paramsPath)
if (cached) {
return cached
} else {
2018-07-03 15:23:28 +00:00
const cacheKey = `#${scope} ${paramsPath}`
console.time(cacheKey)
2018-07-03 14:45:20 +00:00
return timeout(fn(...paramsPath.split('/')), 30000)
.then(fetched => {
// Update cache if deleted (after got stale)
2018-07-03 15:23:28 +00:00
cache.has(paramsPath) || cache.set(cacheKey, fetched)
2018-07-03 14:45:20 +00:00
return fetched
}, e => {
console.error(e)
return {}
}).then(result => {
2018-07-03 15:23:28 +00:00
console.timeEnd(cacheKey)
2018-07-03 14:45:20 +00:00
return result
})
}
2018-06-30 17:52:50 +00:00
}
function timeout (promise, period) {
return Promise.race([
new Promise((resolve, reject) => setTimeout(reject, period)),
promise
])
}