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