stacker.news/api/resolvers/price.js

33 lines
794 B
JavaScript
Raw Normal View History

const cache = new Map();
const expiresIn = 30000; // in milliseconds
async function getPrice(fiat) {
fiat ??= 'USD';
if (cache.has(fiat)) {
const { price, createdAt } = cache.get(fiat)
const expired = createdAt + expiresIn < Date.now()
if (!expired) {
return price;
}
}
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;
}
export default {
Query: {
price: async (parent, { fiatCurrency }, ctx) => {
const price = await getPrice(fiatCurrency);
return price;
},
},
};