@sentry/react-native 3.2.10 → 3.2.14-beta.1
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 +18 -0
- package/RNSentry.podspec +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.d.ts +15 -4
- package/dist/js/integrations/reactnativeerrorhandlers.d.ts.map +1 -1
- package/dist/js/integrations/reactnativeerrorhandlers.js +47 -30
- package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
- package/dist/js/options.d.ts +9 -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 +4 -1
- package/dist/js/sdk.js.map +1 -1
- package/dist/js/tracing/reactnavigation.d.ts +4 -0
- package/dist/js/tracing/reactnavigation.d.ts.map +1 -1
- package/dist/js/tracing/reactnavigation.js +52 -37
- package/dist/js/tracing/reactnavigation.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/ios/RNSentry.m +6 -2
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 3.2.14-beta.1
|
|
4
|
+
|
|
5
|
+
- fix: Discard prior transactions on react navigation dispatch #2053
|
|
6
|
+
|
|
7
|
+
## 3.2.13
|
|
8
|
+
|
|
9
|
+
- fix(deps): Add `@sentry/wizard` back in as a dependency to avoid missing dependency when running react-native link. #2015
|
|
10
|
+
- Bump: sentry-cli to 1.72.0 #2016
|
|
11
|
+
|
|
12
|
+
## 3.2.12
|
|
13
|
+
|
|
14
|
+
- fix: fetchNativeDeviceContexts returns an empty Array if no Device Context available #2002
|
|
15
|
+
- Bump: Sentry Cocoa 7.9.0 #2011
|
|
16
|
+
|
|
17
|
+
## 3.2.11
|
|
18
|
+
|
|
19
|
+
- fix: Polyfill the promise library to permanently fix unhandled rejections #1984
|
|
20
|
+
|
|
3
21
|
## 3.2.10
|
|
4
22
|
|
|
5
23
|
- fix: Do not crash if androidx.core isn't available on Android #1981
|
package/RNSentry.podspec
CHANGED
|
@@ -3,6 +3,7 @@ import { Integration } from "@sentry/types";
|
|
|
3
3
|
interface ReactNativeErrorHandlersOptions {
|
|
4
4
|
onerror: boolean;
|
|
5
5
|
onunhandledrejection: boolean;
|
|
6
|
+
patchGlobalPromise: boolean;
|
|
6
7
|
}
|
|
7
8
|
/** ReactNativeErrorHandlers Integration */
|
|
8
9
|
export declare class ReactNativeErrorHandlers implements Integration {
|
|
@@ -17,7 +18,7 @@ export declare class ReactNativeErrorHandlers implements Integration {
|
|
|
17
18
|
/** ReactNativeOptions */
|
|
18
19
|
private readonly _options;
|
|
19
20
|
/** Constructor */
|
|
20
|
-
constructor(options?: ReactNativeErrorHandlersOptions);
|
|
21
|
+
constructor(options?: Partial<ReactNativeErrorHandlersOptions>);
|
|
21
22
|
/**
|
|
22
23
|
* @inheritDoc
|
|
23
24
|
*/
|
|
@@ -27,13 +28,23 @@ export declare class ReactNativeErrorHandlers implements Integration {
|
|
|
27
28
|
*/
|
|
28
29
|
private _handleUnhandledRejections;
|
|
29
30
|
/**
|
|
30
|
-
*
|
|
31
|
+
* Polyfill the global promise instance with one we can be sure that we can attach the tracking to.
|
|
32
|
+
*
|
|
33
|
+
* In newer RN versions >=0.63, the global promise is not the same reference as the one imported from the promise library.
|
|
34
|
+
* This is due to a version mismatch between promise versions.
|
|
35
|
+
* Originally we tried a solution where we would have you put a package resolution to ensure the promise instances match. However,
|
|
36
|
+
* - Using a package resolution requires the you to manually troubleshoot.
|
|
37
|
+
* - The package resolution fix no longer works with 0.67 on iOS Hermes.
|
|
31
38
|
*/
|
|
32
|
-
private
|
|
39
|
+
private _polyfillPromise;
|
|
40
|
+
/**
|
|
41
|
+
* Attach the unhandled rejection handler
|
|
42
|
+
*/
|
|
43
|
+
private _attachUnhandledRejectionHandler;
|
|
33
44
|
/**
|
|
34
45
|
* Checks if the promise is the same one or not, if not it will warn the user
|
|
35
46
|
*/
|
|
36
|
-
private
|
|
47
|
+
private _checkPromiseAndWarn;
|
|
37
48
|
/**
|
|
38
49
|
* Handle errors
|
|
39
50
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativeerrorhandlers.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/reactnativeerrorhandlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAY,MAAM,eAAe,CAAC;AAKtD,uCAAuC;AACvC,UAAU,+BAA+B;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"reactnativeerrorhandlers.d.ts","sourceRoot":"","sources":["../../../src/js/integrations/reactnativeerrorhandlers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAY,MAAM,eAAe,CAAC;AAKtD,uCAAuC;AACvC,UAAU,+BAA+B;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAUD,2CAA2C;AAC3C,qBAAa,wBAAyB,YAAW,WAAW;IAC1D;;OAEG;IACH,OAAc,EAAE,EAAE,MAAM,CAA8B;IAEtD;;OAEG;IACI,IAAI,EAAE,MAAM,CAA+B;IAElD,yBAAyB;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAE3D,kBAAkB;gBACC,OAAO,CAAC,EAAE,OAAO,CAAC,+BAA+B,CAAC;IASrE;;OAEG;IACI,SAAS,IAAI,IAAI;IAKxB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAUlC;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAyCxC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,cAAc;CAkEvB"}
|
|
@@ -11,7 +11,7 @@ export class ReactNativeErrorHandlers {
|
|
|
11
11
|
* @inheritDoc
|
|
12
12
|
*/
|
|
13
13
|
this.name = ReactNativeErrorHandlers.id;
|
|
14
|
-
this._options = Object.assign({ onerror: true, onunhandledrejection: true }, options);
|
|
14
|
+
this._options = Object.assign({ onerror: true, onunhandledrejection: true, patchGlobalPromise: true }, options);
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* @inheritDoc
|
|
@@ -25,37 +25,39 @@ export class ReactNativeErrorHandlers {
|
|
|
25
25
|
*/
|
|
26
26
|
_handleUnhandledRejections() {
|
|
27
27
|
if (this._options.onunhandledrejection) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this._checkPromiseVersion();
|
|
34
|
-
const tracking = require("promise/setimmediate/rejection-tracking");
|
|
35
|
-
const promiseRejectionTrackingOptions = this._getPromiseRejectionTrackingOptions();
|
|
36
|
-
tracking.disable();
|
|
37
|
-
tracking.enable({
|
|
38
|
-
allRejections: true,
|
|
39
|
-
onUnhandled: (id, error) => {
|
|
40
|
-
if (__DEV__) {
|
|
41
|
-
promiseRejectionTrackingOptions.onUnhandled(id, error);
|
|
42
|
-
}
|
|
43
|
-
getCurrentHub().captureException(error, {
|
|
44
|
-
data: { id },
|
|
45
|
-
originalException: error,
|
|
46
|
-
});
|
|
47
|
-
},
|
|
48
|
-
onHandled: (id) => {
|
|
49
|
-
promiseRejectionTrackingOptions.onHandled(id);
|
|
50
|
-
},
|
|
51
|
-
});
|
|
28
|
+
if (this._options.patchGlobalPromise) {
|
|
29
|
+
this._polyfillPromise();
|
|
30
|
+
}
|
|
31
|
+
this._attachUnhandledRejectionHandler();
|
|
32
|
+
this._checkPromiseAndWarn();
|
|
52
33
|
}
|
|
53
34
|
}
|
|
54
35
|
/**
|
|
55
|
-
*
|
|
36
|
+
* Polyfill the global promise instance with one we can be sure that we can attach the tracking to.
|
|
37
|
+
*
|
|
38
|
+
* In newer RN versions >=0.63, the global promise is not the same reference as the one imported from the promise library.
|
|
39
|
+
* This is due to a version mismatch between promise versions.
|
|
40
|
+
* Originally we tried a solution where we would have you put a package resolution to ensure the promise instances match. However,
|
|
41
|
+
* - Using a package resolution requires the you to manually troubleshoot.
|
|
42
|
+
* - The package resolution fix no longer works with 0.67 on iOS Hermes.
|
|
43
|
+
*/
|
|
44
|
+
_polyfillPromise() {
|
|
45
|
+
/* eslint-disable import/no-extraneous-dependencies,@typescript-eslint/no-var-requires*/
|
|
46
|
+
const { polyfillGlobal, } = require("react-native/Libraries/Utilities/PolyfillFunctions");
|
|
47
|
+
// Below, we follow the exact way React Native initializes its promise library, and we globally replace it.
|
|
48
|
+
const Promise = require("promise/setimmediate/es6-extensions");
|
|
49
|
+
// As of RN 0.67 only done and finally are used
|
|
50
|
+
require("promise/setimmediate/done");
|
|
51
|
+
require("promise/setimmediate/finally");
|
|
52
|
+
polyfillGlobal("Promise", () => Promise);
|
|
53
|
+
/* eslint-enable import/no-extraneous-dependencies,@typescript-eslint/no-var-requires */
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Attach the unhandled rejection handler
|
|
56
57
|
*/
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
_attachUnhandledRejectionHandler() {
|
|
59
|
+
const tracking = require("promise/setimmediate/rejection-tracking");
|
|
60
|
+
const promiseRejectionTrackingOptions = {
|
|
59
61
|
onUnhandled: (id, rejection = {}) => {
|
|
60
62
|
// eslint-disable-next-line no-console
|
|
61
63
|
console.warn(`Possible Unhandled Promise Rejection (id: ${id}):\n${rejection}`);
|
|
@@ -67,14 +69,29 @@ export class ReactNativeErrorHandlers {
|
|
|
67
69
|
`"Possible Unhandled Promise Rejection (id: ${id}):"`);
|
|
68
70
|
},
|
|
69
71
|
};
|
|
72
|
+
tracking.enable({
|
|
73
|
+
allRejections: true,
|
|
74
|
+
onUnhandled: (id, error) => {
|
|
75
|
+
if (__DEV__) {
|
|
76
|
+
promiseRejectionTrackingOptions.onUnhandled(id, error);
|
|
77
|
+
}
|
|
78
|
+
getCurrentHub().captureException(error, {
|
|
79
|
+
data: { id },
|
|
80
|
+
originalException: error,
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
onHandled: (id) => {
|
|
84
|
+
promiseRejectionTrackingOptions.onHandled(id);
|
|
85
|
+
},
|
|
86
|
+
});
|
|
70
87
|
}
|
|
71
88
|
/**
|
|
72
89
|
* Checks if the promise is the same one or not, if not it will warn the user
|
|
73
90
|
*/
|
|
74
|
-
|
|
91
|
+
_checkPromiseAndWarn() {
|
|
75
92
|
try {
|
|
76
93
|
// eslint-disable-next-line @typescript-eslint/no-var-requires,import/no-extraneous-dependencies
|
|
77
|
-
const Promise = require("promise/setimmediate/
|
|
94
|
+
const Promise = require("promise/setimmediate/es6-extensions");
|
|
78
95
|
const _global = getGlobalObject();
|
|
79
96
|
if (Promise !== _global.Promise) {
|
|
80
97
|
logger.warn("Unhandled promise rejections will not be caught by Sentry. Read about how to fix this on our troubleshooting page.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnativeerrorhandlers.js","sourceRoot":"","sources":["../../../src/js/integrations/reactnativeerrorhandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventFromException } from \"@sentry/browser\";\nimport { getCurrentHub } from \"@sentry/core\";\nimport { Integration, Severity } from \"@sentry/types\";\nimport { addExceptionMechanism, getGlobalObject, logger } from \"@sentry/utils\";\n\nimport { ReactNativeClient } from \"../client\";\n\n/** ReactNativeErrorHandlers Options */\ninterface ReactNativeErrorHandlersOptions {\n onerror: boolean;\n onunhandledrejection: boolean;\n}\n\ninterface PromiseRejectionTrackingOptions {\n onUnhandled: (id: string, error: unknown) => void;\n onHandled: (id: string) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const global: any;\n\n/** ReactNativeErrorHandlers Integration */\nexport class ReactNativeErrorHandlers implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = \"ReactNativeErrorHandlers\";\n\n /**\n * @inheritDoc\n */\n public name: string = ReactNativeErrorHandlers.id;\n\n /** ReactNativeOptions */\n private readonly _options: ReactNativeErrorHandlersOptions;\n\n /** Constructor */\n public constructor(options?: ReactNativeErrorHandlersOptions) {\n this._options = {\n onerror: true,\n onunhandledrejection: true,\n ...options,\n };\n }\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n this._handleUnhandledRejections();\n this._handleOnError();\n }\n\n /**\n * Handle Promises\n */\n private _handleUnhandledRejections(): void {\n if (this._options.onunhandledrejection) {\n /*\n In newer RN versions >=0.63, the global promise is not the same reference as the one imported from the promise library.\n This is due to a version mismatch between promise versions. The version will need to be fixed with a package resolution.\n We first run a check and show a warning if needed.\n */\n this._checkPromiseVersion();\n\n const tracking: {\n disable: () => void;\n enable: (arg: unknown) => void;\n // eslint-disable-next-line @typescript-eslint/no-var-requires,import/no-extraneous-dependencies\n } = require(\"promise/setimmediate/rejection-tracking\");\n\n const promiseRejectionTrackingOptions = this._getPromiseRejectionTrackingOptions();\n\n tracking.disable();\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: Error) => {\n if (__DEV__) {\n promiseRejectionTrackingOptions.onUnhandled(id, error);\n }\n\n getCurrentHub().captureException(error, {\n data: { id },\n originalException: error,\n });\n },\n onHandled: (id: string) => {\n promiseRejectionTrackingOptions.onHandled(id);\n },\n });\n }\n }\n /**\n * Gets the promise rejection handlers, tries to get React Native's default one but otherwise will default to console.logging unhandled rejections.\n */\n private _getPromiseRejectionTrackingOptions(): PromiseRejectionTrackingOptions {\n return {\n onUnhandled: (id, rejection = {}) => {\n // eslint-disable-next-line no-console\n console.warn(\n `Possible Unhandled Promise Rejection (id: ${id}):\\n${rejection}`\n );\n },\n onHandled: (id) => {\n // eslint-disable-next-line no-console\n console.warn(\n `Promise Rejection Handled (id: ${id})\\n` +\n \"This means you can ignore any previous messages of the form \" +\n `\"Possible Unhandled Promise Rejection (id: ${id}):\"`\n );\n },\n };\n }\n /**\n * Checks if the promise is the same one or not, if not it will warn the user\n */\n private _checkPromiseVersion(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires,import/no-extraneous-dependencies\n const Promise = require(\"promise/setimmediate/core\");\n\n const _global = getGlobalObject<{ Promise: typeof Promise }>();\n\n if (Promise !== _global.Promise) {\n logger.warn(\n \"Unhandled promise rejections will not be caught by Sentry. Read about how to fix this on our troubleshooting page.\"\n );\n } else {\n logger.log(\"Unhandled promise rejections will be caught by Sentry.\");\n }\n } catch (e) {\n // Do Nothing\n logger.warn(\n \"Unhandled promise rejections will not be caught by Sentry. Read about how to fix this on our troubleshooting page.\"\n );\n }\n }\n /**\n * Handle errors\n */\n private _handleOnError(): void {\n if (this._options.onerror) {\n let handlingFatal = false;\n\n const defaultHandler =\n ErrorUtils.getGlobalHandler && ErrorUtils.getGlobalHandler();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ErrorUtils.setGlobalHandler(async (error: any, isFatal?: boolean) => {\n // We want to handle fatals, but only in production mode.\n const shouldHandleFatal = isFatal && !__DEV__;\n if (shouldHandleFatal) {\n if (handlingFatal) {\n logger.log(\n \"Encountered multiple fatals in a row. The latest:\",\n error\n );\n return;\n }\n handlingFatal = true;\n }\n\n const currentHub = getCurrentHub();\n const client = currentHub.getClient<ReactNativeClient>();\n\n if (!client) {\n logger.error(\n \"Sentry client is missing, the error event might be lost.\",\n error\n );\n\n // If there is no client something is fishy, anyway we call the default handler\n defaultHandler(error, isFatal);\n\n return;\n }\n\n const options = client.getOptions();\n\n const event = await eventFromException(options, error, {\n originalException: error,\n });\n\n if (isFatal) {\n event.level = Severity.Fatal;\n\n addExceptionMechanism(event, {\n handled: false,\n type: \"onerror\",\n });\n }\n\n currentHub.captureEvent(event);\n\n if (!__DEV__) {\n void client.flush(options.shutdownTimeout || 2000).then(() => {\n defaultHandler(error, isFatal);\n });\n } else {\n // If in dev, we call the default handler anyway and hope the error will be sent\n // Just for a better dev experience\n defaultHandler(error, isFatal);\n }\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"reactnativeerrorhandlers.js","sourceRoot":"","sources":["../../../src/js/integrations/reactnativeerrorhandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventFromException } from \"@sentry/browser\";\nimport { getCurrentHub } from \"@sentry/core\";\nimport { Integration, Severity } from \"@sentry/types\";\nimport { addExceptionMechanism, getGlobalObject, logger } from \"@sentry/utils\";\n\nimport { ReactNativeClient } from \"../client\";\n\n/** ReactNativeErrorHandlers Options */\ninterface ReactNativeErrorHandlersOptions {\n onerror: boolean;\n onunhandledrejection: boolean;\n patchGlobalPromise: boolean;\n}\n\ninterface PromiseRejectionTrackingOptions {\n onUnhandled: (id: string, error: unknown) => void;\n onHandled: (id: string) => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const global: any;\n\n/** ReactNativeErrorHandlers Integration */\nexport class ReactNativeErrorHandlers implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = \"ReactNativeErrorHandlers\";\n\n /**\n * @inheritDoc\n */\n public name: string = ReactNativeErrorHandlers.id;\n\n /** ReactNativeOptions */\n private readonly _options: ReactNativeErrorHandlersOptions;\n\n /** Constructor */\n public constructor(options?: Partial<ReactNativeErrorHandlersOptions>) {\n this._options = {\n onerror: true,\n onunhandledrejection: true,\n patchGlobalPromise: true,\n ...options,\n };\n }\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n this._handleUnhandledRejections();\n this._handleOnError();\n }\n\n /**\n * Handle Promises\n */\n private _handleUnhandledRejections(): void {\n if (this._options.onunhandledrejection) {\n if (this._options.patchGlobalPromise) {\n this._polyfillPromise();\n }\n\n this._attachUnhandledRejectionHandler();\n this._checkPromiseAndWarn();\n }\n }\n /**\n * Polyfill the global promise instance with one we can be sure that we can attach the tracking to.\n *\n * In newer RN versions >=0.63, the global promise is not the same reference as the one imported from the promise library.\n * This is due to a version mismatch between promise versions.\n * Originally we tried a solution where we would have you put a package resolution to ensure the promise instances match. However,\n * - Using a package resolution requires the you to manually troubleshoot.\n * - The package resolution fix no longer works with 0.67 on iOS Hermes.\n */\n private _polyfillPromise(): void {\n /* eslint-disable import/no-extraneous-dependencies,@typescript-eslint/no-var-requires*/\n const {\n polyfillGlobal,\n } = require(\"react-native/Libraries/Utilities/PolyfillFunctions\");\n\n // Below, we follow the exact way React Native initializes its promise library, and we globally replace it.\n const Promise = require(\"promise/setimmediate/es6-extensions\");\n\n // As of RN 0.67 only done and finally are used\n require(\"promise/setimmediate/done\");\n require(\"promise/setimmediate/finally\");\n\n polyfillGlobal(\"Promise\", () => Promise);\n /* eslint-enable import/no-extraneous-dependencies,@typescript-eslint/no-var-requires */\n }\n /**\n * Attach the unhandled rejection handler\n */\n private _attachUnhandledRejectionHandler(): void {\n const tracking: {\n disable: () => void;\n enable: (arg: unknown) => void;\n // eslint-disable-next-line import/no-extraneous-dependencies,@typescript-eslint/no-var-requires\n } = require(\"promise/setimmediate/rejection-tracking\");\n\n const promiseRejectionTrackingOptions: PromiseRejectionTrackingOptions = {\n onUnhandled: (id, rejection = {}) => {\n // eslint-disable-next-line no-console\n console.warn(\n `Possible Unhandled Promise Rejection (id: ${id}):\\n${rejection}`\n );\n },\n onHandled: (id) => {\n // eslint-disable-next-line no-console\n console.warn(\n `Promise Rejection Handled (id: ${id})\\n` +\n \"This means you can ignore any previous messages of the form \" +\n `\"Possible Unhandled Promise Rejection (id: ${id}):\"`\n );\n },\n };\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: Error) => {\n if (__DEV__) {\n promiseRejectionTrackingOptions.onUnhandled(id, error);\n }\n\n getCurrentHub().captureException(error, {\n data: { id },\n originalException: error,\n });\n },\n onHandled: (id: string) => {\n promiseRejectionTrackingOptions.onHandled(id);\n },\n });\n }\n /**\n * Checks if the promise is the same one or not, if not it will warn the user\n */\n private _checkPromiseAndWarn(): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires,import/no-extraneous-dependencies\n const Promise = require(\"promise/setimmediate/es6-extensions\");\n\n const _global = getGlobalObject<{ Promise: typeof Promise }>();\n\n if (Promise !== _global.Promise) {\n logger.warn(\n \"Unhandled promise rejections will not be caught by Sentry. Read about how to fix this on our troubleshooting page.\"\n );\n } else {\n logger.log(\"Unhandled promise rejections will be caught by Sentry.\");\n }\n } catch (e) {\n // Do Nothing\n logger.warn(\n \"Unhandled promise rejections will not be caught by Sentry. Read about how to fix this on our troubleshooting page.\"\n );\n }\n }\n /**\n * Handle errors\n */\n private _handleOnError(): void {\n if (this._options.onerror) {\n let handlingFatal = false;\n\n const defaultHandler =\n ErrorUtils.getGlobalHandler && ErrorUtils.getGlobalHandler();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ErrorUtils.setGlobalHandler(async (error: any, isFatal?: boolean) => {\n // We want to handle fatals, but only in production mode.\n const shouldHandleFatal = isFatal && !__DEV__;\n if (shouldHandleFatal) {\n if (handlingFatal) {\n logger.log(\n \"Encountered multiple fatals in a row. The latest:\",\n error\n );\n return;\n }\n handlingFatal = true;\n }\n\n const currentHub = getCurrentHub();\n const client = currentHub.getClient<ReactNativeClient>();\n\n if (!client) {\n logger.error(\n \"Sentry client is missing, the error event might be lost.\",\n error\n );\n\n // If there is no client something is fishy, anyway we call the default handler\n defaultHandler(error, isFatal);\n\n return;\n }\n\n const options = client.getOptions();\n\n const event = await eventFromException(options, error, {\n originalException: error,\n });\n\n if (isFatal) {\n event.level = Severity.Fatal;\n\n addExceptionMechanism(event, {\n handled: false,\n type: \"onerror\",\n });\n }\n\n currentHub.captureEvent(event);\n\n if (!__DEV__) {\n void client.flush(options.shutdownTimeout || 2000).then(() => {\n defaultHandler(error, isFatal);\n });\n } else {\n // If in dev, we call the default handler anyway and hope the error will be sent\n // Just for a better dev experience\n defaultHandler(error, isFatal);\n }\n });\n }\n }\n}\n"]}
|
package/dist/js/options.d.ts
CHANGED
|
@@ -71,6 +71,15 @@ export interface ReactNativeOptions extends BrowserOptions {
|
|
|
71
71
|
* @deprecated Use `Sentry.configureScope(...)`
|
|
72
72
|
*/
|
|
73
73
|
initialScope?: CaptureContext;
|
|
74
|
+
/**
|
|
75
|
+
* When enabled, Sentry will overwrite the global Promise instance to ensure that unhandled rejections are correctly tracked.
|
|
76
|
+
* If you run into issues with Promise polyfills such as `core-js`, make sure you polyfill after Sentry is initialized.
|
|
77
|
+
* Read more at https://docs.sentry.io/platforms/react-native/troubleshooting/#unhandled-promise-rejections
|
|
78
|
+
*
|
|
79
|
+
* When disabled, this option will not disable unhandled rejection tracking. Set `onunhandledrejection: false` on the `ReactNativeErrorHandlers` integration instead.
|
|
80
|
+
* @default true
|
|
81
|
+
*/
|
|
82
|
+
patchGlobalPromise?: boolean;
|
|
74
83
|
}
|
|
75
84
|
export interface ReactNativeWrapperOptions {
|
|
76
85
|
/** 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;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,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;IACL,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,YAAY,CAAC,EAAE,cAAc,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;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,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;IACL,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAEpC;;;OAGG;IACH,YAAY,CAAC,EAAE,cAAc,CAAC;IAE9B;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;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\";\nimport { CaptureContext } from \"@sentry/types/dist/scope\";\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 /**\n * Set data to the inital scope\n * @deprecated Use `Sentry.configureScope(...)`\n */\n initialScope?: CaptureContext;\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\";\nimport { CaptureContext } from \"@sentry/types/dist/scope\";\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 /**\n * Set data to the inital scope\n * @deprecated Use `Sentry.configureScope(...)`\n */\n initialScope?: CaptureContext;\n\n /**\n * When enabled, Sentry will overwrite the global Promise instance to ensure that unhandled rejections are correctly tracked.\n * If you run into issues with Promise polyfills such as `core-js`, make sure you polyfill after Sentry is initialized.\n * Read more at https://docs.sentry.io/platforms/react-native/troubleshooting/#unhandled-promise-rejections\n *\n * When disabled, this option will not disable unhandled rejection tracking. Set `onunhandledrejection: false` on the `ReactNativeErrorHandlers` integration instead.\n * @default true\n */\n patchGlobalPromise?: 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;AAmB1E;;GAEG;AACH,wBAAgB,IAAI,CAAC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAwE5D;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
|
@@ -21,6 +21,7 @@ const DEFAULT_OPTIONS = {
|
|
|
21
21
|
autoInitializeNativeSdk: true,
|
|
22
22
|
enableAutoPerformanceTracking: true,
|
|
23
23
|
enableOutOfMemoryTracking: true,
|
|
24
|
+
patchGlobalPromise: true,
|
|
24
25
|
};
|
|
25
26
|
/**
|
|
26
27
|
* Inits the SDK and returns the final options.
|
|
@@ -34,7 +35,9 @@ export function init(passedOptions) {
|
|
|
34
35
|
typeof options.tracesSampleRate !== "undefined";
|
|
35
36
|
if (options.defaultIntegrations === undefined) {
|
|
36
37
|
options.defaultIntegrations = [
|
|
37
|
-
new ReactNativeErrorHandlers(
|
|
38
|
+
new ReactNativeErrorHandlers({
|
|
39
|
+
patchGlobalPromise: options.patchGlobalPromise,
|
|
40
|
+
}),
|
|
38
41
|
new Release(),
|
|
39
42
|
...defaultIntegrations.filter((i) => !IGNORED_DEFAULT_INTEGRATIONS.includes(i.name)),
|
|
40
43
|
new EventOrigin(),
|
package/dist/js/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/js/sdk.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,wBAAwB,EACxB,OAAO,EACP,OAAO,GACR,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpE,MAAM,4BAA4B,GAAG;IACnC,gBAAgB;IAChB,UAAU;CACX,CAAC;AACF,MAAM,eAAe,GAAuB;IAC1C,YAAY,EAAE,IAAI;IAClB,yBAAyB,EAAE,IAAI;IAC/B,kBAAkB,EAAE,IAAI;IACxB,uBAAuB,EAAE,IAAI;IAC7B,6BAA6B,EAAE,IAAI;IACnC,yBAAyB,EAAE,IAAI;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,aAAiC;IACpD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAEzB,MAAM,OAAO,mCACR,eAAe,GACf,aAAa,CACjB,CAAC;IAEF,mHAAmH;IACnH,MAAM,cAAc,GAClB,OAAO,OAAO,CAAC,aAAa,KAAK,WAAW;QAC5C,OAAO,OAAO,CAAC,gBAAgB,KAAK,WAAW,CAAC;IAElD,IAAI,OAAO,CAAC,mBAAmB,KAAK,SAAS,EAAE;QAC7C,OAAO,CAAC,mBAAmB,GAAG;YAC5B,IAAI,wBAAwB,EAAE;YAC9B,IAAI,OAAO,EAAE;YACb,GAAG,mBAAmB,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CACtD;YACD,IAAI,WAAW,EAAE;YACjB,IAAI,OAAO,EAAE;SACd,CAAC;QAEF,IAAI,OAAO,EAAE;YACX,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC;SAC3D;QAED,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAC9B,IAAI,aAAa,CAAC;YAChB,QAAQ,EAAE,CAAC,KAAiB,EAAE,EAAE;gBAC9B,IAAI,KAAK,CAAC,QAAQ,EAAE;oBAClB,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;yBAC5B,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;yBACzB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;yBAC3B,OAAO,CAAC,qCAAqC,EAAE,EAAE,CAAC,CAAC;oBAEtD,IACE,KAAK,CAAC,QAAQ,KAAK,eAAe;wBAClC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAC3B;wBACA,MAAM,SAAS,GAAG,QAAQ,CAAC;wBAC3B,wCAAwC;wBACxC,KAAK,CAAC,QAAQ;4BACZ,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gCAC/B,CAAC,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE;gCACjC,CAAC,CAAC,GAAG,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;qBACxC;iBACF;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;SACF,CAAC,CACH,CAAC;QACF,IAAI,OAAO,CAAC,YAAY,EAAE;YACxB,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;SACvD;QACD,IAAI,cAAc,EAAE;YAClB,IAAI,OAAO,CAAC,6BAA6B,EAAE;gBACzC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;aAC5D;SACF;KACF;IAED,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAExC,yGAAyG;IACzG,IAAI,eAAe,EAAO,CAAC,cAAc,EAAE;QACzC,aAAa,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KAC1C;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,aAAqC,EACrC,OAAmC;;IAEnC,MAAM,kBAAkB,GAAG,aAAa,EAAE,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAC9E,IAAI,kBAAkB,EAAE;QACtB,kBAAkB,CAAC,uBAAuB,GAAG,IAAI,CAAC;KACnD;IAED,MAAM,aAAa,mCACd,OAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,mCAAI,EAAE,CAAC,KACjC,IAAI,QAAE,aAAa,CAAC,WAAW,mCAAI,MAAM,GAC1C,CAAC;IAEF,MAAM,OAAO,GAAgB,CAAC,QAAQ,EAAE,EAAE;;QACxC,OAAO,CACL,CAAC,kBAAkB,CAAC,IAAI,OAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,uBAAuB,mCAAI,EAAE,CAAC,CAAC,CAC/D;QAAA,CAAC,mBAAmB,CAAC,IAAI,aAAa,CAAC,CACrC;UAAA,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,EAC9B;QAAA,EAAE,mBAAmB,CACvB;MAAA,EAAE,kBAAkB,CAAC,CACtB,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC,SAAS,EAAqB,CAAC;IAC9D,IAAI,MAAM,EAAE;QACV,MAAM,CAAC,WAAW,EAAE,CAAC;KACtB;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAgB,KAAK;;QACzB,IAAI;YACF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC,SAAS,EAAqB,CAAC;YAE9D,IAAI,MAAM,EAAE;gBACV,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBAEpC,OAAO,MAAM,CAAC;aACf;YACD,oCAAoC;SACrC;QAAC,OAAO,CAAC,EAAE,GAAE;QAEd,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEjD,OAAO,KAAK,CAAC;IACf,CAAC;CAAA;AAED;;GAEG;AACH,MAAM,UAAgB,KAAK;;QACzB,IAAI;YACF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC,SAAS,EAAqB,CAAC;YAE9D,IAAI,MAAM,EAAE;gBACV,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;aACtB;SACF;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;SACzC;IACH,CAAC;CAAA","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
|
+
{"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 patchGlobalPromise: 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 patchGlobalPromise: options.patchGlobalPromise,\n }),\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"]}
|
|
@@ -53,6 +53,10 @@ export declare class ReactNavigationInstrumentation extends InternalRoutingInstr
|
|
|
53
53
|
private _pushRecentRouteKey;
|
|
54
54
|
/** Cancels the latest transaction so it does not get sent to Sentry. */
|
|
55
55
|
private _discardLatestTransaction;
|
|
56
|
+
/**
|
|
57
|
+
*
|
|
58
|
+
*/
|
|
59
|
+
private _clearStateChangeTimeout;
|
|
56
60
|
}
|
|
57
61
|
/**
|
|
58
62
|
* Backwards compatibility alias for ReactNavigationInstrumentation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactnavigation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reactnavigation.d.ts","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAOlC,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;IAqBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAoFtB,sGAAsG;IACtG,OAAO,CAAC,mBAAmB,CAQzB;IAEF,wEAAwE;IACxE,OAAO,CAAC,yBAAyB;IAQjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAMjC;AAED;;;GAGG;AACH,eAAO,MAAM,gCAAgC,uCAAiC,CAAC;AAE/E,eAAO,MAAM,yBAAyB;;;;;;;CAQrC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getGlobalObject, logger } from "@sentry/utils";
|
|
2
2
|
import { InternalRoutingInstrumentation, } from "./routingInstrumentation";
|
|
3
|
+
import { getBlankTransactionContext } from "./utils";
|
|
3
4
|
const defaultOptions = {
|
|
4
5
|
routeChangeTimeoutMs: 1000,
|
|
5
6
|
};
|
|
@@ -93,7 +94,12 @@ export class ReactNavigationInstrumentation extends InternalRoutingInstrumentati
|
|
|
93
94
|
* and gets the route information from there, @see _onStateChange
|
|
94
95
|
*/
|
|
95
96
|
_onDispatch() {
|
|
96
|
-
this._latestTransaction
|
|
97
|
+
if (this._latestTransaction) {
|
|
98
|
+
logger.log(`[ReactNavigationInstrumentation] A transaction was detected that turned out to be a noop, discarding.`);
|
|
99
|
+
this._discardLatestTransaction();
|
|
100
|
+
this._clearStateChangeTimeout();
|
|
101
|
+
}
|
|
102
|
+
this._latestTransaction = this.onRouteWillChange(getBlankTransactionContext(ReactNavigationInstrumentation.instrumentationName));
|
|
97
103
|
this._stateChangeTimeout = setTimeout(this._discardLatestTransaction.bind(this), this._options.routeChangeTimeoutMs);
|
|
98
104
|
}
|
|
99
105
|
/**
|
|
@@ -109,46 +115,46 @@ export class ReactNavigationInstrumentation extends InternalRoutingInstrumentati
|
|
|
109
115
|
}
|
|
110
116
|
const route = this._navigationContainer.getCurrentRoute();
|
|
111
117
|
if (route) {
|
|
112
|
-
if (this._latestTransaction
|
|
113
|
-
(!previousRoute || previousRoute.key !== route.key)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
// Clear the timeout so the transaction does not get cancelled.
|
|
141
|
-
if (typeof this._stateChangeTimeout !== "undefined") {
|
|
142
|
-
clearTimeout(this._stateChangeTimeout);
|
|
143
|
-
this._stateChangeTimeout = undefined;
|
|
118
|
+
if (this._latestTransaction) {
|
|
119
|
+
if (!previousRoute || previousRoute.key !== route.key) {
|
|
120
|
+
const originalContext = this._latestTransaction.toContext();
|
|
121
|
+
const routeHasBeenSeen = this._recentRouteKeys.includes(route.key);
|
|
122
|
+
const data = Object.assign(Object.assign({}, originalContext.data), { route: {
|
|
123
|
+
name: route.name,
|
|
124
|
+
key: route.key,
|
|
125
|
+
params: (_a = route.params) !== null && _a !== void 0 ? _a : {},
|
|
126
|
+
hasBeenSeen: routeHasBeenSeen,
|
|
127
|
+
}, previousRoute: previousRoute
|
|
128
|
+
? {
|
|
129
|
+
name: previousRoute.name,
|
|
130
|
+
key: previousRoute.key,
|
|
131
|
+
params: (_b = previousRoute.params) !== null && _b !== void 0 ? _b : {},
|
|
132
|
+
}
|
|
133
|
+
: null });
|
|
134
|
+
const updatedContext = Object.assign(Object.assign({}, originalContext), { name: route.name, tags: Object.assign(Object.assign({}, originalContext.tags), { "routing.route.name": route.name }), data });
|
|
135
|
+
let finalContext = (_c = this._beforeNavigate) === null || _c === void 0 ? void 0 : _c.call(this, updatedContext);
|
|
136
|
+
// This block is to catch users not returning a transaction context
|
|
137
|
+
if (!finalContext) {
|
|
138
|
+
logger.error(`[ReactNavigationV5Instrumentation] beforeNavigate returned ${finalContext}, return context.sampled = false to not send transaction.`);
|
|
139
|
+
finalContext = Object.assign(Object.assign({}, updatedContext), { sampled: false });
|
|
140
|
+
}
|
|
141
|
+
// Note: finalContext.sampled will be false at this point only if the user sets it to be so in beforeNavigate.
|
|
142
|
+
if (finalContext.sampled === false) {
|
|
143
|
+
logger.log(`[ReactNavigationV5Instrumentation] Will not send transaction "${finalContext.name}" due to beforeNavigate.`);
|
|
144
144
|
}
|
|
145
|
+
else {
|
|
146
|
+
// Clear the timeout so the transaction does not get cancelled.
|
|
147
|
+
this._clearStateChangeTimeout();
|
|
148
|
+
}
|
|
149
|
+
this._latestTransaction.updateWithContext(finalContext);
|
|
150
|
+
(_d = this._onConfirmRoute) === null || _d === void 0 ? void 0 : _d.call(this, finalContext);
|
|
145
151
|
}
|
|
146
|
-
this.
|
|
147
|
-
|
|
152
|
+
this._pushRecentRouteKey(route.key);
|
|
153
|
+
this._latestRoute = route;
|
|
148
154
|
}
|
|
149
|
-
this._pushRecentRouteKey(route.key);
|
|
150
|
-
this._latestRoute = route;
|
|
151
155
|
}
|
|
156
|
+
// Clear the latest transaction as it has been handled.
|
|
157
|
+
this._latestTransaction = undefined;
|
|
152
158
|
}
|
|
153
159
|
/** Cancels the latest transaction so it does not get sent to Sentry. */
|
|
154
160
|
_discardLatestTransaction() {
|
|
@@ -158,6 +164,15 @@ export class ReactNavigationInstrumentation extends InternalRoutingInstrumentati
|
|
|
158
164
|
this._latestTransaction = undefined;
|
|
159
165
|
}
|
|
160
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
*
|
|
169
|
+
*/
|
|
170
|
+
_clearStateChangeTimeout() {
|
|
171
|
+
if (typeof this._stateChangeTimeout !== "undefined") {
|
|
172
|
+
clearTimeout(this._stateChangeTimeout);
|
|
173
|
+
this._stateChangeTimeout = undefined;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
161
176
|
}
|
|
162
177
|
ReactNavigationInstrumentation.instrumentationName = "react-navigation-v5";
|
|
163
178
|
/**
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"reactnavigation.js","sourceRoot":"","sources":["../../../src/js/tracing/reactnavigation.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\nimport { 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\";\nimport { getBlankTransactionContext } from \"./utils\";\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 if (this._latestTransaction) {\n logger.log(\n `[ReactNavigationInstrumentation] A transaction was detected that turned out to be a noop, discarding.`\n );\n this._discardLatestTransaction();\n this._clearStateChangeTimeout();\n }\n\n this._latestTransaction = this.onRouteWillChange(\n getBlankTransactionContext(\n ReactNavigationInstrumentation.instrumentationName\n )\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 _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 (this._latestTransaction) {\n if (!previousRoute || previousRoute.key !== route.key) {\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 this._clearStateChangeTimeout();\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 // Clear the latest transaction as it has been handled.\n this._latestTransaction = undefined;\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 */\n private _clearStateChangeTimeout(): void {\n if (typeof this._stateChangeTimeout !== \"undefined\") {\n clearTimeout(this._stateChangeTimeout);\n this._stateChangeTimeout = 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"]}
|
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,kBAAkB,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,eAAe,CAAC","sourcesContent":["export const SDK_NAME = \"sentry.javascript.react-native\";\nexport const SDK_VERSION = \"3.2.14-beta.1\";\n"]}
|
package/ios/RNSentry.m
CHANGED
|
@@ -140,19 +140,23 @@ RCT_EXPORT_METHOD(fetchNativeDeviceContexts:(RCTPromiseResolveBlock)resolve
|
|
|
140
140
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
141
141
|
{
|
|
142
142
|
NSLog(@"Bridge call to: deviceContexts");
|
|
143
|
+
NSMutableDictionary<NSString *, id> *contexts = [NSMutableDictionary new];
|
|
143
144
|
// Temp work around until sorted out this API in sentry-cocoa.
|
|
144
145
|
// TODO: If the callback isnt' executed the promise wouldn't be resolved.
|
|
145
146
|
[SentrySDK configureScope:^(SentryScope * _Nonnull scope) {
|
|
146
147
|
NSDictionary<NSString *, id> *serializedScope = [scope serialize];
|
|
147
148
|
// Scope serializes as 'context' instead of 'contexts' as it does for the event.
|
|
148
|
-
NSDictionary<NSString *, id> *
|
|
149
|
+
NSDictionary<NSString *, id> *tempContexts = [serializedScope valueForKey:@"context"];
|
|
150
|
+
if (tempContexts != nil) {
|
|
151
|
+
[contexts addEntriesFromDictionary:tempContexts];
|
|
152
|
+
}
|
|
149
153
|
#if DEBUG
|
|
150
154
|
NSData *data = [NSJSONSerialization dataWithJSONObject:contexts options:0 error:nil];
|
|
151
155
|
NSString *debugContext = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
|
152
156
|
NSLog(@"Contexts: %@", debugContext);
|
|
153
157
|
#endif
|
|
154
|
-
resolve(contexts);
|
|
155
158
|
}];
|
|
159
|
+
resolve(contexts);
|
|
156
160
|
}
|
|
157
161
|
|
|
158
162
|
RCT_EXPORT_METHOD(fetchNativeAppStart:(RCTPromiseResolveBlock)resolve
|
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.14-beta.1",
|
|
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",
|
|
@@ -41,23 +41,23 @@
|
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@sentry/browser": "6.12.0",
|
|
44
|
-
"@sentry/cli": "^1.
|
|
44
|
+
"@sentry/cli": "^1.72.0",
|
|
45
45
|
"@sentry/core": "6.12.0",
|
|
46
46
|
"@sentry/hub": "6.12.0",
|
|
47
47
|
"@sentry/integrations": "6.12.0",
|
|
48
48
|
"@sentry/react": "6.12.0",
|
|
49
49
|
"@sentry/tracing": "6.12.0",
|
|
50
50
|
"@sentry/types": "6.12.0",
|
|
51
|
-
"@sentry/utils": "6.12.0"
|
|
51
|
+
"@sentry/utils": "6.12.0",
|
|
52
|
+
"@sentry/wizard": "^1.2.17"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
55
|
"@sentry-internal/eslint-config-sdk": "6.12.0",
|
|
55
56
|
"@sentry-internal/eslint-plugin-sdk": "6.12.0",
|
|
56
57
|
"@sentry/typescript": "^5.20.0",
|
|
57
|
-
"@sentry/wizard": "^1.2.15",
|
|
58
58
|
"@types/jest": "^26.0.15",
|
|
59
59
|
"@types/react": "^16.9.49",
|
|
60
|
-
"@types/react-native": "^0.
|
|
60
|
+
"@types/react-native": "^0.66.11",
|
|
61
61
|
"babel-jest": "^26.1.0",
|
|
62
62
|
"eslint": "^7.6.0",
|
|
63
63
|
"eslint-plugin-react": "^7.20.6",
|