in source/image-handler/index.ts [26:98]
export async function handler(event: ImageHandlerEvent): Promise<ImageHandlerExecutionResult> {
console.info('Received event:', JSON.stringify(event, null, 2));
const imageRequest = new ImageRequest(s3Client, secretProvider);
const imageHandler = new ImageHandler(s3Client, rekognitionClient);
const isAlb = event.requestContext && Object.prototype.hasOwnProperty.call(event.requestContext, 'elb');
try {
const imageRequestInfo = await imageRequest.setup(event);
console.info(imageRequestInfo);
const processedRequest = await imageHandler.process(imageRequestInfo);
let headers = getResponseHeaders(false, isAlb);
headers['Content-Type'] = imageRequestInfo.contentType;
// eslint-disable-next-line dot-notation
headers['Expires'] = imageRequestInfo.expires;
headers['Last-Modified'] = imageRequestInfo.lastModified;
headers['Cache-Control'] = imageRequestInfo.cacheControl;
// Apply the custom headers overwriting any that may need overwriting
if (imageRequestInfo.headers) {
headers = { ...headers, ...imageRequestInfo.headers };
}
return {
statusCode: StatusCodes.OK,
isBase64Encoded: true,
headers: headers,
body: processedRequest
};
} catch (error) {
console.error(error);
// Default fallback image
const { ENABLE_DEFAULT_FALLBACK_IMAGE, DEFAULT_FALLBACK_IMAGE_BUCKET, DEFAULT_FALLBACK_IMAGE_KEY } = process.env;
if (ENABLE_DEFAULT_FALLBACK_IMAGE === 'Yes' && !isNullOrWhiteSpace(DEFAULT_FALLBACK_IMAGE_BUCKET) && !isNullOrWhiteSpace(DEFAULT_FALLBACK_IMAGE_KEY)) {
try {
const defaultFallbackImage = await s3Client.getObject({ Bucket: DEFAULT_FALLBACK_IMAGE_BUCKET, Key: DEFAULT_FALLBACK_IMAGE_KEY }).promise();
const headers = getResponseHeaders(false, isAlb);
headers['Content-Type'] = defaultFallbackImage.ContentType;
headers['Last-Modified'] = defaultFallbackImage.LastModified;
headers['Cache-Control'] = 'max-age=31536000,public';
return {
statusCode: error.status ? error.status : StatusCodes.INTERNAL_SERVER_ERROR,
isBase64Encoded: true,
headers: headers,
body: defaultFallbackImage.Body.toString('base64')
};
} catch (error) {
console.error('Error occurred while getting the default fallback image.', error);
}
}
if (error.status) {
return {
statusCode: error.status,
isBase64Encoded: false,
headers: getResponseHeaders(true, isAlb),
body: JSON.stringify(error)
};
} else {
return {
statusCode: StatusCodes.INTERNAL_SERVER_ERROR,
isBase64Encoded: false,
headers: getResponseHeaders(true, isAlb),
body: JSON.stringify({ message: 'Internal error. Please contact the system administrator.', code: 'InternalError', status: StatusCodes.INTERNAL_SERVER_ERROR })
};
}
}
}