export async function handler()

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