async function copyS3Assets()

in source/custom-resource/index.ts [304:364]


async function copyS3Assets(requestProperties: CopyS3AssetsRequestProperties): Promise<{ Message: string; Manifest: { Files: string[] } }> {
  const { ManifestKey, SourceS3Bucket, SourceS3key, DestS3Bucket } = requestProperties;

  console.info(`Source bucket: ${SourceS3Bucket}`);
  console.info(`Source prefix: ${SourceS3key}`);
  console.info(`Destination bucket: ${DestS3Bucket}`);

  let manifest: { files: string[] };

  // Download manifest
  for (let retry = 1; retry <= RETRY_COUNT; retry++) {
    try {
      const getParams = {
        Bucket: SourceS3Bucket,
        Key: ManifestKey
      };
      const response = await s3Client.getObject(getParams).promise();
      manifest = JSON.parse(response.Body.toString());

      break;
    } catch (error) {
      if (retry === RETRY_COUNT || error.code !== ErrorCodes.ACCESS_DENIED) {
        console.error('Error occurred while getting manifest file.');
        console.error(error);

        throw new CustomResourceError('GetManifestFailure', 'Copy of website assets failed.');
      } else {
        console.info('Waiting for retry...');

        await sleep(getRetryTimeout(retry));
      }
    }
  }

  // Copy asset files
  try {
    await Promise.all(
      manifest.files.map(async (fileName: string) => {
        const copyObjectParams = {
          Bucket: DestS3Bucket,
          CopySource: `${SourceS3Bucket}/${SourceS3key}/${fileName}`,
          Key: fileName,
          ContentType: getContentType(fileName)
        };

        console.debug(`Copying ${fileName} to ${DestS3Bucket}`);
        return s3Client.copyObject(copyObjectParams).promise();
      })
    );

    return {
      Message: 'Copy assets completed.',
      Manifest: { Files: manifest.files }
    };
  } catch (error) {
    console.error('Error occurred while copying assets.');
    console.error(error);

    throw new CustomResourceError('CopyAssetsFailure', 'Copy of website assets failed.');
  }
}