@datadog/mobile-react-native
Version:
A client-side React Native module to interact with Datadog
268 lines (258 loc) • 13.6 kB
JavaScript
;
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