1 | import { canPrefetch, createPrefetchClient, createClient } from '@middy/util'
|
2 |
|
3 | import { S3Client, WriteGetObjectResponseCommand } from '@aws-sdk/client-s3'
|
4 |
|
5 | const defaults = {
|
6 | AwsClient: S3Client,
|
7 | awsClientOptions: {},
|
8 | awsClientAssumeRole: undefined,
|
9 | awsClientCapture: undefined,
|
10 | disablePrefetch: false
|
11 | }
|
12 |
|
13 | const s3ObjectResponseMiddleware = (opts = {}) => {
|
14 | const options = { ...defaults, ...opts }
|
15 |
|
16 | let client
|
17 | if (canPrefetch(options)) {
|
18 | client = createPrefetchClient(options)
|
19 | }
|
20 |
|
21 | const s3ObjectResponseMiddlewareBefore = async (request) => {
|
22 | const { inputS3Url } = request.event.getObjectContext
|
23 |
|
24 | request.context.s3ObjectFetch = fetch(inputS3Url)
|
25 | }
|
26 |
|
27 | const s3ObjectResponseMiddlewareAfter = async (request) => {
|
28 | if (!client) {
|
29 | client = await createClient(options, request)
|
30 | }
|
31 |
|
32 | request.response.RequestRoute = request.event.getObjectContext.outputRoute
|
33 | request.response.RequestToken = request.event.getObjectContext.outputToken
|
34 |
|
35 | if (request.response.body) {
|
36 | request.response.Body = request.response.body
|
37 | delete request.response.body
|
38 | }
|
39 |
|
40 | await client.send(
|
41 | new WriteGetObjectResponseCommand(request.internal.s3ObjectResponse)
|
42 | )
|
43 |
|
44 | return { statusCode: 200 }
|
45 | }
|
46 |
|
47 | return {
|
48 | before: s3ObjectResponseMiddlewareBefore,
|
49 | after: s3ObjectResponseMiddlewareAfter
|
50 | }
|
51 | }
|
52 |
|
53 | export default s3ObjectResponseMiddleware
|