Skip to content

Commit ccbc84f

Browse files
committed
fix: don't need to use the callback with the new aws sdk
1 parent 104ed1c commit ccbc84f

4 files changed

Lines changed: 58 additions & 145 deletions

File tree

index.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,31 +9,29 @@ const sharp = require('sharp');
99
* Supports resizing, format conversion, and quality adjustments for images.
1010
*
1111
* @param {Object} event - Lambda event object containing CloudFront request/response
12-
* @param {Object} context - Lambda context object
13-
* @param {Function} callback - Lambda callback function
14-
* @returns {void}
12+
* @returns {Object} - CloudFront response object
1513
*/
16-
exports.handler = async (event, context, callback) => {
14+
exports.handler = async (event) => {
1715
try {
1816
const request = event.Records[0].cf.request;
1917
const response = event.Records[0].cf.response;
2018

2119
if ('200' !== response.status || !isCloudFrontRequestValid(request)) {
22-
return callback(null, response);
20+
return response;
2321
}
2422

2523
const bucketInfo = extractBucketInfo(request);
2624

2725
if (!bucketInfo) {
28-
return callback(null, response);
26+
return response;
2927
}
3028

3129
const allowedContentTypes = ['image/gif', 'image/jpeg', 'image/png'];
3230
const key = decodeURIComponent(request.uri.substring(1));
3331
const objectResponse = await fetchOriginalImageFromS3(bucketInfo, key);
3432

3533
if (!objectResponse.ContentType || !allowedContentTypes.includes(objectResponse.ContentType)) {
36-
return callback(null, response);
34+
return response;
3735
}
3836

3937
const objectBody = await streamToBuffer(objectResponse.Body);
@@ -45,7 +43,7 @@ exports.handler = async (event, context, callback) => {
4543
'image/gif' === objectResponse.ContentType &&
4644
(animated(objectBody) || preserveOriginalFormat)
4745
) {
48-
return callback(null, response);
46+
return response;
4947
}
5048

5149
let contentType = null;
@@ -63,7 +61,7 @@ exports.handler = async (event, context, callback) => {
6361
const responseBody = buffer.toString('base64');
6462

6563
if (isResponseTooLarge(responseBody)) {
66-
return callback(null, response);
64+
return response;
6765
}
6866

6967
if (contentType) {
@@ -73,9 +71,11 @@ exports.handler = async (event, context, callback) => {
7371
response.body = responseBody;
7472
response.bodyEncoding = 'base64';
7573

76-
callback(null, response);
74+
return response;
7775
} catch (error) {
7876
console.log(error);
77+
78+
return event.Records[0].cf.response;
7979
}
8080
};
8181

tests/image-processing-integration.test.js

Lines changed: 15 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,7 @@ describe('Image Processing Integration', () => {
103103
bucket: 'my-test-bucket',
104104
});
105105

106-
const callback = jest.fn();
107-
108-
await handler(event, {}, callback);
109-
110-
expect(callback).toHaveBeenCalledTimes(1);
111-
expect(callback).toHaveBeenCalledWith(null, expect.any(Object));
112-
113-
const response = callback.mock.calls[0][1];
106+
const response = await handler(event);
114107

115108
expect(response.status).toBe('200');
116109
expect(response.bodyEncoding).toBe('base64');
@@ -134,13 +127,7 @@ describe('Image Processing Integration', () => {
134127
bucket: 'my-test-bucket',
135128
});
136129

137-
const callback = jest.fn();
138-
await handler(event, {}, callback);
139-
140-
expect(callback).toHaveBeenCalledTimes(1);
141-
expect(callback).toHaveBeenCalledWith(null, expect.any(Object));
142-
143-
const response = callback.mock.calls[0][1];
130+
const response = await handler(event);
144131

145132
expect(response.status).toBe('200');
146133
expect(response.bodyEncoding).toBe('base64');
@@ -166,13 +153,7 @@ describe('Image Processing Integration', () => {
166153
bucket: 'my-test-bucket',
167154
});
168155

169-
const callback = jest.fn();
170-
await handler(event, {}, callback);
171-
172-
expect(callback).toHaveBeenCalledTimes(1);
173-
expect(callback).toHaveBeenCalledWith(null, expect.any(Object));
174-
175-
const response = callback.mock.calls[0][1];
156+
const response = await handler(event);
176157

177158
expect(response.status).toBe('200');
178159
expect(response.bodyEncoding).toBe('base64');
@@ -199,13 +180,7 @@ describe('Image Processing Integration', () => {
199180
bucket: 'my-test-bucket',
200181
});
201182

202-
const callback = jest.fn();
203-
await handler(event, {}, callback);
204-
205-
expect(callback).toHaveBeenCalledTimes(1);
206-
expect(callback).toHaveBeenCalledWith(null, expect.any(Object));
207-
208-
const response = callback.mock.calls[0][1];
183+
const response = await handler(event);
209184

210185
expect(response.status).toBe('200');
211186
expect(response.bodyEncoding).toBe('base64');
@@ -234,12 +209,7 @@ describe('Image Processing Integration', () => {
234209
bucket: 'my-test-bucket',
235210
});
236211

237-
const callback = jest.fn();
238-
await handler(event, {}, callback);
239-
240-
expect(callback).toHaveBeenCalledTimes(1);
241-
242-
const response = callback.mock.calls[0][1];
212+
const response = await handler(event);
243213

244214
expect(response.headers['content-type']).toEqual([
245215
{ key: 'Content-Type', value: 'image/webp' },
@@ -267,12 +237,7 @@ describe('Image Processing Integration', () => {
267237
bucket: 'my-test-bucket',
268238
});
269239

270-
const callback = jest.fn();
271-
await handler(event, {}, callback);
272-
273-
expect(callback).toHaveBeenCalledTimes(1);
274-
275-
const response = callback.mock.calls[0][1];
240+
const response = await handler(event);
276241

277242
expect(response.headers['content-type']).toEqual([
278243
{ key: 'Content-Type', value: 'image/webp' },
@@ -297,13 +262,10 @@ describe('Image Processing Integration', () => {
297262
});
298263
const originalResponse = event.Records[0].cf.response;
299264

300-
const callback = jest.fn();
301-
await handler(event, {}, callback);
302-
303-
expect(callback).toHaveBeenCalledTimes(1);
265+
const response = await handler(event);
304266

305-
expect(callback.mock.calls[0][1]).toBe(originalResponse);
306-
expect(callback.mock.calls[0][1].bodyEncoding).toBeUndefined();
267+
expect(response).toBe(originalResponse);
268+
expect(response.bodyEncoding).toBeUndefined();
307269

308270
expect(lastS3ClientConfiguration.region).toBe('us-west-2');
309271
expect(lastS3GetObjectCommandInput.Bucket).toBe('my-test-bucket');
@@ -318,13 +280,10 @@ describe('Image Processing Integration', () => {
318280
});
319281
const originalResponse = event.Records[0].cf.response;
320282

321-
const callback = jest.fn();
322-
await handler(event, {}, callback);
283+
const response = await handler(event);
323284

324-
expect(callback).toHaveBeenCalledTimes(1);
325-
326-
expect(callback.mock.calls[0][1]).toBe(originalResponse);
327-
expect(callback.mock.calls[0][1].bodyEncoding).toBeUndefined();
285+
expect(response).toBe(originalResponse);
286+
expect(response.bodyEncoding).toBeUndefined();
328287

329288
expect(lastS3ClientConfiguration.region).toBe('us-west-2');
330289
expect(lastS3GetObjectCommandInput.Bucket).toBe('my-test-bucket');
@@ -341,13 +300,7 @@ describe('Image Processing Integration', () => {
341300
bucket: 'my-test-bucket',
342301
});
343302

344-
const callback = jest.fn();
345-
await handler(event, {}, callback);
346-
347-
expect(callback).toHaveBeenCalledTimes(1);
348-
expect(callback).toHaveBeenCalledWith(null, expect.any(Object));
349-
350-
const response = callback.mock.calls[0][1];
303+
const response = await handler(event);
351304

352305
expect(response.status).toBe('200');
353306
expect(response.bodyEncoding).toBe('base64');
@@ -375,13 +328,7 @@ describe('Image Processing Integration', () => {
375328
bucket: 'my-test-bucket',
376329
});
377330

378-
const callback = jest.fn();
379-
await handler(event, {}, callback);
380-
381-
expect(callback).toHaveBeenCalledTimes(1);
382-
expect(callback).toHaveBeenCalledWith(null, expect.any(Object));
383-
384-
const response = callback.mock.calls[0][1];
331+
const response = await handler(event);
385332

386333
expect(response.status).toBe('200');
387334
expect(response.bodyEncoding).toBe('base64');
@@ -408,12 +355,7 @@ describe('Image Processing Integration', () => {
408355
bucket: 'my-test-bucket',
409356
});
410357

411-
const callback = jest.fn();
412-
await handler(event, {}, callback);
413-
414-
expect(callback).toHaveBeenCalledTimes(1);
415-
416-
const response = callback.mock.calls[0][1];
358+
const response = await handler(event);
417359

418360
expect(response.headers['content-type']).toEqual([
419361
{ key: 'Content-Type', value: 'image/webp' },

tests/image-processing.test.js

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,10 @@ describe('Image Processing Unit Tests', () => {
6969
uri: '/test-image.jpg',
7070
querystring: 'width=invalid&height=NaN',
7171
});
72-
const callback = jest.fn();
7372

74-
await handler(event, {}, callback);
73+
const response = await handler(event);
7574

76-
expect(callback).toHaveBeenCalledTimes(1);
75+
expect(response).toBeDefined();
7776
expect(sharp().resize).toHaveBeenCalledWith({
7877
width: null,
7978
height: null,
@@ -91,8 +90,7 @@ describe('Image Processing Unit Tests', () => {
9190
},
9291
});
9392

94-
const callback1 = jest.fn();
95-
await handler(highQualityEvent, {}, callback1);
93+
await handler(highQualityEvent);
9694
expect(sharp().webp).toHaveBeenCalledWith({ quality: 100 });
9795

9896
jest.clearAllMocks();
@@ -105,8 +103,7 @@ describe('Image Processing Unit Tests', () => {
105103
},
106104
});
107105

108-
const callback2 = jest.fn();
109-
await handler(lowQualityEvent, {}, callback2);
106+
await handler(lowQualityEvent);
110107
expect(sharp().webp).toHaveBeenCalledWith({ quality: 0 });
111108
});
112109

@@ -122,12 +119,10 @@ describe('Image Processing Unit Tests', () => {
122119

123120
const event = createCloudFrontEvent({ uri: '/animated.gif' });
124121
const originalResponse = event.Records[0].cf.response;
125-
const callback = jest.fn();
126122

127-
await handler(event, {}, callback);
123+
const response = await handler(event);
128124

129-
expect(callback).toHaveBeenCalledTimes(1);
130-
expect(callback).toHaveBeenCalledWith(null, originalResponse);
125+
expect(response).toBe(originalResponse);
131126
});
132127

133128
test('should skip processing for unsupported content types', async () => {
@@ -142,26 +137,24 @@ describe('Image Processing Unit Tests', () => {
142137

143138
const event = createCloudFrontEvent({ uri: '/document.pdf' });
144139
const originalResponse = event.Records[0].cf.response;
145-
const callback = jest.fn();
146140

147-
await handler(event, {}, callback);
141+
const response = await handler(event);
148142

149-
expect(callback).toHaveBeenCalledTimes(1);
150-
expect(callback).toHaveBeenCalledWith(null, originalResponse);
143+
expect(response).toBe(originalResponse);
151144
});
152145

153146
test('should handle S3 errors gracefully', async () => {
154147
mockS3Send.mockRejectedValueOnce(new Error('S3 Error'));
155148

156149
const event = createCloudFrontEvent({ uri: '/test-image.jpg' });
157-
const callback = jest.fn();
150+
const originalResponse = event.Records[0].cf.response;
158151

159152
const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation();
160153

161-
await handler(event, {}, callback);
154+
const response = await handler(event);
162155

163156
expect(consoleLogSpy).toHaveBeenCalled();
164-
expect(callback).not.toHaveBeenCalled();
157+
expect(response).toBe(originalResponse);
165158

166159
consoleLogSpy.mockRestore();
167160
});
@@ -173,24 +166,20 @@ describe('Image Processing Unit Tests', () => {
173166

174167
const event = createCloudFrontEvent({ uri: '/large-image.jpg' });
175168
const originalResponse = event.Records[0].cf.response;
176-
const callback = jest.fn();
177169

178-
await handler(event, {}, callback);
170+
const response = await handler(event);
179171

180-
expect(callback).toHaveBeenCalledTimes(1);
181-
expect(callback).toHaveBeenCalledWith(null, originalResponse);
172+
expect(response).toBe(originalResponse);
182173
});
183174

184175
test('should handle malformed S3 domain names', async () => {
185176
const event = createCloudFrontEvent();
186177
event.Records[0].cf.request.origin.s3.domainName = 'invalid-domain-format';
187178
const originalResponse = event.Records[0].cf.response;
188-
const callback = jest.fn();
189179

190-
await handler(event, {}, callback);
180+
const response = await handler(event);
191181

192-
expect(callback).toHaveBeenCalledTimes(1);
193-
expect(callback).toHaveBeenCalledWith(null, originalResponse);
182+
expect(response).toBe(originalResponse);
194183
});
195184

196185
test('should set correct content-type header for different transformations', async () => {
@@ -201,10 +190,9 @@ describe('Image Processing Unit Tests', () => {
201190
},
202191
});
203192

204-
const callback1 = jest.fn();
205-
await handler(webpEvent, {}, callback1);
193+
const response1 = await handler(webpEvent);
206194

207-
expect(callback1.mock.calls[0][1].headers['content-type']).toEqual([
195+
expect(response1.headers['content-type']).toEqual([
208196
{ key: 'Content-Type', value: 'image/webp' },
209197
]);
210198

@@ -220,11 +208,10 @@ describe('Image Processing Unit Tests', () => {
220208
});
221209

222210
const gifEvent = createCloudFrontEvent({ uri: '/image.gif' });
223-
const callback2 = jest.fn();
224211

225-
await handler(gifEvent, {}, callback2);
212+
const response2 = await handler(gifEvent);
226213

227-
expect(callback2.mock.calls[0][1].headers['content-type']).toEqual([
214+
expect(response2.headers['content-type']).toEqual([
228215
{ key: 'Content-Type', value: 'image/png' },
229216
]);
230217
});
@@ -240,11 +227,9 @@ describe('Image Processing Unit Tests', () => {
240227

241228
const event = createCloudFrontEvent({ uri: '/test-image.jpg' });
242229
const originalResponse = event.Records[0].cf.response;
243-
const callback = jest.fn();
244230

245-
await handler(event, {}, callback);
231+
const response = await handler(event);
246232

247-
expect(callback).toHaveBeenCalledTimes(1);
248-
expect(callback).toHaveBeenCalledWith(null, originalResponse);
233+
expect(response).toBe(originalResponse);
249234
});
250235
});

0 commit comments

Comments
 (0)