@sentry/react-native 5.7.0 → 5.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/RNSentry.podspec +9 -4
  3. package/android/build.gradle +1 -1
  4. package/android/src/main/java/io/sentry/react/MapConverter.java +134 -0
  5. package/android/src/main/java/io/sentry/react/RNSentryModuleImpl.java +103 -15
  6. package/android/src/newarch/java/io/sentry/react/RNSentryModule.java +14 -2
  7. package/android/src/oldarch/java/io/sentry/react/RNSentryModule.java +13 -2
  8. package/dist/js/NativeRNSentry.d.ts +13 -4
  9. package/dist/js/NativeRNSentry.d.ts.map +1 -1
  10. package/dist/js/NativeRNSentry.js.map +1 -1
  11. package/dist/js/client.d.ts.map +1 -1
  12. package/dist/js/client.js +1 -0
  13. package/dist/js/client.js.map +1 -1
  14. package/dist/js/integrations/devicecontext.js +5 -5
  15. package/dist/js/integrations/devicecontext.js.map +1 -1
  16. package/dist/js/integrations/index.d.ts +1 -0
  17. package/dist/js/integrations/index.d.ts.map +1 -1
  18. package/dist/js/integrations/index.js +1 -0
  19. package/dist/js/integrations/index.js.map +1 -1
  20. package/dist/js/integrations/reactnativeerrorhandlers.d.ts +5 -0
  21. package/dist/js/integrations/reactnativeerrorhandlers.d.ts.map +1 -1
  22. package/dist/js/integrations/reactnativeerrorhandlers.js +31 -6
  23. package/dist/js/integrations/reactnativeerrorhandlers.js.map +1 -1
  24. package/dist/js/integrations/rewriteframes.d.ts +2 -0
  25. package/dist/js/integrations/rewriteframes.d.ts.map +1 -1
  26. package/dist/js/integrations/rewriteframes.js +2 -2
  27. package/dist/js/integrations/rewriteframes.js.map +1 -1
  28. package/dist/js/integrations/sdkinfo.d.ts.map +1 -1
  29. package/dist/js/integrations/sdkinfo.js +1 -2
  30. package/dist/js/integrations/sdkinfo.js.map +1 -1
  31. package/dist/js/profiling/cache.d.ts +9 -0
  32. package/dist/js/profiling/cache.d.ts.map +1 -0
  33. package/dist/js/profiling/cache.js +3 -0
  34. package/dist/js/profiling/cache.js.map +1 -0
  35. package/dist/js/profiling/convertHermesProfile.d.ts +27 -0
  36. package/dist/js/profiling/convertHermesProfile.d.ts.map +1 -0
  37. package/dist/js/profiling/convertHermesProfile.js +141 -0
  38. package/dist/js/profiling/convertHermesProfile.js.map +1 -0
  39. package/dist/js/profiling/hermes.d.ts +52 -0
  40. package/dist/js/profiling/hermes.d.ts.map +1 -0
  41. package/dist/js/profiling/hermes.js +35 -0
  42. package/dist/js/profiling/hermes.js.map +1 -0
  43. package/dist/js/profiling/integration.d.ts +36 -0
  44. package/dist/js/profiling/integration.d.ts.map +1 -0
  45. package/dist/js/profiling/integration.js +151 -0
  46. package/dist/js/profiling/integration.js.map +1 -0
  47. package/dist/js/profiling/types.d.ts +5 -0
  48. package/dist/js/profiling/types.d.ts.map +1 -0
  49. package/dist/js/profiling/types.js +2 -0
  50. package/dist/js/profiling/types.js.map +1 -0
  51. package/dist/js/profiling/utils.d.ts +26 -0
  52. package/dist/js/profiling/utils.d.ts.map +1 -0
  53. package/dist/js/profiling/utils.js +135 -0
  54. package/dist/js/profiling/utils.js.map +1 -0
  55. package/dist/js/sdk.d.ts.map +1 -1
  56. package/dist/js/sdk.js +6 -1
  57. package/dist/js/sdk.js.map +1 -1
  58. package/dist/js/version.d.ts +1 -1
  59. package/dist/js/version.js +1 -1
  60. package/dist/js/version.js.map +1 -1
  61. package/dist/js/wrapper.d.ts +4 -2
  62. package/dist/js/wrapper.d.ts.map +1 -1
  63. package/dist/js/wrapper.js +36 -27
  64. package/dist/js/wrapper.js.map +1 -1
  65. package/ios/RNSentry.mm +75 -13
  66. package/package.json +14 -13
  67. package/src/js/NativeRNSentry.ts +7 -4
  68. package/ts3.8/dist/js/NativeRNSentry.d.ts +13 -4
  69. package/ts3.8/dist/js/integrations/index.d.ts +1 -0
  70. package/ts3.8/dist/js/integrations/reactnativeerrorhandlers.d.ts +5 -0
  71. package/ts3.8/dist/js/integrations/rewriteframes.d.ts +2 -0
  72. package/ts3.8/dist/js/profiling/cache.d.ts +9 -0
  73. package/ts3.8/dist/js/profiling/convertHermesProfile.d.ts +27 -0
  74. package/ts3.8/dist/js/profiling/hermes.d.ts +52 -0
  75. package/ts3.8/dist/js/profiling/integration.d.ts +36 -0
  76. package/ts3.8/dist/js/profiling/types.d.ts +5 -0
  77. package/ts3.8/dist/js/profiling/utils.d.ts +26 -0
  78. package/ts3.8/dist/js/version.d.ts +1 -1
  79. package/ts3.8/dist/js/wrapper.d.ts +4 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.8.0
