{"version":3,"file":"prepareEvent.js","sources":["../../../src/utils/prepareEvent.ts"],"sourcesContent":["import type { ClientOptions, Event, EventHint, StackParser } from '@sentry/types';\nimport { dateTimestampInSeconds, GLOBAL_OBJ, normalize, resolvedSyncPromise, truncate, uuid4 } from '@sentry/utils';\n\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { Scope } from '../scope';\n\n/**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * Note: This also triggers callbacks for `addGlobalEventProcessor`, but not `beforeSend`.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n * @hidden\n */\nexport function prepareEvent(\n  options: ClientOptions,\n  event: Event,\n  hint: EventHint,\n  scope?: Scope,\n): PromiseLike<Event | null> {\n  const { normalizeDepth = 3, normalizeMaxBreadth = 1_000 } = options;\n  const prepared: Event = {\n    ...event,\n    event_id: event.event_id || hint.event_id || uuid4(),\n    timestamp: event.timestamp || dateTimestampInSeconds(),\n  };\n  const integrations = hint.integrations || options.integrations.map(i => i.name);\n\n  applyClientOptions(prepared, options);\n  applyIntegrationsMetadata(prepared, integrations);\n  applyDebugMetadata(prepared, options.stackParser);\n\n  // If we have scope given to us, use it as the base for further modifications.\n  // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n  let finalScope = scope;\n  if (hint.captureContext) {\n    finalScope = Scope.clone(finalScope).update(hint.captureContext);\n  }\n\n  // We prepare the result here with a resolved Event.\n  let result = resolvedSyncPromise<Event | null>(prepared);\n\n  // This should be the last thing called, since we want that\n  // {@link Hub.addEventProcessor} gets the finished prepared event.\n  //\n  // We need to check for the existence of `finalScope.getAttachments`\n  // because `getAttachments` can be undefined if users are using an older version\n  // of `@sentry/core` that does not have the `getAttachments` method.\n  // See: https://github.com/getsentry/sentry-javascript/issues/5229\n  if (finalScope) {\n    // Collect attachments from the hint and scope\n    if (finalScope.getAttachments) {\n      const attachments = [...(hint.attachments || []), ...finalScope.getAttachments()];\n\n      if (attachments.length) {\n        hint.attachments = attachments;\n      }\n    }\n\n    // In case we have a hub we reassign it.\n    result = finalScope.applyToEvent(prepared, hint);\n  }\n\n  return result.then(evt => {\n    if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n      return normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n    }\n    return evt;\n  });\n}\n\n/**\n *  Enhances event using the client configuration.\n *  It takes care of all \"static\" values like environment, release and `dist`,\n *  as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\nfunction applyClientOptions(event: Event, options: ClientOptions): void {\n  const { environment, release, dist, maxValueLength = 250 } = options;\n\n  if (!('environment' in event)) {\n    event.environment = 'environment' in options ? environment : DEFAULT_ENVIRONMENT;\n  }\n\n  if (event.release === undefined && release !== undefined) {\n    event.release = release;\n  }\n\n  if (event.dist === undefined && dist !== undefined) {\n    event.dist = dist;\n  }\n\n  if (event.message) {\n    event.message = truncate(event.message, maxValueLength);\n  }\n\n  const exception = event.exception && event.exception.values && event.exception.values[0];\n  if (exception && exception.value) {\n    exception.value = truncate(exception.value, maxValueLength);\n  }\n\n  const request = event.request;\n  if (request && request.url) {\n    request.url = truncate(request.url, maxValueLength);\n  }\n}\n\n/**\n * Applies debug metadata images to the event in order to apply source maps by looking up their debug ID.\n */\nexport function applyDebugMetadata(event: Event, stackParser: StackParser): void {\n  const debugIdMap = GLOBAL_OBJ._sentryDebugIds;\n\n  if (!debugIdMap) {\n    return;\n  }\n\n  // Build a map of abs_path -> debug_id\n  const absPathDebugIdMap = Object.keys(debugIdMap).reduce<Record<string, string>>((acc, debugIdStackTrace) => {\n    const parsedStack = stackParser(debugIdStackTrace);\n    for (const stackFrame of parsedStack) {\n      if (stackFrame.abs_path) {\n        acc[stackFrame.abs_path] = debugIdMap[debugIdStackTrace];\n        break;\n      }\n    }\n    return acc;\n  }, {});\n\n  // Get a Set of abs_paths in the stack trace\n  const errorAbsPaths = new Set<string>();\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event!.exception!.values!.forEach(exception => {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      exception.stacktrace!.frames!.forEach(frame => {\n        if (frame.abs_path) {\n          errorAbsPaths.add(frame.abs_path);\n        }\n      });\n    });\n  } catch (e) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n\n  // Fill debug_meta information\n  event.debug_meta = event.debug_meta || {};\n  event.debug_meta.images = event.debug_meta.images || [];\n  const images = event.debug_meta.images;\n  errorAbsPaths.forEach(absPath => {\n    if (absPathDebugIdMap[absPath]) {\n      images.push({\n        type: 'sourcemap',\n        code_file: absPath,\n        debug_id: absPathDebugIdMap[absPath],\n      });\n    }\n  });\n}\n\n/**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\nfunction applyIntegrationsMetadata(event: Event, integrationNames: string[]): void {\n  if (integrationNames.length > 0) {\n    event.sdk = event.sdk || {};\n    event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationNames];\n  }\n}\n\n/**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\nfunction normalizeEvent(event: Event | null, depth: number, maxBreadth: number): Event | null {\n  if (!event) {\n    return null;\n  }\n\n  const normalized: Event = {\n    ...event,\n    ...(event.breadcrumbs && {\n      breadcrumbs: event.breadcrumbs.map(b => ({\n        ...b,\n        ...(b.data && {\n          data: normalize(b.data, depth, maxBreadth),\n        }),\n      })),\n    }),\n    ...(event.user && {\n      user: normalize(event.user, depth, maxBreadth),\n    }),\n    ...(event.contexts && {\n      contexts: normalize(event.contexts, depth, maxBreadth),\n    }),\n    ...(event.extra && {\n      extra: normalize(event.extra, depth, maxBreadth),\n    }),\n  };\n\n  // event.contexts.trace stores information about a Transaction. Similarly,\n  // event.spans[] stores information about child Spans. Given that a\n  // Transaction is conceptually a Span, normalization should apply to both\n  // Transactions and Spans consistently.\n  // For now the decision is to skip normalization of Transactions and Spans,\n  // so this block overwrites the normalized event to add back the original\n  // Transaction information prior to normalization.\n  if (event.contexts && event.contexts.trace && normalized.contexts) {\n    normalized.contexts.trace = event.contexts.trace;\n\n    // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n    if (event.contexts.trace.data) {\n      normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n    }\n  }\n\n  // event.spans[].data may contain circular/dangerous data so we need to normalize it\n  if (event.spans) {\n    normalized.spans = event.spans.map(span => {\n      // We cannot use the spread operator here because `toJSON` on `span` is non-enumerable\n      if (span.data) {\n        span.data = normalize(span.data, depth, maxBreadth);\n      }\n      return span;\n    });\n  }\n\n  return normalized;\n}\n"],"names":[],"mappings":";;;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,YAAA;AACA,EAAA,OAAA;AACA,EAAA,KAAA;AACA,EAAA,IAAA;AACA,EAAA,KAAA;AACA,EAAA;AACA,EAAA,MAAA,EAAA,cAAA,GAAA,CAAA,EAAA,mBAAA,GAAA,IAAA,EAAA,GAAA,OAAA,CAAA;AACA,EAAA,MAAA,QAAA,GAAA;AACA,IAAA,GAAA,KAAA;AACA,IAAA,QAAA,EAAA,KAAA,CAAA,QAAA,IAAA,IAAA,CAAA,QAAA,IAAA,KAAA,EAAA;AACA,IAAA,SAAA,EAAA,KAAA,CAAA,SAAA,IAAA,sBAAA,EAAA;AACA,GAAA,CAAA;AACA,EAAA,MAAA,YAAA,GAAA,IAAA,CAAA,YAAA,IAAA,OAAA,CAAA,YAAA,CAAA,GAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,CAAA;AACA;AACA,EAAA,kBAAA,CAAA,QAAA,EAAA,OAAA,CAAA,CAAA;AACA,EAAA,yBAAA,CAAA,QAAA,EAAA,YAAA,CAAA,CAAA;AACA,EAAA,kBAAA,CAAA,QAAA,EAAA,OAAA,CAAA,WAAA,CAAA,CAAA;AACA;AACA;AACA;AACA,EAAA,IAAA,UAAA,GAAA,KAAA,CAAA;AACA,EAAA,IAAA,IAAA,CAAA,cAAA,EAAA;AACA,IAAA,UAAA,GAAA,KAAA,CAAA,KAAA,CAAA,UAAA,CAAA,CAAA,MAAA,CAAA,IAAA,CAAA,cAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA;AACA,EAAA,IAAA,MAAA,GAAA,mBAAA,CAAA,QAAA,CAAA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA,IAAA,UAAA,EAAA;AACA;AACA,IAAA,IAAA,UAAA,CAAA,cAAA,EAAA;AACA,MAAA,MAAA,WAAA,GAAA,CAAA,IAAA,IAAA,CAAA,WAAA,IAAA,EAAA,CAAA,EAAA,GAAA,UAAA,CAAA,cAAA,EAAA,CAAA,CAAA;AACA;AACA,MAAA,IAAA,WAAA,CAAA,MAAA,EAAA;AACA,QAAA,IAAA,CAAA,WAAA,GAAA,WAAA,CAAA;AACA,OAAA;AACA,KAAA;AACA;AACA;AACA,IAAA,MAAA,GAAA,UAAA,CAAA,YAAA,CAAA,QAAA,EAAA,IAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,MAAA,CAAA,IAAA,CAAA,GAAA,IAAA;AACA,IAAA,IAAA,OAAA,cAAA,KAAA,QAAA,IAAA,cAAA,GAAA,CAAA,EAAA;AACA,MAAA,OAAA,cAAA,CAAA,GAAA,EAAA,cAAA,EAAA,mBAAA,CAAA,CAAA;AACA,KAAA;AACA,IAAA,OAAA,GAAA,CAAA;AACA,GAAA,CAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,kBAAA,CAAA,KAAA,EAAA,OAAA,EAAA;AACA,EAAA,MAAA,EAAA,WAAA,EAAA,OAAA,EAAA,IAAA,EAAA,cAAA,GAAA,GAAA,EAAA,GAAA,OAAA,CAAA;AACA;AACA,EAAA,IAAA,EAAA,aAAA,IAAA,KAAA,CAAA,EAAA;AACA,IAAA,KAAA,CAAA,WAAA,GAAA,aAAA,IAAA,OAAA,GAAA,WAAA,GAAA,mBAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,KAAA,CAAA,OAAA,KAAA,SAAA,IAAA,OAAA,KAAA,SAAA,EAAA;AACA,IAAA,KAAA,CAAA,OAAA,GAAA,OAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,KAAA,CAAA,IAAA,KAAA,SAAA,IAAA,IAAA,KAAA,SAAA,EAAA;AACA,IAAA,KAAA,CAAA,IAAA,GAAA,IAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,IAAA,KAAA,CAAA,OAAA,EAAA;AACA,IAAA,KAAA,CAAA,OAAA,GAAA,QAAA,CAAA,KAAA,CAAA,OAAA,EAAA,cAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,SAAA,GAAA,KAAA,CAAA,SAAA,IAAA,KAAA,CAAA,SAAA,CAAA,MAAA,IAAA,KAAA,CAAA,SAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA;AACA,EAAA,IAAA,SAAA,IAAA,SAAA,CAAA,KAAA,EAAA;AACA,IAAA,SAAA,CAAA,KAAA,GAAA,QAAA,CAAA,SAAA,CAAA,KAAA,EAAA,cAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,OAAA,GAAA,KAAA,CAAA,OAAA,CAAA;AACA,EAAA,IAAA,OAAA,IAAA,OAAA,CAAA,GAAA,EAAA;AACA,IAAA,OAAA,CAAA,GAAA,GAAA,QAAA,CAAA,OAAA,CAAA,GAAA,EAAA,cAAA,CAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA,SAAA,kBAAA,CAAA,KAAA,EAAA,WAAA,EAAA;AACA,EAAA,MAAA,UAAA,GAAA,UAAA,CAAA,eAAA,CAAA;AACA;AACA,EAAA,IAAA,CAAA,UAAA,EAAA;AACA,IAAA,OAAA;AACA,GAAA;AACA;AACA;AACA,EAAA,MAAA,iBAAA,GAAA,MAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAAA,MAAA,CAAA,CAAA,GAAA,EAAA,iBAAA,KAAA;AACA,IAAA,MAAA,WAAA,GAAA,WAAA,CAAA,iBAAA,CAAA,CAAA;AACA,IAAA,KAAA,MAAA,UAAA,IAAA,WAAA,EAAA;AACA,MAAA,IAAA,UAAA,CAAA,QAAA,EAAA;AACA,QAAA,GAAA,CAAA,UAAA,CAAA,QAAA,CAAA,GAAA,UAAA,CAAA,iBAAA,CAAA,CAAA;AACA,QAAA,MAAA;AACA,OAAA;AACA,KAAA;AACA,IAAA,OAAA,GAAA,CAAA;AACA,GAAA,EAAA,EAAA,CAAA,CAAA;AACA;AACA;AACA,EAAA,MAAA,aAAA,GAAA,IAAA,GAAA,EAAA,CAAA;AACA,EAAA,IAAA;AACA;AACA,IAAA,KAAA,CAAA,SAAA,CAAA,MAAA,CAAA,OAAA,CAAA,SAAA,IAAA;AACA;AACA,MAAA,SAAA,CAAA,UAAA,CAAA,MAAA,CAAA,OAAA,CAAA,KAAA,IAAA;AACA,QAAA,IAAA,KAAA,CAAA,QAAA,EAAA;AACA,UAAA,aAAA,CAAA,GAAA,CAAA,KAAA,CAAA,QAAA,CAAA,CAAA;AACA,SAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA,CAAA,OAAA,CAAA,EAAA;AACA;AACA,GAAA;AACA;AACA;AACA,EAAA,KAAA,CAAA,UAAA,GAAA,KAAA,CAAA,UAAA,IAAA,EAAA,CAAA;AACA,EAAA,KAAA,CAAA,UAAA,CAAA,MAAA,GAAA,KAAA,CAAA,UAAA,CAAA,MAAA,IAAA,EAAA,CAAA;AACA,EAAA,MAAA,MAAA,GAAA,KAAA,CAAA,UAAA,CAAA,MAAA,CAAA;AACA,EAAA,aAAA,CAAA,OAAA,CAAA,OAAA,IAAA;AACA,IAAA,IAAA,iBAAA,CAAA,OAAA,CAAA,EAAA;AACA,MAAA,MAAA,CAAA,IAAA,CAAA;AACA,QAAA,IAAA,EAAA,WAAA;AACA,QAAA,SAAA,EAAA,OAAA;AACA,QAAA,QAAA,EAAA,iBAAA,CAAA,OAAA,CAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA,CAAA,CAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,yBAAA,CAAA,KAAA,EAAA,gBAAA,EAAA;AACA,EAAA,IAAA,gBAAA,CAAA,MAAA,GAAA,CAAA,EAAA;AACA,IAAA,KAAA,CAAA,GAAA,GAAA,KAAA,CAAA,GAAA,IAAA,EAAA,CAAA;AACA,IAAA,KAAA,CAAA,GAAA,CAAA,YAAA,GAAA,CAAA,IAAA,KAAA,CAAA,GAAA,CAAA,YAAA,IAAA,EAAA,CAAA,EAAA,GAAA,gBAAA,CAAA,CAAA;AACA,GAAA;AACA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAA,cAAA,CAAA,KAAA,EAAA,KAAA,EAAA,UAAA,EAAA;AACA,EAAA,IAAA,CAAA,KAAA,EAAA;AACA,IAAA,OAAA,IAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,MAAA,UAAA,GAAA;AACA,IAAA,GAAA,KAAA;AACA,IAAA,IAAA,KAAA,CAAA,WAAA,IAAA;AACA,MAAA,WAAA,EAAA,KAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,KAAA;AACA,QAAA,GAAA,CAAA;AACA,QAAA,IAAA,CAAA,CAAA,IAAA,IAAA;AACA,UAAA,IAAA,EAAA,SAAA,CAAA,CAAA,CAAA,IAAA,EAAA,KAAA,EAAA,UAAA,CAAA;AACA,SAAA,CAAA;AACA,OAAA,CAAA,CAAA;AACA,KAAA,CAAA;AACA,IAAA,IAAA,KAAA,CAAA,IAAA,IAAA;AACA,MAAA,IAAA,EAAA,SAAA,CAAA,KAAA,CAAA,IAAA,EAAA,KAAA,EAAA,UAAA,CAAA;AACA,KAAA,CAAA;AACA,IAAA,IAAA,KAAA,CAAA,QAAA,IAAA;AACA,MAAA,QAAA,EAAA,SAAA,CAAA,KAAA,CAAA,QAAA,EAAA,KAAA,EAAA,UAAA,CAAA;AACA,KAAA,CAAA;AACA,IAAA,IAAA,KAAA,CAAA,KAAA,IAAA;AACA,MAAA,KAAA,EAAA,SAAA,CAAA,KAAA,CAAA,KAAA,EAAA,KAAA,EAAA,UAAA,CAAA;AACA,KAAA,CAAA;AACA,GAAA,CAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA,IAAA,KAAA,CAAA,QAAA,IAAA,KAAA,CAAA,QAAA,CAAA,KAAA,IAAA,UAAA,CAAA,QAAA,EAAA;AACA,IAAA,UAAA,CAAA,QAAA,CAAA,KAAA,GAAA,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA;AACA;AACA;AACA,IAAA,IAAA,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA,IAAA,EAAA;AACA,MAAA,UAAA,CAAA,QAAA,CAAA,KAAA,CAAA,IAAA,GAAA,SAAA,CAAA,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA,IAAA,EAAA,KAAA,EAAA,UAAA,CAAA,CAAA;AACA,KAAA;AACA,GAAA;AACA;AACA;AACA,EAAA,IAAA,KAAA,CAAA,KAAA,EAAA;AACA,IAAA,UAAA,CAAA,KAAA,GAAA,KAAA,CAAA,KAAA,CAAA,GAAA,CAAA,IAAA,IAAA;AACA;AACA,MAAA,IAAA,IAAA,CAAA,IAAA,EAAA;AACA,QAAA,IAAA,CAAA,IAAA,GAAA,SAAA,CAAA,IAAA,CAAA,IAAA,EAAA,KAAA,EAAA,UAAA,CAAA,CAAA;AACA,OAAA;AACA,MAAA,OAAA,IAAA,CAAA;AACA,KAAA,CAAA,CAAA;AACA,GAAA;AACA;AACA,EAAA,OAAA,UAAA,CAAA;AACA;;;;"}