@truewatchtech/react-native-mobile 0.4.0-alpha.4 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/FTMobileReactNativeSDK.podspec +31 -2
  2. package/android/build.gradle +7 -19
  3. package/android/src/main/java/com/ft/sdk/reactnative/FTMobileImpl.java +472 -5
  4. package/android/src/main/java/com/ft/sdk/reactnative/FTRUMImpl.java +12 -0
  5. package/android/src/newarch/java/com/ft/sdk/reactnative/FTLogModule.java +7 -14
  6. package/android/src/newarch/java/com/ft/sdk/reactnative/FTMobileModule.java +46 -12
  7. package/android/src/newarch/java/com/ft/sdk/reactnative/FTRUMModule.java +12 -13
  8. package/android/src/newarch/java/com/ft/sdk/reactnative/FTTraceModule.java +6 -8
  9. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTMobileModule.java +34 -2
  10. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTRUMModule.java +5 -0
  11. package/android/src/rnpost74/java/com/ft/sdk/reactnative/FTMobilePackage.java +14 -3
  12. package/android/src/rnpre74/java/com/ft/sdk/reactnative/FTMobilePackage.java +0 -3
  13. package/ios/FTMobileReactNative.h +9 -5
  14. package/ios/FTMobileReactNative.mm +625 -0
  15. package/ios/FTReactNativeLog.h +8 -3
  16. package/ios/FTReactNativeLog.mm +79 -0
  17. package/ios/FTReactNativeRUM.h +8 -3
  18. package/ios/{FTReactNativeRUM.m → FTReactNativeRUM.mm} +143 -84
  19. package/ios/FTReactNativeTrace.h +8 -2
  20. package/ios/FTReactNativeTrace.mm +74 -0
  21. package/ios/FtMobileAgent.xcodeproj/project.pbxproj +17 -1
  22. package/lib/commonjs/ft_logger.js +14 -13
  23. package/lib/commonjs/ft_logger.js.map +1 -1
  24. package/lib/commonjs/ft_mobile_agent.js +155 -6
  25. package/lib/commonjs/ft_mobile_agent.js.map +1 -1
  26. package/lib/commonjs/ft_rum.js +55 -21
  27. package/lib/commonjs/ft_rum.js.map +1 -1
  28. package/lib/commonjs/ft_tracing.js +29 -10
  29. package/lib/commonjs/ft_tracing.js.map +1 -1
  30. package/lib/commonjs/index.js +24 -13
  31. package/lib/commonjs/index.js.map +1 -1
  32. package/lib/commonjs/rum/FTRumActionTracking.js +10 -4
  33. package/lib/commonjs/rum/FTRumActionTracking.js.map +1 -1
  34. package/lib/commonjs/rum/FTRumErrorTracking.js +4 -4
  35. package/lib/commonjs/rum/FTRumErrorTracking.js.map +1 -1
  36. package/lib/commonjs/specs/NativeFTMobileReactNative.js +10 -0
  37. package/lib/commonjs/specs/NativeFTMobileReactNative.js.map +1 -0
  38. package/lib/commonjs/specs/NativeFTReactNativeLog.js +10 -0
  39. package/lib/commonjs/specs/NativeFTReactNativeLog.js.map +1 -0
  40. package/lib/commonjs/specs/NativeFTReactNativeRUM.js +10 -0
  41. package/lib/commonjs/specs/NativeFTReactNativeRUM.js.map +1 -0
  42. package/lib/commonjs/specs/NativeFTReactNativeTrace.js +10 -0
  43. package/lib/commonjs/specs/NativeFTReactNativeTrace.js.map +1 -0
  44. package/lib/commonjs/version.js +1 -1
  45. package/lib/commonjs/version.js.map +1 -1
  46. package/lib/module/ft_logger.js +14 -12
  47. package/lib/module/ft_logger.js.map +1 -1
  48. package/lib/module/ft_mobile_agent.js +161 -5
  49. package/lib/module/ft_mobile_agent.js.map +1 -1
  50. package/lib/module/ft_rum.js +54 -16
  51. package/lib/module/ft_rum.js.map +1 -1
  52. package/lib/module/ft_tracing.js +29 -9
  53. package/lib/module/ft_tracing.js.map +1 -1
  54. package/lib/module/index.js +3 -4
  55. package/lib/module/index.js.map +1 -1
  56. package/lib/module/rum/FTRumActionTracking.js +10 -4
  57. package/lib/module/rum/FTRumActionTracking.js.map +1 -1
  58. package/lib/module/rum/FTRumErrorTracking.js +4 -4
  59. package/lib/module/rum/FTRumErrorTracking.js.map +1 -1
  60. package/lib/module/specs/NativeFTMobileReactNative.js +5 -0
  61. package/lib/module/specs/NativeFTMobileReactNative.js.map +1 -0
  62. package/lib/module/specs/NativeFTReactNativeLog.js +5 -0
  63. package/lib/module/specs/NativeFTReactNativeLog.js.map +1 -0
  64. package/lib/module/specs/NativeFTReactNativeRUM.js +5 -0
  65. package/lib/module/specs/NativeFTReactNativeRUM.js.map +1 -0
  66. package/lib/module/specs/NativeFTReactNativeTrace.js +5 -0
  67. package/lib/module/specs/NativeFTReactNativeTrace.js.map +1 -0
  68. package/lib/module/version.js +1 -1
  69. package/lib/module/version.js.map +1 -1
  70. package/lib/typescript/ft_logger.d.ts +6 -6
  71. package/lib/typescript/ft_mobile_agent.d.ts +169 -14
  72. package/lib/typescript/ft_rum.d.ts +32 -8
  73. package/lib/typescript/ft_tracing.d.ts +6 -6
  74. package/lib/typescript/index.d.ts +3 -4
  75. package/lib/typescript/specs/NativeFTMobileReactNative.d.ts +75 -0
  76. package/lib/typescript/specs/NativeFTReactNativeLog.d.ts +23 -0
  77. package/lib/typescript/specs/NativeFTReactNativeRUM.d.ts +89 -0
  78. package/lib/typescript/specs/NativeFTReactNativeTrace.d.ts +24 -0
  79. package/lib/typescript/version.d.ts +1 -1
  80. package/package.json +26 -93
  81. package/scripts/replace-react-require.js +37 -38
  82. package/src/ft_logger.tsx +72 -40
  83. package/src/ft_mobile_agent.tsx +378 -91
  84. package/src/ft_rum.tsx +227 -121
  85. package/src/ft_tracing.tsx +58 -37
  86. package/src/index.tsx +58 -18
  87. package/src/rum/FTRumActionTracking.tsx +212 -204
  88. package/src/rum/FTRumErrorTracking.tsx +70 -71
  89. package/src/specs/NativeFTMobileReactNative.ts +83 -0
  90. package/src/specs/NativeFTReactNativeLog.ts +29 -0
  91. package/src/specs/NativeFTReactNativeRUM.ts +104 -0
  92. package/src/specs/NativeFTReactNativeTrace.ts +26 -0
  93. package/src/version.ts +1 -1
  94. package/LICENSE +0 -201
  95. package/android/.project +0 -17
  96. package/android/.settings/org.eclipse.buildship.core.prefs +0 -13
  97. package/android/gradlew +0 -185
  98. package/android/local.properties +0 -8
  99. package/android/src/main/java/com/ft/sdk/InnerClassProxy.java +0 -8
  100. package/android/src/main/java/com/ft/sdk/reactnative/FTSessionReplayImpl.java +0 -60
  101. package/android/src/main/java/com/ft/sdk/reactnative/extensions/ReactDrawablesExt.java +0 -155
  102. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/NoopTextPropertiesResolver.java +0 -23
  103. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/ReactNativeSessionReplayExtensionSupport.java +0 -57
  104. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/ShadowNodeWrapper.java +0 -84
  105. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/TextPropertiesResolver.java +0 -20
  106. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/DefaultMapper.java +0 -78
  107. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/Pair.java +0 -11
  108. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/ReactEditTextMapper.java +0 -136
  109. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/ReactNativeImageViewMapper.java +0 -117
  110. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/ReactTextMapper.java +0 -57
  111. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/ReactViewGroupMapper.java +0 -22
  112. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/mappers/ReactViewModalMapper.java +0 -21
  113. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/resources/ReactDrawableCopier.java +0 -35
  114. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/utils/DrawableUtils.java +0 -34
  115. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/utils/ReflectionUtils.java +0 -43
  116. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/utils/text/FabricTextViewUtils.java +0 -69
  117. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/utils/text/LegacyTextViewUtils.java +0 -97
  118. package/android/src/main/java/com/ft/sdk/reactnative/sessionreplay/utils/text/TextViewUtils.java +0 -184
  119. package/android/src/main/java/com/ft/sdk/reactnative/utils/ColorUtils.java +0 -24
  120. package/android/src/newarch/java/com/ft/sdk/reactnative/FTSessionReplayModule.java +0 -30
  121. package/android/src/oldarch/java/com/ft/sdk/reactnative/FTSessionReplayModule.java +0 -25
  122. package/android/src/rn69/java/com/ft/sdk/reactnative/sessionreplay/utils/ReactViewBackgroundDrawableUtils.java +0 -100
  123. package/android/src/rn75/java/com/ft/sdk/reactnative/sessionreplay/extensions/LengthPercentageExt.java +0 -27
  124. package/android/src/rn75/java/com/ft/sdk/reactnative/sessionreplay/utils/ReactViewBackgroundDrawableUtils.java +0 -116
  125. package/android/src/rn76/java/com/ft/sdk/reactnative/sessionreplay/extensions/LengthPercentageExt.java +0 -38
  126. package/android/src/rn76/java/com/ft/sdk/reactnative/sessionreplay/utils/ReactViewBackgroundDrawableUtils.java +0 -117
  127. package/android/src/rn79/java/com/ft/sdk/reactnative/sessionreplay/extensions/LengthPercentageExt.java +0 -38
  128. package/android/src/rn79/java/com/ft/sdk/reactnative/sessionreplay/utils/ReactViewBackgroundDrawableUtils.java +0 -132
  129. package/android/src/rn80/java/com/ft/sdk/reactnative/sessionreplay/extensions/ComputedBorderRadiusExt.java +0 -58
  130. package/android/src/rn80/java/com/ft/sdk/reactnative/sessionreplay/utils/ReactViewBackgroundDrawableUtils.java +0 -190
  131. package/android/src/rnlegacy/java/com/ft/sdk/reactnative/sessionreplay/utils/ReactViewBackgroundDrawableUtils.java +0 -120
  132. package/ios/.idea/.name +0 -1
  133. package/ios/.idea/ios.iml +0 -2
  134. package/ios/.idea/modules.xml +0 -8
  135. package/ios/.idea/vcs.xml +0 -6
  136. package/ios/.idea/xcode.xml +0 -4
  137. package/ios/FTMobileReactNative.m +0 -184
  138. package/ios/FTRCTTextViewRecorder.h +0 -33
  139. package/ios/FTRCTTextViewRecorder.m +0 -120
  140. package/ios/FTReactNativeLog.m +0 -60
  141. package/ios/FTReactNativeSessionReplay.h +0 -6
  142. package/ios/FTReactNativeSessionReplay.mm +0 -44
  143. package/ios/FTReactNativeTrace.m +0 -56
  144. package/ios/FtMobileAgent.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -4
  145. package/ios/FtMobileAgent.xcodeproj/project.xcworkspace/xcuserdata/Brandon.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  146. package/ios/FtMobileAgent.xcodeproj/project.xcworkspace/xcuserdata/Brandon.xcuserdatad/xcschemes/xcschememanagement.plist +0 -5
  147. package/ios/FtMobileAgent.xcodeproj/xcuserdata/Brandon.xcuserdatad/xcschemes/FtMobileAgent.xcscheme +0 -56
  148. package/ios/FtMobileAgent.xcodeproj/xcuserdata/Brandon.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  149. package/ios/RCTVersion.h +0 -8
  150. package/lib/commonjs/ft_session_replay.js +0 -34
  151. package/lib/commonjs/ft_session_replay.js.map +0 -1
  152. package/lib/module/ft_session_replay.js +0 -29
  153. package/lib/module/ft_session_replay.js.map +0 -1
  154. package/lib/typescript/ft_session_replay.d.ts +0 -27
  155. package/src/ft_session_replay.tsx +0 -34
