in source/image-handler/image-handler.ts [20:68]
async process(imageRequestInfo: ImageRequestInfo): Promise<string> {
const { originalImage, edits } = imageRequestInfo;
let base64EncodedImage = '';
if (edits && Object.keys(edits).length) {
let image: sharp.Sharp = null;
if (edits.rotate !== undefined && edits.rotate === null) {
image = sharp(originalImage, { failOnError: false });
} else {
const metadata = await sharp(originalImage, { failOnError: false }).metadata();
image = metadata.orientation
? sharp(originalImage, { failOnError: false }).withMetadata({ orientation: metadata.orientation })
: sharp(originalImage, { failOnError: false }).withMetadata();
}
const modifiedImage = await this.applyEdits(image, edits);
if (imageRequestInfo.outputFormat !== undefined) {
if (imageRequestInfo.outputFormat === ImageFormatTypes.WEBP && typeof imageRequestInfo.reductionEffort !== 'undefined') {
modifiedImage.webp({ reductionEffort: imageRequestInfo.reductionEffort });
} else {
modifiedImage.toFormat(ImageHandler.convertImageFormatType(imageRequestInfo.outputFormat));
}
}
const imageBuffer = await modifiedImage.toBuffer();
base64EncodedImage = imageBuffer.toString('base64');
} else {
// change output format if specified
if (imageRequestInfo.outputFormat !== undefined) {
const modifiedImage = sharp(originalImage, { failOnError: false });
modifiedImage.toFormat(ImageHandler.convertImageFormatType(imageRequestInfo.outputFormat));
const imageBuffer = await modifiedImage.toBuffer();
base64EncodedImage = imageBuffer.toString('base64');
} else {
base64EncodedImage = originalImage.toString('base64');
}
}
// binary data need to be base64 encoded to pass to the API Gateway proxy https://docs.aws.amazon.com/apigateway/latest/developerguide/lambda-proxy-binary-media.html.
// checks whether base64 encoded image fits in 6M limit, see https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html.
if (base64EncodedImage.length > this.LAMBDA_PAYLOAD_LIMIT) {
throw new ImageHandlerError(StatusCodes.REQUEST_TOO_LONG, 'TooLargeImageException', 'The converted image is too large to return.');
}
return base64EncodedImage;
}