UNPKG

@datadog/mobile-react-native

Version:

A client-side React Native module to interact with Datadog

268 lines (258 loc) 13.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DdSdkReactNative = void 0; var _package = require("react-native/package.json"); var _reactNative = require("react-native"); var _DdSdkReactNativeConfiguration = require("./DdSdkReactNativeConfiguration"); var _InternalLog = require("./InternalLog"); var _SdkVerbosity = require("./SdkVerbosity"); var _DdLogs = require("./logs/DdLogs"); var _DdRum = require("./rum/DdRum"); var _DdRumErrorTracking = require("./rum/instrumentation/DdRumErrorTracking"); var _DdBabelInteractionTracking = require("./rum/instrumentation/interactionTracking/DdBabelInteractionTracking"); var _DdRumUserInteractionTracking = require("./rum/instrumentation/interactionTracking/DdRumUserInteractionTracking"); var _DdRumResourceTracking = require("./rum/instrumentation/resourceTracking/DdRumResourceTracking"); var _AttributesSingleton = require("./sdk/AttributesSingleton/AttributesSingleton"); var _DdSdkInternalNativeBridge = require("./sdk/DatadogInternalBridge/DdSdkInternalNativeBridge"); var _BufferSingleton = require("./sdk/DatadogProvider/Buffer/BufferSingleton"); var _DdSdk = require("./sdk/DdSdk"); var _FileBasedConfiguration = require("./sdk/FileBasedConfiguration/FileBasedConfiguration"); var _GlobalState = require("./sdk/GlobalState/GlobalState"); var _UserInfoSingleton = require("./sdk/UserInfoSingleton/UserInfoSingleton"); var _types = require("./types"); var _longTasksUtils = require("./utils/longTasksUtils"); var _version = require("./version"); /* * Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0. * This product includes software developed at Datadog (https://www.datadoghq.com/). * Copyright 2016-Present Datadog, Inc. */ /** * This class initializes the Datadog SDK, and sets up communication with the server. */ class DdSdkReactNative { static DD_SOURCE_KEY = '_dd.source'; static DD_SDK_VERSION = '_dd.sdk_version'; static DD_VERSION = '_dd.version'; static DD_VERSION_SUFFIX = '_dd.version_suffix'; static DD_REACT_NATIVE_VERSION = '_dd.react_native_version'; static wasAutoInstrumented = false; /** * Initializes the Datadog SDK. * @param configuration the configuration for the SDK library * @returns a Promise. */ static initialize = async configuration => { await DdSdkReactNative.initializeNativeSDK(configuration, { initializationModeForTelemetry: 'LEGACY' }); DdSdkReactNative.enableFeatures(configuration); }; static initializeNativeSDK = async (configuration, params) => { if (_GlobalState.GlobalState.instance.isInitialized) { _InternalLog.InternalLog.log("Can't initialize Datadog, SDK was already initialized", _SdkVerbosity.SdkVerbosity.WARN); if (!__DEV__) { _DdSdk.DdSdk.telemetryDebug('RN SDK was already initialized in javascript'); } return new Promise(resolve => resolve()); } _InternalLog.InternalLog.verbosity = configuration.verbosity; (0, _DdSdkInternalNativeBridge.registerNativeBridge)(); await _DdSdk.DdSdk.initialize(DdSdkReactNative.buildConfiguration(configuration, params)); _InternalLog.InternalLog.log('Datadog SDK was initialized', _SdkVerbosity.SdkVerbosity.INFO); _GlobalState.GlobalState.instance.isInitialized = true; _BufferSingleton.BufferSingleton.onInitialization(); }; /** * FOR INTERNAL USE ONLY. */ static _initializeFromDatadogProvider = async configuration => { DdSdkReactNative.enableFeatures(configuration); if (configuration instanceof _FileBasedConfiguration.FileBasedConfiguration) { return DdSdkReactNative.initializeNativeSDK(configuration, { initializationModeForTelemetry: 'FILE' }); } if (configuration.initializationMode === _DdSdkReactNativeConfiguration.InitializationMode.SYNC) { return DdSdkReactNative.initializeNativeSDK(configuration, { initializationModeForTelemetry: 'SYNC' }); } if (configuration.initializationMode === _DdSdkReactNativeConfiguration.InitializationMode.ASYNC) { return _reactNative.InteractionManager.runAfterInteractions(() => { return DdSdkReactNative.initializeNativeSDK(configuration, { initializationModeForTelemetry: 'ASYNC' }); }); } // TODO: Remove when DdSdkReactNativeConfiguration is deprecated if (configuration instanceof _DdSdkReactNativeConfiguration.DdSdkReactNativeConfiguration) { return DdSdkReactNative.initializeNativeSDK(configuration, { initializationModeForTelemetry: 'SYNC' }); } }; /** * FOR INTERNAL USE ONLY. */ static _enableFeaturesFromDatadogProvider = features => { DdSdkReactNative._enableFeaturesFromDatadogProviderAsync(features); }; static _enableFeaturesFromDatadogProviderAsync = async features => { DdSdkReactNative.features = features; DdSdkReactNative.enableFeatures((0, _DdSdkReactNativeConfiguration.addDefaultValuesToAutoInstrumentationConfiguration)(features)); }; /** * FOR INTERNAL USE ONLY. */ static _initializeFromDatadogProviderWithConfigurationAsync = async configuration => { if (!DdSdkReactNative.features) { _InternalLog.InternalLog.log("Can't initialize Datadog, make sure the DatadogProvider component is mounted before calling this function", _SdkVerbosity.SdkVerbosity.WARN); return new Promise(resolve => resolve()); } return DdSdkReactNative.initializeNativeSDK((0, _DdSdkReactNativeConfiguration.buildConfigurationFromPartialConfiguration)(DdSdkReactNative.features, configuration), { initializationModeForTelemetry: 'PARTIAL' }); }; /** * Adds a set of attributes to the global context attached with all future Logs, Spans and RUM events. * To remove an attribute, set it to `undefined` in a call to `setAttributes`. * @param attributes: The global context attributes. * @returns a Promise. */ // eslint-disable-next-line @typescript-eslint/ban-types static setAttributes = async attributes => { _InternalLog.InternalLog.log(`Setting attributes ${JSON.stringify(attributes)}`, _SdkVerbosity.SdkVerbosity.DEBUG); await _DdSdk.DdSdk.setAttributes(attributes); _AttributesSingleton.AttributesSingleton.getInstance().setAttributes(attributes); }; /** * Set the user information. * @deprecated UserInfo id property is now mandatory (please user setUserInfo instead) * @param user: The user object (use builtin attributes: 'id', 'email', 'name', and/or any custom attribute). * @returns a Promise. */ // eslint-disable-next-line @typescript-eslint/ban-types static setUser = async user => { _InternalLog.InternalLog.log(`Setting user ${JSON.stringify(user)}`, _SdkVerbosity.SdkVerbosity.DEBUG); await _DdSdk.DdSdk.setUser(user); _UserInfoSingleton.UserInfoSingleton.getInstance().setUserInfo(user); }; /** * Sets the user information. * @param id: A mandatory unique user identifier (relevant to your business domain). * @param name: The user name or alias. * @param email: The user email. * @param extraInfo: Additional information. * @returns a Promise. */ static setUserInfo = async userInfo => { _InternalLog.InternalLog.log(`Setting user ${JSON.stringify(userInfo)}`, _SdkVerbosity.SdkVerbosity.DEBUG); await _DdSdk.DdSdk.setUserInfo(userInfo); _UserInfoSingleton.UserInfoSingleton.getInstance().setUserInfo(userInfo); }; /** * Set the user information. * @param extraUserInfo: The additional information. (To set the id, name or email please user setUserInfo). * @returns a Promise. */ static addUserExtraInfo = async extraUserInfo => { _InternalLog.InternalLog.log(`Adding extra user info ${JSON.stringify(extraUserInfo)}`, _SdkVerbosity.SdkVerbosity.DEBUG); const userInfo = _UserInfoSingleton.UserInfoSingleton.getInstance().getUserInfo(); const updatedUserInfo = { ...userInfo, extraInfo: { ...userInfo.extraInfo, ...extraUserInfo } }; await _DdSdk.DdSdk.addUserExtraInfo(extraUserInfo); _UserInfoSingleton.UserInfoSingleton.getInstance().setUserInfo(updatedUserInfo); }; /** * Set the tracking consent regarding the data collection. * @param trackingConsent: One of TrackingConsent values. * @returns a Promise. */ static setTrackingConsent = consent => { _InternalLog.InternalLog.log(`Setting consent ${consent}`, _SdkVerbosity.SdkVerbosity.DEBUG); return _DdSdk.DdSdk.setTrackingConsent(consent); }; /** * Clears all data that has not already been sent to Datadog servers * @returns a Promise */ static clearAllData = () => { _InternalLog.InternalLog.log('Clearing all data', _SdkVerbosity.SdkVerbosity.DEBUG); return _DdSdk.DdSdk.clearAllData(); }; static buildConfiguration = (configuration, params) => { configuration.additionalConfiguration[DdSdkReactNative.DD_SOURCE_KEY] = 'react-native'; configuration.additionalConfiguration[DdSdkReactNative.DD_SDK_VERSION] = _version.version; if (configuration.version) { configuration.additionalConfiguration[DdSdkReactNative.DD_VERSION] = `${configuration.version}${configuration.versionSuffix ? `-${configuration.versionSuffix}` : ''}`; } // If both version and version suffix are provided, we merge them into the version field. // To avoid adding it in again the native part, we only set it if the version isn't set. if (configuration.versionSuffix && !configuration.version) { configuration.additionalConfiguration[DdSdkReactNative.DD_VERSION_SUFFIX] = `-${configuration.versionSuffix}`; } if (_package.version) { configuration.additionalConfiguration[DdSdkReactNative.DD_REACT_NATIVE_VERSION] = `${_package.version}`; } return new _types.DdSdkConfiguration(configuration.clientToken, configuration.env, configuration.applicationId, configuration.nativeCrashReportEnabled, (0, _longTasksUtils.adaptLongTaskThreshold)(configuration.nativeLongTaskThresholdMs), (0, _longTasksUtils.adaptLongTaskThreshold)(configuration.longTaskThresholdMs), configuration.sampleRate === undefined ? configuration.sessionSamplingRate : configuration.sampleRate, configuration.site, configuration.trackingConsent, configuration.additionalConfiguration, configuration.telemetrySampleRate, configuration.vitalsUpdateFrequency, configuration.uploadFrequency, configuration.batchSize, configuration.trackFrustrations, configuration.trackBackgroundEvents, configuration.customEndpoints, { initializationType: params.initializationModeForTelemetry, trackErrors: configuration.trackErrors, trackInteractions: configuration.trackInteractions, trackNetworkRequests: configuration.trackResources, // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires reactNativeVersion: require('react-native/package.json').version, // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires reactVersion: require('react/package.json').version }, configuration.nativeViewTracking, configuration.nativeInteractionTracking, configuration.verbosity, configuration.proxyConfig, configuration.serviceName, (0, _DdSdkReactNativeConfiguration.formatFirstPartyHosts)(configuration.firstPartyHosts), configuration.bundleLogsWithRum, configuration.bundleLogsWithTraces, configuration.trackNonFatalAnrs, configuration.appHangThreshold, configuration.resourceTracingSamplingRate, configuration.trackWatchdogTerminations, configuration.batchProcessingLevel, configuration.initialResourceThreshold); }; static enableFeatures(configuration) { if (globalThis.__DD_RN_BABEL_PLUGIN_ENABLED__) { _DdBabelInteractionTracking.DdBabelInteractionTracking.config = { trackInteractions: configuration.trackInteractions, useAccessibilityLabel: configuration.useAccessibilityLabel }; } if (DdSdkReactNative.wasAutoInstrumented) { _InternalLog.InternalLog.log("Can't auto instrument Datadog, SDK was already instrumented", _SdkVerbosity.SdkVerbosity.WARN); return; } if (configuration.trackInteractions && !globalThis.__DD_RN_BABEL_PLUGIN_ENABLED__) { _DdRumUserInteractionTracking.DdRumUserInteractionTracking.startTracking({ actionNameAttribute: configuration.actionNameAttribute, useAccessibilityLabel: configuration.useAccessibilityLabel }); } if (configuration.trackResources) { _DdRumResourceTracking.DdRumResourceTracking.startTracking({ tracingSamplingRate: configuration.resourceTracingSamplingRate, firstPartyHosts: (0, _DdSdkReactNativeConfiguration.formatFirstPartyHosts)(configuration.firstPartyHosts) }); } if (configuration.trackErrors) { _DdRumErrorTracking.DdRumErrorTracking.startTracking(); } if (configuration.logEventMapper) { _DdLogs.DdLogs.registerLogEventMapper(configuration.logEventMapper); } if (configuration.errorEventMapper) { _DdRum.DdRum.registerErrorEventMapper(configuration.errorEventMapper); } if (configuration.resourceEventMapper) { _DdRum.DdRum.registerResourceEventMapper(configuration.resourceEventMapper); } if (configuration.actionEventMapper) { _DdRum.DdRum.registerActionEventMapper(configuration.actionEventMapper); } DdSdkReactNative.wasAutoInstrumented = true; } } exports.DdSdkReactNative = DdSdkReactNative; //# sourceMappingURL=DdSdkReactNative.js.map