package/src/ft_logger.tsx CHANGED
@@ -1,14 +1,21 @@
1
- import { NativeModules } from 'react-native';
1
+ import { bridgeContextManager } from './ft_mobile_agent';
2
2
  /**
3
3
  * Set log level.
4
4
  */
5
- export enum FTLogStatus {
6
- info, warning, error, critical, ok,
7
- };
5
+ export enum FTLogStatus {
6
+ info,
7
+ warning,
8
+ error,
9
+ critical,
10
+ ok,
11
+ }
8
12
  /**
9
13
  * Log discard method.
10
14
  */
11
- export enum FTLogCacheDiscard { discard, discardOldest };
15
+ export enum FTLogCacheDiscard {
16
+ discard,
17
+ discardOldest,
18
+ }
12
19
  /**
13
20
  * Configure log output configuration.
14
21
  * @param sampleRate sampling rate
@@ -19,58 +26,83 @@ import { NativeModules } from 'react-native';
19
26
  * @param globalContext custom global parameters
20
27
  * @param logCacheLimitCount get maximum log entry count limit [1000,), default 5000
21
28
  */
22
- export interface FTLogConfig{
23
- sampleRate?: number,
24
- enableLinkRumData?: boolean,
25
- enableCustomLog?: boolean,
26
- discardStrategy?: FTLogCacheDiscard,
27
- logLevelFilters?: Array<FTLogStatus>,
28
- globalContext?:object,
29
- logCacheLimitCount?: number
30
- };
29
+ export interface FTLogConfig {
30
+ sampleRate?: number;
31
+ enableLinkRumData?: boolean;
32
+ enableCustomLog?: boolean;
33
+ discardStrategy?: FTLogCacheDiscard;
34
+ logLevelFilters?: Array<FTLogStatus>;
35
+ globalContext?: object;
36
+ logCacheLimitCount?: number;
37
+ }
31
38
 
