reduce io blocking ssr
This commit is contained in:
parent
3465eb7aba
commit
3c8ea0db22
|
@ -1,15 +1,7 @@
|
|||
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
|
||||
}
|
||||
}
|
||||
async function fetchPrice (fiat) {
|
||||
const url = `https://api.coinbase.com/v2/prices/BTC-${fiat}/spot`
|
||||
const price = await fetch(url)
|
||||
.then((res) => res.json())
|
||||
|
@ -22,6 +14,17 @@ async function getPrice (fiat) {
|
|||
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)
|
||||
}
|
||||
return await fetchPrice(fiat)
|
||||
}
|
||||
|
||||
export default {
|
||||
Query: {
|
||||
price: async (parent, { fiatCurrency }, ctx) => {
|
||||
|
|
|
@ -62,12 +62,15 @@ async function authMethods (user, args, { models, me }) {
|
|||
|
||||
export default {
|
||||
Query: {
|
||||
me: async (parent, args, { models, me }) => {
|
||||
me: async (parent, { skipUpdate }, { models, me }) => {
|
||||
if (!me) {
|
||||
return null
|
||||
}
|
||||
|
||||
return await models.user.update({ where: { id: me.id }, data: { lastSeenAt: new Date() } })
|
||||
if (!skipUpdate) {
|
||||
models.user.update({ where: { id: me.id }, data: { lastSeenAt: new Date() } }).catch(console.error)
|
||||
}
|
||||
return await models.user.findUnique({ where: { id: me.id } })
|
||||
},
|
||||
settings: async (parent, args, { models, me }) => {
|
||||
if (!me) {
|
||||
|
|
|
@ -44,7 +44,8 @@ export function getGetServerSideProps (query, variables = null, notFoundFunc, re
|
|||
const client = await getSSRApolloClient(req)
|
||||
|
||||
const { data: { me } } = await client.query({
|
||||
query: ME
|
||||
query: ME,
|
||||
variables: { skipUpdate: true }
|
||||
})
|
||||
|
||||
const { data: { price } } = await client.query({
|
||||
|
|
|
@ -2,7 +2,7 @@ import { gql } from 'apollo-server-micro'
|
|||
|
||||
export default gql`
|
||||
extend type Query {
|
||||
me: User
|
||||
me(skipUpdate: Boolean): User
|
||||
settings: User
|
||||
user(name: String!): User
|
||||
users: [User!]
|
||||
|
|
Loading…
Reference in New Issue