@truewatchtech/react-native-mobile 0.4.2 → 0.4.3

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 (153) hide show
  1. package/FTMobileReactNativeSDK.podspec +7 -5
  2. package/android/build.gradle +10 -3
  3. package/android/src/main/java/com/ft/sdk/reactnative/FTLogImpl.java +10 -2
  4. package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +45 -10
  5. package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +131 -6
  6. package/android/src/main/java/com/ft/sdk/reactnative/FTTraceImpl.java +10 -3
  7. package/android/src/main/java/com/ft/sdk/reactnative/JsLongTaskMonitor.java +281 -0
  8. package/android/src/main/java/com/ft/sdk/reactnative/ViewTiming.java +17 -0
  9. package/android/src/main/java/com/ft/sdk/reactnative/VisitorIdConfigMapper.java +50 -0
  10. package/android/src/main/java/com/ft/sdk/reactnative/utils/ReactNativeUtils.java +5 -12
  11. package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +14 -5
  12. package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +44 -1
  13. package/android/src/newarch/java/com/ft/sdk/reactnative/FTTraceModule.java +14 -0
  14. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +7 -2
  15. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +39 -1
  16. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTTraceModule.java +12 -0
  17. package/android/src/rnpost70/java/com/ft/sdk/reactnative/ReactJsThreadExecutor.java +21 -0
  18. package/android/src/rnpre70/java/com/ft/sdk/reactnative/ReactJsThreadExecutor.java +37 -0
  19. package/android/src/test/java/com/ft/sdk/reactnative/FTMobileImplTest.java +53 -0
  20. package/android/src/test/java/com/ft/sdk/reactnative/FTRUMModuleTest.java +117 -0
  21. package/android/src/test/java/com/ft/sdk/reactnative/JsLongTaskMonitorTest.java +446 -0
  22. package/android/src/test/java/com/ft/sdk/reactnative/utils/ReactNativeUtilsTest.java +33 -0
  23. package/ios/FTJSLongTaskMonitor.h +51 -0
  24. package/ios/FTJSLongTaskMonitor.m +250 -0
  25. package/ios/FTMobileReactNative.mm +54 -18
  26. package/ios/FTReactNativeLog.mm +9 -5
  27. package/ios/FTReactNativeRUM.mm +196 -31
  28. package/ios/FTReactNativeResource.h +4 -0
  29. package/ios/FTReactNativeResource.m +64 -0
  30. package/ios/FTReactNativeTrace.mm +59 -14
  31. package/ios/FTReactNativeUtils.m +10 -15
  32. package/ios/FTReactNativeViewTiming.h +18 -0
  33. package/ios/FTReactNativeWebSocket.h +10 -0
  34. package/ios/FTReactNativeWebSocket.mm +201 -0
  35. package/ios/FTWebSocketMetadataStore.h +25 -0
  36. package/ios/FTWebSocketMetadataStore.m +622 -0
  37. package/ios/FTWebSocketResourceData.h +20 -0
  38. package/ios/FTWebSocketResourceData.m +106 -0
  39. package/lib/commonjs/ft_logger.js +3 -1
  40. package/lib/commonjs/ft_logger.js.map +1 -1
  41. package/lib/commonjs/ft_mobile_agent.js +47 -4
  42. package/lib/commonjs/ft_mobile_agent.js.map +1 -1
  43. package/lib/commonjs/ft_rum.js +65 -5
  44. package/lib/commonjs/ft_rum.js.map +1 -1
  45. package/lib/commonjs/ft_tracing.js +14 -4
  46. package/lib/commonjs/ft_tracing.js.map +1 -1
  47. package/lib/commonjs/index.js +21 -0
  48. package/lib/commonjs/index.js.map +1 -1
  49. package/lib/commonjs/rum/FTBabelInteractionTracking.js +72 -0
  50. package/lib/commonjs/rum/FTBabelInteractionTracking.js.map +1 -0
  51. package/lib/commonjs/rum/FTBabelUtils.js +87 -0
  52. package/lib/commonjs/rum/FTBabelUtils.js.map +1 -0
  53. package/lib/commonjs/rum/FTRumActionTracking.js +10 -39
  54. package/lib/commonjs/rum/FTRumActionTracking.js.map +1 -1
  55. package/lib/commonjs/rum/FTRumActionTrackingContext.js +50 -0
  56. package/lib/commonjs/rum/FTRumActionTrackingContext.js.map +1 -0
  57. package/lib/commonjs/rum/FTRumViewTracking.js +147 -0
  58. package/lib/commonjs/rum/FTRumViewTracking.js.map +1 -0
  59. package/lib/commonjs/rum/FTRumWebSocketNative.js +73 -0
  60. package/lib/commonjs/rum/FTRumWebSocketNative.js.map +1 -0
  61. package/lib/commonjs/rum/FTRumWebSocketTiming.js +73 -0
  62. package/lib/commonjs/rum/FTRumWebSocketTiming.js.map +1 -0
  63. package/lib/commonjs/rum/FTRumWebSocketTracking.js +506 -0
  64. package/lib/commonjs/rum/FTRumWebSocketTracking.js.map +1 -0
  65. package/lib/commonjs/rum/longTasksUtils.js +25 -0
  66. package/lib/commonjs/rum/longTasksUtils.js.map +1 -0
  67. package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -1
  68. package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -1
  69. package/lib/commonjs/specs/NativeFTReactNativeTrace.js.map +1 -1
  70. package/lib/commonjs/specs/NativeFTReactNativeWebSocket.js +11 -0
  71. package/lib/commonjs/specs/NativeFTReactNativeWebSocket.js.map +1 -0
  72. package/lib/commonjs/version.js +1 -1
  73. package/lib/commonjs/version.js.map +1 -1
  74. package/lib/commonjs/visitorIdConfig.js +37 -0
  75. package/lib/commonjs/visitorIdConfig.js.map +1 -0
  76. package/lib/module/ft_logger.js +3 -1
  77. package/lib/module/ft_logger.js.map +1 -1
  78. package/lib/module/ft_mobile_agent.js +47 -4
  79. package/lib/module/ft_mobile_agent.js.map +1 -1
  80. package/lib/module/ft_rum.js +65 -5
  81. package/lib/module/ft_rum.js.map +1 -1
  82. package/lib/module/ft_tracing.js +14 -2
  83. package/lib/module/ft_tracing.js.map +1 -1
  84. package/lib/module/index.js +4 -1
  85. package/lib/module/index.js.map +1 -1
  86. package/lib/module/rum/FTBabelInteractionTracking.js +66 -0
  87. package/lib/module/rum/FTBabelInteractionTracking.js.map +1 -0
  88. package/lib/module/rum/FTBabelUtils.js +80 -0
  89. package/lib/module/rum/FTBabelUtils.js.map +1 -0
  90. package/lib/module/rum/FTRumActionTracking.js +10 -39
  91. package/lib/module/rum/FTRumActionTracking.js.map +1 -1
  92. package/lib/module/rum/FTRumActionTrackingContext.js +43 -0
  93. package/lib/module/rum/FTRumActionTrackingContext.js.map +1 -0
  94. package/lib/module/rum/FTRumViewTracking.js +140 -0
  95. package/lib/module/rum/FTRumViewTracking.js.map +1 -0
  96. package/lib/module/rum/FTRumWebSocketNative.js +62 -0
  97. package/lib/module/rum/FTRumWebSocketNative.js.map +1 -0
  98. package/lib/module/rum/FTRumWebSocketTiming.js +67 -0
  99. package/lib/module/rum/FTRumWebSocketTiming.js.map +1 -0
  100. package/lib/module/rum/FTRumWebSocketTracking.js +499 -0
  101. package/lib/module/rum/FTRumWebSocketTracking.js.map +1 -0
  102. package/lib/module/rum/longTasksUtils.js +18 -0
  103. package/lib/module/rum/longTasksUtils.js.map +1 -0
  104. package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -1
  105. package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -1
  106. package/lib/module/specs/NativeFTReactNativeTrace.js.map +1 -1
  107. package/lib/module/specs/NativeFTReactNativeWebSocket.js +8 -0
  108. package/lib/module/specs/NativeFTReactNativeWebSocket.js.map +1 -0
  109. package/lib/module/version.js +1 -1
  110. package/lib/module/version.js.map +1 -1
  111. package/lib/module/visitorIdConfig.js +31 -0
  112. package/lib/module/visitorIdConfig.js.map +1 -0
  113. package/lib/typescript/ft_logger.d.ts +11 -1
  114. package/lib/typescript/ft_mobile_agent.d.ts +28 -0
  115. package/lib/typescript/ft_rum.d.ts +42 -5
  116. package/lib/typescript/ft_tracing.d.ts +9 -1
  117. package/lib/typescript/index.d.ts +5 -1
  118. package/lib/typescript/rum/FTBabelInteractionTracking.d.ts +30 -0
  119. package/lib/typescript/rum/FTBabelUtils.d.ts +1 -0
  120. package/lib/typescript/rum/FTRumActionTracking.d.ts +0 -2
  121. package/lib/typescript/rum/FTRumActionTrackingContext.d.ts +11 -0
  122. package/lib/typescript/rum/FTRumViewTracking.d.ts +32 -0
  123. package/lib/typescript/rum/FTRumWebSocketNative.d.ts +22 -0
  124. package/lib/typescript/rum/FTRumWebSocketTiming.d.ts +7 -0
  125. package/lib/typescript/rum/FTRumWebSocketTracking.d.ts +54 -0
  126. package/lib/typescript/rum/longTasksUtils.d.ts +8 -0
  127. package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +15 -0
  128. package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +11 -1
  129. package/lib/typescript/specs/NativeFTReactNativeTrace.d.ts +12 -0
  130. package/lib/typescript/specs/NativeFTReactNativeWebSocket.d.ts +13 -0
  131. package/lib/typescript/version.d.ts +1 -1
  132. package/lib/typescript/visitorIdConfig.d.ts +11 -0
  133. package/package.json +6 -4
  134. package/src/ft_logger.tsx +11 -1
  135. package/src/ft_mobile_agent.tsx +79 -7
  136. package/src/ft_rum.tsx +111 -7
  137. package/src/ft_tracing.tsx +24 -2
  138. package/src/index.tsx +8 -0
  139. package/src/rum/FTBabelInteractionTracking.ts +124 -0
  140. package/src/rum/FTBabelUtils.tsx +99 -0
  141. package/src/rum/FTRumActionTracking.tsx +14 -43
  142. package/src/rum/FTRumActionTrackingContext.ts +68 -0
  143. package/src/rum/FTRumViewTracking.ts +179 -0
  144. package/src/rum/FTRumWebSocketNative.ts +107 -0
  145. package/src/rum/FTRumWebSocketTiming.ts +82 -0
  146. package/src/rum/FTRumWebSocketTracking.ts +722 -0
  147. package/src/rum/longTasksUtils.ts +17 -0
  148. package/src/specs/NativeFTMobileReactNative.ts +18 -0
  149. package/src/specs/NativeFTReactNativeRUM.ts +19 -1
  150. package/src/specs/NativeFTReactNativeTrace.ts +12 -0
  151. package/src/specs/NativeFTReactNativeWebSocket.ts +33 -0
  152. package/src/version.ts +1 -1
  153. package/src/visitorIdConfig.ts +123 -0
