@sentry/react-native 6.10.0 → 6.11.0-beta.0
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/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +43 -21
- package/android/src/main/java/io/sentry/react/RNSentryOnDrawReporterManager.java +82 -51
- package/android/src/main/java/io/sentry/react/RNSentryTimeToDisplay.java +37 -0
- package/android/src/main/java/io/sentry/react/RNSentryVersion.java +1 -1
- package/android/src/newarch/java/io/sentry/react/RNSentryModule.java +10 -0
- package/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +5 -0
- package/dist/js/NativeRNSentry.d.ts +2 -0
- package/dist/js/NativeRNSentry.d.ts.map +1 -1
- package/dist/js/NativeRNSentry.js.map +1 -1
- package/dist/js/index.d.ts +1 -1
- package/dist/js/index.d.ts.map +1 -1
- package/dist/js/index.js +1 -1
- package/dist/js/index.js.map +1 -1
- package/dist/js/integrations/appRegistry.d.ts +8 -0
- package/dist/js/integrations/appRegistry.d.ts.map +1 -0
- package/dist/js/integrations/appRegistry.js +43 -0
- package/dist/js/integrations/appRegistry.js.map +1 -0
- package/dist/js/integrations/default.d.ts.map +1 -1
- package/dist/js/integrations/default.js +5 -1
- package/dist/js/integrations/default.js.map +1 -1
- package/dist/js/integrations/exports.d.ts +2 -0
- package/dist/js/integrations/exports.d.ts.map +1 -1
- package/dist/js/integrations/exports.js +2 -0
- package/dist/js/integrations/exports.js.map +1 -1
- package/dist/js/replay/CustomMask.d.ts.map +1 -1
- package/dist/js/replay/CustomMask.js +3 -2
- package/dist/js/replay/CustomMask.js.map +1 -1
- package/dist/js/tracing/integrations/appStart.d.ts.map +1 -1
- package/dist/js/tracing/integrations/appStart.js +37 -6
- package/dist/js/tracing/integrations/appStart.js.map +1 -1
- package/dist/js/tracing/integrations/timeToDisplayIntegration.d.ts +4 -0
- package/dist/js/tracing/integrations/timeToDisplayIntegration.d.ts.map +1 -0
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js +193 -0
- package/dist/js/tracing/integrations/timeToDisplayIntegration.js.map +1 -0
- package/dist/js/tracing/ops.d.ts +2 -0
- package/dist/js/tracing/ops.d.ts.map +1 -1
- package/dist/js/tracing/ops.js +2 -0
- package/dist/js/tracing/ops.js.map +1 -1
- package/dist/js/tracing/reactnativeprofiler.d.ts.map +1 -1
- package/dist/js/tracing/reactnativeprofiler.js +5 -0
- package/dist/js/tracing/reactnativeprofiler.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts +20 -2
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +68 -40
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/tracing/semanticAttributes.d.ts +2 -0
- package/dist/js/tracing/semanticAttributes.d.ts.map +1 -1
- package/dist/js/tracing/semanticAttributes.js +2 -0
- package/dist/js/tracing/semanticAttributes.js.map +1 -1
- package/dist/js/tracing/timeToDisplayFallback.d.ts +3 -0
- package/dist/js/tracing/timeToDisplayFallback.d.ts.map +1 -0
- package/dist/js/tracing/timeToDisplayFallback.js +21 -0
- package/dist/js/tracing/timeToDisplayFallback.js.map +1 -0
- package/dist/js/tracing/timetodisplay.d.ts +29 -0
- package/dist/js/tracing/timetodisplay.d.ts.map +1 -1
- package/dist/js/tracing/timetodisplay.js +43 -20
- package/dist/js/tracing/timetodisplay.js.map +1 -1
- package/dist/js/tracing/timetodisplaynative.d.ts.map +1 -1
- package/dist/js/tracing/timetodisplaynative.js +2 -1
- package/dist/js/tracing/timetodisplaynative.js.map +1 -1
- package/dist/js/tracing/timetodisplaynative.types.d.ts +1 -3
- package/dist/js/tracing/timetodisplaynative.types.d.ts.map +1 -1
- package/dist/js/tracing/timetodisplaynative.types.js.map +1 -1
- package/dist/js/utils/rnlibraries.d.ts +1 -1
- package/dist/js/utils/rnlibraries.d.ts.map +1 -1
- package/dist/js/utils/rnlibraries.js +5 -3
- package/dist/js/utils/rnlibraries.js.map +1 -1
- package/dist/js/utils/rnlibrariesinterface.d.ts +1 -0
- package/dist/js/utils/rnlibrariesinterface.d.ts.map +1 -1
- package/dist/js/utils/rnlibrariesinterface.js.map +1 -1
- package/dist/js/vendor/react-native/index.d.ts +3 -0
- package/dist/js/vendor/react-native/index.d.ts.map +1 -1
- package/dist/js/vendor/react-native/index.js.map +1 -1
- package/dist/js/vendor/react-navigation/types.d.ts +27 -0
- package/dist/js/vendor/react-navigation/types.d.ts.map +1 -0
- package/dist/js/vendor/react-navigation/types.js +3 -0
- package/dist/js/vendor/react-navigation/types.js.map +1 -0
- package/dist/js/version.d.ts +1 -1
- package/dist/js/version.d.ts.map +1 -1
- package/dist/js/version.js +1 -1
- package/dist/js/version.js.map +1 -1
- package/dist/js/wrapper.d.ts +2 -0
- package/dist/js/wrapper.d.ts.map +1 -1
- package/dist/js/wrapper.js +24 -0
- package/dist/js/wrapper.js.map +1 -1
- package/ios/RNSentry.mm +15 -6
- package/ios/RNSentryFramesTrackerListener.h +7 -3
- package/ios/RNSentryOnDrawReporter.h +6 -2
- package/ios/RNSentryOnDrawReporter.m +47 -20
- package/ios/RNSentryTimeToDisplay.h +7 -0
- package/ios/RNSentryTimeToDisplay.m +69 -2
- package/ios/RNSentryVersion.m +1 -1
- package/package.json +2 -2
- package/scripts/sentry-xcode-debug-files.sh +1 -4
- package/scripts/sentry-xcode.sh +1 -4
- package/sentry.gradle +4 -2
- package/src/js/NativeRNSentry.ts +2 -0
- package/ts3.8/dist/js/NativeRNSentry.d.ts +2 -0
- package/ts3.8/dist/js/index.d.ts +1 -1
- package/ts3.8/dist/js/integrations/appRegistry.d.ts +8 -0
- package/ts3.8/dist/js/integrations/exports.d.ts +2 -0
- package/ts3.8/dist/js/tracing/integrations/timeToDisplayIntegration.d.ts +4 -0
- package/ts3.8/dist/js/tracing/ops.d.ts +2 -0
- package/ts3.8/dist/js/tracing/reactnavigation.d.ts +20 -2
- package/ts3.8/dist/js/tracing/semanticAttributes.d.ts +2 -0
- package/ts3.8/dist/js/tracing/timeToDisplayFallback.d.ts +3 -0
- package/ts3.8/dist/js/tracing/timetodisplay.d.ts +29 -0
- package/ts3.8/dist/js/tracing/timetodisplaynative.types.d.ts +1 -3
- package/ts3.8/dist/js/utils/rnlibraries.d.ts +1 -1
- package/ts3.8/dist/js/utils/rnlibrariesinterface.d.ts +1 -0
- package/ts3.8/dist/js/vendor/react-native/index.d.ts +3 -0
- package/ts3.8/dist/js/vendor/react-navigation/types.d.ts +27 -0
- package/ts3.8/dist/js/version.d.ts +1 -1
- package/ts3.8/dist/js/wrapper.d.ts +2 -0
- package/dist/js/utils/sentryeventemitter.d.ts +0 -24
- package/dist/js/utils/sentryeventemitter.d.ts.map +0 -1
- package/dist/js/utils/sentryeventemitter.js +0 -82
- package/dist/js/utils/sentryeventemitter.js.map +0 -1
- package/dist/js/utils/sentryeventemitterfallback.d.ts +0 -19
- package/dist/js/utils/sentryeventemitterfallback.d.ts.map +0 -1
- package/dist/js/utils/sentryeventemitterfallback.js +0 -78
- package/dist/js/utils/sentryeventemitterfallback.js.map +0 -1
- package/ts3.8/dist/js/utils/sentryeventemitter.d.ts +0 -24
- package/ts3.8/dist/js/utils/sentryeventemitterfallback.d.ts +0 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/js/integrations/default.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable complexity */\nimport type { Integration } from '@sentry/core';\n\nimport type { ReactNativeClientOptions } from '../options';\nimport { reactNativeTracingIntegration } from '../tracing';\nimport { isExpoGo, notWeb } from '../utils/environment';\nimport {\n appStartIntegration,\n breadcrumbsIntegration,\n browserApiErrorsIntegration,\n browserGlobalHandlersIntegration,\n browserLinkedErrorsIntegration,\n createNativeFramesIntegrations,\n createReactNativeRewriteFrames,\n debugSymbolicatorIntegration,\n dedupeIntegration,\n deviceContextIntegration,\n eventOriginIntegration,\n expoContextIntegration,\n functionToStringIntegration,\n hermesProfilingIntegration,\n httpClientIntegration,\n httpContextIntegration,\n inboundFiltersIntegration,\n mobileReplayIntegration,\n modulesLoaderIntegration,\n nativeLinkedErrorsIntegration,\n nativeReleaseIntegration,\n reactNativeErrorHandlersIntegration,\n reactNativeInfoIntegration,\n screenshotIntegration,\n sdkInfoIntegration,\n spotlightIntegration,\n stallTrackingIntegration,\n userInteractionIntegration,\n viewHierarchyIntegration,\n} from './exports';\n\n/**\n * Returns the default ReactNative integrations based on the current environment.\n *\n * Native integrations are only returned when native is enabled.\n *\n * Web integrations are only returned when running on web.\n */\nexport function getDefaultIntegrations(options: ReactNativeClientOptions): Integration[] {\n const integrations: Integration[] = [];\n\n if (notWeb()) {\n integrations.push(\n reactNativeErrorHandlersIntegration({\n patchGlobalPromise: options.patchGlobalPromise,\n }),\n );\n integrations.push(nativeLinkedErrorsIntegration());\n } else {\n integrations.push(browserApiErrorsIntegration());\n integrations.push(browserGlobalHandlersIntegration());\n integrations.push(browserLinkedErrorsIntegration());\n }\n\n // @sentry/react default integrations\n integrations.push(inboundFiltersIntegration());\n integrations.push(functionToStringIntegration());\n integrations.push(breadcrumbsIntegration());\n integrations.push(dedupeIntegration());\n integrations.push(httpContextIntegration());\n // end @sentry/react-native default integrations\n\n integrations.push(nativeReleaseIntegration());\n integrations.push(eventOriginIntegration());\n integrations.push(sdkInfoIntegration());\n integrations.push(reactNativeInfoIntegration());\n\n integrations.push(createReactNativeRewriteFrames());\n\n if (options.enableNative) {\n integrations.push(deviceContextIntegration());\n integrations.push(modulesLoaderIntegration());\n if (options.attachScreenshot) {\n integrations.push(screenshotIntegration());\n }\n if (options.attachViewHierarchy) {\n integrations.push(viewHierarchyIntegration());\n }\n if (typeof options.profilesSampleRate === 'number') {\n integrations.push(hermesProfilingIntegration());\n }\n }\n\n // hasTracingEnabled from `@sentry/core` only check if tracesSampler or tracesSampleRate keys are present\n // that's different from prev imp here and might lead misconfiguration\n // `tracesSampleRate: undefined` should not enable tracing\n const hasTracingEnabled =\n options.enableTracing ||\n typeof options.tracesSampleRate === 'number' ||\n typeof options.tracesSampler === 'function';\n if (hasTracingEnabled && options.enableAppStartTracking) {\n integrations.push(appStartIntegration());\n }\n const nativeFramesIntegrationInstance = createNativeFramesIntegrations(\n hasTracingEnabled && options.enableNativeFramesTracking,\n );\n if (nativeFramesIntegrationInstance) {\n integrations.push(nativeFramesIntegrationInstance);\n }\n if (hasTracingEnabled && options.enableStallTracking) {\n integrations.push(stallTrackingIntegration());\n }\n if (hasTracingEnabled && options.enableUserInteractionTracing) {\n integrations.push(userInteractionIntegration());\n }\n if (hasTracingEnabled && options.enableAutoPerformanceTracing) {\n integrations.push(reactNativeTracingIntegration());\n }\n if (options.enableCaptureFailedRequests) {\n integrations.push(httpClientIntegration());\n }\n\n if (isExpoGo()) {\n integrations.push(expoContextIntegration());\n }\n\n if (options.spotlight) {\n const sidecarUrl = typeof options.spotlight === 'string' ? options.spotlight : undefined;\n integrations.push(spotlightIntegration({ sidecarUrl }));\n }\n\n const hasReplayOptions =\n typeof options.replaysOnErrorSampleRate === 'number' || typeof options.replaysSessionSampleRate === 'number';\n const hasExperimentsReplayOptions =\n (options._experiments && typeof options._experiments.replaysOnErrorSampleRate === 'number') ||\n (options._experiments && typeof options._experiments.replaysSessionSampleRate === 'number');\n\n if (!hasReplayOptions && hasExperimentsReplayOptions) {\n // Remove in the next major version (v7)\n options.replaysOnErrorSampleRate = options._experiments.replaysOnErrorSampleRate;\n options.replaysSessionSampleRate = options._experiments.replaysSessionSampleRate;\n }\n\n if ((hasReplayOptions || hasExperimentsReplayOptions) && notWeb()) {\n // We can't create and add browserReplayIntegration as it overrides the users supplied one\n // The browser replay integration works differently than the rest of default integrations\n integrations.push(mobileReplayIntegration());\n }\n\n if (__DEV__ && notWeb()) {\n integrations.push(debugSymbolicatorIntegration());\n }\n\n return integrations;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/js/integrations/default.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable complexity */\nimport type { Integration } from '@sentry/core';\n\nimport type { ReactNativeClientOptions } from '../options';\nimport { reactNativeTracingIntegration } from '../tracing';\nimport { isExpoGo, notWeb } from '../utils/environment';\nimport {\n appRegistryIntegration,\n appStartIntegration,\n breadcrumbsIntegration,\n browserApiErrorsIntegration,\n browserGlobalHandlersIntegration,\n browserLinkedErrorsIntegration,\n createNativeFramesIntegrations,\n createReactNativeRewriteFrames,\n debugSymbolicatorIntegration,\n dedupeIntegration,\n deviceContextIntegration,\n eventOriginIntegration,\n expoContextIntegration,\n functionToStringIntegration,\n hermesProfilingIntegration,\n httpClientIntegration,\n httpContextIntegration,\n inboundFiltersIntegration,\n mobileReplayIntegration,\n modulesLoaderIntegration,\n nativeLinkedErrorsIntegration,\n nativeReleaseIntegration,\n reactNativeErrorHandlersIntegration,\n reactNativeInfoIntegration,\n screenshotIntegration,\n sdkInfoIntegration,\n spotlightIntegration,\n stallTrackingIntegration,\n timeToDisplayIntegration,\n userInteractionIntegration,\n viewHierarchyIntegration,\n} from './exports';\n\n/**\n * Returns the default ReactNative integrations based on the current environment.\n *\n * Native integrations are only returned when native is enabled.\n *\n * Web integrations are only returned when running on web.\n */\nexport function getDefaultIntegrations(options: ReactNativeClientOptions): Integration[] {\n const integrations: Integration[] = [];\n\n if (notWeb()) {\n integrations.push(\n reactNativeErrorHandlersIntegration({\n patchGlobalPromise: options.patchGlobalPromise,\n }),\n );\n integrations.push(nativeLinkedErrorsIntegration());\n } else {\n integrations.push(browserApiErrorsIntegration());\n integrations.push(browserGlobalHandlersIntegration());\n integrations.push(browserLinkedErrorsIntegration());\n }\n\n // @sentry/react default integrations\n integrations.push(inboundFiltersIntegration());\n integrations.push(functionToStringIntegration());\n integrations.push(breadcrumbsIntegration());\n integrations.push(dedupeIntegration());\n integrations.push(httpContextIntegration());\n // end @sentry/react-native default integrations\n\n integrations.push(nativeReleaseIntegration());\n integrations.push(eventOriginIntegration());\n integrations.push(sdkInfoIntegration());\n integrations.push(reactNativeInfoIntegration());\n\n integrations.push(createReactNativeRewriteFrames());\n\n if (options.enableNative) {\n integrations.push(deviceContextIntegration());\n integrations.push(modulesLoaderIntegration());\n if (options.attachScreenshot) {\n integrations.push(screenshotIntegration());\n }\n if (options.attachViewHierarchy) {\n integrations.push(viewHierarchyIntegration());\n }\n if (typeof options.profilesSampleRate === 'number') {\n integrations.push(hermesProfilingIntegration());\n }\n }\n\n // hasTracingEnabled from `@sentry/core` only check if tracesSampler or tracesSampleRate keys are present\n // that's different from prev imp here and might lead misconfiguration\n // `tracesSampleRate: undefined` should not enable tracing\n const hasTracingEnabled =\n options.enableTracing ||\n typeof options.tracesSampleRate === 'number' ||\n typeof options.tracesSampler === 'function';\n if (hasTracingEnabled && options.enableAppStartTracking) {\n integrations.push(appStartIntegration());\n }\n const nativeFramesIntegrationInstance = createNativeFramesIntegrations(\n hasTracingEnabled && options.enableNativeFramesTracking,\n );\n if (nativeFramesIntegrationInstance) {\n integrations.push(nativeFramesIntegrationInstance);\n }\n if (hasTracingEnabled && options.enableStallTracking) {\n integrations.push(stallTrackingIntegration());\n }\n if (hasTracingEnabled && options.enableUserInteractionTracing) {\n integrations.push(userInteractionIntegration());\n }\n if (hasTracingEnabled && options.enableAutoPerformanceTracing) {\n integrations.push(appRegistryIntegration());\n integrations.push(reactNativeTracingIntegration());\n }\n if (hasTracingEnabled) {\n integrations.push(timeToDisplayIntegration());\n }\n if (options.enableCaptureFailedRequests) {\n integrations.push(httpClientIntegration());\n }\n\n if (isExpoGo()) {\n integrations.push(expoContextIntegration());\n }\n\n if (options.spotlight) {\n const sidecarUrl = typeof options.spotlight === 'string' ? options.spotlight : undefined;\n integrations.push(spotlightIntegration({ sidecarUrl }));\n }\n\n const hasReplayOptions =\n typeof options.replaysOnErrorSampleRate === 'number' || typeof options.replaysSessionSampleRate === 'number';\n const hasExperimentsReplayOptions =\n (options._experiments && typeof options._experiments.replaysOnErrorSampleRate === 'number') ||\n (options._experiments && typeof options._experiments.replaysSessionSampleRate === 'number');\n\n if (!hasReplayOptions && hasExperimentsReplayOptions) {\n // Remove in the next major version (v7)\n options.replaysOnErrorSampleRate = options._experiments.replaysOnErrorSampleRate;\n options.replaysSessionSampleRate = options._experiments.replaysSessionSampleRate;\n }\n\n if ((hasReplayOptions || hasExperimentsReplayOptions) && notWeb()) {\n // We can't create and add browserReplayIntegration as it overrides the users supplied one\n // The browser replay integration works differently than the rest of default integrations\n integrations.push(mobileReplayIntegration());\n }\n\n if (__DEV__ && notWeb()) {\n integrations.push(debugSymbolicatorIntegration());\n }\n\n return integrations;\n}\n"]}
|
|
@@ -20,5 +20,7 @@ export { nativeFramesIntegration, createNativeFramesIntegrations } from '../trac
|
|
|
20
20
|
export { stallTrackingIntegration } from '../tracing/integrations/stalltracking';
|
|
21
21
|
export { userInteractionIntegration } from '../tracing/integrations/userInteraction';
|
|
22
22
|
export { createReactNativeRewriteFrames } from './rewriteframes';
|
|
23
|
+
export { appRegistryIntegration } from './appRegistry';
|
|
24
|
+
export { timeToDisplayIntegration } from '../tracing/integrations/timeToDisplayIntegration';
|
|
23
25
|
export { breadcrumbsIntegration, browserApiErrorsIntegration, dedupeIntegration, functionToStringIntegration, globalHandlersIntegration as browserGlobalHandlersIntegration, httpClientIntegration, httpContextIntegration, inboundFiltersIntegration, linkedErrorsIntegration as browserLinkedErrorsIntegration, rewriteFramesIntegration, } from '@sentry/react';
|
|
24
26
|
//# sourceMappingURL=exports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAC/G,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAC/G,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAE5F,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,2BAA2B,EAC3B,yBAAyB,IAAI,gCAAgC,EAC7D,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,IAAI,8BAA8B,EACzD,wBAAwB,GACzB,MAAM,eAAe,CAAC"}
|
|
@@ -20,5 +20,7 @@ export { nativeFramesIntegration, createNativeFramesIntegrations } from '../trac
|
|
|
20
20
|
export { stallTrackingIntegration } from '../tracing/integrations/stalltracking';
|
|
21
21
|
export { userInteractionIntegration } from '../tracing/integrations/userInteraction';
|
|
22
22
|
export { createReactNativeRewriteFrames } from './rewriteframes';
|
|
23
|
+
export { appRegistryIntegration } from './appRegistry';
|
|
24
|
+
export { timeToDisplayIntegration } from '../tracing/integrations/timeToDisplayIntegration';
|
|
23
25
|
export { breadcrumbsIntegration, browserApiErrorsIntegration, dedupeIntegration, functionToStringIntegration, globalHandlersIntegration as browserGlobalHandlersIntegration, httpClientIntegration, httpContextIntegration, inboundFiltersIntegration, linkedErrorsIntegration as browserLinkedErrorsIntegration, rewriteFramesIntegration, } from '@sentry/react';
|
|
24
26
|
//# sourceMappingURL=exports.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../../../src/js/integrations/exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAC/G,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"exports.js","sourceRoot":"","sources":["../../../src/js/integrations/exports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mCAAmC,EAAE,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAC/G,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAE5F,OAAO,EACL,sBAAsB,EACtB,2BAA2B,EAC3B,iBAAiB,EACjB,2BAA2B,EAC3B,yBAAyB,IAAI,gCAAgC,EAC7D,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,IAAI,8BAA8B,EACzD,wBAAwB,GACzB,MAAM,eAAe,CAAC","sourcesContent":["export { debugSymbolicatorIntegration } from './debugsymbolicator';\nexport { deviceContextIntegration } from './devicecontext';\nexport { reactNativeErrorHandlersIntegration } from './reactnativeerrorhandlers';\nexport { nativeLinkedErrorsIntegration } from './nativelinkederrors';\nexport { nativeReleaseIntegration } from './release';\nexport { eventOriginIntegration } from './eventorigin';\nexport { sdkInfoIntegration } from './sdkinfo';\nexport { reactNativeInfoIntegration } from './reactnativeinfo';\nexport { modulesLoaderIntegration } from './modulesloader';\nexport { hermesProfilingIntegration } from '../profiling/integration';\nexport { screenshotIntegration } from './screenshot';\nexport { viewHierarchyIntegration } from './viewhierarchy';\nexport { expoContextIntegration } from './expocontext';\nexport { spotlightIntegration } from './spotlight';\nexport { mobileReplayIntegration } from '../replay/mobilereplay';\nexport { feedbackIntegration } from '../feedback/integration';\nexport { browserReplayIntegration } from '../replay/browserReplay';\nexport { appStartIntegration } from '../tracing/integrations/appStart';\nexport { nativeFramesIntegration, createNativeFramesIntegrations } from '../tracing/integrations/nativeFrames';\nexport { stallTrackingIntegration } from '../tracing/integrations/stalltracking';\nexport { userInteractionIntegration } from '../tracing/integrations/userInteraction';\nexport { createReactNativeRewriteFrames } from './rewriteframes';\nexport { appRegistryIntegration } from './appRegistry';\nexport { timeToDisplayIntegration } from '../tracing/integrations/timeToDisplayIntegration';\n\nexport {\n breadcrumbsIntegration,\n browserApiErrorsIntegration,\n dedupeIntegration,\n functionToStringIntegration,\n globalHandlersIntegration as browserGlobalHandlersIntegration,\n httpClientIntegration,\n httpContextIntegration,\n inboundFiltersIntegration,\n linkedErrorsIntegration as browserLinkedErrorsIntegration,\n rewriteFramesIntegration,\n} from '@sentry/react';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomMask.d.ts","sourceRoot":"","sources":["../../../src/js/replay/CustomMask.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"CustomMask.d.ts","sourceRoot":"","sources":["../../../src/js/replay/CustomMask.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwB7D,QAAA,MAAM,YAAY,cAAe,SAAS,KAAG,MAAM,YAGlD,CAAC;AAEF,QAAA,MAAM,cAAc,cAAe,SAAS,KAAG,MAAM,YAGpD,CAAC;AAIF,QAAA,MAAM,IAAI,2DAWN,CAAA;AAEJ,QAAA,MAAM,MAAM,2DAWR,CAAC;AAEL,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { logger } from '@sentry/core';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { UIManager, View } from 'react-native';
|
|
4
|
+
import { isExpoGo } from '../utils/environment';
|
|
4
5
|
const NativeComponentRegistry = require('react-native/Libraries/NativeComponent/NativeComponentRegistry');
|
|
5
6
|
const MaskNativeComponentName = 'RNSentryReplayMask';
|
|
6
7
|
const UnmaskNativeComponentName = 'RNSentryReplayUnmask';
|
|
@@ -23,7 +24,7 @@ const UnmaskFallback = (viewProps) => {
|
|
|
23
24
|
};
|
|
24
25
|
const hasViewManagerConfig = (nativeComponentName) => UIManager.hasViewManagerConfig && UIManager.hasViewManagerConfig(nativeComponentName);
|
|
25
26
|
const Mask = (() => {
|
|
26
|
-
if (!hasViewManagerConfig(MaskNativeComponentName)) {
|
|
27
|
+
if (isExpoGo() || !hasViewManagerConfig(MaskNativeComponentName)) {
|
|
27
28
|
logger.warn(`[SentrySessionReplay] Can't load ${MaskNativeComponentName}.`);
|
|
28
29
|
return MaskFallback;
|
|
29
30
|
}
|
|
@@ -34,7 +35,7 @@ const Mask = (() => {
|
|
|
34
35
|
}));
|
|
35
36
|
})();
|
|
36
37
|
const Unmask = (() => {
|
|
37
|
-
if (!hasViewManagerConfig(UnmaskNativeComponentName)) {
|
|
38
|
+
if (isExpoGo() || !hasViewManagerConfig(UnmaskNativeComponentName)) {
|
|
38
39
|
logger.warn(`[SentrySessionReplay] Can't load ${UnmaskNativeComponentName}.`);
|
|
39
40
|
return UnmaskFallback;
|
|
40
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomMask.js","sourceRoot":"","sources":["../../../src/js/replay/CustomMask.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,uBAAuB,GAGzB,OAAO,CAAC,gEAAgE,CAAC,CAAC;AAE9E,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AACrD,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEzD,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,yBAAyB,SAAS,2DAA2D,SAAS,+EAA+E,CAAC;AAEzO,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAQ,EAAE;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,gGAAgG;QAChG,4CAA4C;QAC5C,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,SAAoB,EAAsB,EAAE;IAChE,IAAI,CAAC,MAAM,CAAC,CAAC;IACb,OAAO,oBAAC,IAAI,oBAAK,SAAS,EAAI,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAAoB,EAAsB,EAAE;IAClE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,OAAO,oBAAC,IAAI,oBAAK,SAAS,EAAI,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,mBAA2B,EAAW,EAAE,CAAC,SAAS,CAAC,oBAAoB,IAAI,SAAS,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;AAE7J,MAAM,IAAI,GAAG,CAAC,GAA8D,EAAE;IAC5E,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"CustomMask.js","sourceRoot":"","sources":["../../../src/js/replay/CustomMask.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,uBAAuB,GAGzB,OAAO,CAAC,gEAAgE,CAAC,CAAC;AAE9E,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;AACrD,MAAM,yBAAyB,GAAG,sBAAsB,CAAC;AAEzD,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAU,EAAE,CAAC,yBAAyB,SAAS,2DAA2D,SAAS,+EAA+E,CAAC;AAEzO,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAQ,EAAE;IACvC,UAAU,CAAC,GAAG,EAAE;QACd,gGAAgG;QAChG,4CAA4C;QAC5C,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,SAAoB,EAAsB,EAAE;IAChE,IAAI,CAAC,MAAM,CAAC,CAAC;IACb,OAAO,oBAAC,IAAI,oBAAK,SAAS,EAAI,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAAoB,EAAsB,EAAE;IAClE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACf,OAAO,oBAAC,IAAI,oBAAK,SAAS,EAAI,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,mBAA2B,EAAW,EAAE,CAAC,SAAS,CAAC,oBAAoB,IAAI,SAAS,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;AAE7J,MAAM,IAAI,GAAG,CAAC,GAA8D,EAAE;IAC5E,IAAI,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,EAAE;QAChE,MAAM,CAAC,IAAI,CAAC,oCAAoC,uBAAuB,GAAG,CAAC,CAAC;QAC5E,OAAO,YAAY,CAAC;KACrB;IAED,qDAAqD;IACrD,8KAA8K;IAC9K,OAAO,uBAAuB,CAAC,GAAG,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,eAAe,EAAE,uBAAuB;KACzC,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,EAAE,CAAA;AAEJ,MAAM,MAAM,GAAG,CAAC,GAA8D,EAAE;IAC9E,IAAI,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,EAAE;QAClE,MAAM,CAAC,IAAI,CAAC,oCAAoC,yBAAyB,GAAG,CAAC,CAAC;QAC9E,OAAO,cAAc,CAAC;KACvB;IAED,qDAAqD;IACrD,8KAA8K;IAC9K,OAAO,uBAAuB,CAAC,GAAG,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,eAAe,EAAE,yBAAyB;KAC3C,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,EAAE,CAAC;AAEL,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { logger } from '@sentry/core';\nimport * as React from 'react';\nimport type { HostComponent, ViewProps } from 'react-native';\nimport { UIManager, View } from 'react-native';\n\nimport { isExpoGo } from '../utils/environment';\n\nconst NativeComponentRegistry: {\n get<T, C extends Record<string, unknown>>(componentName: string, createViewConfig: () => C): HostComponent<T>;\n// eslint-disable-next-line @typescript-eslint/no-var-requires\n} = require('react-native/Libraries/NativeComponent/NativeComponentRegistry');\n\nconst MaskNativeComponentName = 'RNSentryReplayMask';\nconst UnmaskNativeComponentName = 'RNSentryReplayUnmask';\n\nconst warnMessage = (component: string): string => `[SentrySessionReplay] ${component} component is not supported on the current platform. If ${component} should be supported, please ensure that the application build is up to date.`;\n\nconst warn = (component: string): void => {\n setTimeout(() => {\n // Missing mask component could cause leaking PII, we have to ensure that the warning is visible\n // even if the app is running without debug.\n // eslint-disable-next-line no-console\n console.warn(warnMessage(component));\n }, 0);\n};\n\nconst MaskFallback = (viewProps: ViewProps): React.ReactElement => {\n warn('Mask');\n return <View {...viewProps} />;\n};\n\nconst UnmaskFallback = (viewProps: ViewProps): React.ReactElement => {\n warn('Unmask');\n return <View {...viewProps} />;\n};\n\nconst hasViewManagerConfig = (nativeComponentName: string): boolean => UIManager.hasViewManagerConfig && UIManager.hasViewManagerConfig(nativeComponentName);\n\nconst Mask = ((): HostComponent<ViewProps> | React.ComponentType<ViewProps> => {\n if (isExpoGo() || !hasViewManagerConfig(MaskNativeComponentName)) {\n logger.warn(`[SentrySessionReplay] Can't load ${MaskNativeComponentName}.`);\n return MaskFallback;\n }\n\n // Based on @react-native/babel-plugin-codegen output\n // https://github.com/facebook/react-native/blob/b32c6c2cc1bc566a85a883901dbf5e23b5a75b61/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js#L139\n return NativeComponentRegistry.get(MaskNativeComponentName, () => ({\n uiViewClassName: MaskNativeComponentName,\n }));\n})()\n\nconst Unmask = ((): HostComponent<ViewProps> | React.ComponentType<ViewProps> => {\n if (isExpoGo() || !hasViewManagerConfig(UnmaskNativeComponentName)) {\n logger.warn(`[SentrySessionReplay] Can't load ${UnmaskNativeComponentName}.`);\n return UnmaskFallback;\n }\n\n // Based on @react-native/babel-plugin-codegen output\n // https://github.com/facebook/react-native/blob/b32c6c2cc1bc566a85a883901dbf5e23b5a75b61/packages/react-native-codegen/src/generators/components/GenerateViewConfigJs.js#L139\n return NativeComponentRegistry.get(UnmaskNativeComponentName, () => ({\n uiViewClassName: UnmaskNativeComponentName,\n }));\n})();\n\nexport { Mask, Unmask, MaskFallback, UnmaskFallback };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appStart.d.ts","sourceRoot":"","sources":["../../../../src/js/tracing/integrations/appStart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,WAAW,EAAoC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"appStart.d.ts","sourceRoot":"","sources":["../../../../src/js/tracing/integrations/appStart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,WAAW,EAAoC,MAAM,cAAc,CAAC;AAiCjG,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG;IAC9C,yBAAyB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD,CAAC;AAqBF;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzF;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAM7E;AAED;;;;GAIG;AACH,wBAAgB,oCAAoC,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAG9E;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,gBAAiB,MAAM,KAAG,IAGhE,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB;IAG9B;;;;;OAKG;iBACU,OAAO;MACb,mBA0QR,CAAC"}
|
|
@@ -8,6 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { getCapturedScopesOnSpan, getClient, getCurrentScope, logger, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SentryNonRecordingSpan, startInactiveSpan, timestampInSeconds, } from '@sentry/core';
|
|
11
|
+
import { getAppRegistryIntegration } from '../../integrations/appRegistry';
|
|
11
12
|
import { APP_START_COLD as APP_START_COLD_MEASUREMENT, APP_START_WARM as APP_START_WARM_MEASUREMENT, } from '../../measurements';
|
|
12
13
|
import { convertSpanToTransaction, isRootSpan, setEndTimeValue } from '../../utils/span';
|
|
13
14
|
import { NATIVE } from '../../wrapper';
|
|
@@ -100,6 +101,7 @@ export const appStartIntegration = ({ standalone = false, } = {}) => {
|
|
|
100
101
|
let _client = undefined;
|
|
101
102
|
let isEnabled = true;
|
|
102
103
|
let appStartDataFlushed = false;
|
|
104
|
+
let afterAllSetupCalled = false;
|
|
103
105
|
let firstStartedActiveRootSpanId = undefined;
|
|
104
106
|
const setup = (client) => {
|
|
105
107
|
_client = client;
|
|
@@ -110,8 +112,23 @@ export const appStartIntegration = ({ standalone = false, } = {}) => {
|
|
|
110
112
|
}
|
|
111
113
|
client.on('spanStart', recordFirstStartedActiveRootSpanId);
|
|
112
114
|
};
|
|
113
|
-
const afterAllSetup = (
|
|
115
|
+
const afterAllSetup = (client) => {
|
|
116
|
+
var _a;
|
|
117
|
+
if (afterAllSetupCalled) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
afterAllSetupCalled = true;
|
|
114
121
|
// TODO: automatically set standalone based on the presence of the native layer navigation integration
|
|
122
|
+
(_a = getAppRegistryIntegration(client)) === null || _a === void 0 ? void 0 : _a.onRunApplication(() => {
|
|
123
|
+
if (appStartDataFlushed) {
|
|
124
|
+
logger.log('[AppStartIntegration] Resetting app start data flushed flag based on runApplication call.');
|
|
125
|
+
appStartDataFlushed = false;
|
|
126
|
+
firstStartedActiveRootSpanId = undefined;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.log('[AppStartIntegration] Waiting for initial app start was flush, before updating based on runApplication call.');
|
|
130
|
+
}
|
|
131
|
+
});
|
|
115
132
|
};
|
|
116
133
|
const processEvent = (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
117
134
|
if (!isEnabled || standalone) {
|
|
@@ -176,7 +193,7 @@ export const appStartIntegration = ({ standalone = false, } = {}) => {
|
|
|
176
193
|
function attachAppStartToTransactionEvent(event) {
|
|
177
194
|
return __awaiter(this, void 0, void 0, function* () {
|
|
178
195
|
if (appStartDataFlushed) {
|
|
179
|
-
// App start data is only relevant for the first transaction
|
|
196
|
+
// App start data is only relevant for the first transaction of the app run
|
|
180
197
|
return;
|
|
181
198
|
}
|
|
182
199
|
if (!firstStartedActiveRootSpanId) {
|
|
@@ -221,6 +238,13 @@ export const appStartIntegration = ({ standalone = false, } = {}) => {
|
|
|
221
238
|
logger.warn('[AppStart] App start duration is over a minute long, not adding app start span.');
|
|
222
239
|
return;
|
|
223
240
|
}
|
|
241
|
+
if (appStartDurationMs < 0) {
|
|
242
|
+
// This can happen when MainActivity on Android is recreated,
|
|
243
|
+
// and the app start end timestamp is not updated, for example
|
|
244
|
+
// due to missing `Sentry.wrap(RootComponent)` call.
|
|
245
|
+
logger.warn('[AppStart] Last recorded app start end timestamp is before the app start timestamp.', 'This is usually caused by missing `Sentry.wrap(RootComponent)` call.');
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
224
248
|
appStartDataFlushed = true;
|
|
225
249
|
event.contexts.trace.data = event.contexts.trace.data || {};
|
|
226
250
|
event.contexts.trace.data[SEMANTIC_ATTRIBUTE_SENTRY_OP] = UI_LOAD_OP;
|
|
@@ -304,18 +328,23 @@ function createJSExecutionStartSpan(parentSpan, rootComponentCreationTimestampMs
|
|
|
304
328
|
if (!bundleStartTimestampMs) {
|
|
305
329
|
return undefined;
|
|
306
330
|
}
|
|
331
|
+
const bundleStartTimestampSeconds = bundleStartTimestampMs / 1000;
|
|
332
|
+
if (bundleStartTimestampSeconds < parentSpan.start_timestamp) {
|
|
333
|
+
logger.warn('Bundle start timestamp is before the app start span start timestamp. Skipping JS execution span.');
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
307
336
|
if (!rootComponentCreationTimestampMs) {
|
|
308
337
|
logger.warn('Missing the root component first constructor call timestamp.');
|
|
309
338
|
return createChildSpanJSON(parentSpan, {
|
|
310
339
|
description: 'JS Bundle Execution Start',
|
|
311
|
-
start_timestamp:
|
|
312
|
-
timestamp:
|
|
340
|
+
start_timestamp: bundleStartTimestampSeconds,
|
|
341
|
+
timestamp: bundleStartTimestampSeconds,
|
|
313
342
|
origin: SPAN_ORIGIN_AUTO_APP_START,
|
|
314
343
|
});
|
|
315
344
|
}
|
|
316
345
|
return createChildSpanJSON(parentSpan, {
|
|
317
346
|
description: 'JS Bundle Execution Before React Root',
|
|
318
|
-
start_timestamp:
|
|
347
|
+
start_timestamp: bundleStartTimestampSeconds,
|
|
319
348
|
timestamp: rootComponentCreationTimestampMs / 1000,
|
|
320
349
|
origin: isRootComponentCreationTimestampMsManual ? SPAN_ORIGIN_MANUAL_APP_START : SPAN_ORIGIN_AUTO_APP_START,
|
|
321
350
|
});
|
|
@@ -324,7 +353,9 @@ function createJSExecutionStartSpan(parentSpan, rootComponentCreationTimestampMs
|
|
|
324
353
|
* Adds native spans to the app start span.
|
|
325
354
|
*/
|
|
326
355
|
function convertNativeSpansToSpanJSON(parentSpan, nativeSpans) {
|
|
327
|
-
return nativeSpans
|
|
356
|
+
return nativeSpans
|
|
357
|
+
.filter(span => span.start_timestamp_ms / 1000 >= parentSpan.start_timestamp)
|
|
358
|
+
.map(span => {
|
|
328
359
|
if (span.description === 'UIKit init') {
|
|
329
360
|
return setMainThreadInfo(createUIKitSpan(parentSpan, span));
|
|
330
361
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appStart.js","sourceRoot":"","sources":["../../../../src/js/tracing/integrations/appStart.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable complexity, max-lines */\nimport type { Client, Event, Integration, Span, SpanJSON, TransactionEvent } from '@sentry/core';\nimport {\n getCapturedScopesOnSpan,\n getClient,\n getCurrentScope,\n logger,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SentryNonRecordingSpan,\n startInactiveSpan,\n timestampInSeconds,\n} from '@sentry/core';\n\nimport {\n APP_START_COLD as APP_START_COLD_MEASUREMENT,\n APP_START_WARM as APP_START_WARM_MEASUREMENT,\n} from '../../measurements';\nimport type { NativeAppStartResponse } from '../../NativeRNSentry';\nimport type { ReactNativeClientOptions } from '../../options';\nimport { convertSpanToTransaction, isRootSpan, setEndTimeValue } from '../../utils/span';\nimport { NATIVE } from '../../wrapper';\nimport {\n APP_START_COLD as APP_START_COLD_OP,\n APP_START_WARM as APP_START_WARM_OP,\n UI_LOAD as UI_LOAD_OP,\n} from '../ops';\nimport { SPAN_ORIGIN_AUTO_APP_START, SPAN_ORIGIN_MANUAL_APP_START } from '../origin';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP } from '../semanticAttributes';\nimport { setMainThreadInfo } from '../span';\nimport { createChildSpanJSON, createSpanJSON, getBundleStartTimestampMs } from '../utils';\n\nconst INTEGRATION_NAME = 'AppStart';\n\nexport type AppStartIntegration = Integration & {\n captureStandaloneAppStart: () => Promise<void>;\n};\n\n/**\n * We filter out app start more than 60s.\n * This could be due to many different reasons.\n * We've seen app starts with hours, days and even months.\n */\nconst MAX_APP_START_DURATION_MS = 60_000;\n\n/** We filter out App starts which timestamp is 60s and more before the transaction start */\nconst MAX_APP_START_AGE_MS = 60_000;\n\n/** App Start transaction name */\nconst APP_START_TX_NAME = 'App Start';\n\nlet recordedAppStartEndTimestampMs: number | undefined = undefined;\nlet isRecordedAppStartEndTimestampMsManual = false;\n\nlet rootComponentCreationTimestampMs: number | undefined = undefined;\nlet isRootComponentCreationTimestampMsManual = false;\n\n/**\n * Records the application start end.\n * Used automatically by `Sentry.wrap` and `Sentry.ReactNativeProfiler`.\n */\nexport function captureAppStart(): Promise<void> {\n return _captureAppStart({ isManual: true });\n}\n\n/**\n * For internal use only.\n *\n * @private\n */\nexport async function _captureAppStart({ isManual }: { isManual: boolean }): Promise<void> {\n const client = getClient();\n if (!client) {\n logger.warn('[AppStart] Could not capture App Start, missing client.');\n return;\n }\n\n isRecordedAppStartEndTimestampMsManual = isManual;\n _setAppStartEndTimestampMs(timestampInSeconds() * 1000);\n await client.getIntegrationByName<AppStartIntegration>(INTEGRATION_NAME)?.captureStandaloneAppStart();\n}\n\n/**\n * Sets the root component first constructor call timestamp.\n * Used automatically by `Sentry.wrap` and `Sentry.ReactNativeProfiler`.\n */\nexport function setRootComponentCreationTimestampMs(timestampMs: number): void {\n recordedAppStartEndTimestampMs &&\n logger.warn('Setting Root component creation timestamp after app start end is set.');\n rootComponentCreationTimestampMs && logger.warn('Overwriting already set root component creation timestamp.');\n rootComponentCreationTimestampMs = timestampMs;\n isRootComponentCreationTimestampMsManual = true;\n}\n\n/**\n * For internal use only.\n *\n * @private\n */\nexport function _setRootComponentCreationTimestampMs(timestampMs: number): void {\n setRootComponentCreationTimestampMs(timestampMs);\n isRootComponentCreationTimestampMsManual = false;\n}\n\n/**\n * For internal use only.\n *\n * @private\n */\nexport const _setAppStartEndTimestampMs = (timestampMs: number): void => {\n recordedAppStartEndTimestampMs && logger.warn('Overwriting already set app start.');\n recordedAppStartEndTimestampMs = timestampMs;\n};\n\n/**\n * For testing purposes only.\n *\n * @private\n */\nexport function _clearRootComponentCreationTimestampMs(): void {\n rootComponentCreationTimestampMs = undefined;\n}\n\n/**\n * Adds AppStart spans from the native layer to the transaction event.\n */\nexport const appStartIntegration = ({\n standalone = false,\n}: {\n /**\n * Should the integration send App Start as a standalone root span (transaction)?\n * If false, App Start will be added as a child span to the first transaction.\n *\n * @default false\n */\n standalone?: boolean;\n} = {}): AppStartIntegration => {\n let _client: Client | undefined = undefined;\n let isEnabled = true;\n let appStartDataFlushed = false;\n let firstStartedActiveRootSpanId: string | undefined = undefined;\n\n const setup = (client: Client): void => {\n _client = client;\n const { enableAppStartTracking } = client.getOptions() as ReactNativeClientOptions;\n\n if (!enableAppStartTracking) {\n isEnabled = false;\n logger.warn('[AppStart] App start tracking is disabled.');\n }\n\n client.on('spanStart', recordFirstStartedActiveRootSpanId);\n };\n\n const afterAllSetup = (_client: Client): void => {\n // TODO: automatically set standalone based on the presence of the native layer navigation integration\n };\n\n const processEvent = async (event: Event): Promise<Event> => {\n if (!isEnabled || standalone) {\n return event;\n }\n\n if (event.type !== 'transaction') {\n // App start data is only relevant for transactions\n return event;\n }\n\n await attachAppStartToTransactionEvent(event as TransactionEvent);\n\n return event;\n };\n\n const recordFirstStartedActiveRootSpanId = (rootSpan: Span): void => {\n if (firstStartedActiveRootSpanId) {\n return;\n }\n\n if (!isRootSpan(rootSpan)) {\n return;\n }\n\n setFirstStartedActiveRootSpanId(rootSpan.spanContext().spanId);\n };\n\n /**\n * For testing purposes only.\n * @private\n */\n const setFirstStartedActiveRootSpanId = (spanId: string | undefined): void => {\n firstStartedActiveRootSpanId = spanId;\n logger.debug('[AppStart] First started active root span id recorded.', firstStartedActiveRootSpanId);\n };\n\n async function captureStandaloneAppStart(): Promise<void> {\n if (!standalone) {\n logger.debug(\n '[AppStart] App start tracking is enabled. App start will be added to the first transaction as a child span.',\n );\n return;\n }\n\n logger.debug('[AppStart] App start tracking standalone root span (transaction).');\n\n const span = startInactiveSpan({\n forceTransaction: true,\n name: APP_START_TX_NAME,\n op: UI_LOAD_OP,\n });\n if (span instanceof SentryNonRecordingSpan) {\n // Tracing is disabled or the transaction was sampled\n return;\n }\n\n setEndTimeValue(span, timestampInSeconds());\n _client.emit('spanEnd', span);\n\n const event = convertSpanToTransaction(span);\n if (!event) {\n logger.warn('[AppStart] Failed to convert App Start span to transaction.');\n return;\n }\n\n await attachAppStartToTransactionEvent(event);\n if (!event.spans || event.spans.length === 0) {\n // No spans were added to the transaction, so we don't need to send it\n return;\n }\n\n const scope = getCapturedScopesOnSpan(span).scope || getCurrentScope();\n scope.captureEvent(event);\n }\n\n async function attachAppStartToTransactionEvent(event: TransactionEvent): Promise<void> {\n if (appStartDataFlushed) {\n // App start data is only relevant for the first transaction\n return;\n }\n\n if (!firstStartedActiveRootSpanId) {\n logger.warn('[AppStart] No first started active root span id recorded. Can not attach app start.');\n return;\n }\n\n if (!event.contexts || !event.contexts.trace) {\n logger.warn('[AppStart] Transaction event is missing trace context. Can not attach app start.');\n return;\n }\n\n if (firstStartedActiveRootSpanId !== event.contexts.trace.span_id) {\n logger.warn(\n '[AppStart] First started active root span id does not match the transaction event span id. Can not attached app start.',\n );\n return;\n }\n\n const appStart = await NATIVE.fetchNativeAppStart();\n if (!appStart) {\n logger.warn('[AppStart] Failed to retrieve the app start metrics from the native layer.');\n return;\n }\n if (appStart.has_fetched) {\n logger.warn('[AppStart] Measured app start metrics were already reported from the native layer.');\n return;\n }\n\n const appStartTimestampMs = appStart.app_start_timestamp_ms;\n if (!appStartTimestampMs) {\n logger.warn('[AppStart] App start timestamp could not be loaded from the native layer.');\n return;\n }\n\n const appStartEndTimestampMs = recordedAppStartEndTimestampMs || getBundleStartTimestampMs();\n if (!appStartEndTimestampMs) {\n logger.warn(\n '[AppStart] Javascript failed to record app start end. `setAppStartEndTimestampMs` was not called nor could the bundle start be found.',\n );\n return;\n }\n\n const isAppStartWithinBounds =\n !!event.start_timestamp && appStartTimestampMs >= event.start_timestamp - MAX_APP_START_AGE_MS;\n if (!__DEV__ && !isAppStartWithinBounds) {\n logger.warn('[AppStart] App start timestamp is too far in the past to be used for app start span.');\n return;\n }\n\n const appStartDurationMs = appStartEndTimestampMs - appStartTimestampMs;\n if (!__DEV__ && appStartDurationMs >= MAX_APP_START_DURATION_MS) {\n // Dev builds can have long app start waiting over minute for the first bundle to be produced\n logger.warn('[AppStart] App start duration is over a minute long, not adding app start span.');\n return;\n }\n\n appStartDataFlushed = true;\n\n event.contexts.trace.data = event.contexts.trace.data || {};\n event.contexts.trace.data[SEMANTIC_ATTRIBUTE_SENTRY_OP] = UI_LOAD_OP;\n event.contexts.trace.op = UI_LOAD_OP;\n\n const origin = isRecordedAppStartEndTimestampMsManual ? SPAN_ORIGIN_MANUAL_APP_START : SPAN_ORIGIN_AUTO_APP_START;\n event.contexts.trace.data[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = origin;\n event.contexts.trace.origin = origin;\n\n const appStartTimestampSeconds = appStartTimestampMs / 1000;\n event.start_timestamp = appStartTimestampSeconds;\n\n event.spans = event.spans || [];\n /** event.spans reference */\n const children: SpanJSON[] = event.spans;\n\n const maybeTtidSpan = children.find(({ op }) => op === 'ui.load.initial_display');\n if (maybeTtidSpan) {\n maybeTtidSpan.start_timestamp = appStartTimestampSeconds;\n setSpanDurationAsMeasurementOnTransactionEvent(event, 'time_to_initial_display', maybeTtidSpan);\n }\n\n const maybeTtfdSpan = children.find(({ op }) => op === 'ui.load.full_display');\n if (maybeTtfdSpan) {\n maybeTtfdSpan.start_timestamp = appStartTimestampSeconds;\n setSpanDurationAsMeasurementOnTransactionEvent(event, 'time_to_full_display', maybeTtfdSpan);\n }\n\n const appStartEndTimestampSeconds = appStartEndTimestampMs / 1000;\n if (event.timestamp && event.timestamp < appStartEndTimestampSeconds) {\n logger.debug(\n '[AppStart] Transaction event timestamp is before app start end. Adjusting transaction event timestamp.',\n );\n event.timestamp = appStartEndTimestampSeconds;\n }\n\n const op = appStart.type === 'cold' ? APP_START_COLD_OP : APP_START_WARM_OP;\n const appStartSpanJSON: SpanJSON = createSpanJSON({\n op,\n description: appStart.type === 'cold' ? 'Cold App Start' : 'Warm App Start',\n start_timestamp: appStartTimestampSeconds,\n timestamp: appStartEndTimestampSeconds,\n trace_id: event.contexts.trace.trace_id,\n parent_span_id: event.contexts.trace.span_id,\n origin,\n });\n const jsExecutionSpanJSON = createJSExecutionStartSpan(appStartSpanJSON, rootComponentCreationTimestampMs);\n\n const appStartSpans = [\n appStartSpanJSON,\n ...(jsExecutionSpanJSON ? [jsExecutionSpanJSON] : []),\n ...convertNativeSpansToSpanJSON(appStartSpanJSON, appStart.spans),\n ];\n\n children.push(...appStartSpans);\n logger.debug('[AppStart] Added app start spans to transaction event.', JSON.stringify(appStartSpans, undefined, 2));\n\n const measurementKey = appStart.type === 'cold' ? APP_START_COLD_MEASUREMENT : APP_START_WARM_MEASUREMENT;\n const measurementValue = {\n value: appStartDurationMs,\n unit: 'millisecond',\n };\n event.measurements = event.measurements || {};\n event.measurements[measurementKey] = measurementValue;\n logger.debug(\n `[AppStart] Added app start measurement to transaction event.`,\n JSON.stringify(measurementValue, undefined, 2),\n );\n }\n\n return {\n name: INTEGRATION_NAME,\n setup,\n afterAllSetup,\n processEvent,\n captureStandaloneAppStart,\n setFirstStartedActiveRootSpanId,\n } as AppStartIntegration;\n};\n\nfunction setSpanDurationAsMeasurementOnTransactionEvent(event: TransactionEvent, label: string, span: SpanJSON): void {\n if (!span.timestamp || !span.start_timestamp) {\n logger.warn('Span is missing start or end timestamp. Cam not set measurement on transaction event.');\n return;\n }\n\n event.measurements = event.measurements || {};\n event.measurements[label] = {\n value: (span.timestamp - span.start_timestamp) * 1000,\n unit: 'millisecond',\n };\n}\n\n/**\n * Adds JS Execution before React Root. If `Sentry.wrap` is not used, create a span for the start of JS Bundle execution.\n */\nfunction createJSExecutionStartSpan(\n parentSpan: SpanJSON,\n rootComponentCreationTimestampMs: number | undefined,\n): SpanJSON | undefined {\n const bundleStartTimestampMs = getBundleStartTimestampMs();\n if (!bundleStartTimestampMs) {\n return undefined;\n }\n\n if (!rootComponentCreationTimestampMs) {\n logger.warn('Missing the root component first constructor call timestamp.');\n return createChildSpanJSON(parentSpan, {\n description: 'JS Bundle Execution Start',\n start_timestamp: bundleStartTimestampMs / 1000,\n timestamp: bundleStartTimestampMs / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n });\n }\n\n return createChildSpanJSON(parentSpan, {\n description: 'JS Bundle Execution Before React Root',\n start_timestamp: bundleStartTimestampMs / 1000,\n timestamp: rootComponentCreationTimestampMs / 1000,\n origin: isRootComponentCreationTimestampMsManual ? SPAN_ORIGIN_MANUAL_APP_START : SPAN_ORIGIN_AUTO_APP_START,\n });\n}\n\n/**\n * Adds native spans to the app start span.\n */\nfunction convertNativeSpansToSpanJSON(parentSpan: SpanJSON, nativeSpans: NativeAppStartResponse['spans']): SpanJSON[] {\n return nativeSpans.map(span => {\n if (span.description === 'UIKit init') {\n return setMainThreadInfo(createUIKitSpan(parentSpan, span));\n }\n\n return setMainThreadInfo(\n createChildSpanJSON(parentSpan, {\n description: span.description,\n start_timestamp: span.start_timestamp_ms / 1000,\n timestamp: span.end_timestamp_ms / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n }),\n );\n });\n}\n\n/**\n * UIKit init is measured by the native layers till the native SDK start\n * RN initializes the native SDK later, the end timestamp would be wrong\n */\nfunction createUIKitSpan(parentSpan: SpanJSON, nativeUIKitSpan: NativeAppStartResponse['spans'][number]): SpanJSON {\n const bundleStart = getBundleStartTimestampMs();\n\n // If UIKit init ends after the bundle start, the native SDK was auto-initialized\n // and so the end timestamp is incorrect.\n // The timestamps can't equal, as RN initializes after UIKit.\n if (bundleStart && bundleStart < nativeUIKitSpan.end_timestamp_ms) {\n return createChildSpanJSON(parentSpan, {\n description: 'UIKit Init to JS Exec Start',\n start_timestamp: nativeUIKitSpan.start_timestamp_ms / 1000,\n timestamp: bundleStart / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n });\n } else {\n return createChildSpanJSON(parentSpan, {\n description: 'UIKit Init',\n start_timestamp: nativeUIKitSpan.start_timestamp_ms / 1000,\n timestamp: nativeUIKitSpan.end_timestamp_ms / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"appStart.js","sourceRoot":"","sources":["../../../../src/js/tracing/integrations/appStart.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable complexity, max-lines */\nimport type { Client, Event, Integration, Span, SpanJSON, TransactionEvent } from '@sentry/core';\nimport {\n getCapturedScopesOnSpan,\n getClient,\n getCurrentScope,\n logger,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SentryNonRecordingSpan,\n startInactiveSpan,\n timestampInSeconds,\n} from '@sentry/core';\n\nimport { getAppRegistryIntegration } from '../../integrations/appRegistry';\nimport {\n APP_START_COLD as APP_START_COLD_MEASUREMENT,\n APP_START_WARM as APP_START_WARM_MEASUREMENT,\n} from '../../measurements';\nimport type { NativeAppStartResponse } from '../../NativeRNSentry';\nimport type { ReactNativeClientOptions } from '../../options';\nimport { convertSpanToTransaction, isRootSpan, setEndTimeValue } from '../../utils/span';\nimport { NATIVE } from '../../wrapper';\nimport {\n APP_START_COLD as APP_START_COLD_OP,\n APP_START_WARM as APP_START_WARM_OP,\n UI_LOAD as UI_LOAD_OP,\n} from '../ops';\nimport { SPAN_ORIGIN_AUTO_APP_START, SPAN_ORIGIN_MANUAL_APP_START } from '../origin';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP } from '../semanticAttributes';\nimport { setMainThreadInfo } from '../span';\nimport { createChildSpanJSON, createSpanJSON, getBundleStartTimestampMs } from '../utils';\n\nconst INTEGRATION_NAME = 'AppStart';\n\nexport type AppStartIntegration = Integration & {\n captureStandaloneAppStart: () => Promise<void>;\n};\n\n/**\n * We filter out app start more than 60s.\n * This could be due to many different reasons.\n * We've seen app starts with hours, days and even months.\n */\nconst MAX_APP_START_DURATION_MS = 60_000;\n\n/** We filter out App starts which timestamp is 60s and more before the transaction start */\nconst MAX_APP_START_AGE_MS = 60_000;\n\n/** App Start transaction name */\nconst APP_START_TX_NAME = 'App Start';\n\nlet recordedAppStartEndTimestampMs: number | undefined = undefined;\nlet isRecordedAppStartEndTimestampMsManual = false;\n\nlet rootComponentCreationTimestampMs: number | undefined = undefined;\nlet isRootComponentCreationTimestampMsManual = false;\n\n/**\n * Records the application start end.\n * Used automatically by `Sentry.wrap` and `Sentry.ReactNativeProfiler`.\n */\nexport function captureAppStart(): Promise<void> {\n return _captureAppStart({ isManual: true });\n}\n\n/**\n * For internal use only.\n *\n * @private\n */\nexport async function _captureAppStart({ isManual }: { isManual: boolean }): Promise<void> {\n const client = getClient();\n if (!client) {\n logger.warn('[AppStart] Could not capture App Start, missing client.');\n return;\n }\n\n isRecordedAppStartEndTimestampMsManual = isManual;\n _setAppStartEndTimestampMs(timestampInSeconds() * 1000);\n await client.getIntegrationByName<AppStartIntegration>(INTEGRATION_NAME)?.captureStandaloneAppStart();\n}\n\n/**\n * Sets the root component first constructor call timestamp.\n * Used automatically by `Sentry.wrap` and `Sentry.ReactNativeProfiler`.\n */\nexport function setRootComponentCreationTimestampMs(timestampMs: number): void {\n recordedAppStartEndTimestampMs &&\n logger.warn('Setting Root component creation timestamp after app start end is set.');\n rootComponentCreationTimestampMs && logger.warn('Overwriting already set root component creation timestamp.');\n rootComponentCreationTimestampMs = timestampMs;\n isRootComponentCreationTimestampMsManual = true;\n}\n\n/**\n * For internal use only.\n *\n * @private\n */\nexport function _setRootComponentCreationTimestampMs(timestampMs: number): void {\n setRootComponentCreationTimestampMs(timestampMs);\n isRootComponentCreationTimestampMsManual = false;\n}\n\n/**\n * For internal use only.\n *\n * @private\n */\nexport const _setAppStartEndTimestampMs = (timestampMs: number): void => {\n recordedAppStartEndTimestampMs && logger.warn('Overwriting already set app start.');\n recordedAppStartEndTimestampMs = timestampMs;\n};\n\n/**\n * For testing purposes only.\n *\n * @private\n */\nexport function _clearRootComponentCreationTimestampMs(): void {\n rootComponentCreationTimestampMs = undefined;\n}\n\n/**\n * Adds AppStart spans from the native layer to the transaction event.\n */\nexport const appStartIntegration = ({\n standalone = false,\n}: {\n /**\n * Should the integration send App Start as a standalone root span (transaction)?\n * If false, App Start will be added as a child span to the first transaction.\n *\n * @default false\n */\n standalone?: boolean;\n} = {}): AppStartIntegration => {\n let _client: Client | undefined = undefined;\n let isEnabled = true;\n let appStartDataFlushed = false;\n let afterAllSetupCalled = false;\n let firstStartedActiveRootSpanId: string | undefined = undefined;\n\n const setup = (client: Client): void => {\n _client = client;\n const { enableAppStartTracking } = client.getOptions() as ReactNativeClientOptions;\n\n if (!enableAppStartTracking) {\n isEnabled = false;\n logger.warn('[AppStart] App start tracking is disabled.');\n }\n\n client.on('spanStart', recordFirstStartedActiveRootSpanId);\n };\n\n const afterAllSetup = (client: Client): void => {\n if (afterAllSetupCalled) {\n return;\n }\n afterAllSetupCalled = true;\n\n // TODO: automatically set standalone based on the presence of the native layer navigation integration\n\n getAppRegistryIntegration(client)?.onRunApplication(() => {\n if (appStartDataFlushed) {\n logger.log('[AppStartIntegration] Resetting app start data flushed flag based on runApplication call.');\n appStartDataFlushed = false;\n firstStartedActiveRootSpanId = undefined;\n } else {\n logger.log(\n '[AppStartIntegration] Waiting for initial app start was flush, before updating based on runApplication call.',\n );\n }\n });\n };\n\n const processEvent = async (event: Event): Promise<Event> => {\n if (!isEnabled || standalone) {\n return event;\n }\n\n if (event.type !== 'transaction') {\n // App start data is only relevant for transactions\n return event;\n }\n\n await attachAppStartToTransactionEvent(event as TransactionEvent);\n\n return event;\n };\n\n const recordFirstStartedActiveRootSpanId = (rootSpan: Span): void => {\n if (firstStartedActiveRootSpanId) {\n return;\n }\n\n if (!isRootSpan(rootSpan)) {\n return;\n }\n\n setFirstStartedActiveRootSpanId(rootSpan.spanContext().spanId);\n };\n\n /**\n * For testing purposes only.\n * @private\n */\n const setFirstStartedActiveRootSpanId = (spanId: string | undefined): void => {\n firstStartedActiveRootSpanId = spanId;\n logger.debug('[AppStart] First started active root span id recorded.', firstStartedActiveRootSpanId);\n };\n\n async function captureStandaloneAppStart(): Promise<void> {\n if (!standalone) {\n logger.debug(\n '[AppStart] App start tracking is enabled. App start will be added to the first transaction as a child span.',\n );\n return;\n }\n\n logger.debug('[AppStart] App start tracking standalone root span (transaction).');\n\n const span = startInactiveSpan({\n forceTransaction: true,\n name: APP_START_TX_NAME,\n op: UI_LOAD_OP,\n });\n if (span instanceof SentryNonRecordingSpan) {\n // Tracing is disabled or the transaction was sampled\n return;\n }\n\n setEndTimeValue(span, timestampInSeconds());\n _client.emit('spanEnd', span);\n\n const event = convertSpanToTransaction(span);\n if (!event) {\n logger.warn('[AppStart] Failed to convert App Start span to transaction.');\n return;\n }\n\n await attachAppStartToTransactionEvent(event);\n if (!event.spans || event.spans.length === 0) {\n // No spans were added to the transaction, so we don't need to send it\n return;\n }\n\n const scope = getCapturedScopesOnSpan(span).scope || getCurrentScope();\n scope.captureEvent(event);\n }\n\n async function attachAppStartToTransactionEvent(event: TransactionEvent): Promise<void> {\n if (appStartDataFlushed) {\n // App start data is only relevant for the first transaction of the app run\n return;\n }\n\n if (!firstStartedActiveRootSpanId) {\n logger.warn('[AppStart] No first started active root span id recorded. Can not attach app start.');\n return;\n }\n\n if (!event.contexts || !event.contexts.trace) {\n logger.warn('[AppStart] Transaction event is missing trace context. Can not attach app start.');\n return;\n }\n\n if (firstStartedActiveRootSpanId !== event.contexts.trace.span_id) {\n logger.warn(\n '[AppStart] First started active root span id does not match the transaction event span id. Can not attached app start.',\n );\n return;\n }\n\n const appStart = await NATIVE.fetchNativeAppStart();\n if (!appStart) {\n logger.warn('[AppStart] Failed to retrieve the app start metrics from the native layer.');\n return;\n }\n if (appStart.has_fetched) {\n logger.warn('[AppStart] Measured app start metrics were already reported from the native layer.');\n return;\n }\n\n const appStartTimestampMs = appStart.app_start_timestamp_ms;\n if (!appStartTimestampMs) {\n logger.warn('[AppStart] App start timestamp could not be loaded from the native layer.');\n return;\n }\n\n const appStartEndTimestampMs = recordedAppStartEndTimestampMs || getBundleStartTimestampMs();\n if (!appStartEndTimestampMs) {\n logger.warn(\n '[AppStart] Javascript failed to record app start end. `setAppStartEndTimestampMs` was not called nor could the bundle start be found.',\n );\n return;\n }\n\n const isAppStartWithinBounds =\n !!event.start_timestamp && appStartTimestampMs >= event.start_timestamp - MAX_APP_START_AGE_MS;\n if (!__DEV__ && !isAppStartWithinBounds) {\n logger.warn('[AppStart] App start timestamp is too far in the past to be used for app start span.');\n return;\n }\n\n const appStartDurationMs = appStartEndTimestampMs - appStartTimestampMs;\n if (!__DEV__ && appStartDurationMs >= MAX_APP_START_DURATION_MS) {\n // Dev builds can have long app start waiting over minute for the first bundle to be produced\n logger.warn('[AppStart] App start duration is over a minute long, not adding app start span.');\n return;\n }\n\n if (appStartDurationMs < 0) {\n // This can happen when MainActivity on Android is recreated,\n // and the app start end timestamp is not updated, for example\n // due to missing `Sentry.wrap(RootComponent)` call.\n logger.warn(\n '[AppStart] Last recorded app start end timestamp is before the app start timestamp.',\n 'This is usually caused by missing `Sentry.wrap(RootComponent)` call.',\n );\n return;\n }\n\n appStartDataFlushed = true;\n\n event.contexts.trace.data = event.contexts.trace.data || {};\n event.contexts.trace.data[SEMANTIC_ATTRIBUTE_SENTRY_OP] = UI_LOAD_OP;\n event.contexts.trace.op = UI_LOAD_OP;\n\n const origin = isRecordedAppStartEndTimestampMsManual ? SPAN_ORIGIN_MANUAL_APP_START : SPAN_ORIGIN_AUTO_APP_START;\n event.contexts.trace.data[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] = origin;\n event.contexts.trace.origin = origin;\n\n const appStartTimestampSeconds = appStartTimestampMs / 1000;\n event.start_timestamp = appStartTimestampSeconds;\n\n event.spans = event.spans || [];\n /** event.spans reference */\n const children: SpanJSON[] = event.spans;\n\n const maybeTtidSpan = children.find(({ op }) => op === 'ui.load.initial_display');\n if (maybeTtidSpan) {\n maybeTtidSpan.start_timestamp = appStartTimestampSeconds;\n setSpanDurationAsMeasurementOnTransactionEvent(event, 'time_to_initial_display', maybeTtidSpan);\n }\n\n const maybeTtfdSpan = children.find(({ op }) => op === 'ui.load.full_display');\n if (maybeTtfdSpan) {\n maybeTtfdSpan.start_timestamp = appStartTimestampSeconds;\n setSpanDurationAsMeasurementOnTransactionEvent(event, 'time_to_full_display', maybeTtfdSpan);\n }\n\n const appStartEndTimestampSeconds = appStartEndTimestampMs / 1000;\n if (event.timestamp && event.timestamp < appStartEndTimestampSeconds) {\n logger.debug(\n '[AppStart] Transaction event timestamp is before app start end. Adjusting transaction event timestamp.',\n );\n event.timestamp = appStartEndTimestampSeconds;\n }\n\n const op = appStart.type === 'cold' ? APP_START_COLD_OP : APP_START_WARM_OP;\n const appStartSpanJSON: SpanJSON = createSpanJSON({\n op,\n description: appStart.type === 'cold' ? 'Cold App Start' : 'Warm App Start',\n start_timestamp: appStartTimestampSeconds,\n timestamp: appStartEndTimestampSeconds,\n trace_id: event.contexts.trace.trace_id,\n parent_span_id: event.contexts.trace.span_id,\n origin,\n });\n const jsExecutionSpanJSON = createJSExecutionStartSpan(appStartSpanJSON, rootComponentCreationTimestampMs);\n\n const appStartSpans = [\n appStartSpanJSON,\n ...(jsExecutionSpanJSON ? [jsExecutionSpanJSON] : []),\n ...convertNativeSpansToSpanJSON(appStartSpanJSON, appStart.spans),\n ];\n\n children.push(...appStartSpans);\n logger.debug('[AppStart] Added app start spans to transaction event.', JSON.stringify(appStartSpans, undefined, 2));\n\n const measurementKey = appStart.type === 'cold' ? APP_START_COLD_MEASUREMENT : APP_START_WARM_MEASUREMENT;\n const measurementValue = {\n value: appStartDurationMs,\n unit: 'millisecond',\n };\n event.measurements = event.measurements || {};\n event.measurements[measurementKey] = measurementValue;\n logger.debug(\n `[AppStart] Added app start measurement to transaction event.`,\n JSON.stringify(measurementValue, undefined, 2),\n );\n }\n\n return {\n name: INTEGRATION_NAME,\n setup,\n afterAllSetup,\n processEvent,\n captureStandaloneAppStart,\n setFirstStartedActiveRootSpanId,\n } as AppStartIntegration;\n};\n\nfunction setSpanDurationAsMeasurementOnTransactionEvent(event: TransactionEvent, label: string, span: SpanJSON): void {\n if (!span.timestamp || !span.start_timestamp) {\n logger.warn('Span is missing start or end timestamp. Cam not set measurement on transaction event.');\n return;\n }\n\n event.measurements = event.measurements || {};\n event.measurements[label] = {\n value: (span.timestamp - span.start_timestamp) * 1000,\n unit: 'millisecond',\n };\n}\n\n/**\n * Adds JS Execution before React Root. If `Sentry.wrap` is not used, create a span for the start of JS Bundle execution.\n */\nfunction createJSExecutionStartSpan(\n parentSpan: SpanJSON,\n rootComponentCreationTimestampMs: number | undefined,\n): SpanJSON | undefined {\n const bundleStartTimestampMs = getBundleStartTimestampMs();\n if (!bundleStartTimestampMs) {\n return undefined;\n }\n\n const bundleStartTimestampSeconds = bundleStartTimestampMs / 1000;\n if (bundleStartTimestampSeconds < parentSpan.start_timestamp) {\n logger.warn('Bundle start timestamp is before the app start span start timestamp. Skipping JS execution span.');\n return undefined;\n }\n\n if (!rootComponentCreationTimestampMs) {\n logger.warn('Missing the root component first constructor call timestamp.');\n return createChildSpanJSON(parentSpan, {\n description: 'JS Bundle Execution Start',\n start_timestamp: bundleStartTimestampSeconds,\n timestamp: bundleStartTimestampSeconds,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n });\n }\n\n return createChildSpanJSON(parentSpan, {\n description: 'JS Bundle Execution Before React Root',\n start_timestamp: bundleStartTimestampSeconds,\n timestamp: rootComponentCreationTimestampMs / 1000,\n origin: isRootComponentCreationTimestampMsManual ? SPAN_ORIGIN_MANUAL_APP_START : SPAN_ORIGIN_AUTO_APP_START,\n });\n}\n\n/**\n * Adds native spans to the app start span.\n */\nfunction convertNativeSpansToSpanJSON(parentSpan: SpanJSON, nativeSpans: NativeAppStartResponse['spans']): SpanJSON[] {\n return nativeSpans\n .filter(span => span.start_timestamp_ms / 1000 >= parentSpan.start_timestamp)\n .map(span => {\n if (span.description === 'UIKit init') {\n return setMainThreadInfo(createUIKitSpan(parentSpan, span));\n }\n\n return setMainThreadInfo(\n createChildSpanJSON(parentSpan, {\n description: span.description,\n start_timestamp: span.start_timestamp_ms / 1000,\n timestamp: span.end_timestamp_ms / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n }),\n );\n });\n}\n\n/**\n * UIKit init is measured by the native layers till the native SDK start\n * RN initializes the native SDK later, the end timestamp would be wrong\n */\nfunction createUIKitSpan(parentSpan: SpanJSON, nativeUIKitSpan: NativeAppStartResponse['spans'][number]): SpanJSON {\n const bundleStart = getBundleStartTimestampMs();\n\n // If UIKit init ends after the bundle start, the native SDK was auto-initialized\n // and so the end timestamp is incorrect.\n // The timestamps can't equal, as RN initializes after UIKit.\n if (bundleStart && bundleStart < nativeUIKitSpan.end_timestamp_ms) {\n return createChildSpanJSON(parentSpan, {\n description: 'UIKit Init to JS Exec Start',\n start_timestamp: nativeUIKitSpan.start_timestamp_ms / 1000,\n timestamp: bundleStart / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n });\n } else {\n return createChildSpanJSON(parentSpan, {\n description: 'UIKit Init',\n start_timestamp: nativeUIKitSpan.start_timestamp_ms / 1000,\n timestamp: nativeUIKitSpan.end_timestamp_ms / 1000,\n origin: SPAN_ORIGIN_AUTO_APP_START,\n });\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeToDisplayIntegration.d.ts","sourceRoot":"","sources":["../../../../src/js/tracing/integrations/timeToDisplayIntegration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,WAAW,EAAY,MAAM,cAAc,CAAC;AAYjE,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAKhD,eAAO,MAAM,wBAAwB,QAAO,WAsE3C,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { logger } from '@sentry/core';
|
|
11
|
+
import { NATIVE } from '../../wrapper';
|
|
12
|
+
import { UI_LOAD_FULL_DISPLAY, UI_LOAD_INITIAL_DISPLAY } from '../ops';
|
|
13
|
+
import { SPAN_ORIGIN_AUTO_UI_TIME_TO_DISPLAY, SPAN_ORIGIN_MANUAL_UI_TIME_TO_DISPLAY } from '../origin';
|
|
14
|
+
import { getReactNavigationIntegration } from '../reactnavigation';
|
|
15
|
+
import { SEMANTIC_ATTRIBUTE_ROUTE_HAS_BEEN_SEEN } from '../semanticAttributes';
|
|
16
|
+
import { SPAN_THREAD_NAME, SPAN_THREAD_NAME_JAVASCRIPT } from '../span';
|
|
17
|
+
import { getTimeToInitialDisplayFallback } from '../timeToDisplayFallback';
|
|
18
|
+
import { createSpanJSON } from '../utils';
|
|
19
|
+
export const INTEGRATION_NAME = 'TimeToDisplay';
|
|
20
|
+
const TIME_TO_DISPLAY_TIMEOUT_MS = 30000;
|
|
21
|
+
const isDeadlineExceeded = (durationMs) => durationMs > TIME_TO_DISPLAY_TIMEOUT_MS;
|
|
22
|
+
export const timeToDisplayIntegration = () => {
|
|
23
|
+
let enableTimeToInitialDisplayForPreloadedRoutes = false;
|
|
24
|
+
return {
|
|
25
|
+
name: INTEGRATION_NAME,
|
|
26
|
+
afterAllSetup(client) {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
enableTimeToInitialDisplayForPreloadedRoutes =
|
|
29
|
+
(_b = (_a = getReactNavigationIntegration(client)) === null || _a === void 0 ? void 0 : _a.options.enableTimeToInitialDisplayForPreloadedRoutes) !== null && _b !== void 0 ? _b : false;
|
|
30
|
+
},
|
|
31
|
+
processEvent: (event) => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
|
+
var _a, _b, _c;
|
|
33
|
+
if (event.type !== 'transaction') {
|
|
34
|
+
// TimeToDisplay data is only relevant for transactions
|
|
35
|
+
return event;
|
|
36
|
+
}
|
|
37
|
+
const rootSpanId = event.contexts.trace.span_id;
|
|
38
|
+
if (!rootSpanId) {
|
|
39
|
+
logger.warn(`[${INTEGRATION_NAME}] No root span id found in transaction.`);
|
|
40
|
+
return event;
|
|
41
|
+
}
|
|
42
|
+
const transactionStartTimestampSeconds = event.start_timestamp;
|
|
43
|
+
if (!transactionStartTimestampSeconds) {
|
|
44
|
+
// This should never happen
|
|
45
|
+
logger.warn(`[${INTEGRATION_NAME}] No transaction start timestamp found in transaction.`);
|
|
46
|
+
return event;
|
|
47
|
+
}
|
|
48
|
+
event.spans = event.spans || [];
|
|
49
|
+
event.measurements = event.measurements || {};
|
|
50
|
+
const ttidSpan = yield addTimeToInitialDisplay({
|
|
51
|
+
event,
|
|
52
|
+
rootSpanId,
|
|
53
|
+
transactionStartTimestampSeconds,
|
|
54
|
+
enableTimeToInitialDisplayForPreloadedRoutes,
|
|
55
|
+
});
|
|
56
|
+
const ttfdSpan = yield addTimeToFullDisplay({ event, rootSpanId, transactionStartTimestampSeconds, ttidSpan });
|
|
57
|
+
if (ttidSpan && ttidSpan.start_timestamp && ttidSpan.timestamp) {
|
|
58
|
+
event.measurements['time_to_initial_display'] = {
|
|
59
|
+
value: (ttidSpan.timestamp - ttidSpan.start_timestamp) * 1000,
|
|
60
|
+
unit: 'millisecond',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (ttfdSpan && ttfdSpan.start_timestamp && ttfdSpan.timestamp) {
|
|
64
|
+
const durationMs = (ttfdSpan.timestamp - ttfdSpan.start_timestamp) * 1000;
|
|
65
|
+
if (isDeadlineExceeded(durationMs)) {
|
|
66
|
+
event.measurements['time_to_full_display'] = event.measurements['time_to_initial_display'];
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
event.measurements['time_to_full_display'] = {
|
|
70
|
+
value: durationMs,
|
|
71
|
+
unit: 'millisecond',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const newTransactionEndTimestampSeconds = Math.max((_a = ttidSpan === null || ttidSpan === void 0 ? void 0 : ttidSpan.timestamp) !== null && _a !== void 0 ? _a : -1, (_b = ttfdSpan === null || ttfdSpan === void 0 ? void 0 : ttfdSpan.timestamp) !== null && _b !== void 0 ? _b : -1, (_c = event.timestamp) !== null && _c !== void 0 ? _c : -1);
|
|
76
|
+
if (newTransactionEndTimestampSeconds !== -1) {
|
|
77
|
+
event.timestamp = newTransactionEndTimestampSeconds;
|
|
78
|
+
}
|
|
79
|
+
return event;
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
function addTimeToInitialDisplay({ event, rootSpanId, transactionStartTimestampSeconds, enableTimeToInitialDisplayForPreloadedRoutes, }) {
|
|
84
|
+
var _a;
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
const ttidEndTimestampSeconds = yield NATIVE.popTimeToDisplayFor(`ttid-${rootSpanId}`);
|
|
87
|
+
let ttidSpan = (_a = event.spans) === null || _a === void 0 ? void 0 : _a.find(span => span.op === UI_LOAD_INITIAL_DISPLAY);
|
|
88
|
+
if (ttidSpan && (ttidSpan.status === undefined || ttidSpan.status === 'ok') && !ttidEndTimestampSeconds) {
|
|
89
|
+
logger.debug(`[${INTEGRATION_NAME}] Ttid span already exists and is ok.`, ttidSpan);
|
|
90
|
+
return ttidSpan;
|
|
91
|
+
}
|
|
92
|
+
if (!ttidEndTimestampSeconds) {
|
|
93
|
+
logger.debug(`[${INTEGRATION_NAME}] No manual ttid end timestamp found for span ${rootSpanId}.`);
|
|
94
|
+
return addAutomaticTimeToInitialDisplay({
|
|
95
|
+
event,
|
|
96
|
+
rootSpanId,
|
|
97
|
+
transactionStartTimestampSeconds,
|
|
98
|
+
enableTimeToInitialDisplayForPreloadedRoutes,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (ttidSpan && ttidSpan.status && ttidSpan.status !== 'ok') {
|
|
102
|
+
ttidSpan.status = 'ok';
|
|
103
|
+
ttidSpan.timestamp = ttidEndTimestampSeconds;
|
|
104
|
+
logger.debug(`[${INTEGRATION_NAME}] Updated existing ttid span.`, ttidSpan);
|
|
105
|
+
return ttidSpan;
|
|
106
|
+
}
|
|
107
|
+
ttidSpan = createSpanJSON({
|
|
108
|
+
op: UI_LOAD_INITIAL_DISPLAY,
|
|
109
|
+
description: 'Time To Initial Display',
|
|
110
|
+
start_timestamp: transactionStartTimestampSeconds,
|
|
111
|
+
timestamp: ttidEndTimestampSeconds,
|
|
112
|
+
origin: SPAN_ORIGIN_MANUAL_UI_TIME_TO_DISPLAY,
|
|
113
|
+
parent_span_id: rootSpanId,
|
|
114
|
+
data: {
|
|
115
|
+
[SPAN_THREAD_NAME]: SPAN_THREAD_NAME_JAVASCRIPT,
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
logger.debug(`[${INTEGRATION_NAME}] Added ttid span to transaction.`, ttidSpan);
|
|
119
|
+
event.spans.push(ttidSpan);
|
|
120
|
+
return ttidSpan;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function addAutomaticTimeToInitialDisplay({ event, rootSpanId, transactionStartTimestampSeconds, enableTimeToInitialDisplayForPreloadedRoutes, }) {
|
|
124
|
+
var _a, _b, _c, _d, _e, _f;
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
const ttidNativeTimestampSeconds = yield NATIVE.popTimeToDisplayFor(`ttid-navigation-${rootSpanId}`);
|
|
127
|
+
const ttidFallbackTimestampSeconds = yield getTimeToInitialDisplayFallback(rootSpanId);
|
|
128
|
+
const hasBeenSeen = (_c = (_b = (_a = event.contexts) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c[SEMANTIC_ATTRIBUTE_ROUTE_HAS_BEEN_SEEN];
|
|
129
|
+
if (hasBeenSeen && !enableTimeToInitialDisplayForPreloadedRoutes) {
|
|
130
|
+
logger.debug(`[${INTEGRATION_NAME}] Route has been seen and time to initial display is disabled for preloaded routes.`);
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
const ttidTimestampSeconds = ttidNativeTimestampSeconds !== null && ttidNativeTimestampSeconds !== void 0 ? ttidNativeTimestampSeconds : ttidFallbackTimestampSeconds;
|
|
134
|
+
if (!ttidTimestampSeconds) {
|
|
135
|
+
logger.debug(`[${INTEGRATION_NAME}] No automatic ttid end timestamp found for span ${rootSpanId}.`);
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const viewNames = (_e = (_d = event.contexts) === null || _d === void 0 ? void 0 : _d.app) === null || _e === void 0 ? void 0 : _e.view_names;
|
|
139
|
+
const screenName = Array.isArray(viewNames) ? viewNames[0] : viewNames;
|
|
140
|
+
const ttidSpan = createSpanJSON({
|
|
141
|
+
op: UI_LOAD_INITIAL_DISPLAY,
|
|
142
|
+
description: screenName ? `${screenName} initial display` : 'Time To Initial Display',
|
|
143
|
+
start_timestamp: transactionStartTimestampSeconds,
|
|
144
|
+
timestamp: ttidTimestampSeconds,
|
|
145
|
+
origin: SPAN_ORIGIN_AUTO_UI_TIME_TO_DISPLAY,
|
|
146
|
+
parent_span_id: rootSpanId,
|
|
147
|
+
data: {
|
|
148
|
+
[SPAN_THREAD_NAME]: SPAN_THREAD_NAME_JAVASCRIPT,
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
event.spans = (_f = event.spans) !== null && _f !== void 0 ? _f : [];
|
|
152
|
+
event.spans.push(ttidSpan);
|
|
153
|
+
return ttidSpan;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function addTimeToFullDisplay({ event, rootSpanId, transactionStartTimestampSeconds, ttidSpan, }) {
|
|
157
|
+
var _a;
|
|
158
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
159
|
+
const ttfdEndTimestampSeconds = yield NATIVE.popTimeToDisplayFor(`ttfd-${rootSpanId}`);
|
|
160
|
+
if (!ttidSpan || !ttfdEndTimestampSeconds) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
let ttfdSpan = (_a = event.spans) === null || _a === void 0 ? void 0 : _a.find(span => span.op === UI_LOAD_FULL_DISPLAY);
|
|
164
|
+
let ttfdAdjustedEndTimestampSeconds = ttfdEndTimestampSeconds;
|
|
165
|
+
const ttfdIsBeforeTtid = (ttidSpan === null || ttidSpan === void 0 ? void 0 : ttidSpan.timestamp) && ttfdEndTimestampSeconds < ttidSpan.timestamp;
|
|
166
|
+
if (ttfdIsBeforeTtid) {
|
|
167
|
+
ttfdAdjustedEndTimestampSeconds = ttidSpan.timestamp;
|
|
168
|
+
}
|
|
169
|
+
const durationMs = (ttfdAdjustedEndTimestampSeconds - transactionStartTimestampSeconds) * 1000;
|
|
170
|
+
if (ttfdSpan && ttfdSpan.status && ttfdSpan.status !== 'ok') {
|
|
171
|
+
ttfdSpan.status = 'ok';
|
|
172
|
+
ttfdSpan.timestamp = ttfdAdjustedEndTimestampSeconds;
|
|
173
|
+
logger.debug(`[${INTEGRATION_NAME}] Updated existing ttfd span.`, ttfdSpan);
|
|
174
|
+
return ttfdSpan;
|
|
175
|
+
}
|
|
176
|
+
ttfdSpan = createSpanJSON({
|
|
177
|
+
status: isDeadlineExceeded(durationMs) ? 'deadline_exceeded' : 'ok',
|
|
178
|
+
op: UI_LOAD_FULL_DISPLAY,
|
|
179
|
+
description: 'Time To Full Display',
|
|
180
|
+
start_timestamp: transactionStartTimestampSeconds,
|
|
181
|
+
timestamp: ttfdAdjustedEndTimestampSeconds,
|
|
182
|
+
origin: SPAN_ORIGIN_MANUAL_UI_TIME_TO_DISPLAY,
|
|
183
|
+
parent_span_id: rootSpanId,
|
|
184
|
+
data: {
|
|
185
|
+
[SPAN_THREAD_NAME]: SPAN_THREAD_NAME_JAVASCRIPT,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
logger.debug(`[${INTEGRATION_NAME}] Added ttfd span to transaction.`, ttfdSpan);
|
|
189
|
+
event.spans.push(ttfdSpan);
|
|
190
|
+
return ttfdSpan;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=timeToDisplayIntegration.js.map
|