Skip to content

Commit

Permalink
feat: CACHE_CLIENT_REDIRECT will enable a fast-path response
Browse files Browse the repository at this point in the history
  • Loading branch information
esroyo committed Feb 22, 2024
1 parent 721a4d0 commit 1cbc475
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 7 deletions.
16 changes: 14 additions & 2 deletions src/sjs-request-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ import {
_internals,
cloneHeaders,
createFinalResponse,
createFastPathResponse,
denyHeaders,
isJsResponse,
isRedirect,
retrieveCache,
} from './utils.ts';
import { denoKv } from './services.ts';
Expand All @@ -17,6 +19,8 @@ export async function sjsRequestHandler(
performance.mark('total');
const BASE_PATH = Deno.env.get('BASE_PATH');
const CACHE = Deno.env.get('CACHE') === 'true';
const CACHE_CLIENT_REDIRECT =
Number(Deno.env.get('CACHE_CLIENT_REDIRECT') as string) || 0;
const UPSTREAM_ORIGIN = Deno.env.get('UPSTREAM_ORIGIN');
const HOMEPAGE = Deno.env.get('HOMEPAGE');
const OUTPUT_BANNER = Deno.env.get('OUTPUT_BANNER');
Expand All @@ -30,7 +34,7 @@ export async function sjsRequestHandler(
performance.measure('cache-read', 'cache-read');
if (value) {
performance.measure('cache-hit', { start: performance.now() });
return createFinalResponse(
const response = await createFinalResponse(
{
...value,
headers: new Headers(value.headers),
Expand All @@ -39,6 +43,10 @@ export async function sjsRequestHandler(
buildTarget,
false,
);
if (CACHE_CLIENT_REDIRECT && isRedirect(response.status)) {
return createFastPathResponse(response, performance, buildTarget);
}
return response;
}
performance.measure('cache-miss', { start: performance.now() });
}
Expand Down Expand Up @@ -94,7 +102,7 @@ export async function sjsRequestHandler(
body = replaceOrigin(await toSystemjs(body, { banner: OUTPUT_BANNER }));
performance.measure('build', 'build');
}
return createFinalResponse(
const response = await createFinalResponse(
{
url: req.url,
body,
Expand All @@ -110,4 +118,8 @@ export async function sjsRequestHandler(
buildTarget,
CACHE,
);
if (CACHE && CACHE_CLIENT_REDIRECT && isRedirect(response.status)) {
return createFastPathResponse(response, performance, buildTarget);
}
return response;
}
55 changes: 50 additions & 5 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ export const createFinalResponse = async (
performance: Performance,
buildTarget: string,
shouldCache: boolean,
isFastPathRedirect?: boolean,
): Promise<Response> => {
const CACHE_CLIENT_REDIRECT =
Number(Deno.env.get('CACHE_CLIENT_REDIRECT') as string) || 0;
Expand All @@ -167,17 +168,18 @@ export const createFinalResponse = async (
await saveCache(denoKv, [url, buildTarget], responseProps);
performance.measure('cache-write', 'cache-write');
}

if (
CACHE_CLIENT_REDIRECT && isActualRedirect &&
!headers.has('cache-control')
) {
const shouldSetCacheClientRedirect = CACHE_CLIENT_REDIRECT
&& isFastPathRedirect;
if (shouldSetCacheClientRedirect) {
headers.set(
'cache-control',
`public, max-age=${CACHE_CLIENT_REDIRECT}`,
);
}

if (isFastPathRedirect) {
performance.clearMeasures('total');
}
performance.measure('total', 'total');
headers.set('server-timing', buildDebugPerformance(performance));

Expand All @@ -190,6 +192,49 @@ export const createFinalResponse = async (
return response;
};

export const createFastPathResponse = async (
response: Response,
performance: Performance,
buildTarget: string,
): Promise<Response> => {
const redirectLocation = response.headers.get('location');
if (!redirectLocation) {
return response;
}
performance.mark('redirect-cache-read');
const value = await retrieveCache(denoKv, [
redirectLocation,
buildTarget,
]);
performance.measure('redirect-cache-read', 'redirect-cache-read');
if (value) {
performance.measure('redirect-cache-hit', { start: performance.now() });
return createFinalResponse(
{
...value,
headers: new Headers(value.headers),
},
performance,
buildTarget,
false,
true,
);
}
performance.measure('redirect-cache-miss', { start: performance.now() });

const rebuildedHeaders = cloneHeaders(response.headers);

performance.clearMeasures('total');
performance.measure('total', 'total');

rebuildedHeaders.set('server-timing', buildDebugPerformance(performance));
return new Response(response.body, {
headers: rebuildedHeaders,
status: response.status,
statusText: response.statusText,
});
};

export const _internals = {
fetch: nodeRequest,
};

0 comments on commit 1cbc475

Please sign in to comment.