37 lines
955 B
JavaScript
37 lines
955 B
JavaScript
const cache = new Map()
|
|
const expiresIn = 30000 // in milliseconds
|
|
|
|
async function fetchPrice (fiat) {
|
|
const url = `https://api.coinbase.com/v2/prices/BTC-${fiat}/spot`
|
|
const price = await fetch(url)
|
|
.then((res) => res.json())
|
|
.then((body) => parseFloat(body.data.amount))
|
|
.catch((err) => {
|
|
console.error(err)
|
|
return -1
|
|
})
|
|
cache.set(fiat, { price, createdAt: Date.now() })
|
|
return price
|
|
}
|
|
|
|
async function getPrice (fiat) {
|
|
fiat ??= 'USD'
|
|
if (cache.has(fiat)) {
|
|
const { price, createdAt } = cache.get(fiat)
|
|
const expired = createdAt + expiresIn < Date.now()
|
|
if (expired) fetchPrice(fiat).catch(console.error) // update cache
|
|
return price // serve stale price (this on the SSR critical path)
|
|
} else {
|
|
fetchPrice(fiat).catch(console.error)
|
|
}
|
|
return null
|
|
}
|
|
|
|
export default {
|
|
Query: {
|
|
price: async (parent, { fiatCurrency }, ctx) => {
|
|
return await getPrice(fiatCurrency)
|
|
}
|
|
}
|
|
}
|