All files / src/utils processOpenClientResponse.ts

86.36% Statements 19/22
75% Branches 3/4
100% Functions 2/2
85.71% Lines 18/21

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                            4x 4x 4x         4x         4x 4x 1x     3x 3x   1x 1x   2x 6x 2x 4x 4x 4x   1x        
import { plugins } from './registerPlugin'
import { unsealData } from './unsealData'
import { cloneFastlyResponse } from './cloneFastlyResponse'
import { getDecryptionKey, IntegrationEnv } from '../env'
 
type FingerprintSealedIngressResponseBody = {
  sealedResult: string
}
 
export async function processOpenClientResponse(
  bodyBytes: ArrayBuffer,
  response: Response,
  env: IntegrationEnv
): Promise<void> {
  let responseBody: string | null = null
  try {
    responseBody = new TextDecoder('utf-8').decode(bodyBytes)
  } catch (e) {
    console.log(`Error occurred when decoding response to UTF-8: ${e}.`)
  }
 
  Iif (responseBody == null) {
    console.log('responseBody is null. Skipping plugins and returning the response.')
    return
  }
 
  const decryptionKey = getDecryptionKey(env)
  if (!decryptionKey) {
    throw new Error('Decryption key not found in secret store')
  }
  let parsedText: FingerprintSealedIngressResponseBody
  try {
    parsedText = JSON.parse(responseBody)
  } catch (e) {
    console.log(`Error parsing response body as JSON: ${e}`)
    return
  }
  const event = unsealData(parsedText.sealedResult, decryptionKey)
  const filteredPlugins = plugins.filter((t) => t.type === 'processOpenClientResponse')
  for (const filteredPlugin of filteredPlugins) {
    try {
      const clonedHttpResponse = cloneFastlyResponse(bodyBytes, response)
      await filteredPlugin.callback({ event, httpResponse: clonedHttpResponse })
    } catch (e: unknown) {
      console.error(`Plugin[${filteredPlugin.name}]`, e)
    }
  }
}