{"version":3,"file":"EmbraceLogManager.cjs","names":["GLOBAL_CONFIG","logs","diag","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 {\n  NamespacedStorage,\n  PerformanceManager,\n} from '../../utils/index.ts';\nimport {\n  GLOBAL_CONFIG,\n  getIncrementedCount,\n  getVisibilityState,\n} from '../../utils/index.ts';\nimport type { LimitManagerInternal } from '../EmbraceLimitManager/index.ts';\nimport type { UserSessionManagerInternal } from '../EmbraceUserSessionManager/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 _userSessionManager: UserSessionManagerInternal;\n  private readonly _limitManager: LimitManagerInternal;\n  private readonly _visibilityDoc: VisibilityStateDocument;\n  private readonly _storage: NamespacedStorage;\n\n  public constructor({\n    diag: diagParam,\n    perf,\n    userSessionManager,\n    limitManager,\n    loggerProvider: globalLoggerProviderOverride,\n    visibilityDoc,\n    storage,\n  }: EmbraceLogManagerArgs) {\n    const loggerProvider = globalLoggerProviderOverride ?? logs;\n\n    this._diag =\n      diagParam ??\n      diag.createComponentLogger({\n        namespace: 'EmbraceLogManager',\n      });\n    this._perf = perf;\n    this._logger = loggerProvider.getLogger('embrace-web-sdk-logs');\n    this._userSessionManager = userSessionManager;\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._userSessionManager.incrSessionPartCountForKey(\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._userSessionManager.incrSessionPartCountForKey(\n        KEY_EMB_ERROR_LOG_COUNT,\n      );\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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"}