| | import type { ServerResponse } from 'http' |
| | import { CACHE_ONE_YEAR } from '../../lib/constants' |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export type Revalidate = number | false |
| |
|
| | export interface CacheControl { |
| | revalidate: Revalidate |
| | expire: number | undefined |
| | } |
| |
|
| | export interface CacheHeaders { |
| | 'Cache-Control': string |
| | cdnCacheControl?: string |
| | } |
| |
|
| | export function getCacheControlHeader({ |
| | revalidate, |
| | expire, |
| | }: CacheControl): CacheHeaders { |
| | const swrHeader = |
| | typeof revalidate === 'number' && |
| | expire !== undefined && |
| | revalidate < expire |
| | ? `, stale-while-revalidate=${expire - revalidate}` |
| | : '' |
| |
|
| | if (revalidate === 0) { |
| | return { |
| | 'Cache-Control': |
| | 'private, no-cache, no-store, max-age=0, must-revalidate', |
| | } |
| | } |
| |
|
| | |
| | |
| | const maxAge = typeof revalidate === 'number' ? revalidate : CACHE_ONE_YEAR |
| | const cdnCacheControl = `max-age=${maxAge}${swrHeader}` |
| | const cacheControl = `s-maxage=${maxAge}` |
| |
|
| | return { |
| | 'Cache-Control': cacheControl, |
| | cdnCacheControl: cdnCacheControl, |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | export const DEFAULT_CDN_CACHE_CONTROL_HEADER = 'CDN-Cache-Control' |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export function setResponseCacheControlHeaders( |
| | res: ServerResponse, |
| | cacheControl: CacheControl, |
| | cdnCacheControlHeader: string | undefined |
| | ): void { |
| | const cacheHeaders = getCacheControlHeader(cacheControl) |
| | const headerName = cdnCacheControlHeader ?? DEFAULT_CDN_CACHE_CONTROL_HEADER |
| | res.setHeader('Cache-Control', cacheHeaders['Cache-Control']) |
| | if (cacheHeaders.cdnCacheControl) { |
| | res.setHeader(headerName, cacheHeaders.cdnCacheControl) |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | export function setCacheControlHeaders( |
| | headers: Headers, |
| | cacheControl: CacheControl, |
| | cdnCacheControlHeader: string | undefined |
| | ): void { |
| | const cacheHeaders = getCacheControlHeader(cacheControl) |
| | const headerName = cdnCacheControlHeader ?? DEFAULT_CDN_CACHE_CONTROL_HEADER |
| | headers.set('Cache-Control', cacheHeaders['Cache-Control']) |
| | if (cacheHeaders.cdnCacheControl) { |
| | headers.set(headerName, cacheHeaders.cdnCacheControl) |
| | } |
| | } |
| |
|