4
+
5
+ ### Features
6
+
7
+ - Alpha support for Hermes JavaScript Profiling ([#3057](https://github.com/getsentry/sentry-react-native/pull/3057))
8
+
9
+ Profiling is disabled by default. To enable it, configure both
10
+ `tracesSampleRate` and `profilesSampleRate` when initializing the SDK:
11
+
12
+ ```javascript
13
+ Sentry.init({
14
+ dsn: '__DSN__',
15
+ tracesSampleRate: 1.0,
16
+ _experiments: {
17
+ // The sampling rate for profiling is relative to TracesSampleRate.
18
+ // In this case, we'll capture profiles for 100% of transactions.
19
+ profilesSampleRate: 1.0,
20
+ },
21
+ });
22
+ ```
23
+
24
+ More documentation on profiling and current limitations [can be found here](https://docs.sentry.io/platforms/react-native/profiling/).
25
+
26
+ ### Fixes
27
+
28
+ - Warn users about multiple versions of `promise` package which can cause unexpected behavior like undefined `Promise.allSettled` ([#3162](https://github.com/getsentry/sentry-react-native/pull/3162))
29
+ - Event is enriched with all the Android context on the JS layer and you can filter/modify all the data in the `beforeSend` callback similarly to iOS. ([#3170](https://github.com/getsentry/sentry-react-native/pull/3170))
30
+
31
+ ### Dependencies
32
+
33
+ - Bump JavaScript SDK from v7.57.0 to v7.60.1 ([#3184](https://github.com/getsentry/sentry-react-native/pull/3184), [#3199](https://github.com/getsentry/sentry-react-native/pull/3199))
34
+ - [changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md#7601)
35
+ - [diff](https://github.com/getsentry/sentry-javascript/compare/7.57.0...7.60.1)
36
+ - Bump Cocoa SDK from v8.8.0 to v8.9.3 ([#3188](https://github.com/getsentry/sentry-react-native/pull/3188), [#3206](https://github.com/getsentry/sentry-react-native/pull/3206))
37
+ - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#893)
38
+ - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.8.0...8.9.3)
39
+ - Bump Android SDK from v6.25.1 to v6.27.0 ([#3170](https://github.com/getsentry/sentry-react-native/pull/3170))
40
+ - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6270)
41
+ - [diff](https://github.com/getsentry/sentry-java/compare/6.25.1...6.27.0)
42
+
43
+ ## 5.7.1
44
+
45
+ ### Dependencies
46
+
47
+ - Bump Android SDK from v6.25.0 to v6.25.1 ([#3179](https://github.com/getsentry/sentry-react-native/pull/3179))
48
+ - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6251)
49
+ - [diff](https://github.com/getsentry/sentry-java/compare/6.25.0...6.25.1)
50
+
3
51
  ## 5.7.0
4
52
 
5
53
  ### Fixes
package/RNSentry.podspec CHANGED
@@ -1,7 +1,12 @@
1
1
  require 'json'
2
2
  version = JSON.parse(File.read('package.json'))["version"]
3
3
 
4
- folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
4
+ folly_flags = ' -DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1'
5
+ folly_compiler_flags = folly_flags + ' ' + '-Wno-comma -Wno-shorten-64-to-32'
6
+
7
+ is_new_arch_enabled = ENV["RCT_NEW_ARCH_ENABLED"] == "1"
8
+ new_arch_enabled_flag = (is_new_arch_enabled ? folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED" : "")
9
+ other_cflags = "$(inherited)" + new_arch_enabled_flag
5
10
 
6
11
  Pod::Spec.new do |s|
7
12
  s.name = 'RNSentry'
@@ -19,14 +24,14 @@ Pod::Spec.new do |s|
19
24
  s.preserve_paths = '*.js'
20
25
 
21
26
  s.dependency 'React-Core'
22
- s.dependency 'Sentry/HybridSDK', '8.8.0'
27
+ s.dependency 'Sentry/HybridSDK', '8.9.3'
23
28
 
24
29
  s.source_files = 'ios/**/*.{h,mm}'
25
30
  s.public_header_files = 'ios/RNSentry.h'
26
31
 
32
+ s.compiler_flags = other_cflags
27
33
  # This guard prevent to install the dependencies when we run `pod install` in the old architecture.
28
- if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
29
- s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
34
+ if is_new_arch_enabled then
30
35
  s.pod_target_xcconfig = {
31
36
  "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
32
37
  "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
@@ -47,5 +47,5 @@ android {
47
47
 
48
48
  dependencies {
49
49
  implementation 'com.facebook.react:react-native:+'
50
- api 'io.sentry:sentry-android:6.25.0'
50
+ api 'io.sentry:sentry-android:6.27.0'
51
51
  }
@@ -0,0 +1,134 @@
1
+ package io.sentry.react;
2
+
3
+ import com.facebook.react.bridge.Arguments;
4
+ import com.facebook.react.bridge.ReadableArray;
5
+ import com.facebook.react.bridge.ReadableMap;
6
+ import com.facebook.react.bridge.WritableArray;
7
+ import com.facebook.react.bridge.WritableMap;
8
+
9
+ import org.jetbrains.annotations.Nullable;
10
+
11
+ import java.math.BigDecimal;
12
+ import java.math.BigInteger;
13
+ import java.util.List;
14
+ import java.util.Map;
15
+
16
+ import io.sentry.ILogger;
17
+ import io.sentry.SentryLevel;
18
+ import io.sentry.android.core.AndroidLogger;
19
+
20
+ public class MapConverter {
21
+ public static final String NAME = "RNSentry.MapConverter";
22
+
23
+ private static final ILogger logger = new AndroidLogger(NAME);
24
+
25
+ public static Object convertToWritable(@Nullable Object serialized) {
26
+ if (serialized instanceof List) {
27
+ WritableArray writable = Arguments.createArray();
28
+ for (Object item : (List<?>) serialized) {
29
+ addValueToWritableArray(writable, convertToWritable(item));
30
+ }
31
+ return writable;
32
+ } else if (serialized instanceof Map) {
33
+ WritableMap writable = Arguments.createMap();
34
+ for (Map.Entry<?, ?> entry : ((Map<?, ?>) serialized).entrySet()) {
35
+ Object key = entry.getKey();
36
+ Object value = entry.getValue();
37
+
38
+ if (key instanceof String) {
39
+ addValueToWritableMap(writable, (String) key, convertToWritable(value));
40
+ } else {
41
+ logger.log(SentryLevel.ERROR, "Only String keys are supported in Map.", key);
42
+ }
43
+ }
44
+ return writable;
45
+ } else if (serialized instanceof Byte) {
46
+ return Integer.valueOf((Byte) serialized);
47
+ } else if (serialized instanceof Short) {
48
+ return Integer.valueOf((Short) serialized);
49
+ } else if (serialized instanceof Float) {
50
+ return Double.valueOf((Float) serialized);
51
+ } else if (serialized instanceof Long) {
52
+ return Double.valueOf((Long) serialized);
53
+ } else if (serialized instanceof BigInteger) {
54
+ return ((BigInteger) serialized).doubleValue();
55
+ } else if (serialized instanceof BigDecimal) {
56
+ return ((BigDecimal) serialized).doubleValue();
57
+ } else if (serialized instanceof Integer
58
+ || serialized instanceof Double
59
+ || serialized instanceof Boolean
60
+ || serialized == null
61
+ || serialized instanceof String) {
62
+ return serialized;
63
+ } else {
64
+ logger.log(SentryLevel.ERROR, "Supplied serialized value could not be converted." + serialized);
65
+ return null;
66
+ }
67
+ }
68
+
69
+ private static void addValueToWritableArray(WritableArray writableArray, Object value) {
70
+ if (value == null) {
71
+ writableArray.pushNull();
72
+ } else if (value instanceof Boolean) {
73
+ writableArray.pushBoolean((Boolean) value);
74
+ } else if (value instanceof Double) {
75
+ writableArray.pushDouble((Double) value);
76
+ } else if (value instanceof Float) {
77
+ writableArray.pushDouble(((Float) value).doubleValue());
78
+ } else if (value instanceof Integer) {
79
+ writableArray.pushInt((Integer) value);
80
+ } else if (value instanceof Short) {
81
+ writableArray.pushInt(((Short) value).intValue());
82
+ } else if (value instanceof Byte) {
83
+ writableArray.pushInt(((Byte) value).intValue());
84
+ } else if (value instanceof Long) {
85
+ writableArray.pushDouble(((Long) value).doubleValue());
86
+ } else if (value instanceof BigInteger) {
87
+ writableArray.pushDouble(((BigInteger) value).doubleValue());
88
+ } else if (value instanceof BigDecimal) {
89
+ writableArray.pushDouble(((BigDecimal) value).doubleValue());
90
+ } else if (value instanceof String) {
91
+ writableArray.pushString((String) value);
92
+ } else if (value instanceof ReadableMap) {
93
+ writableArray.pushMap((ReadableMap) value);
94
+ } else if (value instanceof ReadableArray) {
95
+ writableArray.pushArray((ReadableArray) value);
96
+ } else {
97
+ logger.log(SentryLevel.ERROR,
98
+ "Could not convert object: " + value);
99
+ }
100
+ }
101
+
102
+ private static void addValueToWritableMap(WritableMap writableMap, String key, Object value) {
103
+ if (value == null) {
104
+ writableMap.putNull(key);
105
+ } else if (value instanceof Boolean) {
106
+ writableMap.putBoolean(key, (Boolean) value);
107
+ } else if (value instanceof Double) {
108
+ writableMap.putDouble(key, (Double) value);
109
+ } else if (value instanceof Float) {
110
+ writableMap.putDouble(key, ((Float) value).doubleValue());
111
+ } else if (value instanceof Integer) {
112
+ writableMap.putInt(key, (Integer) value);
113
+ } else if (value instanceof Short) {
114
+ writableMap.putInt(key, ((Short) value).intValue());
115
+ } else if (value instanceof Byte) {
116
+ writableMap.putInt(key, ((Byte) value).intValue());
117
+ } else if (value instanceof Long) {
118
+ writableMap.putDouble(key, ((Long) value).doubleValue());
119
+ } else if (value instanceof BigInteger) {
120
+ writableMap.putDouble(key, ((BigInteger) value).doubleValue());
121
+ } else if (value instanceof BigDecimal) {
122
+ writableMap.putDouble(key, ((BigDecimal) value).doubleValue());
123
+ } else if (value instanceof String) {
124
+ writableMap.putString(key, (String) value);
125
+ } else if (value instanceof ReadableArray) {
126
+ writableMap.putArray(key, (ReadableArray) value);
127
+ } else if (value instanceof ReadableMap) {
128
+ writableMap.putMap(key, (ReadableMap) value);
129
+ } else {
130
+ logger.log(SentryLevel.ERROR,
131
+ "Could not convert object" + value);
132
+ }
133
+ }
134
+ }
@@ -9,9 +9,9 @@ import android.content.pm.PackageManager;
9
9
  import android.content.res.AssetManager;
10
10
  import android.util.SparseIntArray;
11
11
 
12
- import androidx.annotation.Nullable;
13
12
  import androidx.core.app.FrameMetricsAggregator;
14
13
 
14
+ import com.facebook.hermes.instrumentation.HermesSamplingProfiler;
15
15
  import com.facebook.react.bridge.Arguments;
16
16
  import com.facebook.react.bridge.Promise;
17
17
  import com.facebook.react.bridge.ReactApplicationContext;
@@ -24,16 +24,20 @@ import com.facebook.react.bridge.WritableMap;
24
24
  import com.facebook.react.bridge.WritableNativeArray;
25
25
  import com.facebook.react.bridge.WritableNativeMap;
26
26
 
27
+ import org.jetbrains.annotations.NotNull;
28
+ import org.jetbrains.annotations.Nullable;
29
+
27
30
  import java.io.BufferedInputStream;
31
+ import java.io.BufferedReader;
28
32
  import java.io.File;
29
33
  import java.io.FileNotFoundException;
30
34
  import java.io.FileOutputStream;
35
+ import java.io.FileReader;
31
36
  import java.io.InputStream;
32
37
  import java.nio.charset.Charset;
33
38
  import java.util.HashMap;
34
39
  import java.util.List;
35
40
  import java.util.Map;
36
- import java.util.UUID;
37
41
  import java.util.concurrent.CountDownLatch;
38
42
  import java.util.concurrent.TimeUnit;
39
43
 
@@ -43,10 +47,12 @@ import io.sentry.HubAdapter;
43
47
  import io.sentry.ILogger;
44
48
  import io.sentry.ISerializer;
45
49
  import io.sentry.Integration;
50
+ import io.sentry.Scope;
46
51
  import io.sentry.Sentry;
47
52
  import io.sentry.SentryDate;
48
53
  import io.sentry.SentryEvent;
49
54
  import io.sentry.SentryLevel;
55
+ import io.sentry.SentryOptions;
50
56
  import io.sentry.UncaughtExceptionHandlerIntegration;
51
57
  import io.sentry.android.core.AndroidLogger;
52
58
  import io.sentry.android.core.AnrIntegration;
@@ -54,8 +60,10 @@ import io.sentry.android.core.AppStartState;
54
60
  import io.sentry.android.core.BuildConfig;
55
61
  import io.sentry.android.core.BuildInfoProvider;
56
62
  import io.sentry.android.core.CurrentActivityHolder;
63
+ import io.sentry.android.core.InternalSentrySdk;
57
64
  import io.sentry.android.core.NdkIntegration;
58
65
  import io.sentry.android.core.SentryAndroid;
66
+ import io.sentry.android.core.SentryAndroidOptions;
59
67
  import io.sentry.android.core.ViewHierarchyEventProcessor;
60
68
  import io.sentry.protocol.SdkVersion;
61
69
  import io.sentry.protocol.SentryException;
@@ -335,19 +343,10 @@ public class RNSentryModuleImpl {
335
343
  }
336
344
 
337
345
  try {
338
- final String outboxPath = HubAdapter.getInstance().getOptions().getOutboxPath();
339
-
340
- if (outboxPath == null) {
341
- logger.log(SentryLevel.ERROR,
342
- "Error retrieving outboxPath. Envelope will not be sent. Is the Android SDK initialized?");
343
- } else {
344
- File installation = new File(outboxPath, UUID.randomUUID().toString());
345
- try (FileOutputStream out = new FileOutputStream(installation)) {
346
- out.write(bytes);
347
- }
348
- }
349
- } catch (Throwable ignored) {
350
- logger.log(SentryLevel.ERROR, "Error while writing envelope to outbox.");
346
+ InternalSentrySdk.captureEnvelope(bytes);
347
+ } catch (Throwable e) {
348
+ logger.log(SentryLevel.ERROR, "Error while capturing envelope");
349
+ promise.resolve(false);
351
350
  }
352
351
  promise.resolve(true);
353
352
  }
@@ -616,6 +615,95 @@ public class RNSentryModuleImpl {
616
615
  }
617
616
  }
618
617
 
618
+ public WritableMap startProfiling() {
619
+ final WritableMap result = new WritableNativeMap();
620
+ try {
621
+ HermesSamplingProfiler.enable();
622
+ result.putBoolean("started", true);
623
+ } catch (Throwable e) {
624
+ result.putBoolean("started", false);
625
+ result.putString("error", e.toString());
626
+ }
627
+ return result;
628
+ }
629
+
630
+ public WritableMap stopProfiling() {
631
+ final boolean isDebug = HubAdapter.getInstance().getOptions().isDebug();
632
+ final WritableMap result = new WritableNativeMap();
633
+ File output = null;
634
+ try {
635
+ HermesSamplingProfiler.disable();
636
+
637
+ output = File.createTempFile(
638
+ "sampling-profiler-trace", ".cpuprofile", reactApplicationContext.getCacheDir());
639
+
640
+ if (isDebug) {
641
+ logger.log(SentryLevel.INFO, "Profile saved to: " + output.getAbsolutePath());
642
+ }
643
+
644
+ try (final BufferedReader br = new BufferedReader(new FileReader(output));) {
645
+ HermesSamplingProfiler.dumpSampledTraceToFile(output.getPath());
646
+
647
+ final StringBuilder text = new StringBuilder();
648
+ String line;
649
+ while ((line = br.readLine()) != null) {
650
+ text.append(line);
651
+ text.append('\n');
652
+ }
653
+
654
+ result.putString("profile", text.toString());
655
+ }
656
+ } catch (Throwable e) {
657
+ result.putString("error", e.toString());
658
+ } finally {
659
+ if (output != null) {
660
+ try {
661
+ final boolean wasProfileSuccessfullyDeleted = output.delete();
662
+ if (!wasProfileSuccessfullyDeleted) {
663
+ logger.log(SentryLevel.WARNING, "Profile not deleted from:" + output.getAbsolutePath());
664
+ }
665
+ } catch (Throwable e) {
666
+ logger.log(SentryLevel.WARNING, "Profile not deleted from:" + output.getAbsolutePath());
667
+ }
668
+ }
669
+ }
670
+ return result;
671
+ }
672
+
673
+ public void fetchNativeDeviceContexts(Promise promise) {
674
+ final @NotNull SentryOptions options = HubAdapter.getInstance().getOptions();
675
+ if (!(options instanceof SentryAndroidOptions)) {
676
+ promise.resolve(null);
677
+ return;
678
+ }
679
+
680
+ final @Nullable Context context = this.getReactApplicationContext().getApplicationContext();
681
+ if (context == null) {
682
+ promise.resolve(null);
683
+ return;
684
+ }
685
+
686
+ final @Nullable Scope currentScope = InternalSentrySdk.getCurrentScope();
687
+ final @NotNull Map<String, Object> serialized = InternalSentrySdk.serializeScope(
688
+ context,
689
+ (SentryAndroidOptions) options,
690
+ currentScope);
691
+ final @Nullable Object deviceContext = MapConverter.convertToWritable(serialized);
692
+ promise.resolve(deviceContext);
693
+ }
694
+
695
+ public void fetchNativeSdkInfo(Promise promise) {
696
+ final @Nullable SdkVersion sdkVersion = HubAdapter.getInstance().getOptions().getSdkVersion();
697
+ if (sdkVersion == null) {
698
+ promise.resolve(null);
699
+ } else {
700
+ final WritableMap sdkInfo = new WritableNativeMap();
701
+ sdkInfo.putString("name", sdkVersion.getName());
702
+ sdkInfo.putString("version", sdkVersion.getVersion());
703
+ promise.resolve(sdkInfo);
704
+ }
705
+ }
706
+
619
707
  private void setEventOriginTag(SentryEvent event) {
620
708
  SdkVersion sdk = event.getSdk();
621
709
  if (sdk != null) {
@@ -2,10 +2,12 @@ package io.sentry.react;
2
2
 
3
3
  import androidx.annotation.NonNull;
4
4
 
5
+ import com.facebook.react.bridge.JavaScriptExecutorFactory;
5
6
  import com.facebook.react.bridge.ReactApplicationContext;
6
7
  import com.facebook.react.bridge.ReadableArray;
7
8
  import com.facebook.react.bridge.ReadableMap;
8
9
  import com.facebook.react.bridge.Promise;
10
+ import com.facebook.react.bridge.WritableMap;
9
11
 
10
12
  public class RNSentryModule extends NativeRNSentrySpec {
11
13
 
@@ -114,11 +116,21 @@ public class RNSentryModule extends NativeRNSentrySpec {
114
116
 
115
117
  @Override
116
118
  public void fetchNativeDeviceContexts(Promise promise) {
117
- // Not used on android
119
+ this.impl.fetchNativeDeviceContexts(promise);
118
120
  }
119
121
 
120
122
  @Override
121
123
  public void fetchNativeSdkInfo(Promise promise) {
122
- // Not used on android
124
+ this.impl.fetchNativeSdkInfo(promise);
125
+ }
126
+
127
+ @Override
128
+ public WritableMap startProfiling() {
129
+ return this.impl.startProfiling();
130
+ }
131
+
132
+ @Override
133
+ public WritableMap stopProfiling() {
134
+ return this.impl.stopProfiling();
123
135
  }
124
136
  }
@@ -7,6 +7,7 @@ import com.facebook.react.bridge.ReactApplicationContext;
7
7
  import com.facebook.react.bridge.ReactContext;
8
8
  import com.facebook.react.bridge.ReactContextBaseJavaModule;
9
9
  import com.facebook.react.bridge.ReactMethod;
10
+ import com.facebook.react.bridge.WritableMap;
10
11
 
11
12
  public class RNSentryModule extends ReactContextBaseJavaModule {
12
13
 
@@ -114,11 +115,21 @@ public class RNSentryModule extends ReactContextBaseJavaModule {
114
115
 
115
116
  @ReactMethod
116
117
  public void fetchNativeDeviceContexts(Promise promise) {
117
- // Not used on android
118
+ this.impl.fetchNativeDeviceContexts(promise);
118
119
  }
119
120
 
120
121
  @ReactMethod
121
122
  public void fetchNativeSdkInfo(Promise promise) {
122
- // Not used on android
123
+ this.impl.fetchNativeSdkInfo(promise);
124
+ }
125
+
126
+ @ReactMethod(isBlockingSynchronousMethod = true)
127
+ public WritableMap startProfiling() {
128
+ return this.impl.startProfiling();
129
+ }
130
+
131
+ @ReactMethod(isBlockingSynchronousMethod = true)
132
+ public WritableMap stopProfiling() {
133
+ return this.impl.stopProfiling();
123
134
  }
124
135
  }
@@ -12,8 +12,8 @@ export interface Spec extends TurboModule {
12
12
  closeNativeSdk(): Promise<void>;
13
13
  disableNativeFramesTracking(): void;
14
14
  fetchNativeRelease(): Promise<NativeReleaseResponse>;
15
- fetchNativeSdkInfo(): Promise<Package>;
16
- fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse>;
15
+ fetchNativeSdkInfo(): Promise<Package | null>;
16
+ fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse | null>;
17
17
  fetchNativeAppStart(): Promise<NativeAppStartResponse | null>;
18
18
  fetchNativeFrames(): Promise<NativeFramesResponse | null>;
19
19
  initNativeSdk(options: UnsafeObject): Promise<boolean>;
@@ -24,6 +24,14 @@ export interface Spec extends TurboModule {
24
24
  enableNativeFramesTracking(): void;
25
25
  fetchModules(): Promise<string | undefined | null>;
26
26
  fetchViewHierarchy(): Promise<number[] | undefined | null>;
27
+ startProfiling(): {
28
+ started?: boolean;
29
+ error?: string;
30
+ };
31
+ stopProfiling(): {
32
+ profile?: string;
33
+ error?: string;
34
+ };
27
35
  }
28
36
  export declare type NativeAppStartResponse = {
29
37
  isColdStart: boolean;
@@ -41,14 +49,15 @@ export declare type NativeReleaseResponse = {
41
49
  version: string;
42
50
  };
43
51
  /**
44
- * This type describes serialized scope from sentry-cocoa. (This is not used for Android)
52
+ * This type describes serialized scope from sentry-cocoa and sentry-android
45
53
  * https://github.com/getsentry/sentry-cocoa/blob/master/Sources/Sentry/SentryScope.m
54
+ * https://github.com/getsentry/sentry-java/blob/a461f7e125b65240004e6162b341f383ce2e1394/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java#L32
46
55
  */
47
56
  export declare type NativeDeviceContextsResponse = {
48
57
  [key: string]: unknown;
49
58
  tags?: Record<string, string>;
50
59
  extra?: Record<string, unknown>;
51
- context?: Record<string, Record<string, unknown>>;
60
+ contexts?: Record<string, Record<string, unknown>>;
52
61
  user?: {
53
62
  userId?: string;
54
63
  email?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NativeRNSentry.d.ts","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAwFnD,2DAA2D;AAC3D,eAAe,mBAAmB,CAAC,YAAY,CAAO,UAAU,CAAC,CAAC","sourcesContent":["import type { Package } from '@sentry/types';\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\nimport type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';\n\n// There has to be only one interface and it has to be named `Spec`\n// Only extra allowed definitions are types (probably codegen bug)\nexport interface Spec extends TurboModule {\n addBreadcrumb(breadcrumb: UnsafeObject): void;\n captureEnvelope(\n bytes: number[],\n options: {\n store: boolean;\n },\n ): Promise<boolean>;\n captureScreenshot(): Promise<NativeScreenshot[] | undefined | null>;\n clearBreadcrumbs(): void;\n crash(): void;\n closeNativeSdk(): Promise<void>;\n disableNativeFramesTracking(): void;\n fetchNativeRelease(): Promise<NativeReleaseResponse>;\n fetchNativeSdkInfo(): Promise<Package>;\n fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse>;\n fetchNativeAppStart(): Promise<NativeAppStartResponse | null>;\n fetchNativeFrames(): Promise<NativeFramesResponse | null>;\n initNativeSdk(options: UnsafeObject): Promise<boolean>;\n setUser(defaultUserKeys: UnsafeObject | null, otherUserKeys: UnsafeObject | null): void;\n setContext(key: string, value: UnsafeObject | null): void;\n setExtra(key: string, value: string): void;\n setTag(key: string, value: string): void;\n enableNativeFramesTracking(): void;\n fetchModules(): Promise<string | undefined | null>;\n fetchViewHierarchy(): Promise<number[] | undefined | null>;\n}\n\nexport type NativeAppStartResponse = {\n isColdStart: boolean;\n appStartTime: number;\n didFetchAppStart: boolean;\n};\n\nexport type NativeFramesResponse = {\n totalFrames: number;\n slowFrames: number;\n frozenFrames: number;\n};\n\nexport type NativeReleaseResponse = {\n build: string;\n id: string;\n version: string;\n};\n\n/**\n * This type describes serialized scope from sentry-cocoa. (This is not used for Android)\n * https://github.com/getsentry/sentry-cocoa/blob/master/Sources/Sentry/SentryScope.m\n */\nexport type NativeDeviceContextsResponse = {\n [key: string]: unknown;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n context?: Record<string, Record<string, unknown>>;\n user?: {\n userId?: string;\n email?: string;\n username?: string;\n ipAddress?: string;\n segment?: string;\n data?: Record<string, unknown>;\n };\n dist?: string;\n environment?: string;\n fingerprint?: string[];\n level?: string;\n breadcrumbs?: {\n level?: string;\n timestamp?: string;\n category?: string;\n type?: string;\n message?: string;\n data?: Record<string, unknown>;\n }[];\n};\n\nexport type NativeScreenshot = {\n data: number[];\n contentType: string;\n filename: string;\n};\n\n// The export must be here to pass codegen even if not used\nexport default TurboModuleRegistry.getEnforcing<Spec>('RNSentry');\n"]}
1
+ {"version":3,"file":"NativeRNSentry.js","sourceRoot":"","sources":["../../src/js/NativeRNSentry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AA2FnD,2DAA2D;AAC3D,eAAe,mBAAmB,CAAC,YAAY,CAAO,UAAU,CAAC,CAAC","sourcesContent":["import type { Package } from '@sentry/types';\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\nimport type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';\n\n// There has to be only one interface and it has to be named `Spec`\n// Only extra allowed definitions are types (probably codegen bug)\nexport interface Spec extends TurboModule {\n addBreadcrumb(breadcrumb: UnsafeObject): void;\n captureEnvelope(\n bytes: number[],\n options: {\n store: boolean;\n },\n ): Promise<boolean>;\n captureScreenshot(): Promise<NativeScreenshot[] | undefined | null>;\n clearBreadcrumbs(): void;\n crash(): void;\n closeNativeSdk(): Promise<void>;\n disableNativeFramesTracking(): void;\n fetchNativeRelease(): Promise<NativeReleaseResponse>;\n fetchNativeSdkInfo(): Promise<Package | null>;\n fetchNativeDeviceContexts(): Promise<NativeDeviceContextsResponse | null>;\n fetchNativeAppStart(): Promise<NativeAppStartResponse | null>;\n fetchNativeFrames(): Promise<NativeFramesResponse | null>;\n initNativeSdk(options: UnsafeObject): Promise<boolean>;\n setUser(defaultUserKeys: UnsafeObject | null, otherUserKeys: UnsafeObject | null): void;\n setContext(key: string, value: UnsafeObject | null): void;\n setExtra(key: string, value: string): void;\n setTag(key: string, value: string): void;\n enableNativeFramesTracking(): void;\n fetchModules(): Promise<string | undefined | null>;\n fetchViewHierarchy(): Promise<number[] | undefined | null>;\n startProfiling(): { started?: boolean; error?: string };\n stopProfiling(): { profile?: string; error?: string };\n}\n\nexport type NativeAppStartResponse = {\n isColdStart: boolean;\n appStartTime: number;\n didFetchAppStart: boolean;\n};\n\nexport type NativeFramesResponse = {\n totalFrames: number;\n slowFrames: number;\n frozenFrames: number;\n};\n\nexport type NativeReleaseResponse = {\n build: string;\n id: string;\n version: string;\n};\n\n/**\n * This type describes serialized scope from sentry-cocoa and sentry-android\n * https://github.com/getsentry/sentry-cocoa/blob/master/Sources/Sentry/SentryScope.m\n * https://github.com/getsentry/sentry-java/blob/a461f7e125b65240004e6162b341f383ce2e1394/sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java#L32\n */\nexport type NativeDeviceContextsResponse = {\n [key: string]: unknown;\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n contexts?: Record<string, Record<string, unknown>>;\n user?: {\n userId?: string;\n email?: string;\n username?: string;\n ipAddress?: string;\n segment?: string;\n data?: Record<string, unknown>;\n };\n dist?: string;\n environment?: string;\n fingerprint?: string[];\n level?: string;\n breadcrumbs?: {\n level?: string;\n timestamp?: string;\n category?: string;\n type?: string;\n message?: string;\n data?: Record<string, unknown>;\n }[];\n};\n\nexport type NativeScreenshot = {\n data: number[];\n contentType: string;\n filename: string;\n};\n\n// The export must be here to pass codegen even if not used\nexport default TurboModuleRegistry.getEnforcing<Spec>('RNSentry');\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAGV,QAAQ,EACR,KAAK,EACL,SAAS,EAGT,aAAa,EAEb,YAAY,EACb,MAAM,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAO1D;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,wBAAwB,CAAC;IACzE,OAAO,CAAC,eAAe,CAAY;IAEnC;;;OAGG;gBACgB,OAAO,EAAE,wBAAwB;IAUpD;;OAEG;IACI,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAE,SAAc,GAAG,WAAW,CAAC,KAAK,CAAC;IAMvF;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAmBrG;;;OAGG;IACI,WAAW,IAAI,IAAI;IAI1B;;OAEG;IACI,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC;IAOpC;;OAEG;IACI,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IASxD;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAahC;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IA6BjD;;OAEG;YACW,cAAc;IAgB5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAShC;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAGV,QAAQ,EACR,KAAK,EACL,SAAS,EAGT,aAAa,EAEb,YAAY,EACb,MAAM,eAAe,CAAC;AAOvB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAO1D;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,UAAU,CAAC,wBAAwB,CAAC;IACzE,OAAO,CAAC,eAAe,CAAY;IAEnC;;;OAGG;gBACgB,OAAO,EAAE,wBAAwB;IAUpD;;OAEG;IACI,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAE,SAAc,GAAG,WAAW,CAAC,KAAK,CAAC;IAMvF;;OAEG;IACI,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAmBrG;;;OAGG;IACI,WAAW,IAAI,IAAI;IAI1B;;OAEG;IACI,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC;IAOpC;;OAEG;IACI,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IASxD;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAahC;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IA+BjD;;OAEG;YACW,cAAc;IAgB5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAShC;;OAEG;IACH,OAAO,CAAC,qBAAqB;CAa9B"}
package/dist/js/client.js CHANGED
@@ -108,6 +108,7 @@ export class ReactNativeClient extends BaseClient {
108
108
  }
109
109
  let shouldClearOutcomesBuffer = true;
110
110
  if (this._transport && this._dsn) {
111
+ this.emit('beforeEnvelope', envelope);
111
112
  this._transport.send(envelope).then(null, reason => {
112
113
  if (reason instanceof SentryError) {
113
114
  // SentryError is thrown by SyncPromise
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,UAAoC;IAGzE;;;OAGG;IACH,YAAmB,OAAiC;QAClD,sBAAsB,EAAE,CAAC;QACzB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,cAAc,CAAC;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,SAAkB,EAAE,OAAkB,EAAE;QAChE,OAAO,UAAU,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAC3F,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAC7G,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,OAAe,EAAE,KAAqB,EAAE,IAAgB;QAC9E,OAAO,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAC3G,CAAC,KAAY,EAAE,EAAE;;YACf,kEAAkE;YAClE,IAAI,QAAC,KAAK,CAAC,SAAS,0CAAE,MAAM,CAAA,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClE,OAAO,KAAK,CAAC;aACd;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CACvC,CAAC,SAAoB,EAAU,EAAE,CAAC,CAAC;gBACjC,UAAU,EAAE,SAAS,CAAC,UAAU;aACjC,CAAC,CACH,CAAC;YACD,KAA4C,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC,SAAS,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,WAAW;QAChB,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,KAAK;QACV,oGAAoG;QACpG,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE;YAC5C,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAyB,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,QAAsB;QAC/C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,QAAQ,EAAE;YACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;YACjC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,iBAAiB;;QACtB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,WAAW,SAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,sBAAsB,0CAAE,IAAI,CAAC;QAClE,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;SACrD;QACD,MAAM,4BAA4B,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,4BAA4B,CAAC;QACnF,IAAI,4BAA4B,EAAE;YAChC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,mCAAmC,CAAC,CAAC,CAAC;SAC7E;IACH,CAAC;IAED;;OAEG;IACO,aAAa,CAAC,QAAkB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAErE,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;YACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,QAAgC,CAAC,CAAC;SACpF;QAED,IAAI,yBAAyB,GAAG,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE;YAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;gBACjD,IAAI,MAAM,YAAY,WAAW,EAAE;oBACjC,uCAAuC;oBACvC,yBAAyB,GAAG,KAAK,CAAC;oBAClC,6EAA6E;oBAC7E,MAAM,CAAC,KAAK,CAAC,2DAA2D,EAAE,MAAM,CAAC,CAAC;iBACnF;qBAAM;oBACL,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;iBACpD;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACpC;QAED,IAAI,yBAAyB,EAAE;YAC7B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC,mEAAmE;SAC/F;IACH,CAAC;IAED;;OAEG;IACW,cAAc;;;YAC1B,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAE9B,IAAI;gBACF,iBAAiB,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/D;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,wBAAwB,EAAE,CAAC;aACjC;oBAAS;gBACR,IAAI;oBACF,MAAA,MAAA,IAAI,CAAC,QAAQ,EAAC,OAAO,mDAAG,EAAE,iBAAiB,EAAE,EAAE;iBAChD;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;iBAC9D;aACF;;KACF;IAED;;OAEG;IACK,wBAAwB;QAC9B,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE;YAC/C,KAAK,CAAC,KAAK,CACT,QAAQ,EACR,qOAAqO,CACtO,CAAC;SACH;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,QAAmB,EAAE,QAA8B;QAC/E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,gBAAgB,GAAqB;gBACzC,EAAE,IAAI,EAAE,eAAe,EAAE;gBACzB;oBACE,SAAS,EAAE,sBAAsB,EAAE;oBACnC,gBAAgB,EAAE,QAAQ;iBAC3B;aACF,CAAC;YAEF,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACxC;IACH,CAAC;CACF","sourcesContent":["import { eventFromException, eventFromMessage } from '@sentry/browser';\nimport { BaseClient } from '@sentry/core';\nimport type {\n ClientReportEnvelope,\n ClientReportItem,\n Envelope,\n Event,\n EventHint,\n Exception,\n Outcome,\n SeverityLevel,\n Thread,\n UserFeedback,\n} from '@sentry/types';\nimport { dateTimestampInSeconds, logger, SentryError } from '@sentry/utils';\nimport { Alert } from 'react-native';\n\nimport { createIntegration } from './integrations/factory';\nimport { Screenshot } from './integrations/screenshot';\nimport { defaultSdkInfo } from './integrations/sdkinfo';\nimport type { ReactNativeClientOptions } from './options';\nimport { ReactNativeTracing } from './tracing';\nimport { createUserFeedbackEnvelope, items } from './utils/envelope';\nimport { ignoreRequireCycleLogs } from './utils/ignorerequirecyclelogs';\nimport { mergeOutcomes } from './utils/outcome';\nimport { NATIVE } from './wrapper';\n\n/**\n * The Sentry React Native SDK Client.\n *\n * @see ReactNativeClientOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class ReactNativeClient extends BaseClient<ReactNativeClientOptions> {\n private _outcomesBuffer: Outcome[];\n\n /**\n * Creates a new React Native SDK instance.\n * @param options Configuration options for this SDK.\n */\n public constructor(options: ReactNativeClientOptions) {\n ignoreRequireCycleLogs();\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || defaultSdkInfo;\n super(options);\n\n this._outcomesBuffer = [];\n void this._initNativeSdk();\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint: EventHint = {}): PromiseLike<Event> {\n return Screenshot.attachScreenshotToEventHint(hint, this._options).then(hintWithScreenshot =>\n eventFromException(this._options.stackParser, exception, hintWithScreenshot, this._options.attachStacktrace),\n );\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(message: string, level?: SeverityLevel, hint?: EventHint): PromiseLike<Event> {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace).then(\n (event: Event) => {\n // TMP! Remove this function once JS SDK uses threads for messages\n if (!event.exception?.values || event.exception.values.length <= 0) {\n return event;\n }\n const values = event.exception.values.map(\n (exception: Exception): Thread => ({\n stacktrace: exception.stacktrace,\n }),\n );\n (event as { threads?: { values: Thread[] } }).threads = { values };\n delete event.exception;\n return event;\n },\n );\n }\n\n /**\n * If native client is available it will trigger a native crash.\n * Use this only for testing purposes.\n */\n public nativeCrash(): void {\n NATIVE.nativeCrash();\n }\n\n /**\n * @inheritDoc\n */\n public close(): PromiseLike<boolean> {\n // As super.close() flushes queued events, we wait for that to finish before closing the native SDK.\n return super.close().then((result: boolean) => {\n return NATIVE.closeNativeSdk().then(() => result) as PromiseLike<boolean>;\n });\n }\n\n /**\n * Sends user feedback to Sentry.\n */\n public captureUserFeedback(feedback: UserFeedback): void {\n const envelope = createUserFeedbackEnvelope(feedback, {\n metadata: this._options._metadata,\n dsn: this.getDsn(),\n tunnel: this._options.tunnel,\n });\n this._sendEnvelope(envelope);\n }\n\n /**\n * Sets up the integrations\n */\n public setupIntegrations(): void {\n super.setupIntegrations();\n const tracing = this.getIntegration(ReactNativeTracing);\n const routingName = tracing?.options.routingInstrumentation?.name;\n if (routingName) {\n this.addIntegration(createIntegration(routingName));\n }\n const enableUserInteractionTracing = tracing?.options.enableUserInteractionTracing;\n if (enableUserInteractionTracing) {\n this.addIntegration(createIntegration('ReactNativeUserInteractionTracing'));\n }\n }\n\n /**\n * @inheritdoc\n */\n protected _sendEnvelope(envelope: Envelope): void {\n const outcomes = this._clearOutcomes();\n this._outcomesBuffer = mergeOutcomes(this._outcomesBuffer, outcomes);\n\n if (this._options.sendClientReports) {\n this._attachClientReportTo(this._outcomesBuffer, envelope as ClientReportEnvelope);\n }\n\n let shouldClearOutcomesBuffer = true;\n if (this._transport && this._dsn) {\n this._transport.send(envelope).then(null, reason => {\n if (reason instanceof SentryError) {\n // SentryError is thrown by SyncPromise\n shouldClearOutcomesBuffer = false;\n // If this is called asynchronously we want the _outcomesBuffer to be cleared\n logger.error('SentryError while sending event, keeping outcomes buffer:', reason);\n } else {\n logger.error('Error while sending event:', reason);\n }\n });\n } else {\n logger.error('Transport disabled');\n }\n\n if (shouldClearOutcomesBuffer) {\n this._outcomesBuffer = []; // if send fails synchronously the _outcomesBuffer will stay intact\n }\n }\n\n /**\n * Starts native client with dsn and options\n */\n private async _initNativeSdk(): Promise<void> {\n let didCallNativeInit = false;\n\n try {\n didCallNativeInit = await NATIVE.initNativeSdk(this._options);\n } catch (_) {\n this._showCannotConnectDialog();\n } finally {\n try {\n this._options.onReady?.({ didCallNativeInit });\n } catch (error) {\n logger.error('The OnReady callback threw an error: ', error);\n }\n }\n }\n\n /**\n * If the user is in development mode, and the native nagger is enabled then it will show an alert.\n */\n private _showCannotConnectDialog(): void {\n if (__DEV__ && this._options.enableNativeNagger) {\n Alert.alert(\n 'Sentry',\n 'Warning, could not connect to Sentry native SDK.\\nIf you do not want to use the native component please pass `enableNative: false` in the options.\\nVisit: https://docs.sentry.io/platforms/react-native/#linking for more details.',\n );\n }\n }\n\n /**\n * Attaches a client report from outcomes to the envelope.\n */\n private _attachClientReportTo(outcomes: Outcome[], envelope: ClientReportEnvelope): void {\n if (outcomes.length > 0) {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: dateTimestampInSeconds(),\n discarded_events: outcomes,\n },\n ];\n\n envelope[items].push(clientReportItem);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/js/client.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,UAAoC;IAGzE;;;OAGG;IACH,YAAmB,OAAiC;QAClD,sBAAsB,EAAE,CAAC;QACzB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,cAAc,CAAC;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,SAAkB,EAAE,OAAkB,EAAE;QAChE,OAAO,UAAU,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAC3F,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAC7G,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,OAAe,EAAE,KAAqB,EAAE,IAAgB;QAC9E,OAAO,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAC3G,CAAC,KAAY,EAAE,EAAE;;YACf,kEAAkE;YAClE,IAAI,QAAC,KAAK,CAAC,SAAS,0CAAE,MAAM,CAAA,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;gBAClE,OAAO,KAAK,CAAC;aACd;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CACvC,CAAC,SAAoB,EAAU,EAAE,CAAC,CAAC;gBACjC,UAAU,EAAE,SAAS,CAAC,UAAU;aACjC,CAAC,CACH,CAAC;YACD,KAA4C,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC,SAAS,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,WAAW;QAChB,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACI,KAAK;QACV,oGAAoG;QACpG,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE;YAC5C,OAAO,MAAM,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAyB,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,QAAsB;QAC/C,MAAM,QAAQ,GAAG,0BAA0B,CAAC,QAAQ,EAAE;YACpD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS;YACjC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE;YAClB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;SAC7B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,iBAAiB;;QACtB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACxD,MAAM,WAAW,SAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,sBAAsB,0CAAE,IAAI,CAAC;QAClE,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;SACrD;QACD,MAAM,4BAA4B,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,4BAA4B,CAAC;QACnF,IAAI,4BAA4B,EAAE;YAChC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,mCAAmC,CAAC,CAAC,CAAC;SAC7E;IACH,CAAC;IAED;;OAEG;IACO,aAAa,CAAC,QAAkB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAErE,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;YACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,eAAe,EAAE,QAAgC,CAAC,CAAC;SACpF;QAED,IAAI,yBAAyB,GAAG,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAEtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;gBACjD,IAAI,MAAM,YAAY,WAAW,EAAE;oBACjC,uCAAuC;oBACvC,yBAAyB,GAAG,KAAK,CAAC;oBAClC,6EAA6E;oBAC7E,MAAM,CAAC,KAAK,CAAC,2DAA2D,EAAE,MAAM,CAAC,CAAC;iBACnF;qBAAM;oBACL,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;iBACpD;YACH,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;SACpC;QAED,IAAI,yBAAyB,EAAE;YAC7B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC,mEAAmE;SAC/F;IACH,CAAC;IAED;;OAEG;IACW,cAAc;;;YAC1B,IAAI,iBAAiB,GAAG,KAAK,CAAC;YAE9B,IAAI;gBACF,iBAAiB,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC/D;YAAC,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,wBAAwB,EAAE,CAAC;aACjC;oBAAS;gBACR,IAAI;oBACF,MAAA,MAAA,IAAI,CAAC,QAAQ,EAAC,OAAO,mDAAG,EAAE,iBAAiB,EAAE,EAAE;iBAChD;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;iBAC9D;aACF;;KACF;IAED;;OAEG;IACK,wBAAwB;QAC9B,IAAI,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE;YAC/C,KAAK,CAAC,KAAK,CACT,QAAQ,EACR,qOAAqO,CACtO,CAAC;SACH;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,QAAmB,EAAE,QAA8B;QAC/E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,MAAM,gBAAgB,GAAqB;gBACzC,EAAE,IAAI,EAAE,eAAe,EAAE;gBACzB;oBACE,SAAS,EAAE,sBAAsB,EAAE;oBACnC,gBAAgB,EAAE,QAAQ;iBAC3B;aACF,CAAC;YAEF,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;SACxC;IACH,CAAC;CACF","sourcesContent":["import { eventFromException, eventFromMessage } from '@sentry/browser';\nimport { BaseClient } from '@sentry/core';\nimport type {\n ClientReportEnvelope,\n ClientReportItem,\n Envelope,\n Event,\n EventHint,\n Exception,\n Outcome,\n SeverityLevel,\n Thread,\n UserFeedback,\n} from '@sentry/types';\nimport { dateTimestampInSeconds, logger, SentryError } from '@sentry/utils';\nimport { Alert } from 'react-native';\n\nimport { createIntegration } from './integrations/factory';\nimport { Screenshot } from './integrations/screenshot';\nimport { defaultSdkInfo } from './integrations/sdkinfo';\nimport type { ReactNativeClientOptions } from './options';\nimport { ReactNativeTracing } from './tracing';\nimport { createUserFeedbackEnvelope, items } from './utils/envelope';\nimport { ignoreRequireCycleLogs } from './utils/ignorerequirecyclelogs';\nimport { mergeOutcomes } from './utils/outcome';\nimport { NATIVE } from './wrapper';\n\n/**\n * The Sentry React Native SDK Client.\n *\n * @see ReactNativeClientOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class ReactNativeClient extends BaseClient<ReactNativeClientOptions> {\n private _outcomesBuffer: Outcome[];\n\n /**\n * Creates a new React Native SDK instance.\n * @param options Configuration options for this SDK.\n */\n public constructor(options: ReactNativeClientOptions) {\n ignoreRequireCycleLogs();\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || defaultSdkInfo;\n super(options);\n\n this._outcomesBuffer = [];\n void this._initNativeSdk();\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint: EventHint = {}): PromiseLike<Event> {\n return Screenshot.attachScreenshotToEventHint(hint, this._options).then(hintWithScreenshot =>\n eventFromException(this._options.stackParser, exception, hintWithScreenshot, this._options.attachStacktrace),\n );\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(message: string, level?: SeverityLevel, hint?: EventHint): PromiseLike<Event> {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace).then(\n (event: Event) => {\n // TMP! Remove this function once JS SDK uses threads for messages\n if (!event.exception?.values || event.exception.values.length <= 0) {\n return event;\n }\n const values = event.exception.values.map(\n (exception: Exception): Thread => ({\n stacktrace: exception.stacktrace,\n }),\n );\n (event as { threads?: { values: Thread[] } }).threads = { values };\n delete event.exception;\n return event;\n },\n );\n }\n\n /**\n * If native client is available it will trigger a native crash.\n * Use this only for testing purposes.\n */\n public nativeCrash(): void {\n NATIVE.nativeCrash();\n }\n\n /**\n * @inheritDoc\n */\n public close(): PromiseLike<boolean> {\n // As super.close() flushes queued events, we wait for that to finish before closing the native SDK.\n return super.close().then((result: boolean) => {\n return NATIVE.closeNativeSdk().then(() => result) as PromiseLike<boolean>;\n });\n }\n\n /**\n * Sends user feedback to Sentry.\n */\n public captureUserFeedback(feedback: UserFeedback): void {\n const envelope = createUserFeedbackEnvelope(feedback, {\n metadata: this._options._metadata,\n dsn: this.getDsn(),\n tunnel: this._options.tunnel,\n });\n this._sendEnvelope(envelope);\n }\n\n /**\n * Sets up the integrations\n */\n public setupIntegrations(): void {\n super.setupIntegrations();\n const tracing = this.getIntegration(ReactNativeTracing);\n const routingName = tracing?.options.routingInstrumentation?.name;\n if (routingName) {\n this.addIntegration(createIntegration(routingName));\n }\n const enableUserInteractionTracing = tracing?.options.enableUserInteractionTracing;\n if (enableUserInteractionTracing) {\n this.addIntegration(createIntegration('ReactNativeUserInteractionTracing'));\n }\n }\n\n /**\n * @inheritdoc\n */\n protected _sendEnvelope(envelope: Envelope): void {\n const outcomes = this._clearOutcomes();\n this._outcomesBuffer = mergeOutcomes(this._outcomesBuffer, outcomes);\n\n if (this._options.sendClientReports) {\n this._attachClientReportTo(this._outcomesBuffer, envelope as ClientReportEnvelope);\n }\n\n let shouldClearOutcomesBuffer = true;\n if (this._transport && this._dsn) {\n this.emit('beforeEnvelope', envelope);\n\n this._transport.send(envelope).then(null, reason => {\n if (reason instanceof SentryError) {\n // SentryError is thrown by SyncPromise\n shouldClearOutcomesBuffer = false;\n // If this is called asynchronously we want the _outcomesBuffer to be cleared\n logger.error('SentryError while sending event, keeping outcomes buffer:', reason);\n } else {\n logger.error('Error while sending event:', reason);\n }\n });\n } else {\n logger.error('Transport disabled');\n }\n\n if (shouldClearOutcomesBuffer) {\n this._outcomesBuffer = []; // if send fails synchronously the _outcomesBuffer will stay intact\n }\n }\n\n /**\n * Starts native client with dsn and options\n */\n private async _initNativeSdk(): Promise<void> {\n let didCallNativeInit = false;\n\n try {\n didCallNativeInit = await NATIVE.initNativeSdk(this._options);\n } catch (_) {\n this._showCannotConnectDialog();\n } finally {\n try {\n this._options.onReady?.({ didCallNativeInit });\n } catch (error) {\n logger.error('The OnReady callback threw an error: ', error);\n }\n }\n }\n\n /**\n * If the user is in development mode, and the native nagger is enabled then it will show an alert.\n */\n private _showCannotConnectDialog(): void {\n if (__DEV__ && this._options.enableNativeNagger) {\n Alert.alert(\n 'Sentry',\n 'Warning, could not connect to Sentry native SDK.\\nIf you do not want to use the native component please pass `enableNative: false` in the options.\\nVisit: https://docs.sentry.io/platforms/react-native/#linking for more details.',\n );\n }\n }\n\n /**\n * Attaches a client report from outcomes to the envelope.\n */\n private _attachClientReportTo(outcomes: Outcome[], envelope: ClientReportEnvelope): void {\n if (outcomes.length > 0) {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: dateTimestampInSeconds(),\n discarded_events: outcomes,\n },\n ];\n\n envelope[items].push(clientReportItem);\n }\n }\n}\n"]}
@@ -35,13 +35,13 @@ export class DeviceContext {
35
35
  if (!event.user && nativeUser) {
36
36
  event.user = nativeUser;
37
37
  }
38
- let nativeContext = native.context;
38
+ let nativeContexts = native.contexts;
39
39
  if (AppState.currentState !== 'unknown') {
40
- nativeContext = nativeContext || {};
41
- nativeContext.app = Object.assign(Object.assign({}, nativeContext.app), { in_foreground: AppState.currentState === 'active' });
40
+ nativeContexts = nativeContexts || {};
41
+ nativeContexts.app = Object.assign(Object.assign({}, nativeContexts.app), { in_foreground: AppState.currentState === 'active' });
42
42
  }
43
- if (nativeContext) {
44
- event.contexts = Object.assign(Object.assign({}, nativeContext), event.contexts);
43
+ if (nativeContexts) {
44
+ event.contexts = Object.assign(Object.assign({}, nativeContexts), event.contexts);
45
45
  }
46
46
  const nativeTags = native.tags;
47
47
  if (nativeTags) {