Skip to content

Commit 9e1e71d

Browse files
committed
add netacea unified handler example
1 parent a90c22a commit 9e1e71d

File tree

4 files changed

+121
-5
lines changed

4 files changed

+121
-5
lines changed

docs/netacea_unified_handler.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Netacea Unified Handler
2+
3+
This document contains instructions on how to deploy the Netacea CloudFront
4+
integration using a single lambda definition that handles three event types.
5+
6+
This is an alternative to using individual Viewer Request, Viewer Response,
7+
and Origin Response handlers.
8+
9+
Using the Unified handler is preferred when using Kinesis ingest,
10+
as Kinesis ingest can be performed in the background while other tasks
11+
are handled by the lambda.
12+
13+
## Deployment
14+
15+
The Unified Handler can be deployed in the same way as any of the three
16+
individual lambdas would be, as documented in the
17+
[Installation and Configuration](https://docs.netacea.com/netacea-plugin-information/cloudfront/installation-and-configuration)
18+
section.
19+
20+
However, the Handler should be specified as `NetaceaUnified.handler`
21+
(rather than, for example, ViewerRequest.handler).
22+
23+
Finally, these three triggers should specify the Unified Handler lambda:
24+
25+
- Viewer Request (Include body)
26+
- Viewer Response
27+
- Origin Response

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"xo": "^0.55.0"
3232
},
3333
"dependencies": {
34-
"@netacea/cloudfront": "^6.0.69"
34+
"@netacea/cloudfront": "^6.0.71"
3535
},
3636
"xo": {
3737
"space": true,

src/NetaceaUnified.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* This file provides an example of how to use a single lambda definition
3+
* to handle multiple event types in AWS CloudFront.
4+
* Please see docs/netacea_unified_handler.md for more information.
5+
*/
6+
import {
7+
type CloudFrontResponse,
8+
type CloudFrontResponseEvent,
9+
type Callback,
10+
type CloudFrontRequest,
11+
type CloudFrontRequestEvent,
12+
type CloudFrontResultResponse,
13+
type Context,
14+
type Handler
15+
} from 'aws-lambda'
16+
17+
import {
18+
Cloudfront as NetaceaCloudfront,
19+
type CloudfrontConstructorArgs
20+
} from '@netacea/cloudfront'
21+
22+
import * as NetaceaConfig from './NetaceaConfig.json'
23+
24+
type EventType = 'origin-request' | 'origin-response' | 'viewer-request' | 'viewer-response'
25+
26+
const worker = new NetaceaCloudfront(NetaceaConfig as CloudfrontConstructorArgs)
27+
28+
export const handler: Handler = async (
29+
event: CloudFrontRequestEvent,
30+
context: Context,
31+
callback: Callback<CloudFrontRequest | CloudFrontResultResponse>
32+
): Promise<void> => {
33+
context.callbackWaitsForEmptyEventLoop = false
34+
35+
const eventType = event.Records[0]?.cf.config.eventType?.toLowerCase() as EventType
36+
37+
if (eventType === 'viewer-request' || eventType === 'origin-request') {
38+
return await viewerRequestHandler(event, context, callback)
39+
}
40+
41+
if (eventType === 'origin-response') {
42+
return await originResponseHandler(event, context, callback)
43+
}
44+
45+
if (eventType === 'viewer-response') {
46+
return await viewerResponseHandler(event, context, callback)
47+
}
48+
}
49+
50+
export const viewerRequestHandler: Handler = async (
51+
event: CloudFrontRequestEvent,
52+
context: Context,
53+
callback: Callback<CloudFrontRequest | CloudFrontResultResponse>
54+
): Promise<void> => {
55+
const netaceaResponse = await worker.run(event)
56+
57+
if (netaceaResponse.respondWith !== undefined) {
58+
callback(null, netaceaResponse.respondWith)
59+
return
60+
}
61+
62+
callback(null, event.Records[0].cf.request)
63+
}
64+
65+
export const originResponseHandler: Handler = async (
66+
event: CloudFrontResponseEvent,
67+
context: Context,
68+
callback: Callback<CloudFrontResponse>
69+
): Promise<void> => {
70+
if (Number(event.Records[0].cf.response.status) >= 400) {
71+
worker.addNetaceaCookiesToResponse(event)
72+
void worker.ingest(event)
73+
}
74+
75+
callback(null, event.Records[0].cf.response)
76+
}
77+
78+
export const viewerResponseHandler: Handler = async (
79+
event: CloudFrontResponseEvent,
80+
context: Context,
81+
callback: Callback<CloudFrontResponse>
82+
): Promise<void> => {
83+
if (Number(event.Records[0].cf.response.status) < 400) {
84+
worker.addNetaceaCookiesToResponse(event)
85+
void worker.ingest(event)
86+
}
87+
88+
callback(null, event.Records[0].cf.response)
89+
}

0 commit comments

Comments
 (0)