All files / mgmt-lambda/handlers statusHandler.ts

80% Statements 24/30
50% Branches 2/4
100% Functions 3/3
80% Lines 24/30

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105    2x 2x           2x           2x         6x 6x         6x         6x                         6x 6x 6x 5x                     4x 4x                 6x 6x 6x   5x 2x 2x               2x                 2x                 4x 4x      
import { APIGatewayProxyResult } from 'aws-lambda'
import type { DeploymentSettings } from '../model/DeploymentSettings'
import { LambdaClient, GetFunctionCommand } from '@aws-sdk/client-lambda'
import { CloudFrontClient, GetDistributionCommand } from '@aws-sdk/client-cloudfront'
import type {
  IntegrationStatus,
  LambdaFunctionInformation,
  CloudFrontDistributionInformation,
} from '../model/IntegrationStatus'
import {
  doesCacheBehaviorUseOrigins,
  getCacheBehaviorLambdaFunctionAssociations,
  getFPCDNOrigins,
} from '../utils/cloudfrontUtils'
 
export async function handleStatus(
  lambdaClient: LambdaClient,
  cloudFrontClient: CloudFrontClient,
  settings: DeploymentSettings
): Promise<APIGatewayProxyResult> {
  const lambdaFunctionInformation = await getLambdaFunctionInformation(lambdaClient, settings.LambdaFunctionName)
  const cloudFrontDistributionInformation = await getCloudFrontDistributionInformation(
    cloudFrontClient,
    settings.CFDistributionId,
    settings.LambdaFunctionName
  )
  const result: IntegrationStatus = {
    lambdaFunction: lambdaFunctionInformation,
    cloudFrontDistribution: cloudFrontDistributionInformation,
  }
 
  return {
    statusCode: 200,
    body: JSON.stringify(result),
    headers: {
      'content-type': 'application/json',
    },
  }
}
 
async function getLambdaFunctionInformation(
  lambdaClient: LambdaClient,
  functionName: string
): Promise<LambdaFunctionInformation | undefined> {
  const command = new GetFunctionCommand({ FunctionName: functionName })
  try {
    const result = await lambdaClient.send(command)
    return {
      functionName: result.Configuration?.FunctionName,
      lastModified: result.Configuration?.LastModified,
      lastUpdateStatus: result.Configuration?.LastUpdateStatus,
      lastUpdateStatusReason: result.Configuration?.LastUpdateStatusReason,
      lastUpdateStatusCode: result.Configuration?.LastUpdateStatusReasonCode,
      runtime: result.Configuration?.Runtime,
      version: result.Configuration?.Version,
      handler: result.Configuration?.Handler,
    }
  } catch (error) {
    console.error('Unable to get lambda function information', error)
    return undefined
  }
}
 
async function getCloudFrontDistributionInformation(
  cloudFrontClient: CloudFrontClient,
  distributionId: string,
  functionName: string
): Promise<CloudFrontDistributionInformation | undefined> {
  const command = new GetDistributionCommand({ Id: distributionId })
  try {
    const result = await cloudFrontClient.send(command)
 
    const fpCDNOrigins = getFPCDNOrigins(result.Distribution?.DistributionConfig)
    let cacheBehaviorsWithFingerprintFunction = 0
    Iif (doesCacheBehaviorUseOrigins(result.Distribution?.DistributionConfig?.DefaultCacheBehavior, fpCDNOrigins)) {
      const lambdaAssocList = getCacheBehaviorLambdaFunctionAssociations(
        result.Distribution?.DistributionConfig?.DefaultCacheBehavior,
        functionName
      )
      cacheBehaviorsWithFingerprintFunction += lambdaAssocList.length
    }
 
    for (const cacheBehavior of result.Distribution?.DistributionConfig?.CacheBehaviors?.Items || []) {
      Iif (!doesCacheBehaviorUseOrigins(cacheBehavior, fpCDNOrigins)) {
        continue
      }
 
      const lambdaAssocList = getCacheBehaviorLambdaFunctionAssociations(cacheBehavior, functionName)
      cacheBehaviorsWithFingerprintFunction += lambdaAssocList.length
    }
 
    return {
      id: result.Distribution?.Id,
      enabled: result.Distribution?.DistributionConfig?.Enabled,
      status: result.Distribution?.Status,
      lastModifiedTime: result.Distribution?.LastModifiedTime,
      inProgressInvalidationBatches: result.Distribution?.InProgressInvalidationBatches,
      cacheBehaviorsWithFingerprintFunction: cacheBehaviorsWithFingerprintFunction,
    }
  } catch (error) {
    console.error('Unable to get CloudFront distribution information', error)
    return
  }
}