This repository was archived by the owner on Jan 28, 2025. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 465
/
Copy pathdefault-handler-v2.ts
82 lines (75 loc) · 2.53 KB
/
default-handler-v2.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// @ts-ignore
import PrerenderManifest from "./prerender-manifest.json";
// @ts-ignore
import Manifest from "./manifest.json";
// @ts-ignore
import RoutesManifestJson from "./routes-manifest.json";
// @ts-ignore
import lambdaAtEdgeCompat from "@sls-next/next-aws-cloudfront";
import {
OriginRequestDefaultHandlerManifest,
OriginRequestEvent,
OriginResponseEvent
} from "./types";
import { CloudFrontResultResponse } from "aws-lambda";
import {
PreRenderedManifest as PrerenderManifestType,
RoutesManifest,
defaultHandler
} from "@sls-next/core";
import { removeBlacklistedHeaders } from "./headers/removeBlacklistedHeaders";
import { s3BucketNameFromEventRequest } from "./s3/s3BucketNameFromEventRequest";
import { AwsPlatformClient } from "@sls-next/aws-common";
/**
* V2 Lambda@Edge handler that wraps the platform-agnostic handler.
* @param event
*/
export const handler = async (
event: OriginRequestEvent | OriginResponseEvent
): Promise<CloudFrontResultResponse> => {
const manifest: OriginRequestDefaultHandlerManifest = Manifest;
const prerenderManifest: PrerenderManifestType = PrerenderManifest;
const routesManifest: RoutesManifest = RoutesManifestJson;
// Compatibility layer required to convert from Node.js req/res <-> CloudFront responses
const { req, res, responsePromise } = lambdaAtEdgeCompat(
event.Records[0].cf,
{
enableHTTPCompression: manifest.enableHTTPCompression
}
);
// Initialize AWS platform specific client
const request = event.Records[0].cf.request;
const bucketName = s3BucketNameFromEventRequest(request) ?? "";
const { region: bucketRegion } = request.origin?.s3 || {
region: "us-west-2" // default to us-west-2 though it should always be present
};
const regenerationQueueRegion = bucketRegion;
const regenerationQueueName =
manifest.regenerationQueueName ?? `${bucketName}.fifo`;
const awsPlatformClient = new AwsPlatformClient(
bucketName,
bucketRegion,
regenerationQueueName,
regenerationQueueRegion
);
// Handle request with platform-agnostic handler
await defaultHandler({
req,
res,
responsePromise,
manifest,
prerenderManifest,
routesManifest,
options: {
logExecutionTimes: manifest.logLambdaExecutionTimes ?? false
},
platformClient: awsPlatformClient
});
// Convert to CloudFront compatible response
const response = await responsePromise;
// Remove any blacklisted headers from CloudFront response
if (response.headers) {
removeBlacklistedHeaders(response.headers);
}
return response;
};