@safaricom-mxl/web-sdk 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.cjs +4 -0
  2. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.cjs.map +1 -1
  3. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.d.cts +4 -0
  4. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.d.cts.map +1 -1
  5. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.d.ts +4 -0
  6. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.d.ts.map +1 -1
  7. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.js +4 -0
  8. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.js.map +1 -1
  9. package/dist/index.d.cts +2 -2
  10. package/dist/index.d.ts +2 -2
  11. package/dist/mxl-web-sdk.js +38 -1
  12. package/dist/mxl-web-sdk.js.map +1 -1
  13. package/dist/packages/otlp-transformer/dist/index.cjs +215 -81
  14. package/dist/packages/otlp-transformer/dist/index.cjs.map +1 -1
  15. package/dist/packages/otlp-transformer/dist/index.d.cts.map +1 -1
  16. package/dist/packages/otlp-transformer/dist/index.d.ts.map +1 -1
  17. package/dist/packages/otlp-transformer/dist/index.js +215 -81
  18. package/dist/packages/otlp-transformer/dist/index.js.map +1 -1
  19. package/dist/resources/constants/index.cjs +1 -1
  20. package/dist/resources/constants/index.cjs.map +1 -1
  21. package/dist/resources/constants/index.d.cts +1 -1
  22. package/dist/resources/constants/index.d.ts +1 -1
  23. package/dist/resources/constants/index.js +1 -1
  24. package/dist/resources/constants/index.js.map +1 -1
  25. package/dist/sdk/index.d.cts +2 -2
  26. package/dist/sdk/index.d.ts +2 -2
  27. package/dist/sdk/initSDK.cjs +15 -2
  28. package/dist/sdk/initSDK.cjs.map +1 -1
  29. package/dist/sdk/initSDK.d.cts +3 -1
  30. package/dist/sdk/initSDK.d.cts.map +1 -1
  31. package/dist/sdk/initSDK.d.ts +3 -1
  32. package/dist/sdk/initSDK.d.ts.map +1 -1
  33. package/dist/sdk/initSDK.js +15 -2
  34. package/dist/sdk/initSDK.js.map +1 -1
  35. package/dist/sdk/setupSessionRecorder.cjs +46 -0
  36. package/dist/sdk/setupSessionRecorder.cjs.map +1 -0
  37. package/dist/sdk/setupSessionRecorder.d.cts +21 -0
  38. package/dist/sdk/setupSessionRecorder.d.cts.map +1 -0
  39. package/dist/sdk/setupSessionRecorder.d.ts +21 -0
  40. package/dist/sdk/setupSessionRecorder.d.ts.map +1 -0
  41. package/dist/sdk/setupSessionRecorder.js +43 -0
  42. package/dist/sdk/setupSessionRecorder.js.map +1 -0
  43. package/dist/sdk/types.d.cts +22 -1
  44. package/dist/sdk/types.d.cts.map +1 -1
  45. package/dist/sdk/types.d.ts +22 -1
  46. package/dist/sdk/types.d.ts.map +1 -1
  47. package/package.json +14 -13