@@ -12,15 +12,17 @@ Pod::Spec.new do |s|
12
12
  s.authors = package["author"]
13
13
 
14
14
  s.platforms = { :ios => "10.0" }
15
- s.source = { :git => "https://github.com/TrueWatchTech/datakit-react-native.git", :tag => "#{s.version}" }
15
+ s.source = { :git => "https://github.com/TrueWatchTech/datakit-react-native.git", :tag => "agent_#{s.version}" }
16
16
 
17
17
 
18
18
  s.source_files = "ios/**/*.{h,m,mm,swift}"
19
+ s.private_header_files = "ios/FTJSLongTaskMonitor.h", "ios/FTWebSocketMetadataStore.h", "ios/FTReactNativeWebSocket.h", "ios/FTReactNativeResource.h", "ios/FTWebSocketResourceData.h"
20
+ s.frameworks = "CFNetwork"
19
21
 
20
22
 
21
23
  s.dependency "React-Core"
22
- s.dependency 'FTMobileSDK', '1.6.5'
23
-
24
+ s.dependency 'TrueWatchSDK', '1.6.8'
25
+
24
26
  xcconfig = {
25
27
  "HEADER_SEARCH_PATHS" => "$(inherited) " +
26
28
  "$(PODS_ROOT)/React-RCTFabric/** " +
@@ -36,7 +38,7 @@ Pod::Spec.new do |s|
36
38
 
37
39
  if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
38
40
  s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
39
-
41
+
40
42
  xcconfig.merge!({
41
43
  "DEFINES_MODULE" => "YES",
42
44
  "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
@@ -48,5 +50,5 @@ Pod::Spec.new do |s|
48
50
  if respond_to?(:install_modules_dependencies, true)
49
51
  install_modules_dependencies(s)
50
52
  end
51
-
53
+
52
54
  end
@@ -94,6 +94,12 @@ android {
94
94
  }
95
95
 
96
96
  if (reactNativeMajorVersion == 0) {
97
+ if (reactNativeMinorVersion >= 70) {
98
+ java.srcDirs += ['src/rnpost70/java']
99
+ } else {
100
+ java.srcDirs += ['src/rnpre70/java']
101
+ }
102
+
97
103
  if (reactNativeMinorVersion >= 74) {
98
104
  java.srcDirs += ['src/rnpost74/java']
99
105
  } else {
@@ -179,11 +185,12 @@ repositories {
179
185
  dependencies {
180
186
  // noinspection GradleDynamicVersion
181
187
  implementation 'com.facebook.react:react-native:+'
182
- implementation 'com.truewatch.ft.mobile.sdk.tracker.agent:ft-sdk:1.7.2'
183
- implementation 'com.truewatch.ft.mobile.sdk.tracker.agent:ft-native:1.1.2'
184
-
188
+ implementation 'com.truewatch.ft.mobile.sdk.tracker.agent:ft-sdk:1.7.6'
189
+ implementation 'com.truewatch.ft.mobile.sdk.tracker.agent:ft-native:1.1.4'
185
190
  // implementation files('../example/android/app/libs/ft-sdk-debug.aar')
186
191
  // implementation files('../example/android/app/libs/ft-session-replay-debug.aar')
187
192
 
188
193
  implementation 'com.google.code.gson:gson:2.8.5'
194
+ testImplementation 'junit:junit:4.13.2'
195
+ testImplementation 'org.mockito:mockito-core:4.11.0'
189
196
  }
@@ -21,8 +21,10 @@ public class FTLogImpl {
21
21
  Map<String, Object> map = context.toHashMap();
22
22
  Integer discardStrategy = ReactNativeUtils.convertToNativeInt(map.get("discardStrategy"));
23
23
  Double sampleRate = (Double) map.get("sampleRate");
24
+ Double logSamplingRate = (Double) map.get("logSamplingRate");
24
25
  ArrayList<Object> logTypeReadArr = (ArrayList<Object>) map.get("logLevelFilters");
25
26
  Boolean enableLinkRumData = (Boolean) map.get("enableLinkRumData");
27
+ Boolean enableWebViewLog = (Boolean) map.get("enableWebViewLog");
26
28
  Boolean enableCustomLog = (Boolean) map.get("enableCustomLog");
27
29
  HashMap<String, Object> globalContext = (HashMap<String, Object>) map.get("globalContext");
28
30
  Integer logCacheLimitCount = ReactNativeUtils.convertToNativeInt(map.get("logCacheLimitCount"));
@@ -47,8 +49,10 @@ public class FTLogImpl {
47
49
  FTLoggerConfig logConfig = new FTLoggerConfig()
48
50
  .setLogCacheDiscardStrategy(logCacheDiscard);
49
51
 
50
- if (sampleRate != null) {
51
- logConfig.setSamplingRate(sampleRate.floatValue());
52
+ if (logSamplingRate != null) {
53
+ logConfig.setLogSamplingRate(logSamplingRate.floatValue());
54
+ } else if (sampleRate != null) {
55
+ logConfig.setLogSamplingRate((float) (sampleRate * 100.0));
52
56
  }
53
57
 
54
58
  if (logTypeReadArr != null) {
@@ -70,6 +74,10 @@ public class FTLogImpl {
70
74
  logConfig.setEnableLinkRumData(enableLinkRumData);
71
75
  }
72
76
 
77
+ if (enableWebViewLog != null) {
78
+ logConfig.setEnableWebViewLog(enableWebViewLog);
79
+ }
80
+
73
81
  if (enableCustomLog != null) {
74
82
  logConfig.setEnableCustomLog(enableCustomLog);
75
83
  }
@@ -171,6 +171,24 @@ public class FTMobileImpl {
171
171
  if (override.hasKey("logSampleRate") && !override.isNull("logSampleRate")) {
172
172
  configBean.setLogSampleRate((float) override.getDouble("logSampleRate"));
173
173
  }
174
+ if (override.hasKey("sessionSamplingRate") && !override.isNull("sessionSamplingRate")) {
175
+ configBean.setSessionSamplingRate((float) override.getDouble("sessionSamplingRate"));
176
+ }
177
+ if (override.hasKey("sessionOnErrorSamplingRate") && !override.isNull("sessionOnErrorSamplingRate")) {
178
+ configBean.setSessionOnErrorSamplingRate((float) override.getDouble("sessionOnErrorSamplingRate"));
179
+ }
180
+ if (override.hasKey("traceSamplingRate") && !override.isNull("traceSamplingRate")) {
181
+ configBean.setTraceSamplingRate((float) override.getDouble("traceSamplingRate"));
182
+ }
183
+ if (override.hasKey("logSamplingRate") && !override.isNull("logSamplingRate")) {
184
+ configBean.setLogSamplingRate((float) override.getDouble("logSamplingRate"));
185
+ }
186
+ if (override.hasKey("sessionReplaySamplingRate") && !override.isNull("sessionReplaySamplingRate")) {
187
+ configBean.setSessionReplaySamplingRate((float) override.getDouble("sessionReplaySamplingRate"));
188
+ }
189
+ if (override.hasKey("sessionReplayOnErrorSamplingRate") && !override.isNull("sessionReplayOnErrorSamplingRate")) {
190
+ configBean.setSessionReplayOnErrorSamplingRate((float) override.getDouble("sessionReplayOnErrorSamplingRate"));
191
+ }
174
192
  if (override.hasKey("logLevelFilters") && !override.isNull("logLevelFilters")) {
175
193
  ReadableArray filtersArray = override.getArray("logLevelFilters");
176
194
  String[] filters = new String[filtersArray.size()];
@@ -182,6 +200,9 @@ public class FTMobileImpl {
182
200
  if (override.hasKey("logEnableCustomLog") && !override.isNull("logEnableCustomLog")) {
183
201
  configBean.setLogEnableCustomLog(override.getBoolean("logEnableCustomLog"));
184
202
  }
203
+ if (override.hasKey("logEnableWebViewLog") && !override.isNull("logEnableWebViewLog")) {
204
+ configBean.setLogEnableWebViewLog(override.getBoolean("logEnableWebViewLog"));
205
+ }
185
206
  if (override.hasKey("logEnableConsoleLog") && !override.isNull("logEnableConsoleLog")) {
186
207
  configBean.setLogEnableConsoleLog(override.getBoolean("logEnableConsoleLog"));
187
208
  }
@@ -367,6 +388,19 @@ public class FTMobileImpl {
367
388
  return convertedFilters;
368
389
  }
369
390
 
391
+ static FTSDKConfig buildSDKConfig(@Nullable String datakitUrl,
392
+ @Nullable String datawayUrl,
393
+ @Nullable String clientToken) {
394
+ if (datakitUrl != null && datakitUrl.length() > 0) {
395
+ return FTSDKConfig.builder(datakitUrl);
396
+ }
397
+ if (datawayUrl != null && datawayUrl.length() > 0
398
+ && clientToken != null && clientToken.length() > 0) {
399
+ return FTSDKConfig.builder(datawayUrl, clientToken);
400
+ }
401
+ return FTSDKConfig.builder();
402
+ }
403
+
370
404
  public void sdkConfig(ReadableMap context, Promise promise) {
371
405
  Map<String, Object> map = context.toHashMap();
372
406
  String datakitUrl = (String) map.get("datakitUrl");
@@ -393,9 +427,12 @@ public class FTMobileImpl {
393
427
  this.remoteConfigOverrideRules = context.hasKey("remoteConfigOverrideRules")
394
428
  ? context.getArray("remoteConfigOverrideRules") : null;
395
429
 
396
- FTSDKConfig sdkConfig = (datakitUrl != null)
397
- ? FTSDKConfig.builder(datakitUrl)
398
- : FTSDKConfig.builder(datawayUrl, cliToken);
430
+ FTSDKConfig sdkConfig = buildSDKConfig(datakitUrl, datawayUrl, cliToken);
431
+
432
+ if (map.containsKey("allowWebViewHost")) {
433
+ List<String> hosts = (List<String>) map.get("allowWebViewHost");
434
+ sdkConfig.setAllowWebViewHost(hosts == null ? null : hosts.toArray(new String[0]));
435
+ }
399
436
 
400
437
  if (env != null) {
401
438
  EnvType envType;
@@ -523,6 +560,11 @@ public class FTMobileImpl {
523
560
  promise.resolve(null);
524
561
  }
525
562
 
563
+ public void resetVisitorId(Promise promise) {
564
+ FTSdk.resetVisitorId();
565
+ promise.resolve(null);
566
+ }
567
+
526
568
  public void bindRUMUserData(String userId, String userName, String userEmail, ReadableMap extra, Promise promise) {
527
569
  UserData userData = new UserData();
528
570
  userData.setId(userId);
@@ -655,11 +697,4 @@ public class FTMobileImpl {
655
697
  });
656
698
  }
657
699
 
658
- public void addListener(String eventName) {
659
- // Required for NativeEventEmitter. No-op because native does not need listener bookkeeping.
660
- }
661
-
662
- public void removeListeners(double count) {
663
- // Required for NativeEventEmitter. No-op because native does not need listener bookkeeping.
664
- }
665
700
  }
@@ -2,8 +2,11 @@ package com.ft.sdk.reactnative;
2
2
 
3
3
  import com.ft.sdk.reactnative.BuildConfig;
4
4
  import com.facebook.react.bridge.Promise;
5
+ import com.facebook.react.bridge.LifecycleEventListener;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
5
7
  import com.facebook.react.bridge.ReactMethod;
6
8
  import com.facebook.react.bridge.ReadableMap;
9
+ import com.facebook.react.common.LifecycleState;
7
10
  import com.ft.sdk.DetectFrequency;
8
11
  import com.ft.sdk.FTInTakeUrlHandler;
9
12
  import com.ft.sdk.FTRUMConfig;
@@ -11,6 +14,7 @@ import com.ft.sdk.FTRUMGlobalManager;
11
14
  import com.ft.sdk.FTSdk;
12
15
  import com.ft.sdk.RUMCacheDiscard;
13
16
  import com.ft.sdk.garble.bean.AppState;
17
+ import com.ft.sdk.garble.bean.ViewTrackingType;
14
18
  import com.ft.sdk.garble.bean.NetStatusBean;
15
19
  import com.ft.sdk.garble.bean.ResourceParams;
16
20
  import com.ft.sdk.reactnative.utils.ReactNativeUtils;
@@ -18,18 +22,44 @@ import com.ft.sdk.reactnative.utils.ReactNativeUtils;
18
22
  import java.util.ArrayList;
19
23
  import java.util.HashMap;
20
24
  import java.util.Map;
25
+ import java.util.concurrent.atomic.AtomicBoolean;
21
26
 
22
- public class FTRUMImpl {
27
+ public class FTRUMImpl implements LifecycleEventListener {
23
28
 
24
29
  private static final String DEFAULT_ERROR_TYPE = "reactnative_crash";
25
30
  public static final String NAME = "FTReactNativeRUM";
31
+ private final ReactApplicationContext reactContext;
32
+ private final JsLongTaskMonitor jsLongTaskMonitor;
33
+ private final AtomicBoolean destroyed = new AtomicBoolean();
34
+
35
+ public FTRUMImpl(ReactApplicationContext reactContext) {
36
+ this(reactContext, JsLongTaskMonitor.create(reactContext));
37
+ }
38
+
39
+ FTRUMImpl(
40
+ ReactApplicationContext reactContext,
41
+ JsLongTaskMonitor jsLongTaskMonitor
42
+ ) {
43
+ this.reactContext = reactContext;
44
+ this.jsLongTaskMonitor = jsLongTaskMonitor;
45
+ reactContext.addLifecycleEventListener(this);
46
+ }
26
47
 
27
48
  @ReactMethod
28
49
  public void setConfig(ReadableMap context, Promise promise) {
29
50
  Map<String, Object> map = context.toHashMap();
51
+ com.ft.sdk.FTVisitorIdConfig visitorIdConfig;
52
+ try {
53
+ visitorIdConfig = VisitorIdConfigMapper.fromMap(map.get("visitorIdConfig"));
54
+ } catch (IllegalArgumentException error) {
55
+ promise.reject("E_VISITOR_ID_CONFIG", error.getMessage(), error);
56
+ return;
57
+ }
30
58
  String rumAppId = (String) map.get("androidAppId");
31
59
  Double sampleRate = (Double) map.get("sampleRate");
60
+ Double sessionSamplingRate = (Double) map.get("sessionSamplingRate");
32
61
  Double sessionOnErrorSampleRate = (Double) map.get("sessionOnErrorSampleRate");
62
+ Double sessionOnErrorSamplingRate = (Double) map.get("sessionOnErrorSamplingRate");
33
63
 
34
64
  Boolean enableNativeUserAction = (Boolean) map.get("enableNativeUserAction");
35
65
  Boolean enableNativeUserView = (Boolean) map.get("enableNativeUserView");
@@ -39,6 +69,8 @@ public class FTRUMImpl {
39
69
  Boolean enableTrackNativeAppANR = (Boolean) map.get("enableTrackNativeAppANR");
40
70
  Boolean enableTrackNativeFreeze = (Boolean) map.get("enableTrackNativeFreeze");
41
71
  Double nativeFreezeDurationMs = (Double) map.get("nativeFreezeDurationMs");
72
+ Boolean enableLongTask = (Boolean) map.get("enableLongTask");
73
+ Double longTaskThresholdMs = (Double) map.get("longTaskThresholdMs");
42
74
  Integer monitorType = ReactNativeUtils.convertToNativeInt(map.get("errorMonitorType"));
43
75
  Integer deviceMonitorType = ReactNativeUtils.convertToNativeInt(map.get("deviceMonitorType"));
44
76
  Integer detectFrequency = ReactNativeUtils.convertToNativeInt(map.get("detectFrequency"));
@@ -48,12 +80,16 @@ public class FTRUMImpl {
48
80
  Boolean enableTraceWebView = (Boolean) map.get("enableTraceWebView");
49
81
  ArrayList<String> allowWebViewHost = (ArrayList<String>) map.get("allowWebViewHost");
50
82
 
51
- FTRUMConfig rumConfig = new FTRUMConfig().setRumAppId(rumAppId);
52
- if (sampleRate != null) {
53
- rumConfig.setSamplingRate(sampleRate.floatValue());
83
+ FTRUMConfig rumConfig = new FTRUMConfig().setRumAppId(rumAppId).setVisitorIdConfig(visitorIdConfig);
84
+ if (sessionSamplingRate != null) {
85
+ rumConfig.setSessionSamplingRate(sessionSamplingRate.floatValue());
86
+ } else if (sampleRate != null) {
87
+ rumConfig.setSessionSamplingRate((float) (sampleRate * 100.0));
54
88
  }
55
- if (sessionOnErrorSampleRate != null) {
56
- rumConfig.setSessionErrorSampleRate(sessionOnErrorSampleRate.floatValue());
89
+ if (sessionOnErrorSamplingRate != null) {
90
+ rumConfig.setSessionOnErrorSamplingRate(sessionOnErrorSamplingRate.floatValue());
91
+ } else if (sessionOnErrorSampleRate != null) {
92
+ rumConfig.setSessionOnErrorSamplingRate((float) (sessionOnErrorSampleRate * 100.0));
57
93
  }
58
94
  if (enableNativeUserAction != null) {
59
95
  rumConfig.setEnableTraceUserAction(enableNativeUserAction);
@@ -131,14 +167,73 @@ public class FTRUMImpl {
131
167
  if (allowWebViewHost != null) {
132
168
  String[] allowWebViewHostArr = new String[allowWebViewHost.size()];
133
169
  allowWebViewHost.toArray(allowWebViewHostArr);
170
+ // Let the native SDK apply legacy hosts only when base hosts are omitted.
134
171
  rumConfig.setAllowWebViewHost(allowWebViewHostArr);
135
172
  }
136
173
 
137
174
  FTSdk.initRUMWithConfig(rumConfig);
175
+ double configuredThresholdMilliseconds = longTaskThresholdMs != null
176
+ ? longTaskThresholdMs
177
+ : 100;
178
+ double thresholdMilliseconds = Boolean.TRUE.equals(enableLongTask)
179
+ ? configuredThresholdMilliseconds
180
+ : 0;
181
+ jsLongTaskMonitor.setThresholdMilliseconds(thresholdMilliseconds);
182
+ if (
183
+ thresholdMilliseconds > 0 &&
184
+ reactContext.getLifecycleState() == LifecycleState.RESUMED
185
+ ) {
186
+ jsLongTaskMonitor.start();
187
+ } else {
188
+ jsLongTaskMonitor.stop();
189
+ }
138
190
  //LogUtils.d("configCheck","rumConfig:"+new Gson().toJson(rumConfig));
139
191
  promise.resolve(null);
140
192
  }
141
193
 
194
+ @ReactMethod
195
+ public void stopLongTaskTracking(final Promise promise) {
196
+ jsLongTaskMonitor.disable(new Runnable() {
197
+ @Override
198
+ public void run() {
199
+ promise.resolve(null);
200
+ }
201
+ });
202
+ }
203
+
204
+ public boolean setLongTaskContext(ReadableMap context) {
205
+ if (destroyed.get()) {
206
+ return false;
207
+ }
208
+ jsLongTaskMonitor.setBridgeContext(context == null ? null : context.toHashMap());
209
+ return true;
210
+ }
211
+
212
+ public void destroy() {
213
+ if (!destroyed.compareAndSet(false, true)) {
214
+ return;
215
+ }
216
+ reactContext.removeLifecycleEventListener(this);
217
+ jsLongTaskMonitor.disable(null);
218
+ }
219
+
220
+ @Override
221
+ public void onHostResume() {
222
+ if (!destroyed.get()) {
223
+ jsLongTaskMonitor.start();
224
+ }
225
+ }
226
+
227
+ @Override
228
+ public void onHostPause() {
229
+ jsLongTaskMonitor.stop();
230
+ }
231
+
232
+ @Override
233
+ public void onHostDestroy() {
234
+ jsLongTaskMonitor.stop();
235
+ }
236
+
142
237
  @ReactMethod
143
238
  public void startAction(String actionName, String actionType, ReadableMap map, Promise promise) {
144
239
  if (map != null) {
@@ -159,6 +254,36 @@ public class FTRUMImpl {
159
254
  promise.resolve(null);
160
255
  }
161
256
 
257
+ @ReactMethod
258
+ public void onCreateViewWithLoadStart(String viewName, double duration, double loadStartEpochMs, Promise promise) {
259
+ long nanoseconds = ViewTiming.durationNanoseconds(duration);
260
+ FTRUMGlobalManager.get().onCreateView(viewName, nanoseconds,
261
+ nanoseconds > 0 ? ViewTiming.epochNanoseconds(loadStartEpochMs) : 0);
262
+ promise.resolve(null);
263
+ }
264
+
265
+ @ReactMethod
266
+ public void startViewWithTrackingType(String viewName, ReadableMap map, double trackingType, Promise promise) {
267
+ if (trackingType != 0 && trackingType != 1) {
268
+ promise.reject("E_VIEW_TRACKING_TYPE", "trackingType must be Manual (0) or Automatic (1)");
269
+ return;
270
+ }
271
+ FTRUMGlobalManager.get().startView(viewName, map == null ? null : map.toHashMap(),
272
+ trackingType == 1 ? ViewTrackingType.AUTOMATIC : ViewTrackingType.MANUAL);
273
+ promise.resolve(null);
274
+ }
275
+
276
+ @ReactMethod
277
+ public void updateViewLoadingTime(double duration, Promise promise) {
278
+ if (Double.isNaN(duration) || Double.isInfinite(duration) || duration < 0
279
+ || duration > 9007199254740991d || duration != Math.floor(duration)) {
280
+ promise.reject("E_VIEW_LOADING_TIME", "duration must be a non-negative safe integer in nanoseconds");
281
+ return;
282
+ }
283
+ FTRUMGlobalManager.get().updateLoadTime((long) duration);
284
+ promise.resolve(null);
285
+ }
286
+
162
287
  @ReactMethod
163
288
  public void onCreateView(String viewName, Double duration, Promise promise) {
164
289
  FTRUMGlobalManager.get().onCreateView(viewName, duration.longValue());
@@ -21,13 +21,16 @@ public class FTTraceImpl {
21
21
  public void setConfig(ReadableMap context, Promise promise) {
22
22
  Map<String, Object> map = context.toHashMap();
23
23
  Double sampleRate = (Double) map.get("sampleRate");
24
+ Double traceSamplingRate = (Double) map.get("traceSamplingRate");
24
25
  Integer traceType = ReactNativeUtils.convertToNativeInt(map.get("traceType"));
25
26
  Boolean enableLinkRUMData = (Boolean) map.get("enableLinkRUMData");
26
27
  Boolean enableNativeAutoTrace = (Boolean) map.get("enableNativeAutoTrace");
27
28
 
28
29
  FTTraceConfig traceConfig = new FTTraceConfig();
29
- if (sampleRate != null) {
30
- traceConfig.setSamplingRate(sampleRate.floatValue());
30
+ if (traceSamplingRate != null) {
31
+ traceConfig.setTraceSamplingRate(traceSamplingRate.floatValue());
32
+ } else if (sampleRate != null) {
33
+ traceConfig.setTraceSamplingRate((float) (sampleRate * 100.0));
31
34
  }
32
35
 
33
36
  if (traceType != null) {
@@ -71,6 +74,10 @@ public class FTTraceImpl {
71
74
 
72
75
  @ReactMethod
73
76
  public void getTraceHeaderFields(String url, String key, Promise promise) {
77
+ promise.resolve(getTraceHeaderFieldsSync(url, key));
78
+ }
79
+
80
+ public WritableNativeMap getTraceHeaderFieldsSync(String url, String key) {
74
81
  HashMap<String, String> hashMap = null;
75
82
  if (key == null) {
76
83
  hashMap = FTTraceManager.get().getTraceHeader(url);
@@ -84,6 +91,6 @@ public class FTTraceImpl {
84
91
  map.putString(entry.getKey(), entry.getValue());
85
92
  }
86
93
  }
87
- promise.resolve(map);
94
+ return map;
88
95
  }
89
96
  }