Skip to content
This repository was archived by the owner on Jan 28, 2025. It is now read-only.

Commit 0ee1394

Browse files
authored
perf(core, lambda-at-edge): cold start improvements (#1044)
1 parent 2cb561a commit 0ee1394

File tree

8 files changed

+39
-35
lines changed

8 files changed

+39
-35
lines changed

packages/libs/core/src/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ export const handleDomainRedirects = (
4747
}
4848
};
4949

50-
export const handleLanguageRedirect = (
50+
export const handleLanguageRedirect = async (
5151
req: Request,
5252
manifest: Manifest,
5353
routesManifest: RoutesManifest
54-
): RedirectRoute | undefined => {
55-
const languageRedirectUri = getLanguageRedirectPath(
54+
): Promise<RedirectRoute | undefined> => {
55+
const languageRedirectUri = await getLanguageRedirectPath(
5656
req,
5757
manifest,
5858
routesManifest
@@ -118,11 +118,11 @@ const normalise = (uri: string, routesManifest: RoutesManifest): string => {
118118
* - redirects
119119
* - public files
120120
*/
121-
export const routeDefault = (
121+
export const routeDefault = async (
122122
req: Request,
123123
manifest: Manifest,
124124
routesManifest: RoutesManifest
125-
): Route | undefined => {
125+
): Promise<Route | undefined> => {
126126
const auth = handleAuth(req, manifest);
127127
if (auth) {
128128
return auth;
@@ -148,7 +148,7 @@ export const routeDefault = (
148148
return (
149149
publicFile ||
150150
handleCustomRedirects(req, routesManifest) ||
151-
handleLanguageRedirect(req, manifest, routesManifest)
151+
(await handleLanguageRedirect(req, manifest, routesManifest))
152152
);
153153
};
154154

packages/libs/core/src/locale.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import Accept from "@hapi/accept";
21
import { Manifest, RoutesManifest } from "./types";
32

43
export function addDefaultLocaleToPath(
@@ -31,7 +30,7 @@ export function addDefaultLocaleToPath(
3130
return path;
3231
}
3332

34-
export const getAcceptLanguageLocale = (
33+
export const getAcceptLanguageLocale = async (
3534
acceptLanguage: string,
3635
manifest: Manifest,
3736
routesManifest: RoutesManifest
@@ -44,6 +43,7 @@ export const getAcceptLanguageLocale = (
4443

4544
// Accept.language(header, locales) prefers the locales order,
4645
// so we ask for all to find the order preferred by user.
46+
const Accept = await import("@hapi/accept");
4747
for (const language of Accept.languages(acceptLanguage)) {
4848
const locale = language.toLowerCase();
4949
if (locale === defaultLocale) {

packages/libs/core/src/redirect.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import * as http from "http";
1+
import { STATUS_CODES } from "http";
22
import { addDefaultLocaleToPath, getAcceptLanguageLocale } from "./locale";
33
import { compileDestination, matchPath } from "./match";
44
import { Manifest, Request, RedirectRoute, RoutesManifest } from "./types";
@@ -25,7 +25,7 @@ export function createRedirectResponse(
2525
}
2626

2727
const status = statusCode;
28-
const statusDescription = http.STATUS_CODES[status];
28+
const statusDescription = STATUS_CODES[status];
2929

3030
const refresh =
3131
statusCode === 308
@@ -80,19 +80,23 @@ export function getDomainRedirectPath(
8080
* @param routesManifest
8181
* @param manifest
8282
*/
83-
export function getLanguageRedirectPath(
83+
export async function getLanguageRedirectPath(
8484
req: Request,
8585
manifest: Manifest,
8686
routesManifest: RoutesManifest
87-
): string | undefined {
87+
): Promise<string | undefined> {
8888
const languageHeader = req.headers["accept-language"];
8989
const acceptLanguage = languageHeader && languageHeader[0]?.value;
9090
const basePath = routesManifest.basePath;
9191
const trailingSlash = manifest.trailingSlash;
9292
const rootUri = basePath ? `${basePath}${trailingSlash ? "/" : ""}` : "/";
9393

9494
if (req.uri === rootUri || acceptLanguage) {
95-
return getAcceptLanguageLocale(acceptLanguage, manifest, routesManifest);
95+
return await getAcceptLanguageLocale(
96+
acceptLanguage,
97+
manifest,
98+
routesManifest
99+
);
96100
}
97101
}
98102

packages/libs/core/tests/locale.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ describe("Locale Utils Tests", () => {
5454
${"fr;q=0.7, nl;q=0.9"} | ${"/nl/"}
5555
`(
5656
"returns $expectedPath for $acceptLang",
57-
({ acceptLang, expectedPath }) => {
58-
const newPath = getAcceptLanguageLocale(
57+
async ({ acceptLang, expectedPath }) => {
58+
const newPath = await getAcceptLanguageLocale(
5959
acceptLang,
6060
manifest,
6161
routesManifest
@@ -69,8 +69,8 @@ describe("Locale Utils Tests", () => {
6969
acceptLang
7070
${"en"}
7171
${"nl;q=0.7, en;q=0.9"}
72-
`("returns nothing for $acceptLang", ({ acceptLang }) => {
73-
const newPath = getAcceptLanguageLocale(
72+
`("returns nothing for $acceptLang", async ({ acceptLang }) => {
73+
const newPath = await getAcceptLanguageLocale(
7474
acceptLang,
7575
manifest,
7676
routesManifest

packages/libs/core/tsconfig.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
"resolveJsonModule": true,
44
"esModuleInterop": true,
55
"declaration": true,
6-
"target": "ES2015",
7-
"module": "CommonJS",
6+
"target": "ES2019",
7+
"module": "ES2020",
88
"moduleResolution": "node",
99
"noImplicitAny": true,
1010
"outDir": "dist",

packages/libs/lambda-at-edge/src/default-handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ const handleOriginRequest = async ({
303303
}) => {
304304
const request = event.Records[0].cf.request;
305305

306-
const route = routeDefault(request, manifest, routesManifest);
306+
const route = await routeDefault(request, manifest, routesManifest);
307307
if (route) {
308308
if (route.isPublicFile) {
309309
const { file } = route as PublicFileRoute;
@@ -406,7 +406,7 @@ const handleOriginRequest = async ({
406406
const normalisedS3DomainName = normaliseS3OriginDomain(s3Origin);
407407
const hasFallback = hasFallbackForUri(uri, manifest, routesManifest);
408408
const { now, log } = perfLogger(manifest.logLambdaExecutionTimes);
409-
const isPreviewRequest = isValidPreviewRequest(
409+
const isPreviewRequest = await isValidPreviewRequest(
410410
request.headers.cookie,
411411
prerenderManifest.preview.previewModeSigningKey
412412
);

packages/libs/lambda-at-edge/src/lib/isValidPreviewRequest.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import cookie from "cookie";
2-
import jsonwebtoken from "jsonwebtoken";
1+
import { parse } from "cookie";
32

43
const NEXT_PREVIEW_DATA_COOKIE = "__next_preview_data";
54
const NEXT_PRERENDER_BYPASS_COOKIE = "__prerender_bypass";
@@ -20,14 +19,15 @@ export type Cookies = {
2019
* @param cookies - Cookies header with cookies in RFC 6265 compliant format
2120
* @param previewModeSigningKey - Next build key generated in the preRenderManifest
2221
*/
23-
export const isValidPreviewRequest = (
22+
export const isValidPreviewRequest = async (
2423
cookies: Cookies,
2524
previewModeSigningKey: string
26-
): boolean => {
25+
): Promise<boolean> => {
2726
const previewCookies = getPreviewCookies(cookies);
2827

2928
if (hasPreviewCookies(previewCookies)) {
3029
try {
30+
const jsonwebtoken = await import("jsonwebtoken");
3131
jsonwebtoken.verify(
3232
previewCookies[NEXT_PREVIEW_DATA_COOKIE],
3333
previewModeSigningKey
@@ -48,7 +48,7 @@ const getPreviewCookies = (cookies: Cookies): DefaultPreviewCookies => {
4848
const targetCookie = cookies || [];
4949

5050
return targetCookie.reduce((previewCookies, cookieObj) => {
51-
const parsedCookie = cookie.parse(cookieObj.value);
51+
const parsedCookie = parse(cookieObj.value);
5252

5353
if (hasPreviewCookies(parsedCookie)) {
5454
return parsedCookie as DefaultPreviewCookies;

packages/libs/lambda-at-edge/tests/lib/isValidPreviewRequest.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ describe("isValidPreviewRequest", () => {
1717
}
1818
];
1919

20-
expect(isValidPreviewRequest(cookies, previewModeSigningKey)).toEqual(
21-
false
22-
);
20+
expect(
21+
isValidPreviewRequest(cookies, previewModeSigningKey)
22+
).resolves.toEqual(false);
2323
});
2424

2525
it("is falsey for invalid preview cookies", () => {
@@ -31,9 +31,9 @@ describe("isValidPreviewRequest", () => {
3131
}
3232
];
3333

34-
expect(isValidPreviewRequest(cookies, previewModeSigningKey)).toEqual(
35-
false
36-
);
34+
expect(
35+
isValidPreviewRequest(cookies, previewModeSigningKey)
36+
).resolves.toEqual(false);
3737
});
3838
});
3939

@@ -48,9 +48,9 @@ describe("isValidPreviewRequest", () => {
4848
}
4949
];
5050

51-
expect(isValidPreviewRequest(cookies, previewModeSigningKey)).toEqual(
52-
true
53-
);
51+
expect(
52+
isValidPreviewRequest(cookies, previewModeSigningKey)
53+
).resolves.toEqual(true);
5454
});
5555
});
5656
});

0 commit comments

Comments
 (0)