@safaricom-mxl/web-sdk 0.0.15 → 0.0.16
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.
- package/dist/constants/attributes.cjs +2 -0
- package/dist/constants/attributes.cjs.map +1 -1
- package/dist/constants/attributes.d.cts +2 -1
- package/dist/constants/attributes.d.cts.map +1 -1
- package/dist/constants/attributes.d.ts +2 -1
- package/dist/constants/attributes.d.ts.map +1 -1
- package/dist/constants/attributes.js +2 -1
- package/dist/constants/attributes.js.map +1 -1
- package/dist/constants/index.cjs +1 -0
- package/dist/constants/index.d.cts +2 -2
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +2 -2
- package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.cjs +1 -1
- package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.cjs.map +1 -1
- package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.d.cts.map +1 -1
- package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.d.ts.map +1 -1
- package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.js +2 -2
- package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.js.map +1 -1
- package/dist/managers/MXLLogManager/MXLLogManager.cjs +3 -1
- package/dist/managers/MXLLogManager/MXLLogManager.cjs.map +1 -1
- package/dist/managers/MXLLogManager/MXLLogManager.d.cts.map +1 -1
- package/dist/managers/MXLLogManager/MXLLogManager.d.ts.map +1 -1
- package/dist/managers/MXLLogManager/MXLLogManager.js +4 -2
- package/dist/managers/MXLLogManager/MXLLogManager.js.map +1 -1
- package/dist/mxl-web-sdk.js +3 -38
- package/dist/mxl-web-sdk.js.map +1 -1
- package/dist/resources/constants/index.cjs +1 -1
- package/dist/resources/constants/index.cjs.map +1 -1
- package/dist/resources/constants/index.d.cts +1 -1
- package/dist/resources/constants/index.d.ts +1 -1
- package/dist/resources/constants/index.js +1 -1
- package/dist/resources/constants/index.js.map +1 -1
- package/dist/sdk/initSDK.cjs +14 -12
- package/dist/sdk/initSDK.cjs.map +1 -1
- package/dist/sdk/initSDK.d.cts.map +1 -1
- package/dist/sdk/initSDK.d.ts.map +1 -1
- package/dist/sdk/initSDK.js +14 -12
- package/dist/sdk/initSDK.js.map +1 -1
- package/dist/sdk/noopSessionRecording.cjs +10 -0
- package/dist/sdk/noopSessionRecording.cjs.map +1 -0
- package/dist/sdk/noopSessionRecording.d.cts +7 -0
- package/dist/sdk/noopSessionRecording.d.cts.map +1 -0
- package/dist/sdk/noopSessionRecording.d.ts +7 -0
- package/dist/sdk/noopSessionRecording.d.ts.map +1 -0
- package/dist/sdk/noopSessionRecording.js +9 -0
- package/dist/sdk/noopSessionRecording.js.map +1 -0
- package/dist/sdk/setupSessionRecorder.cjs +64 -22
- package/dist/sdk/setupSessionRecorder.cjs.map +1 -1
- package/dist/sdk/setupSessionRecorder.d.cts +16 -7
- package/dist/sdk/setupSessionRecorder.d.cts.map +1 -1
- package/dist/sdk/setupSessionRecorder.d.ts +16 -7
- package/dist/sdk/setupSessionRecorder.d.ts.map +1 -1
- package/dist/sdk/setupSessionRecorder.js +62 -21
- package/dist/sdk/setupSessionRecorder.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
//#region src/resources/constants/index.ts
|
|
3
3
|
const TEMPLATE_APP_VERSION = "MXLAppVersionX.X.X";
|
|
4
|
-
const SDK_VERSION = "0.0.
|
|
4
|
+
const SDK_VERSION = "0.0.16";
|
|
5
5
|
const MXL_SERVICE_NAME = "mxl-web-sdk";
|
|
6
6
|
const NATIVE_FRAMEWORK = 1;
|
|
7
7
|
const MXL_APP_INSTANCE_ID_STORAGE_KEY = "mxl_app_instance_id";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/resources/constants/index.ts"],"sourcesContent":["export const TEMPLATE_APP_VERSION = 'MXLAppVersionX.X.X';\nexport const SDK_VERSION = '0.0.
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../src/resources/constants/index.ts"],"sourcesContent":["export const TEMPLATE_APP_VERSION = 'MXLAppVersionX.X.X';\nexport const SDK_VERSION = '0.0.16';\nexport const MXL_SERVICE_NAME = 'mxl-web-sdk';\n// NATIVE_FRAMEWORK is the representation MXL BE uses to differentiate between\n// sdks. It is an enum, so we just send a number here\nexport const NATIVE_FRAMEWORK = 1;\nexport const MXL_APP_INSTANCE_ID_STORAGE_KEY = 'mxl_app_instance_id';\n"],"mappings":";;AAAA,MAAa,uBAAuB;AACpC,MAAa,cAAc;AAC3B,MAAa,mBAAmB;AAGhC,MAAa,mBAAmB;AAChC,MAAa,kCAAkC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/resources/constants/index.d.ts
|
|
2
2
|
declare const TEMPLATE_APP_VERSION = "MXLAppVersionX.X.X";
|
|
3
|
-
declare const SDK_VERSION = "0.0.
|
|
3
|
+
declare const SDK_VERSION = "0.0.16";
|
|
4
4
|
declare const MXL_SERVICE_NAME = "mxl-web-sdk";
|
|
5
5
|
declare const NATIVE_FRAMEWORK = 1;
|
|
6
6
|
declare const MXL_APP_INSTANCE_ID_STORAGE_KEY = "mxl_app_instance_id";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/resources/constants/index.d.ts
|
|
2
2
|
declare const TEMPLATE_APP_VERSION = "MXLAppVersionX.X.X";
|
|
3
|
-
declare const SDK_VERSION = "0.0.
|
|
3
|
+
declare const SDK_VERSION = "0.0.16";
|
|
4
4
|
declare const MXL_SERVICE_NAME = "mxl-web-sdk";
|
|
5
5
|
declare const NATIVE_FRAMEWORK = 1;
|
|
6
6
|
declare const MXL_APP_INSTANCE_ID_STORAGE_KEY = "mxl_app_instance_id";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/resources/constants/index.ts
|
|
2
2
|
const TEMPLATE_APP_VERSION = "MXLAppVersionX.X.X";
|
|
3
|
-
const SDK_VERSION = "0.0.
|
|
3
|
+
const SDK_VERSION = "0.0.16";
|
|
4
4
|
const MXL_SERVICE_NAME = "mxl-web-sdk";
|
|
5
5
|
const NATIVE_FRAMEWORK = 1;
|
|
6
6
|
const MXL_APP_INSTANCE_ID_STORAGE_KEY = "mxl_app_instance_id";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/resources/constants/index.ts"],"sourcesContent":["export const TEMPLATE_APP_VERSION = 'MXLAppVersionX.X.X';\nexport const SDK_VERSION = '0.0.
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/resources/constants/index.ts"],"sourcesContent":["export const TEMPLATE_APP_VERSION = 'MXLAppVersionX.X.X';\nexport const SDK_VERSION = '0.0.16';\nexport const MXL_SERVICE_NAME = 'mxl-web-sdk';\n// NATIVE_FRAMEWORK is the representation MXL BE uses to differentiate between\n// sdks. It is an enum, so we just send a number here\nexport const NATIVE_FRAMEWORK = 1;\nexport const MXL_APP_INSTANCE_ID_STORAGE_KEY = 'mxl_app_instance_id';\n"],"mappings":";AAAA,MAAa,uBAAuB;AACpC,MAAa,cAAc;AAC3B,MAAa,mBAAmB;AAGhC,MAAa,mBAAmB;AAChC,MAAa,kCAAkC"}
|
package/dist/sdk/initSDK.cjs
CHANGED
|
@@ -34,9 +34,10 @@ const require_processors_UserLogRecordProcessor_UserLogRecordProcessor = require
|
|
|
34
34
|
const require_processors_UserSpanProcessor_UserSpanProcessor = require("../processors/UserSpanProcessor/UserSpanProcessor.cjs");
|
|
35
35
|
const require_propagators_MXLW3CTraceContextPropagator_MXLW3CTraceContextPropagator = require("../propagators/MXLW3CTraceContextPropagator/MXLW3CTraceContextPropagator.cjs");
|
|
36
36
|
const require_sdk_defaultAttributeScrubbers = require("./defaultAttributeScrubbers.cjs");
|
|
37
|
+
const require_sdk_noopSessionRecording = require("./noopSessionRecording.cjs");
|
|
37
38
|
const require_sdk_registry = require("./registry.cjs");
|
|
38
|
-
const require_sdk_setupDefaultInstrumentations = require("./setupDefaultInstrumentations.cjs");
|
|
39
39
|
const require_sdk_setupSessionRecorder = require("./setupSessionRecorder.cjs");
|
|
40
|
+
const require_sdk_setupDefaultInstrumentations = require("./setupDefaultInstrumentations.cjs");
|
|
40
41
|
const require_sdk_utils = require("./utils.cjs");
|
|
41
42
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
42
43
|
let _opentelemetry_resources = require("@opentelemetry/resources");
|
|
@@ -175,6 +176,18 @@ const initSDK = ({ appID, appVersion, resource = (0, _opentelemetry_resources.em
|
|
|
175
176
|
pageManager
|
|
176
177
|
});
|
|
177
178
|
spanSessionManager.startSessionSpan({ reason: "init" });
|
|
179
|
+
const windowDisableSessionRec = typeof window !== "undefined" && window.__MXL_DISABLE_SESSION_RECORDER === true;
|
|
180
|
+
const sessionRecording = sendingToMXL && validatedAppID && enduserPseudoID && !windowDisableSessionRec ? require_sdk_setupSessionRecorder.createSessionRecordingControl({
|
|
181
|
+
resource: resourceWithWebSDKAttributes,
|
|
182
|
+
spanSessionManager,
|
|
183
|
+
tracerProvider,
|
|
184
|
+
appID: validatedAppID,
|
|
185
|
+
userID: enduserPseudoID,
|
|
186
|
+
mxlDataURL,
|
|
187
|
+
recordUserSessions,
|
|
188
|
+
sessionRecorder,
|
|
189
|
+
diagLogger
|
|
190
|
+
}) : require_sdk_noopSessionRecording.noopSessionRecording;
|
|
178
191
|
if (!registerGlobally) (0, _opentelemetry_instrumentation.registerInstrumentations)({
|
|
179
192
|
tracerProvider,
|
|
180
193
|
loggerProvider,
|
|
@@ -190,17 +203,6 @@ const initSDK = ({ appID, appVersion, resource = (0, _opentelemetry_resources.em
|
|
|
190
203
|
pageManager,
|
|
191
204
|
limitManager
|
|
192
205
|
}), ...instrumentations] });
|
|
193
|
-
const windowDisableSessionRec = typeof window !== "undefined" && window.__MXL_DISABLE_SESSION_RECORDER === true;
|
|
194
|
-
const sessionRecording = sendingToMXL && validatedAppID && enduserPseudoID && !windowDisableSessionRec ? require_sdk_setupSessionRecorder.createSessionRecordingControl({
|
|
195
|
-
resource: resourceWithWebSDKAttributes,
|
|
196
|
-
spanSessionManager,
|
|
197
|
-
tracerProvider,
|
|
198
|
-
appID: validatedAppID,
|
|
199
|
-
userID: enduserPseudoID,
|
|
200
|
-
mxlDataURL,
|
|
201
|
-
recordUserSessions,
|
|
202
|
-
sessionRecorder
|
|
203
|
-
}) : require_sdk_setupSessionRecorder.noopSessionRecording;
|
|
204
206
|
diagLogger.info("successfully initialized the SDK");
|
|
205
207
|
const sdkControl = {
|
|
206
208
|
setDynamicConfig: (config) => {
|
package/dist/sdk/initSDK.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initSDK.cjs","names":["DiagLogLevel","diag","registry","DiagConsoleLogger","OTelPerformanceManager","validateAppID","validateAppVersion","NamespacedStorage","MXLDynamicConfigManager","getWebSDKOverridableResource","getWebSDKResource","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';\nimport { page } from '../api-page';\nimport { session } from '../api-sessions';\nimport { trace } from '../api-traces';\nimport { user } from '../api-users';\nimport type { AttributeScrubber } from '../common';\nimport { MXLLogExporter, MXLTraceExporter } from '../exporters';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers';\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';\nimport { MXLW3CTraceContextPropagator } from '../propagators';\nimport {\n getWebSDKOverridableResource,\n getWebSDKResource,\n OTEL_DEFAULT_SERVICE_NAME,\n} from '../resources';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers';\nimport { registry } from './registry';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations';\nimport {\n createSessionRecordingControl,\n noopSessionRecording,\n} from './setupSessionRecorder';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types';\nimport { validateAppID, validateAppVersion } from './utils';\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 serviceName,\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 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 dynamicDefaultConfig = {\n ...dynamicSDKConfig,\n };\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicDefaultConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const resolvedServiceName =\n dynamicConfigManager.resolveApplicationServiceName?.(serviceName) ??\n (() => {\n const fromInit = serviceName?.trim();\n if (fromInit) {\n return fromInit;\n }\n const fromCfg = dynamicConfigManager.getConfig().serviceName?.trim();\n if (fromCfg) {\n return fromCfg;\n }\n return OTEL_DEFAULT_SERVICE_NAME;\n })();\n\n const resourceWithWebSDKAttributes = getWebSDKOverridableResource({\n serviceName: resolvedServiceName,\n })\n .merge(resource)\n .merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\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 spanSessionManager.startSessionSpan({ reason: 'init' });\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 logManager: mxlLogManager,\n spanSessionManager,\n pageManager,\n limitManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n spanSessionManager,\n pageManager,\n limitManager,\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 // 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 },\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8EA,MAAa,WACX,EACE,OACA,YACA,YAAA,GAAA,yBAAA,gBAA0B,EAC1B,gBAAgB,EAAE,EAClB,eAAe,EAAE,EACjB,iBAAiB,EAAE,EACnB,aAAa,MACb,8BACA,mBAAmB,EAAE,EACrB,iBAAiB,MACjB,gBAAgB,EAAE,EAClB,qBAAqB,EAAE,EACvB,kCAAkC,MAClC,+BAA+B,EAAE,EACjC,WAAWA,mBAAAA,aAAa,OACxB,YACA,cACA,aAAaC,mBAAAA,KAAK,sBAAsB,EACtC,WAAW,WACZ,CAAC,EACF,yBAAyB,iCACzB,kBACA,mBAAmB,MACnB,6BAA6B,OAC7B,sBAAsB,IAAI,IAAI,CAAC,QAAQ,CAAC,EACxC,8BAA8B,MAC9B,qBAAqB,MACrB,iBACA,gBACiB,EAAE,KACE;AACvB,KAAI;AACF,MAAI,kBAAkB;GACpB,MAAM,cAAcC,qBAAAA,SAAS,YAAY;AACzC,OAAI,gBAAgB,MAAM;AACxB,eAAW,KACT,qFACD;AACD,WAAO;;;AAIX,qBAAA,KAAK,UAAU,IAAIC,mBAAAA,mBAAmB,EAAE,EACtC,UACD,CAAC;AAEF,MAAI,OAAO,WAAW,aAAa;AACjC,cAAW,KAAK,gDAAgD;AAChE,UAAO;;EAGT,MAAM,OAAO,IAAIC,wDAAAA,wBAAwB;EACzC,MAAM,eAAe,KAAK,cAAc;EACxC,MAAM,iBAAiBC,kBAAAA,cAAc,MAAM;EAC3C,MAAM,sBAAsBC,kBAAAA,mBAAmB,WAAW;EAE1D,MAAM,eAAe,mBAAmB,KAAA;AAExC,MAAI,CAAC,gBAAgB,CAAC,aAAa,UAAU,CAAC,cAAc,OAC1D,OAAM,IAAI,MACR,8EACD;AAGH,MAAI,oBAAoB,IAAI,OAAO,SAAS,SAAS,CACnD,OAAM,IAAI,MACR,gDAAgD,OAAO,SAAS,WACjE;AAGH,MAAI,gBAAgB,OAAO,sBAAsB,YAC/C,OAAM,IAAI,MACR,wFACD;EAGH,MAAM,eAAe,CAAC,oBAAoB;EAC1C,MAAM,kBAAkB,eACpB,IAAIC,kDAAAA,kBAAkB,OAAO,OAAO,aAAa,GACjD,OAAO;EACX,MAAM,oBAAoB,eACtB,IAAIA,kDAAAA,kBAAkB,OAAO,OAAO,eAAe,GACnD,OAAO;EAEX,MAAM,cAAc,UAAU;GAAE;GAAkB;GAAiB,CAAC;EACpE,MAAM,kBAAkB,YAAY,cAAc;AAClD,MAAI,gBAAgB,CAAC,gBACnB,OAAM,IAAI,MAAM,6CAA6C;EAG/D,MAAM,uBAAuB,EAC3B,GAAG,kBACJ;EAED,MAAM,uBACJ,mCACA,IAAIC,0DAAAA,wBAAwB;GAC1B,OAAO;GACP,YAAY;GACZ;GACA,eAAe;GACf,UAAU;GACV,SAAS;GACV,CAAC;AACC,uBAAqB,qBAAqB;EAgB/C,MAAM,+BAA+BC,iCAAAA,6BAA6B,EAChE,aAdA,qBAAqB,gCAAgC,YAAY,WAC1D;GACL,MAAM,WAAW,aAAa,MAAM;AACpC,OAAI,SACF,QAAO;GAET,MAAM,UAAU,qBAAqB,WAAW,CAAC,aAAa,MAAM;AACpE,OAAI,QACF,QAAO;AAET,UAAA;MACE,EAIL,CAAC,CACC,MAAM,SAAS,CACf,MACCC,iCAAAA,kBAAkB;GAChB;GACA,YAAY;GACZ,oBAAoB;GACrB,CAAC,CACH;EAEH,MAAM,qBAAqB,IAAIC,6DAAAA,sBAAsB;GACnD;GACA,UAAU;GACV;GACD,CAAC;AAEF,MAAI,CAAC,mBAAmB,cAAc,EAAE;AACtC,cAAW,MAAM,4CAA4C;AAE7D,UAAO;;EAGT,MAAM,WAAWC,kCAAAA,oBAAoB;GACnC,gBAAgB;GAChB,MAAM;GACN;GACA;GACA;GACD,CAAC;EAEF,MAAM,eAAe,IAAIC,iDAAAA,gBAAgBC,2CAAAA,eAAe;EAExD,MAAM,0BAA+C,CACnD,GAAI,kCACAC,sCAAAA,6BAA6B,6BAA6B,GAC1D,EAAE,EACN,GAAG,mBACJ;EAED,MAAM,qBAAqB,aAAa;GACtC;GACA;GACA;GACA;GACD,CAAC;EAEF,IAAI;EACJ,IAAI;AACJ,MAAI,cAAc;AAChB,sBAAmB,IAAIC,iFAAAA,+BAA+B;IACpD,UAAU;IACV,UAAU,IAAIC,oDAAAA,iBAAiB;KAC7B,OAAO;KACP;KACA,QAAQ;KACT,CAAC;IACF;IACA,4BACE,+BAA+B,uBAC3B;IACN,SAAS;IACT;IACD,CAAC;AAEF,qBAAkB,IAAIC,wBAAAA,wBACpB,IAAIC,gDAAAA,eAAe;IACjB,OAAO;IACP;IACA,QAAQ;IACT,CAAC,CACH;;EAGH,MAAM,cAAc,UAAU;GAC5B;GACA;GACD,CAAC;EAEF,MAAM,EAAE,gBAAgB,oBAAoB,YAAY;GACtD,UAAU;GACV;GACA;GACA;GACA;GACA,YAAY,WAAW,IAAIC,8EAAAA,8BAA8B,GAAG;GAC5D;GACA,oBAAoB;GACpB;GACA;GACA;GACD,CAAC;AAEF,qBAAmB,kBAAkB,eAAe;EAEpD,MAAM,EAAE,gBAAgB,kBAAkB,UAAU;GAClD,UAAU;GACV;GACA;GACA;GACA;GACA;GACA,oBAAoB;GACpB;GACA;GACA;GACA;GACD,CAAC;AAEF,qBAAmB,iBAAiB,EAAE,QAAQ,QAAQ,CAAC;AAKvD,MAAI,CAAC,iBACH,EAAA,GAAA,+BAAA,0BAAyB;GACvB;GACA;GACA,kBAAkB,CAChBC,yCAAAA,6BAA6B,8BAA8B;IACzD,YAAY;IACZ;IACA;IACA;IACD,CAAC,EACF,GAAG,iBACJ;GACF,CAAC;MAEF,EAAA,GAAA,+BAAA,0BAAyB,EACvB,kBAAkB,CAChBA,yCAAAA,6BAA6B,8BAA8B;GACzD;GACA;GACA;GACD,CAAC,EACF,GAAG,iBACJ,EACF,CAAC;EAGJ,MAAM,0BACJ,OAAO,WAAW,eACjB,OACE,mCAAmC;EAExC,MAAM,mBACJ,gBACA,kBACA,mBACA,CAAC,0BACGC,iCAAAA,8BAA8B;GAC5B,UAAU;GACV;GACA;GACA,OAAO;GACP,QAAQ;GACR;GACA;GACA;GACD,CAAC,GACFC,iCAAAA;AAEN,aAAW,KAAK,mCAAmC;EAEnD,MAAM,aAAyB;GAC7B,mBAAmB,WAAsC;AACvD,yBAAqB,UAAU,OAAO;;GAExC,OAAO,YAAY;AACjB,UAAM,eAAe,YAAY;AACjC,UAAM,eAAe,YAAY;;GAEnC,KAAK;GACL,OAAO;GACP,SAAS;GACT,MAAM;GACN,MAAM;GACN;GACD;AAED,MAAI,iBACF,sBAAA,SAAS,SAAS,WAAW;AAG/B,qBAAmB,yBACjB,KAAK,cAAc,GAAG,aACvB;AAED,SAAO;UACA,GAAG;EACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU;AACjD,aAAW,MAAM,iCAAiC,UAAU;AAC5D,SAAO;;;AAIX,MAAM,aAAa,EAAE,kBAAkB,sBAAqC;CAC1E,MAAM,iBAAiB,IAAIC,+CAAAA,eAAe,EACxC,SAAS,iBACV,CAAC;AAEF,KAAI,iBACF,2BAAA,KAAK,qBAAqB,eAAe;AAG3C,QAAO;;AAGT,MAAM,gBAAgB,EACpB,cACA,kBACA,iBACA,wBACsB;CACtB,MAAM,wBAAwB,IAAIC,6DAAAA,sBAAsB;EACtD;EACA,SAAS;EACT,gBAAgB;EACjB,CAAC;AAEF,KAAI,iBACF,iCAAA,QAAQ,wBAAwB,sBAAsB;AAGxD,QAAO;;AAGT,MAAM,eAAe,EACnB,UACA,oBACA,aACA,eACA,iBAAiB,EAAE,EACnB,aAAa,MACb,iBAAiB,MACjB,oBACA,kBACA,kBACA,kBACqB;CACrB,MAAM,sBAAuC;EAC3C,GAAG;4DACwB,mBAAmB;EAC9C,IAAIC,6DAAAA,sBAAsB;EAC1B,IAAIC,mEAAAA,yBAAyB;EAC7B,IAAIC,uDAAAA,kBAAkB,EAAE,aAAa,CAAC;EACtC,IAAIC,uDAAAA,kBAAkB,EAAE,aAAa,CAAC;EACtC,IAAIC,yDAAAA,mBAAmB,EAAE,oBAAoB,CAAC;EAC/C;AAED,gBAAe,SAAS,aAAa;AACnC,sBAAoB,KAAK,IAAIC,6BAAAA,mBAAmB,SAAS,CAAC;GAC1D;AAEF,KAAI,iBACF,qBAAoB,KAAK,iBAAiB;CAG5C,MAAM,iBAAiB,IAAIC,6BAAAA,kBAAkB;EAC3C;EACA,gBAAgB;EAChB,YAAY;GAGV,qBAAqBlB,2CAAAA,eAAe,WAAW,mBAAmB;GAGlE,iBAAiBA,2CAAAA,eAAe,WAAW,aAAa;GACzD;EACF,CAAC;CAEF,MAAM,kBAAkB,IAAImB,iDAAAA,gBAAgB,EAC1C,gBAAgB,mBAAmB,KAAA,IAAY,gBAChD,CAAC;AAEF,KAAI,kBAAkB;AACpB,8BAAA,MAAM,sBAAsB,gBAAgB;AAC5C,iBAAe,SAAS;GAKtB,gBAAgB,kBAAkB,IAAIC,6BAAAA,qBAAqB;GAC3D;GACD,CAAC;;AAGJ,QAAO;EAAE;EAAgB;EAAiB;;AAG5C,MAAM,aAAa,EACjB,UACA,aACA,cACA,eACA,oBACA,cACA,oBACA,kBACA,iBACA,iBACA,kBACmB;CACnB,MAAM,qBAA2C;EAC/C,GAAG;EACH,IAAIC,+FAAAA,sCAAsC,EACxC,oBACD,CAAC;EACF,IAAIC,uEAAAA,2BAA2B;EAC/B,IAAIC,+DAAAA,uBAAuB;EAC3B,IAAIC,iEAAAA,uBAAuB,EAAE,aAAa,CAAC;EAC3C,IAAIC,mEAAAA,wBAAwB,EAAE,oBAAoB,CAAC;EACnD,IAAIC,iEAAAA,uBAAuB,EAAE,aAAa,CAAC;EAC5C;AAED,eAAc,SAAS,aAAa;AAClC,qBAAmB,KAAK,IAAItB,wBAAAA,wBAAwB,SAAS,CAAC;GAC9D;AAEF,KAAI,gBACF,oBAAmB,KAAK,gBAAgB;CAG1C,MAAM,iBAAiB,IAAIuB,wBAAAA,eAAe;EACxC;EACA,YAAY;EACb,CAAC;CAEF,MAAM,gBAAgB,IAAIC,6CAAAA,cAAc;EACtC;EACA;EACA,gBAAgB,mBAAmB,KAAA,IAAY;EAC/C,SAAS;EACV,CAAC;AAEF,KAAI,kBAAkB;AACpB,0BAAA,KAAK,wBAAwB,eAAe;AAC5C,0BAAA,IAAI,oBAAoB,cAAc;;AAGxC,QAAO;EAAE;EAAgB;EAAe;;AAG1C,MAAM,aAAa,EACjB,6BACA,uBACmB;CACnB,MAAM,iBAAiB,IAAIC,+CAAAA,eAAe,EACxC,6BACD,CAAC;AAEF,KAAI,iBACF,0BAAA,KAAK,qBAAqB,eAAe;AAG3C,QAAO"}
|
|
1
|
+
{"version":3,"file":"initSDK.cjs","names":["DiagLogLevel","diag","registry","DiagConsoleLogger","OTelPerformanceManager","validateAppID","validateAppVersion","NamespacedStorage","MXLDynamicConfigManager","getWebSDKOverridableResource","getWebSDKResource","MXLSDKFeaturesManager","nsfConfigValidation","MXLLimitManager","DEFAULT_LIMITS","getDefaultAttributeScrubbers","MXLSessionBatchedSpanProcessor","MXLTraceExporter","BatchLogRecordProcessor","MXLLogExporter","MXLW3CTraceContextPropagator","createSessionRecordingControl","noopSessionRecording","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';\nimport { page } from '../api-page';\nimport { session } from '../api-sessions';\nimport { trace } from '../api-traces';\nimport { user } from '../api-users';\nimport type { AttributeScrubber } from '../common';\nimport { MXLLogExporter, MXLTraceExporter } from '../exporters';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers';\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';\nimport { MXLW3CTraceContextPropagator } from '../propagators';\nimport {\n getWebSDKOverridableResource,\n getWebSDKResource,\n OTEL_DEFAULT_SERVICE_NAME,\n} from '../resources';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers';\nimport { noopSessionRecording } from './noopSessionRecording';\nimport { registry } from './registry';\nimport { createSessionRecordingControl } from './setupSessionRecorder';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types';\nimport { validateAppID, validateAppVersion } from './utils';\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 serviceName,\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 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 dynamicDefaultConfig = {\n ...dynamicSDKConfig,\n };\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicDefaultConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const resolvedServiceName =\n dynamicConfigManager.resolveApplicationServiceName?.(serviceName) ??\n (() => {\n const fromInit = serviceName?.trim();\n if (fromInit) {\n return fromInit;\n }\n const fromCfg = dynamicConfigManager.getConfig().serviceName?.trim();\n if (fromCfg) {\n return fromCfg;\n }\n return OTEL_DEFAULT_SERVICE_NAME;\n })();\n\n const resourceWithWebSDKAttributes = getWebSDKOverridableResource({\n serviceName: resolvedServiceName,\n })\n .merge(resource)\n .merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\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 spanSessionManager.startSessionSpan({ reason: 'init' });\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 diagLogger,\n })\n : noopSessionRecording;\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 logManager: mxlLogManager,\n spanSessionManager,\n pageManager,\n limitManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n spanSessionManager,\n pageManager,\n limitManager,\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 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 // 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 },\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initSDK.d.cts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"initSDK.d.cts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;cA4Ea,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,eAAA;EAAA;AAAA,IA8BG,aAAA,KACF,UAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initSDK.d.ts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"initSDK.d.ts","names":[],"sources":["../../src/sdk/initSDK.ts"],"mappings":";;;cA4Ea,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,eAAA;EAAA;AAAA,IA8BG,aAAA,KACF,UAAA"}
|
package/dist/sdk/initSDK.js
CHANGED
|
@@ -32,9 +32,10 @@ import { UserLogRecordProcessor } from "../processors/UserLogRecordProcessor/Use
|
|
|
32
32
|
import { UserSpanProcessor } from "../processors/UserSpanProcessor/UserSpanProcessor.js";
|
|
33
33
|
import { MXLW3CTraceContextPropagator } from "../propagators/MXLW3CTraceContextPropagator/MXLW3CTraceContextPropagator.js";
|
|
34
34
|
import { getDefaultAttributeScrubbers } from "./defaultAttributeScrubbers.js";
|
|
35
|
+
import { noopSessionRecording } from "./noopSessionRecording.js";
|
|
35
36
|
import { registry } from "./registry.js";
|
|
37
|
+
import { createSessionRecordingControl } from "./setupSessionRecorder.js";
|
|
36
38
|
import { setupDefaultInstrumentations } from "./setupDefaultInstrumentations.js";
|
|
37
|
-
import { createSessionRecordingControl, noopSessionRecording } from "./setupSessionRecorder.js";
|
|
38
39
|
import { validateAppID, validateAppVersion } from "./utils.js";
|
|
39
40
|
import { DiagConsoleLogger, DiagLogLevel, diag } from "@opentelemetry/api";
|
|
40
41
|
import { emptyResource } from "@opentelemetry/resources";
|
|
@@ -173,6 +174,18 @@ const initSDK = ({ appID, appVersion, resource = emptyResource(), spanExporters
|
|
|
173
174
|
pageManager
|
|
174
175
|
});
|
|
175
176
|
spanSessionManager.startSessionSpan({ reason: "init" });
|
|
177
|
+
const windowDisableSessionRec = typeof window !== "undefined" && window.__MXL_DISABLE_SESSION_RECORDER === true;
|
|
178
|
+
const sessionRecording = sendingToMXL && validatedAppID && enduserPseudoID && !windowDisableSessionRec ? createSessionRecordingControl({
|
|
179
|
+
resource: resourceWithWebSDKAttributes,
|
|
180
|
+
spanSessionManager,
|
|
181
|
+
tracerProvider,
|
|
182
|
+
appID: validatedAppID,
|
|
183
|
+
userID: enduserPseudoID,
|
|
184
|
+
mxlDataURL,
|
|
185
|
+
recordUserSessions,
|
|
186
|
+
sessionRecorder,
|
|
187
|
+
diagLogger
|
|
188
|
+
}) : noopSessionRecording;
|
|
176
189
|
if (!registerGlobally) registerInstrumentations({
|
|
177
190
|
tracerProvider,
|
|
178
191
|
loggerProvider,
|
|
@@ -188,17 +201,6 @@ const initSDK = ({ appID, appVersion, resource = emptyResource(), spanExporters
|
|
|
188
201
|
pageManager,
|
|
189
202
|
limitManager
|
|
190
203
|
}), ...instrumentations] });
|
|
191
|
-
const windowDisableSessionRec = typeof window !== "undefined" && window.__MXL_DISABLE_SESSION_RECORDER === true;
|
|
192
|
-
const sessionRecording = sendingToMXL && validatedAppID && enduserPseudoID && !windowDisableSessionRec ? createSessionRecordingControl({
|
|
193
|
-
resource: resourceWithWebSDKAttributes,
|
|
194
|
-
spanSessionManager,
|
|
195
|
-
tracerProvider,
|
|
196
|
-
appID: validatedAppID,
|
|
197
|
-
userID: enduserPseudoID,
|
|
198
|
-
mxlDataURL,
|
|
199
|
-
recordUserSessions,
|
|
200
|
-
sessionRecorder
|
|
201
|
-
}) : noopSessionRecording;
|
|
202
204
|
diagLogger.info("successfully initialized the SDK");
|
|
203
205
|
const sdkControl = {
|
|
204
206
|
setDynamicConfig: (config) => {
|
package/dist/sdk/initSDK.js.map
CHANGED
|
@@ -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';\nimport { page } from '../api-page';\nimport { session } from '../api-sessions';\nimport { trace } from '../api-traces';\nimport { user } from '../api-users';\nimport type { AttributeScrubber } from '../common';\nimport { MXLLogExporter, MXLTraceExporter } from '../exporters';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers';\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';\nimport { MXLW3CTraceContextPropagator } from '../propagators';\nimport {\n getWebSDKOverridableResource,\n getWebSDKResource,\n OTEL_DEFAULT_SERVICE_NAME,\n} from '../resources';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers';\nimport { registry } from './registry';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations';\nimport {\n createSessionRecordingControl,\n noopSessionRecording,\n} from './setupSessionRecorder';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types';\nimport { validateAppID, validateAppVersion } from './utils';\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 serviceName,\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 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 dynamicDefaultConfig = {\n ...dynamicSDKConfig,\n };\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicDefaultConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const resolvedServiceName =\n dynamicConfigManager.resolveApplicationServiceName?.(serviceName) ??\n (() => {\n const fromInit = serviceName?.trim();\n if (fromInit) {\n return fromInit;\n }\n const fromCfg = dynamicConfigManager.getConfig().serviceName?.trim();\n if (fromCfg) {\n return fromCfg;\n }\n return OTEL_DEFAULT_SERVICE_NAME;\n })();\n\n const resourceWithWebSDKAttributes = getWebSDKOverridableResource({\n serviceName: resolvedServiceName,\n })\n .merge(resource)\n .merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\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 spanSessionManager.startSessionSpan({ reason: 'init' });\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 logManager: mxlLogManager,\n spanSessionManager,\n pageManager,\n limitManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n spanSessionManager,\n pageManager,\n limitManager,\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 // 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 },\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';\nimport { page } from '../api-page';\nimport { session } from '../api-sessions';\nimport { trace } from '../api-traces';\nimport { user } from '../api-users';\nimport type { AttributeScrubber } from '../common';\nimport { MXLLogExporter, MXLTraceExporter } from '../exporters';\nimport {\n DEFAULT_LIMITS,\n MXLDynamicConfigManager,\n MXLLimitManager,\n MXLLogManager,\n MXLPageManager,\n MXLSDKFeaturesManager,\n MXLSpanSessionManager,\n MXLTraceManager,\n MXLUserManager,\n} from '../managers';\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';\nimport { MXLW3CTraceContextPropagator } from '../propagators';\nimport {\n getWebSDKOverridableResource,\n getWebSDKResource,\n OTEL_DEFAULT_SERVICE_NAME,\n} from '../resources';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n} from '../utils';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers';\nimport { noopSessionRecording } from './noopSessionRecording';\nimport { registry } from './registry';\nimport { createSessionRecordingControl } from './setupSessionRecorder';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupSessionArgs,\n SetupTracesArgs,\n SetupUserArgs,\n} from './types';\nimport { validateAppID, validateAppVersion } from './utils';\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 serviceName,\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 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 dynamicDefaultConfig = {\n ...dynamicSDKConfig,\n };\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new MXLDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n mxlConfigURL,\n defaultConfig: dynamicDefaultConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const resolvedServiceName =\n dynamicConfigManager.resolveApplicationServiceName?.(serviceName) ??\n (() => {\n const fromInit = serviceName?.trim();\n if (fromInit) {\n return fromInit;\n }\n const fromCfg = dynamicConfigManager.getConfig().serviceName?.trim();\n if (fromCfg) {\n return fromCfg;\n }\n return OTEL_DEFAULT_SERVICE_NAME;\n })();\n\n const resourceWithWebSDKAttributes = getWebSDKOverridableResource({\n serviceName: resolvedServiceName,\n })\n .merge(resource)\n .merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n pageSessionStorage: sdkSessionStorage,\n }),\n );\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 spanSessionManager.startSessionSpan({ reason: 'init' });\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 diagLogger,\n })\n : noopSessionRecording;\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 logManager: mxlLogManager,\n spanSessionManager,\n pageManager,\n limitManager,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n spanSessionManager,\n pageManager,\n limitManager,\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 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 // 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 },\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,10 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/sdk/noopSessionRecording.ts
|
|
3
|
+
const noopSessionRecording = {
|
|
4
|
+
isRecording: () => false,
|
|
5
|
+
setEnabled: () => {}
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
exports.noopSessionRecording = noopSessionRecording;
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=noopSessionRecording.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noopSessionRecording.cjs","names":[],"sources":["../../src/sdk/noopSessionRecording.ts"],"sourcesContent":["import type { SessionRecordingControl } from './types';\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"],"mappings":";;AAEA,MAAa,uBAAgD;CAC3D,mBAAmB;CACnB,kBAAkB;CAGnB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SessionRecordingControl } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/sdk/noopSessionRecording.d.ts
|
|
4
|
+
declare const noopSessionRecording: SessionRecordingControl;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { noopSessionRecording };
|
|
7
|
+
//# sourceMappingURL=noopSessionRecording.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noopSessionRecording.d.cts","names":[],"sources":["../../src/sdk/noopSessionRecording.ts"],"mappings":";;;cAEa,oBAAA,EAAsB,uBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noopSessionRecording.d.ts","names":[],"sources":["../../src/sdk/noopSessionRecording.ts"],"mappings":";;;cAEa,oBAAA,EAAsB,uBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noopSessionRecording.js","names":[],"sources":["../../src/sdk/noopSessionRecording.ts"],"sourcesContent":["import type { SessionRecordingControl } from './types';\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"],"mappings":";AAEA,MAAa,uBAAgD;CAC3D,mBAAmB;CACnB,kBAAkB;CAGnB"}
|
|
@@ -1,45 +1,87 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
require("../_virtual/_rolldown/runtime.cjs");
|
|
3
2
|
const require_exporters_utils = require("../exporters/utils.cjs");
|
|
4
3
|
const require_exporters_MXLLogExporter_utils = require("../exporters/MXLLogExporter/utils.cjs");
|
|
5
|
-
let _safaricom_mxl_session_recorder = require("@safaricom-mxl/session-recorder");
|
|
6
4
|
//#region src/sdk/setupSessionRecorder.ts
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
let sessionRecorderModulePromise;
|
|
6
|
+
let sessionRecorderModuleLoaderOverride;
|
|
7
|
+
function loadSessionRecorderModule() {
|
|
8
|
+
if (sessionRecorderModuleLoaderOverride) return sessionRecorderModuleLoaderOverride();
|
|
9
|
+
sessionRecorderModulePromise ??= import("@safaricom-mxl/session-recorder");
|
|
10
|
+
return sessionRecorderModulePromise;
|
|
11
|
+
}
|
|
12
|
+
function resetSessionRecorderModuleCache() {
|
|
13
|
+
sessionRecorderModulePromise = void 0;
|
|
14
|
+
sessionRecorderModuleLoaderOverride = void 0;
|
|
15
|
+
}
|
|
16
|
+
function setSessionRecorderModuleLoaderForTests(loader) {
|
|
17
|
+
sessionRecorderModuleLoaderOverride = loader;
|
|
18
|
+
sessionRecorderModulePromise = void 0;
|
|
19
|
+
}
|
|
20
|
+
function buildInitConfig({ resource, spanSessionManager, tracerProvider, appID, userID, mxlDataURL, sessionRecorder: userOptions }, sessionRecorderVersion) {
|
|
12
21
|
return {
|
|
13
22
|
resource,
|
|
14
23
|
getSessionId: () => spanSessionManager.getSessionId(),
|
|
15
|
-
tracer: tracerProvider.getTracer("mxl.session-recorder",
|
|
24
|
+
tracer: tracerProvider.getTracer("mxl.session-recorder", sessionRecorderVersion),
|
|
16
25
|
url: require_exporters_MXLLogExporter_utils.getLogEndpoint(appID, mxlDataURL),
|
|
17
26
|
headers: require_exporters_utils.getMXLHeaders(appID, userID),
|
|
18
27
|
...userOptions
|
|
19
28
|
};
|
|
20
29
|
}
|
|
21
30
|
function createSessionRecordingControl(args) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
let sessionRecorderModule;
|
|
32
|
+
let initStarted = false;
|
|
33
|
+
let initComplete = false;
|
|
34
|
+
let initFailed = false;
|
|
35
|
+
let pendingInit;
|
|
36
|
+
const getSessionRecorder = () => sessionRecorderModule?.SessionRecorder;
|
|
37
|
+
const waitForSessionStart = () => new Promise((resolve) => {
|
|
38
|
+
const removeListener = args.spanSessionManager.addSessionStartedListener(() => {
|
|
39
|
+
removeListener();
|
|
40
|
+
resolve();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
const initSessionRecorderWhenReady = () => {
|
|
44
|
+
if (initComplete || initFailed) return Promise.resolve();
|
|
45
|
+
pendingInit ??= (async () => {
|
|
46
|
+
if (args.spanSessionManager.getSessionId() === null) await waitForSessionStart();
|
|
47
|
+
if (initComplete || initFailed || initStarted) return;
|
|
48
|
+
initStarted = true;
|
|
49
|
+
try {
|
|
50
|
+
sessionRecorderModule = await loadSessionRecorderModule();
|
|
51
|
+
const config = buildInitConfig(args, sessionRecorderModule.VERSION);
|
|
52
|
+
sessionRecorderModule.SessionRecorder.init(config);
|
|
53
|
+
initComplete = true;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
initFailed = true;
|
|
56
|
+
args.diagLogger.error("Failed to initialize session recorder", error);
|
|
57
|
+
} finally {
|
|
58
|
+
pendingInit = void 0;
|
|
29
59
|
}
|
|
30
|
-
};
|
|
31
|
-
|
|
60
|
+
})();
|
|
61
|
+
return pendingInit;
|
|
62
|
+
};
|
|
63
|
+
if (args.recordUserSessions) initSessionRecorderWhenReady();
|
|
32
64
|
return {
|
|
33
|
-
isRecording: () =>
|
|
65
|
+
isRecording: () => Boolean(getSessionRecorder()?.isRecording()),
|
|
34
66
|
setEnabled: (enabled) => {
|
|
35
|
-
if (enabled)
|
|
36
|
-
|
|
37
|
-
|
|
67
|
+
if (enabled) {
|
|
68
|
+
if (initComplete) {
|
|
69
|
+
getSessionRecorder()?.setEnabled(true);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
initSessionRecorderWhenReady().then(() => {
|
|
73
|
+
if (initComplete) getSessionRecorder()?.setEnabled(true);
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (initComplete) getSessionRecorder()?.setEnabled(false);
|
|
38
78
|
}
|
|
39
79
|
};
|
|
40
80
|
}
|
|
41
81
|
//#endregion
|
|
42
82
|
exports.createSessionRecordingControl = createSessionRecordingControl;
|
|
43
|
-
exports.
|
|
83
|
+
exports.loadSessionRecorderModule = loadSessionRecorderModule;
|
|
84
|
+
exports.resetSessionRecorderModuleCache = resetSessionRecorderModuleCache;
|
|
85
|
+
exports.setSessionRecorderModuleLoaderForTests = setSessionRecorderModuleLoaderForTests;
|
|
44
86
|
|
|
45
87
|
//# sourceMappingURL=setupSessionRecorder.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupSessionRecorder.cjs","names":["
|
|
1
|
+
{"version":3,"file":"setupSessionRecorder.cjs","names":["getLogEndpoint","getMXLHeaders"],"sources":["../../src/sdk/setupSessionRecorder.ts"],"sourcesContent":["import type { DiagLogger } from '@opentelemetry/api';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { WebTracerProvider } from '@opentelemetry/sdk-trace-web';\nimport type { SessionRecorderConfig } from '@safaricom-mxl/session-recorder';\nimport { getLogEndpoint } from '../exporters/MXLLogExporter/utils';\nimport { getMXLHeaders } from '../exporters/utils';\nimport type {\n SessionRecorderUserConfig,\n SessionRecordingControl,\n} from './types';\n\ntype SessionRecorderModule = typeof import('@safaricom-mxl/session-recorder');\n\nlet sessionRecorderModulePromise: Promise<SessionRecorderModule> | undefined;\nlet sessionRecorderModuleLoaderOverride:\n | (() => Promise<SessionRecorderModule>)\n | undefined;\n\nexport function loadSessionRecorderModule(): Promise<SessionRecorderModule> {\n if (sessionRecorderModuleLoaderOverride) {\n return sessionRecorderModuleLoaderOverride();\n }\n\n sessionRecorderModulePromise ??= import('@safaricom-mxl/session-recorder');\n return sessionRecorderModulePromise;\n}\n\nexport function resetSessionRecorderModuleCache(): void {\n sessionRecorderModulePromise = undefined;\n sessionRecorderModuleLoaderOverride = undefined;\n}\n\nexport function setSessionRecorderModuleLoaderForTests(\n loader: (() => Promise<SessionRecorderModule>) | undefined,\n): void {\n sessionRecorderModuleLoaderOverride = loader;\n sessionRecorderModulePromise = undefined;\n}\n\ninterface SpanSessionManagerForRecorder {\n getSessionId: () => string | null;\n addSessionStartedListener: (listener: () => void) => () => void;\n}\n\ninterface CreateSessionRecordingControlArgs {\n resource: Resource;\n spanSessionManager: SpanSessionManagerForRecorder;\n tracerProvider: WebTracerProvider;\n appID: string;\n userID: string;\n mxlDataURL?: string;\n recordUserSessions: boolean;\n sessionRecorder?: SessionRecorderUserConfig;\n diagLogger: DiagLogger;\n}\n\nfunction buildInitConfig(\n {\n resource,\n spanSessionManager,\n tracerProvider,\n appID,\n userID,\n mxlDataURL,\n sessionRecorder: userOptions,\n }: CreateSessionRecordingControlArgs,\n sessionRecorderVersion: string,\n): SessionRecorderConfig {\n const tracer = tracerProvider.getTracer(\n 'mxl.session-recorder',\n sessionRecorderVersion,\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(\n args: CreateSessionRecordingControlArgs,\n): SessionRecordingControl {\n let sessionRecorderModule: SessionRecorderModule | undefined;\n let initStarted = false;\n let initComplete = false;\n let initFailed = false;\n let pendingInit: Promise<void> | undefined;\n\n const getSessionRecorder = ():\n | SessionRecorderModule['SessionRecorder']\n | undefined => sessionRecorderModule?.SessionRecorder;\n\n const waitForSessionStart = (): Promise<void> =>\n new Promise((resolve) => {\n const removeListener = args.spanSessionManager.addSessionStartedListener(\n () => {\n removeListener();\n resolve();\n },\n );\n });\n\n const initSessionRecorderWhenReady = (): Promise<void> => {\n if (initComplete || initFailed) {\n return Promise.resolve();\n }\n\n pendingInit ??= (async () => {\n if (args.spanSessionManager.getSessionId() === null) {\n await waitForSessionStart();\n }\n\n if (initComplete || initFailed || initStarted) {\n return;\n }\n initStarted = true;\n\n try {\n sessionRecorderModule = await loadSessionRecorderModule();\n const config = buildInitConfig(args, sessionRecorderModule.VERSION);\n sessionRecorderModule.SessionRecorder.init(config);\n initComplete = true;\n } catch (error) {\n initFailed = true;\n args.diagLogger.error('Failed to initialize session recorder', error);\n } finally {\n pendingInit = undefined;\n }\n })();\n\n return pendingInit;\n };\n\n if (args.recordUserSessions) {\n void initSessionRecorderWhenReady();\n }\n\n return {\n isRecording: () => Boolean(getSessionRecorder()?.isRecording()),\n setEnabled: (enabled: boolean) => {\n if (enabled) {\n if (initComplete) {\n getSessionRecorder()?.setEnabled(true);\n return;\n }\n void initSessionRecorderWhenReady().then(() => {\n if (initComplete) {\n getSessionRecorder()?.setEnabled(true);\n }\n });\n return;\n }\n\n if (initComplete) {\n getSessionRecorder()?.setEnabled(false);\n }\n },\n };\n}\n"],"mappings":";;;;AAaA,IAAI;AACJ,IAAI;AAIJ,SAAgB,4BAA4D;AAC1E,KAAI,oCACF,QAAO,qCAAqC;AAG9C,kCAAiC,OAAO;AACxC,QAAO;;AAGT,SAAgB,kCAAwC;AACtD,gCAA+B,KAAA;AAC/B,uCAAsC,KAAA;;AAGxC,SAAgB,uCACd,QACM;AACN,uCAAsC;AACtC,gCAA+B,KAAA;;AAoBjC,SAAS,gBACP,EACE,UACA,oBACA,gBACA,OACA,QACA,YACA,iBAAiB,eAEnB,wBACuB;AAKvB,QAAO;EACL;EACA,oBAAoB,mBAAmB,cAAc;EACrD,QAPa,eAAe,UAC5B,wBACA,uBAKM;EACN,KAAKA,uCAAAA,eAAe,OAAO,WAAW;EACtC,SAASC,wBAAAA,cAAc,OAAO,OAAO;EACrC,GAAG;EACJ;;AAGH,SAAgB,8BACd,MACyB;CACzB,IAAI;CACJ,IAAI,cAAc;CAClB,IAAI,eAAe;CACnB,IAAI,aAAa;CACjB,IAAI;CAEJ,MAAM,2BAEW,uBAAuB;CAExC,MAAM,4BACJ,IAAI,SAAS,YAAY;EACvB,MAAM,iBAAiB,KAAK,mBAAmB,gCACvC;AACJ,mBAAgB;AAChB,YAAS;IAEZ;GACD;CAEJ,MAAM,qCAAoD;AACxD,MAAI,gBAAgB,WAClB,QAAO,QAAQ,SAAS;AAG1B,mBAAiB,YAAY;AAC3B,OAAI,KAAK,mBAAmB,cAAc,KAAK,KAC7C,OAAM,qBAAqB;AAG7B,OAAI,gBAAgB,cAAc,YAChC;AAEF,iBAAc;AAEd,OAAI;AACF,4BAAwB,MAAM,2BAA2B;IACzD,MAAM,SAAS,gBAAgB,MAAM,sBAAsB,QAAQ;AACnE,0BAAsB,gBAAgB,KAAK,OAAO;AAClD,mBAAe;YACR,OAAO;AACd,iBAAa;AACb,SAAK,WAAW,MAAM,yCAAyC,MAAM;aAC7D;AACR,kBAAc,KAAA;;MAEd;AAEJ,SAAO;;AAGT,KAAI,KAAK,mBACF,+BAA8B;AAGrC,QAAO;EACL,mBAAmB,QAAQ,oBAAoB,EAAE,aAAa,CAAC;EAC/D,aAAa,YAAqB;AAChC,OAAI,SAAS;AACX,QAAI,cAAc;AAChB,yBAAoB,EAAE,WAAW,KAAK;AACtC;;AAEG,kCAA8B,CAAC,WAAW;AAC7C,SAAI,aACF,qBAAoB,EAAE,WAAW,KAAK;MAExC;AACF;;AAGF,OAAI,aACF,qBAAoB,EAAE,WAAW,MAAM;;EAG5C"}
|