async process()

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;
  }