@@ -1 +1 @@
1
- {"version":3,"file":"initSDK.cjs","names":["DiagLogLevel","diag","registry","DiagConsoleLogger","OTelPerformanceManager","validateAppID","validateAppVersion","NamespacedStorage","getWebSDKResource","MXLDynamicConfigManager","MXLSDKFeaturesManager","nsfConfigValidation","MXLLimitManager","DEFAULT_LIMITS","getDefaultAttributeScrubbers","MXLSessionBatchedSpanProcessor","MXLTraceExporter","BatchLogRecordProcessor","MXLLogExporter","MXLW3CTraceContextPropagator","setupDefaultInstrumentations","MXLUserManager","MXLSpanSessionManager","BrowserSpanProcessor","MXLNetworkSpanProcessor","UserSpanProcessor","PageSpanProcessor","SpanScrubProcessor","BatchSpanProcessor","WebTracerProvider","MXLTraceManager","StackContextManager","IdentifiableSessionLogRecordProcessor","BrowserLogRecordProcessor","MXLLogRecordProcessor","UserLogRecordProcessor","LogRecordScrubProcessor","PageLogRecordProcessor","LoggerProvider","MXLLogManager","MXLPageManager"],"sources":["../../src/sdk/initSDK.ts"],"sourcesContent":["import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { emptyResource } from '@opentelemetry/resources';\nimport type { LogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-web';\nimport {\n BatchSpanProcessor,\n StackContextManager,\n WebTracerProvider,\n} from '@opentelemetry/sdk-trace-web';\nimport { createSessionSpanProcessor } from '@opentelemetry/web-common';\nimport { log } from '../api-logs/index.ts';\nimport { page } from '../api-page/index.ts';\nimport { session } from '../api-sessions/index.ts';\nimport { trace } from '../api-traces/index.ts';\nimport { user } from '../api-users/index.ts';\nimport type { AttributeScrubber } from '../common/index.ts';\nimport {\n MXLLogExporter,\n MXLTraceExporter,\n} from '../exporters/index.ts';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers/index.ts';\nimport {\n BrowserLogRecordProcessor,\n BrowserSpanProcessor,\n MXLLogRecordProcessor,\n MXLNetworkSpanProcessor,\n MXLSessionBatchedSpanProcessor,\n IdentifiableSessionLogRecordProcessor,\n LogRecordScrubProcessor,\n PageLogRecordProcessor,\n PageSpanProcessor,\n SpanScrubProcessor,\n UserLogRecordProcessor,\n UserSpanProcessor,\n} from '../processors/index.ts';\nimport { MXLW3CTraceContextPropagator } from '../propagators/index.ts';\nimport { getWebSDKResource } from '../resources/index.ts';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils/index.ts';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers.ts';\nimport { registry } from './registry.ts';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations.ts';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types.ts';\nimport { validateAppID, validateAppVersion } from './utils.ts';\n\nexport const initSDK = (\n {\n appID,\n appVersion,\n resource = emptyResource(),\n spanExporters = [],\n logExporters = [],\n spanProcessors = [],\n propagator = null,\n defaultInstrumentationConfig,\n instrumentations = [],\n contextManager = null,\n logProcessors = [],\n attributeScrubbers = [],\n enableDefaultAttributeScrubbing = true,\n additionalQueryParamsToScrub = [],\n logLevel = DiagLogLevel.ERROR,\n mxlDataURL,\n mxlConfigURL,\n diagLogger = diag.createComponentLogger({\n namespace: 'mxl-sdk',\n }),\n dynamicSDKConfigManager: providedDynamicSDKConfigManager,\n dynamicSDKConfig,\n registerGlobally = true,\n blockNetworkSpanForwarding = false,\n restrictedProtocols = new Set(['file:']),\n useDocumentTitleAsPageLabel = true,\n }: SDKInitConfig = {} as SDKInitConfig,\n): SDKControl | false => {\n try {\n if (registerGlobally) {\n const existingSDK = registry.registered();\n if (existingSDK !== null) {\n diagLogger.warn(\n 'SDK has already been successfully initialized, skipping this invocation of initSDK',\n );\n return existingSDK;\n }\n }\n\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel,\n });\n\n if (typeof window === 'undefined') {\n diagLogger.warn('browser not detected, skipping initialization');\n return false;\n }\n\n const perf = new OTelPerformanceManager();\n const initSDKStart = perf.getNowMillis();\n const validatedAppID = validateAppID(appID);\n const validatedAppVersion = validateAppVersion(appVersion);\n\n const sendingToMXL = validatedAppID !== undefined;\n\n if (!sendingToMXL && !logExporters.length && !spanExporters.length) {\n throw new Error(\n 'when appID is omitted, at least one logExporter or spanExporter must be set',\n );\n }\n\n if (restrictedProtocols.has(window.location.protocol)) {\n throw new Error(\n `not initializing due to restricted protocol: ${window.location.protocol}`,\n );\n }\n\n if (sendingToMXL && typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not supported in this browser and required for data compression.',\n );\n }\n\n const useNamespace = !registerGlobally && appID;\n const sdkLocalStorage = useNamespace\n ? new NamespacedStorage(appID, window.localStorage)\n : window.localStorage;\n const sdkSessionStorage = useNamespace\n ? new NamespacedStorage(appID, window.sessionStorage)\n : window.sessionStorage;\n\n const resourceWithWebSDKAttributes = resource.merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\n\n const userManager = setupUser({ registerGlobally, sdkLocalStorage });\n const enduserPseudoID = userManager.getMXLUserId();\n if (sendingToMXL && !enduserPseudoID) {\n throw new Error('userID is required when using MXL exporter');\n }\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicSDKConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const sdkFeaturesManager = new MXLSDKFeaturesManager({\n dynamicConfigManager,\n deviceId: enduserPseudoID,\n blockNetworkSpanForwarding,\n });\n\n if (!sdkFeaturesManager.isSDKEnabled()) {\n diagLogger.debug('SDK is disabled, skipping initialization.');\n\n return false;\n }\n\n const nsfValid = nsfConfigValidation({\n featureManager: sdkFeaturesManager,\n diag: diagLogger,\n registerGlobally,\n defaultInstrumentationConfig,\n propagator,\n });\n\n const limitManager = new MXLLimitManager(DEFAULT_LIMITS);\n\n const finalAttributeScrubbers: AttributeScrubber[] = [\n ...(enableDefaultAttributeScrubbing\n ? getDefaultAttributeScrubbers(additionalQueryParamsToScrub)\n : []),\n ...attributeScrubbers,\n ];\n\n const spanSessionManager = setupSession({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n });\n\n let mxlSpanProcessor: MXLSessionBatchedSpanProcessor | undefined;\n let mxlLogProcessor: BatchLogRecordProcessor | undefined;\n if (sendingToMXL) {\n mxlSpanProcessor = new MXLSessionBatchedSpanProcessor({\n resource: resourceWithWebSDKAttributes,\n exporter: new MXLTraceExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n limitManager,\n storedSpansExpireTimeoutMS:\n defaultInstrumentationConfig?.['session-visibility']\n ?.storedSpansExpireTimeoutMS,\n storage: sdkLocalStorage,\n spanSessionManager,\n });\n\n mxlLogProcessor = new BatchLogRecordProcessor(\n new MXLLogExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n );\n }\n\n const pageManager = setupPage({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n });\n\n const { tracerProvider, mxlTraceManager } = setupTraces({\n resource: resourceWithWebSDKAttributes,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors,\n propagator: nsfValid\n ? new MXLW3CTraceContextPropagator()\n : propagator,\n contextManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n });\n\n spanSessionManager.setTracerProvider(tracerProvider);\n\n const { loggerProvider, mxlLogManager } = setupLogs({\n resource: resourceWithWebSDKAttributes,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n });\n\n // NOTE: we require setupInstrumentation to run the last, after setupLogs and setupTraces. This is how OTel works wrt\n // the dependencies between instrumentations and global providers. We need the providers for tracers, and logs to be\n // setup before we enable instrumentations.\n if (!registerGlobally) {\n registerInstrumentations({\n tracerProvider,\n loggerProvider,\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n logManager: mxlLogManager,\n spanSessionManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n }\n\n diagLogger.info('successfully initialized the SDK');\n\n const sdkControl: SDKControl = {\n setDynamicConfig: (config: Partial<DynamicSDKConfig>) => {\n dynamicConfigManager.setConfig(config);\n },\n flush: async () => {\n await tracerProvider.forceFlush();\n await loggerProvider.forceFlush();\n },\n log: mxlLogManager,\n trace: mxlTraceManager,\n session: spanSessionManager,\n user: userManager,\n page: pageManager,\n };\n\n if (registerGlobally) {\n registry.register(sdkControl);\n }\n\n spanSessionManager.recordSDKStartupDuration(\n perf.getNowMillis() - initSDKStart,\n );\n\n return sdkControl;\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Unknown error.';\n diagLogger.error(`failed to initialize the SDK: ${message}`);\n return false;\n }\n};\n\nconst setupUser = ({ registerGlobally, sdkLocalStorage }: SetupUserArgs) => {\n const mxlUserManager = new MXLUserManager({\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n user.setGlobalUserManager(mxlUserManager);\n }\n\n return mxlUserManager;\n};\n\nconst setupSession = ({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n }: SetupSessionArgs) => {\n const mxlSpanSessionManager = new MXLSpanSessionManager({\n limitManager,\n storage: sdkLocalStorage,\n sessionStorage: sdkSessionStorage,\n });\n\n if (registerGlobally) {\n session.setGlobalSessionManager(mxlSpanSessionManager);\n }\n\n return mxlSpanSessionManager;\n};\n\nconst setupTraces = ({\n resource,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors = [],\n propagator = null,\n contextManager = null,\n attributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n }: SetupTracesArgs) => {\n const finalSpanProcessors: SpanProcessor[] = [\n ...spanProcessors,\n createSessionSpanProcessor(spanSessionManager),\n new BrowserSpanProcessor(),\n new MXLNetworkSpanProcessor(),\n new UserSpanProcessor({ userManager }),\n new PageSpanProcessor({ pageManager }),\n new SpanScrubProcessor({ attributeScrubbers }),\n ];\n\n spanExporters?.forEach((exporter) => {\n finalSpanProcessors.push(new BatchSpanProcessor(exporter));\n });\n\n if (mxlSpanProcessor) {\n finalSpanProcessors.push(mxlSpanProcessor);\n }\n\n const tracerProvider = new WebTracerProvider({\n resource,\n spanProcessors: finalSpanProcessors,\n spanLimits: {\n // Session properties are stored as attributes on the session span, add a\n // buffer here so that there is room for our internal attributes\n attributeCountLimit: DEFAULT_LIMITS.maxAllowed.session_property * 2,\n attributePerEventCountLimit: 20,\n // Breadcrumbs are stored as events on the session span, add a\n // buffer here so that there is room for our internal events\n eventCountLimit: DEFAULT_LIMITS.maxAllowed.breadcrumb * 2,\n attributeValueLengthLimit: 1024,\n },\n });\n\n const mxlTraceManager = new MXLTraceManager({\n tracerProvider: registerGlobally ? undefined : tracerProvider,\n });\n\n if (registerGlobally) {\n trace.setGlobalTraceManager(mxlTraceManager);\n tracerProvider.register({\n // WebTracerProvider.register has different fallback behaviours depending on whether null or undefined is passed,\n // be more explicit here and always supply a StackContextManager if the config did not specify one. If a user really\n // wants to turn off context management they can pass a no-op manager explicitly:\n // https://github.com/open-telemetry/opentelemetry-js/blob/4f0b6285af24b71a9fa022755aaa3b6a63ae5033/packages/opentelemetry-sdk-trace-web/src/WebTracerProvider.ts#L39\n contextManager: contextManager || new StackContextManager(),\n propagator,\n });\n }\n\n return { tracerProvider, mxlTraceManager };\n};\n\nconst setupLogs = ({\n resource,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n }: SetupLogsArgs) => {\n const finalLogProcessors: LogRecordProcessor[] = [\n ...logProcessors,\n new IdentifiableSessionLogRecordProcessor({\n spanSessionManager,\n }),\n new BrowserLogRecordProcessor(),\n new MXLLogRecordProcessor(),\n new UserLogRecordProcessor({ userManager }),\n new LogRecordScrubProcessor({ attributeScrubbers }),\n new PageLogRecordProcessor({ pageManager }),\n ];\n\n logExporters?.forEach((exporter) => {\n finalLogProcessors.push(new BatchLogRecordProcessor(exporter));\n });\n\n if (mxlLogProcessor) {\n finalLogProcessors.push(mxlLogProcessor);\n }\n\n const loggerProvider = new LoggerProvider({\n resource,\n processors: finalLogProcessors,\n });\n\n const mxlLogManager = new MXLLogManager({\n spanSessionManager,\n limitManager,\n loggerProvider: registerGlobally ? undefined : loggerProvider,\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n logs.setGlobalLoggerProvider(loggerProvider);\n log.setGlobalLogManager(mxlLogManager);\n }\n\n return { loggerProvider, mxlLogManager };\n};\n\nconst setupPage = ({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n }: SetupPageArgs) => {\n const mxlPageManager = new MXLPageManager({\n useDocumentTitleAsPageLabel,\n });\n\n if (registerGlobally) {\n page.setGlobalPageManager(mxlPageManager);\n }\n\n return mxlPageManager;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"initSDK.cjs","names":["DiagLogLevel","diag","registry","DiagConsoleLogger","OTelPerformanceManager","validateAppID","validateAppVersion","NamespacedStorage","getWebSDKResource","MXLDynamicConfigManager","MXLSDKFeaturesManager","nsfConfigValidation","MXLLimitManager","DEFAULT_LIMITS","getDefaultAttributeScrubbers","MXLSessionBatchedSpanProcessor","MXLTraceExporter","BatchLogRecordProcessor","MXLLogExporter","MXLW3CTraceContextPropagator","setupDefaultInstrumentations","createSessionRecordingControl","noopSessionRecording","MXLUserManager","MXLSpanSessionManager","BrowserSpanProcessor","MXLNetworkSpanProcessor","UserSpanProcessor","PageSpanProcessor","SpanScrubProcessor","BatchSpanProcessor","WebTracerProvider","MXLTraceManager","StackContextManager","IdentifiableSessionLogRecordProcessor","BrowserLogRecordProcessor","MXLLogRecordProcessor","UserLogRecordProcessor","LogRecordScrubProcessor","PageLogRecordProcessor","LoggerProvider","MXLLogManager","MXLPageManager"],"sources":["../../src/sdk/initSDK.ts"],"sourcesContent":["import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { emptyResource } from '@opentelemetry/resources';\nimport type { LogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-web';\nimport {\n BatchSpanProcessor,\n StackContextManager,\n WebTracerProvider,\n} from '@opentelemetry/sdk-trace-web';\nimport { createSessionSpanProcessor } from '@opentelemetry/web-common';\nimport { log } from '../api-logs/index.ts';\nimport { page } from '../api-page/index.ts';\nimport { session } from '../api-sessions/index.ts';\nimport { trace } from '../api-traces/index.ts';\nimport { user } from '../api-users/index.ts';\nimport type { AttributeScrubber } from '../common/index.ts';\nimport { MXLLogExporter, MXLTraceExporter } from '../exporters/index.ts';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers/index.ts';\nimport {\n BrowserLogRecordProcessor,\n BrowserSpanProcessor,\n IdentifiableSessionLogRecordProcessor,\n LogRecordScrubProcessor,\n MXLLogRecordProcessor,\n MXLNetworkSpanProcessor,\n MXLSessionBatchedSpanProcessor,\n PageLogRecordProcessor,\n PageSpanProcessor,\n SpanScrubProcessor,\n UserLogRecordProcessor,\n UserSpanProcessor,\n} from '../processors/index.ts';\nimport { MXLW3CTraceContextPropagator } from '../propagators/index.ts';\nimport { getWebSDKResource } from '../resources/index.ts';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils/index.ts';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers.ts';\nimport { registry } from './registry.ts';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations.ts';\nimport {\n createSessionRecordingControl,\n noopSessionRecording,\n} from './setupSessionRecorder.ts';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types.ts';\nimport { validateAppID, validateAppVersion } from './utils.ts';\n\nexport const initSDK = (\n {\n appID,\n appVersion,\n resource = emptyResource(),\n spanExporters = [],\n logExporters = [],\n spanProcessors = [],\n propagator = null,\n defaultInstrumentationConfig,\n instrumentations = [],\n contextManager = null,\n logProcessors = [],\n attributeScrubbers = [],\n enableDefaultAttributeScrubbing = true,\n additionalQueryParamsToScrub = [],\n logLevel = DiagLogLevel.ERROR,\n mxlDataURL,\n mxlConfigURL,\n diagLogger = diag.createComponentLogger({\n namespace: 'mxl-sdk',\n }),\n dynamicSDKConfigManager: providedDynamicSDKConfigManager,\n dynamicSDKConfig,\n registerGlobally = true,\n blockNetworkSpanForwarding = false,\n restrictedProtocols = new Set(['file:']),\n useDocumentTitleAsPageLabel = true,\n recordUserSessions = true,\n sessionRecorder,\n }: SDKInitConfig = {} as SDKInitConfig,\n): SDKControl | false => {\n try {\n if (registerGlobally) {\n const existingSDK = registry.registered();\n if (existingSDK !== null) {\n diagLogger.warn(\n 'SDK has already been successfully initialized, skipping this invocation of initSDK',\n );\n return existingSDK;\n }\n }\n\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel,\n });\n\n if (typeof window === 'undefined') {\n diagLogger.warn('browser not detected, skipping initialization');\n return false;\n }\n\n const perf = new OTelPerformanceManager();\n const initSDKStart = perf.getNowMillis();\n const validatedAppID = validateAppID(appID);\n const validatedAppVersion = validateAppVersion(appVersion);\n\n const sendingToMXL = validatedAppID !== undefined;\n\n if (!sendingToMXL && !logExporters.length && !spanExporters.length) {\n throw new Error(\n 'when appID is omitted, at least one logExporter or spanExporter must be set',\n );\n }\n\n if (restrictedProtocols.has(window.location.protocol)) {\n throw new Error(\n `not initializing due to restricted protocol: ${window.location.protocol}`,\n );\n }\n\n if (sendingToMXL && typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not supported in this browser and required for data compression.',\n );\n }\n\n const useNamespace = !registerGlobally && appID;\n const sdkLocalStorage = useNamespace\n ? new NamespacedStorage(appID, window.localStorage)\n : window.localStorage;\n const sdkSessionStorage = useNamespace\n ? new NamespacedStorage(appID, window.sessionStorage)\n : window.sessionStorage;\n\n const resourceWithWebSDKAttributes = resource.merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\n\n const userManager = setupUser({ registerGlobally, sdkLocalStorage });\n const enduserPseudoID = userManager.getMXLUserId();\n if (sendingToMXL && !enduserPseudoID) {\n throw new Error('userID is required when using MXL exporter');\n }\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicSDKConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const sdkFeaturesManager = new MXLSDKFeaturesManager({\n dynamicConfigManager,\n deviceId: enduserPseudoID,\n blockNetworkSpanForwarding,\n });\n\n if (!sdkFeaturesManager.isSDKEnabled()) {\n diagLogger.debug('SDK is disabled, skipping initialization.');\n\n return false;\n }\n\n const nsfValid = nsfConfigValidation({\n featureManager: sdkFeaturesManager,\n diag: diagLogger,\n registerGlobally,\n defaultInstrumentationConfig,\n propagator,\n });\n\n const limitManager = new MXLLimitManager(DEFAULT_LIMITS);\n\n const finalAttributeScrubbers: AttributeScrubber[] = [\n ...(enableDefaultAttributeScrubbing\n ? getDefaultAttributeScrubbers(additionalQueryParamsToScrub)\n : []),\n ...attributeScrubbers,\n ];\n\n const spanSessionManager = setupSession({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n });\n\n let mxlSpanProcessor: MXLSessionBatchedSpanProcessor | undefined;\n let mxlLogProcessor: BatchLogRecordProcessor | undefined;\n if (sendingToMXL) {\n mxlSpanProcessor = new MXLSessionBatchedSpanProcessor({\n resource: resourceWithWebSDKAttributes,\n exporter: new MXLTraceExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n limitManager,\n storedSpansExpireTimeoutMS:\n defaultInstrumentationConfig?.['session-visibility']\n ?.storedSpansExpireTimeoutMS,\n storage: sdkLocalStorage,\n spanSessionManager,\n });\n\n mxlLogProcessor = new BatchLogRecordProcessor(\n new MXLLogExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n );\n }\n\n const pageManager = setupPage({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n });\n\n const { tracerProvider, mxlTraceManager } = setupTraces({\n resource: resourceWithWebSDKAttributes,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors,\n propagator: nsfValid ? new MXLW3CTraceContextPropagator() : propagator,\n contextManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n });\n\n spanSessionManager.setTracerProvider(tracerProvider);\n\n const { loggerProvider, mxlLogManager } = setupLogs({\n resource: resourceWithWebSDKAttributes,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n });\n\n // NOTE: we require setupInstrumentation to run the last, after setupLogs and setupTraces. This is how OTel works wrt\n // the dependencies between instrumentations and global providers. We need the providers for tracers, and logs to be\n // setup before we enable instrumentations.\n if (!registerGlobally) {\n registerInstrumentations({\n tracerProvider,\n loggerProvider,\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n logManager: mxlLogManager,\n spanSessionManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n }\n\n const windowDisableSessionRec =\n typeof window !== 'undefined' &&\n (window as unknown as { __MXL_DISABLE_SESSION_RECORDER?: boolean })\n .__MXL_DISABLE_SESSION_RECORDER === true;\n\n const sessionRecording =\n sendingToMXL &&\n validatedAppID &&\n enduserPseudoID &&\n !windowDisableSessionRec\n ? createSessionRecordingControl({\n resource: resourceWithWebSDKAttributes,\n spanSessionManager,\n tracerProvider,\n appID: validatedAppID,\n userID: enduserPseudoID,\n mxlDataURL,\n recordUserSessions,\n sessionRecorder,\n })\n : noopSessionRecording;\n\n diagLogger.info('successfully initialized the SDK');\n\n const sdkControl: SDKControl = {\n setDynamicConfig: (config: Partial<DynamicSDKConfig>) => {\n dynamicConfigManager.setConfig(config);\n },\n flush: async () => {\n await tracerProvider.forceFlush();\n await loggerProvider.forceFlush();\n },\n log: mxlLogManager,\n trace: mxlTraceManager,\n session: spanSessionManager,\n user: userManager,\n page: pageManager,\n sessionRecording,\n };\n\n if (registerGlobally) {\n registry.register(sdkControl);\n }\n\n spanSessionManager.recordSDKStartupDuration(\n perf.getNowMillis() - initSDKStart,\n );\n\n return sdkControl;\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Unknown error.';\n diagLogger.error(`failed to initialize the SDK: ${message}`);\n return false;\n }\n};\n\nconst setupUser = ({ registerGlobally, sdkLocalStorage }: SetupUserArgs) => {\n const mxlUserManager = new MXLUserManager({\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n user.setGlobalUserManager(mxlUserManager);\n }\n\n return mxlUserManager;\n};\n\nconst setupSession = ({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n}: SetupSessionArgs) => {\n const mxlSpanSessionManager = new MXLSpanSessionManager({\n limitManager,\n storage: sdkLocalStorage,\n sessionStorage: sdkSessionStorage,\n });\n\n if (registerGlobally) {\n session.setGlobalSessionManager(mxlSpanSessionManager);\n }\n\n return mxlSpanSessionManager;\n};\n\nconst setupTraces = ({\n resource,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors = [],\n propagator = null,\n contextManager = null,\n attributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n}: SetupTracesArgs) => {\n const finalSpanProcessors: SpanProcessor[] = [\n ...spanProcessors,\n createSessionSpanProcessor(spanSessionManager),\n new BrowserSpanProcessor(),\n new MXLNetworkSpanProcessor(),\n new UserSpanProcessor({ userManager }),\n new PageSpanProcessor({ pageManager }),\n new SpanScrubProcessor({ attributeScrubbers }),\n ];\n\n spanExporters?.forEach((exporter) => {\n finalSpanProcessors.push(new BatchSpanProcessor(exporter));\n });\n\n if (mxlSpanProcessor) {\n finalSpanProcessors.push(mxlSpanProcessor);\n }\n\n const tracerProvider = new WebTracerProvider({\n resource,\n spanProcessors: finalSpanProcessors,\n spanLimits: {\n // Session properties are stored as attributes on the session span, add a\n // buffer here so that there is room for our internal attributes\n attributeCountLimit: DEFAULT_LIMITS.maxAllowed.session_property * 2,\n attributePerEventCountLimit: 20,\n // Breadcrumbs are stored as events on the session span, add a\n // buffer here so that there is room for our internal events\n eventCountLimit: DEFAULT_LIMITS.maxAllowed.breadcrumb * 2,\n attributeValueLengthLimit: 1024,\n },\n });\n\n const mxlTraceManager = new MXLTraceManager({\n tracerProvider: registerGlobally ? undefined : tracerProvider,\n });\n\n if (registerGlobally) {\n trace.setGlobalTraceManager(mxlTraceManager);\n tracerProvider.register({\n // WebTracerProvider.register has different fallback behaviours depending on whether null or undefined is passed,\n // be more explicit here and always supply a StackContextManager if the config did not specify one. If a user really\n // wants to turn off context management they can pass a no-op manager explicitly:\n // https://github.com/open-telemetry/opentelemetry-js/blob/4f0b6285af24b71a9fa022755aaa3b6a63ae5033/packages/opentelemetry-sdk-trace-web/src/WebTracerProvider.ts#L39\n contextManager: contextManager || new StackContextManager(),\n propagator,\n });\n }\n\n return { tracerProvider, mxlTraceManager };\n};\n\nconst setupLogs = ({\n resource,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n}: SetupLogsArgs) => {\n const finalLogProcessors: LogRecordProcessor[] = [\n ...logProcessors,\n new IdentifiableSessionLogRecordProcessor({\n spanSessionManager,\n }),\n new BrowserLogRecordProcessor(),\n new MXLLogRecordProcessor(),\n new UserLogRecordProcessor({ userManager }),\n new LogRecordScrubProcessor({ attributeScrubbers }),\n new PageLogRecordProcessor({ pageManager }),\n ];\n\n logExporters?.forEach((exporter) => {\n finalLogProcessors.push(new BatchLogRecordProcessor(exporter));\n });\n\n if (mxlLogProcessor) {\n finalLogProcessors.push(mxlLogProcessor);\n }\n\n const loggerProvider = new LoggerProvider({\n resource,\n processors: finalLogProcessors,\n });\n\n const mxlLogManager = new MXLLogManager({\n spanSessionManager,\n limitManager,\n loggerProvider: registerGlobally ? undefined : loggerProvider,\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n logs.setGlobalLoggerProvider(loggerProvider);\n log.setGlobalLogManager(mxlLogManager);\n }\n\n return { loggerProvider, mxlLogManager };\n};\n\nconst setupPage = ({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n}: SetupPageArgs) => {\n const mxlPageManager = new MXLPageManager({\n useDocumentTitleAsPageLabel,\n });\n\n if (registerGlobally) {\n page.setGlobalPageManager(mxlPageManager);\n }\n\n return mxlPageManager;\n};\n"],"mappings":"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"}
@@ -25,7 +25,9 @@ declare const initSDK: ({
25
25
  registerGlobally,
26
26
  blockNetworkSpanForwarding,
27
27
  restrictedProtocols,
28
- useDocumentTitleAsPageLabel
28
+ useDocumentTitleAsPageLabel,
29
+ recordUserSessions,
30
+ sessionRecorder
29
31
  }?: SDKInitConfig) => SDKControl | false;
30
32
  //#endregion
31
33
  export { initSDK };
@@ -1 +1 @@
1
- {"version":3,"file":"initSDK.d.cts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;cAyEa,OAAA;EACX,KAAA;EAAA,UAAA;EAAA,QAAA;EAAA,aAAA;EAAA,YAAA;EAAA,cAAA;EAAA,UAAA;EAAA,4BAAA;EAAA,gBAAA;EAAA,cAAA;EAAA,aAAA;EAAA,kBAAA;EAAA,+BAAA;EAAA,4BAAA;EAAA,QAAA;EAAA,UAAA;EAAA,YAAA;EAAA,UAAA;EAAA,uBAAA,EAAA,+BAAA;EAAA,gBAAA;EAAA,gBAAA;EAAA,0BAAA;EAAA,mBAAA;EAAA;AAAA,IA2BG,aAAA,KACF,UAAA"}
1
+ {"version":3,"file":"initSDK.d.cts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;cA0Ea,OAAA;EACX,KAAA;EAAA,UAAA;EAAA,QAAA;EAAA,aAAA;EAAA,YAAA;EAAA,cAAA;EAAA,UAAA;EAAA,4BAAA;EAAA,gBAAA;EAAA,cAAA;EAAA,aAAA;EAAA,kBAAA;EAAA,+BAAA;EAAA,4BAAA;EAAA,QAAA;EAAA,UAAA;EAAA,YAAA;EAAA,UAAA;EAAA,uBAAA,EAAA,+BAAA;EAAA,gBAAA;EAAA,gBAAA;EAAA,0BAAA;EAAA,mBAAA;EAAA,2BAAA;EAAA,kBAAA;EAAA;AAAA,IA6BG,aAAA,KACF,UAAA"}
@@ -25,7 +25,9 @@ declare const initSDK: ({
25
25
  registerGlobally,
26
26
  blockNetworkSpanForwarding,
27
27
  restrictedProtocols,
28
- useDocumentTitleAsPageLabel
28
+ useDocumentTitleAsPageLabel,
29
+ recordUserSessions,
30
+ sessionRecorder
29
31
  }?: SDKInitConfig) => SDKControl | false;
30
32
  //#endregion
31
33
  export { initSDK };
@@ -1 +1 @@
1
- {"version":3,"file":"initSDK.d.ts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;cAyEa,OAAA;EACX,KAAA;EAAA,UAAA;EAAA,QAAA;EAAA,aAAA;EAAA,YAAA;EAAA,cAAA;EAAA,UAAA;EAAA,4BAAA;EAAA,gBAAA;EAAA,cAAA;EAAA,aAAA;EAAA,kBAAA;EAAA,+BAAA;EAAA,4BAAA;EAAA,QAAA;EAAA,UAAA;EAAA,YAAA;EAAA,UAAA;EAAA,uBAAA,EAAA,+BAAA;EAAA,gBAAA;EAAA,gBAAA;EAAA,0BAAA;EAAA,mBAAA;EAAA;AAAA,IA2BG,aAAA,KACF,UAAA"}
1
+ {"version":3,"file":"initSDK.d.ts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;cA0Ea,OAAA;EACX,KAAA;EAAA,UAAA;EAAA,QAAA;EAAA,aAAA;EAAA,YAAA;EAAA,cAAA;EAAA,UAAA;EAAA,4BAAA;EAAA,gBAAA;EAAA,cAAA;EAAA,aAAA;EAAA,kBAAA;EAAA,+BAAA;EAAA,4BAAA;EAAA,QAAA;EAAA,UAAA;EAAA,YAAA;EAAA,UAAA;EAAA,uBAAA,EAAA,+BAAA;EAAA,gBAAA;EAAA,gBAAA;EAAA,0BAAA;EAAA,mBAAA;EAAA,2BAAA;EAAA,kBAAA;EAAA;AAAA,IA6BG,aAAA,KACF,UAAA"}
@@ -34,6 +34,7 @@ import { MXLW3CTraceContextPropagator } from "../propagators/MXLW3CTraceContextP
34
34
  import { getDefaultAttributeScrubbers } from "./defaultAttributeScrubbers.js";
35
35
  import { registry } from "./registry.js";
36
36
  import { setupDefaultInstrumentations } from "./setupDefaultInstrumentations.js";
37
+ import { createSessionRecordingControl, noopSessionRecording } from "./setupSessionRecorder.js";
37
38
  import { validateAppID, validateAppVersion } from "./utils.js";
38
39
  import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api";
39
40
  import { emptyResource } from "@opentelemetry/resources";
@@ -44,7 +45,7 @@ import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs
44
45
  import { createSessionSpanProcessor } from "@opentelemetry/web-common";
45
46
 
46
47
  //#region src/sdk/initSDK.ts
47
- const initSDK = ({ appID, appVersion, resource = emptyResource(), spanExporters = [], logExporters = [], spanProcessors = [], propagator = null, defaultInstrumentationConfig, instrumentations = [], contextManager = null, logProcessors = [], attributeScrubbers = [], enableDefaultAttributeScrubbing = true, additionalQueryParamsToScrub = [], logLevel = DiagLogLevel.ERROR, mxlDataURL, mxlConfigURL, diagLogger = diag.createComponentLogger({ namespace: "mxl-sdk" }), dynamicSDKConfigManager: providedDynamicSDKConfigManager, dynamicSDKConfig, registerGlobally = true, blockNetworkSpanForwarding = false, restrictedProtocols = new Set(["file:"]), useDocumentTitleAsPageLabel = true } = {}) => {
48
+ const initSDK = ({ appID, appVersion, resource = emptyResource(), spanExporters = [], logExporters = [], spanProcessors = [], propagator = null, defaultInstrumentationConfig, instrumentations = [], contextManager = null, logProcessors = [], attributeScrubbers = [], enableDefaultAttributeScrubbing = true, additionalQueryParamsToScrub = [], logLevel = DiagLogLevel.ERROR, mxlDataURL, mxlConfigURL, diagLogger = diag.createComponentLogger({ namespace: "mxl-sdk" }), dynamicSDKConfigManager: providedDynamicSDKConfigManager, dynamicSDKConfig, registerGlobally = true, blockNetworkSpanForwarding = false, restrictedProtocols = new Set(["file:"]), useDocumentTitleAsPageLabel = true, recordUserSessions = true, sessionRecorder } = {}) => {
48
49
  try {
49
50
  if (registerGlobally) {
50
51
  const existingSDK = registry.registered();
@@ -181,6 +182,17 @@ const initSDK = ({ appID, appVersion, resource = emptyResource(), spanExporters
181
182
  mxlSpanProcessor,
182
183
  pageManager
183
184
  }), ...instrumentations] });
185
+ const windowDisableSessionRec = typeof window !== "undefined" && window.__MXL_DISABLE_SESSION_RECORDER === true;
186
+ const sessionRecording = sendingToMXL && validatedAppID && enduserPseudoID && !windowDisableSessionRec ? createSessionRecordingControl({
187
+ resource: resourceWithWebSDKAttributes,
188
+ spanSessionManager,
189
+ tracerProvider,
190
+ appID: validatedAppID,
191
+ userID: enduserPseudoID,
192
+ mxlDataURL,
193
+ recordUserSessions,
194
+ sessionRecorder
195
+ }) : noopSessionRecording;
184
196
  diagLogger.info("successfully initialized the SDK");
185
197
  const sdkControl = {
186
198
  setDynamicConfig: (config) => {
@@ -194,7 +206,8 @@ const initSDK = ({ appID, appVersion, resource = emptyResource(), spanExporters
194
206
  trace: mxlTraceManager,
195
207
  session: spanSessionManager,
196
208
  user: userManager,
197
- page: pageManager
209
+ page: pageManager,
210
+ sessionRecording
198
211
  };
199
212
  if (registerGlobally) registry.register(sdkControl);
200
213
  spanSessionManager.recordSDKStartupDuration(perf.getNowMillis() - initSDKStart);
@@ -1 +1 @@
1
- {"version":3,"file":"initSDK.js","names":[],"sources":["../../src/sdk/initSDK.ts"],"sourcesContent":["import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { emptyResource } from '@opentelemetry/resources';\nimport type { LogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-web';\nimport {\n BatchSpanProcessor,\n StackContextManager,\n WebTracerProvider,\n} from '@opentelemetry/sdk-trace-web';\nimport { createSessionSpanProcessor } from '@opentelemetry/web-common';\nimport { log } from '../api-logs/index.ts';\nimport { page } from '../api-page/index.ts';\nimport { session } from '../api-sessions/index.ts';\nimport { trace } from '../api-traces/index.ts';\nimport { user } from '../api-users/index.ts';\nimport type { AttributeScrubber } from '../common/index.ts';\nimport {\n MXLLogExporter,\n MXLTraceExporter,\n} from '../exporters/index.ts';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers/index.ts';\nimport {\n BrowserLogRecordProcessor,\n BrowserSpanProcessor,\n MXLLogRecordProcessor,\n MXLNetworkSpanProcessor,\n MXLSessionBatchedSpanProcessor,\n IdentifiableSessionLogRecordProcessor,\n LogRecordScrubProcessor,\n PageLogRecordProcessor,\n PageSpanProcessor,\n SpanScrubProcessor,\n UserLogRecordProcessor,\n UserSpanProcessor,\n} from '../processors/index.ts';\nimport { MXLW3CTraceContextPropagator } from '../propagators/index.ts';\nimport { getWebSDKResource } from '../resources/index.ts';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils/index.ts';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers.ts';\nimport { registry } from './registry.ts';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations.ts';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types.ts';\nimport { validateAppID, validateAppVersion } from './utils.ts';\n\nexport const initSDK = (\n {\n appID,\n appVersion,\n resource = emptyResource(),\n spanExporters = [],\n logExporters = [],\n spanProcessors = [],\n propagator = null,\n defaultInstrumentationConfig,\n instrumentations = [],\n contextManager = null,\n logProcessors = [],\n attributeScrubbers = [],\n enableDefaultAttributeScrubbing = true,\n additionalQueryParamsToScrub = [],\n logLevel = DiagLogLevel.ERROR,\n mxlDataURL,\n mxlConfigURL,\n diagLogger = diag.createComponentLogger({\n namespace: 'mxl-sdk',\n }),\n dynamicSDKConfigManager: providedDynamicSDKConfigManager,\n dynamicSDKConfig,\n registerGlobally = true,\n blockNetworkSpanForwarding = false,\n restrictedProtocols = new Set(['file:']),\n useDocumentTitleAsPageLabel = true,\n }: SDKInitConfig = {} as SDKInitConfig,\n): SDKControl | false => {\n try {\n if (registerGlobally) {\n const existingSDK = registry.registered();\n if (existingSDK !== null) {\n diagLogger.warn(\n 'SDK has already been successfully initialized, skipping this invocation of initSDK',\n );\n return existingSDK;\n }\n }\n\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel,\n });\n\n if (typeof window === 'undefined') {\n diagLogger.warn('browser not detected, skipping initialization');\n return false;\n }\n\n const perf = new OTelPerformanceManager();\n const initSDKStart = perf.getNowMillis();\n const validatedAppID = validateAppID(appID);\n const validatedAppVersion = validateAppVersion(appVersion);\n\n const sendingToMXL = validatedAppID !== undefined;\n\n if (!sendingToMXL && !logExporters.length && !spanExporters.length) {\n throw new Error(\n 'when appID is omitted, at least one logExporter or spanExporter must be set',\n );\n }\n\n if (restrictedProtocols.has(window.location.protocol)) {\n throw new Error(\n `not initializing due to restricted protocol: ${window.location.protocol}`,\n );\n }\n\n if (sendingToMXL && typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not supported in this browser and required for data compression.',\n );\n }\n\n const useNamespace = !registerGlobally && appID;\n const sdkLocalStorage = useNamespace\n ? new NamespacedStorage(appID, window.localStorage)\n : window.localStorage;\n const sdkSessionStorage = useNamespace\n ? new NamespacedStorage(appID, window.sessionStorage)\n : window.sessionStorage;\n\n const resourceWithWebSDKAttributes = resource.merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\n\n const userManager = setupUser({ registerGlobally, sdkLocalStorage });\n const enduserPseudoID = userManager.getMXLUserId();\n if (sendingToMXL && !enduserPseudoID) {\n throw new Error('userID is required when using MXL exporter');\n }\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicSDKConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const sdkFeaturesManager = new MXLSDKFeaturesManager({\n dynamicConfigManager,\n deviceId: enduserPseudoID,\n blockNetworkSpanForwarding,\n });\n\n if (!sdkFeaturesManager.isSDKEnabled()) {\n diagLogger.debug('SDK is disabled, skipping initialization.');\n\n return false;\n }\n\n const nsfValid = nsfConfigValidation({\n featureManager: sdkFeaturesManager,\n diag: diagLogger,\n registerGlobally,\n defaultInstrumentationConfig,\n propagator,\n });\n\n const limitManager = new MXLLimitManager(DEFAULT_LIMITS);\n\n const finalAttributeScrubbers: AttributeScrubber[] = [\n ...(enableDefaultAttributeScrubbing\n ? getDefaultAttributeScrubbers(additionalQueryParamsToScrub)\n : []),\n ...attributeScrubbers,\n ];\n\n const spanSessionManager = setupSession({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n });\n\n let mxlSpanProcessor: MXLSessionBatchedSpanProcessor | undefined;\n let mxlLogProcessor: BatchLogRecordProcessor | undefined;\n if (sendingToMXL) {\n mxlSpanProcessor = new MXLSessionBatchedSpanProcessor({\n resource: resourceWithWebSDKAttributes,\n exporter: new MXLTraceExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n limitManager,\n storedSpansExpireTimeoutMS:\n defaultInstrumentationConfig?.['session-visibility']\n ?.storedSpansExpireTimeoutMS,\n storage: sdkLocalStorage,\n spanSessionManager,\n });\n\n mxlLogProcessor = new BatchLogRecordProcessor(\n new MXLLogExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n );\n }\n\n const pageManager = setupPage({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n });\n\n const { tracerProvider, mxlTraceManager } = setupTraces({\n resource: resourceWithWebSDKAttributes,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors,\n propagator: nsfValid\n ? new MXLW3CTraceContextPropagator()\n : propagator,\n contextManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n });\n\n spanSessionManager.setTracerProvider(tracerProvider);\n\n const { loggerProvider, mxlLogManager } = setupLogs({\n resource: resourceWithWebSDKAttributes,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n });\n\n // NOTE: we require setupInstrumentation to run the last, after setupLogs and setupTraces. This is how OTel works wrt\n // the dependencies between instrumentations and global providers. We need the providers for tracers, and logs to be\n // setup before we enable instrumentations.\n if (!registerGlobally) {\n registerInstrumentations({\n tracerProvider,\n loggerProvider,\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n logManager: mxlLogManager,\n spanSessionManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n }\n\n diagLogger.info('successfully initialized the SDK');\n\n const sdkControl: SDKControl = {\n setDynamicConfig: (config: Partial<DynamicSDKConfig>) => {\n dynamicConfigManager.setConfig(config);\n },\n flush: async () => {\n await tracerProvider.forceFlush();\n await loggerProvider.forceFlush();\n },\n log: mxlLogManager,\n trace: mxlTraceManager,\n session: spanSessionManager,\n user: userManager,\n page: pageManager,\n };\n\n if (registerGlobally) {\n registry.register(sdkControl);\n }\n\n spanSessionManager.recordSDKStartupDuration(\n perf.getNowMillis() - initSDKStart,\n );\n\n return sdkControl;\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Unknown error.';\n diagLogger.error(`failed to initialize the SDK: ${message}`);\n return false;\n }\n};\n\nconst setupUser = ({ registerGlobally, sdkLocalStorage }: SetupUserArgs) => {\n const mxlUserManager = new MXLUserManager({\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n user.setGlobalUserManager(mxlUserManager);\n }\n\n return mxlUserManager;\n};\n\nconst setupSession = ({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n }: SetupSessionArgs) => {\n const mxlSpanSessionManager = new MXLSpanSessionManager({\n limitManager,\n storage: sdkLocalStorage,\n sessionStorage: sdkSessionStorage,\n });\n\n if (registerGlobally) {\n session.setGlobalSessionManager(mxlSpanSessionManager);\n }\n\n return mxlSpanSessionManager;\n};\n\nconst setupTraces = ({\n resource,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors = [],\n propagator = null,\n contextManager = null,\n attributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n }: SetupTracesArgs) => {\n const finalSpanProcessors: SpanProcessor[] = [\n ...spanProcessors,\n createSessionSpanProcessor(spanSessionManager),\n new BrowserSpanProcessor(),\n new MXLNetworkSpanProcessor(),\n new UserSpanProcessor({ userManager }),\n new PageSpanProcessor({ pageManager }),\n new SpanScrubProcessor({ attributeScrubbers }),\n ];\n\n spanExporters?.forEach((exporter) => {\n finalSpanProcessors.push(new BatchSpanProcessor(exporter));\n });\n\n if (mxlSpanProcessor) {\n finalSpanProcessors.push(mxlSpanProcessor);\n }\n\n const tracerProvider = new WebTracerProvider({\n resource,\n spanProcessors: finalSpanProcessors,\n spanLimits: {\n // Session properties are stored as attributes on the session span, add a\n // buffer here so that there is room for our internal attributes\n attributeCountLimit: DEFAULT_LIMITS.maxAllowed.session_property * 2,\n attributePerEventCountLimit: 20,\n // Breadcrumbs are stored as events on the session span, add a\n // buffer here so that there is room for our internal events\n eventCountLimit: DEFAULT_LIMITS.maxAllowed.breadcrumb * 2,\n attributeValueLengthLimit: 1024,\n },\n });\n\n const mxlTraceManager = new MXLTraceManager({\n tracerProvider: registerGlobally ? undefined : tracerProvider,\n });\n\n if (registerGlobally) {\n trace.setGlobalTraceManager(mxlTraceManager);\n tracerProvider.register({\n // WebTracerProvider.register has different fallback behaviours depending on whether null or undefined is passed,\n // be more explicit here and always supply a StackContextManager if the config did not specify one. If a user really\n // wants to turn off context management they can pass a no-op manager explicitly:\n // https://github.com/open-telemetry/opentelemetry-js/blob/4f0b6285af24b71a9fa022755aaa3b6a63ae5033/packages/opentelemetry-sdk-trace-web/src/WebTracerProvider.ts#L39\n contextManager: contextManager || new StackContextManager(),\n propagator,\n });\n }\n\n return { tracerProvider, mxlTraceManager };\n};\n\nconst setupLogs = ({\n resource,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n }: SetupLogsArgs) => {\n const finalLogProcessors: LogRecordProcessor[] = [\n ...logProcessors,\n new IdentifiableSessionLogRecordProcessor({\n spanSessionManager,\n }),\n new BrowserLogRecordProcessor(),\n new MXLLogRecordProcessor(),\n new UserLogRecordProcessor({ userManager }),\n new LogRecordScrubProcessor({ attributeScrubbers }),\n new PageLogRecordProcessor({ pageManager }),\n ];\n\n logExporters?.forEach((exporter) => {\n finalLogProcessors.push(new BatchLogRecordProcessor(exporter));\n });\n\n if (mxlLogProcessor) {\n finalLogProcessors.push(mxlLogProcessor);\n }\n\n const loggerProvider = new LoggerProvider({\n resource,\n processors: finalLogProcessors,\n });\n\n const mxlLogManager = new MXLLogManager({\n spanSessionManager,\n limitManager,\n loggerProvider: registerGlobally ? undefined : loggerProvider,\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n logs.setGlobalLoggerProvider(loggerProvider);\n log.setGlobalLogManager(mxlLogManager);\n }\n\n return { loggerProvider, mxlLogManager };\n};\n\nconst setupPage = ({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n }: SetupPageArgs) => {\n const mxlPageManager = new MXLPageManager({\n useDocumentTitleAsPageLabel,\n });\n\n if (registerGlobally) {\n page.setGlobalPageManager(mxlPageManager);\n }\n\n return mxlPageManager;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"initSDK.js","names":[],"sources":["../../src/sdk/initSDK.ts"],"sourcesContent":["import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { emptyResource } from '@opentelemetry/resources';\nimport type { LogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-web';\nimport {\n BatchSpanProcessor,\n StackContextManager,\n WebTracerProvider,\n} from '@opentelemetry/sdk-trace-web';\nimport { createSessionSpanProcessor } from '@opentelemetry/web-common';\nimport { log } from '../api-logs/index.ts';\nimport { page } from '../api-page/index.ts';\nimport { session } from '../api-sessions/index.ts';\nimport { trace } from '../api-traces/index.ts';\nimport { user } from '../api-users/index.ts';\nimport type { AttributeScrubber } from '../common/index.ts';\nimport { MXLLogExporter, MXLTraceExporter } from '../exporters/index.ts';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers/index.ts';\nimport {\n BrowserLogRecordProcessor,\n BrowserSpanProcessor,\n IdentifiableSessionLogRecordProcessor,\n LogRecordScrubProcessor,\n MXLLogRecordProcessor,\n MXLNetworkSpanProcessor,\n MXLSessionBatchedSpanProcessor,\n PageLogRecordProcessor,\n PageSpanProcessor,\n SpanScrubProcessor,\n UserLogRecordProcessor,\n UserSpanProcessor,\n} from '../processors/index.ts';\nimport { MXLW3CTraceContextPropagator } from '../propagators/index.ts';\nimport { getWebSDKResource } from '../resources/index.ts';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils/index.ts';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers.ts';\nimport { registry } from './registry.ts';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations.ts';\nimport {\n createSessionRecordingControl,\n noopSessionRecording,\n} from './setupSessionRecorder.ts';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types.ts';\nimport { validateAppID, validateAppVersion } from './utils.ts';\n\nexport const initSDK = (\n {\n appID,\n appVersion,\n resource = emptyResource(),\n spanExporters = [],\n logExporters = [],\n spanProcessors = [],\n propagator = null,\n defaultInstrumentationConfig,\n instrumentations = [],\n contextManager = null,\n logProcessors = [],\n attributeScrubbers = [],\n enableDefaultAttributeScrubbing = true,\n additionalQueryParamsToScrub = [],\n logLevel = DiagLogLevel.ERROR,\n mxlDataURL,\n mxlConfigURL,\n diagLogger = diag.createComponentLogger({\n namespace: 'mxl-sdk',\n }),\n dynamicSDKConfigManager: providedDynamicSDKConfigManager,\n dynamicSDKConfig,\n registerGlobally = true,\n blockNetworkSpanForwarding = false,\n restrictedProtocols = new Set(['file:']),\n useDocumentTitleAsPageLabel = true,\n recordUserSessions = true,\n sessionRecorder,\n }: SDKInitConfig = {} as SDKInitConfig,\n): SDKControl | false => {\n try {\n if (registerGlobally) {\n const existingSDK = registry.registered();\n if (existingSDK !== null) {\n diagLogger.warn(\n 'SDK has already been successfully initialized, skipping this invocation of initSDK',\n );\n return existingSDK;\n }\n }\n\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel,\n });\n\n if (typeof window === 'undefined') {\n diagLogger.warn('browser not detected, skipping initialization');\n return false;\n }\n\n const perf = new OTelPerformanceManager();\n const initSDKStart = perf.getNowMillis();\n const validatedAppID = validateAppID(appID);\n const validatedAppVersion = validateAppVersion(appVersion);\n\n const sendingToMXL = validatedAppID !== undefined;\n\n if (!sendingToMXL && !logExporters.length && !spanExporters.length) {\n throw new Error(\n 'when appID is omitted, at least one logExporter or spanExporter must be set',\n );\n }\n\n if (restrictedProtocols.has(window.location.protocol)) {\n throw new Error(\n `not initializing due to restricted protocol: ${window.location.protocol}`,\n );\n }\n\n if (sendingToMXL && typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not supported in this browser and required for data compression.',\n );\n }\n\n const useNamespace = !registerGlobally && appID;\n const sdkLocalStorage = useNamespace\n ? new NamespacedStorage(appID, window.localStorage)\n : window.localStorage;\n const sdkSessionStorage = useNamespace\n ? new NamespacedStorage(appID, window.sessionStorage)\n : window.sessionStorage;\n\n const resourceWithWebSDKAttributes = resource.merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\n\n const userManager = setupUser({ registerGlobally, sdkLocalStorage });\n const enduserPseudoID = userManager.getMXLUserId();\n if (sendingToMXL && !enduserPseudoID) {\n throw new Error('userID is required when using MXL exporter');\n }\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicSDKConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const sdkFeaturesManager = new MXLSDKFeaturesManager({\n dynamicConfigManager,\n deviceId: enduserPseudoID,\n blockNetworkSpanForwarding,\n });\n\n if (!sdkFeaturesManager.isSDKEnabled()) {\n diagLogger.debug('SDK is disabled, skipping initialization.');\n\n return false;\n }\n\n const nsfValid = nsfConfigValidation({\n featureManager: sdkFeaturesManager,\n diag: diagLogger,\n registerGlobally,\n defaultInstrumentationConfig,\n propagator,\n });\n\n const limitManager = new MXLLimitManager(DEFAULT_LIMITS);\n\n const finalAttributeScrubbers: AttributeScrubber[] = [\n ...(enableDefaultAttributeScrubbing\n ? getDefaultAttributeScrubbers(additionalQueryParamsToScrub)\n : []),\n ...attributeScrubbers,\n ];\n\n const spanSessionManager = setupSession({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n });\n\n let mxlSpanProcessor: MXLSessionBatchedSpanProcessor | undefined;\n let mxlLogProcessor: BatchLogRecordProcessor | undefined;\n if (sendingToMXL) {\n mxlSpanProcessor = new MXLSessionBatchedSpanProcessor({\n resource: resourceWithWebSDKAttributes,\n exporter: new MXLTraceExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n limitManager,\n storedSpansExpireTimeoutMS:\n defaultInstrumentationConfig?.['session-visibility']\n ?.storedSpansExpireTimeoutMS,\n storage: sdkLocalStorage,\n spanSessionManager,\n });\n\n mxlLogProcessor = new BatchLogRecordProcessor(\n new MXLLogExporter({\n appID: validatedAppID,\n mxlDataURL,\n userID: enduserPseudoID,\n }),\n );\n }\n\n const pageManager = setupPage({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n });\n\n const { tracerProvider, mxlTraceManager } = setupTraces({\n resource: resourceWithWebSDKAttributes,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors,\n propagator: nsfValid ? new MXLW3CTraceContextPropagator() : propagator,\n contextManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n });\n\n spanSessionManager.setTracerProvider(tracerProvider);\n\n const { loggerProvider, mxlLogManager } = setupLogs({\n resource: resourceWithWebSDKAttributes,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n });\n\n // NOTE: we require setupInstrumentation to run the last, after setupLogs and setupTraces. This is how OTel works wrt\n // the dependencies between instrumentations and global providers. We need the providers for tracers, and logs to be\n // setup before we enable instrumentations.\n if (!registerGlobally) {\n registerInstrumentations({\n tracerProvider,\n loggerProvider,\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n logManager: mxlLogManager,\n spanSessionManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n featureManager: sdkFeaturesManager,\n mxlSpanProcessor,\n pageManager,\n }),\n ...instrumentations,\n ],\n });\n }\n\n const windowDisableSessionRec =\n typeof window !== 'undefined' &&\n (window as unknown as { __MXL_DISABLE_SESSION_RECORDER?: boolean })\n .__MXL_DISABLE_SESSION_RECORDER === true;\n\n const sessionRecording =\n sendingToMXL &&\n validatedAppID &&\n enduserPseudoID &&\n !windowDisableSessionRec\n ? createSessionRecordingControl({\n resource: resourceWithWebSDKAttributes,\n spanSessionManager,\n tracerProvider,\n appID: validatedAppID,\n userID: enduserPseudoID,\n mxlDataURL,\n recordUserSessions,\n sessionRecorder,\n })\n : noopSessionRecording;\n\n diagLogger.info('successfully initialized the SDK');\n\n const sdkControl: SDKControl = {\n setDynamicConfig: (config: Partial<DynamicSDKConfig>) => {\n dynamicConfigManager.setConfig(config);\n },\n flush: async () => {\n await tracerProvider.forceFlush();\n await loggerProvider.forceFlush();\n },\n log: mxlLogManager,\n trace: mxlTraceManager,\n session: spanSessionManager,\n user: userManager,\n page: pageManager,\n sessionRecording,\n };\n\n if (registerGlobally) {\n registry.register(sdkControl);\n }\n\n spanSessionManager.recordSDKStartupDuration(\n perf.getNowMillis() - initSDKStart,\n );\n\n return sdkControl;\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Unknown error.';\n diagLogger.error(`failed to initialize the SDK: ${message}`);\n return false;\n }\n};\n\nconst setupUser = ({ registerGlobally, sdkLocalStorage }: SetupUserArgs) => {\n const mxlUserManager = new MXLUserManager({\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n user.setGlobalUserManager(mxlUserManager);\n }\n\n return mxlUserManager;\n};\n\nconst setupSession = ({\n limitManager,\n registerGlobally,\n sdkLocalStorage,\n sdkSessionStorage,\n}: SetupSessionArgs) => {\n const mxlSpanSessionManager = new MXLSpanSessionManager({\n limitManager,\n storage: sdkLocalStorage,\n sessionStorage: sdkSessionStorage,\n });\n\n if (registerGlobally) {\n session.setGlobalSessionManager(mxlSpanSessionManager);\n }\n\n return mxlSpanSessionManager;\n};\n\nconst setupTraces = ({\n resource,\n spanSessionManager,\n userManager,\n spanExporters,\n spanProcessors = [],\n propagator = null,\n contextManager = null,\n attributeScrubbers,\n registerGlobally,\n mxlSpanProcessor,\n pageManager,\n}: SetupTracesArgs) => {\n const finalSpanProcessors: SpanProcessor[] = [\n ...spanProcessors,\n createSessionSpanProcessor(spanSessionManager),\n new BrowserSpanProcessor(),\n new MXLNetworkSpanProcessor(),\n new UserSpanProcessor({ userManager }),\n new PageSpanProcessor({ pageManager }),\n new SpanScrubProcessor({ attributeScrubbers }),\n ];\n\n spanExporters?.forEach((exporter) => {\n finalSpanProcessors.push(new BatchSpanProcessor(exporter));\n });\n\n if (mxlSpanProcessor) {\n finalSpanProcessors.push(mxlSpanProcessor);\n }\n\n const tracerProvider = new WebTracerProvider({\n resource,\n spanProcessors: finalSpanProcessors,\n spanLimits: {\n // Session properties are stored as attributes on the session span, add a\n // buffer here so that there is room for our internal attributes\n attributeCountLimit: DEFAULT_LIMITS.maxAllowed.session_property * 2,\n attributePerEventCountLimit: 20,\n // Breadcrumbs are stored as events on the session span, add a\n // buffer here so that there is room for our internal events\n eventCountLimit: DEFAULT_LIMITS.maxAllowed.breadcrumb * 2,\n attributeValueLengthLimit: 1024,\n },\n });\n\n const mxlTraceManager = new MXLTraceManager({\n tracerProvider: registerGlobally ? undefined : tracerProvider,\n });\n\n if (registerGlobally) {\n trace.setGlobalTraceManager(mxlTraceManager);\n tracerProvider.register({\n // WebTracerProvider.register has different fallback behaviours depending on whether null or undefined is passed,\n // be more explicit here and always supply a StackContextManager if the config did not specify one. If a user really\n // wants to turn off context management they can pass a no-op manager explicitly:\n // https://github.com/open-telemetry/opentelemetry-js/blob/4f0b6285af24b71a9fa022755aaa3b6a63ae5033/packages/opentelemetry-sdk-trace-web/src/WebTracerProvider.ts#L39\n contextManager: contextManager || new StackContextManager(),\n propagator,\n });\n }\n\n return { tracerProvider, mxlTraceManager };\n};\n\nconst setupLogs = ({\n resource,\n userManager,\n logExporters,\n logProcessors,\n spanSessionManager,\n limitManager,\n attributeScrubbers,\n registerGlobally,\n mxlLogProcessor,\n sdkLocalStorage,\n pageManager,\n}: SetupLogsArgs) => {\n const finalLogProcessors: LogRecordProcessor[] = [\n ...logProcessors,\n new IdentifiableSessionLogRecordProcessor({\n spanSessionManager,\n }),\n new BrowserLogRecordProcessor(),\n new MXLLogRecordProcessor(),\n new UserLogRecordProcessor({ userManager }),\n new LogRecordScrubProcessor({ attributeScrubbers }),\n new PageLogRecordProcessor({ pageManager }),\n ];\n\n logExporters?.forEach((exporter) => {\n finalLogProcessors.push(new BatchLogRecordProcessor(exporter));\n });\n\n if (mxlLogProcessor) {\n finalLogProcessors.push(mxlLogProcessor);\n }\n\n const loggerProvider = new LoggerProvider({\n resource,\n processors: finalLogProcessors,\n });\n\n const mxlLogManager = new MXLLogManager({\n spanSessionManager,\n limitManager,\n loggerProvider: registerGlobally ? undefined : loggerProvider,\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n logs.setGlobalLoggerProvider(loggerProvider);\n log.setGlobalLogManager(mxlLogManager);\n }\n\n return { loggerProvider, mxlLogManager };\n};\n\nconst setupPage = ({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n}: SetupPageArgs) => {\n const mxlPageManager = new MXLPageManager({\n useDocumentTitleAsPageLabel,\n });\n\n if (registerGlobally) {\n page.setGlobalPageManager(mxlPageManager);\n }\n\n return mxlPageManager;\n};\n"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ const require_exporters_utils = require('../exporters/utils.cjs');
4
+ const require_exporters_MXLLogExporter_utils = require('../exporters/MXLLogExporter/utils.cjs');
5
+ let _safaricom_mxl_session_recorder = require("@safaricom-mxl/session-recorder");
6
+
7
+ //#region src/sdk/setupSessionRecorder.ts
8
+ const noopSessionRecording = {
9
+ isRecording: () => false,
10
+ setEnabled: () => {}
11
+ };
12
+ function buildInitConfig({ resource, spanSessionManager, tracerProvider, appID, userID, mxlDataURL, sessionRecorder: userOptions }) {
13
+ return {
14
+ resource,
15
+ getSessionId: () => spanSessionManager.getSessionId(),
16
+ tracer: tracerProvider.getTracer("mxl.session-recorder", _safaricom_mxl_session_recorder.VERSION),
17
+ url: require_exporters_MXLLogExporter_utils.getLogEndpoint(appID, mxlDataURL),
18
+ headers: require_exporters_utils.getMXLHeaders(appID, userID),
19
+ ...userOptions
20
+ };
21
+ }
22
+ function createSessionRecordingControl(args) {
23
+ const initConfig = () => buildInitConfig(args);
24
+ if (args.recordUserSessions) {
25
+ _safaricom_mxl_session_recorder.SessionRecorder.init(initConfig());
26
+ return {
27
+ isRecording: () => _safaricom_mxl_session_recorder.SessionRecorder.isRecording(),
28
+ setEnabled: (enabled) => {
29
+ _safaricom_mxl_session_recorder.SessionRecorder.setEnabled(enabled);
30
+ }
31
+ };
32
+ }
33
+ return {
34
+ isRecording: () => _safaricom_mxl_session_recorder.SessionRecorder.isRecording(),
35
+ setEnabled: (enabled) => {
36
+ if (enabled) if (!_safaricom_mxl_session_recorder.SessionRecorder.inited) _safaricom_mxl_session_recorder.SessionRecorder.init(initConfig());
37
+ else _safaricom_mxl_session_recorder.SessionRecorder.resume();
38
+ else if (_safaricom_mxl_session_recorder.SessionRecorder.inited) _safaricom_mxl_session_recorder.SessionRecorder.stop();
39
+ }
40
+ };
41
+ }
42
+
43
+ //#endregion
44
+ exports.createSessionRecordingControl = createSessionRecordingControl;
45
+ exports.noopSessionRecording = noopSessionRecording;
46
+ //# sourceMappingURL=setupSessionRecorder.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupSessionRecorder.cjs","names":["SESSION_RECORDER_VERSION","getLogEndpoint","getMXLHeaders","SessionRecorder"],"sources":["../../src/sdk/setupSessionRecorder.ts"],"sourcesContent":["import type { Resource } from '@opentelemetry/resources';\nimport type { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport type { SessionRecorderConfig } from '@safaricom-mxl/session-recorder';\nimport {\n VERSION as SESSION_RECORDER_VERSION,\n SessionRecorder,\n} from '@safaricom-mxl/session-recorder';\nimport { getLogEndpoint } from '../exporters/MXLLogExporter/utils.ts';\nimport { getMXLHeaders } from '../exporters/utils.ts';\nimport type {\n SessionRecorderUserConfig,\n SessionRecordingControl,\n} from './types.ts';\n\nexport const noopSessionRecording: SessionRecordingControl = {\n isRecording: () => false,\n setEnabled: () => {\n // Session recording is only available when using MXL (appID + user ID).\n },\n};\n\nfunction buildInitConfig({\n resource,\n spanSessionManager,\n tracerProvider,\n appID,\n userID,\n mxlDataURL,\n sessionRecorder: userOptions,\n}: {\n resource: Resource;\n spanSessionManager: { getSessionId: () => string | null };\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n sessionRecorder?: SessionRecorderUserConfig;\n}): SessionRecorderConfig {\n const tracer = tracerProvider.getTracer(\n 'mxl.session-recorder',\n SESSION_RECORDER_VERSION,\n );\n return {\n resource,\n getSessionId: () => spanSessionManager.getSessionId(),\n tracer,\n url: getLogEndpoint(appID, mxlDataURL),\n headers: getMXLHeaders(appID, userID),\n ...userOptions,\n } as SessionRecorderConfig;\n}\n\nexport function createSessionRecordingControl(args: {\n resource: Resource;\n spanSessionManager: { getSessionId: () => string | null };\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n recordUserSessions: boolean;\n sessionRecorder?: SessionRecorderUserConfig;\n}): SessionRecordingControl {\n const initConfig = () => buildInitConfig(args);\n\n if (args.recordUserSessions) {\n SessionRecorder.init(initConfig());\n return {\n isRecording: () => SessionRecorder.isRecording(),\n setEnabled: (enabled: boolean) => {\n SessionRecorder.setEnabled(enabled);\n },\n };\n }\n\n // Defer rrweb + OTLP until the app calls setEnabled(true) (lazy start).\n return {\n isRecording: () => SessionRecorder.isRecording(),\n setEnabled: (enabled: boolean) => {\n if (enabled) {\n if (!SessionRecorder.inited) {\n SessionRecorder.init(initConfig());\n } else {\n SessionRecorder.resume();\n }\n } else if (SessionRecorder.inited) {\n SessionRecorder.stop();\n }\n },\n };\n}\n"],"mappings":";;;;;;;AAcA,MAAa,uBAAgD;CAC3D,mBAAmB;CACnB,kBAAkB;CAGnB;AAED,SAAS,gBAAgB,EACvB,UACA,oBACA,gBACA,OACA,QACA,YACA,iBAAiB,eASO;AAKxB,QAAO;EACL;EACA,oBAAoB,mBAAmB,cAAc;EACrD,QAPa,eAAe,UAC5B,wBACAA,wCACD;EAKC,KAAKC,sDAAe,OAAO,WAAW;EACtC,SAASC,sCAAc,OAAO,OAAO;EACrC,GAAG;EACJ;;AAGH,SAAgB,8BAA8B,MASlB;CAC1B,MAAM,mBAAmB,gBAAgB,KAAK;AAE9C,KAAI,KAAK,oBAAoB;AAC3B,kDAAgB,KAAK,YAAY,CAAC;AAClC,SAAO;GACL,mBAAmBC,gDAAgB,aAAa;GAChD,aAAa,YAAqB;AAChC,oDAAgB,WAAW,QAAQ;;GAEtC;;AAIH,QAAO;EACL,mBAAmBA,gDAAgB,aAAa;EAChD,aAAa,YAAqB;AAChC,OAAI,QACF,KAAI,CAACA,gDAAgB,OACnB,iDAAgB,KAAK,YAAY,CAAC;OAElC,iDAAgB,QAAQ;YAEjBA,gDAAgB,OACzB,iDAAgB,MAAM;;EAG3B"}
@@ -0,0 +1,21 @@
1
+ import { SessionRecorderUserConfig, SessionRecordingControl } from "./types.cjs";
2
+ import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
3
+ import { Resource } from "@opentelemetry/resources";
4
+
5
+ //#region src/sdk/setupSessionRecorder.d.ts
6
+ declare const noopSessionRecording: SessionRecordingControl;
7
+ declare function createSessionRecordingControl(args: {
8
+ resource: Resource;
9
+ spanSessionManager: {
10
+ getSessionId: () => string | null;
11
+ };
12
+ tracerProvider: WebTracerProvider;
13
+ appID: string;
14
+ userID: string;
15
+ mxlDataURL?: string;
16
+ recordUserSessions: boolean;
17
+ sessionRecorder?: SessionRecorderUserConfig;
18
+ }): SessionRecordingControl;
19
+ //#endregion
20
+ export { createSessionRecordingControl, noopSessionRecording };
21
+ //# sourceMappingURL=setupSessionRecorder.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupSessionRecorder.d.cts","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"mappings":";;;;;cAca,oBAAA,EAAsB,uBAAA;AAAA,iBAsCnB,6BAAA,CAA8B,IAAA;EAC5C,QAAA,EAAU,QAAA;EACV,kBAAA;IAAsB,YAAA;EAAA;EACtB,cAAA,EAAgB,iBAAA;EAChB,KAAA;EACA,MAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA,GAAkB,yBAAA;AAAA,IAChB,uBAAA"}
@@ -0,0 +1,21 @@
1
+ import { SessionRecorderUserConfig, SessionRecordingControl } from "./types.js";
2
+ import { Resource } from "@opentelemetry/resources";
3
+ import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
4
+
5
+ //#region src/sdk/setupSessionRecorder.d.ts
6
+ declare const noopSessionRecording: SessionRecordingControl;
7
+ declare function createSessionRecordingControl(args: {
8
+ resource: Resource;
9
+ spanSessionManager: {
10
+ getSessionId: () => string | null;
11
+ };
12
+ tracerProvider: WebTracerProvider;
13
+ appID: string;
14
+ userID: string;
15
+ mxlDataURL?: string;
16
+ recordUserSessions: boolean;
17
+ sessionRecorder?: SessionRecorderUserConfig;
18
+ }): SessionRecordingControl;
19
+ //#endregion
20
+ export { createSessionRecordingControl, noopSessionRecording };
21
+ //# sourceMappingURL=setupSessionRecorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupSessionRecorder.d.ts","names":[],"sources":["../../src/sdk/setupSessionRecorder.ts"],"mappings":";;;;;cAca,oBAAA,EAAsB,uBAAA;AAAA,iBAsCnB,6BAAA,CAA8B,IAAA;EAC5C,QAAA,EAAU,QAAA;EACV,kBAAA;IAAsB,YAAA;EAAA;EACtB,cAAA,EAAgB,iBAAA;EAChB,KAAA;EACA,MAAA;EACA,UAAA;EACA,kBAAA;EACA,eAAA,GAAkB,yBAAA;AAAA,IAChB,uBAAA"}
@@ -0,0 +1,43 @@
1
+ import { getMXLHeaders } from "../exporters/utils.js";
2
+ import { getLogEndpoint } from "../exporters/MXLLogExporter/utils.js";
3
+ import { SessionRecorder, VERSION } from "@safaricom-mxl/session-recorder";
4
+
5
+ //#region src/sdk/setupSessionRecorder.ts
6
+ const noopSessionRecording = {
7
+ isRecording: () => false,
8
+ setEnabled: () => {}
9
+ };
10
+ function buildInitConfig({ resource, spanSessionManager, tracerProvider, appID, userID, mxlDataURL, sessionRecorder: userOptions }) {
11
+ return {
12
+ resource,
13
+ getSessionId: () => spanSessionManager.getSessionId(),
14
+ tracer: tracerProvider.getTracer("mxl.session-recorder", VERSION),
15
+ url: getLogEndpoint(appID, mxlDataURL),
16
+ headers: getMXLHeaders(appID, userID),
17
+ ...userOptions
18
+ };
19
+ }
20
+ function createSessionRecordingControl(args) {
21
+ const initConfig = () => buildInitConfig(args);
22
+ if (args.recordUserSessions) {
23
+ SessionRecorder.init(initConfig());
24
+ return {
25
+ isRecording: () => SessionRecorder.isRecording(),
26
+ setEnabled: (enabled) => {
27
+ SessionRecorder.setEnabled(enabled);
28
+ }
29
+ };
30
+ }
31
+ return {
32
+ isRecording: () => SessionRecorder.isRecording(),
33
+ setEnabled: (enabled) => {
34
+ if (enabled) if (!SessionRecorder.inited) SessionRecorder.init(initConfig());
35
+ else SessionRecorder.resume();
36
+ else if (SessionRecorder.inited) SessionRecorder.stop();
37
+ }
38
+ };
39
+ }
40
+
41
+ //#endregion
42
+ export { createSessionRecordingControl, noopSessionRecording };
43
+ //# sourceMappingURL=setupSessionRecorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupSessionRecorder.js","names":["SESSION_RECORDER_VERSION"],"sources":["../../src/sdk/setupSessionRecorder.ts"],"sourcesContent":["import type { Resource } from '@opentelemetry/resources';\nimport type { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport type { SessionRecorderConfig } from '@safaricom-mxl/session-recorder';\nimport {\n VERSION as SESSION_RECORDER_VERSION,\n SessionRecorder,\n} from '@safaricom-mxl/session-recorder';\nimport { getLogEndpoint } from '../exporters/MXLLogExporter/utils.ts';\nimport { getMXLHeaders } from '../exporters/utils.ts';\nimport type {\n SessionRecorderUserConfig,\n SessionRecordingControl,\n} from './types.ts';\n\nexport const noopSessionRecording: SessionRecordingControl = {\n isRecording: () => false,\n setEnabled: () => {\n // Session recording is only available when using MXL (appID + user ID).\n },\n};\n\nfunction buildInitConfig({\n resource,\n spanSessionManager,\n tracerProvider,\n appID,\n userID,\n mxlDataURL,\n sessionRecorder: userOptions,\n}: {\n resource: Resource;\n spanSessionManager: { getSessionId: () => string | null };\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n sessionRecorder?: SessionRecorderUserConfig;\n}): SessionRecorderConfig {\n const tracer = tracerProvider.getTracer(\n 'mxl.session-recorder',\n SESSION_RECORDER_VERSION,\n );\n return {\n resource,\n getSessionId: () => spanSessionManager.getSessionId(),\n tracer,\n url: getLogEndpoint(appID, mxlDataURL),\n headers: getMXLHeaders(appID, userID),\n ...userOptions,\n } as SessionRecorderConfig;\n}\n\nexport function createSessionRecordingControl(args: {\n resource: Resource;\n spanSessionManager: { getSessionId: () => string | null };\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n recordUserSessions: boolean;\n sessionRecorder?: SessionRecorderUserConfig;\n}): SessionRecordingControl {\n const initConfig = () => buildInitConfig(args);\n\n if (args.recordUserSessions) {\n SessionRecorder.init(initConfig());\n return {\n isRecording: () => SessionRecorder.isRecording(),\n setEnabled: (enabled: boolean) => {\n SessionRecorder.setEnabled(enabled);\n },\n };\n }\n\n // Defer rrweb + OTLP until the app calls setEnabled(true) (lazy start).\n return {\n isRecording: () => SessionRecorder.isRecording(),\n setEnabled: (enabled: boolean) => {\n if (enabled) {\n if (!SessionRecorder.inited) {\n SessionRecorder.init(initConfig());\n } else {\n SessionRecorder.resume();\n }\n } else if (SessionRecorder.inited) {\n SessionRecorder.stop();\n }\n },\n };\n}\n"],"mappings":";;;;;AAcA,MAAa,uBAAgD;CAC3D,mBAAmB;CACnB,kBAAkB;CAGnB;AAED,SAAS,gBAAgB,EACvB,UACA,oBACA,gBACA,OACA,QACA,YACA,iBAAiB,eASO;AAKxB,QAAO;EACL;EACA,oBAAoB,mBAAmB,cAAc;EACrD,QAPa,eAAe,UAC5B,wBACAA,QACD;EAKC,KAAK,eAAe,OAAO,WAAW;EACtC,SAAS,cAAc,OAAO,OAAO;EACrC,GAAG;EACJ;;AAGH,SAAgB,8BAA8B,MASlB;CAC1B,MAAM,mBAAmB,gBAAgB,KAAK;AAE9C,KAAI,KAAK,oBAAoB;AAC3B,kBAAgB,KAAK,YAAY,CAAC;AAClC,SAAO;GACL,mBAAmB,gBAAgB,aAAa;GAChD,aAAa,YAAqB;AAChC,oBAAgB,WAAW,QAAQ;;GAEtC;;AAIH,QAAO;EACL,mBAAmB,gBAAgB,aAAa;EAChD,aAAa,YAAqB;AAChC,OAAI,QACF,KAAI,CAAC,gBAAgB,OACnB,iBAAgB,KAAK,YAAY,CAAC;OAElC,iBAAgB,QAAQ;YAEjB,gBAAgB,OACzB,iBAAgB,MAAM;;EAG3B"}
@@ -24,8 +24,14 @@ import { SpanExporter, SpanProcessor } from "@opentelemetry/sdk-trace-web";
24
24
  import { Instrumentation } from "@opentelemetry/instrumentation";
25
25
  import { Resource } from "@opentelemetry/resources";
26
26
  import { BatchLogRecordProcessor, LogRecordExporter, LogRecordProcessor } from "@opentelemetry/sdk-logs";
27
+ import { SessionRecorderConfig } from "@safaricom-mxl/session-recorder";
27
28
 
28
29
  //#region src/sdk/types.d.ts
30
+ type SessionRecorderUserConfig = Omit<SessionRecorderConfig, 'resource' | 'getSessionId' | 'tracer' | 'url' | 'headers' | 'apiKey'>;
31
+ interface SessionRecordingControl {
32
+ isRecording: () => boolean;
33
+ setEnabled: (enabled: boolean) => void;
34
+ }
29
35
  interface DynamicSDKConfig {
30
36
  /**
31
37
  * Pct of users that are sampled. 100% means all users are sampled.
@@ -194,6 +200,17 @@ type BaseSDKInitConfig = {
194
200
  * **default**: true
195
201
  */
196
202
  useDocumentTitleAsPageLabel?: boolean;
203
+ /**
204
+ * When `true` (default) and the SDK sends data to MXL, start rrweb session recording to the same OTLP log ingest URL.
205
+ * Set to `false` to begin with recording disabled; use `sessionRecording.setEnabled(true)` to enable after init.
206
+ *
207
+ * **default**: true
208
+ */
209
+ recordUserSessions?: boolean;
210
+ /**
211
+ * Optional rrweb / recorder options (e.g. `debug: true` for extra logging). Ignored when not sending to MXL.
212
+ */
213
+ sessionRecorder?: SessionRecorderUserConfig;
197
214
  };
198
215
  type MXLExportSDKInitConfig = {
199
216
  /**
@@ -238,6 +255,10 @@ interface SDKControl {
238
255
  session: SpanSessionManager;
239
256
  user: UserManager;
240
257
  page: PageManager;
258
+ /**
259
+ * rrweb session recording to MXL logs. When the SDK is not configured for MXL export, methods are no-ops.
260
+ */
261
+ sessionRecording: SessionRecordingControl;
241
262
  }
242
263
  interface SetupUserArgs {
243
264
  registerGlobally?: boolean;
@@ -312,5 +333,5 @@ interface SDKRegistryManager {
312
333
  registered: () => SDKControl | null;
313
334
  }
314
335
  //#endregion
315
- export { DefaultInstrumentationConfig, DynamicConfigManager, DynamicSDKConfig, SDKControl, SDKInitConfig, SDKRegistryManager, SetupDefaultInstrumentationsArgs, SetupLogsArgs, SetupPageArgs, SetupSessionArgs, SetupTracesArgs, SetupUserArgs };
336
+ export { DefaultInstrumentationConfig, DynamicConfigManager, DynamicSDKConfig, SDKControl, SDKInitConfig, SDKRegistryManager, SessionRecorderUserConfig, SessionRecordingControl, SetupDefaultInstrumentationsArgs, SetupLogsArgs, SetupPageArgs, SetupSessionArgs, SetupTracesArgs, SetupUserArgs };
316
337
  //# sourceMappingURL=types.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/sdk/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.cts","names":[],"sources":["../../src/sdk/types.ts"],"mappings":"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"}
@@ -30,8 +30,14 @@ import { Resource } from "@opentelemetry/resources";
30
30
  import { SpanExporter, SpanProcessor } from "@opentelemetry/sdk-trace-web";
31
31
  import { Instrumentation } from "@opentelemetry/instrumentation";
32
32
  import { BatchLogRecordProcessor, LogRecordExporter, LogRecordProcessor } from "@opentelemetry/sdk-logs";
33
+ import { SessionRecorderConfig } from "@safaricom-mxl/session-recorder";
33
34
 
34
35
  //#region src/sdk/types.d.ts
36
+ type SessionRecorderUserConfig = Omit<SessionRecorderConfig, 'resource' | 'getSessionId' | 'tracer' | 'url' | 'headers' | 'apiKey'>;
37
+ interface SessionRecordingControl {
38
+ isRecording: () => boolean;
39
+ setEnabled: (enabled: boolean) => void;
40
+ }
35
41
  interface DynamicSDKConfig {
36
42
  /**
37
43
  * Pct of users that are sampled. 100% means all users are sampled.
@@ -200,6 +206,17 @@ type BaseSDKInitConfig = {
200
206
  * **default**: true
201
207
  */
202
208
  useDocumentTitleAsPageLabel?: boolean;
209
+ /**
210
+ * When `true` (default) and the SDK sends data to MXL, start rrweb session recording to the same OTLP log ingest URL.
211
+ * Set to `false` to begin with recording disabled; use `sessionRecording.setEnabled(true)` to enable after init.
212
+ *
213
+ * **default**: true
214
+ */
215
+ recordUserSessions?: boolean;
216
+ /**
217
+ * Optional rrweb / recorder options (e.g. `debug: true` for extra logging). Ignored when not sending to MXL.
218
+ */
219
+ sessionRecorder?: SessionRecorderUserConfig;
203
220
  };
204
221
  type MXLExportSDKInitConfig = {
205
222
  /**
@@ -244,6 +261,10 @@ interface SDKControl {
244
261
  session: SpanSessionManager;
245
262
  user: UserManager;
246
263
  page: PageManager;
264
+ /**
265
+ * rrweb session recording to MXL logs. When the SDK is not configured for MXL export, methods are no-ops.
266
+ */
267
+ sessionRecording: SessionRecordingControl;
247
268
  }
248
269
  interface SetupUserArgs {
249
270
  registerGlobally?: boolean;
@@ -318,5 +339,5 @@ interface SDKRegistryManager {
318
339
  registered: () => SDKControl | null;
319
340
  }
320
341
  //#endregion
321
- export { DefaultInstrumentationConfig, DynamicConfigManager, DynamicSDKConfig, SDKControl, SDKInitConfig, SDKRegistryManager, SetupDefaultInstrumentationsArgs, SetupLogsArgs, SetupPageArgs, SetupSessionArgs, SetupTracesArgs, SetupUserArgs };
342
+ export { DefaultInstrumentationConfig, DynamicConfigManager, DynamicSDKConfig, SDKControl, SDKInitConfig, SDKRegistryManager, SessionRecorderUserConfig, SessionRecordingControl, SetupDefaultInstrumentationsArgs, SetupLogsArgs, SetupPageArgs, SetupSessionArgs, SetupTracesArgs, SetupUserArgs };
322
343
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/sdk/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/sdk/types.ts"],"mappings":"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"}