@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.
- package/FTMobileReactNativeSDK.podspec +7 -5
- package/android/build.gradle +10 -3
- package/android/src/main/java/com/ft/sdk/reactnative/FTLogImpl.java +10 -2
- package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +45 -10
- package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +131 -6
- package/android/src/main/java/com/ft/sdk/reactnative/FTTraceImpl.java +10 -3
- package/android/src/main/java/com/ft/sdk/reactnative/JsLongTaskMonitor.java +281 -0
- package/android/src/main/java/com/ft/sdk/reactnative/ViewTiming.java +17 -0
- package/android/src/main/java/com/ft/sdk/reactnative/VisitorIdConfigMapper.java +50 -0
- package/android/src/main/java/com/ft/sdk/reactnative/utils/ReactNativeUtils.java +5 -12
- package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +14 -5
- package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +44 -1
- package/android/src/newarch/java/com/ft/sdk/reactnative/FTTraceModule.java +14 -0
- package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +7 -2
- package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +39 -1
- package/android/src/oldarch/java/com/ft/sdk/reactnative/FTTraceModule.java +12 -0
- package/android/src/rnpost70/java/com/ft/sdk/reactnative/ReactJsThreadExecutor.java +21 -0
- package/android/src/rnpre70/java/com/ft/sdk/reactnative/ReactJsThreadExecutor.java +37 -0
- package/android/src/test/java/com/ft/sdk/reactnative/FTMobileImplTest.java +53 -0
- package/android/src/test/java/com/ft/sdk/reactnative/FTRUMModuleTest.java +117 -0
- package/android/src/test/java/com/ft/sdk/reactnative/JsLongTaskMonitorTest.java +446 -0
- package/android/src/test/java/com/ft/sdk/reactnative/utils/ReactNativeUtilsTest.java +33 -0
- package/ios/FTJSLongTaskMonitor.h +51 -0
- package/ios/FTJSLongTaskMonitor.m +250 -0
- package/ios/FTMobileReactNative.mm +54 -18
- package/ios/FTReactNativeLog.mm +9 -5
- package/ios/FTReactNativeRUM.mm +196 -31
- package/ios/FTReactNativeResource.h +4 -0
- package/ios/FTReactNativeResource.m +64 -0
- package/ios/FTReactNativeTrace.mm +59 -14
- package/ios/FTReactNativeUtils.m +10 -15
- package/ios/FTReactNativeViewTiming.h +18 -0
- package/ios/FTReactNativeWebSocket.h +10 -0
- package/ios/FTReactNativeWebSocket.mm +201 -0
- package/ios/FTWebSocketMetadataStore.h +25 -0
- package/ios/FTWebSocketMetadataStore.m +622 -0
- package/ios/FTWebSocketResourceData.h +20 -0
- package/ios/FTWebSocketResourceData.m +106 -0
- package/lib/commonjs/ft_logger.js +3 -1
- package/lib/commonjs/ft_logger.js.map +1 -1
- package/lib/commonjs/ft_mobile_agent.js +47 -4
- package/lib/commonjs/ft_mobile_agent.js.map +1 -1
- package/lib/commonjs/ft_rum.js +65 -5
- package/lib/commonjs/ft_rum.js.map +1 -1
- package/lib/commonjs/ft_tracing.js +14 -4
- package/lib/commonjs/ft_tracing.js.map +1 -1
- package/lib/commonjs/index.js +21 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/rum/FTBabelInteractionTracking.js +72 -0
- package/lib/commonjs/rum/FTBabelInteractionTracking.js.map +1 -0
- package/lib/commonjs/rum/FTBabelUtils.js +87 -0
- package/lib/commonjs/rum/FTBabelUtils.js.map +1 -0
- package/lib/commonjs/rum/FTRumActionTracking.js +10 -39
- package/lib/commonjs/rum/FTRumActionTracking.js.map +1 -1
- package/lib/commonjs/rum/FTRumActionTrackingContext.js +50 -0
- package/lib/commonjs/rum/FTRumActionTrackingContext.js.map +1 -0
- package/lib/commonjs/rum/FTRumViewTracking.js +147 -0
- package/lib/commonjs/rum/FTRumViewTracking.js.map +1 -0
- package/lib/commonjs/rum/FTRumWebSocketNative.js +73 -0
- package/lib/commonjs/rum/FTRumWebSocketNative.js.map +1 -0
- package/lib/commonjs/rum/FTRumWebSocketTiming.js +73 -0
- package/lib/commonjs/rum/FTRumWebSocketTiming.js.map +1 -0
- package/lib/commonjs/rum/FTRumWebSocketTracking.js +506 -0
- package/lib/commonjs/rum/FTRumWebSocketTracking.js.map +1 -0
- package/lib/commonjs/rum/longTasksUtils.js +25 -0
- package/lib/commonjs/rum/longTasksUtils.js.map +1 -0
- package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -1
- package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -1
- package/lib/commonjs/specs/NativeFTReactNativeTrace.js.map +1 -1
- package/lib/commonjs/specs/NativeFTReactNativeWebSocket.js +11 -0
- package/lib/commonjs/specs/NativeFTReactNativeWebSocket.js.map +1 -0
- package/lib/commonjs/version.js +1 -1
- package/lib/commonjs/version.js.map +1 -1
- package/lib/commonjs/visitorIdConfig.js +37 -0
- package/lib/commonjs/visitorIdConfig.js.map +1 -0
- package/lib/module/ft_logger.js +3 -1
- package/lib/module/ft_logger.js.map +1 -1
- package/lib/module/ft_mobile_agent.js +47 -4
- package/lib/module/ft_mobile_agent.js.map +1 -1
- package/lib/module/ft_rum.js +65 -5
- package/lib/module/ft_rum.js.map +1 -1
- package/lib/module/ft_tracing.js +14 -2
- package/lib/module/ft_tracing.js.map +1 -1
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/rum/FTBabelInteractionTracking.js +66 -0
- package/lib/module/rum/FTBabelInteractionTracking.js.map +1 -0
- package/lib/module/rum/FTBabelUtils.js +80 -0
- package/lib/module/rum/FTBabelUtils.js.map +1 -0
- package/lib/module/rum/FTRumActionTracking.js +10 -39
- package/lib/module/rum/FTRumActionTracking.js.map +1 -1
- package/lib/module/rum/FTRumActionTrackingContext.js +43 -0
- package/lib/module/rum/FTRumActionTrackingContext.js.map +1 -0
- package/lib/module/rum/FTRumViewTracking.js +140 -0
- package/lib/module/rum/FTRumViewTracking.js.map +1 -0
- package/lib/module/rum/FTRumWebSocketNative.js +62 -0
- package/lib/module/rum/FTRumWebSocketNative.js.map +1 -0
- package/lib/module/rum/FTRumWebSocketTiming.js +67 -0
- package/lib/module/rum/FTRumWebSocketTiming.js.map +1 -0
- package/lib/module/rum/FTRumWebSocketTracking.js +499 -0
- package/lib/module/rum/FTRumWebSocketTracking.js.map +1 -0
- package/lib/module/rum/longTasksUtils.js +18 -0
- package/lib/module/rum/longTasksUtils.js.map +1 -0
- package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -1
- package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -1
- package/lib/module/specs/NativeFTReactNativeTrace.js.map +1 -1
- package/lib/module/specs/NativeFTReactNativeWebSocket.js +8 -0
- package/lib/module/specs/NativeFTReactNativeWebSocket.js.map +1 -0
- package/lib/module/version.js +1 -1
- package/lib/module/version.js.map +1 -1
- package/lib/module/visitorIdConfig.js +31 -0
- package/lib/module/visitorIdConfig.js.map +1 -0
- package/lib/typescript/ft_logger.d.ts +11 -1
- package/lib/typescript/ft_mobile_agent.d.ts +28 -0
- package/lib/typescript/ft_rum.d.ts +42 -5
- package/lib/typescript/ft_tracing.d.ts +9 -1
- package/lib/typescript/index.d.ts +5 -1
- package/lib/typescript/rum/FTBabelInteractionTracking.d.ts +30 -0
- package/lib/typescript/rum/FTBabelUtils.d.ts +1 -0
- package/lib/typescript/rum/FTRumActionTracking.d.ts +0 -2
- package/lib/typescript/rum/FTRumActionTrackingContext.d.ts +11 -0
- package/lib/typescript/rum/FTRumViewTracking.d.ts +32 -0
- package/lib/typescript/rum/FTRumWebSocketNative.d.ts +22 -0
- package/lib/typescript/rum/FTRumWebSocketTiming.d.ts +7 -0
- package/lib/typescript/rum/FTRumWebSocketTracking.d.ts +54 -0
- package/lib/typescript/rum/longTasksUtils.d.ts +8 -0
- package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +15 -0
- package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +11 -1
- package/lib/typescript/specs/NativeFTReactNativeTrace.d.ts +12 -0
- package/lib/typescript/specs/NativeFTReactNativeWebSocket.d.ts +13 -0
- package/lib/typescript/version.d.ts +1 -1
- package/lib/typescript/visitorIdConfig.d.ts +11 -0
- package/package.json +6 -4
- package/src/ft_logger.tsx +11 -1
- package/src/ft_mobile_agent.tsx +79 -7
- package/src/ft_rum.tsx +111 -7
- package/src/ft_tracing.tsx +24 -2
- package/src/index.tsx +8 -0
- package/src/rum/FTBabelInteractionTracking.ts +124 -0
- package/src/rum/FTBabelUtils.tsx +99 -0
- package/src/rum/FTRumActionTracking.tsx +14 -43
- package/src/rum/FTRumActionTrackingContext.ts +68 -0
- package/src/rum/FTRumViewTracking.ts +179 -0
- package/src/rum/FTRumWebSocketNative.ts +107 -0
- package/src/rum/FTRumWebSocketTiming.ts +82 -0
- package/src/rum/FTRumWebSocketTracking.ts +722 -0
- package/src/rum/longTasksUtils.ts +17 -0
- package/src/specs/NativeFTMobileReactNative.ts +18 -0
- package/src/specs/NativeFTReactNativeRUM.ts +19 -1
- package/src/specs/NativeFTReactNativeTrace.ts +12 -0
- package/src/specs/NativeFTReactNativeWebSocket.ts +33 -0
- package/src/version.ts +1 -1
- 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 '
|
|
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
|
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
183
|
-
implementation 'com.truewatch.ft.mobile.sdk.tracker.agent:ft-native:1.1.
|
|
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 (
|
|
51
|
-
logConfig.
|
|
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
|
|
397
|
-
|
|
398
|
-
|
|
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 (
|
|
53
|
-
rumConfig.
|
|
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 (
|
|
56
|
-
rumConfig.
|
|
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 (
|
|
30
|
-
traceConfig.
|
|
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
|
-
|
|
94
|
+
return map;
|
|
88
95
|
}
|
|
89
96
|
}
|