Skip to content

Commit

Permalink
feat: improve performance
Browse files Browse the repository at this point in the history
this proxies the cart page, force updating all cart data every time, this allows the updating to be removed from the cart view endpoint. The cart page is where line item scripts run
  • Loading branch information
0x15f committed Jul 31, 2022
1 parent f6591e9 commit 2bc7327
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 14 deletions.
3 changes: 2 additions & 1 deletion src/router.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { Router, Method } from 'tiny-request-router'
import { addItem, clearCart, fetchCart, updateCart, updateItem } from './routes/cart'
import { addItem, clearCart, fetchCart, updateCart, updateItem, viewCart } from './routes/cart'
import { deleteCart } from './routes/webhooks'

export async function route(event: FetchEvent, request: Request): Promise<Response> {
const router = new Router()
const url = new URL(request.url)

router.get('/cart', viewCart)
router.get('/cart.js', fetchCart)
router.get('/cart/clear.js', clearCart)
router.post('/cart/add.js', addItem)
Expand Down
42 changes: 29 additions & 13 deletions src/routes/cart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ import { generateCart } from '../utils/cart'
const COOKIE_NAME = '__ctoken'
const MAX_AGE = 31_536_000 // one year

export async function fetchCart({ request, event }: RouteProps): Promise<Response> {
const host = new URL(request.url).hostname
export async function viewCart({ request, event }: RouteProps): Promise<Response> {
const cookie = parse(request.headers.get('Cookie') || '')
const cartToken = cookie[COOKIE_NAME] ?? uuid()

Expand All @@ -19,21 +18,38 @@ export async function fetchCart({ request, event }: RouteProps): Promise<Respons
'Set-Cookie': `${COOKIE_NAME}=${cartToken}; path=/; secure; HttpOnly; SameSite=Strict; Max-Age=${MAX_AGE}`,
})
if (cart.item_count > 0) {
const r = await fetch(`https://${host}/cart.js`, {
headers: buildHeaders(request),
})
const { cart: newCart, headers: addResponseHeaders } = await generateCart(request, cart, cartToken)
event.waitUntil(CART_STORE.put(cartToken, JSON.stringify(newCart)))
addResponseHeaders.getAll('Set-Cookie').forEach((c) => headers.append('Set-Cookie', c))
}
return fetch(request)
}

const json: Cart = await r.json()
if (json.item_count !== cart.item_count) {
const { cart: newCart, headers: addResponseHeaders } = await generateCart(request, cart, cartToken)
export async function fetchCart({ request /**, event*/ }: RouteProps): Promise<Response> {
// const host = new URL(request.url).hostname
const cookie = parse(request.headers.get('Cookie') || '')
const cartToken = cookie[COOKIE_NAME] ?? uuid()

event.waitUntil(CART_STORE.put(cartToken, JSON.stringify(newCart)))
const cart = await loadCart(cartToken)
const headers = new Headers({
'Set-Cookie': `${COOKIE_NAME}=${cartToken}; path=/; secure; HttpOnly; SameSite=Strict; Max-Age=${MAX_AGE}`,
})
// if (cart.item_count > 0) {
// const r = await fetch(`https://${host}/cart.js`, {
// headers: buildHeaders(request),
// })

addResponseHeaders.getAll('Set-Cookie').forEach((c) => headers.append('Set-Cookie', c))
}
}
// const json: Cart = await r.json()
// if (json.item_count !== cart.item_count) {
// const { cart: newCart, headers: addResponseHeaders } = await generateCart(request, cart, cartToken)

// event.waitUntil(CART_STORE.put(cartToken, JSON.stringify(newCart)))

// addResponseHeaders.getAll('Set-Cookie').forEach((c) => headers.append('Set-Cookie', c))
// }
// }

cart.items = cart.items.sort((a: CartItem, b: CartItem) => (a.key > b.key ? 1 : -1))
// cart.items = cart.items.sort((a: CartItem, b: CartItem) => (a.key > b.key ? 1 : -1))

return createResponse(cart, headers, 200)
}
Expand Down

0 comments on commit 2bc7327

Please sign in to comment.