32
- type FTReactNativeLogType = {
39
+ type FTReactNativeLogType = {
33
40
  /**
34
41
  *Configure log output configuration to enable log collection.
35
42
  */
36
- logConfig(config: FTLogConfig): Promise<void>;
43
+ logConfig(config: FTLogConfig): Promise<void>;
37
44
  /**
38
45
  * Output log.
39
46
  * @param content log content
40
47
  * @param status log status
41
48
  * @param property log context (optional)
42
49
  */
43
- logging(content:String,logStatus:FTLogStatus,property?:object): Promise<void>;
44
- /**
45
- * Output log.
46
- * @param content log content
47
- * @param status log status
48
- * @param property log context (optional)
49
- */
50
- logWithStatusString(content:String,logStatus:String,property?:object): Promise<void>;
51
- };
50
+ logging(
51
+ content: string,
52
+ logStatus: FTLogStatus,
53
+ property?: object
54
+ ): Promise<void>;
55
+ /**
56
+ * Output log.
57
+ * @param content log content
58
+ * @param status log status
59
+ * @param property log context (optional)
60
+ */
61
+ logWithStatusString(
62
+ content: string,
63
+ logStatus: string,
64
+ property?: object
65
+ ): Promise<void>;
66
+ };
67
+
68
+ class FTReactNativeLogWrapper {
69
+ /* eslint-disable @typescript-eslint/no-var-requires */
70
+ private logger: FTReactNativeLogType =
71
+ require('./specs/NativeFTReactNativeLog').default;
72
+ /* eslint-enable @typescript-eslint/no-var-requires */
52
73
 
53
- class FTReactNativeLogWrapper {
54
- private logger: FTReactNativeLogType = NativeModules.FTReactNativeLog;
55
74
  /**
56
75
  *Configure log output configuration to enable log collection.
57
76
  */
58
- logConfig(config:FTLogConfig): Promise<void>{
59
- return this.logger.logConfig(config);
60
- }
77
+ logConfig(config: FTLogConfig): Promise<void> {
78
+ return this.logger.logConfig(config);
79
+ }
61
80
 
62
- /**
81
+ /**
63
82
  * Output log.
64
83
  * @param content log content
65
84
  * @param status log status
66
85
  * @param property log context (optional)
67
86
  */
68
- logging(content:String,logStatus:FTLogStatus|String,property?:object): Promise<void>{
69
- if((typeof logStatus)==='string'){
70
- return this.logger.logWithStatusString(content,logStatus.toString(),property)
71
- }
72
- let enumLogStatus: FTLogStatus = logStatus as FTLogStatus;
73
- return this.logger.logging(content,enumLogStatus,property);
74
- }
75
- }
76
- export const FTReactNativeLog: FTReactNativeLogWrapper = new FTReactNativeLogWrapper();
87
+ logging(
88
+ content: string,
89
+ logStatus: FTLogStatus | string,
90
+ property?: object
91
+ ): Promise<void> {
92
+ // Automatically merge bridge context properties with local properties
93
+ const mergedProperties =
94
+ bridgeContextManager.mergeWithLocalPropertiesSync(property);
95
+
96
+ if (typeof logStatus === 'string') {
97
+ return this.logger.logWithStatusString(
98
+ content,
99
+ logStatus.toString(),
100
+ mergedProperties
101
+ );
102
+ }
103
+ let enumLogStatus: FTLogStatus = logStatus as FTLogStatus;
104
+ return this.logger.logging(content, enumLogStatus, mergedProperties);
105
+ }
106
+ }
107
+ export const FTReactNativeLog: FTReactNativeLogWrapper =
108
+ new FTReactNativeLogWrapper();
@@ -1,13 +1,200 @@
1
- import { NativeModules } from 'react-native';
2
- import { version as sdkVersion } from './version'
1
+ import {
2
+ EmitterSubscription,
3
+ NativeEventEmitter,
4
+ NativeModules,
5
+ } from 'react-native';
6
+ import { version as sdkVersion } from './version';
7
+
8
+ /**
9
+ * Bridge context manager for managing shared properties across RUM and Logger modules
10
+ * This class provides a centralized way to store and retrieve global properties that will be
11
+ * automatically merged with local properties when making calls to RUM and Logger functions
12
+ */
13
+ class BridgeContextManager {
14
+ private static instance: BridgeContextManager;
15
+ private properties: Map<string, any> = new Map();
16
+
17
+ private constructor() {
18
+ // Initialize with SDK version information
19
+ this.initializeSDKInfo();
20
+ }
21
+
22
+ /**
23
+ * Initialize SDK information properties
24
+ * @private
25
+ */
26
+ private initializeSDKInfo(): void {
27
+ // Create sdk_bridge_info with version information
28
+ const sdkBridgeInfo = {
29
+ react_native: sdkVersion,
30
+ };
31
+
32
+ // Set the sdk_bridge_info property
33
+ this.properties.set('sdk_bridge_info', JSON.stringify(sdkBridgeInfo));
34
+ }
35
+
36
+ /**
37
+ * Get singleton instance of BridgeContextManager
38
+ * @returns BridgeContextManager instance
39
+ */
40
+ public static getInstance(): BridgeContextManager {
41
+ if (!BridgeContextManager.instance) {
42
+ BridgeContextManager.instance = new BridgeContextManager();
43
+ }
44
+ return BridgeContextManager.instance;
45
+ }
46
+
47
+ /**
48
+ * Add bridge context properties that will be automatically merged with local properties
49
+ * @param properties Object containing key-value pairs
50
+ */
51
+ public appendBridgeContext(properties: Record<string, any>): void {
52
+ // Store properties locally in JavaScript
53
+ try {
54
+ // Store properties locally in JavaScript
55
+ Object.entries(properties).forEach(([key, value]) => {
56
+ this.properties.set(key, value);
57
+ });
58
+ } catch (error) {
59
+ console.warn('Failed to append bridge context:', error);
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Merge bridge context properties with local properties
65
+ * Bridge context properties take precedence over local properties
66
+ * @param localProperties Local properties to merge with bridge context properties
67
+ * @returns Merged properties object
68
+ */
69
+ public mergeWithLocalPropertiesSync(
70
+ localProperties?: object
71
+ ): Record<string, any> {
72
+ try {
73
+ const merged: Record<string, any> = {};
74
+
75
+ // First add local properties (if any)
76
+ if (localProperties) {
77
+ Object.assign(merged, localProperties);
78
+ }
79
+
80
+ // Then add bridge context properties (these will override local properties with same keys)
81
+ this.properties.forEach((value, key) => {
82
+ merged[key] = value;
83
+ });
84
+
85
+ return merged;
86
+ } catch (error) {
87
+ console.warn(
88
+ 'Failed to merge bridge context with local properties:',
89
+ error
90
+ );
91
+ // Return empty object or only local properties on error
92
+ return localProperties ? { ...localProperties } : {};
93
+ }
94
+ }
95
+ }
96
+
97
+ // Internal bridge context manager - not exported
98
+ export const bridgeContextManager = BridgeContextManager.getInstance();
3
99
 
4
100
  /**
5
101
  * Environment.
6
102
  */
7
103
  export enum EnvType {
8
- prod, gray, pre, common, local
104
+ prod,
105
+ gray,
106
+ pre,
107
+ common,
108
+ local,
109
+ }
110
+ export enum FTDBCacheDiscard {
111
+ discard,
112
+ discardOldest,
113
+ }
114
+
115
+ /**
116
+ * Remote config override rule matching condition for custom keys. Supports exact match and contains match.
117
+ * For exact match, set the value directly, for example: "userid": "test_user", which means the rule will be applied when the custom key "userid" is exactly "test_user".
118
+ * For contains match, set the value as an object with a "contains" field, for example: "userid": { "contains": "test_user" }, which means the rule will be applied when the custom key "userid" contains the object "test_user".
119
+ */
120
+ export type FTRemoteConfigCustomKeyContainsMatch = {
121
+ contains: string | number | boolean;
122
+ };
123
+
124
+ /**
125
+ * Matching rules for remote config override
126
+ * Defines matching conditions using customKeys
127
+ */
128
+ export type FTRemoteConfigOverrideMatch = {
129
+ customKeys?: Record<
130
+ string,
131
+ string | number | boolean | FTRemoteConfigCustomKeyContainsMatch
132
+ >;
133
+ };
134
+
135
+ /**
136
+ * Values that can be modified by remote config override rules.
137
+ * These values will adjust the fetched remote configuration before it is applied.
138
+ */
139
+ export type FTRemoteConfigOverrideValues = {
140
+ env?: string;
141
+ serviceName?: string;
142
+ autoSync?: boolean;
143
+ compressIntakeRequests?: boolean;
144
+ syncPageSize?: number;
145
+ syncSleepTime?: number;
146
+ rumSampleRate?: number;
147
+ rumSessionOnErrorSampleRate?: number;
148
+ rumEnableTraceUserAction?: boolean;
149
+ rumEnableTraceUserView?: boolean;
150
+ rumEnableTraceUserResource?: boolean;
151
+ rumEnableResourceHostIP?: boolean;
152
+ rumEnableTrackAppUIBlock?: boolean;
153
+ rumBlockDurationMs?: number;
154
+ rumEnableTrackAppCrash?: boolean;
155
+ rumEnableTrackAppANR?: boolean;
156
+ rumEnableTraceWebView?: boolean;
157
+ rumAllowWebViewHost?: Array<string>;
158
+ traceSampleRate?: number;
159
+ traceEnableAutoTrace?: boolean;
160
+ traceType?: string;
161
+ logSampleRate?: number;
162
+ logLevelFilters?: Array<string>;
163
+ logEnableCustomLog?: boolean;
164
+ logEnableConsoleLog?: boolean;
165
+ };
166
+
167
+ /**
168
+ * Remote config override rules .
169
+ * Adjust the fetched remote configuration before application.
170
+ */
171
+ export type FTRemoteConfigOverrideRule = {
172
+ id?: string;
173
+ enabled?: boolean;
174
+ match: FTRemoteConfigOverrideMatch;
175
+ override: FTRemoteConfigOverrideValues;
176
+ };
177
+ /**
178
+ * Final result of the remote config update
179
+ * @param triggerType the type of remote config update trigger, auto or manual
180
+ * @param success whether the remote config update was successful
181
+ * @param platform the platform of the device, ios or android
182
+ * @param timestamp the timestamp when the remote config update was triggered
183
+ * @param rawJson the final remote config update result, in JSON string format
184
+ * @param errorCode the error code if the remote config update failed, may be null if the update was successful
185
+ * @param errorMessage the error message if the remote config update failed, may be null if the update was successful
186
+ * @param appliedOverrideRuleIds the list of override rule IDs applied in this remote config update, may be null if no rules were applied
187
+ */
188
+ export type FTRemoteConfigResult = {
189
+ triggerType: 'auto' | 'manual';
190
+ success: boolean;
191
+ platform: 'ios' | 'android';
192
+ timestamp: number;
193
+ rawJson?: string;
194
+ errorCode?: string | number;
195
+ errorMessage?: string;
196
+ appliedOverrideRuleIds?: string[];
9
197
  };
10
- export enum FTDBCacheDiscard { discard, discardOldest };
11
198
  /**
12
199
  * Configure SDK startup parameters.
13
200
  * @param serverUrl data reporting address, deprecated, use [datakitUrl] instead
@@ -22,6 +209,8 @@ export enum FTDBCacheDiscard { discard, discardOldest };
22
209
  * @param syncSleepTime interval time between each request during data synchronization, unit milliseconds, 0 < syncSleepTime < 100
23
210
  * @param enableDataIntegerCompatible whether to enable data integer compatibility during data synchronization, enabled by default
24
211
  * @param compressIntakeRequests whether to compress synchronized data
212
+ * @param enableDataFilter whether to enable SDK-side local data filters, enabled by default
213
+ * @param dataFilters local blocklist filter rules. Supported categories include `logging` and `rum`. Any data that matches a rule will be discarded.
25
214
  * @param globalContext custom global parameters
26
215
  * @param groupIdentifiers iOS side sets the AppGroups Identifier array corresponding to the collected Widget Extension
27
216
  * @param enableLimitWithDbSize set whether to enable using db to limit data size, after enabling, `FTLogConfig.logCacheLimitCount` and `FTRUMConfig.rumCacheLimitCount` will no longer take effect
@@ -29,43 +218,61 @@ export enum FTDBCacheDiscard { discard, discardOldest };
29
218
  * @param dbDiscardStrategy db data discard strategy
30
219
  * @param dataModifier data modifier, modify individual fields {key:value}, after setting, the SDK will replace the original value with the set value according to the key
31
220
  * @param lineDataModifier data modifier, modify single data {"measurement":measurement,"data":{key:value}}, after setting, the SDK will replace the original value with the set value according to the key
221
+ * @param remoteConfiguration Set whether to enable remote dynamic configuration
222
+ * @param remoteConfigMiniUpdateInterval Set remote dynamic configuration minimum update interval, unit seconds, default 12*60*60
223
+ * @param remoteConfigOverrideRules Remote config override rules .Adjust the fetched remote configuration before application.
32
224
  */
33
- export interface FTMobileConfig {
34
- /**
35
- * @deprecated "serverUrl" parameter renamed to "datakitUrl"
36
- */
37
- serverUrl?: string,
38
- datakitUrl?: string,
39
- datawayUrl?: string,
40
- clientToken?: string,
41
- debug?:boolean,
42
- envType?:EnvType,
43
- env?:string,
44
- service?:string,
45
- autoSync?:boolean,
46
- syncPageSize?:number,
47
- syncSleepTime?:number,
48
- enableDataIntegerCompatible?:boolean,
49
- compressIntakeRequests?:boolean,
50
- globalContext?:object,
51
- groupIdentifiers?:Array<string>,
52
- enableLimitWithDbSize?:boolean,
53
- dbCacheLimit?:number,
54
- dbDiscardStrategy?:FTDBCacheDiscard,
55
- pkgInfo?: string,
56
- dataModifier?:object,
57
- lineDataModifier?:object
58
- }
59
-
225
+ export interface FTMobileConfig {
226
+ /**
227
+ * @deprecated "serverUrl" parameter renamed to "datakitUrl"
228
+ */
229
+ serverUrl?: string;
230
+ datakitUrl?: string;
231
+ datawayUrl?: string;
232
+ clientToken?: string;
233
+ debug?: boolean;
234
+ envType?: EnvType;
235
+ env?: string;
236
+ service?: string;
237
+ autoSync?: boolean;
238
+ syncPageSize?: number;
239
+ syncSleepTime?: number;
240
+ enableDataIntegerCompatible?: boolean;
241
+ compressIntakeRequests?: boolean;
242
+ enableDataFilter?: boolean;
243
+ dataFilters?: Record<string, Array<string>>;
244
+ globalContext?: object;
245
+ groupIdentifiers?: Array<string>;
246
+ enableLimitWithDbSize?: boolean;
247
+ dbCacheLimit?: number;
248
+ dbDiscardStrategy?: FTDBCacheDiscard;
249
+ dataModifier?: object;
250
+ lineDataModifier?: object;
251
+ remoteConfiguration?: boolean;
252
+ remoteConfigMiniUpdateInterval?: number;
253
+ remoteConfigOverrideRules?: Array<FTRemoteConfigOverrideRule>;
254
+ }
60
255
 
61
256
  type FTMobileReactNativeType = {
62
-
63
257
  /**
64
258
  * SDK initialization method.
65
259
  * @param config SDK initialization configuration items.
66
260
  * @returns a Promise.
67
261
  */
68
- sdkConfig(config:FTMobileConfig): Promise<void>;
262
+ sdkConfig(config: FTMobileConfig): Promise<void>;
263
+ /**
264
+ * Dynamically set the Datakit upload URL after SDK initialization.
265
+ * @param datakitUrl Datakit upload URL.
266
+ * @returns a Promise.
267
+ */
268
+ setDatakitURL(datakitUrl: string): Promise<void>;
269
+ /**
270
+ * Dynamically set the Dataway upload URL and client token after SDK initialization.
271
+ * @param datawayUrl Dataway upload URL.
272
+ * @param clientToken Dataway authentication token.
273
+ * @returns a Promise.
274
+ */
275
+ setDatawayURL(datawayUrl: string, clientToken: string): Promise<void>;
69
276
  /**
70
277
  * Bind user.
71
278
  * @param userId user ID.
@@ -74,88 +281,168 @@ type FTMobileReactNativeType = {
74
281
  * @param extra additional user information
75
282
  * @returns a Promise.
76
283
  */
77
- bindRUMUserData(userId: string,userName?:string,userEmail?:string,extra?:object): Promise<void>;
284
+ bindRUMUserData(
285
+ userId: string,
286
+ userName?: string,
287
+ userEmail?: string,
288
+ extra?: object
289
+ ): Promise<void>;
78
290
  /**
79
291
  * Unbind user.
80
292
  * @returns a Promise.
81
293
  */
82
- unbindRUMUserData(): Promise<void>;
83
- /**
294
+ unbindRUMUserData(): Promise<void>;
295
+ /**
84
296
  * Add custom global parameters. Applies to RUM and Log data
85
297
  * @param context custom global parameters.
86
298
  * @returns a Promise.
87
299
  */
88
- appendGlobalContext(context:object):Promise<void>;
89
- /**
300
+ appendGlobalContext(context: object): Promise<void>;
301
+ /**
90
302
  * Add custom RUM global parameters. Applies to RUM data
91
303
  * @param context custom RUM global parameters.
92
304
  * @returns a Promise.
93
305
  */
94
- appendRUMGlobalContext(context:object):Promise<void>;
306
+ appendRUMGlobalContext(context: object): Promise<void>;
95
307
  /**
96
308
  * Add custom RUM and Log global parameters. Applies to Log data
97
309
  * @param context custom Log global parameters.
98
310
  * @returns a Promise.
99
311
  */
100
- appendLogGlobalContext(context:object):Promise<void>;
101
- /**
102
- * Actively synchronize data. When `FTMobileConfig.autoSync=false` is configured, you need to actively trigger this method to synchronize data.
103
- * @returns a Promise.
312
+ appendLogGlobalContext(context: object): Promise<void>;
313
+ /**
314
+ * Actively synchronize data. When `FTMobileConfig.autoSync=false` is configured, you need to actively trigger this method to synchronize data.
315
+ * @returns a Promise.
104
316
  */
105
- flushSyncData():Promise<void>;
317
+ flushSyncData(): Promise<void>;
106
318
 
107
- /**
319
+ /**
108
320
  * Synchronize events in iOS Widget Extension, iOS only
109
321
  * @param groupIdentifier app groupId
110
322
  * @returns {groupIdentifier:string,datas:Array<object>} can be used to view data collected in Extension.
111
323
  */
112
- trackEventFromExtension(identifier:string): Promise<object>
113
- /**
114
- * Shut down objects currently running in the SDK
115
- */
116
- shutDown():Promise<void>
117
- /**
118
- * Clear all data that has not yet been uploaded to the server.
119
- */
120
- clearAllData():Promise<void>
121
- };
122
-
123
- class FTMobileReactNativeWrapper implements FTMobileReactNativeType {
124
- private sdk:FTMobileReactNativeType = NativeModules.FTMobileReactNative;
125
- sdkConfig(config:FTMobileConfig): Promise<void> {
126
- if(config.serverUrl != null && config.serverUrl.length>0 && config.datakitUrl == null){
127
- config.datakitUrl = config.serverUrl;
128
- }
129
- config.pkgInfo = sdkVersion;
130
- return this.sdk.sdkConfig(config);
131
- }
132
- bindRUMUserData(userId: string,userName?:string,userEmail?:string,extra?:object): Promise<void> {
133
- return this.sdk.bindRUMUserData(userId,userName,userEmail,extra);
134
- }
135
- unbindRUMUserData(): Promise<void> {
136
- return this.sdk.unbindRUMUserData();
137
- }
138
- appendGlobalContext(context: object): Promise<void> {
324
+ trackEventFromExtension(identifier: string): Promise<object>;
325
+ /**
326
+ * Shut down objects currently running in the SDK
327
+ */
328
+ shutDown(): Promise<void>;
329
+ /**
330
+ * Clear all data that has not yet been uploaded to the server.
331
+ */
332
+ clearAllData(): Promise<void>;
333
+ /**
334
+ * Add bridge context properties that will be automatically merged with local properties
335
+ * @param properties Object containing key-value pairs
336
+ */
337
+ appendBridgeContext(properties: Record<string, any>): void;
338
+ /**
339
+ * Update remote configuration, after enabling remote configuration, you can call this method to update the configuration in real time.
340
+ */
341
+ updateRemoteConfig(): Promise<FTRemoteConfigResult>;
342
+ /**
343
+ * Update remote configuration with minimum update interval, after enabling remote configuration, you can call this method to update the configuration in real time.
344
+ * This method is used to set the minimum update interval for remote configuration updates. If the time since the last update is less than the specified interval, the update will not be performed.
345
+ * @param interval minimum update interval, unit seconds
346
+ * @param rules Remote config override rules .Adjust the fetched remote configuration before application.
347
+ * @returns the result of the remote config update
348
+ */
349
+ updateRemoteConfigWithMiniUpdateInterval(
350
+ interval: number,
351
+ rules?: Array<FTRemoteConfigOverrideRule>
352
+ ): Promise<FTRemoteConfigResult>;
353
+ /**
354
+ * Listen for auto remote configuration updates triggered by the native SDK.
355
+ * Manual updates are returned through the update Promise instead of this event.
356
+ */
357
+ addRemoteConfigListener(
358
+ listener: (result: FTRemoteConfigResult) => void
359
+ ): EmitterSubscription;
360
+ };
361
+
362
+ class FTMobileReactNativeWrapper implements FTMobileReactNativeType {
363
+ /* eslint-disable @typescript-eslint/no-var-requires */
364
+ private sdk: FTMobileReactNativeType =
365
+ require('./specs/NativeFTMobileReactNative').default;
366
+ /* eslint-enable @typescript-eslint/no-var-requires */
367
+
368
+ private emitter: NativeEventEmitter | null = null;
369
+
370
+ private getEmitter(): NativeEventEmitter {
371
+ if (this.emitter) {
372
+ return this.emitter;
373
+ }
374
+
375
+ const nativeEventModule = NativeModules.FTMobileReactNative ?? this.sdk;
376
+ this.emitter = new NativeEventEmitter(nativeEventModule as never);
377
+ return this.emitter;
378
+ }
379
+
380
+ sdkConfig(config: FTMobileConfig): Promise<void> {
381
+ if (
382
+ config.serverUrl != null &&
383
+ config.serverUrl.length > 0 &&
384
+ config.datakitUrl == null
385
+ ) {
386
+ config.datakitUrl = config.serverUrl;
387
+ }
388
+ return this.sdk.sdkConfig(config);
389
+ }
390
+ setDatakitURL(datakitUrl: string): Promise<void> {
391
+ return this.sdk.setDatakitURL(datakitUrl);
392
+ }
393
+ setDatawayURL(datawayUrl: string, clientToken: string): Promise<void> {
394
+ return this.sdk.setDatawayURL(datawayUrl, clientToken);
395
+ }
396
+ bindRUMUserData(
397
+ userId: string,
398
+ userName?: string,
399
+ userEmail?: string,
400
+ extra?: object
401
+ ): Promise<void> {
402
+ return this.sdk.bindRUMUserData(userId, userName, userEmail, extra);
403
+ }
404
+ unbindRUMUserData(): Promise<void> {
405
+ return this.sdk.unbindRUMUserData();
406
+ }
407
+ appendGlobalContext(context: object): Promise<void> {
139
408
  return this.sdk.appendGlobalContext(context);
140
- }
141
- appendLogGlobalContext(context: object): Promise<void> {
142
- return this.sdk.appendLogGlobalContext(context);
143
- }
144
- appendRUMGlobalContext(context: object): Promise<void> {
145
- return this.sdk.appendRUMGlobalContext(context);
146
- }
147
- trackEventFromExtension(identifier:string) :Promise<object>{
148
- return this.sdk.trackEventFromExtension(identifier);
149
- }
150
- flushSyncData():Promise<void>{
409
+ }
410
+ appendLogGlobalContext(context: object): Promise<void> {
411
+ return this.sdk.appendLogGlobalContext(context);
412
+ }
413
+ appendRUMGlobalContext(context: object): Promise<void> {
414
+ return this.sdk.appendRUMGlobalContext(context);
415
+ }
416
+ trackEventFromExtension(identifier: string): Promise<object> {
417
+ return this.sdk.trackEventFromExtension(identifier);
418
+ }
419
+ flushSyncData(): Promise<void> {
151
420
  return this.sdk.flushSyncData();
152
- }
153
- shutDown():Promise<void>{
421
+ }
422
+ shutDown(): Promise<void> {
154
423
  return this.sdk.shutDown();
155
- }
156
- clearAllData():Promise<void>{
424
+ }
425
+ clearAllData(): Promise<void> {
157
426
  return this.sdk.clearAllData();
158
- }
159
- }
160
- export const FTMobileReactNative: FTMobileReactNativeType = new FTMobileReactNativeWrapper();
161
-
427
+ }
428
+ appendBridgeContext(properties: Record<string, any>): void {
429
+ // Use bridgeContextManager to store properties in JavaScript and send to native SDK
430
+ bridgeContextManager.appendBridgeContext(properties);
431
+ }
432
+ updateRemoteConfig(): Promise<FTRemoteConfigResult> {
433
+ return this.sdk.updateRemoteConfig();
434
+ }
435
+ updateRemoteConfigWithMiniUpdateInterval(
436
+ interval: number,
437
+ rules?: Array<FTRemoteConfigOverrideRule>
438
+ ): Promise<FTRemoteConfigResult> {
439
+ return this.sdk.updateRemoteConfigWithMiniUpdateInterval(interval, rules);
440
+ }
441
+ addRemoteConfigListener(
442
+ listener: (result: FTRemoteConfigResult) => void
443
+ ): EmitterSubscription {
444
+ return this.getEmitter().addListener('ft_remote_config_callback', listener);
445
+ }
446
+ }
447
+ export const FTMobileReactNative: FTMobileReactNativeType =
448
+ new FTMobileReactNativeWrapper();