{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Attributes } from '@opentelemetry/api';\nimport {\n  ATTR_HTTP_ROUTE,\n  ATTR_HTTP_REQUEST_METHOD,\n} from '@opentelemetry/semantic-conventions';\nimport { ATTR_HTTP_METHOD } from './semconv';\nimport type * as Hapi from '@hapi/hapi';\nimport {\n  HapiLayerType,\n  HapiLifecycleMethodNames,\n  HapiPluginObject,\n  PatchableExtMethod,\n  ServerExtDirectInput,\n} from './internal-types';\nimport { AttributeNames } from './enums/AttributeNames';\nimport { SemconvStability } from '@opentelemetry/instrumentation';\n\nexport function getPluginName<T>(plugin: Hapi.Plugin<T>): string {\n  if ((plugin as Hapi.PluginNameVersion).name) {\n    return (plugin as Hapi.PluginNameVersion).name;\n  } else {\n    return (plugin as Hapi.PluginPackage).pkg.name;\n  }\n}\n\nexport const isLifecycleExtType = (\n  variableToCheck: unknown\n): variableToCheck is Hapi.ServerRequestExtType => {\n  return (\n    typeof variableToCheck === 'string' &&\n    HapiLifecycleMethodNames.has(variableToCheck)\n  );\n};\n\nexport const isLifecycleExtEventObj = (\n  variableToCheck: unknown\n): variableToCheck is Hapi.ServerExtEventsRequestObject => {\n  const event = (variableToCheck as Hapi.ServerExtEventsRequestObject)?.type;\n  return event !== undefined && isLifecycleExtType(event);\n};\n\nexport const isDirectExtInput = (\n  variableToCheck: unknown\n): variableToCheck is ServerExtDirectInput => {\n  return (\n    Array.isArray(variableToCheck) &&\n    variableToCheck.length <= 3 &&\n    isLifecycleExtType(variableToCheck[0]) &&\n    typeof variableToCheck[1] === 'function'\n  );\n};\n\nexport const isPatchableExtMethod = (\n  variableToCheck: PatchableExtMethod | PatchableExtMethod[]\n): variableToCheck is PatchableExtMethod => {\n  return !Array.isArray(variableToCheck);\n};\n\nexport const getRouteMetadata = (\n  route: Hapi.ServerRoute,\n  semconvStability: SemconvStability,\n  pluginName?: string\n): {\n  attributes: Attributes;\n  name: string;\n} => {\n  const attributes: Attributes = {\n    [ATTR_HTTP_ROUTE]: route.path,\n  };\n  if (semconvStability & SemconvStability.OLD) {\n    attributes[ATTR_HTTP_METHOD] = route.method;\n  }\n  if (semconvStability & SemconvStability.STABLE) {\n    // Note: This currently does *not* normalize the method name to uppercase\n    // and conditionally include `http.request.method.original` as described\n    // at https://opentelemetry.io/docs/specs/semconv/http/http-spans/\n    // These attributes are for a *hapi* span, and not the parent HTTP span,\n    // so the HTTP span guidance doesn't strictly apply.\n    attributes[ATTR_HTTP_REQUEST_METHOD] = route.method;\n  }\n\n  let name;\n  if (pluginName) {\n    attributes[AttributeNames.HAPI_TYPE] = HapiLayerType.PLUGIN;\n    attributes[AttributeNames.PLUGIN_NAME] = pluginName;\n    name = `${pluginName}: route - ${route.path}`;\n  } else {\n    attributes[AttributeNames.HAPI_TYPE] = HapiLayerType.ROUTER;\n    name = `route - ${route.path}`;\n  }\n\n  return { attributes, name };\n};\n\nexport const getExtMetadata = (\n  extPoint: Hapi.ServerRequestExtType,\n  pluginName?: string,\n  methodName?: string\n): {\n  attributes: Attributes;\n  name: string;\n} => {\n  let baseName = `ext - ${extPoint}`;\n  if (methodName && methodName !== 'method') {\n    // method is the default name for the extension in the ServerExtEventsObject format.\n    baseName = `ext - ${extPoint} - ${methodName}`;\n  }\n  if (pluginName) {\n    return {\n      attributes: {\n        [AttributeNames.EXT_TYPE]: extPoint,\n        [AttributeNames.HAPI_TYPE]: HapiLayerType.EXT,\n        [AttributeNames.PLUGIN_NAME]: pluginName,\n      },\n      name: `${pluginName}: ${baseName}`,\n    };\n  }\n  return {\n    attributes: {\n      [AttributeNames.EXT_TYPE]: extPoint,\n      [AttributeNames.HAPI_TYPE]: HapiLayerType.EXT,\n    },\n    name: baseName,\n  };\n};\n\nexport const getPluginFromInput = <T>(\n  pluginObj: HapiPluginObject<T>\n): Hapi.Plugin<T, void> => {\n  if ('plugin' in pluginObj) {\n    if ('plugin' in pluginObj.plugin) {\n      return pluginObj.plugin.plugin;\n    }\n    return pluginObj.plugin;\n  }\n  return pluginObj;\n};\n"]}