@sentry/react-native 3.2.0-beta.1 → 3.2.2
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/CHANGELOG.md +27 -0
- package/RNSentry.podspec +1 -1
- package/android/build.gradle +1 -1
- package/dist/js/options.d.ts +8 -0
- package/dist/js/options.d.ts.map +1 -1
- package/dist/js/options.js.map +1 -1
- package/dist/js/sdk.d.ts.map +1 -1
- package/dist/js/sdk.js +1 -0
- package/dist/js/sdk.js.map +1 -1
- package/dist/js/tracing/reactnativenavigation.d.ts +4 -4
- package/dist/js/tracing/reactnativenavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnativenavigation.js +10 -7
- package/dist/js/tracing/reactnativenavigation.js.map +1 -1
- package/dist/js/tracing/reactnativetracing.d.ts +4 -0
- package/dist/js/tracing/reactnativetracing.d.ts.map +1 -1
- package/dist/js/tracing/reactnativetracing.js +24 -2
- package/dist/js/tracing/reactnativetracing.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts +3 -3
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +19 -17
- package/dist/js/tracing/reactnavigation.js.map +1 -1
- package/dist/js/tracing/reactnavigationv4.d.ts +3 -3
- package/dist/js/tracing/reactnavigationv4.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigationv4.js +22 -20
- package/dist/js/tracing/reactnavigationv4.js.map +1 -1
- package/dist/js/tracing/routingInstrumentation.d.ts +13 -3
- package/dist/js/tracing/routingInstrumentation.d.ts.map +1 -1
- package/dist/js/tracing/routingInstrumentation.js +17 -2
- package/dist/js/tracing/routingInstrumentation.js.map +1 -1
- package/dist/js/tracing/types.d.ts +12 -4
- package/dist/js/tracing/types.d.ts.map +1 -1
- package/dist/js/tracing/types.js.map +1 -1
- 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/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.2.2
|
|
4
|
+
|
|
5
|
+
- Bump Sentry Android SDK to 5.3.0 #1860
|
|
6
|
+
|
|
7
|
+
## 3.2.1
|
|
8
|
+
|
|
9
|
+
### Various fixes & improvements
|
|
10
|
+
|
|
11
|
+
- feat(ios): Missing config `enableOutOfMemoryTracking` on iOS/Mac (#1858) by @marandaneto
|
|
12
|
+
|
|
13
|
+
## 3.2.0
|
|
14
|
+
|
|
15
|
+
- feat: Routing instrumentation will emit breadcrumbs on route change and set route tag #1837
|
|
16
|
+
- Bump Sentry Android SDK to 5.2.4 ([#1844](https://github.com/getsentry/sentry-react-native/pull/1844))
|
|
17
|
+
|
|
18
|
+
- [changelog](https://github.com/getsentry/sentry-java/blob/5.2.4/CHANGELOG.md)
|
|
19
|
+
- [diff](https://github.com/getsentry/sentry-java/compare/5.2.0...5.2.4)
|
|
20
|
+
|
|
21
|
+
- Bump Sentry Cocoa SDK to 7.4.8 ([#1856](https://github.com/getsentry/sentry-react-native/pull/1856))
|
|
22
|
+
- [changelog](https://github.com/getsentry/sentry-cocoa/blob/7.4.8/CHANGELOG.md)
|
|
23
|
+
- [diff](https://github.com/getsentry/sentry-cocoa/compare/7.3.0...7.4.8)
|
|
24
|
+
|
|
25
|
+
## 3.2.0-beta.2
|
|
26
|
+
|
|
27
|
+
- fix: Type React Native Navigation instrumentation constructor argument as unknown to avoid typescript errors #1817
|
|
28
|
+
|
|
3
29
|
## 3.2.0-beta.1
|
|
4
30
|
|
|
5
31
|
- feat: Routing instrumentation for React Native Navigation #1774
|
|
@@ -7,6 +33,7 @@
|
|
|
7
33
|
## 3.1.1
|
|
8
34
|
|
|
9
35
|
- Bump Sentry Android SDK to 5.2.0 ([#1785](https://github.com/getsentry/sentry-react-native/pull/1785))
|
|
36
|
+
|
|
10
37
|
- [changelog](https://github.com/getsentry/sentry-java/blob/5.2.0/CHANGELOG.md)
|
|
11
38
|
- [diff](https://github.com/getsentry/sentry-java/compare/5.1.2...5.2.0)
|
|
12
39
|
|
package/RNSentry.podspec
CHANGED
package/android/build.gradle
CHANGED
package/dist/js/options.d.ts
CHANGED
|
@@ -57,6 +57,14 @@ export interface ReactNativeOptions extends BrowserOptions {
|
|
|
57
57
|
}) => void;
|
|
58
58
|
/** Enable auto performance tracking by default. */
|
|
59
59
|
enableAutoPerformanceTracking?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Enables Out of Memory Tracking for iOS and macCatalyst.
|
|
62
|
+
* See the following link for more information and possible restrictions:
|
|
63
|
+
* https://docs.sentry.io/platforms/apple/guides/ios/configuration/out-of-memory/
|
|
64
|
+
*
|
|
65
|
+
* @default true
|
|
66
|
+
* */
|
|
67
|
+
enableOutOfMemoryTracking?: boolean;
|
|
60
68
|
}
|
|
61
69
|
export interface ReactNativeWrapperOptions {
|
|
62
70
|
/** Props for the root React profiler */
|
package/dist/js/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/js/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;GAGG;AAEH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;;;;;;;;OAUG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,0DAA0D;IAC1D,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC,uEAAuE;IACvE,6BAA6B,CAAC,EAAE,MAAM,CAAC;IAEvC,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,+FAA+F;IAC/F,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;SAIK;IACL,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE;QACnB,yEAAyE;QACzE,iBAAiB,EAAE,OAAO,CAAC;KAC5B,KAAK,IAAI,CAAC;IAEX,mDAAmD;IACnD,6BAA6B,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/js/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;GAGG;AAEH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;;;;;;;;OAUG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,8FAA8F;IAC9F,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,sDAAsD;IACtD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,0DAA0D;IAC1D,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC,uEAAuE;IACvE,6BAA6B,CAAC,EAAE,MAAM,CAAC;IAEvC,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,+FAA+F;IAC/F,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;SAIK;IACL,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE;QACnB,yEAAyE;QACzE,iBAAiB,EAAE,OAAO,CAAC;KAC5B,KAAK,IAAI,CAAC;IAEX,mDAAmD;IACnD,6BAA6B,CAAC,EAAE,OAAO,CAAC;IAExC;;;;;;SAMK;IACJ,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B,8CAA8C;IAC9C,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;CACnD"}
|
package/dist/js/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/js/options.ts"],"names":[],"mappings":"","sourcesContent":["import { BrowserOptions } from \"@sentry/react\";\nimport { ProfilerProps } from \"@sentry/react/dist/profiler\";\n\nimport { TouchEventBoundaryProps } from \"./touchevents\";\n\n/**\n * Configuration options for the Sentry ReactNative SDK.\n * @see ReactNativeFrontend for more information.\n */\n\nexport interface ReactNativeOptions extends BrowserOptions {\n /**\n * Enables native transport + device info + offline caching.\n * Be careful, disabling this also breaks automatic release setting.\n * This means you have to manage setting the release yourself.\n * Defaults to `true`.\n */\n enableNative?: boolean;\n\n /**\n * Enables native crashHandling. This only works if `enableNative` is `true`.\n * Defaults to `true`.\n */\n enableNativeCrashHandling?: boolean;\n\n /**\n * Initializes the native SDK on init.\n * Set this to `false` if you have an existing native SDK and don't want to re-initialize.\n *\n * NOTE: Be careful and only use this if you know what you are doing.\n * If you use this flag, make sure a native SDK is running before the JS Engine initializes or events might not be captured.\n * Also, make sure the DSN on both the React Native side and the native side are the same one.\n * We strongly recommend checking the documentation if you need to use this.\n *\n * @default true\n */\n autoInitializeNativeSdk?: boolean;\n\n /** Maximum time to wait to drain the request queue, before the process is allowed to exit. */\n shutdownTimeout?: number;\n\n /** Should the native nagger alert be shown or not. */\n enableNativeNagger?: boolean;\n\n /** Should sessions be tracked to Sentry Health or not. */\n enableAutoSessionTracking?: boolean;\n\n /** The interval to end a session if the App goes to the background. */\n sessionTrackingIntervalMillis?: number;\n\n /** Enable scope sync from Java to NDK on Android */\n enableNdkScopeSync?: boolean;\n\n /** When enabled, all the threads are automatically attached to all logged events on Android */\n attachThreads?: boolean;\n\n /**\n * When enabled, certain personally identifiable information (PII) is added by active integrations.\n *\n * @default false\n * */\n sendDefaultPii?: boolean;\n\n /**\n * Callback that is called after the RN SDK on the JS Layer has made contact with the Native Layer.\n */\n onReady?: (response: {\n /** `true` if the native SDK has been initialized, `false` otherwise. */\n didCallNativeInit: boolean;\n }) => void;\n\n /** Enable auto performance tracking by default. */\n enableAutoPerformanceTracking?: boolean;\n}\n\nexport interface ReactNativeWrapperOptions {\n /** Props for the root React profiler */\n profilerProps?: ProfilerProps;\n\n /** Props for the root touch event boundary */\n touchEventBoundaryProps?: TouchEventBoundaryProps;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/js/options.ts"],"names":[],"mappings":"","sourcesContent":["import { BrowserOptions } from \"@sentry/react\";\nimport { ProfilerProps } from \"@sentry/react/dist/profiler\";\n\nimport { TouchEventBoundaryProps } from \"./touchevents\";\n\n/**\n * Configuration options for the Sentry ReactNative SDK.\n * @see ReactNativeFrontend for more information.\n */\n\nexport interface ReactNativeOptions extends BrowserOptions {\n /**\n * Enables native transport + device info + offline caching.\n * Be careful, disabling this also breaks automatic release setting.\n * This means you have to manage setting the release yourself.\n * Defaults to `true`.\n */\n enableNative?: boolean;\n\n /**\n * Enables native crashHandling. This only works if `enableNative` is `true`.\n * Defaults to `true`.\n */\n enableNativeCrashHandling?: boolean;\n\n /**\n * Initializes the native SDK on init.\n * Set this to `false` if you have an existing native SDK and don't want to re-initialize.\n *\n * NOTE: Be careful and only use this if you know what you are doing.\n * If you use this flag, make sure a native SDK is running before the JS Engine initializes or events might not be captured.\n * Also, make sure the DSN on both the React Native side and the native side are the same one.\n * We strongly recommend checking the documentation if you need to use this.\n *\n * @default true\n */\n autoInitializeNativeSdk?: boolean;\n\n /** Maximum time to wait to drain the request queue, before the process is allowed to exit. */\n shutdownTimeout?: number;\n\n /** Should the native nagger alert be shown or not. */\n enableNativeNagger?: boolean;\n\n /** Should sessions be tracked to Sentry Health or not. */\n enableAutoSessionTracking?: boolean;\n\n /** The interval to end a session if the App goes to the background. */\n sessionTrackingIntervalMillis?: number;\n\n /** Enable scope sync from Java to NDK on Android */\n enableNdkScopeSync?: boolean;\n\n /** When enabled, all the threads are automatically attached to all logged events on Android */\n attachThreads?: boolean;\n\n /**\n * When enabled, certain personally identifiable information (PII) is added by active integrations.\n *\n * @default false\n * */\n sendDefaultPii?: boolean;\n\n /**\n * Callback that is called after the RN SDK on the JS Layer has made contact with the Native Layer.\n */\n onReady?: (response: {\n /** `true` if the native SDK has been initialized, `false` otherwise. */\n didCallNativeInit: boolean;\n }) => void;\n\n /** Enable auto performance tracking by default. */\n enableAutoPerformanceTracking?: boolean;\n\n /**\n * Enables Out of Memory Tracking for iOS and macCatalyst.\n * See the following link for more information and possible restrictions:\n * https://docs.sentry.io/platforms/apple/guides/ios/configuration/out-of-memory/\n *\n * @default true\n * */\n enableOutOfMemoryTracking?: boolean;\n}\n\nexport interface ReactNativeWrapperOptions {\n /** Props for the root React profiler */\n profilerProps?: ProfilerProps;\n\n /** Props for the root touch event boundary */\n touchEventBoundaryProps?: TouchEventBoundaryProps;\n}\n"]}
|
package/dist/js/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/js/sdk.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/js/sdk.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAkB1E;;GAEG;AACH,wBAAgB,IAAI,CAAC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAsE5D;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EACpB,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EACrC,OAAO,CAAC,EAAE,yBAAyB,GAClC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAsBxB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAKlC;AAED;;;GAGG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAe9C;AAED;;GAEG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3C"}
|
package/dist/js/sdk.js
CHANGED
package/dist/js/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/js/sdk.tsx"],"names":[],"mappings":"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","sourcesContent":["import { initAndBind, setExtra } from \"@sentry/core\";\nimport { Hub, makeMain } from \"@sentry/hub\";\nimport { RewriteFrames } from \"@sentry/integrations\";\nimport { defaultIntegrations, getCurrentHub } from \"@sentry/react\";\nimport { StackFrame } from \"@sentry/types\";\nimport { getGlobalObject, logger } from \"@sentry/utils\";\nimport * as React from \"react\";\n\nimport { ReactNativeClient } from \"./client\";\nimport {\n DebugSymbolicator,\n DeviceContext,\n EventOrigin,\n ReactNativeErrorHandlers,\n Release,\n SdkInfo,\n} from \"./integrations\";\nimport { ReactNativeOptions, ReactNativeWrapperOptions } from \"./options\";\nimport { ReactNativeScope } from \"./scope\";\nimport { TouchEventBoundary } from \"./touchevents\";\nimport { ReactNativeProfiler, ReactNativeTracing } from \"./tracing\";\n\nconst IGNORED_DEFAULT_INTEGRATIONS = [\n \"GlobalHandlers\", // We will use the react-native internal handlers\n \"TryCatch\", // We don't need this\n];\nconst DEFAULT_OPTIONS: ReactNativeOptions = {\n enableNative: true,\n enableNativeCrashHandling: true,\n enableNativeNagger: true,\n autoInitializeNativeSdk: true,\n enableAutoPerformanceTracking: true,\n};\n\n/**\n * Inits the SDK and returns the final options.\n */\nexport function init(passedOptions: ReactNativeOptions): void {\n const reactNativeHub = new Hub(undefined, new ReactNativeScope());\n makeMain(reactNativeHub);\n\n const options = {\n ...DEFAULT_OPTIONS,\n ...passedOptions,\n };\n\n // As long as tracing is opt in with either one of these options, then this is how we determine tracing is enabled.\n const tracingEnabled =\n typeof options.tracesSampler !== \"undefined\" ||\n typeof options.tracesSampleRate !== \"undefined\";\n\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = [\n new ReactNativeErrorHandlers(),\n new Release(),\n ...defaultIntegrations.filter(\n (i) => !IGNORED_DEFAULT_INTEGRATIONS.includes(i.name)\n ),\n new EventOrigin(),\n new SdkInfo(),\n ];\n\n if (__DEV__) {\n options.defaultIntegrations.push(new DebugSymbolicator());\n }\n\n options.defaultIntegrations.push(\n new RewriteFrames({\n iteratee: (frame: StackFrame) => {\n if (frame.filename) {\n frame.filename = frame.filename\n .replace(/^file:\\/\\//, \"\")\n .replace(/^address at /, \"\")\n .replace(/^.*\\/[^.]+(\\.app|CodePush|.*(?=\\/))/, \"\");\n\n if (\n frame.filename !== \"[native code]\" &&\n frame.filename !== \"native\"\n ) {\n const appPrefix = \"app://\";\n // We always want to have a triple slash\n frame.filename =\n frame.filename.indexOf(\"/\") === 0\n ? `${appPrefix}${frame.filename}`\n : `${appPrefix}/${frame.filename}`;\n }\n }\n return frame;\n },\n })\n );\n if (options.enableNative) {\n options.defaultIntegrations.push(new DeviceContext());\n }\n if (tracingEnabled) {\n if (options.enableAutoPerformanceTracking) {\n options.defaultIntegrations.push(new ReactNativeTracing());\n }\n }\n }\n\n initAndBind(ReactNativeClient, options);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any\n if (getGlobalObject<any>().HermesInternal) {\n getCurrentHub().setTag(\"hermes\", \"true\");\n }\n}\n\n/**\n * Inits the Sentry React Native SDK with automatic instrumentation and wrapped features.\n */\nexport function wrap<P>(\n RootComponent: React.ComponentType<P>,\n options?: ReactNativeWrapperOptions\n): React.ComponentType<P> {\n const tracingIntegration = getCurrentHub().getIntegration(ReactNativeTracing);\n if (tracingIntegration) {\n tracingIntegration.useAppStartWithProfiler = true;\n }\n\n const profilerProps = {\n ...(options?.profilerProps ?? {}),\n name: RootComponent.displayName ?? \"Root\",\n };\n\n const RootApp: React.FC<P> = (appProps) => {\n return (\n <TouchEventBoundary {...(options?.touchEventBoundaryProps ?? {})}>\n <ReactNativeProfiler {...profilerProps}>\n <RootComponent {...appProps} />\n </ReactNativeProfiler>\n </TouchEventBoundary>\n );\n };\n\n return RootApp;\n}\n\n/**\n * Deprecated. Sets the release on the event.\n * NOTE: Does not set the release on sessions.\n * @deprecated\n */\nexport function setRelease(release: string): void {\n setExtra(\"__sentry_release\", release);\n}\n\n/**\n * Deprecated. Sets the dist on the event.\n * NOTE: Does not set the dist on sessions.\n * @deprecated\n */\nexport function setDist(dist: string): void {\n setExtra(\"__sentry_dist\", dist);\n}\n\n/**\n * If native client is available it will trigger a native crash.\n * Use this only for testing purposes.\n */\nexport function nativeCrash(): void {\n const client = getCurrentHub().getClient<ReactNativeClient>();\n if (client) {\n client.nativeCrash();\n }\n}\n\n/**\n * Flushes all pending events in the queue to disk.\n * Use this before applying any realtime updates such as code-push or expo updates.\n */\nexport async function flush(): Promise<boolean> {\n try {\n const client = getCurrentHub().getClient<ReactNativeClient>();\n\n if (client) {\n const result = await client.flush();\n\n return result;\n }\n // eslint-disable-next-line no-empty\n } catch (_) {}\n\n logger.error(\"Failed to flush the event queue.\");\n\n return false;\n}\n\n/**\n * Closes the SDK, stops sending events.\n */\nexport async function close(): Promise<void> {\n try {\n const client = getCurrentHub().getClient<ReactNativeClient>();\n\n if (client) {\n await client.close();\n }\n } catch (e) {\n logger.error(\"Failed to close the SDK\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/js/sdk.tsx"],"names":[],"mappings":"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","sourcesContent":["import { initAndBind, setExtra } from \"@sentry/core\";\nimport { Hub, makeMain } from \"@sentry/hub\";\nimport { RewriteFrames } from \"@sentry/integrations\";\nimport { defaultIntegrations, getCurrentHub } from \"@sentry/react\";\nimport { StackFrame } from \"@sentry/types\";\nimport { getGlobalObject, logger } from \"@sentry/utils\";\nimport * as React from \"react\";\n\nimport { ReactNativeClient } from \"./client\";\nimport {\n DebugSymbolicator,\n DeviceContext,\n EventOrigin,\n ReactNativeErrorHandlers,\n Release,\n SdkInfo,\n} from \"./integrations\";\nimport { ReactNativeOptions, ReactNativeWrapperOptions } from \"./options\";\nimport { ReactNativeScope } from \"./scope\";\nimport { TouchEventBoundary } from \"./touchevents\";\nimport { ReactNativeProfiler, ReactNativeTracing } from \"./tracing\";\n\nconst IGNORED_DEFAULT_INTEGRATIONS = [\n \"GlobalHandlers\", // We will use the react-native internal handlers\n \"TryCatch\", // We don't need this\n];\nconst DEFAULT_OPTIONS: ReactNativeOptions = {\n enableNative: true,\n enableNativeCrashHandling: true,\n enableNativeNagger: true,\n autoInitializeNativeSdk: true,\n enableAutoPerformanceTracking: true,\n enableOutOfMemoryTracking: true,\n};\n\n/**\n * Inits the SDK and returns the final options.\n */\nexport function init(passedOptions: ReactNativeOptions): void {\n const reactNativeHub = new Hub(undefined, new ReactNativeScope());\n makeMain(reactNativeHub);\n\n const options = {\n ...DEFAULT_OPTIONS,\n ...passedOptions,\n };\n\n // As long as tracing is opt in with either one of these options, then this is how we determine tracing is enabled.\n const tracingEnabled =\n typeof options.tracesSampler !== \"undefined\" ||\n typeof options.tracesSampleRate !== \"undefined\";\n\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = [\n new ReactNativeErrorHandlers(),\n new Release(),\n ...defaultIntegrations.filter(\n (i) => !IGNORED_DEFAULT_INTEGRATIONS.includes(i.name)\n ),\n new EventOrigin(),\n new SdkInfo(),\n ];\n\n if (__DEV__) {\n options.defaultIntegrations.push(new DebugSymbolicator());\n }\n\n options.defaultIntegrations.push(\n new RewriteFrames({\n iteratee: (frame: StackFrame) => {\n if (frame.filename) {\n frame.filename = frame.filename\n .replace(/^file:\\/\\//, \"\")\n .replace(/^address at /, \"\")\n .replace(/^.*\\/[^.]+(\\.app|CodePush|.*(?=\\/))/, \"\");\n\n if (\n frame.filename !== \"[native code]\" &&\n frame.filename !== \"native\"\n ) {\n const appPrefix = \"app://\";\n // We always want to have a triple slash\n frame.filename =\n frame.filename.indexOf(\"/\") === 0\n ? `${appPrefix}${frame.filename}`\n : `${appPrefix}/${frame.filename}`;\n }\n }\n return frame;\n },\n })\n );\n if (options.enableNative) {\n options.defaultIntegrations.push(new DeviceContext());\n }\n if (tracingEnabled) {\n if (options.enableAutoPerformanceTracking) {\n options.defaultIntegrations.push(new ReactNativeTracing());\n }\n }\n }\n\n initAndBind(ReactNativeClient, options);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any\n if (getGlobalObject<any>().HermesInternal) {\n getCurrentHub().setTag(\"hermes\", \"true\");\n }\n}\n\n/**\n * Inits the Sentry React Native SDK with automatic instrumentation and wrapped features.\n */\nexport function wrap<P>(\n RootComponent: React.ComponentType<P>,\n options?: ReactNativeWrapperOptions\n): React.ComponentType<P> {\n const tracingIntegration = getCurrentHub().getIntegration(ReactNativeTracing);\n if (tracingIntegration) {\n tracingIntegration.useAppStartWithProfiler = true;\n }\n\n const profilerProps = {\n ...(options?.profilerProps ?? {}),\n name: RootComponent.displayName ?? \"Root\",\n };\n\n const RootApp: React.FC<P> = (appProps) => {\n return (\n <TouchEventBoundary {...(options?.touchEventBoundaryProps ?? {})}>\n <ReactNativeProfiler {...profilerProps}>\n <RootComponent {...appProps} />\n </ReactNativeProfiler>\n </TouchEventBoundary>\n );\n };\n\n return RootApp;\n}\n\n/**\n * Deprecated. Sets the release on the event.\n * NOTE: Does not set the release on sessions.\n * @deprecated\n */\nexport function setRelease(release: string): void {\n setExtra(\"__sentry_release\", release);\n}\n\n/**\n * Deprecated. Sets the dist on the event.\n * NOTE: Does not set the dist on sessions.\n * @deprecated\n */\nexport function setDist(dist: string): void {\n setExtra(\"__sentry_dist\", dist);\n}\n\n/**\n * If native client is available it will trigger a native crash.\n * Use this only for testing purposes.\n */\nexport function nativeCrash(): void {\n const client = getCurrentHub().getClient<ReactNativeClient>();\n if (client) {\n client.nativeCrash();\n }\n}\n\n/**\n * Flushes all pending events in the queue to disk.\n * Use this before applying any realtime updates such as code-push or expo updates.\n */\nexport async function flush(): Promise<boolean> {\n try {\n const client = getCurrentHub().getClient<ReactNativeClient>();\n\n if (client) {\n const result = await client.flush();\n\n return result;\n }\n // eslint-disable-next-line no-empty\n } catch (_) {}\n\n logger.error(\"Failed to flush the event queue.\");\n\n return false;\n}\n\n/**\n * Closes the SDK, stops sending events.\n */\nexport async function close(): Promise<void> {\n try {\n const client = getCurrentHub().getClient<ReactNativeClient>();\n\n if (client) {\n await client.close();\n }\n } catch (e) {\n logger.error(\"Failed to close the SDK\");\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EmitterSubscription } from "react-native";
|
|
2
2
|
import { BeforeNavigate } from "./reactnativetracing";
|
|
3
|
-
import {
|
|
3
|
+
import { InternalRoutingInstrumentation, OnConfirmRoute, TransactionCreator } from "./routingInstrumentation";
|
|
4
4
|
interface ReactNativeNavigationOptions {
|
|
5
5
|
routeChangeTimeoutMs: number;
|
|
6
6
|
}
|
|
@@ -31,7 +31,7 @@ export interface NavigationDelegate {
|
|
|
31
31
|
* - `_onComponentWillAppear` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.
|
|
32
32
|
* - If `_onComponentWillAppear` isn't called within `options.routeChangeTimeoutMs` of the dispatch, then the transaction is not sampled and finished.
|
|
33
33
|
*/
|
|
34
|
-
export declare class ReactNativeNavigationInstrumentation extends
|
|
34
|
+
export declare class ReactNativeNavigationInstrumentation extends InternalRoutingInstrumentation {
|
|
35
35
|
static instrumentationName: string;
|
|
36
36
|
private _navigation;
|
|
37
37
|
private _options;
|
|
@@ -41,11 +41,11 @@ export declare class ReactNativeNavigationInstrumentation extends RoutingInstrum
|
|
|
41
41
|
private _stateChangeTimeout?;
|
|
42
42
|
constructor(
|
|
43
43
|
/** The react native navigation `NavigationDelegate`. This is usually the import named `Navigation`. */
|
|
44
|
-
navigation:
|
|
44
|
+
navigation: unknown, options?: Partial<ReactNativeNavigationOptions>);
|
|
45
45
|
/**
|
|
46
46
|
* Registers the event listeners for React Native Navigation
|
|
47
47
|
*/
|
|
48
|
-
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate): void;
|
|
48
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
|
49
49
|
/**
|
|
50
50
|
* To be called when a navigation command is dispatched
|
|
51
51
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativenavigation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnativenavigation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"reactnativenavigation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnativenavigation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAIlC,UAAU,4BAA4B;IACpC,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAMD,UAAU,cAAc;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAK,aAAa,GACd,WAAW,GACX,aAAa,GACb,kBAAkB,GAClB,cAAc,CAAC;AAEnB,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,mCAAmC,CACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,IAAI,GAClD,mBAAmB,CAAC;IACvB,uBAAuB,CACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,GAChD,iBAAiB,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,cAAc,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,qBAAa,oCAAqC,SAAQ,8BAA8B;IACtF,OAAc,mBAAmB,EAAE,MAAM,CAA6B;IAEtE,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAA+B;IAE/C,OAAO,CAAC,mBAAmB,CAAyC;IAEpE,OAAO,CAAC,kBAAkB,CAAC,CAAkB;IAC7C,OAAO,CAAC,mBAAmB,CAAgB;IAC3C,OAAO,CAAC,mBAAmB,CAAC,CAAqB;;IAG/C,uGAAuG;IACvG,UAAU,EAAE,OAAO,EACnB,OAAO,GAAE,OAAO,CAAC,4BAA4B,CAAM;IAYrD;;OAEG;IACI,8BAA8B,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAC7B,IAAI;IAkBP;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoE9B,wEAAwE;IACxE,OAAO,CAAC,yBAAyB;IAUjC,wEAAwE;IACxE,OAAO,CAAC,wBAAwB;CAMjC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logger } from "@sentry/utils";
|
|
2
|
-
import {
|
|
2
|
+
import { InternalRoutingInstrumentation, } from "./routingInstrumentation";
|
|
3
3
|
import { getBlankTransactionContext } from "./utils";
|
|
4
4
|
const defaultOptions = {
|
|
5
5
|
routeChangeTimeoutMs: 1000,
|
|
@@ -12,7 +12,7 @@ const defaultOptions = {
|
|
|
12
12
|
* - `_onComponentWillAppear` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.
|
|
13
13
|
* - If `_onComponentWillAppear` isn't called within `options.routeChangeTimeoutMs` of the dispatch, then the transaction is not sampled and finished.
|
|
14
14
|
*/
|
|
15
|
-
export class ReactNativeNavigationInstrumentation extends
|
|
15
|
+
export class ReactNativeNavigationInstrumentation extends InternalRoutingInstrumentation {
|
|
16
16
|
constructor(
|
|
17
17
|
/** The react native navigation `NavigationDelegate`. This is usually the import named `Navigation`. */
|
|
18
18
|
navigation, options = {}) {
|
|
@@ -25,8 +25,8 @@ export class ReactNativeNavigationInstrumentation extends RoutingInstrumentation
|
|
|
25
25
|
/**
|
|
26
26
|
* Registers the event listeners for React Native Navigation
|
|
27
27
|
*/
|
|
28
|
-
registerRoutingInstrumentation(listener, beforeNavigate) {
|
|
29
|
-
super.registerRoutingInstrumentation(listener, beforeNavigate);
|
|
28
|
+
registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute) {
|
|
29
|
+
super.registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute);
|
|
30
30
|
this._navigation
|
|
31
31
|
.events()
|
|
32
32
|
.registerCommandListener(this._onCommand.bind(this));
|
|
@@ -48,7 +48,7 @@ export class ReactNativeNavigationInstrumentation extends RoutingInstrumentation
|
|
|
48
48
|
* To be called AFTER the state has been changed to populate the transaction with the current route.
|
|
49
49
|
*/
|
|
50
50
|
_onComponentWillAppear(event) {
|
|
51
|
-
var _a;
|
|
51
|
+
var _a, _b, _c;
|
|
52
52
|
// If the route is a different key, this is so we ignore actions that pertain to the same screen.
|
|
53
53
|
if (this._latestTransaction &&
|
|
54
54
|
(!this._prevComponentEvent ||
|
|
@@ -56,8 +56,10 @@ export class ReactNativeNavigationInstrumentation extends RoutingInstrumentation
|
|
|
56
56
|
this._clearStateChangeTimeout();
|
|
57
57
|
const originalContext = this._latestTransaction.toContext();
|
|
58
58
|
const routeHasBeenSeen = this._recentComponentIds.includes(event.componentId);
|
|
59
|
-
const
|
|
60
|
-
|
|
59
|
+
const data = Object.assign(Object.assign({}, originalContext.data), { route: Object.assign(Object.assign({}, event), { name: event.componentName, hasBeenSeen: routeHasBeenSeen }), previousRoute: this._prevComponentEvent
|
|
60
|
+
? Object.assign(Object.assign({}, this._prevComponentEvent), { name: (_a = this._prevComponentEvent) === null || _a === void 0 ? void 0 : _a.componentName }) : null });
|
|
61
|
+
const updatedContext = Object.assign(Object.assign({}, originalContext), { name: event.componentName, tags: Object.assign(Object.assign({}, originalContext.tags), { "routing.route.name": event.componentName }), data });
|
|
62
|
+
let finalContext = (_b = this._beforeNavigate) === null || _b === void 0 ? void 0 : _b.call(this, updatedContext);
|
|
61
63
|
// This block is to catch users not returning a transaction context
|
|
62
64
|
if (!finalContext) {
|
|
63
65
|
logger.error(`[${ReactNativeNavigationInstrumentation.name}] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`);
|
|
@@ -67,6 +69,7 @@ export class ReactNativeNavigationInstrumentation extends RoutingInstrumentation
|
|
|
67
69
|
logger.log(`[${ReactNativeNavigationInstrumentation.name}] Will not send transaction "${finalContext.name}" due to beforeNavigate.`);
|
|
68
70
|
}
|
|
69
71
|
this._latestTransaction.updateWithContext(finalContext);
|
|
72
|
+
(_c = this._onConfirmRoute) === null || _c === void 0 ? void 0 : _c.call(this, finalContext);
|
|
70
73
|
this._prevComponentEvent = event;
|
|
71
74
|
}
|
|
72
75
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativenavigation.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnativenavigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"reactnativenavigation.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnativenavigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Transaction as TransactionType } from \"@sentry/types\";\nimport { logger } from \"@sentry/utils\";\nimport { EmitterSubscription } from \"react-native\";\n\nimport { BeforeNavigate } from \"./reactnativetracing\";\nimport {\n InternalRoutingInstrumentation,\n OnConfirmRoute,\n TransactionCreator,\n} from \"./routingInstrumentation\";\nimport { RouteChangeContextData } from \"./types\";\nimport { getBlankTransactionContext } from \"./utils\";\n\ninterface ReactNativeNavigationOptions {\n routeChangeTimeoutMs: number;\n}\n\nconst defaultOptions: ReactNativeNavigationOptions = {\n routeChangeTimeoutMs: 1000,\n};\n\ninterface ComponentEvent {\n componentId: string;\n}\n\ntype ComponentType =\n | \"Component\"\n | \"TopBarTitle\"\n | \"TopBarBackground\"\n | \"TopBarButton\";\n\nexport interface ComponentWillAppearEvent extends ComponentEvent {\n componentName: string;\n passProps?: Record<string | number | symbol, unknown>;\n componentType: ComponentType;\n}\n\nexport interface EventSubscription {\n remove(): void;\n}\n\nexport interface EventsRegistry {\n registerComponentWillAppearListener(\n callback: (event: ComponentWillAppearEvent) => void\n ): EmitterSubscription;\n registerCommandListener(\n callback: (name: string, params: unknown) => void\n ): EventSubscription;\n}\n\nexport interface NavigationDelegate {\n events: () => EventsRegistry;\n}\n\n/**\n * Instrumentation for React Native Navigation. See docs or sample app for usage.\n *\n * How this works:\n * - `_onCommand` is called every time a commands happens and sets an IdleTransaction on the scope without any route context.\n * - `_onComponentWillAppear` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.\n * - If `_onComponentWillAppear` isn't called within `options.routeChangeTimeoutMs` of the dispatch, then the transaction is not sampled and finished.\n */\nexport class ReactNativeNavigationInstrumentation extends InternalRoutingInstrumentation {\n public static instrumentationName: string = \"react-native-navigation\";\n\n private _navigation: NavigationDelegate;\n private _options: ReactNativeNavigationOptions;\n\n private _prevComponentEvent: ComponentWillAppearEvent | null = null;\n\n private _latestTransaction?: TransactionType;\n private _recentComponentIds: string[] = [];\n private _stateChangeTimeout?: number | undefined;\n\n public constructor(\n /** The react native navigation `NavigationDelegate`. This is usually the import named `Navigation`. */\n navigation: unknown,\n options: Partial<ReactNativeNavigationOptions> = {}\n ) {\n super();\n\n this._navigation = navigation as NavigationDelegate;\n\n this._options = {\n ...defaultOptions,\n ...options,\n };\n }\n\n /**\n * Registers the event listeners for React Native Navigation\n */\n public registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate,\n onConfirmRoute: OnConfirmRoute\n ): void {\n super.registerRoutingInstrumentation(\n listener,\n beforeNavigate,\n onConfirmRoute\n );\n\n this._navigation\n .events()\n .registerCommandListener(this._onCommand.bind(this));\n\n this._navigation\n .events()\n .registerComponentWillAppearListener(\n this._onComponentWillAppear.bind(this)\n );\n }\n\n /**\n * To be called when a navigation command is dispatched\n */\n private _onCommand(): void {\n if (this._latestTransaction) {\n this._discardLatestTransaction();\n }\n\n this._latestTransaction = this.onRouteWillChange(\n getBlankTransactionContext(ReactNativeNavigationInstrumentation.name)\n );\n\n this._stateChangeTimeout = setTimeout(\n this._discardLatestTransaction.bind(this),\n this._options.routeChangeTimeoutMs\n );\n }\n\n /**\n * To be called AFTER the state has been changed to populate the transaction with the current route.\n */\n private _onComponentWillAppear(event: ComponentWillAppearEvent): void {\n // If the route is a different key, this is so we ignore actions that pertain to the same screen.\n if (\n this._latestTransaction &&\n (!this._prevComponentEvent ||\n event.componentId != this._prevComponentEvent.componentId)\n ) {\n this._clearStateChangeTimeout();\n\n const originalContext = this._latestTransaction.toContext();\n const routeHasBeenSeen = this._recentComponentIds.includes(\n event.componentId\n );\n\n const data: RouteChangeContextData = {\n ...originalContext.data,\n route: {\n ...event,\n name: event.componentName,\n hasBeenSeen: routeHasBeenSeen,\n },\n previousRoute: this._prevComponentEvent\n ? {\n ...this._prevComponentEvent,\n name: this._prevComponentEvent?.componentName,\n }\n : null,\n };\n\n const updatedContext = {\n ...originalContext,\n name: event.componentName,\n tags: {\n ...originalContext.tags,\n \"routing.route.name\": event.componentName,\n },\n data,\n };\n\n let finalContext = this._beforeNavigate?.(updatedContext);\n\n // This block is to catch users not returning a transaction context\n if (!finalContext) {\n logger.error(\n `[${ReactNativeNavigationInstrumentation.name}] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`\n );\n\n finalContext = {\n ...updatedContext,\n sampled: false,\n };\n }\n\n if (finalContext.sampled === false) {\n logger.log(\n `[${ReactNativeNavigationInstrumentation.name}] Will not send transaction \"${finalContext.name}\" due to beforeNavigate.`\n );\n }\n\n this._latestTransaction.updateWithContext(finalContext);\n this._onConfirmRoute?.(finalContext);\n\n this._prevComponentEvent = event;\n } else {\n this._discardLatestTransaction();\n }\n }\n\n /** Cancels the latest transaction so it does not get sent to Sentry. */\n private _discardLatestTransaction(): void {\n if (this._latestTransaction) {\n this._latestTransaction.sampled = false;\n this._latestTransaction.finish();\n this._latestTransaction = undefined;\n }\n\n this._clearStateChangeTimeout();\n }\n\n /** Cancels the latest transaction so it does not get sent to Sentry. */\n private _clearStateChangeTimeout(): void {\n if (typeof this._stateChangeTimeout !== \"undefined\") {\n clearTimeout(this._stateChangeTimeout);\n this._stateChangeTimeout = undefined;\n }\n }\n}\n"]}
|
|
@@ -107,6 +107,10 @@ export declare class ReactNativeTracing implements Integration {
|
|
|
107
107
|
private _addAppStartData;
|
|
108
108
|
/** To be called when the route changes, but BEFORE the components of the new route mount. */
|
|
109
109
|
private _onRouteWillChange;
|
|
110
|
+
/**
|
|
111
|
+
* Creates a breadcrumb and sets the current route as a tag.
|
|
112
|
+
*/
|
|
113
|
+
private _onConfirmRoute;
|
|
110
114
|
/** Create routing idle transaction. */
|
|
111
115
|
private _createRouteTransaction;
|
|
112
116
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativetracing.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnativetracing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAIL,6BAA6B,EAE7B,WAAW,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,WAAW,EAEX,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"reactnativetracing.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnativetracing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAIL,6BAA6B,EAE7B,WAAW,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,WAAW,EAEX,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAQ/D,oBAAY,cAAc,GAAG,CAC3B,OAAO,EAAE,kBAAkB,KACxB,kBAAkB,CAAC;AAExB,MAAM,WAAW,yBACf,SAAQ,6BAA6B;IACrC;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;;;;OAMG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,8BAA8B,CAAC;IAExD;;;;;OAKG;IACH,qCAAqC,EAAE,OAAO,CAAC;IAE/C;;;;;;;OAOG;IACH,cAAc,EAAE,cAAc,CAAC;IAE/B;;;;;OAKG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,0BAA0B,EAAE,OAAO,CAAC;IAEpC;;OAEG;IACH,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAaD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,WAAW;IACpD;;OAEG;IACH,OAAc,EAAE,EAAE,MAAM,CAAwB;IAChD;;OAEG;IACI,IAAI,EAAE,MAAM,CAAyB;IAE5C,iCAAiC;IAC1B,OAAO,EAAE,yBAAyB,CAAC;IAEnC,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D,uBAAuB,EAAE,OAAO,CAAS;IAEhD,OAAO,CAAC,cAAc,CAAC,CAAY;IACnC,OAAO,CAAC,qBAAqB,CAAC,CAAyB;IACvD,OAAO,CAAC,wBAAwB,CAAC,CAAS;gBAEvB,OAAO,GAAE,OAAO,CAAC,yBAAyB,CAAM;IAOnE;;OAEG;IACI,SAAS,CAEd,uBAAuB,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,EAC3D,aAAa,EAAE,MAAM,GAAG,GACvB,IAAI;IA6DP;;OAEG;IACI,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAQzD;;OAEG;IACI,mBAAmB,CACxB,WAAW,EAAE,WAAW,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI;IAQP;;OAEG;IACI,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAInD;;;OAGG;YACW,mBAAmB;IAgCjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoCxB,6FAA6F;IAC7F,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBvB,uCAAuC;IACvC,OAAO,CAAC,uBAAuB;CAiFhC"}
|
|
@@ -48,7 +48,7 @@ export class ReactNativeTracing {
|
|
|
48
48
|
this.stallTrackingInstrumentation = new StallTrackingInstrumentation();
|
|
49
49
|
}
|
|
50
50
|
if (routingInstrumentation) {
|
|
51
|
-
routingInstrumentation.registerRoutingInstrumentation(this._onRouteWillChange.bind(this), this.options.beforeNavigate);
|
|
51
|
+
routingInstrumentation.registerRoutingInstrumentation(this._onRouteWillChange.bind(this), this.options.beforeNavigate, this._onConfirmRoute.bind(this));
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
54
|
logger.log(`[ReactNativeTracing] Not instrumenting route changes as routingInstrumentation has not been set.`);
|
|
@@ -147,9 +147,31 @@ export class ReactNativeTracing {
|
|
|
147
147
|
}
|
|
148
148
|
/** To be called when the route changes, but BEFORE the components of the new route mount. */
|
|
149
149
|
_onRouteWillChange(context) {
|
|
150
|
-
// TODO: Consider more features on route change, one example is setting a tag of what route the user is on
|
|
151
150
|
return this._createRouteTransaction(context);
|
|
152
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Creates a breadcrumb and sets the current route as a tag.
|
|
154
|
+
*/
|
|
155
|
+
_onConfirmRoute(context) {
|
|
156
|
+
var _a;
|
|
157
|
+
(_a = this._getCurrentHub) === null || _a === void 0 ? void 0 : _a.call(this).configureScope((scope) => {
|
|
158
|
+
var _a;
|
|
159
|
+
if (context.data) {
|
|
160
|
+
const contextData = context.data;
|
|
161
|
+
scope.addBreadcrumb({
|
|
162
|
+
category: "navigation",
|
|
163
|
+
type: "navigation",
|
|
164
|
+
// We assume that context.name is the name of the route.
|
|
165
|
+
message: `Navigation to ${context.name}`,
|
|
166
|
+
data: {
|
|
167
|
+
from: (_a = contextData.previousRoute) === null || _a === void 0 ? void 0 : _a.name,
|
|
168
|
+
to: contextData.route.name,
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
scope.setTag("routing.route.name", context.name);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
153
175
|
/** Create routing idle transaction. */
|
|
154
176
|
_createRouteTransaction(context) {
|
|
155
177
|
if (!this._getCurrentHub) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativetracing.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnativetracing.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport { Hub } from \"@sentry/hub\";\nimport {\n defaultRequestInstrumentationOptions,\n IdleTransaction,\n registerRequestInstrumentation,\n RequestInstrumentationOptions,\n startIdleTransaction,\n Transaction,\n} from \"@sentry/tracing\";\nimport {\n EventProcessor,\n Integration,\n Transaction as TransactionType,\n TransactionContext,\n} from \"@sentry/types\";\nimport { logger } from \"@sentry/utils\";\n\nimport { NativeAppStartResponse } from \"../definitions\";\nimport { RoutingInstrumentationInstance } from \"../tracing/routingInstrumentation\";\nimport { NATIVE } from \"../wrapper\";\nimport { NativeFramesInstrumentation } from \"./nativeframes\";\nimport { StallTrackingInstrumentation } from \"./stalltracking\";\nimport {\n adjustTransactionDuration,\n getTimeOriginMilliseconds,\n isNearToNow,\n} from \"./utils\";\n\nexport type BeforeNavigate = (\n context: TransactionContext\n) => TransactionContext;\n\nexport interface ReactNativeTracingOptions\n extends RequestInstrumentationOptions {\n /**\n * The time to wait in ms until the transaction will be finished. The transaction will use the end timestamp of\n * the last finished span as the endtime for the transaction.\n * Time is in ms.\n *\n * Default: 1000\n */\n idleTimeout: number;\n\n /**\n * The maximum duration of a transaction before it will be marked as \"deadline_exceeded\".\n * If you never want to mark a transaction set it to 0.\n * Time is in seconds.\n *\n * Default: 600\n */\n maxTransactionDuration: number;\n\n /**\n * The routing instrumentation to be used with the tracing integration.\n * There is no routing instrumentation if nothing is passed.\n */\n routingInstrumentation?: RoutingInstrumentationInstance;\n\n /**\n * Does not sample transactions that are from routes that have been seen any more and don't have any spans.\n * This removes a lot of the clutter as most back navigation transactions are now ignored.\n *\n * Default: true\n */\n ignoreEmptyBackNavigationTransactions: boolean;\n\n /**\n * beforeNavigate is called before a navigation transaction is created and allows users to modify transaction\n * context data, or drop the transaction entirely (by setting `sampled = false` in the context).\n *\n * @param context: The context data which will be passed to `startTransaction` by default\n *\n * @returns A (potentially) modified context object, with `sampled = false` if the transaction should be dropped.\n */\n beforeNavigate: BeforeNavigate;\n\n /**\n * Track the app start time by adding measurements to the first route transaction. If there is no routing instrumentation\n * an app start transaction will be started.\n *\n * Default: true\n */\n enableAppStartTracking: boolean;\n\n /**\n * Track slow/frozen frames from the native layer and adds them as measurements to all transactions.\n */\n enableNativeFramesTracking: boolean;\n\n /**\n * Track when and how long the JS event loop stalls for. Adds stalls as measurements to all transactions.\n */\n enableStallTracking: boolean;\n}\n\nconst defaultReactNativeTracingOptions: ReactNativeTracingOptions = {\n ...defaultRequestInstrumentationOptions,\n idleTimeout: 1000,\n maxTransactionDuration: 600,\n ignoreEmptyBackNavigationTransactions: true,\n beforeNavigate: (context) => context,\n enableAppStartTracking: true,\n enableNativeFramesTracking: true,\n enableStallTracking: true,\n};\n\n/**\n * Tracing integration for React Native.\n */\nexport class ReactNativeTracing implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = \"ReactNativeTracing\";\n /**\n * @inheritDoc\n */\n public name: string = ReactNativeTracing.id;\n\n /** ReactNativeTracing options */\n public options: ReactNativeTracingOptions;\n\n public nativeFramesInstrumentation?: NativeFramesInstrumentation;\n public stallTrackingInstrumentation?: StallTrackingInstrumentation;\n public useAppStartWithProfiler: boolean = false;\n\n private _getCurrentHub?: () => Hub;\n private _awaitingAppStartData?: NativeAppStartResponse;\n private _appStartFinishTimestamp?: number;\n\n public constructor(options: Partial<ReactNativeTracingOptions> = {}) {\n this.options = {\n ...defaultReactNativeTracingOptions,\n ...options,\n };\n }\n\n /**\n * Registers routing and request instrumentation.\n */\n public setupOnce(\n // @ts-ignore TODO\n addGlobalEventProcessor: (callback: EventProcessor) => void,\n getCurrentHub: () => Hub\n ): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {\n traceFetch,\n traceXHR,\n tracingOrigins,\n // @ts-ignore TODO\n shouldCreateSpanForRequest,\n routingInstrumentation,\n enableAppStartTracking,\n enableNativeFramesTracking,\n enableStallTracking,\n } = this.options;\n\n this._getCurrentHub = getCurrentHub;\n\n if (enableAppStartTracking) {\n void this._instrumentAppStart();\n }\n\n if (enableNativeFramesTracking) {\n this.nativeFramesInstrumentation = new NativeFramesInstrumentation(\n addGlobalEventProcessor,\n () => {\n const self = getCurrentHub().getIntegration(ReactNativeTracing);\n\n if (self) {\n return !!self.nativeFramesInstrumentation;\n }\n\n return false;\n }\n );\n } else {\n NATIVE.disableNativeFramesTracking();\n }\n\n if (enableStallTracking) {\n this.stallTrackingInstrumentation = new StallTrackingInstrumentation();\n }\n\n if (routingInstrumentation) {\n routingInstrumentation.registerRoutingInstrumentation(\n this._onRouteWillChange.bind(this),\n this.options.beforeNavigate\n );\n } else {\n logger.log(\n `[ReactNativeTracing] Not instrumenting route changes as routingInstrumentation has not been set.`\n );\n }\n\n registerRequestInstrumentation({\n traceFetch,\n traceXHR,\n tracingOrigins,\n shouldCreateSpanForRequest,\n });\n }\n\n /**\n * To be called on a transaction start. Can have async methods\n */\n public onTransactionStart(transaction: Transaction): void {\n if (isNearToNow(transaction.startTimestamp)) {\n // Only if this method is called at or within margin of error to the start timestamp.\n this.nativeFramesInstrumentation?.onTransactionStart(transaction);\n this.stallTrackingInstrumentation?.onTransactionStart(transaction);\n }\n }\n\n /**\n * To be called on a transaction finish. Cannot have async methods.\n */\n public onTransactionFinish(\n transaction: Transaction,\n endTimestamp?: number\n ): void {\n this.nativeFramesInstrumentation?.onTransactionFinish(transaction);\n this.stallTrackingInstrumentation?.onTransactionFinish(\n transaction,\n endTimestamp\n );\n }\n\n /**\n * Called by the ReactNativeProfiler component on first component mount.\n */\n public onAppStartFinish(endTimestamp: number): void {\n this._appStartFinishTimestamp = endTimestamp;\n }\n\n /**\n * Instruments the app start measurements on the first route transaction.\n * Starts a route transaction if there isn't routing instrumentation.\n */\n private async _instrumentAppStart(): Promise<void> {\n if (!this.options.enableAppStartTracking || !NATIVE.enableNative) {\n return;\n }\n\n const appStart = await NATIVE.fetchNativeAppStart();\n\n if (!appStart || appStart.didFetchAppStart) {\n return;\n }\n\n if (!this.useAppStartWithProfiler) {\n this._appStartFinishTimestamp = getTimeOriginMilliseconds() / 1000;\n }\n\n if (this.options.routingInstrumentation) {\n this._awaitingAppStartData = appStart;\n } else {\n const appStartTimeSeconds = appStart.appStartTime / 1000;\n\n const idleTransaction = this._createRouteTransaction({\n name: \"App Start\",\n op: \"ui.load\",\n startTimestamp: appStartTimeSeconds,\n });\n\n if (idleTransaction) {\n this._addAppStartData(idleTransaction, appStart);\n }\n }\n }\n\n /**\n * Adds app start measurements and starts a child span on a transaction.\n */\n private _addAppStartData(\n transaction: IdleTransaction,\n appStart: NativeAppStartResponse\n ): void {\n if (!this._appStartFinishTimestamp) {\n logger.warn(\"App start was never finished.\");\n return;\n }\n\n const appStartTimeSeconds = appStart.appStartTime / 1000;\n\n transaction.startChild({\n description: appStart.isColdStart ? \"Cold App Start\" : \"Warm App Start\",\n op: appStart.isColdStart ? \"app.start.cold\" : \"app.start.warm\",\n startTimestamp: appStartTimeSeconds,\n endTimestamp: this._appStartFinishTimestamp,\n });\n\n const appStartDurationMilliseconds =\n this._appStartFinishTimestamp * 1000 - appStart.appStartTime;\n\n transaction.setMeasurements(\n appStart.isColdStart\n ? {\n app_start_cold: {\n value: appStartDurationMilliseconds,\n },\n }\n : {\n app_start_warm: {\n value: appStartDurationMilliseconds,\n },\n }\n );\n }\n\n /** To be called when the route changes, but BEFORE the components of the new route mount. */\n private _onRouteWillChange(\n context: TransactionContext\n ): TransactionType | undefined {\n // TODO: Consider more features on route change, one example is setting a tag of what route the user is on\n return this._createRouteTransaction(context);\n }\n\n /** Create routing idle transaction. */\n private _createRouteTransaction(\n context: TransactionContext\n ): IdleTransaction | undefined {\n if (!this._getCurrentHub) {\n logger.warn(\n `[ReactNativeTracing] Did not create ${context.op} transaction because _getCurrentHub is invalid.`\n );\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { idleTimeout, maxTransactionDuration } = this.options;\n\n const expandedContext = {\n ...context,\n trimEnd: true,\n };\n\n const hub = this._getCurrentHub();\n const idleTransaction = startIdleTransaction(\n hub as Hub,\n expandedContext,\n idleTimeout,\n true\n );\n\n this.onTransactionStart(idleTransaction);\n\n logger.log(\n `[ReactNativeTracing] Starting ${context.op} transaction \"${context.name}\" on scope`\n );\n\n idleTransaction.registerBeforeFinishCallback(\n (transaction, endTimestamp) => {\n this.onTransactionFinish(transaction, endTimestamp);\n }\n );\n\n idleTransaction.registerBeforeFinishCallback((transaction) => {\n if (this.options.enableAppStartTracking && this._awaitingAppStartData) {\n transaction.startTimestamp =\n this._awaitingAppStartData.appStartTime / 1000;\n transaction.op = \"ui.load\";\n\n this._addAppStartData(transaction, this._awaitingAppStartData);\n\n this._awaitingAppStartData = undefined;\n }\n });\n\n idleTransaction.registerBeforeFinishCallback(\n (transaction, endTimestamp) => {\n adjustTransactionDuration(\n maxTransactionDuration,\n transaction,\n endTimestamp\n );\n }\n );\n\n if (this.options.ignoreEmptyBackNavigationTransactions) {\n idleTransaction.registerBeforeFinishCallback((transaction) => {\n if (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n transaction.data?.route?.hasBeenSeen &&\n (!transaction.spanRecorder ||\n transaction.spanRecorder.spans.filter(\n (span) => span.spanId !== transaction.spanId\n ).length === 0)\n ) {\n logger.log(\n `[ReactNativeTracing] Not sampling transaction as route has been seen before. Pass ignoreEmptyBackNavigationTransactions = false to disable this feature.`\n );\n // Route has been seen before and has no child spans.\n transaction.sampled = false;\n }\n });\n }\n\n return idleTransaction;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reactnativetracing.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnativetracing.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport { Hub } from \"@sentry/hub\";\nimport {\n defaultRequestInstrumentationOptions,\n IdleTransaction,\n registerRequestInstrumentation,\n RequestInstrumentationOptions,\n startIdleTransaction,\n Transaction,\n} from \"@sentry/tracing\";\nimport {\n EventProcessor,\n Integration,\n Transaction as TransactionType,\n TransactionContext,\n} from \"@sentry/types\";\nimport { logger } from \"@sentry/utils\";\n\nimport { NativeAppStartResponse } from \"../definitions\";\nimport { RoutingInstrumentationInstance } from \"../tracing/routingInstrumentation\";\nimport { NATIVE } from \"../wrapper\";\nimport { NativeFramesInstrumentation } from \"./nativeframes\";\nimport { StallTrackingInstrumentation } from \"./stalltracking\";\nimport { RouteChangeContextData } from \"./types\";\nimport {\n adjustTransactionDuration,\n getTimeOriginMilliseconds,\n isNearToNow,\n} from \"./utils\";\n\nexport type BeforeNavigate = (\n context: TransactionContext\n) => TransactionContext;\n\nexport interface ReactNativeTracingOptions\n extends RequestInstrumentationOptions {\n /**\n * The time to wait in ms until the transaction will be finished. The transaction will use the end timestamp of\n * the last finished span as the endtime for the transaction.\n * Time is in ms.\n *\n * Default: 1000\n */\n idleTimeout: number;\n\n /**\n * The maximum duration of a transaction before it will be marked as \"deadline_exceeded\".\n * If you never want to mark a transaction set it to 0.\n * Time is in seconds.\n *\n * Default: 600\n */\n maxTransactionDuration: number;\n\n /**\n * The routing instrumentation to be used with the tracing integration.\n * There is no routing instrumentation if nothing is passed.\n */\n routingInstrumentation?: RoutingInstrumentationInstance;\n\n /**\n * Does not sample transactions that are from routes that have been seen any more and don't have any spans.\n * This removes a lot of the clutter as most back navigation transactions are now ignored.\n *\n * Default: true\n */\n ignoreEmptyBackNavigationTransactions: boolean;\n\n /**\n * beforeNavigate is called before a navigation transaction is created and allows users to modify transaction\n * context data, or drop the transaction entirely (by setting `sampled = false` in the context).\n *\n * @param context: The context data which will be passed to `startTransaction` by default\n *\n * @returns A (potentially) modified context object, with `sampled = false` if the transaction should be dropped.\n */\n beforeNavigate: BeforeNavigate;\n\n /**\n * Track the app start time by adding measurements to the first route transaction. If there is no routing instrumentation\n * an app start transaction will be started.\n *\n * Default: true\n */\n enableAppStartTracking: boolean;\n\n /**\n * Track slow/frozen frames from the native layer and adds them as measurements to all transactions.\n */\n enableNativeFramesTracking: boolean;\n\n /**\n * Track when and how long the JS event loop stalls for. Adds stalls as measurements to all transactions.\n */\n enableStallTracking: boolean;\n}\n\nconst defaultReactNativeTracingOptions: ReactNativeTracingOptions = {\n ...defaultRequestInstrumentationOptions,\n idleTimeout: 1000,\n maxTransactionDuration: 600,\n ignoreEmptyBackNavigationTransactions: true,\n beforeNavigate: (context) => context,\n enableAppStartTracking: true,\n enableNativeFramesTracking: true,\n enableStallTracking: true,\n};\n\n/**\n * Tracing integration for React Native.\n */\nexport class ReactNativeTracing implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = \"ReactNativeTracing\";\n /**\n * @inheritDoc\n */\n public name: string = ReactNativeTracing.id;\n\n /** ReactNativeTracing options */\n public options: ReactNativeTracingOptions;\n\n public nativeFramesInstrumentation?: NativeFramesInstrumentation;\n public stallTrackingInstrumentation?: StallTrackingInstrumentation;\n public useAppStartWithProfiler: boolean = false;\n\n private _getCurrentHub?: () => Hub;\n private _awaitingAppStartData?: NativeAppStartResponse;\n private _appStartFinishTimestamp?: number;\n\n public constructor(options: Partial<ReactNativeTracingOptions> = {}) {\n this.options = {\n ...defaultReactNativeTracingOptions,\n ...options,\n };\n }\n\n /**\n * Registers routing and request instrumentation.\n */\n public setupOnce(\n // @ts-ignore TODO\n addGlobalEventProcessor: (callback: EventProcessor) => void,\n getCurrentHub: () => Hub\n ): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {\n traceFetch,\n traceXHR,\n tracingOrigins,\n // @ts-ignore TODO\n shouldCreateSpanForRequest,\n routingInstrumentation,\n enableAppStartTracking,\n enableNativeFramesTracking,\n enableStallTracking,\n } = this.options;\n\n this._getCurrentHub = getCurrentHub;\n\n if (enableAppStartTracking) {\n void this._instrumentAppStart();\n }\n\n if (enableNativeFramesTracking) {\n this.nativeFramesInstrumentation = new NativeFramesInstrumentation(\n addGlobalEventProcessor,\n () => {\n const self = getCurrentHub().getIntegration(ReactNativeTracing);\n\n if (self) {\n return !!self.nativeFramesInstrumentation;\n }\n\n return false;\n }\n );\n } else {\n NATIVE.disableNativeFramesTracking();\n }\n\n if (enableStallTracking) {\n this.stallTrackingInstrumentation = new StallTrackingInstrumentation();\n }\n\n if (routingInstrumentation) {\n routingInstrumentation.registerRoutingInstrumentation(\n this._onRouteWillChange.bind(this),\n this.options.beforeNavigate,\n this._onConfirmRoute.bind(this)\n );\n } else {\n logger.log(\n `[ReactNativeTracing] Not instrumenting route changes as routingInstrumentation has not been set.`\n );\n }\n\n registerRequestInstrumentation({\n traceFetch,\n traceXHR,\n tracingOrigins,\n shouldCreateSpanForRequest,\n });\n }\n\n /**\n * To be called on a transaction start. Can have async methods\n */\n public onTransactionStart(transaction: Transaction): void {\n if (isNearToNow(transaction.startTimestamp)) {\n // Only if this method is called at or within margin of error to the start timestamp.\n this.nativeFramesInstrumentation?.onTransactionStart(transaction);\n this.stallTrackingInstrumentation?.onTransactionStart(transaction);\n }\n }\n\n /**\n * To be called on a transaction finish. Cannot have async methods.\n */\n public onTransactionFinish(\n transaction: Transaction,\n endTimestamp?: number\n ): void {\n this.nativeFramesInstrumentation?.onTransactionFinish(transaction);\n this.stallTrackingInstrumentation?.onTransactionFinish(\n transaction,\n endTimestamp\n );\n }\n\n /**\n * Called by the ReactNativeProfiler component on first component mount.\n */\n public onAppStartFinish(endTimestamp: number): void {\n this._appStartFinishTimestamp = endTimestamp;\n }\n\n /**\n * Instruments the app start measurements on the first route transaction.\n * Starts a route transaction if there isn't routing instrumentation.\n */\n private async _instrumentAppStart(): Promise<void> {\n if (!this.options.enableAppStartTracking || !NATIVE.enableNative) {\n return;\n }\n\n const appStart = await NATIVE.fetchNativeAppStart();\n\n if (!appStart || appStart.didFetchAppStart) {\n return;\n }\n\n if (!this.useAppStartWithProfiler) {\n this._appStartFinishTimestamp = getTimeOriginMilliseconds() / 1000;\n }\n\n if (this.options.routingInstrumentation) {\n this._awaitingAppStartData = appStart;\n } else {\n const appStartTimeSeconds = appStart.appStartTime / 1000;\n\n const idleTransaction = this._createRouteTransaction({\n name: \"App Start\",\n op: \"ui.load\",\n startTimestamp: appStartTimeSeconds,\n });\n\n if (idleTransaction) {\n this._addAppStartData(idleTransaction, appStart);\n }\n }\n }\n\n /**\n * Adds app start measurements and starts a child span on a transaction.\n */\n private _addAppStartData(\n transaction: IdleTransaction,\n appStart: NativeAppStartResponse\n ): void {\n if (!this._appStartFinishTimestamp) {\n logger.warn(\"App start was never finished.\");\n return;\n }\n\n const appStartTimeSeconds = appStart.appStartTime / 1000;\n\n transaction.startChild({\n description: appStart.isColdStart ? \"Cold App Start\" : \"Warm App Start\",\n op: appStart.isColdStart ? \"app.start.cold\" : \"app.start.warm\",\n startTimestamp: appStartTimeSeconds,\n endTimestamp: this._appStartFinishTimestamp,\n });\n\n const appStartDurationMilliseconds =\n this._appStartFinishTimestamp * 1000 - appStart.appStartTime;\n\n transaction.setMeasurements(\n appStart.isColdStart\n ? {\n app_start_cold: {\n value: appStartDurationMilliseconds,\n },\n }\n : {\n app_start_warm: {\n value: appStartDurationMilliseconds,\n },\n }\n );\n }\n\n /** To be called when the route changes, but BEFORE the components of the new route mount. */\n private _onRouteWillChange(\n context: TransactionContext\n ): TransactionType | undefined {\n return this._createRouteTransaction(context);\n }\n\n /**\n * Creates a breadcrumb and sets the current route as a tag.\n */\n private _onConfirmRoute(context: TransactionContext): void {\n this._getCurrentHub?.().configureScope((scope) => {\n if (context.data) {\n const contextData = context.data as RouteChangeContextData;\n\n scope.addBreadcrumb({\n category: \"navigation\",\n type: \"navigation\",\n // We assume that context.name is the name of the route.\n message: `Navigation to ${context.name}`,\n data: {\n from: contextData.previousRoute?.name,\n to: contextData.route.name,\n },\n });\n }\n\n scope.setTag(\"routing.route.name\", context.name);\n });\n }\n\n /** Create routing idle transaction. */\n private _createRouteTransaction(\n context: TransactionContext\n ): IdleTransaction | undefined {\n if (!this._getCurrentHub) {\n logger.warn(\n `[ReactNativeTracing] Did not create ${context.op} transaction because _getCurrentHub is invalid.`\n );\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { idleTimeout, maxTransactionDuration } = this.options;\n\n const expandedContext = {\n ...context,\n trimEnd: true,\n };\n\n const hub = this._getCurrentHub();\n const idleTransaction = startIdleTransaction(\n hub as Hub,\n expandedContext,\n idleTimeout,\n true\n );\n\n this.onTransactionStart(idleTransaction);\n\n logger.log(\n `[ReactNativeTracing] Starting ${context.op} transaction \"${context.name}\" on scope`\n );\n\n idleTransaction.registerBeforeFinishCallback(\n (transaction, endTimestamp) => {\n this.onTransactionFinish(transaction, endTimestamp);\n }\n );\n\n idleTransaction.registerBeforeFinishCallback((transaction) => {\n if (this.options.enableAppStartTracking && this._awaitingAppStartData) {\n transaction.startTimestamp =\n this._awaitingAppStartData.appStartTime / 1000;\n transaction.op = \"ui.load\";\n\n this._addAppStartData(transaction, this._awaitingAppStartData);\n\n this._awaitingAppStartData = undefined;\n }\n });\n\n idleTransaction.registerBeforeFinishCallback(\n (transaction, endTimestamp) => {\n adjustTransactionDuration(\n maxTransactionDuration,\n transaction,\n endTimestamp\n );\n }\n );\n\n if (this.options.ignoreEmptyBackNavigationTransactions) {\n idleTransaction.registerBeforeFinishCallback((transaction) => {\n if (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n transaction.data?.route?.hasBeenSeen &&\n (!transaction.spanRecorder ||\n transaction.spanRecorder.spans.filter(\n (span) => span.spanId !== transaction.spanId\n ).length === 0)\n ) {\n logger.log(\n `[ReactNativeTracing] Not sampling transaction as route has been seen before. Pass ignoreEmptyBackNavigationTransactions = false to disable this feature.`\n );\n // Route has been seen before and has no child spans.\n transaction.sampled = false;\n }\n });\n }\n\n return idleTransaction;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BeforeNavigate } from "./reactnativetracing";
|
|
2
|
-
import {
|
|
2
|
+
import { InternalRoutingInstrumentation, OnConfirmRoute, TransactionCreator } from "./routingInstrumentation";
|
|
3
3
|
export interface NavigationRoute {
|
|
4
4
|
name: string;
|
|
5
5
|
key: string;
|
|
@@ -19,7 +19,7 @@ interface ReactNavigationOptions {
|
|
|
19
19
|
* - `_onStateChange` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.
|
|
20
20
|
* - If `_onStateChange` isn't called within `STATE_CHANGE_TIMEOUT_DURATION` of the dispatch, then the transaction is not sampled and finished.
|
|
21
21
|
*/
|
|
22
|
-
export declare class ReactNavigationInstrumentation extends
|
|
22
|
+
export declare class ReactNavigationInstrumentation extends InternalRoutingInstrumentation {
|
|
23
23
|
static instrumentationName: string;
|
|
24
24
|
private _navigationContainer;
|
|
25
25
|
private readonly _maxRecentRouteLen;
|
|
@@ -33,7 +33,7 @@ export declare class ReactNavigationInstrumentation extends RoutingInstrumentati
|
|
|
33
33
|
/**
|
|
34
34
|
* Extends by calling _handleInitialState at the end.
|
|
35
35
|
*/
|
|
36
|
-
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate): void;
|
|
36
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
|
37
37
|
/**
|
|
38
38
|
* Pass the ref to the navigation container to register it to the instrumentation
|
|
39
39
|
* @param navigationContainerRef Ref to a `NavigationContainer`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnavigation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"reactnavigation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAOD,UAAU,sBAAsB;IAC9B;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAMD;;;;;;;GAOG;AACH,qBAAa,8BAA+B,SAAQ,8BAA8B;IAChF,OAAc,mBAAmB,EAAE,MAAM,CAAyB;IAElE,OAAO,CAAC,oBAAoB,CAAoC;IAEhE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;IAElD,OAAO,CAAC,YAAY,CAAC,CAAkB;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAkB;IAC7C,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,mBAAmB,CAAC,CAAqB;IACjD,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,QAAQ,CAAyB;gBAEtB,OAAO,GAAE,OAAO,CAAC,sBAAsB,CAAM;IAShE;;OAEG;IACI,8BAA8B,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAC7B,IAAI;IAmBP;;;OAGG;IAEI,2BAA2B,CAAC,sBAAsB,EAAE,GAAG,GAAG,IAAI;IAoDrE;;;;OAIG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqFtB,sGAAsG;IACtG,OAAO,CAAC,mBAAmB,CAQzB;IAEF,wEAAwE;IACxE,OAAO,CAAC,yBAAyB;CAOlC;AAED;;;GAGG;AACH,eAAO,MAAM,gCAAgC,uCAAiC,CAAC;AAE/E,eAAO,MAAM,yBAAyB;;;;;;;CAQrC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getGlobalObject, logger } from "@sentry/utils";
|
|
2
|
-
import {
|
|
2
|
+
import { InternalRoutingInstrumentation, } from "./routingInstrumentation";
|
|
3
3
|
const defaultOptions = {
|
|
4
4
|
routeChangeTimeoutMs: 1000,
|
|
5
5
|
};
|
|
@@ -11,7 +11,7 @@ const defaultOptions = {
|
|
|
11
11
|
* - `_onStateChange` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.
|
|
12
12
|
* - If `_onStateChange` isn't called within `STATE_CHANGE_TIMEOUT_DURATION` of the dispatch, then the transaction is not sampled and finished.
|
|
13
13
|
*/
|
|
14
|
-
export class ReactNavigationInstrumentation extends
|
|
14
|
+
export class ReactNavigationInstrumentation extends InternalRoutingInstrumentation {
|
|
15
15
|
constructor(options = {}) {
|
|
16
16
|
super();
|
|
17
17
|
this._navigationContainer = null;
|
|
@@ -30,8 +30,8 @@ export class ReactNavigationInstrumentation extends RoutingInstrumentation {
|
|
|
30
30
|
/**
|
|
31
31
|
* Extends by calling _handleInitialState at the end.
|
|
32
32
|
*/
|
|
33
|
-
registerRoutingInstrumentation(listener, beforeNavigate) {
|
|
34
|
-
super.registerRoutingInstrumentation(listener, beforeNavigate);
|
|
33
|
+
registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute) {
|
|
34
|
+
super.registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute);
|
|
35
35
|
// We create an initial state here to ensure a transaction gets created before the first route mounts.
|
|
36
36
|
if (!this._initialStateHandled) {
|
|
37
37
|
this._onDispatch();
|
|
@@ -100,7 +100,7 @@ export class ReactNavigationInstrumentation extends RoutingInstrumentation {
|
|
|
100
100
|
* To be called AFTER the state has been changed to populate the transaction with the current route.
|
|
101
101
|
*/
|
|
102
102
|
_onStateChange() {
|
|
103
|
-
var _a, _b, _c;
|
|
103
|
+
var _a, _b, _c, _d;
|
|
104
104
|
// Use the getCurrentRoute method to be accurate.
|
|
105
105
|
const previousRoute = this._latestRoute;
|
|
106
106
|
if (!this._navigationContainer) {
|
|
@@ -113,18 +113,19 @@ export class ReactNavigationInstrumentation extends RoutingInstrumentation {
|
|
|
113
113
|
(!previousRoute || previousRoute.key !== route.key)) {
|
|
114
114
|
const originalContext = this._latestTransaction.toContext();
|
|
115
115
|
const routeHasBeenSeen = this._recentRouteKeys.includes(route.key);
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
116
|
+
const data = Object.assign(Object.assign({}, originalContext.data), { route: {
|
|
117
|
+
name: route.name,
|
|
118
|
+
key: route.key,
|
|
119
|
+
params: (_a = route.params) !== null && _a !== void 0 ? _a : {},
|
|
120
|
+
hasBeenSeen: routeHasBeenSeen,
|
|
121
|
+
}, previousRoute: previousRoute
|
|
122
|
+
? {
|
|
123
|
+
name: previousRoute.name,
|
|
124
|
+
key: previousRoute.key,
|
|
125
|
+
params: (_b = previousRoute.params) !== null && _b !== void 0 ? _b : {},
|
|
126
|
+
}
|
|
127
|
+
: null });
|
|
128
|
+
const updatedContext = Object.assign(Object.assign({}, originalContext), { name: route.name, tags: Object.assign(Object.assign({}, originalContext.tags), { "routing.route.name": route.name }), data });
|
|
128
129
|
let finalContext = (_c = this._beforeNavigate) === null || _c === void 0 ? void 0 : _c.call(this, updatedContext);
|
|
129
130
|
// This block is to catch users not returning a transaction context
|
|
130
131
|
if (!finalContext) {
|
|
@@ -143,6 +144,7 @@ export class ReactNavigationInstrumentation extends RoutingInstrumentation {
|
|
|
143
144
|
}
|
|
144
145
|
}
|
|
145
146
|
this._latestTransaction.updateWithContext(finalContext);
|
|
147
|
+
(_d = this._onConfirmRoute) === null || _d === void 0 ? void 0 : _d.call(this, finalContext);
|
|
146
148
|
}
|
|
147
149
|
this._pushRecentRouteKey(route.key);
|
|
148
150
|
this._latestRoute = route;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnavigation.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EACL,sBAAsB,GAEvB,MAAM,0BAA0B,CAAC;AAsBlC,MAAM,cAAc,GAA2B;IAC7C,oBAAoB,EAAE,IAAI;CAC3B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,OAAO,8BAA+B,SAAQ,sBAAsB;IAexE,YAAmB,UAA2C,EAAE;QAC9D,KAAK,EAAE,CAAC;QAbF,yBAAoB,GAA+B,IAAI,CAAC;QAE/C,uBAAkB,GAAW,GAAG,CAAC;QAI1C,yBAAoB,GAAY,KAAK,CAAC;QAEtC,qBAAgB,GAAa,EAAE,CAAC;QA8LxC,sGAAsG;QAC9F,wBAAmB,GAAG,CAAC,GAAW,EAAQ,EAAE;YAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;gBAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CACjD,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CACvD,CAAC;aACH;QACH,CAAC,CAAC;QAhMA,IAAI,CAAC,QAAQ,mCACR,cAAc,GACd,OAAO,CACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,8BAA8B,CACnC,QAA4B,EAC5B,cAA8B;QAE9B,KAAK,CAAC,8BAA8B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE/D,sGAAsG;QACtG,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAC7B,0EAA0E;gBAC1E,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;aAClC;SACF;IACH,CAAC;IAED;;;OAGG;IACH,iHAAiH;IAC1G,2BAA2B,CAAC,sBAA2B;QAC5D,MAAM,OAAO,GAAG,eAAe,EAA2C,CAAC;QAE3E;;;;WAIG;QACH,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACtC,IAAI,SAAS,IAAI,sBAAsB,EAAE;gBACvC,sEAAsE;gBACtE,IAAI,CAAC,oBAAoB,GAAG,sBAAsB,CAAC,OAAO,CAAC;aAC5D;iBAAM;gBACL,IAAI,CAAC,oBAAoB,GAAG,sBAAsB,CAAC;aACpD;YAED,IAAI,IAAI,CAAC,oBAAoB,EAAE;gBAC7B,IAAI,CAAC,oBAAoB,CAAC,WAAW,CACnC,mBAAmB,EAAE,2CAA2C;gBAChE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5B,CAAC;gBACF,IAAI,CAAC,oBAAoB,CAAC,WAAW,CACnC,OAAO,EAAE,+CAA+C;gBACxD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B,CAAC;gBAEF,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBAC9B,IAAI,IAAI,CAAC,kBAAkB,EAAE;wBAC3B,yFAAyF;wBACzF,IAAI,CAAC,cAAc,EAAE,CAAC;wBAEtB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;qBAClC;yBAAM;wBACL,MAAM,CAAC,GAAG,CACR,6GAA6G,CAC9G,CAAC;qBACH;iBACF;gBAED,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;aAC1C;iBAAM;gBACL,MAAM,CAAC,IAAI,CACT,+EAA+E,CAChF,CAAC;aACH;SACF;aAAM;YACL,MAAM,CAAC,GAAG,CACR,uHAAuH,CACxH,CAAC;SACH;IACH,CAAC;IAED;;;;OAIG;IACK,WAAW;QACjB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;QAE5E,IAAI,CAAC,mBAAmB,GAAG,UAAU,CACnC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EACzC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CACnC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc;;QACpB,iDAAiD;QACjD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,MAAM,CAAC,IAAI,CACT,2GAA2G,CAC5G,CAAC;YAEF,OAAO;SACR;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;QAE1D,IAAI,KAAK,EAAE;YACT,IACE,IAAI,CAAC,kBAAkB;gBACvB,CAAC,CAAC,aAAa,IAAI,aAAa,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,EACnD;gBACA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAsC,CAAC;gBAChG,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAEnE,MAAM,cAAc,mCACf,eAAe,KAClB,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,IAAI,kCACC,eAAe,CAAC,IAAI,KACvB,oBAAoB,EAAE,KAAK,CAAC,IAAI,KAElC,IAAI,kCACC,eAAe,CAAC,IAAI,KACvB,KAAK,EAAE;4BACL,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,GAAG,EAAE,KAAK,CAAC,GAAG;4BACd,MAAM,QAAE,KAAK,CAAC,MAAM,mCAAI,EAAE;4BAC1B,WAAW,EAAE,gBAAgB;yBAC9B,EACD,aAAa,EAAE,aAAa;4BAC1B,CAAC,CAAC;gCACE,IAAI,EAAE,aAAa,CAAC,IAAI;gCACxB,GAAG,EAAE,aAAa,CAAC,GAAG;gCACtB,MAAM,QAAE,aAAa,CAAC,MAAM,mCAAI,EAAE;6BACnC;4BACH,CAAC,CAAC,IAAI,MAEX,CAAC;gBAEF,IAAI,YAAY,SAAG,IAAI,CAAC,eAAe,+CAApB,IAAI,EAAmB,cAAc,CAAC,CAAC;gBAE1D,mEAAmE;gBACnE,IAAI,CAAC,YAAY,EAAE;oBACjB,MAAM,CAAC,KAAK,CACV,8DAA8D,YAAY,2DAA2D,CACtI,CAAC;oBAEF,YAAY,mCACP,cAAc,KACjB,OAAO,EAAE,KAAK,GACf,CAAC;iBACH;gBAED,8GAA8G;gBAC9G,IAAI,YAAY,CAAC,OAAO,KAAK,KAAK,EAAE;oBAClC,MAAM,CAAC,GAAG,CACR,iEAAiE,YAAY,CAAC,IAAI,0BAA0B,CAC7G,CAAC;iBACH;qBAAM;oBACL,+DAA+D;oBAC/D,IAAI,OAAO,IAAI,CAAC,mBAAmB,KAAK,WAAW,EAAE;wBACnD,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;wBACvC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;qBACtC;iBACF;gBAED,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;aACzD;YAED,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;IACH,CAAC;IAaD,wEAAwE;IAChE,yBAAyB;QAC/B,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;YACxC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;SACrC;IACH,CAAC;;AA1Na,kDAAmB,GAAW,qBAAqB,CAAC;AA6NpE;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,8BAA8B,CAAC;AAE/E,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,IAAI,EAAE,cAAc;IACpB,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE;QACJ,yBAAyB,EACvB,8BAA8B,CAAC,mBAAmB;KACrD;IACD,IAAI,EAAE,EAAE;CACT,CAAC","sourcesContent":["import { Transaction as TransactionType } from \"@sentry/types\";\nimport { getGlobalObject, logger } from \"@sentry/utils\";\n\nimport { BeforeNavigate } from \"./reactnativetracing\";\nimport {\n RoutingInstrumentation,\n TransactionCreator,\n} from \"./routingInstrumentation\";\nimport { ReactNavigationTransactionContext } from \"./types\";\n\nexport interface NavigationRoute {\n name: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>;\n}\n\ninterface NavigationContainer {\n addListener: (type: string, listener: () => void) => void;\n getCurrentRoute: () => NavigationRoute;\n}\n\ninterface ReactNavigationOptions {\n /**\n * The time the transaction will wait for route to mount before it is discarded.\n */\n routeChangeTimeoutMs: number;\n}\n\nconst defaultOptions: ReactNavigationOptions = {\n routeChangeTimeoutMs: 1000,\n};\n\n/**\n * Instrumentation for React-Navigation V5. See docs or sample app for usage.\n *\n * How this works:\n * - `_onDispatch` is called every time a dispatch happens and sets an IdleTransaction on the scope without any route context.\n * - `_onStateChange` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.\n * - If `_onStateChange` isn't called within `STATE_CHANGE_TIMEOUT_DURATION` of the dispatch, then the transaction is not sampled and finished.\n */\nexport class ReactNavigationInstrumentation extends RoutingInstrumentation {\n public static instrumentationName: string = \"react-navigation-v5\";\n\n private _navigationContainer: NavigationContainer | null = null;\n\n private readonly _maxRecentRouteLen: number = 200;\n\n private _latestRoute?: NavigationRoute;\n private _latestTransaction?: TransactionType;\n private _initialStateHandled: boolean = false;\n private _stateChangeTimeout?: number | undefined;\n private _recentRouteKeys: string[] = [];\n\n private _options: ReactNavigationOptions;\n\n public constructor(options: Partial<ReactNavigationOptions> = {}) {\n super();\n\n this._options = {\n ...defaultOptions,\n ...options,\n };\n }\n\n /**\n * Extends by calling _handleInitialState at the end.\n */\n public registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate\n ): void {\n super.registerRoutingInstrumentation(listener, beforeNavigate);\n\n // We create an initial state here to ensure a transaction gets created before the first route mounts.\n if (!this._initialStateHandled) {\n this._onDispatch();\n if (this._navigationContainer) {\n // Navigation container already registered, just populate with route state\n this._onStateChange();\n\n this._initialStateHandled = true;\n }\n }\n }\n\n /**\n * Pass the ref to the navigation container to register it to the instrumentation\n * @param navigationContainerRef Ref to a `NavigationContainer`\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public registerNavigationContainer(navigationContainerRef: any): void {\n const _global = getGlobalObject<{ __sentry_rn_v5_registered?: boolean }>();\n\n /* We prevent duplicate routing instrumentation to be initialized on fast refreshes\n\n Explanation: If the user triggers a fast refresh on the file that the instrumentation is\n initialized in, it will initialize a new instance and will cause undefined behavior.\n */\n if (!_global.__sentry_rn_v5_registered) {\n if (\"current\" in navigationContainerRef) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this._navigationContainer = navigationContainerRef.current;\n } else {\n this._navigationContainer = navigationContainerRef;\n }\n\n if (this._navigationContainer) {\n this._navigationContainer.addListener(\n \"__unsafe_action__\", // This action is emitted on every dispatch\n this._onDispatch.bind(this)\n );\n this._navigationContainer.addListener(\n \"state\", // This action is emitted on every state change\n this._onStateChange.bind(this)\n );\n\n if (!this._initialStateHandled) {\n if (this._latestTransaction) {\n // If registerRoutingInstrumentation was called first _onDispatch has already been called\n this._onStateChange();\n\n this._initialStateHandled = true;\n } else {\n logger.log(\n \"[ReactNavigationV5Instrumentation] Navigation container registered, but integration has not been setup yet.\"\n );\n }\n }\n\n _global.__sentry_rn_v5_registered = true;\n } else {\n logger.warn(\n \"[ReactNavigationV5Instrumentation] Received invalid navigation container ref!\"\n );\n }\n } else {\n logger.log(\n \"[ReactNavigationV5Instrumentation] Instrumentation already exists, but register has been called again, doing nothing.\"\n );\n }\n }\n\n /**\n * To be called on every React-Navigation action dispatch.\n * It does not name the transaction or populate it with route information. Instead, it waits for the state to fully change\n * and gets the route information from there, @see _onStateChange\n */\n private _onDispatch(): void {\n this._latestTransaction = this.onRouteWillChange(BLANK_TRANSACTION_CONTEXT);\n\n this._stateChangeTimeout = setTimeout(\n this._discardLatestTransaction.bind(this),\n this._options.routeChangeTimeoutMs\n );\n }\n\n /**\n * To be called AFTER the state has been changed to populate the transaction with the current route.\n */\n private _onStateChange(): void {\n // Use the getCurrentRoute method to be accurate.\n const previousRoute = this._latestRoute;\n\n if (!this._navigationContainer) {\n logger.warn(\n \"[ReactNavigationV5Instrumentation] Missing navigation container ref. Route transactions will not be sent.\"\n );\n\n return;\n }\n\n const route = this._navigationContainer.getCurrentRoute();\n\n if (route) {\n if (\n this._latestTransaction &&\n (!previousRoute || previousRoute.key !== route.key)\n ) {\n const originalContext = this._latestTransaction.toContext() as typeof BLANK_TRANSACTION_CONTEXT;\n const routeHasBeenSeen = this._recentRouteKeys.includes(route.key);\n\n const updatedContext: ReactNavigationTransactionContext = {\n ...originalContext,\n name: route.name,\n tags: {\n ...originalContext.tags,\n \"routing.route.name\": route.name,\n },\n data: {\n ...originalContext.data,\n route: {\n name: route.name,\n key: route.key,\n params: route.params ?? {},\n hasBeenSeen: routeHasBeenSeen,\n },\n previousRoute: previousRoute\n ? {\n name: previousRoute.name,\n key: previousRoute.key,\n params: previousRoute.params ?? {},\n }\n : null,\n },\n };\n\n let finalContext = this._beforeNavigate?.(updatedContext);\n\n // This block is to catch users not returning a transaction context\n if (!finalContext) {\n logger.error(\n `[ReactNavigationV5Instrumentation] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`\n );\n\n finalContext = {\n ...updatedContext,\n sampled: false,\n };\n }\n\n // Note: finalContext.sampled will be false at this point only if the user sets it to be so in beforeNavigate.\n if (finalContext.sampled === false) {\n logger.log(\n `[ReactNavigationV5Instrumentation] Will not send transaction \"${finalContext.name}\" due to beforeNavigate.`\n );\n } else {\n // Clear the timeout so the transaction does not get cancelled.\n if (typeof this._stateChangeTimeout !== \"undefined\") {\n clearTimeout(this._stateChangeTimeout);\n this._stateChangeTimeout = undefined;\n }\n }\n\n this._latestTransaction.updateWithContext(finalContext);\n }\n\n this._pushRecentRouteKey(route.key);\n this._latestRoute = route;\n }\n }\n\n /** Pushes a recent route key, and removes earlier routes when there is greater than the max length */\n private _pushRecentRouteKey = (key: string): void => {\n this._recentRouteKeys.push(key);\n\n if (this._recentRouteKeys.length > this._maxRecentRouteLen) {\n this._recentRouteKeys = this._recentRouteKeys.slice(\n this._recentRouteKeys.length - this._maxRecentRouteLen\n );\n }\n };\n\n /** Cancels the latest transaction so it does not get sent to Sentry. */\n private _discardLatestTransaction(): void {\n if (this._latestTransaction) {\n this._latestTransaction.sampled = false;\n this._latestTransaction.finish();\n this._latestTransaction = undefined;\n }\n }\n}\n\n/**\n * Backwards compatibility alias for ReactNavigationInstrumentation\n * @deprecated Use ReactNavigationInstrumentation\n */\nexport const ReactNavigationV5Instrumentation = ReactNavigationInstrumentation;\n\nexport const BLANK_TRANSACTION_CONTEXT = {\n name: \"Route Change\",\n op: \"navigation\",\n tags: {\n \"routing.instrumentation\":\n ReactNavigationInstrumentation.instrumentationName,\n },\n data: {},\n};\n"]}
|
|
1
|
+
{"version":3,"file":"reactnavigation.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Transaction as TransactionType } from \"@sentry/types\";\nimport { getGlobalObject, logger } from \"@sentry/utils\";\n\nimport { BeforeNavigate } from \"./reactnativetracing\";\nimport {\n InternalRoutingInstrumentation,\n OnConfirmRoute,\n TransactionCreator,\n} from \"./routingInstrumentation\";\nimport {\n ReactNavigationTransactionContext,\n RouteChangeContextData,\n} from \"./types\";\n\nexport interface NavigationRoute {\n name: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>;\n}\n\ninterface NavigationContainer {\n addListener: (type: string, listener: () => void) => void;\n getCurrentRoute: () => NavigationRoute;\n}\n\ninterface ReactNavigationOptions {\n /**\n * The time the transaction will wait for route to mount before it is discarded.\n */\n routeChangeTimeoutMs: number;\n}\n\nconst defaultOptions: ReactNavigationOptions = {\n routeChangeTimeoutMs: 1000,\n};\n\n/**\n * Instrumentation for React-Navigation V5. See docs or sample app for usage.\n *\n * How this works:\n * - `_onDispatch` is called every time a dispatch happens and sets an IdleTransaction on the scope without any route context.\n * - `_onStateChange` is then called AFTER the state change happens due to a dispatch and sets the route context onto the active transaction.\n * - If `_onStateChange` isn't called within `STATE_CHANGE_TIMEOUT_DURATION` of the dispatch, then the transaction is not sampled and finished.\n */\nexport class ReactNavigationInstrumentation extends InternalRoutingInstrumentation {\n public static instrumentationName: string = \"react-navigation-v5\";\n\n private _navigationContainer: NavigationContainer | null = null;\n\n private readonly _maxRecentRouteLen: number = 200;\n\n private _latestRoute?: NavigationRoute;\n private _latestTransaction?: TransactionType;\n private _initialStateHandled: boolean = false;\n private _stateChangeTimeout?: number | undefined;\n private _recentRouteKeys: string[] = [];\n\n private _options: ReactNavigationOptions;\n\n public constructor(options: Partial<ReactNavigationOptions> = {}) {\n super();\n\n this._options = {\n ...defaultOptions,\n ...options,\n };\n }\n\n /**\n * Extends by calling _handleInitialState at the end.\n */\n public registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate,\n onConfirmRoute: OnConfirmRoute\n ): void {\n super.registerRoutingInstrumentation(\n listener,\n beforeNavigate,\n onConfirmRoute\n );\n\n // We create an initial state here to ensure a transaction gets created before the first route mounts.\n if (!this._initialStateHandled) {\n this._onDispatch();\n if (this._navigationContainer) {\n // Navigation container already registered, just populate with route state\n this._onStateChange();\n\n this._initialStateHandled = true;\n }\n }\n }\n\n /**\n * Pass the ref to the navigation container to register it to the instrumentation\n * @param navigationContainerRef Ref to a `NavigationContainer`\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public registerNavigationContainer(navigationContainerRef: any): void {\n const _global = getGlobalObject<{ __sentry_rn_v5_registered?: boolean }>();\n\n /* We prevent duplicate routing instrumentation to be initialized on fast refreshes\n\n Explanation: If the user triggers a fast refresh on the file that the instrumentation is\n initialized in, it will initialize a new instance and will cause undefined behavior.\n */\n if (!_global.__sentry_rn_v5_registered) {\n if (\"current\" in navigationContainerRef) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this._navigationContainer = navigationContainerRef.current;\n } else {\n this._navigationContainer = navigationContainerRef;\n }\n\n if (this._navigationContainer) {\n this._navigationContainer.addListener(\n \"__unsafe_action__\", // This action is emitted on every dispatch\n this._onDispatch.bind(this)\n );\n this._navigationContainer.addListener(\n \"state\", // This action is emitted on every state change\n this._onStateChange.bind(this)\n );\n\n if (!this._initialStateHandled) {\n if (this._latestTransaction) {\n // If registerRoutingInstrumentation was called first _onDispatch has already been called\n this._onStateChange();\n\n this._initialStateHandled = true;\n } else {\n logger.log(\n \"[ReactNavigationV5Instrumentation] Navigation container registered, but integration has not been setup yet.\"\n );\n }\n }\n\n _global.__sentry_rn_v5_registered = true;\n } else {\n logger.warn(\n \"[ReactNavigationV5Instrumentation] Received invalid navigation container ref!\"\n );\n }\n } else {\n logger.log(\n \"[ReactNavigationV5Instrumentation] Instrumentation already exists, but register has been called again, doing nothing.\"\n );\n }\n }\n\n /**\n * To be called on every React-Navigation action dispatch.\n * It does not name the transaction or populate it with route information. Instead, it waits for the state to fully change\n * and gets the route information from there, @see _onStateChange\n */\n private _onDispatch(): void {\n this._latestTransaction = this.onRouteWillChange(BLANK_TRANSACTION_CONTEXT);\n\n this._stateChangeTimeout = setTimeout(\n this._discardLatestTransaction.bind(this),\n this._options.routeChangeTimeoutMs\n );\n }\n\n /**\n * To be called AFTER the state has been changed to populate the transaction with the current route.\n */\n private _onStateChange(): void {\n // Use the getCurrentRoute method to be accurate.\n const previousRoute = this._latestRoute;\n\n if (!this._navigationContainer) {\n logger.warn(\n \"[ReactNavigationV5Instrumentation] Missing navigation container ref. Route transactions will not be sent.\"\n );\n\n return;\n }\n\n const route = this._navigationContainer.getCurrentRoute();\n\n if (route) {\n if (\n this._latestTransaction &&\n (!previousRoute || previousRoute.key !== route.key)\n ) {\n const originalContext = this._latestTransaction.toContext() as typeof BLANK_TRANSACTION_CONTEXT;\n const routeHasBeenSeen = this._recentRouteKeys.includes(route.key);\n\n const data: RouteChangeContextData = {\n ...originalContext.data,\n route: {\n name: route.name,\n key: route.key,\n params: route.params ?? {},\n hasBeenSeen: routeHasBeenSeen,\n },\n previousRoute: previousRoute\n ? {\n name: previousRoute.name,\n key: previousRoute.key,\n params: previousRoute.params ?? {},\n }\n : null,\n };\n\n const updatedContext: ReactNavigationTransactionContext = {\n ...originalContext,\n name: route.name,\n tags: {\n ...originalContext.tags,\n \"routing.route.name\": route.name,\n },\n data,\n };\n\n let finalContext = this._beforeNavigate?.(updatedContext);\n\n // This block is to catch users not returning a transaction context\n if (!finalContext) {\n logger.error(\n `[ReactNavigationV5Instrumentation] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`\n );\n\n finalContext = {\n ...updatedContext,\n sampled: false,\n };\n }\n\n // Note: finalContext.sampled will be false at this point only if the user sets it to be so in beforeNavigate.\n if (finalContext.sampled === false) {\n logger.log(\n `[ReactNavigationV5Instrumentation] Will not send transaction \"${finalContext.name}\" due to beforeNavigate.`\n );\n } else {\n // Clear the timeout so the transaction does not get cancelled.\n if (typeof this._stateChangeTimeout !== \"undefined\") {\n clearTimeout(this._stateChangeTimeout);\n this._stateChangeTimeout = undefined;\n }\n }\n\n this._latestTransaction.updateWithContext(finalContext);\n this._onConfirmRoute?.(finalContext);\n }\n\n this._pushRecentRouteKey(route.key);\n this._latestRoute = route;\n }\n }\n\n /** Pushes a recent route key, and removes earlier routes when there is greater than the max length */\n private _pushRecentRouteKey = (key: string): void => {\n this._recentRouteKeys.push(key);\n\n if (this._recentRouteKeys.length > this._maxRecentRouteLen) {\n this._recentRouteKeys = this._recentRouteKeys.slice(\n this._recentRouteKeys.length - this._maxRecentRouteLen\n );\n }\n };\n\n /** Cancels the latest transaction so it does not get sent to Sentry. */\n private _discardLatestTransaction(): void {\n if (this._latestTransaction) {\n this._latestTransaction.sampled = false;\n this._latestTransaction.finish();\n this._latestTransaction = undefined;\n }\n }\n}\n\n/**\n * Backwards compatibility alias for ReactNavigationInstrumentation\n * @deprecated Use ReactNavigationInstrumentation\n */\nexport const ReactNavigationV5Instrumentation = ReactNavigationInstrumentation;\n\nexport const BLANK_TRANSACTION_CONTEXT = {\n name: \"Route Change\",\n op: \"navigation\",\n tags: {\n \"routing.instrumentation\":\n ReactNavigationInstrumentation.instrumentationName,\n },\n data: {},\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BeforeNavigate } from "./reactnativetracing";
|
|
2
|
-
import {
|
|
2
|
+
import { InternalRoutingInstrumentation, OnConfirmRoute, TransactionCreator } from "./routingInstrumentation";
|
|
3
3
|
export interface NavigationRouteV4 {
|
|
4
4
|
routeName: string;
|
|
5
5
|
key: string;
|
|
@@ -30,7 +30,7 @@ interface ReactNavigationV4Options {
|
|
|
30
30
|
* Instrumentation for React-Navigation V4.
|
|
31
31
|
* Register the app container with `registerAppContainer` to use, or see docs for more details.
|
|
32
32
|
*/
|
|
33
|
-
declare class ReactNavigationV4Instrumentation extends
|
|
33
|
+
declare class ReactNavigationV4Instrumentation extends InternalRoutingInstrumentation {
|
|
34
34
|
static instrumentationName: string;
|
|
35
35
|
private _appContainer;
|
|
36
36
|
private readonly _maxRecentRouteLen;
|
|
@@ -44,7 +44,7 @@ declare class ReactNavigationV4Instrumentation extends RoutingInstrumentation {
|
|
|
44
44
|
/**
|
|
45
45
|
* Extends by calling _handleInitialState at the end.
|
|
46
46
|
*/
|
|
47
|
-
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate): void;
|
|
47
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
|
48
48
|
/**
|
|
49
49
|
* Pass the ref to the app container to register it to the instrumentation
|
|
50
50
|
* @param appContainerRef Ref to an `AppContainer`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnavigationv4.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigationv4.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"reactnavigationv4.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigationv4.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE;QACX,KAAK,EAAE,iBAAiB,CAAC;QACzB,MAAM,EAAE;YACN,iBAAiB,EAAE,CAEjB,MAAM,EAAE,GAAG,EACX,KAAK,EAAE,iBAAiB,KACrB,iBAAiB,CAAC;SACxB,CAAC;KACH,CAAC;CACH;AAED,UAAU,wBAAwB;IAChC;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAMD;;;GAGG;AACH,cAAM,gCAAiC,SAAQ,8BAA8B;IAC3E,OAAc,mBAAmB,EAAE,MAAM,CAAyB;IAElE,OAAO,CAAC,aAAa,CAAqC;IAE1D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAe;IAElD,OAAO,CAAC,UAAU,CAAC,CAAoB;IACvC,OAAO,CAAC,gBAAgB,CAAgB;IAExC,OAAO,CAAC,kBAAkB,CAAC,CAAc;IACzC,OAAO,CAAC,oBAAoB,CAAkB;IAC9C,OAAO,CAAC,mBAAmB,CAAC,CAAqB;IAEjD,OAAO,CAAC,QAAQ,CAA2B;gBAExB,OAAO,GAAE,OAAO,CAAC,wBAAwB,CAAM;IASlE;;OAEG;IACI,8BAA8B,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAC7B,IAAI;IAyBP;;;OAGG;IAEI,oBAAoB,CAAC,eAAe,EAAE,GAAG,GAAG,IAAI;IAuCvD;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAchC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqDtB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgC9B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiBjC,sGAAsG;IACtG,OAAO,CAAC,mBAAmB,CAQzB;IAEF,6EAA6E;IAC7E,OAAO,CAAC,2BAA2B,CAIjC;IAEF,wEAAwE;IACxE,OAAO,CAAC,yBAAyB;CAOlC;AAED,QAAA,MAAM,8BAA8B;;;;;;;CAQnC,CAAC;AAEF,OAAO,EAAE,gCAAgC,EAAE,8BAA8B,EAAE,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getGlobalObject, logger } from "@sentry/utils";
|
|
2
|
-
import {
|
|
2
|
+
import { InternalRoutingInstrumentation, } from "./routingInstrumentation";
|
|
3
3
|
const defaultOptions = {
|
|
4
4
|
routeChangeTimeoutMs: 1000,
|
|
5
5
|
};
|
|
@@ -7,7 +7,7 @@ const defaultOptions = {
|
|
|
7
7
|
* Instrumentation for React-Navigation V4.
|
|
8
8
|
* Register the app container with `registerAppContainer` to use, or see docs for more details.
|
|
9
9
|
*/
|
|
10
|
-
class ReactNavigationV4Instrumentation extends
|
|
10
|
+
class ReactNavigationV4Instrumentation extends InternalRoutingInstrumentation {
|
|
11
11
|
constructor(options = {}) {
|
|
12
12
|
super();
|
|
13
13
|
this._appContainer = null;
|
|
@@ -30,8 +30,8 @@ class ReactNavigationV4Instrumentation extends RoutingInstrumentation {
|
|
|
30
30
|
/**
|
|
31
31
|
* Extends by calling _handleInitialState at the end.
|
|
32
32
|
*/
|
|
33
|
-
registerRoutingInstrumentation(listener, beforeNavigate) {
|
|
34
|
-
super.registerRoutingInstrumentation(listener, beforeNavigate);
|
|
33
|
+
registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute) {
|
|
34
|
+
super.registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute);
|
|
35
35
|
// Need to handle the initial state as the router patch will only attach transactions on subsequent route changes.
|
|
36
36
|
if (!this._initialStateHandled) {
|
|
37
37
|
this._latestTransaction = this.onRouteWillChange(INITIAL_TRANSACTION_CONTEXT_V4);
|
|
@@ -115,7 +115,7 @@ class ReactNavigationV4Instrumentation extends RoutingInstrumentation {
|
|
|
115
115
|
* To be called on navigation state changes and creates the transaction.
|
|
116
116
|
*/
|
|
117
117
|
_onStateChange(state, updateLatestTransaction = false) {
|
|
118
|
-
var _a;
|
|
118
|
+
var _a, _b;
|
|
119
119
|
const currentRoute = this._getCurrentRouteFromState(state);
|
|
120
120
|
// If the route is a different key, this is so we ignore actions that pertain to the same screen.
|
|
121
121
|
if (!this._prevRoute || currentRoute.key !== this._prevRoute.key) {
|
|
@@ -140,6 +140,7 @@ class ReactNavigationV4Instrumentation extends RoutingInstrumentation {
|
|
|
140
140
|
else {
|
|
141
141
|
this._latestTransaction = this.onRouteWillChange(finalContext);
|
|
142
142
|
}
|
|
143
|
+
(_b = this._onConfirmRoute) === null || _b === void 0 ? void 0 : _b.call(this, finalContext);
|
|
143
144
|
this._pushRecentRouteKey(currentRoute.key);
|
|
144
145
|
this._prevRoute = currentRoute;
|
|
145
146
|
}
|
|
@@ -149,6 +150,21 @@ class ReactNavigationV4Instrumentation extends RoutingInstrumentation {
|
|
|
149
150
|
*/
|
|
150
151
|
_getTransactionContext(route, previousRoute) {
|
|
151
152
|
var _a, _b;
|
|
153
|
+
const data = {
|
|
154
|
+
route: {
|
|
155
|
+
name: route.routeName,
|
|
156
|
+
key: route.key,
|
|
157
|
+
params: (_a = route.params) !== null && _a !== void 0 ? _a : {},
|
|
158
|
+
hasBeenSeen: this._recentRouteKeys.includes(route.key),
|
|
159
|
+
},
|
|
160
|
+
previousRoute: previousRoute
|
|
161
|
+
? {
|
|
162
|
+
name: previousRoute.routeName,
|
|
163
|
+
key: previousRoute.key,
|
|
164
|
+
params: (_b = previousRoute.params) !== null && _b !== void 0 ? _b : {},
|
|
165
|
+
}
|
|
166
|
+
: null,
|
|
167
|
+
};
|
|
152
168
|
return {
|
|
153
169
|
name: route.routeName,
|
|
154
170
|
op: "navigation",
|
|
@@ -156,21 +172,7 @@ class ReactNavigationV4Instrumentation extends RoutingInstrumentation {
|
|
|
156
172
|
"routing.instrumentation": ReactNavigationV4Instrumentation.instrumentationName,
|
|
157
173
|
"routing.route.name": route.routeName,
|
|
158
174
|
},
|
|
159
|
-
data
|
|
160
|
-
route: {
|
|
161
|
-
name: route.routeName,
|
|
162
|
-
key: route.key,
|
|
163
|
-
params: (_a = route.params) !== null && _a !== void 0 ? _a : {},
|
|
164
|
-
hasBeenSeen: this._recentRouteKeys.includes(route.key),
|
|
165
|
-
},
|
|
166
|
-
previousRoute: previousRoute
|
|
167
|
-
? {
|
|
168
|
-
name: previousRoute.routeName,
|
|
169
|
-
key: previousRoute.key,
|
|
170
|
-
params: (_b = previousRoute.params) !== null && _b !== void 0 ? _b : {},
|
|
171
|
-
}
|
|
172
|
-
: null,
|
|
173
|
-
},
|
|
175
|
+
data,
|
|
174
176
|
};
|
|
175
177
|
}
|
|
176
178
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnavigationv4.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigationv4.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGxD,OAAO,EACL,sBAAsB,GAEvB,MAAM,0BAA0B,CAAC;AAsClC,MAAM,cAAc,GAA6B;IAC/C,oBAAoB,EAAE,IAAI;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,gCAAiC,SAAQ,sBAAsB;IAgBnE,YAAmB,UAA6C,EAAE;QAChE,KAAK,EAAE,CAAC;QAdF,kBAAa,GAAgC,IAAI,CAAC;QAEzC,uBAAkB,GAAW,GAAG,CAAC;QAG1C,qBAAgB,GAAa,EAAE,CAAC;QAGhC,yBAAoB,GAAY,KAAK,CAAC;QAuO9C,sGAAsG;QAC9F,wBAAmB,GAAG,CAAC,GAAW,EAAQ,EAAE;YAClD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;gBAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CACjD,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CACvD,CAAC;aACH;QACH,CAAC,CAAC;QAEF,6EAA6E;QACrE,gCAA2B,GAAG,CAAC,eAAuB,EAAQ,EAAE;YACtE,MAAM,CAAC,GAAG,CACR,iEAAiE,eAAe,0BAA0B,CAC3G,CAAC;QACJ,CAAC,CAAC;QA/OA,IAAI,CAAC,QAAQ,mCACR,cAAc,GACd,OAAO,CACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,8BAA8B,CACnC,QAA4B,EAC5B,cAA8B;QAE9B,KAAK,CAAC,8BAA8B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAE/D,kHAAkH;QAClH,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAC9C,8BAA8B,CAC/B,CAAC;YACF,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAEhC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;aAClC;iBAAM;gBACL,IAAI,CAAC,mBAAmB,GAAG,UAAU,CACnC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EACzC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CACnC,CAAC;aACH;SACF;IACH,CAAC;IAED;;;OAGG;IACH,iHAAiH;IAC1G,oBAAoB,CAAC,eAAoB;QAC9C,MAAM,OAAO,GAAG,eAAe,EAA2C,CAAC;QAE3E;;;;WAIG;QACH,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;YACtC,IAAI,SAAS,IAAI,eAAe,EAAE;gBAChC,sEAAsE;gBACtE,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC;aAC9C;iBAAM;gBACL,IAAI,CAAC,aAAa,GAAG,eAAe,CAAC;aACtC;YAED,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,YAAY,EAAE,CAAC;gBAEpB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBAC9B,IAAI,IAAI,CAAC,kBAAkB,EAAE;wBAC3B,IAAI,CAAC,wBAAwB,EAAE,CAAC;qBACjC;yBAAM;wBACL,MAAM,CAAC,GAAG,CACR,sGAAsG,CACvG,CAAC;qBACH;oBACD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;iBAClC;gBAED,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;aAC1C;iBAAM;gBACL,MAAM,CAAC,IAAI,CACT,wEAAwE,CACzE,CAAC;aACH;SACF;IACH,CAAC;IAED;;OAEG;IACK,wBAAwB;QAC9B,+EAA+E;QAC/E,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC;YAEnD,IAAI,OAAO,IAAI,CAAC,mBAAmB,KAAK,WAAW,EAAE;gBACnD,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACvC,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;aACtC;YAED,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAClC;IACH,CAAC;IAED;;;OAGG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,MAAM,yBAAyB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM;iBACpE,iBAAiB,CAAC;YAErB,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,iBAAiB,GAAG,CACxD,MAAM,EACN,KAAK,EACL,EAAE;gBACF,MAAM,QAAQ,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAE1D,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAE9B,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC;SACH;IACH,CAAC;IAED;;OAEG;IACK,cAAc,CACpB,KAAwB,EACxB,0BAAmC,KAAK;;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAE3D,iGAAiG;QACjG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC,GAAG,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;YAChE,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CACjD,YAAY,EACZ,IAAI,CAAC,UAAU,CAChB,CAAC;YAEF,IAAI,aAAa,GAAG,eAAe,CAAC;YACpC,IAAI,uBAAuB,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACtD,aAAa,mCACR,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,GACnC,eAAe,CACnB,CAAC;aACH;YAED,IAAI,YAAY,SAAG,IAAI,CAAC,eAAe,+CAApB,IAAI,EAAmB,aAAa,CAAC,CAAC;YAEzD,mEAAmE;YACnE,IAAI,CAAC,YAAY,EAAE;gBACjB,MAAM,CAAC,KAAK,CACV,8DAA8D,YAAY,2DAA2D,CACtI,CAAC;gBAEF,YAAY,mCACP,aAAa,KAChB,OAAO,EAAE,KAAK,GACf,CAAC;aACH;YAED,IAAI,YAAY,CAAC,OAAO,KAAK,KAAK,EAAE;gBAClC,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;aACrD;YAED,IAAI,uBAAuB,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBACtD,qEAAqE;gBACrE,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;aACzD;iBAAM;gBACL,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;aAChE;YAED,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC;SAChC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,KAAwB,EACxB,aAAiC;;QAEjC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,SAAS;YACrB,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE;gBACJ,yBAAyB,EACvB,gCAAgC,CAAC,mBAAmB;gBACtD,oBAAoB,EAAE,KAAK,CAAC,SAAS;aACtC;YACD,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,SAAS;oBACrB,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,MAAM,QAAE,KAAK,CAAC,MAAM,mCAAI,EAAE;oBAC1B,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;iBACvD;gBACD,aAAa,EAAE,aAAa;oBAC1B,CAAC,CAAC;wBACE,IAAI,EAAE,aAAa,CAAC,SAAS;wBAC7B,GAAG,EAAE,aAAa,CAAC,GAAG;wBACtB,MAAM,QAAE,aAAa,CAAC,MAAM,mCAAI,EAAE;qBACnC;oBACH,CAAC,CAAC,IAAI;aACT;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,yBAAyB,CAC/B,KAAwB;QAExB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE9C,IACE,OAAO,IAAI,WAAW;YACtB,QAAQ,IAAI,WAAW;YACvB,OAAO,WAAW,CAAC,KAAK,KAAK,QAAQ;YACrC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EACjC;YACA,OAAO,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC;SACpD;QAED,OAAO,WAAgC,CAAC;IAC1C,CAAC;IAoBD,wEAAwE;IAChE,yBAAyB;QAC/B,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC3B,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;YACxC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;SACrC;IACH,CAAC;;AA1Qa,oDAAmB,GAAW,qBAAqB,CAAC;AA6QpE,MAAM,8BAA8B,GAAG;IACrC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE;QACJ,yBAAyB,EACvB,gCAAgC,CAAC,mBAAmB;KACvD;IACD,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,OAAO,EAAE,gCAAgC,EAAE,8BAA8B,EAAE,CAAC","sourcesContent":["/* eslint-disable max-lines */\nimport { Transaction } from \"@sentry/types\";\nimport { getGlobalObject, logger } from \"@sentry/utils\";\n\nimport { BeforeNavigate } from \"./reactnativetracing\";\nimport {\n RoutingInstrumentation,\n TransactionCreator,\n} from \"./routingInstrumentation\";\nimport { ReactNavigationTransactionContext } from \"./types\";\n\nexport interface NavigationRouteV4 {\n routeName: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>;\n}\n\nexport interface NavigationStateV4 {\n index: number;\n key: string;\n isTransitioning: boolean;\n routeName?: string;\n routes: (NavigationRouteV4 | NavigationStateV4)[];\n}\n\nexport interface AppContainerInstance {\n _navigation: {\n state: NavigationStateV4;\n router: {\n getStateForAction: (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n action: any,\n state: NavigationStateV4\n ) => NavigationStateV4;\n };\n };\n}\n\ninterface ReactNavigationV4Options {\n /**\n * The time the transaction will wait for route to mount before it is discarded.\n */\n routeChangeTimeoutMs: number;\n}\n\nconst defaultOptions: ReactNavigationV4Options = {\n routeChangeTimeoutMs: 1000,\n};\n\n/**\n * Instrumentation for React-Navigation V4.\n * Register the app container with `registerAppContainer` to use, or see docs for more details.\n */\nclass ReactNavigationV4Instrumentation extends RoutingInstrumentation {\n public static instrumentationName: string = \"react-navigation-v4\";\n\n private _appContainer: AppContainerInstance | null = null;\n\n private readonly _maxRecentRouteLen: number = 200;\n\n private _prevRoute?: NavigationRouteV4;\n private _recentRouteKeys: string[] = [];\n\n private _latestTransaction?: Transaction;\n private _initialStateHandled: boolean = false;\n private _stateChangeTimeout?: number | undefined;\n\n private _options: ReactNavigationV4Options;\n\n public constructor(options: Partial<ReactNavigationV4Options> = {}) {\n super();\n\n this._options = {\n ...defaultOptions,\n ...options,\n };\n }\n\n /**\n * Extends by calling _handleInitialState at the end.\n */\n public registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate\n ): void {\n super.registerRoutingInstrumentation(listener, beforeNavigate);\n\n // Need to handle the initial state as the router patch will only attach transactions on subsequent route changes.\n if (!this._initialStateHandled) {\n this._latestTransaction = this.onRouteWillChange(\n INITIAL_TRANSACTION_CONTEXT_V4\n );\n if (this._appContainer) {\n this._updateLatestTransaction();\n\n this._initialStateHandled = true;\n } else {\n this._stateChangeTimeout = setTimeout(\n this._discardLatestTransaction.bind(this),\n this._options.routeChangeTimeoutMs\n );\n }\n }\n }\n\n /**\n * Pass the ref to the app container to register it to the instrumentation\n * @param appContainerRef Ref to an `AppContainer`\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public registerAppContainer(appContainerRef: any): void {\n const _global = getGlobalObject<{ __sentry_rn_v4_registered?: boolean }>();\n\n /* We prevent duplicate routing instrumentation to be initialized on fast refreshes\n\n Explanation: If the user triggers a fast refresh on the file that the instrumentation is\n initialized in, it will initialize a new instance and will cause undefined behavior.\n */\n if (!_global.__sentry_rn_v4_registered) {\n if (\"current\" in appContainerRef) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this._appContainer = appContainerRef.current;\n } else {\n this._appContainer = appContainerRef;\n }\n\n if (this._appContainer) {\n this._patchRouter();\n\n if (!this._initialStateHandled) {\n if (this._latestTransaction) {\n this._updateLatestTransaction();\n } else {\n logger.log(\n \"[ReactNavigationV4Instrumentation] App container registered, but integration has not been setup yet.\"\n );\n }\n this._initialStateHandled = true;\n }\n\n _global.__sentry_rn_v4_registered = true;\n } else {\n logger.warn(\n \"[ReactNavigationV4Instrumentation] Received invalid app container ref!\"\n );\n }\n }\n }\n\n /**\n * Updates the latest transaction with the current state and calls beforeNavigate.\n */\n private _updateLatestTransaction(): void {\n // We can assume the ref is present as this is called from registerAppContainer\n if (this._appContainer && this._latestTransaction) {\n const state = this._appContainer._navigation.state;\n\n if (typeof this._stateChangeTimeout !== \"undefined\") {\n clearTimeout(this._stateChangeTimeout);\n this._stateChangeTimeout = undefined;\n }\n\n this._onStateChange(state, true);\n }\n }\n\n /**\n * Patches the react navigation router so we can listen to the route changes and attach the `IdleTransaction` before the\n * new screen is mounted.\n */\n private _patchRouter(): void {\n if (this._appContainer) {\n const originalGetStateForAction = this._appContainer._navigation.router\n .getStateForAction;\n\n this._appContainer._navigation.router.getStateForAction = (\n action,\n state\n ) => {\n const newState = originalGetStateForAction(action, state);\n\n this._onStateChange(newState);\n\n return newState;\n };\n }\n }\n\n /**\n * To be called on navigation state changes and creates the transaction.\n */\n private _onStateChange(\n state: NavigationStateV4,\n updateLatestTransaction: boolean = false\n ): void {\n const currentRoute = this._getCurrentRouteFromState(state);\n\n // If the route is a different key, this is so we ignore actions that pertain to the same screen.\n if (!this._prevRoute || currentRoute.key !== this._prevRoute.key) {\n const originalContext = this._getTransactionContext(\n currentRoute,\n this._prevRoute\n );\n\n let mergedContext = originalContext;\n if (updateLatestTransaction && this._latestTransaction) {\n mergedContext = {\n ...this._latestTransaction.toContext(),\n ...originalContext,\n };\n }\n\n let finalContext = this._beforeNavigate?.(mergedContext);\n\n // This block is to catch users not returning a transaction context\n if (!finalContext) {\n logger.error(\n `[ReactNavigationV4Instrumentation] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`\n );\n\n finalContext = {\n ...mergedContext,\n sampled: false,\n };\n }\n\n if (finalContext.sampled === false) {\n this._onBeforeNavigateNotSampled(finalContext.name);\n }\n\n if (updateLatestTransaction && this._latestTransaction) {\n // Update the latest transaction instead of calling onRouteWillChange\n this._latestTransaction.updateWithContext(finalContext);\n } else {\n this._latestTransaction = this.onRouteWillChange(finalContext);\n }\n\n this._pushRecentRouteKey(currentRoute.key);\n this._prevRoute = currentRoute;\n }\n }\n\n /**\n * Gets the transaction context for a `NavigationRouteV4`\n */\n private _getTransactionContext(\n route: NavigationRouteV4,\n previousRoute?: NavigationRouteV4\n ): ReactNavigationTransactionContext {\n return {\n name: route.routeName,\n op: \"navigation\",\n tags: {\n \"routing.instrumentation\":\n ReactNavigationV4Instrumentation.instrumentationName,\n \"routing.route.name\": route.routeName,\n },\n data: {\n route: {\n name: route.routeName, // Include name here too for use in `beforeNavigate`\n key: route.key,\n params: route.params ?? {},\n hasBeenSeen: this._recentRouteKeys.includes(route.key),\n },\n previousRoute: previousRoute\n ? {\n name: previousRoute.routeName,\n key: previousRoute.key,\n params: previousRoute.params ?? {},\n }\n : null,\n },\n };\n }\n\n /**\n * Gets the current route given a navigation state\n */\n private _getCurrentRouteFromState(\n state: NavigationStateV4\n ): NavigationRouteV4 {\n const parentRoute = state.routes[state.index];\n\n if (\n \"index\" in parentRoute &&\n \"routes\" in parentRoute &&\n typeof parentRoute.index === \"number\" &&\n Array.isArray(parentRoute.routes)\n ) {\n return this._getCurrentRouteFromState(parentRoute);\n }\n\n return parentRoute as NavigationRouteV4;\n }\n\n /** Pushes a recent route key, and removes earlier routes when there is greater than the max length */\n private _pushRecentRouteKey = (key: string): void => {\n this._recentRouteKeys.push(key);\n\n if (this._recentRouteKeys.length > this._maxRecentRouteLen) {\n this._recentRouteKeys = this._recentRouteKeys.slice(\n this._recentRouteKeys.length - this._maxRecentRouteLen\n );\n }\n };\n\n /** Helper to log a transaction that was not sampled due to beforeNavigate */\n private _onBeforeNavigateNotSampled = (transactionName: string): void => {\n logger.log(\n `[ReactNavigationV4Instrumentation] Will not send transaction \"${transactionName}\" due to beforeNavigate.`\n );\n };\n\n /** Cancels the latest transaction so it does not get sent to Sentry. */\n private _discardLatestTransaction(): void {\n if (this._latestTransaction) {\n this._latestTransaction.sampled = false;\n this._latestTransaction.finish();\n this._latestTransaction = undefined;\n }\n }\n}\n\nconst INITIAL_TRANSACTION_CONTEXT_V4 = {\n name: \"App Launch\",\n op: \"navigation\",\n tags: {\n \"routing.instrumentation\":\n ReactNavigationV4Instrumentation.instrumentationName,\n },\n data: {},\n};\n\nexport { ReactNavigationV4Instrumentation, INITIAL_TRANSACTION_CONTEXT_V4 };\n"]}
|
|
1
|
+
{"version":3,"file":"reactnavigationv4.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigationv4.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport { Transaction } from \"@sentry/types\";\nimport { getGlobalObject, logger } from \"@sentry/utils\";\n\nimport { BeforeNavigate } from \"./reactnativetracing\";\nimport {\n InternalRoutingInstrumentation,\n OnConfirmRoute,\n TransactionCreator,\n} from \"./routingInstrumentation\";\nimport {\n ReactNavigationTransactionContext,\n RouteChangeContextData,\n} from \"./types\";\n\nexport interface NavigationRouteV4 {\n routeName: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params?: Record<string, any>;\n}\n\nexport interface NavigationStateV4 {\n index: number;\n key: string;\n isTransitioning: boolean;\n routeName?: string;\n routes: (NavigationRouteV4 | NavigationStateV4)[];\n}\n\nexport interface AppContainerInstance {\n _navigation: {\n state: NavigationStateV4;\n router: {\n getStateForAction: (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n action: any,\n state: NavigationStateV4\n ) => NavigationStateV4;\n };\n };\n}\n\ninterface ReactNavigationV4Options {\n /**\n * The time the transaction will wait for route to mount before it is discarded.\n */\n routeChangeTimeoutMs: number;\n}\n\nconst defaultOptions: ReactNavigationV4Options = {\n routeChangeTimeoutMs: 1000,\n};\n\n/**\n * Instrumentation for React-Navigation V4.\n * Register the app container with `registerAppContainer` to use, or see docs for more details.\n */\nclass ReactNavigationV4Instrumentation extends InternalRoutingInstrumentation {\n public static instrumentationName: string = \"react-navigation-v4\";\n\n private _appContainer: AppContainerInstance | null = null;\n\n private readonly _maxRecentRouteLen: number = 200;\n\n private _prevRoute?: NavigationRouteV4;\n private _recentRouteKeys: string[] = [];\n\n private _latestTransaction?: Transaction;\n private _initialStateHandled: boolean = false;\n private _stateChangeTimeout?: number | undefined;\n\n private _options: ReactNavigationV4Options;\n\n public constructor(options: Partial<ReactNavigationV4Options> = {}) {\n super();\n\n this._options = {\n ...defaultOptions,\n ...options,\n };\n }\n\n /**\n * Extends by calling _handleInitialState at the end.\n */\n public registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate,\n onConfirmRoute: OnConfirmRoute\n ): void {\n super.registerRoutingInstrumentation(\n listener,\n beforeNavigate,\n onConfirmRoute\n );\n\n // Need to handle the initial state as the router patch will only attach transactions on subsequent route changes.\n if (!this._initialStateHandled) {\n this._latestTransaction = this.onRouteWillChange(\n INITIAL_TRANSACTION_CONTEXT_V4\n );\n if (this._appContainer) {\n this._updateLatestTransaction();\n\n this._initialStateHandled = true;\n } else {\n this._stateChangeTimeout = setTimeout(\n this._discardLatestTransaction.bind(this),\n this._options.routeChangeTimeoutMs\n );\n }\n }\n }\n\n /**\n * Pass the ref to the app container to register it to the instrumentation\n * @param appContainerRef Ref to an `AppContainer`\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public registerAppContainer(appContainerRef: any): void {\n const _global = getGlobalObject<{ __sentry_rn_v4_registered?: boolean }>();\n\n /* We prevent duplicate routing instrumentation to be initialized on fast refreshes\n\n Explanation: If the user triggers a fast refresh on the file that the instrumentation is\n initialized in, it will initialize a new instance and will cause undefined behavior.\n */\n if (!_global.__sentry_rn_v4_registered) {\n if (\"current\" in appContainerRef) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n this._appContainer = appContainerRef.current;\n } else {\n this._appContainer = appContainerRef;\n }\n\n if (this._appContainer) {\n this._patchRouter();\n\n if (!this._initialStateHandled) {\n if (this._latestTransaction) {\n this._updateLatestTransaction();\n } else {\n logger.log(\n \"[ReactNavigationV4Instrumentation] App container registered, but integration has not been setup yet.\"\n );\n }\n this._initialStateHandled = true;\n }\n\n _global.__sentry_rn_v4_registered = true;\n } else {\n logger.warn(\n \"[ReactNavigationV4Instrumentation] Received invalid app container ref!\"\n );\n }\n }\n }\n\n /**\n * Updates the latest transaction with the current state and calls beforeNavigate.\n */\n private _updateLatestTransaction(): void {\n // We can assume the ref is present as this is called from registerAppContainer\n if (this._appContainer && this._latestTransaction) {\n const state = this._appContainer._navigation.state;\n\n if (typeof this._stateChangeTimeout !== \"undefined\") {\n clearTimeout(this._stateChangeTimeout);\n this._stateChangeTimeout = undefined;\n }\n\n this._onStateChange(state, true);\n }\n }\n\n /**\n * Patches the react navigation router so we can listen to the route changes and attach the `IdleTransaction` before the\n * new screen is mounted.\n */\n private _patchRouter(): void {\n if (this._appContainer) {\n const originalGetStateForAction = this._appContainer._navigation.router\n .getStateForAction;\n\n this._appContainer._navigation.router.getStateForAction = (\n action,\n state\n ) => {\n const newState = originalGetStateForAction(action, state);\n\n this._onStateChange(newState);\n\n return newState;\n };\n }\n }\n\n /**\n * To be called on navigation state changes and creates the transaction.\n */\n private _onStateChange(\n state: NavigationStateV4,\n updateLatestTransaction: boolean = false\n ): void {\n const currentRoute = this._getCurrentRouteFromState(state);\n\n // If the route is a different key, this is so we ignore actions that pertain to the same screen.\n if (!this._prevRoute || currentRoute.key !== this._prevRoute.key) {\n const originalContext = this._getTransactionContext(\n currentRoute,\n this._prevRoute\n );\n\n let mergedContext = originalContext;\n if (updateLatestTransaction && this._latestTransaction) {\n mergedContext = {\n ...this._latestTransaction.toContext(),\n ...originalContext,\n };\n }\n\n let finalContext = this._beforeNavigate?.(mergedContext);\n\n // This block is to catch users not returning a transaction context\n if (!finalContext) {\n logger.error(\n `[ReactNavigationV4Instrumentation] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`\n );\n\n finalContext = {\n ...mergedContext,\n sampled: false,\n };\n }\n\n if (finalContext.sampled === false) {\n this._onBeforeNavigateNotSampled(finalContext.name);\n }\n\n if (updateLatestTransaction && this._latestTransaction) {\n // Update the latest transaction instead of calling onRouteWillChange\n this._latestTransaction.updateWithContext(finalContext);\n } else {\n this._latestTransaction = this.onRouteWillChange(finalContext);\n }\n\n this._onConfirmRoute?.(finalContext);\n\n this._pushRecentRouteKey(currentRoute.key);\n this._prevRoute = currentRoute;\n }\n }\n\n /**\n * Gets the transaction context for a `NavigationRouteV4`\n */\n private _getTransactionContext(\n route: NavigationRouteV4,\n previousRoute?: NavigationRouteV4\n ): ReactNavigationTransactionContext {\n const data: RouteChangeContextData = {\n route: {\n name: route.routeName, // Include name here too for use in `beforeNavigate`\n key: route.key,\n params: route.params ?? {},\n hasBeenSeen: this._recentRouteKeys.includes(route.key),\n },\n previousRoute: previousRoute\n ? {\n name: previousRoute.routeName,\n key: previousRoute.key,\n params: previousRoute.params ?? {},\n }\n : null,\n };\n\n return {\n name: route.routeName,\n op: \"navigation\",\n tags: {\n \"routing.instrumentation\":\n ReactNavigationV4Instrumentation.instrumentationName,\n \"routing.route.name\": route.routeName,\n },\n data,\n };\n }\n\n /**\n * Gets the current route given a navigation state\n */\n private _getCurrentRouteFromState(\n state: NavigationStateV4\n ): NavigationRouteV4 {\n const parentRoute = state.routes[state.index];\n\n if (\n \"index\" in parentRoute &&\n \"routes\" in parentRoute &&\n typeof parentRoute.index === \"number\" &&\n Array.isArray(parentRoute.routes)\n ) {\n return this._getCurrentRouteFromState(parentRoute);\n }\n\n return parentRoute as NavigationRouteV4;\n }\n\n /** Pushes a recent route key, and removes earlier routes when there is greater than the max length */\n private _pushRecentRouteKey = (key: string): void => {\n this._recentRouteKeys.push(key);\n\n if (this._recentRouteKeys.length > this._maxRecentRouteLen) {\n this._recentRouteKeys = this._recentRouteKeys.slice(\n this._recentRouteKeys.length - this._maxRecentRouteLen\n );\n }\n };\n\n /** Helper to log a transaction that was not sampled due to beforeNavigate */\n private _onBeforeNavigateNotSampled = (transactionName: string): void => {\n logger.log(\n `[ReactNavigationV4Instrumentation] Will not send transaction \"${transactionName}\" due to beforeNavigate.`\n );\n };\n\n /** Cancels the latest transaction so it does not get sent to Sentry. */\n private _discardLatestTransaction(): void {\n if (this._latestTransaction) {\n this._latestTransaction.sampled = false;\n this._latestTransaction.finish();\n this._latestTransaction = undefined;\n }\n }\n}\n\nconst INITIAL_TRANSACTION_CONTEXT_V4 = {\n name: \"App Launch\",\n op: \"navigation\",\n tags: {\n \"routing.instrumentation\":\n ReactNavigationV4Instrumentation.instrumentationName,\n },\n data: {},\n};\n\nexport { ReactNavigationV4Instrumentation, INITIAL_TRANSACTION_CONTEXT_V4 };\n"]}
|
|
@@ -2,6 +2,7 @@ import { Hub } from "@sentry/hub";
|
|
|
2
2
|
import { Transaction, TransactionContext } from "@sentry/types";
|
|
3
3
|
import { BeforeNavigate } from "./reactnativetracing";
|
|
4
4
|
export declare type TransactionCreator = (context: TransactionContext) => Transaction | undefined;
|
|
5
|
+
export declare type OnConfirmRoute = (context: TransactionContext) => void;
|
|
5
6
|
export interface RoutingInstrumentationInstance {
|
|
6
7
|
/**
|
|
7
8
|
* Registers a listener that's called on every route change with a `TransactionContext`.
|
|
@@ -10,8 +11,9 @@ export interface RoutingInstrumentationInstance {
|
|
|
10
11
|
*
|
|
11
12
|
* @param listener A `RouteListener`
|
|
12
13
|
* @param beforeNavigate BeforeNavigate
|
|
14
|
+
* @param inConfirmRoute OnConfirmRoute
|
|
13
15
|
*/
|
|
14
|
-
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate): void;
|
|
16
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
|
15
17
|
/**
|
|
16
18
|
* To be called when the route changes, BEFORE the new route mounts.
|
|
17
19
|
* If this is called after a route mounts the child spans will not be correctly attached.
|
|
@@ -28,9 +30,17 @@ export declare class RoutingInstrumentation implements RoutingInstrumentationIns
|
|
|
28
30
|
static instrumentationName: string;
|
|
29
31
|
protected _getCurrentHub?: () => Hub;
|
|
30
32
|
protected _beforeNavigate?: BeforeNavigate;
|
|
31
|
-
|
|
33
|
+
protected _onConfirmRoute?: OnConfirmRoute;
|
|
34
|
+
protected _tracingListener?: TransactionCreator;
|
|
32
35
|
/** @inheritdoc */
|
|
33
|
-
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate): void;
|
|
36
|
+
registerRoutingInstrumentation(listener: TransactionCreator, beforeNavigate: BeforeNavigate, onConfirmRoute: OnConfirmRoute): void;
|
|
37
|
+
/** @inheritdoc */
|
|
38
|
+
onRouteWillChange(context: TransactionContext): Transaction | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Internal base routing instrumentation where `_onConfirmRoute` is not called in onRouteWillChange
|
|
42
|
+
*/
|
|
43
|
+
export declare class InternalRoutingInstrumentation extends RoutingInstrumentation {
|
|
34
44
|
/** @inheritdoc */
|
|
35
45
|
onRouteWillChange(context: TransactionContext): Transaction | undefined;
|
|
36
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routingInstrumentation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/routingInstrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,oBAAY,kBAAkB,GAAG,CAC/B,OAAO,EAAE,kBAAkB,KACxB,WAAW,GAAG,SAAS,CAAC;AAE7B,MAAM,WAAW,8BAA8B;IAC7C
|
|
1
|
+
{"version":3,"file":"routingInstrumentation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/routingInstrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,oBAAY,kBAAkB,GAAG,CAC/B,OAAO,EAAE,kBAAkB,KACxB,WAAW,GAAG,SAAS,CAAC;AAE7B,oBAAY,cAAc,GAAG,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAEnE,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;;OAQG;IACH,8BAA8B,CAC5B,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAC7B,IAAI,CAAC;IACR;;;;;OAKG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,GAAG,SAAS,CAAC;CACzE;AAED;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,8BAA8B;IAC3E,OAAc,mBAAmB,EAAE,MAAM,CAAkC;IAE3E,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC;IACrC,SAAS,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC;IAC3C,SAAS,CAAC,eAAe,CAAC,EAAE,cAAc,CAAC;IAC3C,SAAS,CAAC,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IAEhD,kBAAkB;IACX,8BAA8B,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,GAC7B,IAAI;IAMP,kBAAkB;IACX,iBAAiB,CACtB,OAAO,EAAE,kBAAkB,GAC1B,WAAW,GAAG,SAAS;CAS3B;AAED;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,sBAAsB;IACxE,kBAAkB;IACX,iBAAiB,CACtB,OAAO,EAAE,kBAAkB,GAC1B,WAAW,GAAG,SAAS;CAG3B"}
|
|
@@ -4,15 +4,30 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export class RoutingInstrumentation {
|
|
6
6
|
/** @inheritdoc */
|
|
7
|
-
registerRoutingInstrumentation(listener, beforeNavigate) {
|
|
7
|
+
registerRoutingInstrumentation(listener, beforeNavigate, onConfirmRoute) {
|
|
8
8
|
this._tracingListener = listener;
|
|
9
9
|
this._beforeNavigate = beforeNavigate;
|
|
10
|
+
this._onConfirmRoute = onConfirmRoute;
|
|
10
11
|
}
|
|
12
|
+
/** @inheritdoc */
|
|
13
|
+
onRouteWillChange(context) {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
const transaction = (_a = this._tracingListener) === null || _a === void 0 ? void 0 : _a.call(this, context);
|
|
16
|
+
if (transaction) {
|
|
17
|
+
(_b = this._onConfirmRoute) === null || _b === void 0 ? void 0 : _b.call(this, context);
|
|
18
|
+
}
|
|
19
|
+
return transaction;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
RoutingInstrumentation.instrumentationName = "base-routing-instrumentation";
|
|
23
|
+
/**
|
|
24
|
+
* Internal base routing instrumentation where `_onConfirmRoute` is not called in onRouteWillChange
|
|
25
|
+
*/
|
|
26
|
+
export class InternalRoutingInstrumentation extends RoutingInstrumentation {
|
|
11
27
|
/** @inheritdoc */
|
|
12
28
|
onRouteWillChange(context) {
|
|
13
29
|
var _a;
|
|
14
30
|
return (_a = this._tracingListener) === null || _a === void 0 ? void 0 : _a.call(this, context);
|
|
15
31
|
}
|
|
16
32
|
}
|
|
17
|
-
RoutingInstrumentation.instrumentationName = "base-routing-instrumentation";
|
|
18
33
|
//# sourceMappingURL=routingInstrumentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routingInstrumentation.js","sourceRoot":"","sources":["../../../src/js/tracing/routingInstrumentation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routingInstrumentation.js","sourceRoot":"","sources":["../../../src/js/tracing/routingInstrumentation.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IAQjC,kBAAkB;IACX,8BAA8B,CACnC,QAA4B,EAC5B,cAA8B,EAC9B,cAA8B;QAE9B,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACxC,CAAC;IAED,kBAAkB;IACX,iBAAiB,CACtB,OAA2B;;QAE3B,MAAM,WAAW,SAAG,IAAI,CAAC,gBAAgB,+CAArB,IAAI,EAAoB,OAAO,CAAC,CAAC;QAErD,IAAI,WAAW,EAAE;YACf,MAAA,IAAI,CAAC,eAAe,+CAApB,IAAI,EAAmB,OAAO,EAAE;SACjC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;;AA7Ba,0CAAmB,GAAW,8BAA8B,CAAC;AAgC7E;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,sBAAsB;IACxE,kBAAkB;IACX,iBAAiB,CACtB,OAA2B;;QAE3B,aAAO,IAAI,CAAC,gBAAgB,+CAArB,IAAI,EAAoB,OAAO,EAAE;IAC1C,CAAC;CACF","sourcesContent":["import { Hub } from \"@sentry/hub\";\nimport { Transaction, TransactionContext } from \"@sentry/types\";\n\nimport { BeforeNavigate } from \"./reactnativetracing\";\n\nexport type TransactionCreator = (\n context: TransactionContext\n) => Transaction | undefined;\n\nexport type OnConfirmRoute = (context: TransactionContext) => void;\n\nexport interface RoutingInstrumentationInstance {\n /**\n * Registers a listener that's called on every route change with a `TransactionContext`.\n *\n * Do not overwrite this unless you know what you are doing.\n *\n * @param listener A `RouteListener`\n * @param beforeNavigate BeforeNavigate\n * @param inConfirmRoute OnConfirmRoute\n */\n registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate,\n onConfirmRoute: OnConfirmRoute\n ): void;\n /**\n * To be called when the route changes, BEFORE the new route mounts.\n * If this is called after a route mounts the child spans will not be correctly attached.\n *\n * @param context A `TransactionContext` used to initialize the transaction.\n */\n onRouteWillChange(context: TransactionContext): Transaction | undefined;\n}\n\n/**\n * Base Routing Instrumentation. Can be used by users to manually instrument custom routers.\n * Pass this to the tracing integration, and call `onRouteWillChange` every time before a route changes.\n */\nexport class RoutingInstrumentation implements RoutingInstrumentationInstance {\n public static instrumentationName: string = \"base-routing-instrumentation\";\n\n protected _getCurrentHub?: () => Hub;\n protected _beforeNavigate?: BeforeNavigate;\n protected _onConfirmRoute?: OnConfirmRoute;\n protected _tracingListener?: TransactionCreator;\n\n /** @inheritdoc */\n public registerRoutingInstrumentation(\n listener: TransactionCreator,\n beforeNavigate: BeforeNavigate,\n onConfirmRoute: OnConfirmRoute\n ): void {\n this._tracingListener = listener;\n this._beforeNavigate = beforeNavigate;\n this._onConfirmRoute = onConfirmRoute;\n }\n\n /** @inheritdoc */\n public onRouteWillChange(\n context: TransactionContext\n ): Transaction | undefined {\n const transaction = this._tracingListener?.(context);\n\n if (transaction) {\n this._onConfirmRoute?.(context);\n }\n\n return transaction;\n }\n}\n\n/**\n * Internal base routing instrumentation where `_onConfirmRoute` is not called in onRouteWillChange\n */\nexport class InternalRoutingInstrumentation extends RoutingInstrumentation {\n /** @inheritdoc */\n public onRouteWillChange(\n context: TransactionContext\n ): Transaction | undefined {\n return this._tracingListener?.(context);\n }\n}\n"]}
|
|
@@ -7,14 +7,22 @@ export interface ReactNavigationRoute {
|
|
|
7
7
|
export interface ReactNavigationCurrentRoute extends ReactNavigationRoute {
|
|
8
8
|
hasBeenSeen: boolean;
|
|
9
9
|
}
|
|
10
|
+
export declare type RouteChangeContextData = {
|
|
11
|
+
previousRoute?: {
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
name: string;
|
|
14
|
+
} | null;
|
|
15
|
+
route: {
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
name: string;
|
|
18
|
+
hasBeenSeen: boolean;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
10
21
|
export interface ReactNavigationTransactionContext extends TransactionContext {
|
|
11
22
|
tags: {
|
|
12
23
|
"routing.instrumentation": string;
|
|
13
24
|
"routing.route.name": string;
|
|
14
25
|
};
|
|
15
|
-
data:
|
|
16
|
-
route: ReactNavigationCurrentRoute;
|
|
17
|
-
previousRoute: ReactNavigationRoute | null;
|
|
18
|
-
};
|
|
26
|
+
data: RouteChangeContextData;
|
|
19
27
|
}
|
|
20
28
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA4B,SAAQ,oBAAoB;IACvE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA4B,SAAQ,oBAAoB;IACvE,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,oBAAY,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IACT,KAAK,EAAE;QACL,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,iCAAkC,SAAQ,kBAAkB;IAC3E,IAAI,EAAE;QACJ,yBAAyB,EAAE,MAAM,CAAC;QAClC,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,IAAI,EAAE,sBAAsB,CAAC;CAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/js/tracing/types.ts"],"names":[],"mappings":"","sourcesContent":["import { TransactionContext } from \"@sentry/types\";\n\nexport interface ReactNavigationRoute {\n name: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any>;\n}\n\nexport interface ReactNavigationCurrentRoute extends ReactNavigationRoute {\n hasBeenSeen: boolean;\n}\n\nexport interface ReactNavigationTransactionContext extends TransactionContext {\n tags: {\n \"routing.instrumentation\": string;\n \"routing.route.name\": string;\n };\n data:
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/js/tracing/types.ts"],"names":[],"mappings":"","sourcesContent":["import { TransactionContext } from \"@sentry/types\";\n\nexport interface ReactNavigationRoute {\n name: string;\n key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n params: Record<string, any>;\n}\n\nexport interface ReactNavigationCurrentRoute extends ReactNavigationRoute {\n hasBeenSeen: boolean;\n}\n\nexport type RouteChangeContextData = {\n previousRoute?: {\n [key: string]: unknown;\n name: string;\n } | null;\n route: {\n [key: string]: unknown;\n name: string;\n hasBeenSeen: boolean;\n };\n};\n\nexport interface ReactNavigationTransactionContext extends TransactionContext {\n tags: {\n \"routing.instrumentation\": string;\n \"routing.route.name\": string;\n };\n data: RouteChangeContextData;\n}\n"]}
|
package/dist/js/version.d.ts
CHANGED
package/dist/js/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,mCAAmC,CAAC;AACzD,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,mCAAmC,CAAC;AACzD,eAAO,MAAM,WAAW,UAAU,CAAC"}
|
package/dist/js/version.js
CHANGED
package/dist/js/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/js/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC","sourcesContent":["export const SDK_NAME = \"sentry.javascript.react-native\";\nexport const SDK_VERSION = \"3.2.2\";\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@sentry/react-native",
|
|
3
3
|
"homepage": "https://github.com/getsentry/sentry-react-native",
|
|
4
4
|
"repository": "https://github.com/getsentry/sentry-react-native",
|
|
5
|
-
"version": "3.2.
|
|
5
|
+
"version": "3.2.2",
|
|
6
6
|
"description": "Official Sentry SDK for react-native",
|
|
7
7
|
"typings": "dist/js/index.d.ts",
|
|
8
8
|
"types": "dist/js/index.d.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"@sentry/wizard": "^1.2.2",
|
|
58
58
|
"@types/jest": "^26.0.15",
|
|
59
59
|
"@types/react": "^16.9.49",
|
|
60
|
-
"@types/react-native": "^0.
|
|
60
|
+
"@types/react-native": "^0.65.3",
|
|
61
61
|
"babel-jest": "^26.1.0",
|
|
62
62
|
"eslint": "^7.6.0",
|
|
63
63
|
"eslint-plugin-react": "^7.20.6",
|