Files
shields/lib/regular-update.js
Paul Melnikow 7a664ca3e8 Run prettier (#1866)
Merging this separately so the commit with the tooling change is readable. This is a follow-on to #1167 which turned prettier on.
2018-08-08 17:57:14 -04:00

65 lines
1.3 KiB
JavaScript

'use strict'
// Map from URL to { timestamp: last fetch time, data: data }.
let regularUpdateCache = Object.create(null)
// url: a string, scraper: a function that takes string data at that URL.
// interval: number in milliseconds.
// cb: a callback function that takes an error and data returned by the scraper.
function regularUpdate(
{
url,
intervalMillis,
json = true,
scraper = buffer => buffer,
options = {},
request = require('request'),
},
cb
) {
const timestamp = Date.now()
const cached = regularUpdateCache[url]
if (cached != null && timestamp - cached.timestamp < intervalMillis) {
cb(null, cached.data)
return
}
request(url, options, (err, res, buffer) => {
if (err != null) {
cb(err)
return
}
let reqData
if (json) {
try {
reqData = JSON.parse(buffer)
} catch (e) {
cb(e)
return
}
} else {
reqData = buffer
}
let data
try {
data = scraper(reqData)
} catch (e) {
cb(e)
return
}
regularUpdateCache[url] = { timestamp, data }
cb(null, data)
})
}
function clearRegularUpdateCache() {
regularUpdateCache = Object.create(null)
}
module.exports = {
regularUpdate,
clearRegularUpdateCache,
}