All files / src env.ts

100% Statements 38/38
100% Branches 18/18
100% Functions 12/12
100% Lines 38/38

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                    15x                       60x 422x         45x 359x       15x   15x 15x 15x     83x 83x     15x 15x 15x     88x 88x     15x 15x 15x     88x       173x     15x   215x 215x 5x   210x       210x       9x 9x 1x   8x       206x 206x 4x     202x 9x     9x     193x    
import { config } from './config'
 
export type WorkerEnv = {
  AGENT_SCRIPT_DOWNLOAD_PATH: string | null
  GET_RESULT_PATH: string | null
  PROXY_SECRET: string | null
  FPJS_INGRESS_BASE_HOST: string | null
  INTEGRATION_PATH_DEPTH: number | string | null
}
 
export const Defaults = {
  AGENT_SCRIPT_DOWNLOAD_PATH: null,
  GET_RESULT_PATH: null,
  PROXY_SECRET: null,
  FPJS_INGRESS_BASE_HOST: config.ingressApi,
  INTEGRATION_PATH_DEPTH: 1,
} satisfies WorkerEnv
 
function getVarOrDefault<K extends keyof WorkerEnv>(
  variable: K,
  defaults: WorkerEnv
): (env: WorkerEnv) => WorkerEnv[K] {
  return function (env: WorkerEnv): WorkerEnv[K] {
    return env[variable] || defaults[variable]
  }
}
 
function isVarSet(variable: keyof WorkerEnv): (env: WorkerEnv) => boolean {
  return function (env: WorkerEnv): boolean {
    return !!env[variable]
  }
}
 
export const getIngressBaseHost = getVarOrDefault('FPJS_INGRESS_BASE_HOST', Defaults)
 
export const agentScriptDownloadPathVarName = 'AGENT_SCRIPT_DOWNLOAD_PATH'
const getAgentPathVar = getVarOrDefault(agentScriptDownloadPathVarName, Defaults)
export const isScriptDownloadPathSet = isVarSet(agentScriptDownloadPathVarName)
 
export function getScriptDownloadPath(env: WorkerEnv): string {
  const agentPathVar = getAgentPathVar(env)
  return `/${agentPathVar}`
}
 
export const getResultPathVarName = 'GET_RESULT_PATH'
const getGetResultPathVar = getVarOrDefault(getResultPathVarName, Defaults)
export const isGetResultPathSet = isVarSet(getResultPathVarName)
 
export function getGetResultPath(env: WorkerEnv): string {
  const getResultPathVar = getGetResultPathVar(env)
  return `/${getResultPathVar}`
}
 
export const proxySecretVarName = 'PROXY_SECRET'
const getProxySecretVar = getVarOrDefault(proxySecretVarName, Defaults)
export const isProxySecretSet = isVarSet(proxySecretVarName)
 
export function getProxySecret(env: WorkerEnv): string | null {
  return getProxySecretVar(env)
}
 
export function getStatusPagePath(): string {
  return `/status`
}
 
export const integrationPathDepthVarName = 'INTEGRATION_PATH_DEPTH'
function normalizeIntegrationPathDepth(env: WorkerEnv): number | null {
  const integrationPathDepth = env[integrationPathDepthVarName]
  if (integrationPathDepth === null || integrationPathDepth === undefined || integrationPathDepth === '') {
    return null
  }
  return typeof integrationPathDepth === 'string' ? Number(integrationPathDepth) : integrationPathDepth
}
 
function isNonNegativeInteger(value: number): boolean {
  return Number.isInteger(value) && value >= 0 && !Object.is(value, -0)
}
 
export function envHasValidIntegrationPathDepth(env: WorkerEnv) {
  const integrationPathDepth = normalizeIntegrationPathDepth(env)
  if (integrationPathDepth == null) {
    return true
  }
  return isNonNegativeInteger(integrationPathDepth)
}
 
export function getIntegrationPathDepth(env: WorkerEnv): number {
  const integrationPathDepth = normalizeIntegrationPathDepth(env)
  if (integrationPathDepth === null) {
    return Defaults.INTEGRATION_PATH_DEPTH
  }
 
  if (!isNonNegativeInteger(integrationPathDepth)) {
    console.warn(
      `INTEGRATION_PATH_DEPTH must be an integer greater than or equal to 0, defaulting to ${Defaults.INTEGRATION_PATH_DEPTH}`
    )
    return Defaults.INTEGRATION_PATH_DEPTH
  }
 
  return integrationPathDepth
}