-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandler.ts
87 lines (74 loc) · 2 KB
/
handler.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
83
84
85
86
87
import AWS from 'aws-sdk'
import sharp, { Sharp } from 'sharp'
import { S3Handler } from 'aws-lambda'
const s3 = new AWS.S3()
type TransformDefinition = {
name: string
transform: (input: Sharp) => Promise<Buffer>
}
type HandlerDefinition = {
transforms: TransformDefinition[],
}
const createHandler = (handlerDef: HandlerDefinition) => {
const handler: S3Handler = async (event, contex) => {
for (let i=0; i<event.Records.length; i++) {
const rec = event.Records[i]
const inputImage = await s3.getObject({
Bucket: rec.s3.bucket.name,
Key: rec.s3.object.key,
}).promise()
const input = sharp(inputImage.Body)
await Promise.all(handlerDef.transforms.map(async ({ name, transform }) => {
const transformed = await transform(input.clone())
return s3.putObject({
Bucket: process.env.TRANSFORM_BUCKET!,
Key: `${rec.s3.object.key}-${name}`,
Body: transformed,
ContentType: 'image/jpeg',
StorageClass: 'INTELLIGENT_TIERING',
}).promise()
}))
}
}
return handler
}
export const handlePostImage = createHandler({
transforms: [
{
name: 'large',
transform: (input) => (input
.resize(1200, null, { withoutEnlargement: true })
.jpeg({ quality: 90 })
.toBuffer())
},
{
name: 'small',
transform: (input) => (input
.resize(400, null, { withoutEnlargement: true })
.jpeg({ quality: 90 })
.toBuffer())
},
]
})
export const handleInlinePostImage = createHandler({
transforms: [
{
name: 'default',
transform: (input) => (input
.resize(1000, 1000, { fit: 'inside', withoutEnlargement: true })
.jpeg({ quality: 90 })
.toBuffer())
},
]
})
export const handleAvatarImage = createHandler({
transforms: [
{
name: 'large',
transform: (input) => (input
.resize(150, 150, { fit: 'cover' })
.jpeg({ quality: 90 })
.toBuffer())
},
]
})