{"version":3,"file":"EmbraceLogManager.cjs","names":["GLOBAL_CONFIG","logs","diag","OTelPerformanceManager","SeverityNumber","KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT","KEY_EMB_TYPE","KEY_EMB_EXCEPTION_HANDLING","KEY_EMB_EXCEPTION_CAUSE","ATTR_EXCEPTION_TYPE","ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","KEY_EMB_JS_FILE_BUNDLE_IDS","KEY_EMB_STATE","getVisibilityState","KEY_EMB_EXCEPTION_NUMBER","getIncrementedCount","KEY_EMB_ERROR_LOG_COUNT","KEY_EMB_JS_EXCEPTION_STACKTRACE"],"sources":["../../../src/managers/EmbraceLogManager/EmbraceLogManager.ts"],"sourcesContent":["import type { Attributes, DiagLogger } from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\nimport type { Logger } from '@opentelemetry/api-logs';\nimport { logs, SeverityNumber } from '@opentelemetry/api-logs';\nimport {\n  ATTR_EXCEPTION_MESSAGE,\n  ATTR_EXCEPTION_STACKTRACE,\n  ATTR_EXCEPTION_TYPE,\n} from '@opentelemetry/semantic-conventions';\nimport type { LogManager, LogSeverity } from '../../api-logs/index.ts';\nimport type {\n  LogExceptionOptions,\n  LogMessageOptions,\n} from '../../api-logs/manager/index.ts';\nimport type { ExceptionHandlerType } from '../../api-logs/manager/types.ts';\nimport type { VisibilityStateDocument } from '../../common/index.ts';\nimport {\n  KEY_EMB_ERROR_LOG_COUNT,\n  KEY_EMB_EXCEPTION_CAUSE,\n  KEY_EMB_JS_FILE_BUNDLE_IDS,\n  KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT,\n} from '../../constants/attributes.ts';\nimport {\n  EMB_TYPES,\n  KEY_EMB_EXCEPTION_HANDLING,\n  KEY_EMB_EXCEPTION_NUMBER,\n  KEY_EMB_JS_EXCEPTION_STACKTRACE,\n  KEY_EMB_STATE,\n  KEY_EMB_TYPE,\n} from '../../constants/index.ts';\nimport type { PerformanceManager } from '../../utils/index.ts';\nimport {\n  GLOBAL_CONFIG,\n  getIncrementedCount,\n  getVisibilityState,\n  OTelPerformanceManager,\n} from '../../utils/index.ts';\nimport type { LimitManagerInternal } from '../EmbraceLimitManager/index.ts';\nimport type { SpanSessionManagerInternal } from '../EmbraceSpanSessionManager/index.ts';\nimport type { EmbraceLogManagerArgs } from './types.ts';\n\nconst EMBRACE_EXCEPTION_NUMBER_STORAGE_KEY = 'embrace_exception_number';\n/**\n * GLOBAL_CONFIG._EmbraceFileBundleIDs is populated at runtime when each file is loaded,\n * based on the contents injected by the embrace-web-cli.\n */\nconst getJSFileBundleIDs = () =>\n  JSON.stringify(GLOBAL_CONFIG._EmbraceFileBundleIDs || {});\n\nexport class EmbraceLogManager implements LogManager {\n  private readonly _diag: DiagLogger;\n  private readonly _perf: PerformanceManager;\n  private readonly _logger: Logger;\n  private readonly _spanSessionManager: SpanSessionManagerInternal;\n  private readonly _limitManager: LimitManagerInternal;\n  private readonly _visibilityDoc: VisibilityStateDocument;\n  private readonly _storage: Storage;\n\n  public constructor({\n    diag: diagParam,\n    perf,\n    spanSessionManager,\n    limitManager,\n    loggerProvider: globalLoggerProviderOverride,\n    visibilityDoc = window.document,\n    storage = window.localStorage,\n  }: EmbraceLogManagerArgs) {\n    const loggerProvider = globalLoggerProviderOverride ?? logs;\n\n    this._diag =\n      diagParam ??\n      diag.createComponentLogger({\n        namespace: 'EmbraceLogManager',\n      });\n    this._perf = perf ?? new OTelPerformanceManager();\n    this._logger = loggerProvider.getLogger('embrace-web-sdk-logs');\n    this._spanSessionManager = spanSessionManager;\n    this._limitManager = limitManager;\n    this._visibilityDoc = visibilityDoc;\n    this._storage = storage;\n  }\n\n  private _validateAttributes(attributes: unknown): Attributes {\n    if (Object.prototype.toString.call(attributes) !== '[object Object]') {\n      this._diag.warn('attributes must be a plain object', attributes);\n      return {};\n    }\n    return attributes as Attributes;\n  }\n\n  private static _logSeverityToSeverityNumber(\n    severity: LogSeverity,\n  ): SeverityNumber {\n    switch (severity) {\n      case 'info':\n        return SeverityNumber.INFO;\n      case 'warning':\n        return SeverityNumber.WARN;\n      default:\n        return SeverityNumber.ERROR;\n    }\n  }\n\n  public logException(\n    error: unknown,\n    {\n      handled = true,\n      attributes = {},\n      timestamp = this._perf.getNowMillis(),\n      handler = 'manual',\n    }: LogExceptionOptions = {},\n  ) {\n    const validAttrs = this._validateAttributes(attributes);\n\n    if (!handled) {\n      this._spanSessionManager.incrSessionCountForKey(\n        KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT,\n      );\n    }\n\n    const type = error?.constructor?.name || typeof error;\n    let errMessage = '';\n    let errName = type;\n    let errStack = '';\n    let errCause = '';\n\n    if (error instanceof Error) {\n      errMessage = String(error.message || '').trim();\n      errName = error.name || '';\n      errStack = error.stack || '';\n      errCause = error.cause ? 'present' : '';\n    } else if (error && typeof error === 'object') {\n      try {\n        errMessage = JSON.stringify(error);\n      } catch {\n        errMessage = String(error).trim();\n      }\n    } else {\n      errMessage = String(error).trim();\n    }\n\n    const limited = this._limitManager.limitException(errMessage, validAttrs);\n    if (limited === 'dropped') {\n      return;\n    }\n\n    this._logger.emit({\n      timestamp,\n      severityNumber: SeverityNumber.ERROR,\n      severityText: 'ERROR',\n      body: limited.message,\n      attributes: {\n        ...limited.attributes,\n        [KEY_EMB_TYPE]: EMB_TYPES.SystemException,\n        [KEY_EMB_EXCEPTION_HANDLING]: EmbraceLogManager._exceptionHandlingType(\n          handled,\n          handler,\n        ),\n        [KEY_EMB_EXCEPTION_CAUSE]: errCause,\n        [ATTR_EXCEPTION_TYPE]: type,\n        ['exception.name']: errName,\n        [ATTR_EXCEPTION_MESSAGE]: limited.message,\n        [ATTR_EXCEPTION_STACKTRACE]: errStack,\n        [KEY_EMB_JS_FILE_BUNDLE_IDS]: getJSFileBundleIDs(),\n        [KEY_EMB_STATE]: getVisibilityState(this._visibilityDoc),\n        [KEY_EMB_EXCEPTION_NUMBER]: getIncrementedCount(\n          this._storage,\n          EMBRACE_EXCEPTION_NUMBER_STORAGE_KEY,\n          this._diag,\n        ),\n      },\n    });\n  }\n\n  public message(\n    message: string,\n    severity: LogSeverity,\n    {\n      attributes = {},\n      includeStacktrace = true,\n      stacktrace,\n    }: LogMessageOptions = {},\n  ) {\n    if (typeof message !== 'string' || !message.trim()) {\n      this._diag.warn('Message must be a non-empty string');\n      return;\n    }\n\n    if (!['info', 'warning', 'error'].includes(severity)) {\n      this._diag.warn('Severity must be info, warning, or error');\n      return;\n    }\n\n    const validAttrs = this._validateAttributes(attributes);\n\n    if (severity === 'error') {\n      this._spanSessionManager.incrSessionCountForKey(KEY_EMB_ERROR_LOG_COUNT);\n    }\n\n    let stack = '';\n    if (severity !== 'info') {\n      if (typeof stacktrace === 'string') {\n        stack = stacktrace;\n      } else if (includeStacktrace) {\n        stack = new Error().stack || '';\n      }\n    }\n\n    this._logMessage({\n      message: message.trim(),\n      severity,\n      timestamp: this._perf.getNowMillis(),\n      attributes: validAttrs,\n      stack,\n    });\n  }\n\n  private _logMessage({\n    message,\n    severity,\n    timestamp,\n    attributes = {},\n    stack,\n  }: {\n    message: string;\n    severity: LogSeverity;\n    timestamp: number;\n    attributes?: Attributes;\n    stack?: string;\n  }) {\n    const limitedLog = this._limitManager.limitLog(\n      message,\n      severity,\n      attributes,\n    );\n\n    if (limitedLog === 'dropped') {\n      return;\n    }\n\n    this._logger.emit({\n      timestamp,\n      severityNumber: EmbraceLogManager._logSeverityToSeverityNumber(severity),\n      severityText: severity.toUpperCase(),\n      body: limitedLog.message,\n      attributes: {\n        ...limitedLog.attributes,\n        [KEY_EMB_TYPE]: EMB_TYPES.SystemLog,\n        ...(stack\n          ? {\n              [KEY_EMB_JS_EXCEPTION_STACKTRACE]: stack,\n              [KEY_EMB_JS_FILE_BUNDLE_IDS]: getJSFileBundleIDs(),\n            }\n          : {}),\n        [KEY_EMB_STATE]: getVisibilityState(this._visibilityDoc),\n      },\n    });\n  }\n\n  private static _exceptionHandlingType(\n    handled: boolean,\n    handler: ExceptionHandlerType,\n  ): string {\n    if (handled) {\n      return 'handled';\n    }\n\n    if (handler === 'global_exception') {\n      return 'unhandled_error';\n    }\n\n    if (handler === 'promise_rejection') {\n      return 'unhandled_rejection';\n    }\n\n    return 'unhandled';\n  }\n}\n"],"mappings":"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"}